* 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> 2011-04-06 Jan Kratochvil <jan.kratochvil@redhat.com>
Code cleanup. Code cleanup.

View File

@ -5493,8 +5493,16 @@ cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
if (dsc->u.branch.link) if (dsc->u.branch.link)
{ {
ULONGEST pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM); /* The value of LR should be the next insn of current one. In order
displaced_write_reg (regs, dsc, ARM_LR_REGNUM, pc - 4, CANNOT_WRITE_PC); 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); displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);