* arm-tdep.c (thumb_get_next_pc_raw): Handle Thumb-16 encoding
authorUlrich Weigand <uweigand@de.ibm.com>
Tue, 19 Oct 2010 21:30:54 +0000 (21:30 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Tue, 19 Oct 2010 21:30:54 +0000 (21:30 +0000)
for "mov pc, REG" as well.
(thumb_instruction_changes_pc): Likewise.

gdb/ChangeLog
gdb/arm-tdep.c

index 13336bad5e84db6d2fada995fa30653e3776df86..5242f6140ce45829fa0145c80a63130969e0b018 100644 (file)
@@ -1,3 +1,9 @@
+2010-10-19  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * arm-tdep.c (thumb_get_next_pc_raw): Handle Thumb-16 encoding
+       for "mov pc, REG" as well.
+       (thumb_instruction_changes_pc): Likewise.
+
 2010-10-19  Sami Wagiaalla  <swagiaal@redhat.com>
 
         PR C++/11500:
index 5b32b8a47ca8dd9cdd516bea3de9c9e0956fe4f3..2df96cd0e62ff766a87e307a966ad44b12a4e11b 100644 (file)
@@ -537,6 +537,9 @@ thumb_instruction_changes_pc (unsigned short inst)
   if ((inst & 0xff00) == 0x4700)       /* bx REG, blx REG */
     return 1;
 
+  if ((inst & 0xff87) == 0x4687)       /* mov pc, REG */
+    return 1;
+
   if ((inst & 0xf500) == 0xb100)       /* CBNZ or CBZ.  */
     return 1;
 
@@ -3572,6 +3575,15 @@ thumb_get_next_pc_raw (struct frame_info *frame, CORE_ADDR pc, int insert_bkpt)
       else
        nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6));
     }
+  else if ((inst1 & 0xff87) == 0x4687) /* mov pc, REG */
+    {
+      if (bits (inst1, 3, 6) == 0x0f)
+       nextpc = pc_val;
+      else
+       nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6));
+
+      nextpc = MAKE_THUMB_ADDR (nextpc);
+    }
   else if ((inst1 & 0xf500) == 0xb100)
     {
       /* CBNZ or CBZ.  */