* mips-tdep.c (mips_about_to_return): Remove dead MIPS16 support
authorMaciej W. Rozycki <macro@linux-mips.org>
Tue, 24 Apr 2012 19:56:02 +0000 (19:56 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Tue, 24 Apr 2012 19:56:02 +0000 (19:56 +0000)
code.  Handle JR.HB correctly.

gdb/ChangeLog
gdb/mips-tdep.c

index 355e82bb0137afc1079aeca71122f93983f0050a..14bf93432baf29eaeed876ec324f9e6742a6a672 100644 (file)
@@ -1,3 +1,8 @@
+2012-04-24  Maciej W. Rozycki  <macro@codesourcery.com>
+
+       * mips-tdep.c (mips_about_to_return): Remove dead MIPS16 support
+       code.  Handle JR.HB correctly.
+
 2012-04-24  Maciej W. Rozycki  <macro@codesourcery.com>
 
        * mips-tdep.c
index ddc2d8aa6b2109d93b63e0be97e621e5602797cf..8973ff79be58eaa4e8b2fba60219ab4f8d550c0c 100644 (file)
@@ -2763,16 +2763,16 @@ mips_software_single_step (struct frame_info *frame)
 static int
 mips_about_to_return (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  if (mips_pc_is_mips16 (pc))
-    /* This mips16 case isn't necessarily reliable.  Sometimes the compiler
-       generates a "jr $ra"; other times it generates code to load
-       the return address from the stack to an accessible register (such
-       as $a3), then a "jr" using that register.  This second case
-       is almost impossible to distinguish from an indirect jump
-       used for switch statements, so we don't even try.  */
-    return mips_fetch_instruction (gdbarch, pc) == 0xe820;     /* jr $ra */
-  else
-    return mips_fetch_instruction (gdbarch, pc) == 0x3e00008;  /* jr $ra */
+  ULONGEST insn;
+  ULONGEST hint;
+
+  /* This used to check for MIPS16, but this piece of code is never
+     called for MIPS16 functions.  */
+  gdb_assert (!mips_pc_is_mips16 (pc));
+
+  insn = mips_fetch_instruction (gdbarch, pc);
+  hint = 0x7c0;
+  return (insn & ~hint) == 0x3e00008;                  /* jr(.hb) $ra */
 }