Introduce lookup_minimal_symbol_linkage

This introduces a new function, lookup_minimal_symbol_linkage, and
refactors a couple other existing functions to call it.  This function
will be used in a subsequent patch.
This commit is contained in:
Tom Tromey 2022-12-16 13:25:48 -07:00
parent efe2296bde
commit 47ef0ac717
3 changed files with 38 additions and 23 deletions

View File

@ -592,6 +592,28 @@ lookup_minimal_symbol_linkage (const char *name, struct objfile *objf)
/* See minsyms.h. */
struct bound_minimal_symbol
lookup_minimal_symbol_linkage (const char *name, bool only_main)
{
for (objfile *objfile : current_program_space->objfiles ())
{
if (objfile->separate_debug_objfile_backlink != nullptr)
continue;
if (only_main && (objfile->flags & OBJF_MAINLINE) == 0)
continue;
bound_minimal_symbol minsym = lookup_minimal_symbol_linkage (name,
objfile);
if (minsym.minsym != nullptr)
return minsym;
}
return {};
}
/* See minsyms.h. */
struct bound_minimal_symbol
lookup_minimal_symbol_text (const char *name, struct objfile *objf)
{

View File

@ -236,6 +236,14 @@ extern struct bound_minimal_symbol lookup_minimal_symbol_linkage
(const char *name, struct objfile *objf)
ATTRIBUTE_NONNULL (1) ATTRIBUTE_NONNULL (2);
/* A variant of lookup_minimal_symbol_linkage that iterates over all
objfiles. If ONLY_MAIN is true, then only an objfile with
OBJF_MAINLINE will be considered. */
extern struct bound_minimal_symbol lookup_minimal_symbol_linkage
(const char *name, bool only_main)
ATTRIBUTE_NONNULL (1);
/* Look through all the current minimal symbol tables and find the
first minimal symbol that matches NAME and PC. If OBJF is non-NULL,
limit the search to that objfile. Returns a pointer to the minimal

View File

@ -6496,17 +6496,10 @@ get_symbol_address (const struct symbol *sym)
gdb_assert (sym->aclass () == LOC_STATIC);
const char *linkage_name = sym->linkage_name ();
for (objfile *objfile : current_program_space->objfiles ())
{
if (objfile->separate_debug_objfile_backlink != nullptr)
continue;
bound_minimal_symbol minsym
= lookup_minimal_symbol_linkage (linkage_name, objfile);
if (minsym.minsym != nullptr)
return minsym.value_address ();
}
bound_minimal_symbol minsym = lookup_minimal_symbol_linkage (linkage_name,
false);
if (minsym.minsym != nullptr)
return minsym.value_address ();
return sym->m_value.address;
}
@ -6519,18 +6512,10 @@ get_msymbol_address (struct objfile *objf, const struct minimal_symbol *minsym)
gdb_assert ((objf->flags & OBJF_MAINLINE) == 0);
const char *linkage_name = minsym->linkage_name ();
for (objfile *objfile : current_program_space->objfiles ())
{
if (objfile->separate_debug_objfile_backlink == nullptr
&& (objfile->flags & OBJF_MAINLINE) != 0)
{
bound_minimal_symbol found
= lookup_minimal_symbol_linkage (linkage_name, objfile);
if (found.minsym != nullptr)
return found.value_address ();
}
}
bound_minimal_symbol found = lookup_minimal_symbol_linkage (linkage_name,
true);
if (found.minsym != nullptr)
return found.value_address ();
return (minsym->m_value.address
+ objf->section_offsets[minsym->section_index ()]);
}