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.
This commit is contained in:
parent
a0de8c21ba
commit
f17d947477
5 changed files with 26 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -53,4 +53,5 @@ main (void)
|
|||
}
|
||||
|
||||
sp1->i = 8765;
|
||||
i = 1;
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue