aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2024-05-23 10:30:16 -0600
committerTom Tromey <tromey@adacore.com>2024-06-14 10:56:37 -0600
commit9c23c0df0dc47560bf3e253186e0192bc9630c80 (patch)
tree4cea3ce9ced69d0bc04132df6975519929910014 /gdb
parentb2cb4b4005e88bf31ced0c899527b374a9abcfca (diff)
downloadgdb-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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/c-lang.c11
-rw-r--r--gdb/f-lang.c11
-rw-r--r--gdb/f-lang.h8
-rw-r--r--gdb/language.h17
-rw-r--r--gdb/symtab.c22
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;