summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@de.ibm.com>2017-11-26 17:15:25 +0100
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2017-11-26 17:15:25 +0100
commit5ffd2cb722440053267d0db52df8bbd278fd6d91 (patch)
tree9c454e42df82741610fa165ac0e4e9f701aa9de6
parente5a8dd426de76af279cb6eff0c761ec866e97dc8 (diff)
downloadbinutils-gdb-5ffd2cb722440053267d0db52df8bbd278fd6d91.tar.gz
[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.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/spu-tdep.c9
2 files changed, 12 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 613a5ae6bb5..6223f0dc2a0 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 ecdc7fc4397..34a536a2603 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)