/* Helper routines for D support in GDB.
- Copyright (C) 2014-2015 Free Software Foundation, Inc.
+ Copyright (C) 2014-2016 Free Software Foundation, Inc.
This file is part of GDB.
symbol. Other arguments are as in d_lookup_symbol_nonlocal. */
static struct block_symbol
-d_lookup_symbol (const char *name, const struct block *block,
+d_lookup_symbol (const struct language_defn *langdef,
+ const char *name, const struct block *block,
const domain_enum domain, int search)
{
struct block_symbol sym;
if (sym.symbol != NULL)
return sym;
+ /* If we didn't find a definition for a builtin type in the static block,
+ such as "ucent" which is a specialist type, search for it now. */
+ if (langdef != NULL && domain == VAR_DOMAIN)
+ {
+ struct gdbarch *gdbarch;
+
+ if (block == NULL)
+ gdbarch = target_gdbarch ();
+ else
+ gdbarch = block_gdbarch (block);
+ sym.symbol
+ = language_lookup_primitive_type_as_symbol (langdef, gdbarch, name);
+ sym.block = NULL;
+ if (sym.symbol != NULL)
+ return sym;
+ }
+
sym = lookup_global_symbol (name, block, domain);
if (sym.symbol != NULL)
if (lang_this.symbol == NULL)
{
do_cleanups (cleanup);
- return (struct block_symbol) {NULL, NULL};
+ return null_block_symbol;
}
type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (lang_this.symbol)));
if (class_sym.symbol == NULL)
{
do_cleanups (cleanup);
- return (struct block_symbol) {NULL, NULL};
+ return null_block_symbol;
}
/* Look for a symbol named NESTED in this class. */
name = concatenated_name;
}
- return d_lookup_symbol (name, block, domain, search);
+ return d_lookup_symbol (NULL, name, block, domain, search);
}
/* Lookup NAME at module scope. SCOPE is the module that the current
and if that call fails, then the first call looks for "x". */
static struct block_symbol
-lookup_module_scope (const char *name, const struct block *block,
+lookup_module_scope (const struct language_defn *langdef,
+ const char *name, const struct block *block,
const domain_enum domain, const char *scope,
int scope_len)
{
new_scope_len++;
}
new_scope_len += d_find_first_component (scope + new_scope_len);
- sym = lookup_module_scope (name, block, domain,
+ sym = lookup_module_scope (langdef, name, block, domain,
scope, new_scope_len);
if (sym.symbol != NULL)
return sym;
}
/* Okay, we didn't find a match in our children, so look for the
- name in the current module. */
+ name in the current module.
+
+ If we there is no scope and we know we have a bare symbol, then short
+ circuit everything and call d_lookup_symbol directly.
+ This isn't an optimization, rather it allows us to pass LANGDEF which
+ is needed for primitive type lookup. */
+
+ if (scope_len == 0 && strchr (name, '.') == NULL)
+ return d_lookup_symbol (langdef, name, block, domain, 1);
module = (char *) alloca (scope_len + 1);
strncpy (module, scope, scope_len);
case TYPE_CODE_FUNC:
case TYPE_CODE_METHOD:
- return (struct block_symbol) {NULL, NULL};
+ return null_block_symbol;
default:
gdb_assert_not_reached ("called with non-aggregate type.");
}
/* Search for NAME by applying all import statements belonging to
- BLOCK which are applicable in SCOPE.
-
- If SEARCH_PARENTS the search will include imports which are
- applicable in parents of SCOPE.
- Example:
-
- module A;
- import X;
- void B() {
- import Y;
- }
-
- If SCOPE is "A.B" and SEARCH_PARENTS is true, the imports of
- modules X and Y will be considered. If SEARCH_PARENTS is false
- only the import of Y is considered. */
+ BLOCK which are applicable in SCOPE. */
static struct block_symbol
d_lookup_symbol_imports (const char *scope, const char *name,
const struct block *block,
- const domain_enum domain,
- const int search_parents)
+ const domain_enum domain)
{
struct using_direct *current;
struct block_symbol sym;
- int directive_match;
struct cleanup *searched_cleanup;
/* First, try to find the symbol in the given module. */
current = current->next)
{
const char **excludep;
- int len = strlen (current->import_dest);
-
- directive_match = (search_parents
- ? (strncmp (scope, current->import_dest, len) == 0
- && (len == 0
- || scope[len] == '.'
- || scope[len] == '\0'))
- : strcmp (scope, current->import_dest) == 0);
-
- /* If the import destination is the current scope or one of its
- ancestors then it is applicable. */
- if (directive_match && !current->searched)
+
+ /* If the import destination is the current scope then search it. */
+ if (!current->searched && strcmp (scope, current->import_dest) == 0)
{
/* Mark this import as searched so that the recursive call
does not search it again. */
/* If the alias matches the sought name. Pass
current->import_src as the NAME to direct the
search towards the aliased module. */
- sym = lookup_module_scope (current->import_src, block,
+ sym = lookup_module_scope (NULL, current->import_src, block,
domain, scope, 0);
}
else
{
/* Skip the '.' */
name_scope++;
- sym = d_lookup_symbol_imports (current->import_src,
- name + name_scope,
- block, domain, 0);
+ sym = d_lookup_symbol_in_module (current->import_src,
+ name + name_scope,
+ block, domain, 1);
}
}
}
/* If this import statement creates no alias, pass
current->import_src as MODULE to direct the search
towards the imported module. */
- sym = d_lookup_symbol_imports (current->import_src,
- name, block, domain, 0);
+ sym = d_lookup_symbol_in_module (current->import_src,
+ name, block, domain, 1);
}
current->searched = 0;
discard_cleanups (searched_cleanup);
}
}
- return (struct block_symbol) {NULL, NULL};
+ return null_block_symbol;
}
/* Searches for NAME in the current module, and by applying relevant
blocks. */
while (block != NULL)
{
- sym = d_lookup_symbol_imports (scope, name, block, domain, 1);
+ sym = d_lookup_symbol_imports (scope, name, block, domain);
if (sym.symbol != NULL)
return sym;
block = BLOCK_SUPERBLOCK (block);
}
- return (struct block_symbol) {NULL, NULL};
+ return null_block_symbol;
}
/* The D-specific version of name lookup for static and global names
struct block_symbol sym;
const char *scope = block_scope (block);
- sym = lookup_module_scope (name, block, domain, scope, 0);
+ sym = lookup_module_scope (langdef, name, block, domain, scope, 0);
if (sym.symbol != NULL)
return sym;