From patchwork Tue Sep 27 04:08:36 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 16058 Received: (qmail 99403 invoked by alias); 27 Sep 2016 04:48:47 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 99291 invoked by uid 89); 27 Sep 2016 04:48:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.0 required=5.0 tests=AWL, BAYES_00, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS, T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.2 spammy=UD:st, contrary, SECTION, 8767 X-HELO: gproxy4-pub.mail.unifiedlayer.com Received: from gproxy4-pub.mail.unifiedlayer.com (HELO gproxy4-pub.mail.unifiedlayer.com) (69.89.23.142) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Tue, 27 Sep 2016 04:48:36 +0000 Received: (qmail 10883 invoked by uid 0); 27 Sep 2016 04:48:34 -0000 Received: from unknown (HELO cmgw4) (10.0.90.85) by gproxy4.mail.unifiedlayer.com with SMTP; 27 Sep 2016 04:48:34 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by cmgw4 with id oUoX1t00B2f2jeq01UoaVF; Mon, 26 Sep 2016 22:48:34 -0600 X-Authority-Analysis: v=2.1 cv=Hq7lRSjS c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=GW1xBdLrtEIA:10 a=zstS-IiYAAAA:8 a=IwY2e0teMEqdTifLst8A:9 a=QrcoANaSVKZShoNG:21 a=tIauZ5xUE6eh9IPE:21 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 71-218-192-86.hlrn.qwest.net ([71.218.192.86]:56110 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1bojhS-0006Nj-50; Mon, 26 Sep 2016 22:08:58 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 08/22] Record minimal symbols directly in reader. Date: Mon, 26 Sep 2016 22:08:36 -0600 Message-Id: <1474949330-4307-9-git-send-email-tom@tromey.com> In-Reply-To: <1474949330-4307-1-git-send-email-tom@tromey.com> References: <1474949330-4307-1-git-send-email-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1bojhS-0006Nj-50 X-Source-Sender: 71-218-192-86.hlrn.qwest.net (bapiya.Home) [71.218.192.86]:56110 X-Source-Auth: tom+tromey.com X-Email-Count: 23 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== This patch changes minimal symbol creation in two ways. First, it removes global variables in favor of members of scoped_minimal_symbol_reader. Second, it changes functions like prim_record_minimal_symbol to be member functions of scoped_minimal_symbol_reader. 2016-09-26 Tom Tromey * 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 (scoped_minimal_symbol_reader) : Declare. : New members. : New function, renamed from prim_record_minimal_symbol_and_info. * minsyms.c (msym_bunch, msym_bunch_index, msym_count): Remove globals. (scoped_minimal_symbol_reader): Initialize new members. (scoped_minimal_symbol_reader::record): Renamed from prim_record_minimal_symbol. (scoped_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. --- gdb/ChangeLog | 40 ++++++++++++++++++ gdb/coff-pe-read.c | 30 +++++++------- gdb/coff-pe-read.h | 3 +- gdb/coffread.c | 20 +++++---- gdb/dbxread.c | 30 +++++++------- gdb/elfread.c | 38 +++++++++-------- gdb/machoread.c | 18 ++++---- gdb/mdebugread.c | 48 ++++++++++----------- gdb/minsyms.c | 54 ++++++------------------ gdb/minsyms.h | 120 +++++++++++++++++++++++++++++------------------------ gdb/mipsread.c | 12 +++--- gdb/symfile.h | 3 +- gdb/xcoffread.c | 35 ++++++++-------- 13 files changed, 245 insertions(+), 206 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dac71f3..717408f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,45 @@ 2016-09-26 Tom Tromey + * 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 (scoped_minimal_symbol_reader) : + Declare. + : New members. + : New function, renamed from + prim_record_minimal_symbol_and_info. + * minsyms.c (msym_bunch, msym_bunch_index, msym_count): Remove + globals. + (scoped_minimal_symbol_reader): Initialize new members. + (scoped_minimal_symbol_reader::record): Renamed from + prim_record_minimal_symbol. + (scoped_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-09-26 Tom Tromey + * xcoffread.c (xcoff_initial_scan): Update. * mipsread.c (mipscoff_symfile_read): Update. * minsyms.c (scoped_minimal_symbol_reader): Add obj argument. diff --git a/gdb/coff-pe-read.c b/gdb/coff-pe-read.c index 8836361..d0fa4a8 100644 --- a/gdb/coff-pe-read.c +++ b/gdb/coff-pe-read.c @@ -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 (scoped_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 (scoped_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 (scoped_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; } diff --git a/gdb/coff-pe-read.h b/gdb/coff-pe-read.h index 8a74a60..9f29a3d 100644 --- a/gdb/coff-pe-read.h +++ b/gdb/coff-pe-read.h @@ -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 (scoped_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. */ diff --git a/gdb/coffread.c b/gdb/coffread.c index a86f223..8f8fe4b 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -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 (scoped_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 (scoped_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 (scoped_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 ()) diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 59c809a..2a666c3 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -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 (scoped_minimal_symbol_reader &reader, + struct objfile *objfile); -static void read_dbx_symtab (struct objfile *); +static void read_dbx_symtab (scoped_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 (scoped_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 (scoped_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 (scoped_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 (scoped_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; diff --git a/gdb/elfread.c b/gdb/elfread.c index 98574ca..09ac507 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -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 (scoped_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 (scoped_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 (scoped_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); } diff --git a/gdb/machoread.c b/gdb/machoread.c index 0eb438a..df0333a 100644 --- a/gdb/machoread.c +++ b/gdb/machoread.c @@ -96,7 +96,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 (scoped_minimal_symbol_reader &reader, + struct objfile *objfile, const asymbol *sym) { if (sym->name == NULL || *sym->name == '\0') { @@ -146,10 +147,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)); } } @@ -157,7 +157,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 (scoped_minimal_symbol_reader &reader, + struct objfile *objfile, long number_of_symbols, asymbol **symbol_table, VEC (oso_el) **oso_vector_ptr) { @@ -226,7 +227,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; @@ -870,7 +871,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 (); } diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index b93024b..c2bdd6f 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -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 (scoped_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 (scoped_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 (scoped_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 (scoped_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 (); } diff --git a/gdb/minsyms.c b/gdb/minsyms.c index b6f306b..8fa5bba 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -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. */ scoped_minimal_symbol_reader::scoped_minimal_symbol_reader (struct objfile *obj) -: objfile (obj) -{ - msym_count = 0; - msym_bunch = NULL; +: objfile (obj), + msym_bunch (NULL), /* Note that presetting 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; + msym_bunch_index (BUNCH_SIZE), + msym_count (0) +{ } /* Discard the currently collected minimal symbols, if any. If we wish @@ -955,9 +942,8 @@ scoped_minimal_symbol_reader::~scoped_minimal_symbol_reader () /* See minsyms.h. */ void -prim_record_minimal_symbol (const char *name, CORE_ADDR address, - enum minimal_symbol_type ms_type, - struct objfile *objfile) +scoped_minimal_symbol_reader::record (const char *name, CORE_ADDR address, + enum minimal_symbol_type ms_type) { int section; @@ -981,18 +967,17 @@ prim_record_minimal_symbol (const char *name, CORE_ADDR address, 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) +scoped_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; @@ -1056,19 +1041,6 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name, 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. */ diff --git a/gdb/minsyms.h b/gdb/minsyms.h index 7ba5991..af75267 100644 --- a/gdb/minsyms.h +++ b/gdb/minsyms.h @@ -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 scoped_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 scoped_minimal_symbol_reader (struct objfile *); @@ -73,6 +74,56 @@ class scoped_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,60 +132,21 @@ class scoped_minimal_symbol_reader scoped_minimal_symbol_reader (const scoped_minimal_symbol_reader &); struct objfile *objfile; -}; -/* 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. */ + /* Bunch currently being filled up. + The next field points to chain of filled bunches. */ -void prim_record_minimal_symbol (const char *, CORE_ADDR, - enum minimal_symbol_type, - struct objfile *); + struct msym_bunch *msym_bunch; -/* Like prim_record_minimal_symbol_full, but: - - uses strlen to compute NAME_LEN, - - passes COPY_NAME = 1. */ + /* Number of slots filled in current bunch. */ -struct minimal_symbol *prim_record_minimal_symbol_and_info - (const char *, - CORE_ADDR, - enum minimal_symbol_type, - int section, - struct objfile *); + int msym_bunch_index; + + /* Total number of minimal symbols recorded so far for the + objfile. */ + + int msym_count; +}; /* Create the terminating entry of OBJFILE's minimal symbol table. If OBJFILE->msymbols is zero, allocate a single entry from diff --git a/gdb/mipsread.c b/gdb/mipsread.c index e5285d2..ae59747 100644 --- a/gdb/mipsread.c +++ b/gdb/mipsread.c @@ -42,7 +42,8 @@ #include "psymtab.h" static void -read_alphacoff_dynamic_symtab (struct section_offsets *, +read_alphacoff_dynamic_symtab (scoped_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 (scoped_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); diff --git a/gdb/symfile.h b/gdb/symfile.h index a11c48a..aad9d88 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -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 (scoped_minimal_symbol_reader &, + struct objfile *, const struct ecoff_debug_swap *, struct ecoff_debug_info *); diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 6545e94..de18d7f 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -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 (scoped_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 (scoped_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 (scoped_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. */