* arm-tdep.c (thumb_get_next_pc): Handle Thumb BLX.
authorDaniel Jacobowitz <drow@false.org>
Tue, 9 Mar 2004 15:44:26 +0000 (15:44 +0000)
committerDaniel Jacobowitz <drow@false.org>
Tue, 9 Mar 2004 15:44:26 +0000 (15:44 +0000)
gdb/ChangeLog
gdb/arm-tdep.c

index 52df7690be4e45949cc977e28c2b33208c5ee59a..56fc35d9194117a3b89b5b9dd8fe00459f6ccd3a 100644 (file)
@@ -1,3 +1,7 @@
+2004-03-09  Daniel Jacobowitz  <drow@mvista.com>
+
+       * arm-tdep.c (thumb_get_next_pc): Handle Thumb BLX.
+
 2004-03-08  Nathan J. Williams  <nathanw@wasabisystems.com>
 
        * MAINTAINERS (write after approval): Add myself.
index 06bfcb612e47d056a36b2e0be2e9b14bbb990239..05c0f23d03562ef505123fb5a8ddc08a37eea1bd 100644 (file)
@@ -1651,13 +1651,16 @@ thumb_get_next_pc (CORE_ADDR pc)
     {
       nextpc = pc_val + (sbits (inst1, 0, 10) << 1);
     }
-  else if ((inst1 & 0xf800) == 0xf000) /* long branch with link */
+  else if ((inst1 & 0xf800) == 0xf000) /* long branch with link, and blx */
     {
       unsigned short inst2 = read_memory_integer (pc + 2, 2);
       offset = (sbits (inst1, 0, 10) << 12) + (bits (inst2, 0, 10) << 1);
       nextpc = pc_val + offset;
+      /* For BLX make sure to clear the low bits.  */
+      if (bits (inst2, 11, 12) == 1)
+       nextpc = nextpc & 0xfffffffc;
     }
-  else if ((inst1 & 0xff80) == 0x4700) /* branch and exchange (bx) */
+  else if ((inst1 & 0xff00) == 0x4700) /* bx REG, blx REG */
     {
       if (bits (inst1, 3, 6) == 0x0f)
        nextpc = pc_val;