From: Tom Tromey Date: Tue, 31 Dec 2024 17:30:15 +0000 (-0700) Subject: Simplify basic_lookup_transparent_type X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ce889924a72ac43e6792972f07082a4fa1f32d49;p=thirdparty%2Fbinutils-gdb.git Simplify basic_lookup_transparent_type This patch changes basic_lookup_transparent_type to always work via the "quick" API -- that is, no separate search of the already-expanded symtabs is needed. This is more efficient when many CUs have already been expanded. It also makes the lookup more consistent, as the result is no longer dependent on the order in which CUs were previously expanded. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16994 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16998 Acked-By: Simon Marchi --- diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 0e3cb07c3d3..6da4cb55701 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -6467,7 +6467,7 @@ ada_get_tsd_type (struct inferior *inf) if (data->tsd_type == 0) data->tsd_type - = lookup_transparent_type ("", + = lookup_transparent_type ("ada.tags.type_specific_data", SEARCH_TYPE_DOMAIN); return data->tsd_type; } diff --git a/gdb/symtab.c b/gdb/symtab.c index 9f6797118b5..ae004b9411b 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -2766,35 +2766,6 @@ basic_lookup_transparent_type_quick (struct objfile *objfile, return sym->type (); } -/* Subroutine of basic_lookup_transparent_type to simplify it. - Look up the non-opaque definition of NAME in BLOCK_INDEX of OBJFILE. - BLOCK_INDEX is either GLOBAL_BLOCK or STATIC_BLOCK. */ - -static struct type * -basic_lookup_transparent_type_1 (struct objfile *objfile, - enum block_enum block_index, - domain_search_flags flags, - const lookup_name_info &name) -{ - const struct blockvector *bv; - const struct block *block; - const struct symbol *sym; - - for (compunit_symtab *cust : objfile->compunits ()) - { - bv = cust->blockvector (); - block = bv->block (block_index); - sym = block_find_symbol (block, name, flags, nullptr); - if (sym != nullptr) - { - gdb_assert (!TYPE_IS_OPAQUE (sym->type ())); - return sym->type (); - } - } - - return NULL; -} - /* The standard implementation of lookup_transparent_type. This code was modeled on lookup_symbol -- the parts not relevant to looking up types were just left out. In particular it's assumed here that @@ -2808,19 +2779,7 @@ basic_lookup_transparent_type (const char *name, domain_search_flags flags) lookup_name_info lookup_name (name, symbol_name_match_type::FULL); - /* Now search all the global symbols. Do the symtab's first, then - check the psymtab's. If a psymtab indicates the existence - of the desired name as a global, then do psymtab-to-symtab - conversion on the fly and return the found symbol. */ - - for (objfile *objfile : current_program_space->objfiles ()) - { - t = basic_lookup_transparent_type_1 (objfile, GLOBAL_BLOCK, - flags, lookup_name); - if (t) - return t; - } - + /* Search all the global symbols. */ for (objfile *objfile : current_program_space->objfiles ()) { t = basic_lookup_transparent_type_quick (objfile, GLOBAL_BLOCK, @@ -2829,21 +2788,8 @@ basic_lookup_transparent_type (const char *name, domain_search_flags flags) return t; } - /* Now search the static file-level symbols. - Not strictly correct, but more useful than an error. - Do the symtab's first, then - check the psymtab's. If a psymtab indicates the existence - of the desired name as a file-level static, then do psymtab-to-symtab - conversion on the fly and return the found symbol. */ - - for (objfile *objfile : current_program_space->objfiles ()) - { - t = basic_lookup_transparent_type_1 (objfile, STATIC_BLOCK, - flags, lookup_name); - if (t) - return t; - } - + /* Now search the static file-level symbols. Not strictly correct, + but more useful than an error. */ for (objfile *objfile : current_program_space->objfiles ()) { t = basic_lookup_transparent_type_quick (objfile, STATIC_BLOCK,