diff options
author | Pedro Alves <palves@redhat.com> | 2011-12-13 16:05:24 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2011-12-13 16:05:24 +0000 |
commit | fabde4854cc349f0269c073508450789874ef156 (patch) | |
tree | 473cf7603e71a7ca14df1941b6697b9dcdb1df22 /gdb/testsuite | |
parent | d9071b0c4242fe1180340d52c6b6207e794675ae (diff) | |
download | gdb-fabde4854cc349f0269c073508450789874ef156.zip gdb-fabde4854cc349f0269c073508450789874ef156.tar.gz gdb-fabde4854cc349f0269c073508450789874ef156.tar.bz2 |
2011-12-13 Pedro Alves <pedro@codesourcery.com>
* gdb.base/watchpoint.c (struct foo2, foo2, struct foo4, foo4)
(func6, func7): New.
(main): Call func6 and func7.
* gdb.base/watchpoint.exp (test_wide_location_1)
(test_wide_location_2): New.
(top level): Re-enable hardware watchpoints if necessary. Call
test_wide_location_1 and test_wide_location_2.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/watchpoint.c | 32 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/watchpoint.exp | 70 |
3 files changed, 112 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a6ee8c5..d6c2de6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2011-12-13 Pedro Alves <pedro@codesourcery.com> + + * gdb.base/watchpoint.c (struct foo2, foo2, struct foo4, foo4) + (func6, func7): New. + (main): Call func6 and func7. + * gdb.base/watchpoint.exp (test_wide_location_1) + (test_wide_location_2): New. + (top level): Re-enable hardware watchpoints if necessary. Call + test_wide_location_1 and test_wide_location_2. + 2011-12-11 Yao Qi <yao@codesourcery.com> * gdb.trace/status-stop.exp: Skip it if target doesn't support trace. diff --git a/gdb/testsuite/gdb.base/watchpoint.c b/gdb/testsuite/gdb.base/watchpoint.c index 9ef9253..c4d8a69 100644 --- a/gdb/testsuite/gdb.base/watchpoint.c +++ b/gdb/testsuite/gdb.base/watchpoint.c @@ -42,6 +42,18 @@ int doread = 0; char *global_ptr; char **global_ptr_ptr; +struct foo2 +{ + int val[2]; +}; +struct foo2 foo2; + +struct foo4 +{ + int val[4]; +}; +struct foo4 foo4; + void marker1 () { } @@ -137,6 +149,22 @@ func5 () val = 27; } +void +func6 (void) +{ + /* func6 breakpoint here */ + foo2.val[1] = 0; + foo2.val[1] = 11; +} + +void +func7 (void) +{ + /* func7 breakpoint here */ + foo4.val[3] = 0; + foo4.val[3] = 33; +} + int main () { #ifdef usestubs @@ -216,5 +244,9 @@ int main () func5 (); + func6 (); + + func7 (); + return 0; } diff --git a/gdb/testsuite/gdb.base/watchpoint.exp b/gdb/testsuite/gdb.base/watchpoint.exp index 331b181..574dd8b 100644 --- a/gdb/testsuite/gdb.base/watchpoint.exp +++ b/gdb/testsuite/gdb.base/watchpoint.exp @@ -660,6 +660,68 @@ proc test_watch_location {} { gdb_test_no_output "delete \$bpnum" "delete watch -location" } +# Tests watching areas larger than a word. + +proc test_wide_location_1 {} { + # This test watches two words on most 32-bit ABIs, and one word on + # most 64-bit ABIs. + + # Platforms where the target can't watch such a large region + # should clear hw_expected below. + if [target_info exists gdb,no_hardware_watchpoints] { + set hw_expected 0 + } else { + set hw_expected 1 + } + + gdb_breakpoint [gdb_get_line_number "func6 breakpoint here"] + gdb_continue_to_breakpoint "func6 breakpoint here" + + if { $hw_expected } { + gdb_test "watch foo2" "Hardware watchpoint .*: .*" "watch foo2" + gdb_test "continue" \ + "Continuing.*Hardware watchpoint .*: .*New value = \\\{val = \\\{0, 11\\\}\\\}.*" \ + "continue with watch foo2" + } else { + gdb_test "watch foo2" "atchpoint .*: .*" "watch foo2" + gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 11\\\}\\\}.*" \ + "continue with watch foo2" + } + + gdb_test_no_output "delete \$bpnum" "delete watch foo2" +} + +proc test_wide_location_2 {} { + # This test watches four words on most 32-bit ABIs, and two words + # on 64-bit ABIs. + + # Platforms where the target can't watch such a large region + # should clear hw_expected below. + if [target_info exists gdb,no_hardware_watchpoints] { + set hw_expected 0 + } else { + set hw_expected 1 + } + + gdb_breakpoint [gdb_get_line_number "func7 breakpoint here"] + gdb_continue_to_breakpoint "func7 breakpoint here" + + if { $hw_expected } { + gdb_test "watch foo4" "Hardware watchpoint .*: .*" "watch foo4" + gdb_test "continue" \ + "Continuing.*Hardware watchpoint .*: .*New value = \\\{val = \\\{0, 0, 0, 33\\\}\\\}.*" \ + "continue with watch foo4" + } else { + gdb_test "watch foo4" "atchpoint .*: .*" "watch foo4" + gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 0, 0, 33\\\}\\\}.*" \ + "continue with watch foo4" + } + + gdb_test_no_output "delete \$bpnum" "delete watch foo4" +} + proc test_inaccessible_watchpoint {} { global gdb_prompt @@ -923,6 +985,14 @@ if [initialize] then { test_disable_enable_software_watchpoint test_watch_location + + # Re-enable hardware watchpoints if necessary. + if ![target_info exists gdb,no_hardware_watchpoints] { + gdb_test_no_output "set can-use-hw-watchpoints 1" "" + } + + test_wide_location_1 + test_wide_location_2 } # Restore old timeout |