* arm-tdep.c (thumb_get_next_pc_raw): Correctly detect TBH
instructions. Use the PC+4 if the base of the TBB or TBH is the PC register.
This commit is contained in:
parent
77aabdd2d9
commit
d476da0ef3
2 changed files with 23 additions and 6 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2010-03-31 Richard Earnshaw <rearnsha@arm.com>
|
||||||
|
|
||||||
|
* arm-tdep.c (thumb_get_next_pc_raw): Correctly detect TBH
|
||||||
|
instructions. Use the PC+4 if the base of the TBB or TBH is the
|
||||||
|
PC register.
|
||||||
|
|
||||||
2010-03-31 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2010-03-31 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
Fix crash on reading wrong function declaration DWARF.
|
Fix crash on reading wrong function declaration DWARF.
|
||||||
|
@ -14,7 +20,8 @@
|
||||||
|
|
||||||
2010-03-31 Pierre Muller <muller@ics.u-strasbg.fr>
|
2010-03-31 Pierre Muller <muller@ics.u-strasbg.fr>
|
||||||
|
|
||||||
* src/gdb/remote.c (end_thread): ARI fix: Use xstrdup instead of strdup.
|
* src/gdb/remote.c (end_thread): ARI fix: Use xstrdup instead of
|
||||||
|
strdup.
|
||||||
|
|
||||||
2010-03-30 Keith Seitz <keiths@redhat.com>
|
2010-03-30 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
|
|
|
@ -2959,19 +2959,29 @@ thumb_get_next_pc_raw (struct frame_info *frame, CORE_ADDR pc, int insert_bkpt)
|
||||||
else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000)
|
else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000)
|
||||||
{
|
{
|
||||||
/* TBB. */
|
/* TBB. */
|
||||||
CORE_ADDR table, offset, length;
|
CORE_ADDR tbl_reg, table, offset, length;
|
||||||
|
|
||||||
|
tbl_reg = bits (inst1, 0, 3);
|
||||||
|
if (tbl_reg == 0x0f)
|
||||||
|
table = pc + 4; /* Regcache copy of PC isn't right yet. */
|
||||||
|
else
|
||||||
|
table = get_frame_register_unsigned (frame, tbl_reg);
|
||||||
|
|
||||||
table = get_frame_register_unsigned (frame, bits (inst1, 0, 3));
|
|
||||||
offset = get_frame_register_unsigned (frame, bits (inst2, 0, 3));
|
offset = get_frame_register_unsigned (frame, bits (inst2, 0, 3));
|
||||||
length = 2 * get_frame_memory_unsigned (frame, table + offset, 1);
|
length = 2 * get_frame_memory_unsigned (frame, table + offset, 1);
|
||||||
nextpc = pc_val + length;
|
nextpc = pc_val + length;
|
||||||
}
|
}
|
||||||
else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000)
|
else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf010)
|
||||||
{
|
{
|
||||||
/* TBH. */
|
/* TBH. */
|
||||||
CORE_ADDR table, offset, length;
|
CORE_ADDR tbl_reg, table, offset, length;
|
||||||
|
|
||||||
|
tbl_reg = bits (inst1, 0, 3);
|
||||||
|
if (tbl_reg == 0x0f)
|
||||||
|
table = pc + 4; /* Regcache copy of PC isn't right yet. */
|
||||||
|
else
|
||||||
|
table = get_frame_register_unsigned (frame, tbl_reg);
|
||||||
|
|
||||||
table = get_frame_register_unsigned (frame, bits (inst1, 0, 3));
|
|
||||||
offset = 2 * get_frame_register_unsigned (frame, bits (inst2, 0, 3));
|
offset = 2 * get_frame_register_unsigned (frame, bits (inst2, 0, 3));
|
||||||
length = 2 * get_frame_memory_unsigned (frame, table + offset, 2);
|
length = 2 * get_frame_memory_unsigned (frame, table + offset, 2);
|
||||||
nextpc = pc_val + length;
|
nextpc = pc_val + length;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue