Record minimal symbols directly in reader.

This patch changes minimal symbol creation in two ways.  First, it
removes global variables in favor of members of minimal_symbol_reader.
Second, it changes functions like prim_record_minimal_symbol to be
member functions of minimal_symbol_reader.

2016-10-21  Tom Tromey  <tom@tromey.com>

	* xcoffread.c (record_minimal_symbol, scan_xcoff_symtab): Add
	"reader" argument.  Update.
	(xcoff_initial_scan): Update.
	* symfile.h (mdebug_build_psymtabs): Add "reader" argument.
	* mipsread.c (mipscoff_symfile_read): Update.
	(read_alphacoff_dynamic_symtab): Add "reader" argument.  Update.
	* minsyms.h (minimal_symbol_reader) <record, record_full>:
	Declare.
	<m_msym_bunch, m_msym_bunch_index, m_msym_count>: New members.
	<record_with_info>: New function, renamed from
	prim_record_minimal_symbol_and_info.
	* minsyms.c (msym_bunch, msym_bunch_index, msym_count): Remove
	globals.
	(minimal_symbol_reader): Initialize new members.
	(minimal_symbol_reader::record): Renamed from
	prim_record_minimal_symbol.
	(minimal_symbol_reader::record_full): Renamed from
	prim_record_minimal_symbol_full.
	(prim_record_minimal_symbol_and_info): Move to minsyms.h; rename.
	* mdebugread.c (mdebug_build_psymtabs, parse_partial_symbols)
	(record_minimal_symbol): Add "reader" argument.  Update.
	(elfmdebug_build_psymtabs): Update.
	* machoread.c (macho_symtab_add_minsym, macho_symtab_read): Add
	"reader" argument.  Update.
	(macho_symfile_read): Update.
	* elfread.c (record_minimal_symbol, elf_symtab_read)
	(elf_rel_plt_read): Add "reader" argument.  Update.
	(elf_read_minimal_symbols): Update.
	* dbxread.c (record_minimal_symbol, read_dbx_dynamic_symtab)
	(read_dbx_symtab): Add "reader" argument.  Update.
	(dbx_symfile_read): Update.
	* coffread.c (record_minimal_symbol, coff_symtab_read): Add
	"reader" argument.  Update.
	(coff_symfile_read): Update.
	* coff-pe-read.h (read_pe_exported_syms): Add "reader" argument.
	* coff-pe-read.c (add_pe_exported_sym, add_pe_forwarded_sym)
	(read_pe_exported_syms): Add "reader" argument.  Update.
This commit is contained in:
Tom Tromey 2016-09-22 14:25:08 -06:00
parent d25e871993
commit 8dddcb8f00
13 changed files with 274 additions and 235 deletions

View File

@ -1,3 +1,43 @@
2016-10-21 Tom Tromey <tom@tromey.com>
* xcoffread.c (record_minimal_symbol, scan_xcoff_symtab): Add
"reader" argument. Update.
(xcoff_initial_scan): Update.
* symfile.h (mdebug_build_psymtabs): Add "reader" argument.
* mipsread.c (mipscoff_symfile_read): Update.
(read_alphacoff_dynamic_symtab): Add "reader" argument. Update.
* minsyms.h (minimal_symbol_reader) <record, record_full>:
Declare.
<m_msym_bunch, m_msym_bunch_index, m_msym_count>: New members.
<record_with_info>: New function, renamed from
prim_record_minimal_symbol_and_info.
* minsyms.c (msym_bunch, msym_bunch_index, msym_count): Remove
globals.
(minimal_symbol_reader): Initialize new members.
(minimal_symbol_reader::record): Renamed from
prim_record_minimal_symbol.
(minimal_symbol_reader::record_full): Renamed from
prim_record_minimal_symbol_full.
(prim_record_minimal_symbol_and_info): Move to minsyms.h; rename.
* mdebugread.c (mdebug_build_psymtabs, parse_partial_symbols)
(record_minimal_symbol): Add "reader" argument. Update.
(elfmdebug_build_psymtabs): Update.
* machoread.c (macho_symtab_add_minsym, macho_symtab_read): Add
"reader" argument. Update.
(macho_symfile_read): Update.
* elfread.c (record_minimal_symbol, elf_symtab_read)
(elf_rel_plt_read): Add "reader" argument. Update.
(elf_read_minimal_symbols): Update.
* dbxread.c (record_minimal_symbol, read_dbx_dynamic_symtab)
(read_dbx_symtab): Add "reader" argument. Update.
(dbx_symfile_read): Update.
* coffread.c (record_minimal_symbol, coff_symtab_read): Add
"reader" argument. Update.
(coff_symfile_read): Update.
* coff-pe-read.h (read_pe_exported_syms): Add "reader" argument.
* coff-pe-read.c (add_pe_exported_sym, add_pe_forwarded_sym)
(read_pe_exported_syms): Add "reader" argument. Update.
2016-10-21 Tom Tromey <tom@tromey.com>
* xcoffread.c (xcoff_initial_scan): Update.

View File

@ -150,7 +150,8 @@ get_section_vmas (bfd *abfd, asection *sectp, void *context)
OBJFILE is the objfile struct of DLL_NAME. */
static void
add_pe_exported_sym (const char *sym_name,
add_pe_exported_sym (minimal_symbol_reader &reader,
const char *sym_name,
unsigned long func_rva,
int ordinal,
const struct read_pe_section_data *section_data,
@ -176,13 +177,12 @@ add_pe_exported_sym (const char *sym_name,
" for entry \"%s\" in dll \"%s\"\n"),
section_data->section_name, sym_name, dll_name);
prim_record_minimal_symbol_and_info (qualified_name, vma,
section_data->ms_type,
section_data->index, objfile);
reader.record_with_info (qualified_name, vma, section_data->ms_type,
section_data->index);
/* Enter the plain name as well, which might not be unique. */
prim_record_minimal_symbol_and_info (bare_name, vma, section_data->ms_type,
section_data->index, objfile);
reader.record_with_info (bare_name, vma, section_data->ms_type,
section_data->index);
if (debug_coff_pe_read > 1)
fprintf_unfiltered (gdb_stdlog, _("Adding exported symbol \"%s\""
" in dll \"%s\"\n"), sym_name, dll_name);
@ -200,7 +200,8 @@ add_pe_exported_sym (const char *sym_name,
OBJFILE is the objfile struct of DLL_NAME. */
static int
add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
add_pe_forwarded_sym (minimal_symbol_reader &reader,
const char *sym_name, const char *forward_dll_name,
const char *forward_func_name, int ordinal,
const char *dll_name, struct objfile *objfile)
{
@ -266,12 +267,10 @@ add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
code. */
baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
prim_record_minimal_symbol_and_info (qualified_name, vma - baseaddr,
msymtype, section, objfile);
reader.record_with_info (qualified_name, vma - baseaddr, msymtype, section);
/* Enter the plain name as well, which might not be unique. */
prim_record_minimal_symbol_and_info (bare_name, vma - baseaddr, msymtype,
section, objfile);
reader.record_with_info (bare_name, vma - baseaddr, msymtype, section);
xfree (qualified_name);
xfree (bare_name);
@ -331,7 +330,8 @@ pe_as32 (void *ptr)
pe_implied_import_dll in pe-dll.c. */
void
read_pe_exported_syms (struct objfile *objfile)
read_pe_exported_syms (minimal_symbol_reader &reader,
struct objfile *objfile)
{
bfd *dll = objfile->obfd;
unsigned long nbnormal, nbforward;
@ -580,7 +580,7 @@ read_pe_exported_syms (struct objfile *objfile)
forward_dll_name[len] = '\0';
forward_func_name = ++sep;
}
if (add_pe_forwarded_sym (funcname, forward_dll_name,
if (add_pe_forwarded_sym (reader, funcname, forward_dll_name,
forward_func_name, ordinal,
dll_name, objfile) != 0)
++nbforward;
@ -595,7 +595,7 @@ read_pe_exported_syms (struct objfile *objfile)
char *sym_name = (char *) (erva + name_rva);
section_found = 1;
add_pe_exported_sym (sym_name, func_rva, ordinal,
add_pe_exported_sym (reader, sym_name, func_rva, ordinal,
section_data + sectix, dll_name, objfile);
++nbnormal;
break;
@ -607,7 +607,7 @@ read_pe_exported_syms (struct objfile *objfile)
if (name_rva == 0)
{
add_pe_exported_sym (NULL, func_rva, ordinal,
add_pe_exported_sym (reader, NULL, func_rva, ordinal,
section_data, dll_name, objfile);
++nbnormal;
}

View File

@ -27,7 +27,8 @@ struct bfd;
/* Read the export table and convert it to minimal symbol table
entries */
extern void read_pe_exported_syms (struct objfile *objfile);
extern void read_pe_exported_syms (minimal_symbol_reader &reader,
struct objfile *objfile);
/* Extract from ABFD the offset of the .text section.
Returns default value 0x1000 if information is not found. */

View File

@ -207,7 +207,8 @@ static void read_one_sym (struct coff_symbol *,
struct internal_syment *,
union internal_auxent *);
static void coff_symtab_read (long, unsigned int, struct objfile *);
static void coff_symtab_read (minimal_symbol_reader &,
long, unsigned int, struct objfile *);
/* We are called once per section from coff_symfile_read. We
need to examine each section we are passed, check to see
@ -461,7 +462,8 @@ is_import_fixup_symbol (struct coff_symbol *cs,
}
static struct minimal_symbol *
record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
record_minimal_symbol (minimal_symbol_reader &reader,
struct coff_symbol *cs, CORE_ADDR address,
enum minimal_symbol_type type, int section,
struct objfile *objfile)
{
@ -479,8 +481,7 @@ record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
return NULL;
}
return prim_record_minimal_symbol_and_info (cs->c_name, address,
type, section, objfile);
return reader.record_with_info (cs->c_name, address, type, section);
}
/* coff_symfile_init ()
@ -650,7 +651,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
/* Now that the executable file is positioned at symbol table,
process it and define symbols accordingly. */
coff_symtab_read ((long) symtab_offset, num_symbols, objfile);
coff_symtab_read (reader, (long) symtab_offset, num_symbols, objfile);
/* Install any minimal symbols that have been collected as the
current minimal symbols for this objfile. */
@ -778,7 +779,8 @@ coff_symfile_finish (struct objfile *objfile)
We read them one at a time using read_one_sym (). */
static void
coff_symtab_read (long symtab_offset, unsigned int nsyms,
coff_symtab_read (minimal_symbol_reader &reader,
long symtab_offset, unsigned int nsyms,
struct objfile *objfile)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
@ -876,7 +878,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
int section = cs_to_section (cs, objfile);
tmpaddr = cs->c_value;
record_minimal_symbol (cs, tmpaddr, mst_text,
record_minimal_symbol (reader, cs, tmpaddr, mst_text,
section, objfile);
fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
@ -1036,7 +1038,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
ms_type = mst_unknown;
}
msym = record_minimal_symbol (cs, tmpaddr, ms_type,
msym = record_minimal_symbol (reader, cs, tmpaddr, ms_type,
sec, objfile);
if (msym)
gdbarch_coff_make_msymbol_special (gdbarch,
@ -1198,7 +1200,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
{
/* We've got no debugging symbols, but it's a portable
executable, so try to read the export table. */
read_pe_exported_syms (objfile);
read_pe_exported_syms (reader, objfile);
}
if (get_last_source_file ())

View File

@ -262,9 +262,10 @@ static void dbx_read_symtab (struct partial_symtab *self,
static void dbx_psymtab_to_symtab_1 (struct objfile *, struct partial_symtab *);
static void read_dbx_dynamic_symtab (struct objfile *objfile);
static void read_dbx_dynamic_symtab (minimal_symbol_reader &reader,
struct objfile *objfile);
static void read_dbx_symtab (struct objfile *);
static void read_dbx_symtab (minimal_symbol_reader &, struct objfile *);
static void free_bincl_list (struct objfile *);
@ -286,7 +287,8 @@ static void dbx_symfile_read (struct objfile *, int);
static void dbx_symfile_finish (struct objfile *);
static void record_minimal_symbol (const char *, CORE_ADDR, int,
static void record_minimal_symbol (minimal_symbol_reader &,
const char *, CORE_ADDR, int,
struct objfile *);
static void add_new_header_file (char *, int);
@ -429,7 +431,8 @@ explicit_lookup_type (int real_filenum, int index)
#endif
static void
record_minimal_symbol (const char *name, CORE_ADDR address, int type,
record_minimal_symbol (minimal_symbol_reader &reader,
const char *name, CORE_ADDR address, int type,
struct objfile *objfile)
{
enum minimal_symbol_type ms_type;
@ -508,8 +511,7 @@ record_minimal_symbol (const char *name, CORE_ADDR address, int type,
&& address < lowest_text_address)
lowest_text_address = address;
prim_record_minimal_symbol_and_info
(name, address, ms_type, section, objfile);
reader.record_with_info (name, address, ms_type, section);
}
/* Scan and build partial symbols for a symbol file.
@ -562,11 +564,11 @@ dbx_symfile_read (struct objfile *objfile, int symfile_flags)
/* Read stabs data from executable file and define symbols. */
read_dbx_symtab (objfile);
read_dbx_symtab (reader, objfile);
/* Add the dynamic symbols. */
read_dbx_dynamic_symtab (objfile);
read_dbx_dynamic_symtab (reader, objfile);
/* Install any minimal symbols that have been collected as the current
minimal symbols for this objfile. */
@ -978,7 +980,8 @@ set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
add them to the minimal symbol table. */
static void
read_dbx_dynamic_symtab (struct objfile *objfile)
read_dbx_dynamic_symtab (minimal_symbol_reader &reader,
struct objfile *objfile)
{
bfd *abfd = objfile->obfd;
struct cleanup *back_to;
@ -1052,7 +1055,7 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
if (sym->flags & BSF_GLOBAL)
type |= N_EXT;
record_minimal_symbol (bfd_asymbol_name (sym), sym_value,
record_minimal_symbol (reader, bfd_asymbol_name (sym), sym_value,
type, objfile);
}
}
@ -1105,8 +1108,7 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
}
name = bfd_asymbol_name (*rel->sym_ptr_ptr);
prim_record_minimal_symbol (name, address, mst_solib_trampoline,
objfile);
reader.record (name, address, mst_solib_trampoline);
}
do_cleanups (back_to);
@ -1169,7 +1171,7 @@ function_outside_compilation_unit_complaint (const char *arg1)
debugging information is available. */
static void
read_dbx_symtab (struct objfile *objfile)
read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
struct external_nlist *bufp = 0; /* =0 avoids gcc -Wall glitch. */
@ -1325,7 +1327,7 @@ read_dbx_symtab (struct objfile *objfile)
record_it:
namestring = set_namestring (objfile, &nlist);
record_minimal_symbol (namestring, nlist.n_value,
record_minimal_symbol (reader, namestring, nlist.n_value,
nlist.n_type, objfile); /* Always */
continue;

View File

@ -191,7 +191,8 @@ elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip)
}
static struct minimal_symbol *
record_minimal_symbol (const char *name, int name_len, int copy_name,
record_minimal_symbol (minimal_symbol_reader &reader,
const char *name, int name_len, int copy_name,
CORE_ADDR address,
enum minimal_symbol_type ms_type,
asection *bfd_section, struct objfile *objfile)
@ -202,11 +203,10 @@ record_minimal_symbol (const char *name, int name_len, int copy_name,
|| ms_type == mst_text_gnu_ifunc)
address = gdbarch_addr_bits_remove (gdbarch, address);
return prim_record_minimal_symbol_full (name, name_len, copy_name, address,
ms_type,
gdb_bfd_section_index (objfile->obfd,
bfd_section),
objfile);
return reader.record_full (name, name_len, copy_name, address,
ms_type,
gdb_bfd_section_index (objfile->obfd,
bfd_section));
}
/* Read the symbol table of an ELF file.
@ -226,7 +226,8 @@ record_minimal_symbol (const char *name, int name_len, int copy_name,
#define ST_SYNTHETIC 2
static void
elf_symtab_read (struct objfile *objfile, int type,
elf_symtab_read (minimal_symbol_reader &reader,
struct objfile *objfile, int type,
long number_of_symbols, asymbol **symbol_table,
int copy_names)
{
@ -318,7 +319,7 @@ elf_symtab_read (struct objfile *objfile, int type,
continue;
msym = record_minimal_symbol
(sym->name, strlen (sym->name), copy_names,
(reader, sym->name, strlen (sym->name), copy_names,
symaddr, mst_solib_trampoline, sect, objfile);
if (msym != NULL)
{
@ -458,7 +459,7 @@ elf_symtab_read (struct objfile *objfile, int type,
continue; /* Skip this symbol. */
}
msym = record_minimal_symbol
(sym->name, strlen (sym->name), copy_names, symaddr,
(reader, sym->name, strlen (sym->name), copy_names, symaddr,
ms_type, sym->section, objfile);
if (msym)
@ -487,7 +488,7 @@ elf_symtab_read (struct objfile *objfile, int type,
{
int len = atsign - sym->name;
record_minimal_symbol (sym->name, len, 1, symaddr,
record_minimal_symbol (reader, sym->name, len, 1, symaddr,
ms_type, sym->section, objfile);
}
}
@ -504,7 +505,7 @@ elf_symtab_read (struct objfile *objfile, int type,
{
struct minimal_symbol *mtramp;
mtramp = record_minimal_symbol (sym->name, len - 4, 1,
mtramp = record_minimal_symbol (reader, sym->name, len - 4, 1,
symaddr,
mst_solib_trampoline,
sym->section, objfile);
@ -531,7 +532,8 @@ elf_symtab_read (struct objfile *objfile, int type,
DYN_SYMBOL_TABLE is no longer easily available for OBJFILE. */
static void
elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table)
elf_rel_plt_read (minimal_symbol_reader &reader,
struct objfile *objfile, asymbol **dyn_symbol_table)
{
bfd *obfd = objfile->obfd;
const struct elf_backend_data *bed = get_elf_backend_data (obfd);
@ -608,7 +610,8 @@ elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table)
memcpy (&string_buffer[name_len], SYMBOL_GOT_PLT_SUFFIX,
got_suffix_len + 1);
msym = record_minimal_symbol (string_buffer, name_len + got_suffix_len,
msym = record_minimal_symbol (reader, string_buffer,
name_len + got_suffix_len,
1, address, mst_slot_got_plt, got_plt,
objfile);
if (msym)
@ -1077,7 +1080,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table, 0);
elf_symtab_read (reader, objfile, ST_REGULAR, symcount, symbol_table, 0);
}
/* Add the dynamic symbols. */
@ -1102,9 +1105,10 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table, 0);
elf_symtab_read (reader, objfile, ST_DYNAMIC, dynsymcount,
dyn_symbol_table, 0);
elf_rel_plt_read (objfile, dyn_symbol_table);
elf_rel_plt_read (reader, objfile, dyn_symbol_table);
}
/* Contrary to binutils --strip-debug/--only-keep-debug the strip command from
@ -1139,7 +1143,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
for (i = 0; i < synthcount; i++)
synth_symbol_table[i] = synthsyms + i;
make_cleanup (xfree, synth_symbol_table);
elf_symtab_read (objfile, ST_SYNTHETIC, synthcount,
elf_symtab_read (reader, objfile, ST_SYNTHETIC, synthcount,
synth_symbol_table, 1);
}

View File

@ -97,7 +97,8 @@ macho_register_oso (VEC (oso_el) **oso_vector_ptr,
/* Add symbol SYM to the minimal symbol table of OBJFILE. */
static void
macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
macho_symtab_add_minsym (minimal_symbol_reader &reader,
struct objfile *objfile, const asymbol *sym)
{
if (sym->name == NULL || *sym->name == '\0')
{
@ -147,10 +148,9 @@ macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
else
return; /* Skip this symbol. */
prim_record_minimal_symbol_and_info
(sym->name, symaddr, ms_type,
gdb_bfd_section_index (objfile->obfd, sym->section),
objfile);
reader.record_with_info (sym->name, symaddr, ms_type,
gdb_bfd_section_index (objfile->obfd,
sym->section));
}
}
@ -158,7 +158,8 @@ macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
static void
macho_symtab_read (struct objfile *objfile,
macho_symtab_read (minimal_symbol_reader &reader,
struct objfile *objfile,
long number_of_symbols, asymbol **symbol_table,
VEC (oso_el) **oso_vector_ptr)
{
@ -227,7 +228,7 @@ macho_symtab_read (struct objfile *objfile,
else
{
/* Non-debugging symbols go to the minimal symbol table. */
macho_symtab_add_minsym (objfile, sym);
macho_symtab_add_minsym (reader, objfile, sym);
}
break;
@ -864,7 +865,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
macho_symtab_read (objfile, symcount, symbol_table, &oso_vector);
macho_symtab_read (reader, objfile, symcount, symbol_table,
&oso_vector);
reader.install ();
}

View File

@ -222,7 +222,8 @@ static int found_ecoff_debugging_info;
static int upgrade_type (int, struct type **, int, union aux_ext *,
int, char *);
static void parse_partial_symbols (struct objfile *);
static void parse_partial_symbols (minimal_symbol_reader &,
struct objfile *);
static int has_opaque_xref (FDR *, SYMR *);
@ -336,7 +337,8 @@ fdr_name (FDR *f)
different sections are relocated via the SECTION_OFFSETS. */
void
mdebug_build_psymtabs (struct objfile *objfile,
mdebug_build_psymtabs (minimal_symbol_reader &reader,
struct objfile *objfile,
const struct ecoff_debug_swap *swap,
struct ecoff_debug_info *info)
{
@ -367,7 +369,7 @@ mdebug_build_psymtabs (struct objfile *objfile,
(*swap->swap_fdr_in) (objfile->obfd, fdr_src, fdr_ptr);
}
parse_partial_symbols (objfile);
parse_partial_symbols (reader, objfile);
#if 0
/* Check to make sure file was compiled with -g. If not, warn the
@ -2260,7 +2262,8 @@ function_outside_compilation_unit_complaint (const char *arg1)
belongs to, and then records this new minimal symbol. */
static void
record_minimal_symbol (const char *name, const CORE_ADDR address,
record_minimal_symbol (minimal_symbol_reader &reader,
const char *name, const CORE_ADDR address,
enum minimal_symbol_type ms_type, int storage_class,
struct objfile *objfile)
{
@ -2316,15 +2319,15 @@ record_minimal_symbol (const char *name, const CORE_ADDR address,
section = -1;
}
prim_record_minimal_symbol_and_info (name, address, ms_type,
section, objfile);
reader.record_with_info (name, address, ms_type, section);
}
/* Master parsing procedure for first-pass reading of file symbols
into a partial_symtab. */
static void
parse_partial_symbols (struct objfile *objfile)
parse_partial_symbols (minimal_symbol_reader &reader,
struct objfile *objfile)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
const bfd_size_type external_sym_size = debug_swap->external_sym_size;
@ -2624,7 +2627,7 @@ parse_partial_symbols (struct objfile *objfile)
unknown_ext_complaint (name);
}
if (!ECOFF_IN_ELF (cur_bfd))
record_minimal_symbol (name, svalue, ms_type, ext_in->asym.sc,
record_minimal_symbol (reader, name, svalue, ms_type, ext_in->asym.sc,
objfile);
}
@ -2741,7 +2744,7 @@ parse_partial_symbols (struct objfile *objfile)
if (sh.st == stStaticProc)
{
namestring = debug_info->ss + fh->issBase + sh.iss;
record_minimal_symbol (namestring, sh.value,
record_minimal_symbol (reader, namestring, sh.value,
mst_file_text, sh.sc,
objfile);
}
@ -2786,7 +2789,7 @@ parse_partial_symbols (struct objfile *objfile)
case scPData:
case scXData:
namestring = debug_info->ss + fh->issBase + sh.iss;
record_minimal_symbol (namestring, sh.value,
record_minimal_symbol (reader, namestring, sh.value,
mst_file_data, sh.sc,
objfile);
sh.value += ANOFFSET (objfile->section_offsets,
@ -2797,7 +2800,7 @@ parse_partial_symbols (struct objfile *objfile)
/* FIXME! Shouldn't this use cases for bss,
then have the default be abs? */
namestring = debug_info->ss + fh->issBase + sh.iss;
record_minimal_symbol (namestring, sh.value,
record_minimal_symbol (reader, namestring, sh.value,
mst_file_bss, sh.sc,
objfile);
sh.value += ANOFFSET (objfile->section_offsets,
@ -3467,10 +3470,9 @@ parse_partial_symbols (struct objfile *objfile)
int new_sdx;
case stStaticProc:
prim_record_minimal_symbol_and_info (name, minsym_value,
mst_file_text,
SECT_OFF_TEXT (objfile),
objfile);
reader.record_with_info (name, minsym_value,
mst_file_text,
SECT_OFF_TEXT (objfile));
/* FALLTHROUGH */
@ -3553,15 +3555,13 @@ parse_partial_symbols (struct objfile *objfile)
case stStatic: /* Variable */
if (SC_IS_DATA (sh.sc))
prim_record_minimal_symbol_and_info (name, minsym_value,
mst_file_data,
SECT_OFF_DATA (objfile),
objfile);
reader.record_with_info (name, minsym_value,
mst_file_data,
SECT_OFF_DATA (objfile));
else
prim_record_minimal_symbol_and_info (name, minsym_value,
mst_file_bss,
SECT_OFF_BSS (objfile),
objfile);
reader.record_with_info (name, minsym_value,
mst_file_bss,
SECT_OFF_BSS (objfile));
theclass = LOC_STATIC;
break;
@ -4885,7 +4885,7 @@ elfmdebug_build_psymtabs (struct objfile *objfile,
error (_("Error reading ECOFF debugging information: %s"),
bfd_errmsg (bfd_get_error ()));
mdebug_build_psymtabs (objfile, swap, info);
mdebug_build_psymtabs (reader, objfile, swap, info);
reader.install ();
}

View File

@ -64,19 +64,6 @@ struct msym_bunch
struct minimal_symbol contents[BUNCH_SIZE];
};
/* Bunch currently being filled up.
The next field points to chain of filled bunches. */
static struct msym_bunch *msym_bunch;
/* Number of slots filled in current bunch. */
static int msym_bunch_index;
/* Total number of minimal symbols recorded so far for the objfile. */
static int msym_count;
/* See minsyms.h. */
unsigned int
@ -922,14 +909,14 @@ get_symbol_leading_char (bfd *abfd)
/* See minsyms.h. */
minimal_symbol_reader::minimal_symbol_reader (struct objfile *obj)
: m_objfile (obj)
{
msym_count = 0;
msym_bunch = NULL;
/* Note that presetting msym_bunch_index to BUNCH_SIZE causes the
: m_objfile (obj),
m_msym_bunch (NULL),
/* Note that presetting m_msym_bunch_index to BUNCH_SIZE causes the
first call to save a minimal symbol to allocate the memory for
the first bunch. */
msym_bunch_index = BUNCH_SIZE;
m_msym_bunch_index (BUNCH_SIZE),
m_msym_count (0)
{
}
/* Discard the currently collected minimal symbols, if any. If we wish
@ -944,20 +931,19 @@ minimal_symbol_reader::~minimal_symbol_reader ()
{
struct msym_bunch *next;
while (msym_bunch != NULL)
while (m_msym_bunch != NULL)
{
next = msym_bunch->next;
xfree (msym_bunch);
msym_bunch = next;
next = m_msym_bunch->next;
xfree (m_msym_bunch);
m_msym_bunch = next;
}
}
/* See minsyms.h. */
void
prim_record_minimal_symbol (const char *name, CORE_ADDR address,
enum minimal_symbol_type ms_type,
struct objfile *objfile)
minimal_symbol_reader::record (const char *name, CORE_ADDR address,
enum minimal_symbol_type ms_type)
{
int section;
@ -967,32 +953,31 @@ prim_record_minimal_symbol (const char *name, CORE_ADDR address,
case mst_text_gnu_ifunc:
case mst_file_text:
case mst_solib_trampoline:
section = SECT_OFF_TEXT (objfile);
section = SECT_OFF_TEXT (m_objfile);
break;
case mst_data:
case mst_file_data:
section = SECT_OFF_DATA (objfile);
section = SECT_OFF_DATA (m_objfile);
break;
case mst_bss:
case mst_file_bss:
section = SECT_OFF_BSS (objfile);
section = SECT_OFF_BSS (m_objfile);
break;
default:
section = -1;
}
prim_record_minimal_symbol_and_info (name, address, ms_type,
section, objfile);
record_with_info (name, address, ms_type, section);
}
/* See minsyms.h. */
struct minimal_symbol *
prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
CORE_ADDR address,
enum minimal_symbol_type ms_type,
int section,
struct objfile *objfile)
minimal_symbol_reader::record_full (const char *name, int name_len,
int copy_name,
CORE_ADDR address,
enum minimal_symbol_type ms_type,
int section)
{
struct msym_bunch *newobj;
struct minimal_symbol *msymbol;
@ -1009,7 +994,7 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
/* It's safe to strip the leading char here once, since the name
is also stored stripped in the minimal symbol table. */
if (name[0] == get_symbol_leading_char (objfile->obfd))
if (name[0] == get_symbol_leading_char (m_objfile->obfd))
{
++name;
--name_len;
@ -1018,17 +1003,17 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
if (ms_type == mst_file_text && startswith (name, "__gnu_compiled"))
return (NULL);
if (msym_bunch_index == BUNCH_SIZE)
if (m_msym_bunch_index == BUNCH_SIZE)
{
newobj = XCNEW (struct msym_bunch);
msym_bunch_index = 0;
newobj->next = msym_bunch;
msym_bunch = newobj;
m_msym_bunch_index = 0;
newobj->next = m_msym_bunch;
m_msym_bunch = newobj;
}
msymbol = &msym_bunch->contents[msym_bunch_index];
msymbol = &m_msym_bunch->contents[m_msym_bunch_index];
MSYMBOL_SET_LANGUAGE (msymbol, language_auto,
&objfile->per_bfd->storage_obstack);
MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
&m_objfile->per_bfd->storage_obstack);
MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, m_objfile);
SET_MSYMBOL_VALUE_ADDRESS (msymbol, address);
MSYMBOL_SECTION (msymbol) = section;
@ -1047,28 +1032,15 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
/* If we already read minimal symbols for this objfile, then don't
ever allocate a new one. */
if (!objfile->per_bfd->minsyms_read)
if (!m_objfile->per_bfd->minsyms_read)
{
msym_bunch_index++;
objfile->per_bfd->n_minsyms++;
m_msym_bunch_index++;
m_objfile->per_bfd->n_minsyms++;
}
msym_count++;
m_msym_count++;
return msymbol;
}
/* See minsyms.h. */
struct minimal_symbol *
prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
enum minimal_symbol_type ms_type,
int section,
struct objfile *objfile)
{
return prim_record_minimal_symbol_full (name, strlen (name), 1,
address, ms_type,
section, objfile);
}
/* Compare two minimal symbols by address and return a signed result based
on unsigned comparisons, so that we sort into unsigned numeric order.
Within groups with the same address, sort by name. */
@ -1244,13 +1216,13 @@ minimal_symbol_reader::install ()
if (m_objfile->per_bfd->minsyms_read)
return;
if (msym_count > 0)
if (m_msym_count > 0)
{
if (symtab_create_debug)
{
fprintf_unfiltered (gdb_stdlog,
"Installing %d minimal symbols of objfile %s.\n",
msym_count, objfile_name (m_objfile));
m_msym_count, objfile_name (m_objfile));
}
/* Allocate enough space in the obstack, into which we will gather the
@ -1258,7 +1230,7 @@ minimal_symbol_reader::install ()
compact out the duplicate entries. Once we have a final table,
we will give back the excess space. */
alloc_count = msym_count + m_objfile->per_bfd->minimal_symbol_count + 1;
alloc_count = m_msym_count + m_objfile->per_bfd->minimal_symbol_count + 1;
obstack_blank (&m_objfile->per_bfd->storage_obstack,
alloc_count * sizeof (struct minimal_symbol));
msymbols = (struct minimal_symbol *)
@ -1278,11 +1250,11 @@ minimal_symbol_reader::install ()
mcount = m_objfile->per_bfd->minimal_symbol_count;
for (bunch = msym_bunch; bunch != NULL; bunch = bunch->next)
for (bunch = m_msym_bunch; bunch != NULL; bunch = bunch->next)
{
for (bindex = 0; bindex < msym_bunch_index; bindex++, mcount++)
for (bindex = 0; bindex < m_msym_bunch_index; bindex++, mcount++)
msymbols[mcount] = bunch->contents[bindex];
msym_bunch_index = BUNCH_SIZE;
m_msym_bunch_index = BUNCH_SIZE;
}
/* Sort the minimal symbols by address. */

View File

@ -53,16 +53,17 @@ struct bound_minimal_symbol
as opaque and use functions provided by minsyms.c to inspect them.
*/
struct msym_bunch;
/* An RAII-based object that is used to record minimal symbols while
they are being read. */
class minimal_symbol_reader
{
public:
/* Prepare to start collecting minimal symbols. This should be called
by a symbol reader to initialize the minimal symbol module.
Currently, minimal symbol table creation is not reentrant; it
relies on global (static) variables in minsyms.c. */
/* Prepare to start collecting minimal symbols. This should be
called by a symbol reader to initialize the minimal symbol
module. */
explicit minimal_symbol_reader (struct objfile *);
@ -73,6 +74,56 @@ class minimal_symbol_reader
void install ();
/* Record a new minimal symbol. This is the "full" entry point;
simpler convenience entry points are also provided below.
This returns a new minimal symbol. It is ok to modify the returned
minimal symbol (though generally not necessary). It is not ok,
though, to stash the pointer anywhere; as minimal symbols may be
moved after creation. The memory for the returned minimal symbol
is still owned by the minsyms.c code, and should not be freed.
Arguments are:
NAME - the symbol's name
NAME_LEN - the length of the name
COPY_NAME - if true, the minsym code must make a copy of NAME. If
false, then NAME must be NUL-terminated, and must have a lifetime
that is at least as long as OBJFILE's lifetime.
ADDRESS - the address of the symbol
MS_TYPE - the type of the symbol
SECTION - the symbol's section
appropriate obj_section for the minimal symbol. This can be NULL.
OBJFILE - the objfile associated with the minimal symbol. */
struct minimal_symbol *record_full (const char *name,
int name_len,
int copy_name,
CORE_ADDR address,
enum minimal_symbol_type ms_type,
int section);
/* Like record_full, but:
- uses strlen to compute NAME_LEN,
- passes COPY_NAME = 1,
- and passes a default SECTION, depending on the type
This variant does not return the new symbol. */
void record (const char *, CORE_ADDR, enum minimal_symbol_type);
/* Like record_full, but:
- uses strlen to compute NAME_LEN,
- passes COPY_NAME = 1. */
struct minimal_symbol *record_with_info (const char *name,
CORE_ADDR address,
enum minimal_symbol_type ms_type,
int section)
{
return record_full (name, strlen (name), 1, address, ms_type, section);
}
private:
/* No need for these. They are intentionally not defined anywhere. */
@ -81,61 +132,22 @@ class minimal_symbol_reader
minimal_symbol_reader (const minimal_symbol_reader &);
struct objfile *m_objfile;
/* Bunch currently being filled up.
The next field points to chain of filled bunches. */
struct msym_bunch *m_msym_bunch;
/* Number of slots filled in current bunch. */
int m_msym_bunch_index;
/* Total number of minimal symbols recorded so far for the
objfile. */
int m_msym_count;
};
/* Record a new minimal symbol. This is the "full" entry point;
simpler convenience entry points are also provided below.
This returns a new minimal symbol. It is ok to modify the returned
minimal symbol (though generally not necessary). It is not ok,
though, to stash the pointer anywhere; as minimal symbols may be
moved after creation. The memory for the returned minimal symbol
is still owned by the minsyms.c code, and should not be freed.
Arguments are:
NAME - the symbol's name
NAME_LEN - the length of the name
COPY_NAME - if true, the minsym code must make a copy of NAME. If
false, then NAME must be NUL-terminated, and must have a lifetime
that is at least as long as OBJFILE's lifetime.
ADDRESS - the address of the symbol
MS_TYPE - the type of the symbol
SECTION - the symbol's section
appropriate obj_section for the minimal symbol. This can be NULL.
OBJFILE - the objfile associated with the minimal symbol. */
struct minimal_symbol *prim_record_minimal_symbol_full
(const char *name,
int name_len,
int copy_name,
CORE_ADDR address,
enum minimal_symbol_type ms_type,
int section,
struct objfile *objfile);
/* Like prim_record_minimal_symbol_full, but:
- uses strlen to compute NAME_LEN,
- passes COPY_NAME = 1,
- and passes a default SECTION, depending on the type
This variant does not return the new symbol. */
void prim_record_minimal_symbol (const char *, CORE_ADDR,
enum minimal_symbol_type,
struct objfile *);
/* Like prim_record_minimal_symbol_full, but:
- uses strlen to compute NAME_LEN,
- passes COPY_NAME = 1. */
struct minimal_symbol *prim_record_minimal_symbol_and_info
(const char *,
CORE_ADDR,
enum minimal_symbol_type,
int section,
struct objfile *);
/* Create the terminating entry of OBJFILE's minimal symbol table.
If OBJFILE->msymbols is zero, allocate a single entry from
OBJFILE->objfile_obstack; otherwise, just initialize

View File

@ -42,7 +42,8 @@
#include "psymtab.h"
static void
read_alphacoff_dynamic_symtab (struct section_offsets *,
read_alphacoff_dynamic_symtab (minimal_symbol_reader &,
struct section_offsets *,
struct objfile *objfile);
/* Initialize anything that needs initializing when a completely new
@ -79,12 +80,12 @@ mipscoff_symfile_read (struct objfile *objfile, int symfile_flags)
(abfd, (asection *) NULL, &ecoff_data (abfd)->debug_info)))
error (_("Error reading symbol table: %s"), bfd_errmsg (bfd_get_error ()));
mdebug_build_psymtabs (objfile, &ecoff_backend (abfd)->debug_swap,
mdebug_build_psymtabs (reader, objfile, &ecoff_backend (abfd)->debug_swap,
&ecoff_data (abfd)->debug_info);
/* Add alpha coff dynamic symbols. */
read_alphacoff_dynamic_symtab (objfile->section_offsets, objfile);
read_alphacoff_dynamic_symtab (reader, objfile->section_offsets, objfile);
/* Install any minimal symbols that have been collected as the current
minimal symbols for this objfile. */
@ -173,7 +174,8 @@ alphacoff_locate_sections (bfd *ignore_abfd, asection *sectp, void *sip)
them to the minimal symbol table. */
static void
read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
struct section_offsets *section_offsets,
struct objfile *objfile)
{
bfd *abfd = objfile->obfd;
@ -388,7 +390,7 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
}
}
prim_record_minimal_symbol (name, sym_value, ms_type, objfile);
reader.record (name, sym_value, ms_type);
}
do_cleanups (cleanups);

View File

@ -652,7 +652,8 @@ void dwarf2_free_objfile (struct objfile *);
/* From mdebugread.c */
extern void mdebug_build_psymtabs (struct objfile *,
extern void mdebug_build_psymtabs (minimal_symbol_reader &,
struct objfile *,
const struct ecoff_debug_swap *,
struct ecoff_debug_info *);

View File

@ -197,7 +197,8 @@ eb_complaint (int arg1)
static void xcoff_initial_scan (struct objfile *, int);
static void scan_xcoff_symtab (struct objfile *);
static void scan_xcoff_symtab (minimal_symbol_reader &,
struct objfile *);
static char *xcoff_next_symbol_text (struct objfile *);
@ -908,10 +909,10 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
This function can read past the end of the symbol table
(into the string table) but this does no harm. */
/* Create a new minimal symbol (using prim_record_minimal_symbol_and_info).
/* Create a new minimal symbol (using record_with_info).
Creation of all new minimal symbols should go through this function
rather than calling the various prim_record_[...] functions in order
rather than calling the various record functions in order
to make sure that all symbol addresses get properly relocated.
Arguments are:
@ -925,18 +926,17 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
OBJFILE - the objfile associated with the minimal symbol. */
static void
record_minimal_symbol (const char *name, CORE_ADDR address,
record_minimal_symbol (minimal_symbol_reader &reader,
const char *name, CORE_ADDR address,
enum minimal_symbol_type ms_type,
int n_scnum,
struct objfile *objfile)
{
if (name[0] == '.')
++name;
prim_record_minimal_symbol_and_info (name, address, ms_type,
secnum_to_section (n_scnum, objfile),
objfile);
reader.record_with_info (name, address, ms_type,
secnum_to_section (n_scnum, objfile));
}
/* xcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
@ -2178,7 +2178,8 @@ function_outside_compilation_unit_complaint (const char *arg1)
}
static void
scan_xcoff_symtab (struct objfile *objfile)
scan_xcoff_symtab (minimal_symbol_reader &reader,
struct objfile *objfile)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
CORE_ADDR toc_offset = 0; /* toc offset value in data section. */
@ -2288,7 +2289,7 @@ scan_xcoff_symtab (struct objfile *objfile)
if (!misc_func_recorded)
{
record_minimal_symbol
(last_csect_name, last_csect_val,
(reader, last_csect_name, last_csect_val,
mst_text, last_csect_sec, objfile);
misc_func_recorded = 1;
}
@ -2343,7 +2344,7 @@ scan_xcoff_symtab (struct objfile *objfile)
table, except for section symbols. */
if (*namestring != '.')
record_minimal_symbol
(namestring, symbol.n_value,
(reader, namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_data : mst_data,
symbol.n_scnum, objfile);
break;
@ -2381,7 +2382,7 @@ scan_xcoff_symtab (struct objfile *objfile)
main_aux[0].x_sym.x_fcnary.x_fcn.x_lnnoptr;
record_minimal_symbol
(namestring, symbol.n_value,
(reader, namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_text : mst_text,
symbol.n_scnum, objfile);
misc_func_recorded = 1;
@ -2396,7 +2397,7 @@ scan_xcoff_symtab (struct objfile *objfile)
symbols, we will choose mst_text over
mst_solib_trampoline. */
record_minimal_symbol
(namestring, symbol.n_value,
(reader, namestring, symbol.n_value,
mst_solib_trampoline, symbol.n_scnum, objfile);
misc_func_recorded = 1;
break;
@ -2418,7 +2419,7 @@ scan_xcoff_symtab (struct objfile *objfile)
XMC_BS might be possible too. */
if (*namestring != '.')
record_minimal_symbol
(namestring, symbol.n_value,
(reader, namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_data : mst_data,
symbol.n_scnum, objfile);
break;
@ -2434,7 +2435,7 @@ scan_xcoff_symtab (struct objfile *objfile)
table, except for section symbols. */
if (*namestring != '.')
record_minimal_symbol
(namestring, symbol.n_value,
(reader, namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_bss : mst_bss,
symbol.n_scnum, objfile);
break;
@ -2462,7 +2463,7 @@ scan_xcoff_symtab (struct objfile *objfile)
it as a function. This will take care of functions like
strcmp() compiled by xlc. */
record_minimal_symbol (last_csect_name, last_csect_val,
record_minimal_symbol (reader, last_csect_name, last_csect_val,
mst_text, last_csect_sec, objfile);
misc_func_recorded = 1;
}
@ -3011,7 +3012,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
/* Now that the symbol table data of the executable file are all in core,
process them and define symbols accordingly. */
scan_xcoff_symtab (objfile);
scan_xcoff_symtab (reader, objfile);
/* Install any minimal symbols that have been collected as the current
minimal symbols for this objfile. */