Attach partial symtab storage to psymbol_functions
Currently, the storage for partial symtabs is attached to the objfile. Ultimately, though, this direct assocation will be removed, and the storage will be owned by the psymbol_functions object. This patch is a step toward this goal. The storage is already managed as a shared_ptr, to enable cross-objfile sharing, so this adds a reference from the psymbol_functions, and changes some code in psymtab.c to use this reference instead. gdb/ChangeLog 2021-03-20 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf2_build_psymtabs): Call set_partial_symtabs. * symfile.c (syms_from_objfile_1, reread_symbols): Update. * psymtab.h (make_psymbol_functions): Add partial_symtabs parameter. * psymtab.c (find_pc_sect_psymtab): Add partial_symtabs parameter. (psymbol_functions::find_pc_sect_compunit_symtab) (psymbol_functions::print_stats, psymbol_functions::dump) (psymbol_functions::has_symbols): Update. (make_psymbol_functions, dump_psymtab_addrmap): Add partial_symtabs parameter. (maintenance_print_psymbols): Update. (psymbol_functions::expand_symtabs_matching): Update. * psympriv.h (struct psymbol_functions): Add constructor. <m_partial_symtabs>: New member. <set_partial_symtabs>: New method.
This commit is contained in:
parent
8468590493
commit
17d66340eb
@ -1,3 +1,23 @@
|
|||||||
|
2021-03-20 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* dwarf2/read.c (dwarf2_build_psymtabs): Call
|
||||||
|
set_partial_symtabs.
|
||||||
|
* symfile.c (syms_from_objfile_1, reread_symbols): Update.
|
||||||
|
* psymtab.h (make_psymbol_functions): Add partial_symtabs
|
||||||
|
parameter.
|
||||||
|
* psymtab.c (find_pc_sect_psymtab): Add partial_symtabs
|
||||||
|
parameter.
|
||||||
|
(psymbol_functions::find_pc_sect_compunit_symtab)
|
||||||
|
(psymbol_functions::print_stats, psymbol_functions::dump)
|
||||||
|
(psymbol_functions::has_symbols): Update.
|
||||||
|
(make_psymbol_functions, dump_psymtab_addrmap): Add
|
||||||
|
partial_symtabs parameter.
|
||||||
|
(maintenance_print_psymbols): Update.
|
||||||
|
(psymbol_functions::expand_symtabs_matching): Update.
|
||||||
|
* psympriv.h (struct psymbol_functions): Add constructor.
|
||||||
|
<m_partial_symtabs>: New member.
|
||||||
|
<set_partial_symtabs>: New method.
|
||||||
|
|
||||||
2021-03-20 Tom Tromey <tom@tromey.com>
|
2021-03-20 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* dwarf2/read.c (dwarf2_create_include_psymtab): Add per_bfd
|
* dwarf2/read.c (dwarf2_create_include_psymtab): Add per_bfd
|
||||||
|
@ -6128,6 +6128,12 @@ dwarf2_build_psymtabs (struct objfile *objfile)
|
|||||||
/* Partial symbols were already read, so now we can simply
|
/* Partial symbols were already read, so now we can simply
|
||||||
attach them. */
|
attach them. */
|
||||||
objfile->partial_symtabs = per_bfd->partial_symtabs;
|
objfile->partial_symtabs = per_bfd->partial_symtabs;
|
||||||
|
/* This is a temporary hack to ensure that the objfile and 'qf'
|
||||||
|
psymtabs are identical. */
|
||||||
|
psymbol_functions *psf
|
||||||
|
= dynamic_cast<psymbol_functions *> (objfile->qf.get ());
|
||||||
|
gdb_assert (psf != nullptr);
|
||||||
|
psf->set_partial_symtabs (per_bfd->partial_symtabs);
|
||||||
per_objfile->resize_symtabs ();
|
per_objfile->resize_symtabs ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -476,6 +476,11 @@ class psymtab_discarder
|
|||||||
partial symbols. */
|
partial symbols. */
|
||||||
struct psymbol_functions : public quick_symbol_functions
|
struct psymbol_functions : public quick_symbol_functions
|
||||||
{
|
{
|
||||||
|
explicit psymbol_functions (const std::shared_ptr<psymtab_storage> &storage)
|
||||||
|
: m_partial_symtabs (storage)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
bool has_symbols (struct objfile *objfile) override;
|
bool has_symbols (struct objfile *objfile) override;
|
||||||
|
|
||||||
struct symtab *find_last_source_symtab (struct objfile *objfile) override;
|
struct symtab *find_last_source_symtab (struct objfile *objfile) override;
|
||||||
@ -540,6 +545,13 @@ struct psymbol_functions : public quick_symbol_functions
|
|||||||
m_psymbol_map.clear ();
|
m_psymbol_map.clear ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Replace the partial symbol table storage in this object with
|
||||||
|
SYMS. */
|
||||||
|
void set_partial_symtabs (const std::shared_ptr<psymtab_storage> &syms)
|
||||||
|
{
|
||||||
|
m_partial_symtabs = syms;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void fill_psymbol_map (struct objfile *objfile,
|
void fill_psymbol_map (struct objfile *objfile,
|
||||||
@ -547,6 +559,9 @@ private:
|
|||||||
std::set<CORE_ADDR> *seen_addrs,
|
std::set<CORE_ADDR> *seen_addrs,
|
||||||
const std::vector<partial_symbol *> &symbols);
|
const std::vector<partial_symbol *> &symbols);
|
||||||
|
|
||||||
|
/* Storage for the partial symbols. */
|
||||||
|
std::shared_ptr<psymtab_storage> m_partial_symtabs;
|
||||||
|
|
||||||
/* Map symbol addresses to the partial symtab that defines the
|
/* Map symbol addresses to the partial symtab that defines the
|
||||||
object at that address. */
|
object at that address. */
|
||||||
|
|
||||||
|
@ -275,7 +275,9 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
|
|||||||
psymtab that contains a symbol whose address is closest to PC. */
|
psymtab that contains a symbol whose address is closest to PC. */
|
||||||
|
|
||||||
static struct partial_symtab *
|
static struct partial_symtab *
|
||||||
find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
|
find_pc_sect_psymtab (struct objfile *objfile,
|
||||||
|
psymtab_storage *partial_symtabs,
|
||||||
|
CORE_ADDR pc,
|
||||||
struct obj_section *section,
|
struct obj_section *section,
|
||||||
struct bound_minimal_symbol msymbol)
|
struct bound_minimal_symbol msymbol)
|
||||||
{
|
{
|
||||||
@ -291,14 +293,14 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
|
|||||||
partial symtabs then we will end up returning a pointer to an object
|
partial symtabs then we will end up returning a pointer to an object
|
||||||
that is not a partial_symtab, which doesn't end well. */
|
that is not a partial_symtab, which doesn't end well. */
|
||||||
|
|
||||||
if (objfile->partial_symtabs->psymtabs != NULL
|
if (partial_symtabs->psymtabs != NULL
|
||||||
&& objfile->partial_symtabs->psymtabs_addrmap != NULL)
|
&& partial_symtabs->psymtabs_addrmap != NULL)
|
||||||
{
|
{
|
||||||
CORE_ADDR baseaddr = objfile->text_section_offset ();
|
CORE_ADDR baseaddr = objfile->text_section_offset ();
|
||||||
|
|
||||||
struct partial_symtab *pst
|
struct partial_symtab *pst
|
||||||
= ((struct partial_symtab *)
|
= ((struct partial_symtab *)
|
||||||
addrmap_find (objfile->partial_symtabs->psymtabs_addrmap,
|
addrmap_find (partial_symtabs->psymtabs_addrmap,
|
||||||
pc - baseaddr));
|
pc - baseaddr));
|
||||||
if (pst != NULL)
|
if (pst != NULL)
|
||||||
{
|
{
|
||||||
@ -367,7 +369,9 @@ psymbol_functions::find_pc_sect_compunit_symtab
|
|||||||
struct obj_section *section,
|
struct obj_section *section,
|
||||||
int warn_if_readin)
|
int warn_if_readin)
|
||||||
{
|
{
|
||||||
struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
|
struct partial_symtab *ps = find_pc_sect_psymtab (objfile,
|
||||||
|
m_partial_symtabs.get (),
|
||||||
|
pc, section,
|
||||||
msymbol);
|
msymbol);
|
||||||
if (ps != NULL)
|
if (ps != NULL)
|
||||||
{
|
{
|
||||||
@ -1013,12 +1017,12 @@ psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache)
|
|||||||
printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"),
|
printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"),
|
||||||
i);
|
i);
|
||||||
printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
|
printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
|
||||||
objfile->partial_symtabs->psymbol_cache.memory_used ());
|
m_partial_symtabs->psymbol_cache.memory_used ());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf_filtered (_("Psymbol byte cache statistics:\n"));
|
printf_filtered (_("Psymbol byte cache statistics:\n"));
|
||||||
objfile->partial_symtabs->psymbol_cache.print_statistics
|
m_partial_symtabs->psymbol_cache.print_statistics
|
||||||
("partial symbol cache");
|
("partial symbol cache");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1031,10 +1035,10 @@ psymbol_functions::dump (struct objfile *objfile)
|
|||||||
{
|
{
|
||||||
struct partial_symtab *psymtab;
|
struct partial_symtab *psymtab;
|
||||||
|
|
||||||
if (objfile->partial_symtabs->psymtabs)
|
if (m_partial_symtabs->psymtabs)
|
||||||
{
|
{
|
||||||
printf_filtered ("Psymtabs:\n");
|
printf_filtered ("Psymtabs:\n");
|
||||||
for (psymtab = objfile->partial_symtabs->psymtabs;
|
for (psymtab = m_partial_symtabs->psymtabs;
|
||||||
psymtab != NULL;
|
psymtab != NULL;
|
||||||
psymtab = psymtab->next)
|
psymtab = psymtab->next)
|
||||||
{
|
{
|
||||||
@ -1321,7 +1325,7 @@ psymbol_functions::expand_symtabs_matching
|
|||||||
for (partial_symtab *ps : require_partial_symbols (objfile, true))
|
for (partial_symtab *ps : require_partial_symbols (objfile, true))
|
||||||
ps->searched_flag = PST_NOT_SEARCHED;
|
ps->searched_flag = PST_NOT_SEARCHED;
|
||||||
|
|
||||||
for (partial_symtab *ps : objfile->psymtabs ())
|
for (partial_symtab *ps : m_partial_symtabs->range ())
|
||||||
{
|
{
|
||||||
QUIT;
|
QUIT;
|
||||||
|
|
||||||
@ -1373,7 +1377,7 @@ psymbol_functions::expand_symtabs_matching
|
|||||||
bool
|
bool
|
||||||
psymbol_functions::has_symbols (struct objfile *objfile)
|
psymbol_functions::has_symbols (struct objfile *objfile)
|
||||||
{
|
{
|
||||||
return objfile->partial_symtabs->psymtabs != NULL;
|
return m_partial_symtabs->psymtabs != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper function for psym_find_compunit_symtab_by_address that fills
|
/* Helper function for psym_find_compunit_symtab_by_address that fills
|
||||||
@ -1446,9 +1450,9 @@ psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
|
|||||||
}
|
}
|
||||||
|
|
||||||
quick_symbol_functions_up
|
quick_symbol_functions_up
|
||||||
make_psymbol_functions ()
|
make_psymbol_functions (const std::shared_ptr<psymtab_storage> &storage)
|
||||||
{
|
{
|
||||||
return quick_symbol_functions_up (new psymbol_functions);
|
return quick_symbol_functions_up (new psymbol_functions (storage));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1724,14 +1728,16 @@ dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj)
|
|||||||
of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
|
of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
|
dump_psymtab_addrmap (struct objfile *objfile,
|
||||||
|
psymtab_storage *partial_symtabs,
|
||||||
|
struct partial_symtab *psymtab,
|
||||||
struct ui_file *outfile)
|
struct ui_file *outfile)
|
||||||
{
|
{
|
||||||
struct dump_psymtab_addrmap_data addrmap_dump_data;
|
struct dump_psymtab_addrmap_data addrmap_dump_data;
|
||||||
|
|
||||||
if ((psymtab == NULL
|
if ((psymtab == NULL
|
||||||
|| psymtab->psymtabs_addrmap_supported)
|
|| psymtab->psymtabs_addrmap_supported)
|
||||||
&& objfile->partial_symtabs->psymtabs_addrmap != NULL)
|
&& partial_symtabs->psymtabs_addrmap != NULL)
|
||||||
{
|
{
|
||||||
addrmap_dump_data.objfile = objfile;
|
addrmap_dump_data.objfile = objfile;
|
||||||
addrmap_dump_data.psymtab = psymtab;
|
addrmap_dump_data.psymtab = psymtab;
|
||||||
@ -1739,7 +1745,7 @@ dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
|
|||||||
addrmap_dump_data.previous_matched = 0;
|
addrmap_dump_data.previous_matched = 0;
|
||||||
fprintf_filtered (outfile, "%sddress map:\n",
|
fprintf_filtered (outfile, "%sddress map:\n",
|
||||||
psymtab == NULL ? "Entire a" : " A");
|
psymtab == NULL ? "Entire a" : " A");
|
||||||
addrmap_foreach (objfile->partial_symtabs->psymtabs_addrmap,
|
addrmap_foreach (partial_symtabs->psymtabs_addrmap,
|
||||||
dump_psymtab_addrmap_1, &addrmap_dump_data);
|
dump_psymtab_addrmap_1, &addrmap_dump_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1830,14 +1836,17 @@ maintenance_print_psymbols (const char *args, int from_tty)
|
|||||||
if (!print_for_objfile)
|
if (!print_for_objfile)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
psymtab_storage *partial_symtabs = objfile->partial_symtabs.get ();
|
||||||
|
|
||||||
if (address_arg != NULL)
|
if (address_arg != NULL)
|
||||||
{
|
{
|
||||||
struct bound_minimal_symbol msymbol = { NULL, NULL };
|
struct bound_minimal_symbol msymbol = { NULL, NULL };
|
||||||
|
|
||||||
/* We don't assume each pc has a unique objfile (this is for
|
/* We don't assume each pc has a unique objfile (this is for
|
||||||
debugging). */
|
debugging). */
|
||||||
struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc,
|
struct partial_symtab *ps
|
||||||
section, msymbol);
|
= find_pc_sect_psymtab (objfile, partial_symtabs, pc,
|
||||||
|
section, msymbol);
|
||||||
if (ps != NULL)
|
if (ps != NULL)
|
||||||
{
|
{
|
||||||
if (!printed_objfile_header)
|
if (!printed_objfile_header)
|
||||||
@ -1847,7 +1856,7 @@ maintenance_print_psymbols (const char *args, int from_tty)
|
|||||||
printed_objfile_header = 1;
|
printed_objfile_header = 1;
|
||||||
}
|
}
|
||||||
dump_psymtab (objfile, ps, outfile);
|
dump_psymtab (objfile, ps, outfile);
|
||||||
dump_psymtab_addrmap (objfile, ps, outfile);
|
dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile);
|
||||||
found = 1;
|
found = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1874,7 +1883,8 @@ maintenance_print_psymbols (const char *args, int from_tty)
|
|||||||
printed_objfile_header = 1;
|
printed_objfile_header = 1;
|
||||||
}
|
}
|
||||||
dump_psymtab (objfile, ps, outfile);
|
dump_psymtab (objfile, ps, outfile);
|
||||||
dump_psymtab_addrmap (objfile, ps, outfile);
|
dump_psymtab_addrmap (objfile, partial_symtabs, ps,
|
||||||
|
outfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1886,7 +1896,7 @@ maintenance_print_psymbols (const char *args, int from_tty)
|
|||||||
&& objfile->partial_symtabs->psymtabs_addrmap != NULL)
|
&& objfile->partial_symtabs->psymtabs_addrmap != NULL)
|
||||||
{
|
{
|
||||||
outfile->puts ("\n");
|
outfile->puts ("\n");
|
||||||
dump_psymtab_addrmap (objfile, NULL, outfile);
|
dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,6 +154,7 @@ private:
|
|||||||
extern psymtab_storage::partial_symtab_range require_partial_symbols
|
extern psymtab_storage::partial_symtab_range require_partial_symbols
|
||||||
(struct objfile *objfile, bool verbose);
|
(struct objfile *objfile, bool verbose);
|
||||||
|
|
||||||
extern quick_symbol_functions_up make_psymbol_functions ();
|
extern quick_symbol_functions_up make_psymbol_functions
|
||||||
|
(const std::shared_ptr<psymtab_storage> &);
|
||||||
|
|
||||||
#endif /* PSYMTAB_H */
|
#endif /* PSYMTAB_H */
|
||||||
|
@ -904,7 +904,7 @@ syms_from_objfile_1 (struct objfile *objfile,
|
|||||||
const int mainline = add_flags & SYMFILE_MAINLINE;
|
const int mainline = add_flags & SYMFILE_MAINLINE;
|
||||||
|
|
||||||
objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
|
objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
|
||||||
objfile->qf = make_psymbol_functions ();
|
objfile->qf = make_psymbol_functions (objfile->partial_symtabs);
|
||||||
|
|
||||||
if (objfile->sf == NULL)
|
if (objfile->sf == NULL)
|
||||||
{
|
{
|
||||||
@ -2555,7 +2555,7 @@ reread_symbols (void)
|
|||||||
based on whether .gdb_index is present, and we need it to
|
based on whether .gdb_index is present, and we need it to
|
||||||
start over. PR symtab/15885 */
|
start over. PR symtab/15885 */
|
||||||
objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
|
objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd));
|
||||||
objfile->qf = make_psymbol_functions ();
|
objfile->qf = make_psymbol_functions (objfile->partial_symtabs);
|
||||||
|
|
||||||
build_objfile_section_table (objfile);
|
build_objfile_section_table (objfile);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user