This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] mips-tdep.c: Add dwarf/dwarf2 regnum mapping functions
- From: Andrew Cagney <ac131313 at redhat dot com>
- To: Kevin Buettner <kevinb at redhat dot com>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Fri, 07 Mar 2003 12:03:57 -0500
- Subject: Re: [RFA] mips-tdep.c: Add dwarf/dwarf2 regnum mapping functions
- References: <1030304211701.ZM24618@localhost.localdomain>
When using dwarf2 debug info, floating point registers are mapped
incorrectly for certain mips targets. It turns out that Irix is the
only one that's getting it right due to the fact that FP0_REGNUM is
defined to be 32.
Thanks to Chris Demetriou for diagnosing this problem and suggesting
the solution.
[Note: Irix cross some other mips target is currently broken due to
the fact that FP0_REGNUM is not multiarched yet.]
I don't think FP0_REGNUM should be multi-arched. The only reference to
FP0_REGNUM in generic code that I could find was this gem:
if (FP0_REGNUM >= 0) /* need floating point? */
{
if ((regno >= 0 && regno < FP0_REGNUM) ||
regno == PC_REGNUM ||
(NPC_REGNUM >= 0 && regno == NPC_REGNUM) ||
regno == FP_REGNUM ||
regno == SP_REGNUM)
return; /* not a floating point register */
if ((fpregs = proc_get_fpregs (pi)) == NULL)
proc_error (pi, "fetch_registers, get_fpregs", __LINE__);
supply_fpregset (fpregs);
}
mips_tdep could certainly gain a local tdep->fp0_regnum though.
Okay?
Yes, just make it a little bit more robust. The i386 does this:
/* This will hopefully provoke a warning. */
return NUM_REGS + NUM_PSEUDO_REGS;
when it doesn't know what to do with a register.
Andrew
+static int
+mips_dwarf_reg_to_regnum (int num)
+{
+ if (num < 32)
+ return num;
+ else
+ return num + FP0_REGNUM - 32;
+}
+
+/* Convert a dwarf2 register number to a gdb REGNUM */
+
+static int
+mips_dwarf2_reg_to_regnum (int num)
+{
+ if (num < 32)
+ return num;
+ else
+ return num + FP0_REGNUM - 32;
+}
+
+
/* Convert an integer into an address. By first converting the value
into a pointer and then extracting it signed, the address is
guarenteed to be correctly sign extended. */
@@ -5980,6 +6003,8 @@ mips_gdbarch_init (struct gdbarch_info i
/* Map debug register numbers onto internal register numbers. */
set_gdbarch_stab_reg_to_regnum (gdbarch, mips_stab_reg_to_regnum);
set_gdbarch_ecoff_reg_to_regnum (gdbarch, mips_ecoff_reg_to_regnum);
+ set_gdbarch_dwarf_reg_to_regnum (gdbarch, mips_dwarf_reg_to_regnum);
+ set_gdbarch_dwarf2_reg_to_regnum (gdbarch, mips_dwarf2_reg_to_regnum);
/* Initialize a frame */
set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, mips_frame_init_saved_regs);