diff options
Diffstat (limited to 'contrib/gdb/gdb/mipsread.c')
-rw-r--r-- | contrib/gdb/gdb/mipsread.c | 173 |
1 files changed, 86 insertions, 87 deletions
diff --git a/contrib/gdb/gdb/mipsread.c b/contrib/gdb/gdb/mipsread.c index 614c27e..1f869f4 100644 --- a/contrib/gdb/gdb/mipsread.c +++ b/contrib/gdb/gdb/mipsread.c @@ -1,24 +1,26 @@ /* Read a symbol table in MIPS' format (Third-Eye). - Copyright 1986, 87, 89, 90, 91, 92, 93, 94, 95, 96, 1998 + Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, + 1998, 1999, 2000, 2001 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. -This file is part of GDB. + This file is part of GDB. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* Read symbols from an ECOFF file. Most of the work is done in mdebugread.c. */ @@ -31,7 +33,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "objfiles.h" #include "buildsym.h" #include "stabsread.h" -#include "gdb-stabs.h" #include "coff/sym.h" #include "coff/internal.h" @@ -41,22 +42,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "elf/common.h" #include "elf/mips.h" -static void -mipscoff_new_init PARAMS ((struct objfile *)); +extern void _initialize_mipsread (void); -static void -mipscoff_symfile_init PARAMS ((struct objfile *)); +static void mipscoff_new_init (struct objfile *); -static void -mipscoff_symfile_read PARAMS ((struct objfile *, struct section_offsets *, - int)); +static void mipscoff_symfile_init (struct objfile *); -static void -mipscoff_symfile_finish PARAMS ((struct objfile *)); +static void mipscoff_symfile_read (struct objfile *, int); + +static void mipscoff_symfile_finish (struct objfile *); static void -read_alphacoff_dynamic_symtab PARAMS ((struct section_offsets *, - struct objfile *objfile)); +read_alphacoff_dynamic_symtab (struct section_offsets *, + struct objfile *objfile); /* Initialize anything that needs initializing when a completely new symbol file is specified (not just adding some symbols from another @@ -65,8 +63,7 @@ read_alphacoff_dynamic_symtab PARAMS ((struct section_offsets *, extern CORE_ADDR sigtramp_address; static void -mipscoff_new_init (ignore) - struct objfile *ignore; +mipscoff_new_init (struct objfile *ignore) { sigtramp_address = 0; stabsread_new_init (); @@ -76,24 +73,20 @@ mipscoff_new_init (ignore) /* Initialize to read a symbol file (nothing to do). */ static void -mipscoff_symfile_init (objfile) - struct objfile *objfile; +mipscoff_symfile_init (struct objfile *objfile) { } /* Read a symbol file from a file. */ static void -mipscoff_symfile_read (objfile, section_offsets, mainline) - struct objfile *objfile; - struct section_offsets *section_offsets; - int mainline; +mipscoff_symfile_read (struct objfile *objfile, int mainline) { bfd *abfd = objfile->obfd; - struct cleanup * back_to; + struct cleanup *back_to; init_minimal_symbol_collection (); - back_to = make_cleanup ((make_cleanup_func) discard_minimal_symbols, 0); + back_to = make_cleanup_discard_minimal_symbols (); /* Now that the executable file is positioned at symbol table, process it and define symbols accordingly. */ @@ -103,11 +96,11 @@ mipscoff_symfile_read (objfile, section_offsets, mainline) error ("Error reading symbol table: %s", bfd_errmsg (bfd_get_error ())); mdebug_build_psymtabs (objfile, &ecoff_backend (abfd)->debug_swap, - &ecoff_data (abfd)->debug_info, section_offsets); + &ecoff_data (abfd)->debug_info); /* Add alpha coff dynamic symbols. */ - read_alphacoff_dynamic_symtab (section_offsets, objfile); + read_alphacoff_dynamic_symtab (objfile->section_offsets, objfile); /* Install any minimal symbols that have been collected as the current minimal symbols for this objfile. */ @@ -139,8 +132,7 @@ mipscoff_symfile_read (objfile, section_offsets, mainline) particular objfile. */ static void -mipscoff_symfile_finish (objfile) - struct objfile *objfile; +mipscoff_symfile_finish (struct objfile *objfile) { } @@ -156,38 +148,42 @@ mipscoff_symfile_finish (objfile) /* 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; +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; /* 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 */ - union { - unsigned char d_ptr[8]; /* Pointer value */ - unsigned char d_val[4]; /* Integer value */ - } d_un; -} Elfalpha_External_Dyn; +typedef struct + { + 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 */ + } + d_un; + } +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 */ -}; - -static void -alphacoff_locate_sections PARAMS ((bfd *, asection *, void *)); +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 */ + }; /* We are called once per section from read_alphacoff_dynamic_symtab. We need to examine each section we are passed, check to see @@ -195,10 +191,7 @@ alphacoff_locate_sections PARAMS ((bfd *, asection *, void *)); if so, stash away some access information for the section. */ static void -alphacoff_locate_sections (ignore_abfd, sectp, sip) - bfd *ignore_abfd; - asection *sectp; - PTR sip; +alphacoff_locate_sections (bfd *ignore_abfd, asection *sectp, void *sip) { register struct alphacoff_dynsecinfo *si; @@ -226,9 +219,8 @@ alphacoff_locate_sections (ignore_abfd, sectp, sip) add them to the minimal symbol table. */ static void -read_alphacoff_dynamic_symtab (section_offsets, objfile) - struct section_offsets *section_offsets; - struct objfile *objfile; +read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, + struct objfile *objfile) { bfd *abfd = objfile->obfd; struct alphacoff_dynsecinfo si; @@ -249,6 +241,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) int got_entry_size = 8; int dt_mips_local_gotno = -1; int dt_mips_gotsym = -1; + struct cleanup *cleanups; /* We currently only know how to handle alpha dynamic symbols. */ @@ -257,7 +250,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) /* Locate the dynamic symbols sections and read them in. */ memset ((char *) &si, 0, sizeof (si)); - bfd_map_over_sections (abfd, alphacoff_locate_sections, (PTR) &si); + bfd_map_over_sections (abfd, alphacoff_locate_sections, (void *) & si); if (si.sym_sect == NULL || si.str_sect == NULL || si.dyninfo_sect == NULL @@ -268,22 +261,26 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) str_secsize = bfd_get_section_size_before_reloc (si.str_sect); dyninfo_secsize = bfd_get_section_size_before_reloc (si.dyninfo_sect); got_secsize = bfd_get_section_size_before_reloc (si.got_sect); - sym_secptr = alloca (sym_secsize); - str_secptr = alloca (str_secsize); - dyninfo_secptr = alloca (dyninfo_secsize); - got_secptr = alloca (got_secsize); + sym_secptr = xmalloc (sym_secsize); + cleanups = make_cleanup (free, sym_secptr); + str_secptr = xmalloc (str_secsize); + make_cleanup (free, str_secptr); + dyninfo_secptr = xmalloc (dyninfo_secsize); + make_cleanup (free, dyninfo_secptr); + got_secptr = xmalloc (got_secsize); + make_cleanup (free, got_secptr); if (!bfd_get_section_contents (abfd, si.sym_sect, sym_secptr, - (file_ptr)0, sym_secsize)) + (file_ptr) 0, sym_secsize)) return; if (!bfd_get_section_contents (abfd, si.str_sect, str_secptr, - (file_ptr)0, str_secsize)) + (file_ptr) 0, str_secsize)) return; if (!bfd_get_section_contents (abfd, si.dyninfo_sect, dyninfo_secptr, - (file_ptr)0, dyninfo_secsize)) + (file_ptr) 0, dyninfo_secsize)) return; if (!bfd_get_section_contents (abfd, si.got_sect, got_secptr, - (file_ptr)0, got_secsize)) + (file_ptr) 0, got_secsize)) return; /* Find the number of local GOT entries and the index for the @@ -292,7 +289,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) dyninfo_p < dyninfo_end; dyninfo_p += sizeof (Elfalpha_External_Dyn)) { - Elfalpha_External_Dyn *x_dynp = (Elfalpha_External_Dyn *)dyninfo_p; + Elfalpha_External_Dyn *x_dynp = (Elfalpha_External_Dyn *) dyninfo_p; long dyn_tag; dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp->d_tag); @@ -369,7 +366,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) if (sym_value == 0) { int got_entry_offset = - (i - dt_mips_gotsym + dt_mips_local_gotno) * got_entry_size; + (i - dt_mips_gotsym + dt_mips_local_gotno) * got_entry_size; if (got_entry_offset < 0 || got_entry_offset >= got_secsize) continue; @@ -394,7 +391,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) ms_type = mst_text; else ms_type = mst_file_text; - sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT); + sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)); } else if (sym_shndx == SHN_MIPS_DATA) { @@ -402,7 +399,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) ms_type = mst_data; else ms_type = mst_file_data; - sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA); + sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile)); } else if (sym_shndx == SHN_MIPS_ACOMMON) { @@ -410,7 +407,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) ms_type = mst_bss; else ms_type = mst_file_bss; - sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS); + sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile)); } else if (sym_shndx == SHN_ABS) { @@ -424,6 +421,8 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile) prim_record_minimal_symbol (name, sym_value, ms_type, objfile); } + + do_cleanups (cleanups); } /* Initialization */ @@ -440,7 +439,7 @@ static struct sym_fns ecoff_sym_fns = }; void -_initialize_mipsread () +_initialize_mipsread (void) { add_symtab_fns (&ecoff_sym_fns); } |