From: Maciej W. Rozycki Date: Tue, 24 Apr 2012 19:56:02 +0000 (+0000) Subject: * mips-tdep.c (mips_about_to_return): Remove dead MIPS16 support X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6321c22a8c33b07349532156764fecf9a01a2396;p=binutils-gdb.git * mips-tdep.c (mips_about_to_return): Remove dead MIPS16 support code. Handle JR.HB correctly. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 355e82bb013..14bf93432ba 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-04-24 Maciej W. Rozycki + + * mips-tdep.c (mips_about_to_return): Remove dead MIPS16 support + code. Handle JR.HB correctly. + 2012-04-24 Maciej W. Rozycki * mips-tdep.c diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index ddc2d8aa6b2..8973ff79be5 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -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 */ }