aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2011-12-13 16:05:24 +0000
committerPedro Alves <palves@redhat.com>2011-12-13 16:05:24 +0000
commitfabde4854cc349f0269c073508450789874ef156 (patch)
tree473cf7603e71a7ca14df1941b6697b9dcdb1df22 /gdb
parentd9071b0c4242fe1180340d52c6b6207e794675ae (diff)
downloadgdb-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')
-rw-r--r--gdb/testsuite/ChangeLog10
-rw-r--r--gdb/testsuite/gdb.base/watchpoint.c32
-rw-r--r--gdb/testsuite/gdb.base/watchpoint.exp70
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