* config/i386/tm-i386.h (STAB_REG_TO_REGNUM, SDB_REG_TO_REGNUM,
authorMark Kettenis <kettenis@gnu.org>
Sat, 28 Jul 2001 17:03:38 +0000 (17:03 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 28 Jul 2001 17:03:38 +0000 (17:03 +0000)
DWARF_REG_TO_REGNUM, DWARF2_REG_TO_REGNUM): New defines.
(i386_stab_reg_to_regnum, i386_dwarf_reg_to_regnum): New
prototypes.
* config/i386/tm-fbsd.h, config/i386/tm-i386gnu.h,
config/i386/tm-linux.h (STAB_REG_TO_REGNUM): Redefine to call
i386_dwarf_reg_to_regnum.
* i386-tdep.c (i386_stab_reg_to_regnum, i386_dwarf_reg_to_regnum):
New functions.

gdb/ChangeLog
gdb/config/i386/tm-fbsd.h
gdb/config/i386/tm-i386gnu.h
gdb/i386-tdep.c

index 51c7727..0fe00f3 100644 (file)
@@ -1,5 +1,15 @@
 2001-07-28  Mark Kettenis  <kettenis@gnu.org>
 
+       * config/i386/tm-i386.h (STAB_REG_TO_REGNUM, SDB_REG_TO_REGNUM,
+       DWARF_REG_TO_REGNUM, DWARF2_REG_TO_REGNUM): New defines.
+       (i386_stab_reg_to_regnum, i386_dwarf_reg_to_regnum): New
+       prototypes.
+       * config/i386/tm-fbsd.h, config/i386/tm-i386gnu.h,
+       config/i386/tm-linux.h (STAB_REG_TO_REGNUM): Redefine to call
+       i386_dwarf_reg_to_regnum.
+       * i386-tdep.c (i386_stab_reg_to_regnum, i386_dwarf_reg_to_regnum):
+       New functions.
+
        * i386-tdep.c: Include "gdb_assert.h"
        (i386_register_convert_to_virtual): Fix such that it can handle
        conversion to any floating-point type.  Assert that we are dealing
index f8f4889..61f5de5 100644 (file)
 #define HAVE_I387_REGS
 #include "i386/tm-i386.h"
 
+/* FreeBSD/ELF uses stabs-in-ELF with the DWARF register numbering
+   scheme by default, so we must redefine STAB_REG_TO_REGNUM.  This
+   messes up the floating-point registers for a.out, but there is not
+   much we can do about that.  */
+
+#undef STAB_REG_TO_REGNUM
+#define STAB_REG_TO_REGNUM(reg) i386_dwarf_reg_to_regnum ((reg))
+
 /* FreeBSD uses the old gcc convention for struct returns.  */
 
 #define USE_STRUCT_CONVENTION(gcc_p, type) \
index 6f6d245..00cb5a9 100644 (file)
 #define HAVE_I387_REGS
 #include "i386/tm-i386.h"
 
+/* We use stabs-in-ELF with the DWARF register numbering scheme.  */
+
+#undef STAB_REG_TO_REGNUM
+#define STAB_REG_TO_REGNUM(reg) i386_dwarf_reg_to_regnum ((reg))
+
 /* Offset to saved PC in sigcontext.  */
 #define SIGCONTEXT_PC_OFFSET 68
 
index 60ca84e..3aa8cb5 100644 (file)
@@ -59,6 +59,68 @@ int i386_register_raw_size[MAX_NUM_REGS] = {
 /* i386_register_virtual_size[i] is the size in bytes of the virtual
    type of register i.  */
 int i386_register_virtual_size[MAX_NUM_REGS];
+
+/* Convert stabs register number REG to the appropriate register
+   number used by GDB.  */
+
+int
+i386_stab_reg_to_regnum (int reg)
+{
+  /* This implements what GCC calls the "default" register map.  */
+  if (reg >= 0 && reg <= 7)
+    {
+      /* General registers.  */
+      return reg;
+    }
+  else if (reg >= 12 && reg <= 19)
+    {
+      /* Floating-point registers.  */
+      return reg - 12 + FP0_REGNUM;
+    }
+  else if (reg >= 21 && reg <= 28)
+    {
+      /* SSE registers.  */
+      return reg - 21 + XMM0_REGNUM;
+    }
+  else if (reg >= 29 && reg <= 36)
+    {
+      /* MMX registers.  */
+      /* FIXME: kettenis/2001-07-28: Should we have the MMX registers
+         as pseudo-registers?  */
+      return reg - 29 + FP0_REGNUM;
+    }
+
+  /* This will hopefully provoke a warning.  */
+  return NUM_REGS + NUM_PSEUDO_REGS;
+}
+
+/* Convert Dwarf register number REG to the appropriate register
+   number used by GDB.  */
+
+int
+i386_dwarf_reg_to_regnum (int reg)
+{
+  /* The DWARF register numbering includes %eip and %eflags, and
+     numbers the floating point registers differently.  */
+  if (reg >= 0 && reg <= 9)
+    {
+      /* General registers.  */
+      return reg;
+    }
+  else if (reg >= 11 && reg <= 18)
+    {
+      /* Floating-point registers.  */
+      return reg - 11 + FP0_REGNUM;
+    }
+  else if (reg >= 21)
+    {
+      /* The SSE and MMX registers have identical numbers as in stabs.  */
+      return i386_stab_reg_to_regnum (reg);
+    }
+
+  /* This will hopefully provoke a warning.  */
+  return NUM_REGS + NUM_PSEUDO_REGS;
+}
 \f
 
 /* This is the variable that is set with "set disassembly-flavor", and