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)
commitf17d9474776e50ae47aa71c52211ea6e21adf5d5
tree49a49fa97030b74de9365cd37690a54d78e2f6f0
parenta0de8c21baf46c40ed8e62faef5f750b1e5453ea
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.
gdb/ChangeLog
gdb/breakpoint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c
gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp