mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-29 02:20:51 +00:00
Have partial symbol tables own psymbol vectors
Currently pointers to all partial symbols are stored in two vectors; and then indices into these vectors are stored in each partial_symtab. This patch changes this so that each partial symtab instead has vectors of symbols. add_psymbol_to_list can now be changed into a method on partial_symtab as well. My main motivation for doing this is that I am looking into calling sort_pst_symbols in the background. However, I haven't actually implemented this yet. (Also this may make it more feasible to also sort the static psymbols, though I haven't tried that either.) Also, though, this lets us remove the "current_global_psymbols" vector, because now the callers can simply refer directly to the psymtab that they are modifying (formerly this was implicit). The main drawback of this patch is that it increases the size of partial symtab. gdb/ChangeLog 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.
This commit is contained in:
@@ -1,3 +1,48 @@
|
||||
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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
157
gdb/mdebugread.c
157
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. */
|
||||
|
||||
107
gdb/psympriv.h
107
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. */
|
||||
|
||||
243
gdb/psymtab.c
243
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");
|
||||
|
||||
@@ -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
|
||||
|
||||
107
gdb/xcoffread.c
107
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
|
||||
|
||||
Reference in New Issue
Block a user