[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.
This commit is contained in:
Ulrich Weigand
2017-11-26 17:15:25 +01:00
parent e5a8dd426d
commit 5ffd2cb722
2 changed files with 12 additions and 3 deletions

View File

@ -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

View File

@ -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)