* mipsread.c: Cleanup coding style.
(mipscoff_new_init, mipscoff_symfile_init, mipscoff_symfile_read) (mipscoff_symfile_finish): Remove prototypes. * mips-tdep.c (mips_fetch_instruction, mips16_fetch_instruction) (mips_mdebug_frame_cache, mips16_scan_prologue) (mips32_scan_prologue, mips_stub_frame_cache) (heuristic_proc_start, heuristic_proc_desc) (mips_eabi_push_dummy_call, mips_n32n64_push_dummy_call) (mips_n32n64_return_value, mips_o32_push_dummy_call) (mips_o32_return_value, mips_o64_push_dummy_call) (mips_step_skips_delay, mips_skip_trampoline_code) (mips_gdbarch_init): Use MIPS_A0_REGNUM instead of A0_REGNUM, MIPS_RA_REGNUM instead of RA_REGNUM, MIPS_T9_REGNUM instead of T9_REGNUM, MIPS_V0_REGNUM instead of V0_REGNUM, MIPS_ZERO_REGNUM instead of ZERO_REGNUM, MIPS32_SIZE_INSN instead of MIPS_INSTLEN and MIPS16_INSN_SIZE instead of MIPS16_INSTLEN. (mips_dump_tdep): Don't print A0_REGNUM, RA_REGNUM, T9_REGNUM, V0_REGNUM, ZERO_REGNUM, MIPS_INSTLEN and MIPS16_INSTLEN. Use MIPS_A0_REGNUM instead of A0_REGNUM. * mips-linux-tdep.c (mips_linux_o32_sigframe_init) (mips_linux_n32n64_sigframe_init): Use MIPS_ZERO_REGNUM instead of ZERO_REGNUM. * mipsnbsd-tdep.c (mipsnbsd_cannot_fetch_register) (mipsnbsd_cannot_store_register): Use MIPS_ZERO_REGNUM instead of ZERO_REGNUM. (mipsnbsd_get_longjmp_target): Use MIPS_A0_REGNUM instead of A0_REGNUM. * mipsnbsd-nat.c: Include "mips-tdep.h". (getregs_supplies): Use MIPS_ZERO_REGNUM instead of ZERO_REGNUM. * Makefile.in (mipsnbsd-nat.o): Update dependencies.
This commit is contained in:
parent
4c7d22cba3
commit
303d2914db
@ -1,3 +1,39 @@
|
||||
2004-10-30 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* mipsread.c: Cleanup coding style.
|
||||
(mipscoff_new_init, mipscoff_symfile_init, mipscoff_symfile_read)
|
||||
(mipscoff_symfile_finish): Remove prototypes.
|
||||
|
||||
2004-10-29 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* mips-tdep.c (mips_fetch_instruction, mips16_fetch_instruction)
|
||||
(mips_mdebug_frame_cache, mips16_scan_prologue)
|
||||
(mips32_scan_prologue, mips_stub_frame_cache)
|
||||
(heuristic_proc_start, heuristic_proc_desc)
|
||||
(mips_eabi_push_dummy_call, mips_n32n64_push_dummy_call)
|
||||
(mips_n32n64_return_value, mips_o32_push_dummy_call)
|
||||
(mips_o32_return_value, mips_o64_push_dummy_call)
|
||||
(mips_step_skips_delay, mips_skip_trampoline_code)
|
||||
(mips_gdbarch_init): Use MIPS_A0_REGNUM instead of A0_REGNUM,
|
||||
MIPS_RA_REGNUM instead of RA_REGNUM, MIPS_T9_REGNUM instead of
|
||||
T9_REGNUM, MIPS_V0_REGNUM instead of V0_REGNUM, MIPS_ZERO_REGNUM
|
||||
instead of ZERO_REGNUM, MIPS32_SIZE_INSN instead of MIPS_INSTLEN
|
||||
and MIPS16_INSN_SIZE instead of MIPS16_INSTLEN.
|
||||
(mips_dump_tdep): Don't print A0_REGNUM, RA_REGNUM,
|
||||
T9_REGNUM, V0_REGNUM, ZERO_REGNUM, MIPS_INSTLEN and
|
||||
MIPS16_INSTLEN. Use MIPS_A0_REGNUM instead of A0_REGNUM.
|
||||
* mips-linux-tdep.c (mips_linux_o32_sigframe_init)
|
||||
(mips_linux_n32n64_sigframe_init): Use MIPS_ZERO_REGNUM instead of
|
||||
ZERO_REGNUM.
|
||||
* mipsnbsd-tdep.c (mipsnbsd_cannot_fetch_register)
|
||||
(mipsnbsd_cannot_store_register): Use MIPS_ZERO_REGNUM instead of
|
||||
ZERO_REGNUM.
|
||||
(mipsnbsd_get_longjmp_target): Use MIPS_A0_REGNUM instead of
|
||||
A0_REGNUM.
|
||||
* mipsnbsd-nat.c: Include "mips-tdep.h".
|
||||
(getregs_supplies): Use MIPS_ZERO_REGNUM instead of ZERO_REGNUM.
|
||||
* Makefile.in (mipsnbsd-nat.o): Update dependencies.
|
||||
|
||||
2004-10-29 Andrew Cagney <cagney@gnu.org>
|
||||
|
||||
* stack.c (parse_frame_specification_1): New function based on
|
||||
|
132
gdb/mipsread.c
132
gdb/mipsread.c
@ -1,7 +1,9 @@
|
||||
/* Read a symbol table in MIPS' format (Third-Eye).
|
||||
|
||||
Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1998, 1999, 2000, 2001, 2003, 2004
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Alessandro Forin (af@cs.cmu.edu) at CMU. Major work
|
||||
by Per Bothner, John Gilmore and Ian Lance Taylor at Cygnus Support.
|
||||
|
||||
@ -41,16 +43,6 @@
|
||||
#include "elf/common.h"
|
||||
#include "elf/mips.h"
|
||||
|
||||
extern void _initialize_mipsread (void);
|
||||
|
||||
static void mipscoff_new_init (struct objfile *);
|
||||
|
||||
static void mipscoff_symfile_init (struct objfile *);
|
||||
|
||||
static void mipscoff_symfile_read (struct objfile *, int);
|
||||
|
||||
static void mipscoff_symfile_finish (struct objfile *);
|
||||
|
||||
static void
|
||||
read_alphacoff_dynamic_symtab (struct section_offsets *,
|
||||
struct objfile *objfile);
|
||||
@ -114,58 +106,56 @@ mipscoff_symfile_finish (struct objfile *objfile)
|
||||
}
|
||||
|
||||
/* Alpha OSF/1 encapsulates the dynamic symbols in ELF format in a
|
||||
standard coff section. The ELF format for the symbols differs from
|
||||
the format defined in elf/external.h. It seems that a normal ELF 32 bit
|
||||
format is used, and the representation only changes because longs are
|
||||
64 bit on the alpha. In addition, the handling of text/data section
|
||||
indices for symbols is different from the ELF ABI.
|
||||
As the BFD linker currently does not support dynamic linking on the alpha,
|
||||
there seems to be no reason to pollute BFD with another mixture of object
|
||||
file formats for now. */
|
||||
standard COFF section. The ELF format for the symbols differs from
|
||||
the format defined in elf/external.h. It seems that a normal ELF
|
||||
32-bit format is used, and the representation only changes because
|
||||
longs are 64-bit on the alpha. In addition, the handling of
|
||||
text/data section indices for symbols is different from the ELF
|
||||
ABI. As the BFD linker currently does not support dynamic linking
|
||||
on the alpha, there seems to be no reason to pollute BFD with
|
||||
another mixture of object file formats for now. */
|
||||
|
||||
/* Format of an alpha external ELF symbol. */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char st_name[4]; /* Symbol name, index in string tbl */
|
||||
unsigned char st_pad[4]; /* Pad to long word boundary */
|
||||
unsigned char st_value[8]; /* Value of the symbol */
|
||||
unsigned char st_size[4]; /* Associated symbol size */
|
||||
unsigned char st_info[1]; /* Type and binding attributes */
|
||||
unsigned char st_other[1]; /* No defined meaning, 0 */
|
||||
unsigned char st_shndx[2]; /* Associated section index */
|
||||
}
|
||||
Elfalpha_External_Sym;
|
||||
unsigned char st_name[4]; /* Symbol name, index in string table. */
|
||||
unsigned char st_pad[4]; /* Pad to long word boundary. */
|
||||
unsigned char st_value[8]; /* Value of the symbol. */
|
||||
unsigned char st_size[4]; /* Associated symbol size. */
|
||||
unsigned char st_info[1]; /* Type and binding attributes. */
|
||||
unsigned char st_other[1]; /* No defined meaning, 0. */
|
||||
unsigned char st_shndx[2]; /* Associated section index. */
|
||||
} Elfalpha_External_Sym;
|
||||
|
||||
/* Format of an alpha external ELF dynamic info structure. */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char d_tag[4]; /* Tag */
|
||||
unsigned char d_pad[4]; /* Pad to long word boundary */
|
||||
unsigned char d_tag[4]; /* Tag. */
|
||||
unsigned char d_pad[4]; /* Pad to long word boundary. */
|
||||
union
|
||||
{
|
||||
unsigned char d_ptr[8]; /* Pointer value */
|
||||
unsigned char d_val[4]; /* Integer value */
|
||||
unsigned char d_ptr[8]; /* Pointer value. */
|
||||
unsigned char d_val[4]; /* Integer value. */
|
||||
}
|
||||
d_un;
|
||||
}
|
||||
Elfalpha_External_Dyn;
|
||||
} Elfalpha_External_Dyn;
|
||||
|
||||
/* Struct to obtain the section pointers for alpha dynamic symbol info. */
|
||||
|
||||
struct alphacoff_dynsecinfo
|
||||
{
|
||||
asection *sym_sect; /* Section pointer for .dynsym section */
|
||||
asection *str_sect; /* Section pointer for .dynstr section */
|
||||
asection *dyninfo_sect; /* Section pointer for .dynamic section */
|
||||
asection *got_sect; /* Section pointer for .got section */
|
||||
asection *sym_sect; /* Section pointer for .dynsym section. */
|
||||
asection *str_sect; /* Section pointer for .dynstr section. */
|
||||
asection *dyninfo_sect; /* Section pointer for .dynamic section. */
|
||||
asection *got_sect; /* Section pointer for .got section. */
|
||||
};
|
||||
|
||||
/* We are called once per section from read_alphacoff_dynamic_symtab.
|
||||
We need to examine each section we are passed, check to see
|
||||
if it is something we are interested in processing, and
|
||||
if so, stash away some access information for the section. */
|
||||
We need to examine each section we are passed, check to see if it
|
||||
is something we are interested in processing, and if so, stash away
|
||||
some access information for the section. */
|
||||
|
||||
static void
|
||||
alphacoff_locate_sections (bfd *ignore_abfd, asection *sectp, void *sip)
|
||||
@ -174,26 +164,18 @@ alphacoff_locate_sections (bfd *ignore_abfd, asection *sectp, void *sip)
|
||||
|
||||
si = (struct alphacoff_dynsecinfo *) sip;
|
||||
|
||||
if (DEPRECATED_STREQ (sectp->name, ".dynsym"))
|
||||
{
|
||||
if (strcmp (sectp->name, ".dynsym") == 0)
|
||||
si->sym_sect = sectp;
|
||||
}
|
||||
else if (DEPRECATED_STREQ (sectp->name, ".dynstr"))
|
||||
{
|
||||
else if (strcmp (sectp->name, ".dynstr") == 0)
|
||||
si->str_sect = sectp;
|
||||
}
|
||||
else if (DEPRECATED_STREQ (sectp->name, ".dynamic"))
|
||||
{
|
||||
else if (strcmp (sectp->name, ".dynamic") == 0)
|
||||
si->dyninfo_sect = sectp;
|
||||
}
|
||||
else if (DEPRECATED_STREQ (sectp->name, ".got"))
|
||||
{
|
||||
else if (strcmp (sectp->name, ".got") == 0)
|
||||
si->got_sect = sectp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Scan an alpha dynamic symbol table for symbols of interest and
|
||||
add them to the minimal symbol table. */
|
||||
/* Scan an alpha dynamic symbol table for symbols of interest and add
|
||||
them to the minimal symbol table. */
|
||||
|
||||
static void
|
||||
read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
@ -220,7 +202,6 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
int dt_mips_gotsym = -1;
|
||||
struct cleanup *cleanups;
|
||||
|
||||
|
||||
/* We currently only know how to handle alpha dynamic symbols. */
|
||||
if (bfd_get_arch (abfd) != bfd_arch_alpha)
|
||||
return;
|
||||
@ -228,10 +209,8 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
/* Locate the dynamic symbols sections and read them in. */
|
||||
memset ((char *) &si, 0, sizeof (si));
|
||||
bfd_map_over_sections (abfd, alphacoff_locate_sections, (void *) & si);
|
||||
if (si.sym_sect == NULL
|
||||
|| si.str_sect == NULL
|
||||
|| si.dyninfo_sect == NULL
|
||||
|| si.got_sect == NULL)
|
||||
if (si.sym_sect == NULL || si.str_sect == NULL
|
||||
|| si.dyninfo_sect == NULL || si.got_sect == NULL)
|
||||
return;
|
||||
|
||||
sym_secsize = bfd_get_section_size (si.sym_sect);
|
||||
@ -260,8 +239,8 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
(file_ptr) 0, got_secsize))
|
||||
return;
|
||||
|
||||
/* Find the number of local GOT entries and the index for the
|
||||
the first dynamic symbol in the GOT. */
|
||||
/* Find the number of local GOT entries and the index for the the
|
||||
first dynamic symbol in the GOT. */
|
||||
for (dyninfo_p = dyninfo_secptr, dyninfo_end = dyninfo_p + dyninfo_secsize;
|
||||
dyninfo_p < dyninfo_end;
|
||||
dyninfo_p += sizeof (Elfalpha_External_Dyn))
|
||||
@ -288,8 +267,8 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
if (dt_mips_local_gotno < 0 || dt_mips_gotsym < 0)
|
||||
return;
|
||||
|
||||
/* Scan all dynamic symbols and enter them into the minimal symbol table
|
||||
if appropriate. */
|
||||
/* Scan all dynamic symbols and enter them into the minimal symbol
|
||||
table if appropriate. */
|
||||
sym_count = sym_secsize / sizeof (Elfalpha_External_Sym);
|
||||
stripped = (bfd_get_symcount (abfd) == 0);
|
||||
|
||||
@ -333,13 +312,16 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
|
||||
If sym_value is zero, then we have to get the GOT entry
|
||||
for the symbol.
|
||||
If the GOT entry is nonzero, it represents the quickstart
|
||||
address of the function and we use that as the symbol value.
|
||||
|
||||
If the GOT entry is zero, the function address has to be resolved
|
||||
by the runtime loader before the executable is started.
|
||||
We are unable to find any meaningful address for these
|
||||
functions in the executable file, so we skip them. */
|
||||
If the GOT entry is nonzero, it represents the quickstart
|
||||
address of the function and we use that as the symbol
|
||||
value.
|
||||
|
||||
If the GOT entry is zero, the function address has to be
|
||||
resolved by the runtime loader before the executable is
|
||||
started. We are unable to find any meaningful address
|
||||
for these functions in the executable file, so we skip
|
||||
them. */
|
||||
if (sym_value == 0)
|
||||
{
|
||||
int got_entry_offset =
|
||||
@ -356,9 +338,10 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Symbols defined in the executable itself. We only care about
|
||||
them if this is a stripped executable, otherwise they have
|
||||
been retrieved from the normal symbol table already. */
|
||||
/* Symbols defined in the executable itself. We only care
|
||||
about them if this is a stripped executable, otherwise
|
||||
they have been retrieved from the normal symbol table
|
||||
already. */
|
||||
if (!stripped)
|
||||
continue;
|
||||
|
||||
@ -402,7 +385,7 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
|
||||
do_cleanups (cleanups);
|
||||
}
|
||||
|
||||
/* Initialization */
|
||||
/* Initialization. */
|
||||
|
||||
static struct sym_fns ecoff_sym_fns =
|
||||
{
|
||||
@ -415,6 +398,9 @@ static struct sym_fns ecoff_sym_fns =
|
||||
NULL /* next: pointer to next struct sym_fns */
|
||||
};
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_mipsread (void);
|
||||
|
||||
void
|
||||
_initialize_mipsread (void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user