[binutils-gdb] [spu] Fix single-stepping regression

Ulrich Weigand uweigand@sourceware.org
Sun Nov 26 16:23:00 GMT 2017


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

commit 5ffd2cb722440053267d0db52df8bbd278fd6d91
Author: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Date:   Sun Nov 26 17:15:25 2017 +0100

    [spu] Fix single-stepping regression
    
    Switching spu_software_single_step to use a regcache instead of a frame:
    https://sourceware.org/ml/gdb-patches/2016-11/msg00355.html
    cause a serious regression to SPU single-stepping.
    
    There were two separate problems:
    - SPU_LSLR_REGNUM is a pseudo register, so we must use the "cooked"
      regcache methods instead of the "raw" ones to access it.
    - When accessing a branch target register, we must only use the first
      four bytes of the 16-byte vector register.  This was done automatically
      by the frame routines, but not by the regcache routines.
    
    gdb/ChangeLog:
    2017-11-26  Ulrich Weigand  <uweigand@de.ibm.com>
    
    	* spu-tdep.c (spu_software_single_step): Access SPU_LSLR_REGNUM as
    	"cooked" register.  Access only first four bytes of branch target
    	registers.

Diff:
---
 gdb/ChangeLog  | 6 ++++++
 gdb/spu-tdep.c | 9 ++++++---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 613a5ae..6223f0d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2017-11-26  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* spu-tdep.c (spu_software_single_step): Access SPU_LSLR_REGNUM as
+	"cooked" register.  Access only first four bytes of branch target
+	registers.
+
 2017-11-25  Sergio Durigan Junior  <sergiodj@redhat.com>
 
 	PR gdb/22491
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index ecdc7fc..34a536a 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -1632,8 +1632,8 @@ spu_software_single_step (struct regcache *regcache)
   insn = extract_unsigned_integer (buf, 4, byte_order);
 
   /* Get local store limit.  */
-  lslr = regcache_raw_get_unsigned (regcache, SPU_LSLR_REGNUM);
-  if (!lslr)
+  if ((regcache_cooked_read_unsigned (regcache, SPU_LSLR_REGNUM, &lslr)
+       != REG_VALID) || !lslr)
     lslr = (ULONGEST) -1;
 
   /* Next sequential instruction is at PC + 4, except if the current
@@ -1653,7 +1653,10 @@ spu_software_single_step (struct regcache *regcache)
       if (reg == SPU_PC_REGNUM)
 	target += SPUADDR_ADDR (pc);
       else if (reg != -1)
-	target += regcache_raw_get_unsigned (regcache, reg) & -4;
+      {
+	regcache_raw_read_part (regcache, reg, 0, 4, buf);
+	target += extract_unsigned_integer (buf, 4, byte_order) & -4;
+      }
 
       target = target & lslr;
       if (target != next_pc)



More information about the Gdb-cvs mailing list