This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] mips-tdep.c: Add dwarf/dwarf2 regnum mapping functions


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);





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]