mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-18 21:34:13 +08:00
* arm-tdep.c (cleanup_branch): Set a correct return address in
LR for ARM and Thumb.
This commit is contained in:
@ -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.
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user