Move psymbol_map out of objfile

objfile::psymbol_map is used to implement a Rust feature.  It is
currently specific to partial symbols -- it isn't used by the DWARF
indices.

This patch moves it out of objfile and into psymbol_functions, adding
a new method to quick_symbol_functions to handle the clearing case.
This is needed because the map holds unrelocated addresses.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

	* quick-symbol.h (struct quick_symbol_functions)
	<relocated>: New method.
	* psymtab.h (struct psymbol_functions) <relocated>: New
	method.
	<fill_psymbol_map>: Declare method.
	<m_psymbol_map>: New member.
	* psymtab.c (psymbol_functions::fill_psymbol_map): Rename.
	(psymbol_functions::find_compunit_symtab_by_address): Update.
	* objfiles.h (reset_psymtabs): Don't clear psymbol_map.
	(struct objfile) <psymbol_map>: Remove.
	* objfiles.c (objfile_relocate1): Update.
This commit is contained in:
Tom Tromey 2021-03-20 17:23:40 -06:00
parent 39298a5d97
commit 75336a5a2a
6 changed files with 60 additions and 27 deletions

View File

@ -1,3 +1,17 @@
2021-03-20 Tom Tromey <tom@tromey.com>
* quick-symbol.h (struct quick_symbol_functions)
<relocated>: New method.
* psymtab.h (struct psymbol_functions) <relocated>: New
method.
<fill_psymbol_map>: Declare method.
<m_psymbol_map>: New member.
* psymtab.c (psymbol_functions::fill_psymbol_map): Rename.
(psymbol_functions::find_compunit_symtab_by_address): Update.
* objfiles.h (reset_psymtabs): Don't clear psymbol_map.
(struct objfile) <psymbol_map>: Remove.
* objfiles.c (objfile_relocate1): Update.
2021-03-20 Tom Tromey <tom@tromey.com>
* psympriv.h (struct psymbol_functions): New.

View File

@ -703,9 +703,9 @@ objfile_relocate1 (struct objfile *objfile,
}
}
/* This stores relocated addresses and so must be cleared. This
will cause it to be recreated on demand. */
objfile->psymbol_map.clear ();
/* Notify the quick symbol object. */
if (objfile->qf)
objfile->qf->relocated ();
/* Relocate isolated symbols. */
{

View File

@ -459,7 +459,6 @@ public:
void reset_psymtabs ()
{
psymbol_map.clear ();
partial_symtabs.reset (new psymtab_storage ());
}
@ -665,11 +664,6 @@ public:
struct obstack objfile_obstack {};
/* Map symbol addresses to the partial symtab that defines the
object at that address. */
std::vector<std::pair<CORE_ADDR, partial_symtab *>> psymbol_map;
/* Structure which keeps track of functions that manipulate objfile's
of the same type as this objfile. I.e. the function to read partial
symbols for example. Note that this structure is in statically

View File

@ -535,6 +535,23 @@ struct psymbol_functions : public quick_symbol_functions
void map_symbol_filenames (struct objfile *objfile,
symbol_filename_ftype *fun, void *data,
int need_fullname) override;
void relocated () override
{
m_psymbol_map.clear ();
}
private:
void fill_psymbol_map (struct objfile *objfile,
struct partial_symtab *psymtab,
std::set<CORE_ADDR> *seen_addrs,
const std::vector<partial_symbol *> &symbols);
/* Map symbol addresses to the partial symtab that defines the
object at that address. */
std::vector<std::pair<CORE_ADDR, partial_symtab *>> m_psymbol_map;
};
#endif /* PSYMPRIV_H */

View File

@ -1346,13 +1346,14 @@ psymbol_functions::has_symbols (struct objfile *objfile)
}
/* Helper function for psym_find_compunit_symtab_by_address that fills
in psymbol_map for a given range of psymbols. */
in m_psymbol_map for a given range of psymbols. */
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)
void
psymbol_functions::fill_psymbol_map
(struct objfile *objfile,
struct partial_symtab *psymtab,
std::set<CORE_ADDR> *seen_addrs,
const std::vector<partial_symbol *> &symbols)
{
for (partial_symbol *psym : symbols)
{
@ -1362,7 +1363,7 @@ psym_fill_psymbol_map (struct objfile *objfile,
if (seen_addrs->find (addr) == seen_addrs->end ())
{
seen_addrs->insert (addr);
objfile->psymbol_map.emplace_back (addr, psymtab);
m_psymbol_map.emplace_back (addr, psymtab);
}
}
}
@ -1375,23 +1376,23 @@ compunit_symtab *
psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
CORE_ADDR address)
{
if (objfile->psymbol_map.empty ())
if (m_psymbol_map.empty ())
{
std::set<CORE_ADDR> seen_addrs;
for (partial_symtab *pst : require_partial_symbols (objfile, true))
{
psym_fill_psymbol_map (objfile, pst,
&seen_addrs,
pst->global_psymbols);
psym_fill_psymbol_map (objfile, pst,
&seen_addrs,
pst->static_psymbols);
fill_psymbol_map (objfile, pst,
&seen_addrs,
pst->global_psymbols);
fill_psymbol_map (objfile, pst,
&seen_addrs,
pst->static_psymbols);
}
objfile->psymbol_map.shrink_to_fit ();
m_psymbol_map.shrink_to_fit ();
std::sort (objfile->psymbol_map.begin (), objfile->psymbol_map.end (),
std::sort (m_psymbol_map.begin (), m_psymbol_map.end (),
[] (const std::pair<CORE_ADDR, partial_symtab *> &a,
const std::pair<CORE_ADDR, partial_symtab *> &b)
{
@ -1400,14 +1401,14 @@ psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
}
auto iter = std::lower_bound
(objfile->psymbol_map.begin (), objfile->psymbol_map.end (), address,
(m_psymbol_map.begin (), m_psymbol_map.end (), address,
[] (const std::pair<CORE_ADDR, partial_symtab *> &a,
CORE_ADDR b)
{
return a.first < b;
});
if (iter == objfile->psymbol_map.end () || iter->first != address)
if (iter == m_psymbol_map.end () || iter->first != address)
return NULL;
return psymtab_to_symtab (objfile, iter->second);

View File

@ -228,6 +228,13 @@ struct quick_symbol_functions
virtual void map_symbol_filenames (struct objfile *objfile,
symbol_filename_ftype *fun, void *data,
int need_fullname) = 0;
/* This is called when the objfile is relocated. It can be used to
clean up any internal caches. */
virtual void relocated ()
{
/* Do nothing. */
}
};
typedef std::unique_ptr<quick_symbol_functions> quick_symbol_functions_up;