2011-12-13 Pedro Alves <pedro@codesourcery.com>
authorPedro Alves <palves@redhat.com>
Tue, 13 Dec 2011 16:05:24 +0000 (16:05 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 13 Dec 2011 16:05:24 +0000 (16:05 +0000)
* 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.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/watchpoint.c
gdb/testsuite/gdb.base/watchpoint.exp

index a6ee8c53b46e3dec8631c47e97257113881bd0b3..d6c2de65f760f4afb790fb8ac140241f339bb6ea 100644 (file)
@@ -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.
index 9ef92539288795943659fe13f7ee59731920b021..c4d8a693ad40f3b6caebb349d69201fe3981586b 100644 (file)
@@ -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;
 }
index 331b18165b3582e0e4dda65ecdfb9a74e3e2be27..574dd8b8414376359b0921597d5a406b07b7ebab 100644 (file)
@@ -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