Fix gdb.ada/import.exp when using mold

We found that the gdb.ada/import.exp test fails when 'mold' is used as
the linker.  This happens because mold decides to mark most of the
symbols in the executable as being file-local.  I tend to think this
choice, while non-traditional, is probably fine.  So, this patch fixes
the problem by changing the relevant Ada code to look for file-local
symbols as well.

Furthermore, there are two overloads of lookup_minimal_symbol_linkage
that both have a final 'bool' parameter -- but with radically
different meanings.  This patch somewhat clears up this confusion as
well.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31378
This commit is contained in:
Tom Tromey
2025-01-13 10:39:50 -07:00
parent d2030a099b
commit ae700d95c6
4 changed files with 10 additions and 9 deletions

View File

@@ -36,7 +36,8 @@ ada_imported_read_variable (struct symbol *symbol, const frame_info_ptr &frame)
{ {
const char *name = get_imported_name (symbol); const char *name = get_imported_name (symbol);
bound_minimal_symbol minsym bound_minimal_symbol minsym
= lookup_minimal_symbol_linkage (symbol->objfile ()->pspace (), name, false); = lookup_minimal_symbol_linkage (symbol->objfile ()->pspace (), name,
true, false);
if (minsym.minsym == nullptr) if (minsym.minsym == nullptr)
error (_("could not find imported name %s"), name); error (_("could not find imported name %s"), name);
return value_at (symbol->type (), minsym.value_address ()); return value_at (symbol->type (), minsym.value_address ());

View File

@@ -589,7 +589,7 @@ lookup_minimal_symbol_linkage (const char *name, struct objfile *objf,
bound_minimal_symbol bound_minimal_symbol
lookup_minimal_symbol_linkage (program_space *pspace, const char *name, lookup_minimal_symbol_linkage (program_space *pspace, const char *name,
bool only_main) bool match_static_type, bool only_main)
{ {
for (objfile *objfile : pspace->objfiles ()) for (objfile *objfile : pspace->objfiles ())
{ {
@@ -599,9 +599,8 @@ lookup_minimal_symbol_linkage (program_space *pspace, const char *name,
if (only_main && (objfile->flags & OBJF_MAINLINE) == 0) if (only_main && (objfile->flags & OBJF_MAINLINE) == 0)
continue; continue;
bound_minimal_symbol minsym = lookup_minimal_symbol_linkage (name, bound_minimal_symbol minsym
objfile, = lookup_minimal_symbol_linkage (name, objfile, match_static_type);
false);
if (minsym.minsym != nullptr) if (minsym.minsym != nullptr)
return minsym; return minsym;
} }

View File

@@ -240,8 +240,8 @@ extern bound_minimal_symbol lookup_minimal_symbol_linkage
OBJF_MAINLINE will be considered. */ OBJF_MAINLINE will be considered. */
extern bound_minimal_symbol lookup_minimal_symbol_linkage extern bound_minimal_symbol lookup_minimal_symbol_linkage
(program_space *pspace, const char *name, bool only_main) (program_space *pspace, const char *name, bool match_static_type,
ATTRIBUTE_NONNULL (1); bool only_main) ATTRIBUTE_NONNULL (1);
/* Look through all the current minimal symbol tables and find the /* Look through all the current minimal symbol tables and find the
first minimal symbol that matches NAME and PC. If OBJF is non-NULL, first minimal symbol that matches NAME and PC. If OBJF is non-NULL,

View File

@@ -6817,7 +6817,7 @@ symbol::get_maybe_copied_address () const
const char *linkage_name = this->linkage_name (); const char *linkage_name = this->linkage_name ();
bound_minimal_symbol minsym bound_minimal_symbol minsym
= lookup_minimal_symbol_linkage (this->objfile ()->pspace (), linkage_name, = lookup_minimal_symbol_linkage (this->objfile ()->pspace (), linkage_name,
false); false, false);
if (minsym.minsym != nullptr) if (minsym.minsym != nullptr)
return minsym.value_address (); return minsym.value_address ();
@@ -6834,7 +6834,8 @@ minimal_symbol::get_maybe_copied_address (objfile *objf) const
const char *linkage_name = this->linkage_name (); const char *linkage_name = this->linkage_name ();
bound_minimal_symbol found bound_minimal_symbol found
= lookup_minimal_symbol_linkage (objf->pspace (), linkage_name, true); = lookup_minimal_symbol_linkage (objf->pspace (), linkage_name,
false, true);
if (found.minsym != nullptr) if (found.minsym != nullptr)
return found.value_address (); return found.value_address ();