From d476da0ef37ba5ca612a536c69bfe2b859e17c46 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Wed, 31 Mar 2010 22:10:07 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 9 ++++++++- gdb/arm-tdep.c | 20 +++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a83755e46a6..58b54dd516d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-03-31 Richard Earnshaw + + * 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 Fix crash on reading wrong function declaration DWARF. @@ -14,7 +20,8 @@ 2010-03-31 Pierre Muller - * 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 diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index f6a84367a1b..d4248f90316 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -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) { /* 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)); length = 2 * get_frame_memory_unsigned (frame, table + offset, 1); nextpc = pc_val + length; } - else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000) + else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf010) { /* 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)); length = 2 * get_frame_memory_unsigned (frame, table + offset, 2); nextpc = pc_val + length; -- 2.30.2