diff options
author | Tom Tromey <tromey@adacore.com> | 2024-05-23 10:30:16 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2024-06-14 10:56:37 -0600 |
commit | 9c23c0df0dc47560bf3e253186e0192bc9630c80 (patch) | |
tree | 4cea3ce9ced69d0bc04132df6975519929910014 | |
parent | b2cb4b4005e88bf31ced0c899527b374a9abcfca (diff) | |
download | gdb-9c23c0df0dc47560bf3e253186e0192bc9630c80.zip gdb-9c23c0df0dc47560bf3e253186e0192bc9630c80.tar.gz gdb-9c23c0df0dc47560bf3e253186e0192bc9630c80.tar.bz2 |
Introduce language_defn::lookup_symbol_local
This introduces the new method language_defn::lookup_symbol_local, and
then changes lookup_symbol_local to use it. This removes an explicit
language check from this function, and makes it easier for other
languages to hook into this code.
-rw-r--r-- | gdb/c-lang.c | 11 | ||||
-rw-r--r-- | gdb/f-lang.c | 11 | ||||
-rw-r--r-- | gdb/f-lang.h | 8 | ||||
-rw-r--r-- | gdb/language.h | 17 | ||||
-rw-r--r-- | gdb/symtab.c | 22 |
5 files changed, 56 insertions, 13 deletions
diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 2b6cf08..24cdde6 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -1014,6 +1014,17 @@ public: /* See language.h. */ + struct block_symbol lookup_symbol_local + (const char *scope, + const char *name, + const struct block *block, + const domain_search_flags domain) const override + { + return cp_lookup_symbol_imports (scope, name, block, domain); + } + + /* See language.h. */ + struct block_symbol lookup_symbol_nonlocal (const char *name, const struct block *block, const domain_search_flags domain) const override diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 58f35bf..db96753 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -1712,6 +1712,17 @@ f_language::search_name_hash (const char *name) const /* See language.h. */ struct block_symbol +f_language::lookup_symbol_local (const char *scope, + const char *name, + const struct block *block, + const domain_search_flags domain) const +{ + return cp_lookup_symbol_imports (scope, name, block, domain); +} + +/* See language.h. */ + +struct block_symbol f_language::lookup_symbol_nonlocal (const char *name, const struct block *block, const domain_search_flags domain) const diff --git a/gdb/f-lang.h b/gdb/f-lang.h index c203425..6b3962f 100644 --- a/gdb/f-lang.h +++ b/gdb/f-lang.h @@ -140,6 +140,14 @@ public: /* See language.h. */ + struct block_symbol lookup_symbol_local + (const char *scope, + const char *name, + const struct block *block, + const domain_search_flags domain) const override; + + /* See language.h. */ + struct block_symbol lookup_symbol_nonlocal (const char *name, const struct block *block, const domain_search_flags domain) const override; diff --git a/gdb/language.h b/gdb/language.h index e67150d..a2ce169 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -507,6 +507,23 @@ struct language_defn (tracker, mode, name_match_type, text, word, "", code); } + /* This is called by lookup_local_symbol after checking a block. It + can be used by a language to augment the local lookup, for + instance for searching imported namespaces. SCOPE is the current + scope (from block::scope), NAME is the name being searched for, + BLOCK is the block being searched, and DOMAIN is the search + domain. Returns a block symbol, or an empty block symbol if not + found. */ + + virtual struct block_symbol lookup_symbol_local + (const char *scope, + const char *name, + const struct block *block, + const domain_search_flags domain) const + { + return {}; + } + /* This is a function that lookup_symbol will call when it gets to the part of symbol lookup where C looks up static and global variables. This default implements the basic C lookup rules. */ diff --git a/gdb/symtab.c b/gdb/symtab.c index c65d562..4888ebc 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -93,7 +93,7 @@ struct block_symbol lookup_local_symbol (const char *name, symbol_name_match_type match_type, const struct block *block, const domain_search_flags domain, - enum language language); + const struct language_defn *langdef); static struct block_symbol lookup_symbol_in_objfile (struct objfile *objfile, @@ -2140,10 +2140,12 @@ lookup_symbol_aux (const char *name, symbol_name_match_type match_type, if (is_a_field_of_this != NULL) memset (is_a_field_of_this, 0, sizeof (*is_a_field_of_this)); + langdef = language_def (language); + /* Search specified block and its superiors. Don't search STATIC_BLOCK or GLOBAL_BLOCK. */ - result = lookup_local_symbol (name, match_type, block, domain, language); + result = lookup_local_symbol (name, match_type, block, domain, langdef); if (result.symbol != NULL) { symbol_lookup_debug_printf @@ -2155,8 +2157,6 @@ lookup_symbol_aux (const char *name, symbol_name_match_type match_type, /* If requested to do so by the caller and if appropriate for LANGUAGE, check to see if NAME is a field of `this'. */ - langdef = language_def (language); - /* Don't do this check if we are searching for a struct. It will not be found by check_field, but will be found by other means. */ @@ -2217,7 +2217,7 @@ lookup_local_symbol (const char *name, symbol_name_match_type match_type, const struct block *block, const domain_search_flags domain, - enum language language) + const struct language_defn *langdef) { if (block == nullptr) return {}; @@ -2242,14 +2242,10 @@ lookup_local_symbol (const char *name, return (struct block_symbol) {sym, block}; } - if (language == language_cplus || language == language_fortran) - { - struct block_symbol blocksym - = cp_lookup_symbol_imports (scope, name, block, domain); - - if (blocksym.symbol != NULL) - return blocksym; - } + struct block_symbol blocksym + = langdef->lookup_symbol_local (scope, name, block, domain); + if (blocksym.symbol != nullptr) + return blocksym; if (block->inlined_p ()) break; |