From 47ef0ac717f93b330dc475647f069bf64f7da862 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 16 Dec 2022 13:25:48 -0700 Subject: [PATCH] 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. --- gdb/minsyms.c | 22 ++++++++++++++++++++++ gdb/minsyms.h | 8 ++++++++ gdb/symtab.c | 31 ++++++++----------------------- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/gdb/minsyms.c b/gdb/minsyms.c index c062344efa1..1d778822858 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -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) { diff --git a/gdb/minsyms.h b/gdb/minsyms.h index 59c276f01f3..f3a2474c796 100644 --- a/gdb/minsyms.h +++ b/gdb/minsyms.h @@ -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 diff --git a/gdb/symtab.c b/gdb/symtab.c index 5e85c53d550..2a15a61d0f2 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -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 ()]); } -- 2.30.2