diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 51c77275fd..0fe00f315f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 2001-07-28 Mark Kettenis + * 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 diff --git a/gdb/config/i386/tm-fbsd.h b/gdb/config/i386/tm-fbsd.h index f8f4889c2f..61f5de57f4 100644 --- a/gdb/config/i386/tm-fbsd.h +++ b/gdb/config/i386/tm-fbsd.h @@ -24,6 +24,14 @@ #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) \ diff --git a/gdb/config/i386/tm-i386gnu.h b/gdb/config/i386/tm-i386gnu.h index 6f6d245379..00cb5a9f10 100644 --- a/gdb/config/i386/tm-i386gnu.h +++ b/gdb/config/i386/tm-i386gnu.h @@ -42,6 +42,11 @@ #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 diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 60ca84ed99..3aa8cb5434 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -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; +} /* This is the variable that is set with "set disassembly-flavor", and