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] Map registers to remote numbers when encoding an ax_reg or ax_reg_mask operation


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

commit 1eb7c2d886c0faac42d2b68862b0e6b0d3182d98
Author: Antoine Tremblay <antoine.tremblay@ericsson.com>
Date:   Wed Feb 24 15:00:17 2016 -0500

    Map registers to remote numbers when encoding an ax_reg or ax_reg_mask operation
    
    When encoding the agent expression operation ax_reg or ax_reg_mask, the
    register number used is internal to GDB. However GDBServer expects a tdesc
    based number.
    
    This usually does not cause a problem since at the moment, for raw
    registers GDBServer R trace action ignores the register mask and just
    collects all registers.
    
    It can be a problem, however with pseudo registers on some platforms if the
    tdesc number doesn't match the GDB internal register number.
    
    This is the case with ARM, the upcoming ARM tracepoint support, fails
    these test cases without this patch:
    
    gdb.trace/collection.exp: collect register locals collectively:*
    
    GDBSever would exit with: unhandled register size
    Since the register number is not mapped.
    
    This patch fixes these issues by calling gdbarch_remote_register_number
    before encoding the register number in the ax_reg or ax_reg_mask operation.
    
    Tested on x86 native-gdbserver no regressions observed.
    
    gdb/ChangeLog:
    
    	* ax-general.c (ax_reg): Call gdbarch_remote_register_number.
    	(ax_reg_mask): Likewise.

Diff:
---
 gdb/ChangeLog    | 5 +++++
 gdb/ax-general.c | 9 ++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0d6ea60..dc12399 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-25  Antoine Tremblay  <antoine.tremblay@ericsson.com>
+
+	* ax-general.c (ax_reg): Call gdbarch_remote_register_number.
+	(ax_reg_mask): Likewise.
+
 2016-02-24  Pedro Alves  <palves@redhat.com>
 
 	* linux-nat.c (save_sigtrap) Delete.
diff --git a/gdb/ax-general.c b/gdb/ax-general.c
index 30f90e8..7f27a45 100644
--- a/gdb/ax-general.c
+++ b/gdb/ax-general.c
@@ -308,6 +308,9 @@ ax_reg (struct agent_expr *x, int reg)
     }
   else
     {
+      /* Get the remote register number.  */
+      reg = gdbarch_remote_register_number (x->gdbarch, reg);
+
       /* Make sure the register number is in range.  */
       if (reg < 0 || reg > 0xffff)
         error (_("GDB bug: ax-general.c (ax_reg): "
@@ -456,7 +459,11 @@ ax_reg_mask (struct agent_expr *ax, int reg)
     }
   else
     {
-      int byte = reg / 8;
+      int byte;
+
+      /* Get the remote register number.  */
+      reg = gdbarch_remote_register_number (ax->gdbarch, reg);
+      byte = reg / 8;
 
       /* Grow the bit mask if necessary.  */
       if (byte >= ax->reg_mask_len)


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