* arm-tdep.c (cleanup_branch): Set a correct return address in

LR for ARM and Thumb.
This commit is contained in:
Yao Qi 2011-04-07 03:42:51 +00:00
parent 91db4c57cf
commit 8c8dba6d3d
2 changed files with 15 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2011-04-07 Yao Qi <yao@codesourcery.com>
* arm-tdep.c (cleanup_branch): Set a correct return address in
LR for ARM and Thumb.
2011-04-06 Jan Kratochvil <jan.kratochvil@redhat.com>
Code cleanup.

View File

@ -5493,8 +5493,16 @@ cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
if (dsc->u.branch.link)
{
ULONGEST pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
displaced_write_reg (regs, dsc, ARM_LR_REGNUM, pc - 4, CANNOT_WRITE_PC);
/* The value of LR should be the next insn of current one. In order
not to confuse logic hanlding later insn `bx lr', if current insn mode
is Thumb, the bit 0 of LR value should be set to 1. */
ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
if (dsc->is_thumb)
next_insn_addr |= 0x1;
displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
CANNOT_WRITE_PC);
}
displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);