Clear non-significant bits of address in watchpoint
authorYao Qi <yao.qi@linaro.org>
Fri, 8 Dec 2017 17:27:03 +0000 (17:27 +0000)
committerYao Qi <yao.qi@linaro.org>
Fri, 8 Dec 2017 17:27:03 +0000 (17:27 +0000)
Nowadays, GDB can't set watchpoint on tagged address on AArch64,

(gdb) p p2
$1 = (int *) 0xf000fffffffff474
(gdb) watch *((int *) 0xf000fffffffff474)
Hardware watchpoint 2: *((int *) 0xf000fffffffff474)
(gdb) c
Continuing.
main () at
binutils-gdb/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c:45
45   void (*func_ptr) (void) = foo;
Unexpected error setting hardware debug registers

This patch is about setting watchpoint on a tagged address.  Unlike
breakpoint, watchpoint record the expression rather than the address, and
when a watchpoint is fired, GDB checks the expression value changed
instead of matching address, so we can mask the watchpoint address by
getting rid of non-significant bits of address.

gdb:

2017-12-08  Yao Qi  <yao.qi@linaro.org>

* breakpoint.c (update_watchpoint): Call
address_significant.

gdb/testsuite:

2017-12-08  Yao Qi  <yao.qi@linaro.org>

* gdb.arch/aarch64-tagged-pointer.c (main): Update.
* gdb.arch/aarch64-tagged-pointer.exp: Add tests for watchpoint.

gdb/ChangeLog
gdb/breakpoint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c
gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp

index 134f7b4c6de290fabf58966f46210638d5be48a8..7d061c807cb79b4c044a3c246813110408aa3327 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-08  Yao Qi  <yao.qi@linaro.org>
+
+       * breakpoint.c (update_watchpoint): Call
+       address_significant.
+
 2017-12-08  Yao Qi  <yao.qi@linaro.org>
 
        * breakpoint.c (adjust_breakpoint_address): Call
index 1cee730cc6f3b2f648375676475b45d08bd6360b..b68718d25059b63efacaad1291ce79fec7bb3ba8 100644 (file)
@@ -1864,7 +1864,7 @@ update_watchpoint (struct watchpoint *b, int reparse)
                  loc->gdbarch = get_type_arch (value_type (v));
 
                  loc->pspace = frame_pspace;
-                 loc->address = addr;
+                 loc->address = address_significant (loc->gdbarch, addr);
 
                  if (bitsize != 0)
                    {
index 17fbe4f939fbe14bd29d41f6d8346d5cafebc5cd..53a2ca4727f5aaad468cce33c4e33054dd91c1d9 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-08  Yao Qi  <yao.qi@linaro.org>
+
+       * gdb.arch/aarch64-tagged-pointer.c (main): Update.
+       * gdb.arch/aarch64-tagged-pointer.exp: Add tests for watchpoint.
+
 2017-12-08  Yao Qi  <yao.qi@linaro.org>
 
        * gdb.arch/aarch64-tagged-pointer.c (main): Update.
index 9bfe41e12985e566ece27dd26ac00e4567a09b5a..5754785f3c0fd80a26f6fbfcb26f165002a544d6 100644 (file)
@@ -53,4 +53,5 @@ main (void)
     }
 
   sp1->i = 8765;
+  i = 1;
 }
index fcab1b76d94b5270f258a5952d4767b264ab5aec..c08993ea8d519ffec57c13855bfbd5fd25b6591a 100644 (file)
@@ -89,3 +89,17 @@ foreach_with_prefix bptype {"hbreak" "break"} {
     gdb_test "up" "\\(\*func_ptr\\) \\(\\).*" "caller is *func_ptr"
     delete_breakpoints
 }
+
+gdb_test "down"
+gdb_test "finish"
+# Watch on tagged pointer.
+gdb_test "watch *sp2"
+gdb_test "continue" \
+    "Continuing\\..*Hardware watchpoint \[0-9\]+.*" \
+    "run until watchpoint on s1"
+delete_breakpoints
+
+gdb_test "watch *p2"
+gdb_test "continue" \
+    "Continuing\\..*Hardware watchpoint \[0-9\]+.*" \
+    "run until watchpoint on i"
This page took 0.060993 seconds and 4 git commands to generate.