Based on a patch from Brian Ford <ford@vss.fsi.com>:
* i386-tdep.c: Correct register numbering scheme comments throughout. (i386_stab_reg_to_regnum): Rename to i386_dbx_reg_to_regnum. (i386_dwarf_reg_to_regnum): Rename to i386_svr4_reg_to_regnum. (i386_coff_init_abi, i386_elf_init_abi): Accomodate renames above. (i386_gdb_arch_init): Likewise.
This commit is contained in:
parent
b4ead1bd29
commit
c4fc7f1b66
2 changed files with 65 additions and 59 deletions
|
@ -1,5 +1,13 @@
|
||||||
2004-04-18 Mark Kettenis <kettenis@gnu.org>
|
2004-04-18 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
|
Based on a patch from Brian Ford <ford@vss.fsi.com>:
|
||||||
|
* i386-tdep.c: Correct register numbering scheme comments
|
||||||
|
throughout.
|
||||||
|
(i386_stab_reg_to_regnum): Rename to i386_dbx_reg_to_regnum.
|
||||||
|
(i386_dwarf_reg_to_regnum): Rename to i386_svr4_reg_to_regnum.
|
||||||
|
(i386_coff_init_abi, i386_elf_init_abi): Accomodate renames above.
|
||||||
|
(i386_gdb_arch_init): Likewise.
|
||||||
|
|
||||||
* Makefile.in (ALLDEPFILES): List ppc-sysv-tdep.c, ppcnbsd-nat.c
|
* Makefile.in (ALLDEPFILES): List ppc-sysv-tdep.c, ppcnbsd-nat.c
|
||||||
and ppcnbsd-tdep.c instead of ppc-sysv-tdep.o, ppcnbsd-nat.o and
|
and ppcnbsd-tdep.c instead of ppc-sysv-tdep.o, ppcnbsd-nat.o and
|
||||||
ppcnbsd-tdep.o.
|
ppcnbsd-tdep.o.
|
||||||
|
|
116
gdb/i386-tdep.c
116
gdb/i386-tdep.c
|
@ -51,8 +51,7 @@
|
||||||
#include "i386-tdep.h"
|
#include "i386-tdep.h"
|
||||||
#include "i387-tdep.h"
|
#include "i387-tdep.h"
|
||||||
|
|
||||||
/* Names of the registers. The first 10 registers match the register
|
/* Register names. */
|
||||||
numbering scheme used by GCC for stabs and DWARF. */
|
|
||||||
|
|
||||||
static char *i386_register_names[] =
|
static char *i386_register_names[] =
|
||||||
{
|
{
|
||||||
|
@ -71,7 +70,7 @@ static char *i386_register_names[] =
|
||||||
|
|
||||||
static const int i386_num_register_names = ARRAY_SIZE (i386_register_names);
|
static const int i386_num_register_names = ARRAY_SIZE (i386_register_names);
|
||||||
|
|
||||||
/* MMX registers. */
|
/* Register names for MMX pseudo-registers. */
|
||||||
|
|
||||||
static char *i386_mmx_names[] =
|
static char *i386_mmx_names[] =
|
||||||
{
|
{
|
||||||
|
@ -166,49 +165,15 @@ i386_register_name (int reg)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert a dbx register number REG to the appropriate register
|
||||||
/* FIXME: jimb/2004-04-01: I don't think these functions are right.
|
|
||||||
For a given platform, GCC always uses the same register numbering
|
|
||||||
in both STABS and Dwarf2: gcc/dbxout.c and gcc/dwarf2out.c both use
|
|
||||||
the DBX_REGISTER_NUMBER macro, as defined by the config headers.
|
|
||||||
If you compile a program so that its variables are allocated to
|
|
||||||
floating-point registers, first with STABS and again with Dwarf 2,
|
|
||||||
you'll see that the variable's register numbers are the same in
|
|
||||||
each case.
|
|
||||||
|
|
||||||
GCC does use (at least) two different register numberings on the
|
|
||||||
i386; they differ in how they number %ebp, %esp, %eflags, and the
|
|
||||||
floating-point registers. And it has a third numbering for "64bit
|
|
||||||
mode", which I assume is x86_64. But it always uses a given
|
|
||||||
numbering in both STABS and Dwarf.
|
|
||||||
|
|
||||||
This does not match the arrangement we have below, which presumes
|
|
||||||
that STABS and Dwarf numberings are different, and does some
|
|
||||||
strange mixing and matching (e.g., registering the Dwarf 2 function
|
|
||||||
as the STABS function for "Generic i386 ELF") to get close enough
|
|
||||||
to the right effect on the platforms we care about.
|
|
||||||
|
|
||||||
If we wanted to match GCC, we should have two separate register
|
|
||||||
number translation functions (we handle x86_64 in a separate tdep
|
|
||||||
file altogether), one corresponding to each of GCC's i386 register
|
|
||||||
maps. And for a given platform, we would register one of them as
|
|
||||||
both the STABS and Dwarf 2 functions.
|
|
||||||
|
|
||||||
However, we don't aspire to match GCC; we aspire to match the
|
|
||||||
native system's tools. I don't have access to lots of different
|
|
||||||
native compilers and debuggers to verify that GCC is matching their
|
|
||||||
behavior in this regard. Is it sufficient to argue that we at
|
|
||||||
least want to match GNU's compiler, and say we'll fix bugs relative
|
|
||||||
to native tools as they're reported? */
|
|
||||||
|
|
||||||
|
|
||||||
/* Convert stabs register number REG to the appropriate register
|
|
||||||
number used by GDB. */
|
number used by GDB. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386_stab_reg_to_regnum (int reg)
|
i386_dbx_reg_to_regnum (int reg)
|
||||||
{
|
{
|
||||||
/* This implements what GCC calls the "default" register map. */
|
/* This implements what GCC calls the "default" register map
|
||||||
|
(dbx_register_map[]). */
|
||||||
|
|
||||||
if (reg >= 0 && reg <= 7)
|
if (reg >= 0 && reg <= 7)
|
||||||
{
|
{
|
||||||
/* General-purpose registers. The debug info calls %ebp
|
/* General-purpose registers. The debug info calls %ebp
|
||||||
|
@ -239,13 +204,16 @@ i386_stab_reg_to_regnum (int reg)
|
||||||
return NUM_REGS + NUM_PSEUDO_REGS;
|
return NUM_REGS + NUM_PSEUDO_REGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert DWARF register number REG to the appropriate register
|
/* Convert SVR4 register number REG to the appropriate register number
|
||||||
number used by GDB. */
|
used by GDB. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386_dwarf_reg_to_regnum (int reg)
|
i386_svr4_reg_to_regnum (int reg)
|
||||||
{
|
{
|
||||||
/* The DWARF register numbering includes %eip and %eflags, and
|
/* This implements the GCC register map that tries to be compatible
|
||||||
|
with the SVR4 C compiler for DWARF (svr4_dbx_register_map[]). */
|
||||||
|
|
||||||
|
/* The SVR4 register numbering includes %eip and %eflags, and
|
||||||
numbers the floating point registers differently. */
|
numbers the floating point registers differently. */
|
||||||
if (reg >= 0 && reg <= 9)
|
if (reg >= 0 && reg <= 9)
|
||||||
{
|
{
|
||||||
|
@ -259,8 +227,8 @@ i386_dwarf_reg_to_regnum (int reg)
|
||||||
}
|
}
|
||||||
else if (reg >= 21)
|
else if (reg >= 21)
|
||||||
{
|
{
|
||||||
/* The SSE and MMX registers have identical numbers as in stabs. */
|
/* The SSE and MMX registers have the same numbers as with dbx. */
|
||||||
return i386_stab_reg_to_regnum (reg);
|
return i386_dbx_reg_to_regnum (reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This will hopefully provoke a warning. */
|
/* This will hopefully provoke a warning. */
|
||||||
|
@ -1819,9 +1787,9 @@ i386_svr4_sigcontext_addr (struct frame_info *next_frame)
|
||||||
void
|
void
|
||||||
i386_coff_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
i386_coff_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||||
{
|
{
|
||||||
/* We typically use DWARF-in-COFF with the stabs register numbering. */
|
/* We typically use DWARF-in-COFF with the dbx register numbering. */
|
||||||
set_gdbarch_dwarf_reg_to_regnum (gdbarch, i386_stab_reg_to_regnum);
|
set_gdbarch_dwarf_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
|
||||||
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, i386_stab_reg_to_regnum);
|
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generic ELF. */
|
/* Generic ELF. */
|
||||||
|
@ -1829,8 +1797,8 @@ i386_coff_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||||
void
|
void
|
||||||
i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||||
{
|
{
|
||||||
/* We typically use stabs-in-ELF with the DWARF register numbering. */
|
/* We typically use stabs-in-ELF with the SVR4 register numbering. */
|
||||||
set_gdbarch_stab_reg_to_regnum (gdbarch, i386_dwarf_reg_to_regnum);
|
set_gdbarch_stab_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* System V Release 4 (SVR4). */
|
/* System V Release 4 (SVR4). */
|
||||||
|
@ -2024,13 +1992,43 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||||
set_gdbarch_ps_regnum (gdbarch, I386_EFLAGS_REGNUM); /* %eflags */
|
set_gdbarch_ps_regnum (gdbarch, I386_EFLAGS_REGNUM); /* %eflags */
|
||||||
set_gdbarch_fp0_regnum (gdbarch, I386_ST0_REGNUM); /* %st(0) */
|
set_gdbarch_fp0_regnum (gdbarch, I386_ST0_REGNUM); /* %st(0) */
|
||||||
|
|
||||||
/* Use the "default" register numbering scheme for stabs and COFF. */
|
/* NOTE: kettenis/20040418: GCC does have two possible register
|
||||||
set_gdbarch_stab_reg_to_regnum (gdbarch, i386_stab_reg_to_regnum);
|
numbering schemes on the i386: dbx and SVR4. These schemes
|
||||||
set_gdbarch_sdb_reg_to_regnum (gdbarch, i386_stab_reg_to_regnum);
|
differ in how they number %ebp, %esp, %eflags, and the
|
||||||
|
floating-point registers, and are implemented by the attays
|
||||||
|
dbx_register_map[] and svr4_dbx_register_map in
|
||||||
|
gcc/config/i386.c. GCC also defines a third numbering scheme in
|
||||||
|
gcc/config/i386.c, which it designates as the "default" register
|
||||||
|
map used in 64bit mode. This last register numbering scheme is
|
||||||
|
implemented in dbx64_register_map, and us used for AMD64; see
|
||||||
|
amd64-tdep.c.
|
||||||
|
|
||||||
/* Use the DWARF register numbering scheme for DWARF and DWARF 2. */
|
Currently, each GCC i386 target always uses the same register
|
||||||
set_gdbarch_dwarf_reg_to_regnum (gdbarch, i386_dwarf_reg_to_regnum);
|
numbering scheme across all its supported debugging formats
|
||||||
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, i386_dwarf_reg_to_regnum);
|
i.e. SDB (COFF), stabs and DWARF 2. This is because
|
||||||
|
gcc/sdbout.c, gcc/dbxout.c and gcc/dwarf2out.c all use the
|
||||||
|
DBX_REGISTER_NUMBER macro which is defined by each target's
|
||||||
|
respective config header in a manner independent of the requested
|
||||||
|
output debugging format.
|
||||||
|
|
||||||
|
This does not match the arrangement below, which presumes that
|
||||||
|
the SDB and stabs numbering schemes differ from the DWARF and
|
||||||
|
DWARF 2 ones. The reason for this arrangement is that it is
|
||||||
|
likely to get the numbering scheme for the target's
|
||||||
|
default/native debug format right. For targets where GCC is the
|
||||||
|
native compiler (FreeBSD, NetBSD, OpenBSD, GNU/Linux) or for
|
||||||
|
targets where the native toolchain uses a different numbering
|
||||||
|
scheme for a particular debug format (stabs-in-ELF on Solaris)
|
||||||
|
the defaults below will have to be overridden, like the functions
|
||||||
|
i386_coff_init_abi() and i386_elf_init_abi() do. */
|
||||||
|
|
||||||
|
/* Use the dbx register numbering scheme for stabs and COFF. */
|
||||||
|
set_gdbarch_stab_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
|
||||||
|
set_gdbarch_sdb_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
|
||||||
|
|
||||||
|
/* Use the SVR4 register numbering scheme for DWARF and DWARF 2. */
|
||||||
|
set_gdbarch_dwarf_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
|
||||||
|
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
|
||||||
|
|
||||||
/* We don't define ECOFF_REG_TO_REGNUM, since ECOFF doesn't seem to
|
/* We don't define ECOFF_REG_TO_REGNUM, since ECOFF doesn't seem to
|
||||||
be in use on any of the supported i386 targets. */
|
be in use on any of the supported i386 targets. */
|
||||||
|
|
Loading…
Reference in a new issue