This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Clear non-significant bits of address in watchpoint


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f17d9474776e50ae47aa71c52211ea6e21adf5d5

commit f17d9474776e50ae47aa71c52211ea6e21adf5d5
Author: Yao Qi <yao.qi@linaro.org>
Date:   Fri Dec 8 17:27:03 2017 +0000

    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.

Diff:
---
 gdb/ChangeLog                                     |  5 +++++
 gdb/breakpoint.c                                  |  2 +-
 gdb/testsuite/ChangeLog                           |  5 +++++
 gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c   |  1 +
 gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp | 14 ++++++++++++++
 5 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 134f7b4..7d061c8 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 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
 	address_significant.
 
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 1cee730..b68718d 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -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)
 		    {
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 17fbe4f..53a2ca4 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,6 +1,11 @@
 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.
 	* gdb.arch/aarch64-tagged-pointer.exp: Add test for breakpoint.
 
 2017-12-08  Yao Qi  <yao.qi@linaro.org>
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"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]