This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] MIPS: MIPS16 symbol annotation interpretation fix
- From: "Maciej W. Rozycki" <macro at codesourcery dot com>
- To: <gdb-patches at sourceware dot org>
- Date: Wed, 23 Nov 2011 15:10:52 +0000
- Subject: [PATCH] MIPS: MIPS16 symbol annotation interpretation fix
Hi,
It makes no sense for the ISA mode bit to override MIPS16 information
stored in the associated symbol. For example it causes a MIPS16 BREAK
instruction to be used for standard MIPS code if a software breakpoint is
explicitly requested at an address that has the ISA bit set even if the
location is within a function known to be standard MIPS code.
The change below fixes that for mips_pc_is_mips16 and mips_next_pc which
both should only fall back to examining the ISA mode bit if no symbol
annotation is available.
Regression tested successfully for mips-sde-elf (MIPS32 and MIPS16
multilibs, big- and little-endian each) and mips-linux-gnu. OK to apply?
2011-11-23 Maciej W. Rozycki <macro@codesourcery.com>
gdb/
* mips-tdep.c (mips_pc_is_mips16): Reverse the order of checks
performed to determine whether an address refers to standard
MIPS or MIPS16 code.
(mips16_next_pc): Use mips_pc_is_mips16 instead of
is_mips16_addr.
Maciej
gdb-mips-pc-is-mips16.diff
Index: gdb-fsf-trunk-quilt/gdb/mips-tdep.c
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/mips-tdep.c 2011-11-23 02:34:31.000000000 +0000
+++ gdb-fsf-trunk-quilt/gdb/mips-tdep.c 2011-11-23 02:42:05.435578274 +0000
@@ -1018,18 +1018,15 @@ mips_pc_is_mips16 (CORE_ADDR memaddr)
{
struct minimal_symbol *sym;
- /* If bit 0 of the address is set, assume this is a MIPS16 address. */
- if (is_mips16_addr (memaddr))
- return 1;
-
- /* A flag indicating that this is a MIPS16 function is stored by elfread.c in
- the high bit of the info field. Use this to decide if the function is
- MIPS16 or normal MIPS. */
+ /* A flag indicating that this is a MIPS16 function is stored by
+ elfread.c in the high bit of the info field. Use this to decide
+ if the function is MIPS16 or normal MIPS. Otherwise if bit 0 of
+ the address is set, assume this is a MIPS16 address. */
sym = lookup_minimal_symbol_by_pc (memaddr);
if (sym)
return msymbol_is_special (sym);
else
- return 0;
+ return is_mips16_addr (memaddr);
}
/* MIPS believes that the PC has a sign extended value. Perhaps the
@@ -1606,7 +1603,7 @@ mips16_next_pc (struct frame_info *frame
static CORE_ADDR
mips_next_pc (struct frame_info *frame, CORE_ADDR pc)
{
- if (is_mips16_addr (pc))
+ if (mips_pc_is_mips16 (pc))
return mips16_next_pc (frame, pc);
else
return mips32_next_pc (frame, pc);