mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
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.
This commit is contained in:
parent
b2cb4b4005
commit
9c23c0df0d
11
gdb/c-lang.c
11
gdb/c-lang.c
@ -1014,6 +1014,17 @@ class cplus_language : public language_defn
|
||||
|
||||
/* 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
|
||||
|
11
gdb/f-lang.c
11
gdb/f-lang.c
@ -1711,6 +1711,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,
|
||||
|
@ -140,6 +140,14 @@ class f_language : public language_defn
|
||||
|
||||
/* 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;
|
||||
|
@ -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. */
|
||||
|
22
gdb/symtab.c
22
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;
|
||||
|
Loading…
Reference in New Issue
Block a user