aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog45
-rw-r--r--gdb/ctfread.c29
-rw-r--r--gdb/dbxread.c83
-rw-r--r--gdb/dwarf2/index-write.c72
-rw-r--r--gdb/dwarf2/read.c5
-rw-r--r--gdb/mdebugread.c157
-rw-r--r--gdb/psympriv.h107
-rw-r--r--gdb/psymtab.c243
-rw-r--r--gdb/psymtab.h12
-rw-r--r--gdb/xcoffread.c107
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