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:
parent
39298a5d97
commit
75336a5a2a
@ -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.
|
||||
|
@ -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. */
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user