diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 45 | ||||
-rw-r--r-- | gdb/ctfread.c | 29 | ||||
-rw-r--r-- | gdb/dbxread.c | 83 | ||||
-rw-r--r-- | gdb/dwarf2/index-write.c | 72 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 5 | ||||
-rw-r--r-- | gdb/mdebugread.c | 157 | ||||
-rw-r--r-- | gdb/psympriv.h | 107 | ||||
-rw-r--r-- | gdb/psymtab.c | 243 | ||||
-rw-r--r-- | gdb/psymtab.h | 12 | ||||
-rw-r--r-- | gdb/xcoffread.c | 107 |
10 files changed, 392 insertions, 468 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fc4b716..419b716 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,50 @@ 2020-10-17 Tom Tromey <tom@tromey.com> + * xcoffread.c (xcoff_end_psymtab): Use partial_symtab::empty. + (scan_xcoff_symtab): Update. + * psymtab.h (class psymtab_storage) <global_psymbols, + static_psymbols, current_global_psymbols, + current_static_psymbols>: Remove. + * psymtab.c (require_partial_symbols, find_pc_sect_psymbol) + (match_partial_symbol, lookup_partial_symbol): Update. + (print_partial_symbols): Change parameters. + (dump_psymtab, recursively_search_psymtabs) + (psym_fill_psymbol_map, psym_find_compunit_symtab_by_address) + (sort_pst_symbols, partial_symtab::partial_symtab): Update. + (concat): Remove. + (end_psymtab_common): Simplify. + (append_psymbol_to_list): Change parameters. + (partial_symtabs::add_psymbol): Rename from add_psymbol_to_list. + (init_psymbol_list): Simplify. + (maintenance_info_psymtabs, maintenance_check_psymtabs): Update. + * psympriv.h (struct partial_symtab) <empty>: New method. + <globals_offset, n_global_syms, statics_offset, n_static_syms>: + Remove. + <global_psymbols, static_psymbols>: New members. + <add_psymbol>: New methods. + (add_psymbol_to_list): Don't declare. + (psymbol_placement): Move earlier. + * mdebugread.c (parse_partial_symbols): Update. + (handle_psymbol_enumerators): Change parameters. + (mdebug_expand_psymtab): Update. + * dwarf2/read.c (process_psymtab_comp_unit_reader) + (add_partial_symbol): Update. + * dwarf2/index-write.c (write_psymbols): Change parameters. + (write_one_signatured_type): Update. + (recursively_count_psymbols): Update. + (recursively_write_psymbols): Update. + (class debug_names) <recursively_write_psymbols>: Update. + <write_psymbols>: Change parameters. + <write_one_signatured_type>: Update. + * dbxread.c (read_dbx_symtab): Update. + (dbx_end_psymtab): Use partial_symtab::empty. + * ctfread.c (struct ctf_context) <pst>: New member. + (create_partial_symtab): Set it. + (ctf_psymtab_type_cb, ctf_psymtab_var_cb): Update. + (scan_partial_symbols): Use the psymtab's context. Update. + +2020-10-17 Tom Tromey <tom@tromey.com> + * valprint.c (generic_value_print): Remove comment. * m2-valprint.c (m2_value_print_inner): Remove comment. * gdbtypes.c (create_range_type): Set TYPE_UNSIGNED from base diff --git a/gdb/ctfread.c b/gdb/ctfread.c index 0237b48..3c506dd 100644 --- a/gdb/ctfread.c +++ b/gdb/ctfread.c @@ -115,6 +115,7 @@ struct ctf_context { ctf_file_t *fp; struct objfile *of; + partial_symtab *pst; struct buildsym_compunit *builder; }; @@ -1320,6 +1321,8 @@ create_partial_symtab (const char *name, ccx = XOBNEW (&objfile->objfile_obstack, struct ctf_context); ccx->fp = cfp; ccx->of = objfile; + ccx->pst = pst; + ccx->builder = nullptr; pst->context = ccx; return pst; @@ -1377,7 +1380,7 @@ ctf_psymtab_type_cb (ctf_id_t tid, void *arg) return 0; } - add_psymbol_to_list (name.get (), true, + ccp->pst->add_psymbol (name.get (), true, domain, aclass, section, psymbol_placement::GLOBAL, 0, language_c, ccp->of); @@ -1392,10 +1395,10 @@ ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg) { struct ctf_context *ccp = (struct ctf_context *) arg; - add_psymbol_to_list (name, true, - VAR_DOMAIN, LOC_STATIC, -1, - psymbol_placement::GLOBAL, - 0, language_c, ccp->of); + ccp->pst->add_psymbol (name, true, + VAR_DOMAIN, LOC_STATIC, -1, + psymbol_placement::GLOBAL, + 0, language_c, ccp->of); return 0; } @@ -1405,19 +1408,17 @@ ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg) static void scan_partial_symbols (ctf_file_t *cfp, struct objfile *of) { - struct ctf_context ccx; bfd *abfd = of->obfd; const char *name = bfd_get_filename (abfd); ctf_psymtab *pst = create_partial_symtab (name, cfp, of); - ccx.fp = cfp; - ccx.of = of; + struct ctf_context *ccx = pst->context; - if (ctf_type_iter (cfp, ctf_psymtab_type_cb, &ccx) == CTF_ERR) + if (ctf_type_iter (cfp, ctf_psymtab_type_cb, ccx) == CTF_ERR) complaint (_("ctf_type_iter scan_partial_symbols failed - %s"), ctf_errmsg (ctf_errno (cfp))); - if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, &ccx) == CTF_ERR) + if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, ccx) == CTF_ERR) complaint (_("ctf_variable_iter scan_partial_symbols failed - %s"), ctf_errmsg (ctf_errno (cfp))); @@ -1457,10 +1458,10 @@ scan_partial_symbols (ctf_file_t *cfp, struct objfile *of) else aclass = LOC_TYPEDEF; - add_psymbol_to_list (tname.get (), true, - tdomain, aclass, -1, - psymbol_placement::STATIC, - 0, language_c, of); + pst->add_psymbol (tname.get (), true, + tdomain, aclass, -1, + psymbol_placement::STATIC, + 0, language_c, of); } end_psymtab_common (of, pst); diff --git a/gdb/dbxread.c b/gdb/dbxread.c index e76bf70..4665cdd 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -1460,21 +1460,21 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) switch (p[1]) { case 'S': - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, - VAR_DOMAIN, LOC_STATIC, - data_sect_index, - psymbol_placement::STATIC, - nlist.n_value, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), true, + VAR_DOMAIN, LOC_STATIC, + data_sect_index, + psymbol_placement::STATIC, + nlist.n_value, psymtab_language, objfile); continue; case 'G': /* The addresses in these entries are reported to be wrong. See the code that reads 'G's for symtabs. */ - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, - VAR_DOMAIN, LOC_STATIC, - data_sect_index, - psymbol_placement::GLOBAL, - nlist.n_value, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), true, + VAR_DOMAIN, LOC_STATIC, + data_sect_index, + psymbol_placement::GLOBAL, + nlist.n_value, psymtab_language, objfile); continue; case 'T': @@ -1488,17 +1488,17 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) || (p == namestring + 1 && namestring[0] != ' ')) { - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), - true, STRUCT_DOMAIN, LOC_TYPEDEF, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), + true, STRUCT_DOMAIN, LOC_TYPEDEF, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); if (p[2] == 't') { /* Also a typedef with the same name. */ - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), - true, VAR_DOMAIN, LOC_TYPEDEF, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), + true, VAR_DOMAIN, LOC_TYPEDEF, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); p += 1; } } @@ -1507,10 +1507,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) case 't': if (p != namestring) /* a name is there, not just :T... */ { - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), - true, VAR_DOMAIN, LOC_TYPEDEF, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), + true, VAR_DOMAIN, LOC_TYPEDEF, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); } check_enum: /* If this is an enumerated type, we need to @@ -1568,10 +1568,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) ; /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (gdb::string_view (p, q - p), true, - VAR_DOMAIN, LOC_CONST, -1, - psymbol_placement::STATIC, 0, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (p, q - p), true, + VAR_DOMAIN, LOC_CONST, -1, + psymbol_placement::STATIC, 0, + psymtab_language, objfile); /* Point past the name. */ p = q; /* Skip over the value. */ @@ -1586,10 +1586,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) case 'c': /* Constant, e.g. from "const" in Pascal. */ - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, - VAR_DOMAIN, LOC_CONST, -1, - psymbol_placement::STATIC, 0, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), true, + VAR_DOMAIN, LOC_CONST, -1, + psymbol_placement::STATIC, 0, + psymtab_language, objfile); continue; case 'f': @@ -1641,11 +1641,11 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) pst->set_text_low (nlist.n_value); textlow_not_set = 0; } - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, - VAR_DOMAIN, LOC_BLOCK, - SECT_OFF_TEXT (objfile), - psymbol_placement::STATIC, - nlist.n_value, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), true, + VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), + psymbol_placement::STATIC, + nlist.n_value, psymtab_language, objfile); continue; /* Global functions were ignored here, but now they @@ -1700,11 +1700,11 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile) pst->set_text_low (nlist.n_value); textlow_not_set = 0; } - add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true, - VAR_DOMAIN, LOC_BLOCK, - SECT_OFF_TEXT (objfile), - psymbol_placement::GLOBAL, - nlist.n_value, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (sym_name, sym_len), true, + VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), + psymbol_placement::GLOBAL, + nlist.n_value, psymtab_language, objfile); continue; /* Two things show up here (hopefully); static symbols of @@ -2043,8 +2043,7 @@ dbx_end_psymtab (struct objfile *objfile, legacy_psymtab *pst, if (num_includes == 0 && number_dependencies == 0 - && pst->n_global_syms == 0 - && pst->n_static_syms == 0 + && pst->empty () && has_line_numbers == 0) { /* Throw away this psymtab, it's empty. */ diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c index aa7a37e..e6188f7 100644 --- a/gdb/dwarf2/index-write.c +++ b/gdb/dwarf2/index-write.c @@ -539,14 +539,12 @@ symbol_kind (struct partial_symbol *psym) static void write_psymbols (struct mapped_symtab *symtab, std::unordered_set<partial_symbol *> &psyms_seen, - struct partial_symbol **psymp, - int count, + const std::vector<partial_symbol *> &symbols, offset_type cu_index, int is_static) { - for (; count-- > 0; ++psymp) + for (partial_symbol *psym : symbols) { - struct partial_symbol *psym = *psymp; const char *name = psym->ginfo.search_name (); if (psym->ginfo.language () == language_ada) @@ -618,17 +616,11 @@ write_one_signatured_type (void **slot, void *d) struct signatured_type *entry = (struct signatured_type *) *slot; partial_symtab *psymtab = entry->per_cu.v.psymtab; - write_psymbols (info->symtab, - info->psyms_seen, - (info->objfile->partial_symtabs->global_psymbols.data () - + psymtab->globals_offset), - psymtab->n_global_syms, info->cu_index, + write_psymbols (info->symtab, info->psyms_seen, + psymtab->global_psymbols, info->cu_index, 0); - write_psymbols (info->symtab, - info->psyms_seen, - (info->objfile->partial_symtabs->static_psymbols.data () - + psymtab->statics_offset), - psymtab->n_static_syms, info->cu_index, + write_psymbols (info->symtab, info->psyms_seen, + psymtab->static_psymbols, info->cu_index, 1); info->types_list.append_uint (8, BFD_ENDIAN_LITTLE, @@ -654,8 +646,8 @@ recursively_count_psymbols (partial_symtab *psymtab, recursively_count_psymbols (psymtab->dependencies[i], psyms_seen); - psyms_seen += psymtab->n_global_syms; - psyms_seen += psymtab->n_static_syms; + psyms_seen += psymtab->global_psymbols.size (); + psyms_seen += psymtab->static_psymbols.size (); } /* Recurse into all "included" dependencies and write their symbols as @@ -676,17 +668,11 @@ recursively_write_psymbols (struct objfile *objfile, psymtab->dependencies[i], symtab, psyms_seen, cu_index); - write_psymbols (symtab, - psyms_seen, - (objfile->partial_symtabs->global_psymbols.data () - + psymtab->globals_offset), - psymtab->n_global_syms, cu_index, + write_psymbols (symtab, psyms_seen, + psymtab->global_psymbols, cu_index, 0); - write_psymbols (symtab, - psyms_seen, - (objfile->partial_symtabs->static_psymbols.data () - + psymtab->statics_offset), - psymtab->n_static_syms, cu_index, + write_psymbols (symtab, psyms_seen, + psymtab->static_psymbols, cu_index, 1); } @@ -912,14 +898,10 @@ public: recursively_write_psymbols (objfile, psymtab->dependencies[i], psyms_seen, cu_index); - write_psymbols (psyms_seen, - (objfile->partial_symtabs->global_psymbols.data () - + psymtab->globals_offset), - psymtab->n_global_syms, cu_index, false, unit_kind::cu); - write_psymbols (psyms_seen, - (objfile->partial_symtabs->static_psymbols.data () - + psymtab->statics_offset), - psymtab->n_static_syms, cu_index, true, unit_kind::cu); + write_psymbols (psyms_seen, psymtab->global_psymbols, + cu_index, false, unit_kind::cu); + write_psymbols (psyms_seen, psymtab->static_psymbols, + cu_index, true, unit_kind::cu); } /* Return number of bytes the .debug_names section will have. This @@ -1251,13 +1233,11 @@ private: /* Call insert for all partial symbols and mark them in PSYMS_SEEN. */ void write_psymbols (std::unordered_set<partial_symbol *> &psyms_seen, - struct partial_symbol **psymp, int count, int cu_index, - bool is_static, unit_kind kind) + const std::vector<partial_symbol *> &symbols, + int cu_index, bool is_static, unit_kind kind) { - for (; count-- > 0; ++psymp) + for (partial_symbol *psym : symbols) { - struct partial_symbol *psym = *psymp; - /* Only add a given psymbol once. */ if (psyms_seen.insert (psym).second) insert (psym, cu_index, is_static, kind); @@ -1272,16 +1252,10 @@ private: { partial_symtab *psymtab = entry->per_cu.v.psymtab; - write_psymbols (info->psyms_seen, - (info->objfile->partial_symtabs->global_psymbols.data () - + psymtab->globals_offset), - psymtab->n_global_syms, info->cu_index, false, - unit_kind::tu); - write_psymbols (info->psyms_seen, - (info->objfile->partial_symtabs->static_psymbols.data () - + psymtab->statics_offset), - psymtab->n_static_syms, info->cu_index, true, - unit_kind::tu); + write_psymbols (info->psyms_seen, psymtab->global_psymbols, + info->cu_index, false, unit_kind::tu); + write_psymbols (info->psyms_seen, psymtab->static_psymbols, + info->cu_index, true, unit_kind::tu); info->types_list.append_uint (dwarf5_offset_size (), m_dwarf5_byte_order, to_underlying (entry->per_cu.sect_off)); diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 2ec3789..37409c5 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -7667,7 +7667,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, sect_offset_str (per_cu->sect_off), paddress (gdbarch, pst->text_low (objfile)), paddress (gdbarch, pst->text_high (objfile)), - pst->n_global_syms, pst->n_static_syms); + (int) pst->global_psymbols.size (), + (int) pst->static_psymbols.size ()); } /* Subroutine of dwarf2_build_psymtabs_hard to simplify it. @@ -8640,7 +8641,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) &objfile->objfile_obstack); psymbol.ginfo.set_linkage_name (pdi->linkage_name); } - add_psymbol_to_list (psymbol, *where, objfile); + cu->per_cu->v.psymtab->add_psymbol (psymbol, *where, objfile); } } diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 480b67b..1b2e352 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -264,8 +264,8 @@ static int add_line (struct linetable *, int, CORE_ADDR, int); static struct linetable *shrink_linetable (struct linetable *); -static void handle_psymbol_enumerators (struct objfile *, FDR *, int, - CORE_ADDR); +static void handle_psymbol_enumerators (struct objfile *, partial_symtab *, + FDR *, int, CORE_ADDR); static const char *mdebug_next_symbol_text (struct objfile *); @@ -3029,25 +3029,25 @@ parse_partial_symbols (minimal_symbol_reader &reader, switch (p[1]) { case 'S': - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_STATIC, - SECT_OFF_DATA (objfile), - psymbol_placement::STATIC, - sh.value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_STATIC, + SECT_OFF_DATA (objfile), + psymbol_placement::STATIC, + sh.value, + psymtab_language, objfile); continue; case 'G': /* The addresses in these entries are reported to be wrong. See the code that reads 'G's for symtabs. */ - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_STATIC, - SECT_OFF_DATA (objfile), - psymbol_placement::GLOBAL, - sh.value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_STATIC, + SECT_OFF_DATA (objfile), + psymbol_placement::GLOBAL, + sh.value, + psymtab_language, objfile); continue; case 'T': @@ -3061,7 +3061,7 @@ parse_partial_symbols (minimal_symbol_reader &reader, || (p == namestring + 1 && namestring[0] != ' ')) { - add_psymbol_to_list + pst->add_psymbol (gdb::string_view (namestring, p - namestring), true, STRUCT_DOMAIN, LOC_TYPEDEF, -1, psymbol_placement::STATIC, 0, psymtab_language, @@ -3069,7 +3069,7 @@ parse_partial_symbols (minimal_symbol_reader &reader, if (p[2] == 't') { /* Also a typedef with the same name. */ - add_psymbol_to_list + pst->add_psymbol (gdb::string_view (namestring, p - namestring), true, VAR_DOMAIN, LOC_TYPEDEF, -1, @@ -3083,7 +3083,7 @@ parse_partial_symbols (minimal_symbol_reader &reader, if (p != namestring) /* a name is there, not just :T... */ { - add_psymbol_to_list + pst->add_psymbol (gdb::string_view (namestring, p - namestring), true, VAR_DOMAIN, LOC_TYPEDEF, -1, @@ -3149,13 +3149,13 @@ parse_partial_symbols (minimal_symbol_reader &reader, /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (gdb::string_view (p, - q - p), - true, VAR_DOMAIN, - LOC_CONST, -1, - psymbol_placement::STATIC, - 0, psymtab_language, - objfile); + pst->add_psymbol (gdb::string_view (p, + q - p), + true, VAR_DOMAIN, + LOC_CONST, -1, + psymbol_placement::STATIC, + 0, psymtab_language, + objfile); /* Point past the name. */ p = q; /* Skip over the value. */ @@ -3169,11 +3169,11 @@ parse_partial_symbols (minimal_symbol_reader &reader, continue; case 'c': /* Constant, e.g. from "const" in Pascal. */ - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_CONST, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_CONST, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); continue; case 'f': @@ -3183,13 +3183,13 @@ parse_partial_symbols (minimal_symbol_reader &reader, function_outside_compilation_unit_complaint (copy.c_str ()); } - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_BLOCK, - SECT_OFF_TEXT (objfile), - psymbol_placement::STATIC, - sh.value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), + psymbol_placement::STATIC, + sh.value, + psymtab_language, objfile); continue; /* Global functions were ignored here, but now they @@ -3203,13 +3203,13 @@ parse_partial_symbols (minimal_symbol_reader &reader, function_outside_compilation_unit_complaint (copy.c_str ()); } - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_BLOCK, - SECT_OFF_TEXT (objfile), - psymbol_placement::GLOBAL, - sh.value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), + psymbol_placement::GLOBAL, + sh.value, + psymtab_language, objfile); continue; /* Two things show up here (hopefully); static @@ -3439,17 +3439,17 @@ parse_partial_symbols (minimal_symbol_reader &reader, symbol table, and the MAIN__ symbol via the minimal symbol table. */ if (sh.st == stProc) - add_psymbol_to_list (sym_name, true, - VAR_DOMAIN, LOC_BLOCK, - section, - psymbol_placement::GLOBAL, - sh.value, psymtab_language, objfile); + pst->add_psymbol (sym_name, true, + VAR_DOMAIN, LOC_BLOCK, + section, + psymbol_placement::GLOBAL, + sh.value, psymtab_language, objfile); else - add_psymbol_to_list (sym_name, true, - VAR_DOMAIN, LOC_BLOCK, - section, - psymbol_placement::STATIC, - sh.value, psymtab_language, objfile); + pst->add_psymbol (sym_name, true, + VAR_DOMAIN, LOC_BLOCK, + section, + psymbol_placement::STATIC, + sh.value, psymtab_language, objfile); procaddr = sh.value; @@ -3512,12 +3512,13 @@ parse_partial_symbols (minimal_symbol_reader &reader, && sh.iss != 0 && sh.index != cur_sdx + 2) { - add_psymbol_to_list (sym_name, true, - STRUCT_DOMAIN, LOC_TYPEDEF, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (sym_name, true, + STRUCT_DOMAIN, LOC_TYPEDEF, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); } - handle_psymbol_enumerators (objfile, fh, sh.st, sh.value); + handle_psymbol_enumerators (objfile, pst, fh, + sh.st, sh.value); /* Skip over the block. */ new_sdx = sh.index; @@ -3552,10 +3553,10 @@ parse_partial_symbols (minimal_symbol_reader &reader, continue; } /* Use this gdb symbol. */ - add_psymbol_to_list (sym_name, true, - VAR_DOMAIN, theclass, section, - psymbol_placement::STATIC, - sh.value, psymtab_language, objfile); + pst->add_psymbol (sym_name, true, + VAR_DOMAIN, theclass, section, + psymbol_placement::STATIC, + sh.value, psymtab_language, objfile); skip: cur_sdx++; /* Go to next file symbol. */ } @@ -3630,11 +3631,11 @@ parse_partial_symbols (minimal_symbol_reader &reader, break; } char *sym_name = debug_info->ssext + psh->iss; - add_psymbol_to_list (sym_name, true, - VAR_DOMAIN, theclass, - section, - psymbol_placement::GLOBAL, - svalue, psymtab_language, objfile); + pst->add_psymbol (sym_name, true, + VAR_DOMAIN, theclass, + section, + psymbol_placement::GLOBAL, + svalue, psymtab_language, objfile); } } @@ -3728,8 +3729,7 @@ parse_partial_symbols (minimal_symbol_reader &reader, partial_symtab *pst_del = objfile->partial_symtabs->psymtabs; if (pst_del->next == NULL && pst_del->number_of_dependencies == 0 - && pst_del->n_global_syms == 0 - && pst_del->n_static_syms == 0) + && pst_del->empty ()) objfile->partial_symtabs->discard_psymtab (pst_del); } @@ -3737,8 +3737,8 @@ parse_partial_symbols (minimal_symbol_reader &reader, all the enum constants to the partial symbol table. */ static void -handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype, - CORE_ADDR svalue) +handle_psymbol_enumerators (struct objfile *objfile, partial_symtab *pst, + FDR *fh, int stype, CORE_ADDR svalue) { const bfd_size_type external_sym_size = debug_swap->external_sym_size; void (*const swap_sym_in) (bfd *, void *, SYMR *) = debug_swap->swap_sym_in; @@ -3793,10 +3793,10 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype, /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (name, true, - VAR_DOMAIN, LOC_CONST, -1, - psymbol_placement::STATIC, 0, - psymtab_language, objfile); + pst->add_psymbol (name, true, + VAR_DOMAIN, LOC_CONST, -1, + psymbol_placement::STATIC, 0, + psymtab_language, objfile); ext_sym += external_sym_size; } } @@ -3853,8 +3853,7 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile) /* Do nothing if this is a dummy psymtab. */ - if (pst->n_global_syms == 0 && pst->n_static_syms == 0 - && !pst->text_low_valid && !pst->text_high_valid) + if (pst->empty () && !pst->text_low_valid && !pst->text_high_valid) return; /* Now read the symbols for this symtab. */ diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 4622be3..97f9b3b 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -92,6 +92,15 @@ enum psymtab_search_status PST_SEARCHED_AND_NOT_FOUND }; +/* Specify whether a partial psymbol should be allocated on the global + list or the static list. */ + +enum class psymbol_placement +{ + STATIC, + GLOBAL +}; + /* Each source file that has not been fully read in is represented by a partial_symtab. This contains the information on where in the executable the debugging symbols for a specific file are, and a @@ -196,6 +205,48 @@ struct partial_symtab text_high_valid = 1; } + /* Return true if this symtab is empty -- meaning that it contains + no symbols. It may still have dependencies. */ + bool empty () const + { + return global_psymbols.empty () && static_psymbols.empty (); + } + + /* Add a symbol to this partial symbol table of OBJFILE. + + If COPY_NAME is true, make a copy of NAME, otherwise use the passed + reference. + + THECLASS is the type of symbol. + + SECTION is the index of the section of OBJFILE in which the symbol is found. + + WHERE determines whether the symbol goes in the list of static or global + partial symbols. + + COREADDR is the address of the symbol. For partial symbols that don't have + an address, zero is passed. + + LANGUAGE is the language from which the symbol originates. This will + influence, amongst other things, how the symbol name is demangled. */ + + void add_psymbol (gdb::string_view name, + bool copy_name, domain_enum domain, + enum address_class theclass, + short section, + psymbol_placement where, + CORE_ADDR coreaddr, + enum language language, + struct objfile *objfile); + + /* Add a symbol to this partial symbol table of OBJFILE. The psymbol + must be fully constructed, and the names must be set and intern'd + as appropriate. */ + + void add_psymbol (const partial_symbol &psym, + psymbol_placement where, + struct objfile *objfile); + /* Chain of all existing partial symtabs. */ @@ -269,22 +320,18 @@ struct partial_symtab /* Global symbol list. This list will be sorted after readin to improve access. Binary search will be the usual method of - finding a symbol within it. globals_offset is an integer offset - within global_psymbols[]. */ + finding a symbol within it. */ - int globals_offset = 0; - int n_global_syms = 0; + std::vector<partial_symbol *> global_psymbols; /* Static symbol list. This list will *not* be sorted after readin; to find a symbol in it, exhaustive search must be used. This is reasonable because searches through this list will eventually lead to either the read in of a files symbols for real (assumed to take a *lot* of time; check) or an error (and we don't care - how long errors take). This is an offset and size within - static_psymbols[]. */ + how long errors take). */ - int statics_offset = 0; - int n_static_syms = 0; + std::vector<partial_symbol *> static_psymbols; /* True iff objfile->psymtabs_addrmap is properly populated for this partial_symtab. For discontiguous overlapping psymtabs is the only usable @@ -389,50 +436,6 @@ struct legacy_psymtab : public standard_psymtab void *read_symtab_private = nullptr; }; -/* Specify whether a partial psymbol should be allocated on the global - list or the static list. */ - -enum class psymbol_placement -{ - STATIC, - GLOBAL -}; - -/* Add a symbol to the partial symbol table of OBJFILE. - - If COPY_NAME is true, make a copy of NAME, otherwise use the passed - reference. - - THECLASS is the type of symbol. - - SECTION is the index of the section of OBJFILE in which the symbol is found. - - WHERE determines whether the symbol goes in the list of static or global - partial symbols of OBJFILE. - - COREADDR is the address of the symbol. For partial symbols that don't have - an address, zero is passed. - - LANGUAGE is the language from which the symbol originates. This will - influence, amongst other things, how the symbol name is demangled. */ - -extern void add_psymbol_to_list (gdb::string_view name, - bool copy_name, domain_enum domain, - enum address_class theclass, - short section, - psymbol_placement where, - CORE_ADDR coreaddr, - enum language language, - struct objfile *objfile); - -/* Add a symbol to the partial symbol table of OBJFILE. The psymbol - must be fully constructed, and the names must be set and intern'd - as appropriate. */ - -extern void add_psymbol_to_list (const partial_symbol &psym, - psymbol_placement where, - struct objfile *objfile); - /* Initialize storage for partial symbols. If partial symbol storage has already been initialized, this does nothing. TOTAL_SYMBOLS is an estimate of how many symbols there will be. */ diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 5791cd1..acccfca 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -91,11 +91,6 @@ require_partial_symbols (struct objfile *objfile, bool verbose) objfile_name (objfile)); (*objfile->sf->sym_read_psymbols) (objfile); - /* Partial symbols list are not expected to changed after this - point. */ - objfile->partial_symtabs->global_psymbols.shrink_to_fit (); - objfile->partial_symtabs->static_psymbols.shrink_to_fit (); - if (verbose && !objfile_has_symbols (objfile)) printf_filtered (_("(No debugging symbols found in %s)\n"), objfile_name (objfile)); @@ -407,12 +402,8 @@ find_pc_sect_psymbol (struct objfile *objfile, /* Search the global symbols as well as the static symbols, so that find_pc_partial_function doesn't use a minimal symbol and thus cache a bad endaddr. */ - for (int i = 0; i < psymtab->n_global_syms; i++) + for (partial_symbol *p : psymtab->global_psymbols) { - partial_symbol *p - = objfile->partial_symtabs->global_psymbols[psymtab->globals_offset - + i]; - if (p->domain == VAR_DOMAIN && p->aclass == LOC_BLOCK && pc >= p->address (objfile) @@ -431,12 +422,8 @@ find_pc_sect_psymbol (struct objfile *objfile, } } - for (int i = 0; i < psymtab->n_static_syms; i++) + for (partial_symbol *p : psymtab->static_psymbols) { - partial_symbol *p - = objfile->partial_symtabs->static_psymbols[psymtab->statics_offset - + i]; - if (p->domain == VAR_DOMAIN && p->aclass == LOC_BLOCK && pc >= p->address (objfile) @@ -567,15 +554,17 @@ match_partial_symbol (struct objfile *objfile, { struct partial_symbol **start, **psym; struct partial_symbol **top, **real_top, **bottom, **center; - int length = (global ? pst->n_global_syms : pst->n_static_syms); + int length = (global + ? pst->global_psymbols.size () + : pst->static_psymbols.size ()); int do_linear_search = 1; if (length == 0) return NULL; start = (global ? - &objfile->partial_symtabs->global_psymbols[pst->globals_offset] : - &objfile->partial_symtabs->static_psymbols[pst->statics_offset]); + &pst->global_psymbols[0] : + &pst->static_psymbols[0]); if (global && ordered_compare) /* Can use a binary search. */ { @@ -645,15 +634,17 @@ lookup_partial_symbol (struct objfile *objfile, { struct partial_symbol **start, **psym; struct partial_symbol **top, **real_top, **bottom, **center; - int length = (global ? pst->n_global_syms : pst->n_static_syms); + int length = (global + ? pst->global_psymbols.size () + : pst->static_psymbols.size ()); int do_linear_search = 1; if (length == 0) return NULL; start = (global ? - &objfile->partial_symtabs->global_psymbols[pst->globals_offset] : - &objfile->partial_symtabs->static_psymbols[pst->statics_offset]); + &pst->global_psymbols[0] : + &pst->static_psymbols[0]); if (global) /* This means we can use a binary search. */ { @@ -815,21 +806,21 @@ psym_forget_cached_source_info (struct objfile *objfile) static void print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile, - struct partial_symbol **p, int count, const char *what, - struct ui_file *outfile) + const std::vector<partial_symbol *> &symbols, + const char *what, struct ui_file *outfile) { fprintf_filtered (outfile, " %s partial symbols:\n", what); - while (count-- > 0) + for (partial_symbol *p : symbols) { QUIT; - fprintf_filtered (outfile, " `%s'", (*p)->ginfo.linkage_name ()); - if ((*p)->ginfo.demangled_name () != NULL) + fprintf_filtered (outfile, " `%s'", p->ginfo.linkage_name ()); + if (p->ginfo.demangled_name () != NULL) { fprintf_filtered (outfile, " `%s'", - (*p)->ginfo.demangled_name ()); + p->ginfo.demangled_name ()); } fputs_filtered (", ", outfile); - switch ((*p)->domain) + switch (p->domain) { case UNDEF_DOMAIN: fputs_filtered ("undefined domain, ", outfile); @@ -853,7 +844,7 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile, fputs_filtered ("<invalid domain>, ", outfile); break; } - switch ((*p)->aclass) + switch (p->aclass) { case LOC_UNDEF: fputs_filtered ("undefined", outfile); @@ -905,9 +896,8 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile, break; } fputs_filtered (", ", outfile); - fputs_filtered (paddress (gdbarch, (*p)->unrelocated_address ()), outfile); + fputs_filtered (paddress (gdbarch, p->unrelocated_address ()), outfile); fprintf_filtered (outfile, "\n"); - p++; } } @@ -966,19 +956,17 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, gdb_print_host_address (psymtab->user, outfile); fprintf_filtered (outfile, "\n"); } - if (psymtab->n_global_syms > 0) + if (!psymtab->global_psymbols.empty ()) { print_partial_symbols - (gdbarch, objfile, - &objfile->partial_symtabs->global_psymbols[psymtab->globals_offset], - psymtab->n_global_syms, "Global", outfile); + (gdbarch, objfile, psymtab->global_psymbols, + "Global", outfile); } - if (psymtab->n_static_syms > 0) + if (!psymtab->static_psymbols.empty ()) { print_partial_symbols - (gdbarch, objfile, - &objfile->partial_symtabs->static_psymbols[psymtab->statics_offset], - psymtab->n_static_syms, "Static", outfile); + (gdbarch, objfile, psymtab->static_psymbols, + "Static", outfile); } fprintf_filtered (outfile, "\n"); } @@ -1229,26 +1217,22 @@ recursively_search_psymtabs } } - partial_symbol **gbound - = (objfile->partial_symtabs->global_psymbols.data () - + ps->globals_offset + ps->n_global_syms); - partial_symbol **sbound - = (objfile->partial_symtabs->static_psymbols.data () - + ps->statics_offset + ps->n_static_syms); + partial_symbol **gbound = (ps->global_psymbols.data () + + ps->global_psymbols.size ()); + partial_symbol **sbound = (ps->static_psymbols.data () + + ps->static_psymbols.size ()); partial_symbol **bound = gbound; /* Go through all of the symbols stored in a partial symtab in one loop. */ - partial_symbol **psym = (objfile->partial_symtabs->global_psymbols.data () - + ps->globals_offset); + partial_symbol **psym = ps->global_psymbols.data (); while (keep_going) { if (psym >= bound) { - if (bound == gbound && ps->n_static_syms != 0) + if (bound == gbound && !ps->static_psymbols.empty ()) { - psym = (objfile->partial_symtabs->static_psymbols.data () - + ps->statics_offset); + psym = ps->static_psymbols.data (); bound = sbound; } else @@ -1363,14 +1347,10 @@ static void psym_fill_psymbol_map (struct objfile *objfile, struct partial_symtab *psymtab, std::set<CORE_ADDR> *seen_addrs, - const std::vector<partial_symbol *> &symbols, - int start, - int length) + const std::vector<partial_symbol *> &symbols) { - for (int i = 0; i < length; ++i) + for (partial_symbol *psym : symbols) { - struct partial_symbol *psym = symbols[start + i]; - if (psym->aclass == LOC_STATIC) { CORE_ADDR addr = psym->address (objfile); @@ -1398,14 +1378,10 @@ psym_find_compunit_symtab_by_address (struct objfile *objfile, { psym_fill_psymbol_map (objfile, pst, &seen_addrs, - objfile->partial_symtabs->global_psymbols, - pst->globals_offset, - pst->n_global_syms); + pst->global_psymbols); psym_fill_psymbol_map (objfile, pst, &seen_addrs, - objfile->partial_symtabs->static_psymbols, - pst->statics_offset, - pst->n_static_syms); + pst->static_psymbols); } objfile->psymbol_map.shrink_to_fit (); @@ -1458,14 +1434,9 @@ static void sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst) { /* Sort the global list; don't sort the static list. */ - auto begin = objfile->partial_symtabs->global_psymbols.begin (); - std::advance (begin, pst->globals_offset); - - /* The psymbols for this partial_symtab are currently at the end of the - vector. */ - auto end = objfile->partial_symtabs->global_psymbols.end (); - - std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2) + std::sort (pst->global_psymbols.begin (), + pst->global_psymbols.end (), + [] (partial_symbol *s1, partial_symbol *s2) { return strcmp_iw_ordered (s1->ginfo.search_name (), s2->ginfo.search_name ()) < 0; @@ -1482,20 +1453,6 @@ partial_symtab::partial_symtab (const char *filename, { set_text_low (textlow); set_text_high (raw_text_low ()); /* default */ - - auto *v1 = new std::vector<partial_symbol *>; - objfile->partial_symtabs->current_global_psymbols.push_back (v1); - auto *v2 = new std::vector<partial_symbol *>; - objfile->partial_symtabs->current_static_psymbols.push_back (v2); -} - -/* Concat vectors V1 and V2. */ - -static void -concat (std::vector<partial_symbol *> *v1, std::vector<partial_symbol *> *v2) -{ - v1->insert (v1->end (), v2->begin (), v2->end ()); - v2->clear (); } /* Perform "finishing up" operations of a partial symtab. */ @@ -1503,26 +1460,8 @@ concat (std::vector<partial_symbol *> *v1, std::vector<partial_symbol *> *v2) void end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst) { - pst->globals_offset = objfile->partial_symtabs->global_psymbols.size (); - pst->statics_offset = objfile->partial_symtabs->static_psymbols.size (); - - auto *current_global_psymbols - = objfile->partial_symtabs->current_global_psymbols.back (); - auto *current_static_psymbols - = objfile->partial_symtabs->current_static_psymbols.back (); - objfile->partial_symtabs->current_global_psymbols.pop_back (); - objfile->partial_symtabs->current_static_psymbols.pop_back (); - - pst->n_global_syms - = current_global_psymbols->size (); - pst->n_static_syms - = current_static_psymbols->size (); - - concat (&objfile->partial_symtabs->global_psymbols, current_global_psymbols); - concat (&objfile->partial_symtabs->static_psymbols, current_static_psymbols); - - delete current_global_psymbols; - delete current_static_psymbols; + pst->global_psymbols.shrink_to_fit (); + pst->static_psymbols.shrink_to_fit (); sort_pst_symbols (objfile, pst); } @@ -1587,20 +1526,20 @@ add_psymbol_to_bcache (const partial_symbol &psymbol, struct objfile *objfile, /* Helper function, adds partial symbol to the given partial symbol list. */ static void -append_psymbol_to_list (std::vector<partial_symbol *> *list, +append_psymbol_to_list (std::vector<partial_symbol *> &list, struct partial_symbol *psym, struct objfile *objfile) { - list->push_back (psym); + list.push_back (psym); OBJSTAT (objfile, n_psyms++); } /* See psympriv.h. */ void -add_psymbol_to_list (const partial_symbol &psymbol, - psymbol_placement where, - struct objfile *objfile) +partial_symtab::add_psymbol (const partial_symbol &psymbol, + psymbol_placement where, + struct objfile *objfile) { bool added; @@ -1612,23 +1551,23 @@ add_psymbol_to_list (const partial_symbol &psymbol, return; /* Save pointer to partial symbol in psymtab, growing symtab if needed. */ - std::vector<partial_symbol *> *list + std::vector<partial_symbol *> &list = (where == psymbol_placement::STATIC - ? objfile->partial_symtabs->current_static_psymbols.back () - : objfile->partial_symtabs->current_global_psymbols.back ()); + ? static_psymbols + : global_psymbols); append_psymbol_to_list (list, psym, objfile); } /* See psympriv.h. */ void -add_psymbol_to_list (gdb::string_view name, bool copy_name, - domain_enum domain, - enum address_class theclass, - short section, - psymbol_placement where, - CORE_ADDR coreaddr, - enum language language, struct objfile *objfile) +partial_symtab::add_psymbol (gdb::string_view name, bool copy_name, + domain_enum domain, + enum address_class theclass, + short section, + psymbol_placement where, + CORE_ADDR coreaddr, + enum language language, struct objfile *objfile) { struct partial_symbol psymbol; memset (&psymbol, 0, sizeof (psymbol)); @@ -1640,7 +1579,7 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name, psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ()); psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd); - add_psymbol_to_list (psymbol, where, objfile); + add_psymbol (psymbol, where, objfile); } /* See psympriv.h. */ @@ -1648,16 +1587,6 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name, void init_psymbol_list (struct objfile *objfile, int total_symbols) { - if (objfile->partial_symtabs->global_psymbols.capacity () == 0 - && objfile->partial_symtabs->static_psymbols.capacity () == 0) - { - /* Current best guess is that approximately a twentieth of the - total symbols (in a debugging file) are global or static - oriented symbols, then multiply that by slop factor of - two. */ - objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10); - objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10); - } } /* See psympriv.h. */ @@ -2027,29 +1956,19 @@ maintenance_info_psymtabs (const char *regexp, int from_tty) (psymtab->psymtabs_addrmap_supported ? "yes" : "no")); printf_filtered (" globals "); - if (psymtab->n_global_syms) - { - auto p = &(objfile->partial_symtabs - ->global_psymbols[psymtab->globals_offset]); - - printf_filtered - ("(* (struct partial_symbol **) %s @ %d)\n", - host_address_to_string (p), - psymtab->n_global_syms); - } + if (!psymtab->global_psymbols.empty ()) + printf_filtered + ("(* (struct partial_symbol **) %s @ %d)\n", + host_address_to_string (psymtab->global_psymbols.data ()), + (int) psymtab->global_psymbols.size ()); else printf_filtered ("(none)\n"); printf_filtered (" statics "); - if (psymtab->n_static_syms) - { - auto p = &(objfile->partial_symtabs - ->static_psymbols[psymtab->statics_offset]); - - printf_filtered - ("(* (struct partial_symbol **) %s @ %d)\n", - host_address_to_string (p), - psymtab->n_static_syms); - } + if (!psymtab->static_psymbols.empty ()) + printf_filtered + ("(* (struct partial_symbol **) %s @ %d)\n", + host_address_to_string (psymtab->static_psymbols.data ()), + (int) psymtab->static_psymbols.size ()); else printf_filtered ("(none)\n"); if (psymtab->user) @@ -2096,7 +2015,6 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) struct compunit_symtab *cust = NULL; const struct blockvector *bv; const struct block *b; - int i; for (objfile *objfile : current_program_space->objfiles ()) for (partial_symtab *ps : require_partial_symbols (objfile, true)) @@ -2128,39 +2046,36 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) continue; bv = COMPUNIT_BLOCKVECTOR (cust); b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); - partial_symbol **psym - = &objfile->partial_symtabs->static_psymbols[ps->statics_offset]; - for (i = 0; i < ps->n_static_syms; psym++, i++) + for (partial_symbol *psym : ps->static_psymbols) { /* Skip symbols for inlined functions without address. These may or may not have a match in the full symtab. */ - if ((*psym)->aclass == LOC_BLOCK - && (*psym)->ginfo.value.address == 0) + if (psym->aclass == LOC_BLOCK + && psym->ginfo.value.address == 0) continue; - sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (), + sym = block_lookup_symbol (b, psym->ginfo.search_name (), symbol_name_match_type::SEARCH_NAME, - (*psym)->domain); + psym->domain); if (!sym) { printf_filtered ("Static symbol `"); - puts_filtered ((*psym)->ginfo.linkage_name ()); + puts_filtered (psym->ginfo.linkage_name ()); printf_filtered ("' only found in "); puts_filtered (ps->filename); printf_filtered (" psymtab\n"); } } b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - psym = &objfile->partial_symtabs->global_psymbols[ps->globals_offset]; - for (i = 0; i < ps->n_global_syms; psym++, i++) + for (partial_symbol *psym : ps->global_psymbols) { - sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (), + sym = block_lookup_symbol (b, psym->ginfo.search_name (), symbol_name_match_type::SEARCH_NAME, - (*psym)->domain); + psym->domain); if (!sym) { printf_filtered ("Global symbol `"); - puts_filtered ((*psym)->ginfo.linkage_name ()); + puts_filtered (psym->ginfo.linkage_name ()); printf_filtered ("' only found in "); puts_filtered (ps->filename); printf_filtered (" psymtab\n"); diff --git a/gdb/psymtab.h b/gdb/psymtab.h index 3c2d65f..85bc48c 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -137,18 +137,6 @@ public: psymbol_bcache psymbol_cache; - /* Vectors of all partial symbols read in from file. The actual data - is stored in the objfile_obstack. */ - - std::vector<partial_symbol *> global_psymbols; - std::vector<partial_symbol *> static_psymbols; - - /* Stack of vectors of partial symbols, using during psymtab - initialization. */ - - std::vector<std::vector<partial_symbol *>*> current_global_psymbols; - std::vector<std::vector<partial_symbol *>*> current_static_psymbols; - private: /* The obstack where allocations are made. This is lazily allocated diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 389678a..3588aae 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -2035,8 +2035,7 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst, if (num_includes == 0 && number_dependencies == 0 - && pst->n_global_syms == 0 - && pst->n_static_syms == 0) + && pst->empty ()) { /* Throw away this psymtab, it's empty. */ /* Empty psymtabs happen as a result of header files which don't have @@ -2575,25 +2574,25 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, switch (p[1]) { case 'S': - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_STATIC, - SECT_OFF_DATA (objfile), - psymbol_placement::STATIC, - symbol.n_value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_STATIC, + SECT_OFF_DATA (objfile), + psymbol_placement::STATIC, + symbol.n_value, + psymtab_language, objfile); continue; case 'G': /* The addresses in these entries are reported to be wrong. See the code that reads 'G's for symtabs. */ - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_STATIC, - SECT_OFF_DATA (objfile), - psymbol_placement::GLOBAL, - symbol.n_value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_STATIC, + SECT_OFF_DATA (objfile), + psymbol_placement::GLOBAL, + symbol.n_value, + psymtab_language, objfile); continue; case 'T': @@ -2607,19 +2606,19 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, || (p == namestring + 1 && namestring[0] != ' ')) { - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, STRUCT_DOMAIN, LOC_TYPEDEF, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, STRUCT_DOMAIN, LOC_TYPEDEF, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); if (p[2] == 't') { /* Also a typedef with the same name. */ - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_TYPEDEF, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_TYPEDEF, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); p += 1; } } @@ -2628,11 +2627,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, case 't': if (p != namestring) /* a name is there, not just :T... */ { - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_TYPEDEF, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_TYPEDEF, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); } check_enum: /* If this is an enumerated type, we need to @@ -2691,10 +2690,10 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, ; /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (gdb::string_view (p, q - p), true, - VAR_DOMAIN, LOC_CONST, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (p, q - p), true, + VAR_DOMAIN, LOC_CONST, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); /* Point past the name. */ p = q; /* Skip over the value. */ @@ -2709,11 +2708,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, case 'c': /* Constant, e.g. from "const" in Pascal. */ - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_CONST, -1, - psymbol_placement::STATIC, - 0, psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_CONST, -1, + psymbol_placement::STATIC, + 0, psymtab_language, objfile); continue; case 'f': @@ -2727,13 +2726,13 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, function_outside_compilation_unit_complaint (name); xfree (name); } - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_BLOCK, - SECT_OFF_TEXT (objfile), - psymbol_placement::STATIC, - symbol.n_value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), + psymbol_placement::STATIC, + symbol.n_value, + psymtab_language, objfile); continue; /* Global functions were ignored here, but now they @@ -2758,13 +2757,13 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, if (startswith (namestring, "@FIX")) continue; - add_psymbol_to_list (gdb::string_view (namestring, - p - namestring), - true, VAR_DOMAIN, LOC_BLOCK, - SECT_OFF_TEXT (objfile), - psymbol_placement::GLOBAL, - symbol.n_value, - psymtab_language, objfile); + pst->add_psymbol (gdb::string_view (namestring, + p - namestring), + true, VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), + psymbol_placement::GLOBAL, + symbol.n_value, + psymtab_language, objfile); continue; /* Two things show up here (hopefully); static symbols of |