diff options
author | Yao Qi <yao.qi@linaro.org> | 2017-12-08 17:27:03 +0000 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2017-12-08 17:27:03 +0000 |
commit | f17d9474776e50ae47aa71c52211ea6e21adf5d5 (patch) | |
tree | 49a49fa97030b74de9365cd37690a54d78e2f6f0 /gdb/testsuite/gdb.arch | |
parent | a0de8c21baf46c40ed8e62faef5f750b1e5453ea (diff) | |
download | gdb-f17d9474776e50ae47aa71c52211ea6e21adf5d5.zip gdb-f17d9474776e50ae47aa71c52211ea6e21adf5d5.tar.gz gdb-f17d9474776e50ae47aa71c52211ea6e21adf5d5.tar.bz2 |
Clear non-significant bits of address in watchpoint
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.
Diffstat (limited to 'gdb/testsuite/gdb.arch')
-rw-r--r-- | gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp | 14 |
2 files changed, 15 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c index 9bfe41e..5754785 100644 --- a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c +++ b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c @@ -53,4 +53,5 @@ main (void) } sp1->i = 8765; + i = 1; } diff --git a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp index fcab1b7..c08993e 100644 --- a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp +++ b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp @@ -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" |