* symtab.h (lookup_type_symbol): Declare.
* symtab.c (lookup_symbol_in_language_full): Rename from lookup_symbol_in_language. Add 'for_type' argument. (lookup_symbol_in_language): New function. (lookup_type_symbol): Likewise. (lookup_symbol_aux): Add 'for_type' argument. (match_symbol_aux): New function. (lookup_symbol_aux_symtabs): Use expand_one_symtab_matching. (match_transparent_type): New function. (basic_lookup_transparent_type): Use expand_one_symtab_matching. * symfile.h (struct quick_symbol_functions) <pre_expand_symtabs_matching>: Remove. <expand_one_symtab_matching>: New field. * psymtab.c (expand_one_symtab_matching_psymtabs): New function. (pre_expand_symtabs_matching_psymtabs): Remove. (psym_functions): Update. * gdbtypes.c (lookup_typename): Use lookup_type_symbol. * dwarf2read.c (dw2_lookup_symbol): Update comment. (dw2_pre_expand_symtabs_matching): Remove. (dw2_expand_one_symtab_matching): New function. (dwarf2_gdb_index_functions): Update.
This commit is contained in:
parent
248c9dbc16
commit
faf68db746
|
@ -1,3 +1,27 @@
|
|||
2010-09-01 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* symtab.h (lookup_type_symbol): Declare.
|
||||
* symtab.c (lookup_symbol_in_language_full): Rename from
|
||||
lookup_symbol_in_language. Add 'for_type' argument.
|
||||
(lookup_symbol_in_language): New function.
|
||||
(lookup_type_symbol): Likewise.
|
||||
(lookup_symbol_aux): Add 'for_type' argument.
|
||||
(match_symbol_aux): New function.
|
||||
(lookup_symbol_aux_symtabs): Use expand_one_symtab_matching.
|
||||
(match_transparent_type): New function.
|
||||
(basic_lookup_transparent_type): Use expand_one_symtab_matching.
|
||||
* symfile.h (struct quick_symbol_functions)
|
||||
<pre_expand_symtabs_matching>: Remove.
|
||||
<expand_one_symtab_matching>: New field.
|
||||
* psymtab.c (expand_one_symtab_matching_psymtabs): New function.
|
||||
(pre_expand_symtabs_matching_psymtabs): Remove.
|
||||
(psym_functions): Update.
|
||||
* gdbtypes.c (lookup_typename): Use lookup_type_symbol.
|
||||
* dwarf2read.c (dw2_lookup_symbol): Update comment.
|
||||
(dw2_pre_expand_symtabs_matching): Remove.
|
||||
(dw2_expand_one_symtab_matching): New function.
|
||||
(dwarf2_gdb_index_functions): Update.
|
||||
|
||||
2010-09-01 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* NEWS: Add entry announcing GDBserver support on powerpc-lynxos.
|
||||
|
|
|
@ -2198,7 +2198,7 @@ static struct symtab *
|
|||
dw2_lookup_symbol (struct objfile *objfile, int block_index,
|
||||
const char *name, domain_enum domain)
|
||||
{
|
||||
/* We do all the work in the pre_expand_symtabs_matching hook
|
||||
/* We do all the work in the expand_one_symtab_matching hook
|
||||
instead. */
|
||||
return NULL;
|
||||
}
|
||||
|
@ -2229,12 +2229,46 @@ dw2_do_expand_symtabs_matching (struct objfile *objfile, const char *name)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dw2_pre_expand_symtabs_matching (struct objfile *objfile,
|
||||
int kind, const char *name,
|
||||
domain_enum domain)
|
||||
static struct symbol *
|
||||
dw2_expand_one_symtab_matching (struct objfile *objfile,
|
||||
int kind, const char *name,
|
||||
domain_enum domain,
|
||||
struct symbol *(*matcher) (struct symtab *,
|
||||
int,
|
||||
const char *,
|
||||
domain_enum,
|
||||
void *),
|
||||
void *data)
|
||||
{
|
||||
dw2_do_expand_symtabs_matching (objfile, name);
|
||||
dw2_setup (objfile);
|
||||
|
||||
if (dwarf2_per_objfile->index_table)
|
||||
{
|
||||
offset_type *vec;
|
||||
|
||||
if (find_slot_in_mapped_hash (dwarf2_per_objfile->index_table,
|
||||
name, &vec))
|
||||
{
|
||||
offset_type i, len = MAYBE_SWAP (*vec);
|
||||
for (i = 0; i < len; ++i)
|
||||
{
|
||||
offset_type cu_index = MAYBE_SWAP (vec[i + 1]);
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (cu_index);
|
||||
struct symtab *symtab;
|
||||
struct symbol *sym;
|
||||
|
||||
if (cu->v.quick->symtab)
|
||||
continue;
|
||||
|
||||
symtab = dw2_instantiate_symtab (objfile, cu);
|
||||
sym = matcher (symtab, kind, name, domain, data);
|
||||
if (sym)
|
||||
return sym;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2538,7 +2572,7 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions =
|
|||
dw2_forget_cached_source_info,
|
||||
dw2_lookup_symtab,
|
||||
dw2_lookup_symbol,
|
||||
dw2_pre_expand_symtabs_matching,
|
||||
dw2_expand_one_symtab_matching,
|
||||
dw2_print_stats,
|
||||
dw2_dump,
|
||||
dw2_relocate,
|
||||
|
|
|
@ -1051,7 +1051,7 @@ lookup_typename (const struct language_defn *language,
|
|||
struct symbol *sym;
|
||||
struct type *tmp;
|
||||
|
||||
sym = lookup_symbol (name, block, VAR_DOMAIN, 0);
|
||||
sym = lookup_type_symbol (name, block, VAR_DOMAIN, language->la_language);
|
||||
if (sym == NULL || SYMBOL_CLASS (sym) != LOC_TYPEDEF)
|
||||
{
|
||||
tmp = language_lookup_primitive_type_by_name (language, gdbarch, name);
|
||||
|
|
|
@ -426,12 +426,18 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
pre_expand_symtabs_matching_psymtabs (struct objfile *objfile,
|
||||
int kind, const char *name,
|
||||
domain_enum domain)
|
||||
static struct symbol *
|
||||
expand_one_symtab_matching_psymtabs (struct objfile *objfile,
|
||||
int kind, const char *name,
|
||||
domain_enum domain,
|
||||
struct symbol *(*matcher) (struct symtab *,
|
||||
int,
|
||||
const char *,
|
||||
domain_enum,
|
||||
void *),
|
||||
void *data)
|
||||
{
|
||||
/* Nothing. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Look, in partial_symtab PST, for symbol whose natural name is NAME.
|
||||
|
@ -1212,7 +1218,7 @@ const struct quick_symbol_functions psym_functions =
|
|||
forget_cached_source_info_partial,
|
||||
lookup_symtab_via_partial_symtab,
|
||||
lookup_symbol_aux_psymtabs,
|
||||
pre_expand_symtabs_matching_psymtabs,
|
||||
expand_one_symtab_matching_psymtabs,
|
||||
print_psymtab_stats_for_objfile,
|
||||
dump_psymtabs_for_objfile,
|
||||
relocate_psymtabs,
|
||||
|
|
|
@ -171,14 +171,25 @@ struct quick_symbol_functions
|
|||
int kind, const char *name,
|
||||
domain_enum domain);
|
||||
|
||||
/* This is called to expand symbol tables before looking up a
|
||||
symbol. A backend can choose to implement this and then have its
|
||||
`lookup_symbol' hook always return NULL, or the reverse. (It
|
||||
doesn't make sense to implement both.) The arguments are as for
|
||||
`lookup_symbol'. */
|
||||
void (*pre_expand_symtabs_matching) (struct objfile *objfile,
|
||||
int kind, const char *name,
|
||||
domain_enum domain);
|
||||
/* Expand each symbol table in OBJFILE that may have items matching
|
||||
KIND, NAME, and DOMAIN -- these arguments are as for
|
||||
`lookup_symbol'. For each such symbol table, call MATCHER with
|
||||
the symbol table and DATA arguments. If MATCHER returns NULL,
|
||||
keep going. Otherwise, return the result of MATCHER. If MATCHER
|
||||
never returns non-NULL, return NULL. A backend can choose to
|
||||
implement this and then have its `lookup_symbol' hook always
|
||||
return NULL, or the reverse. (It doesn't make sense to implement
|
||||
both.) */
|
||||
struct symbol *(*expand_one_symtab_matching)
|
||||
(struct objfile *objfile,
|
||||
int kind, const char *name,
|
||||
domain_enum domain,
|
||||
struct symbol *(*matcher) (struct symtab *symtab,
|
||||
int kind,
|
||||
const char *name,
|
||||
domain_enum domain,
|
||||
void *data),
|
||||
void *data);
|
||||
|
||||
/* Print statistics about any indices loaded for OBJFILE. The
|
||||
statistics should be printed to gdb_stdout. This is used for
|
||||
|
|
167
gdb/symtab.c
167
gdb/symtab.c
|
@ -91,7 +91,8 @@ static struct symbol *lookup_symbol_aux (const char *name,
|
|||
const struct block *block,
|
||||
const domain_enum domain,
|
||||
enum language language,
|
||||
int *is_a_field_of_this);
|
||||
int *is_a_field_of_this,
|
||||
int for_type);
|
||||
|
||||
static
|
||||
struct symbol *lookup_symbol_aux_local (const char *name,
|
||||
|
@ -994,6 +995,8 @@ fixup_symbol_section (struct symbol *sym, struct objfile *objfile)
|
|||
C++: if IS_A_FIELD_OF_THIS is nonzero on entry, check to see if
|
||||
NAME is a field of the current implied argument `this'. If so set
|
||||
*IS_A_FIELD_OF_THIS to 1, otherwise set it to zero.
|
||||
FOR_TYPE is non-zero if searching specifically for a type; zero
|
||||
otherwise.
|
||||
BLOCK_FOUND is set to the block in which NAME is found (in the case of
|
||||
a field of `this', value_of_this sets BLOCK_FOUND to the proper value.) */
|
||||
|
||||
|
@ -1007,10 +1010,10 @@ fixup_symbol_section (struct symbol *sym, struct objfile *objfile)
|
|||
variable and thus can probably assume it will never hit the C++
|
||||
code). */
|
||||
|
||||
struct symbol *
|
||||
lookup_symbol_in_language (const char *name, const struct block *block,
|
||||
const domain_enum domain, enum language lang,
|
||||
int *is_a_field_of_this)
|
||||
static struct symbol *
|
||||
lookup_symbol_in_language_full (const char *name, const struct block *block,
|
||||
const domain_enum domain, enum language lang,
|
||||
int *is_a_field_of_this, int for_type)
|
||||
{
|
||||
char *demangled_name = NULL;
|
||||
const char *modified_name = NULL;
|
||||
|
@ -1075,12 +1078,41 @@ lookup_symbol_in_language (const char *name, const struct block *block,
|
|||
}
|
||||
|
||||
returnval = lookup_symbol_aux (modified_name, block, domain, lang,
|
||||
is_a_field_of_this);
|
||||
is_a_field_of_this, for_type);
|
||||
do_cleanups (cleanup);
|
||||
|
||||
return returnval;
|
||||
}
|
||||
|
||||
/* Find the definition for a specified symbol name NAME
|
||||
in domain DOMAIN, visible from lexical block BLOCK.
|
||||
Returns the struct symbol pointer, or zero if no symbol is found.
|
||||
C++: if IS_A_FIELD_OF_THIS is nonzero on entry, check to see if
|
||||
NAME is a field of the current implied argument `this'. If so set
|
||||
*IS_A_FIELD_OF_THIS to 1, otherwise set it to zero.
|
||||
BLOCK_FOUND is set to the block in which NAME is found (in the case of
|
||||
a field of `this', value_of_this sets BLOCK_FOUND to the proper value.) */
|
||||
|
||||
struct symbol *
|
||||
lookup_symbol_in_language (const char *name, const struct block *block,
|
||||
const domain_enum domain, enum language lang,
|
||||
int *is_a_field_of_this)
|
||||
{
|
||||
return lookup_symbol_in_language_full (name, block, domain, lang,
|
||||
is_a_field_of_this, 0);
|
||||
}
|
||||
|
||||
/* Like lookup_symbol_in_language, but search specifically for a
|
||||
type. */
|
||||
|
||||
struct symbol *
|
||||
lookup_type_symbol (const char *name, const struct block *block,
|
||||
const domain_enum domain, enum language lang)
|
||||
{
|
||||
return lookup_symbol_in_language_full (name, block, domain, lang,
|
||||
NULL, 1);
|
||||
}
|
||||
|
||||
/* Behave like lookup_symbol_in_language, but performed with the
|
||||
current language. */
|
||||
|
||||
|
@ -1101,7 +1133,8 @@ lookup_symbol (const char *name, const struct block *block,
|
|||
static struct symbol *
|
||||
lookup_symbol_aux (const char *name, const struct block *block,
|
||||
const domain_enum domain, enum language language,
|
||||
int *is_a_field_of_this)
|
||||
int *is_a_field_of_this,
|
||||
int for_type)
|
||||
{
|
||||
struct symbol *sym;
|
||||
const struct language_defn *langdef;
|
||||
|
@ -1165,14 +1198,20 @@ lookup_symbol_aux (const char *name, const struct block *block,
|
|||
}
|
||||
|
||||
/* Now do whatever is appropriate for LANGUAGE to look
|
||||
up static and global variables. */
|
||||
up static and global variables. If we are searching for a type,
|
||||
we bypass this lookup, because types aren't global. */
|
||||
|
||||
sym = langdef->la_lookup_symbol_nonlocal (name, block, domain);
|
||||
if (sym != NULL)
|
||||
return sym;
|
||||
if (!for_type)
|
||||
{
|
||||
sym = langdef->la_lookup_symbol_nonlocal (name, block, domain);
|
||||
if (sym != NULL)
|
||||
return sym;
|
||||
}
|
||||
|
||||
/* Now search all static file-level symbols. Not strictly correct,
|
||||
but more useful than an error. */
|
||||
/* Now search all static file-level symbols. When searching for a
|
||||
type, this is what we generally want, because types are put into
|
||||
the file scope. For other objects, not strictly correct, but
|
||||
more useful than an error. */
|
||||
|
||||
return lookup_static_symbol_aux (name, domain);
|
||||
}
|
||||
|
@ -1327,6 +1366,35 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* A helper for lookup_symbol_aux_symtabs that is passed as a callback
|
||||
to the expand_one_symtab_matching quick function. */
|
||||
|
||||
static struct symbol *
|
||||
match_symbol_aux (struct symtab *symtab,
|
||||
int kind, const char *name, domain_enum domain,
|
||||
void *arg)
|
||||
{
|
||||
struct objfile *objfile = arg;
|
||||
|
||||
if (symtab->primary)
|
||||
{
|
||||
struct symbol *sym;
|
||||
struct blockvector *bv;
|
||||
const struct block *block;
|
||||
|
||||
bv = BLOCKVECTOR (symtab);
|
||||
block = BLOCKVECTOR_BLOCK (bv, kind);
|
||||
sym = lookup_block_symbol (block, name, domain);
|
||||
if (sym)
|
||||
{
|
||||
block_found = block;
|
||||
return fixup_symbol_section (sym, objfile);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Check to see if the symbol is defined in one of the symtabs.
|
||||
BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
|
||||
depending on whether or not we want to search global symbols or
|
||||
|
@ -1344,11 +1412,6 @@ lookup_symbol_aux_symtabs (int block_index, const char *name,
|
|||
|
||||
ALL_OBJFILES (objfile)
|
||||
{
|
||||
if (objfile->sf)
|
||||
objfile->sf->qf->pre_expand_symtabs_matching (objfile,
|
||||
block_index,
|
||||
name, domain);
|
||||
|
||||
ALL_OBJFILE_SYMTABS (objfile, s)
|
||||
if (s->primary)
|
||||
{
|
||||
|
@ -1361,6 +1424,17 @@ lookup_symbol_aux_symtabs (int block_index, const char *name,
|
|||
return fixup_symbol_section (sym, objfile);
|
||||
}
|
||||
}
|
||||
|
||||
if (objfile->sf)
|
||||
{
|
||||
sym = objfile->sf->qf->expand_one_symtab_matching (objfile,
|
||||
block_index,
|
||||
name, domain,
|
||||
match_symbol_aux,
|
||||
objfile);
|
||||
if (sym)
|
||||
return sym;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -1582,6 +1656,30 @@ basic_lookup_transparent_type_quick (struct objfile *objfile, int kind,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* A helper function for basic_lookup_transparent_type that is passed
|
||||
to the expand_one_symtab_matching quick function. */
|
||||
|
||||
static struct symbol *
|
||||
match_transparent_type (struct symtab *symtab,
|
||||
int kind, const char *name, domain_enum domain,
|
||||
void *data)
|
||||
{
|
||||
if (symtab->primary)
|
||||
{
|
||||
struct blockvector *bv;
|
||||
struct block *block;
|
||||
struct symbol *sym;
|
||||
|
||||
bv = BLOCKVECTOR (symtab);
|
||||
block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
|
||||
sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
|
||||
if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
|
||||
return sym;
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -1605,11 +1703,6 @@ basic_lookup_transparent_type (const char *name)
|
|||
|
||||
ALL_OBJFILES (objfile)
|
||||
{
|
||||
if (objfile->sf)
|
||||
objfile->sf->qf->pre_expand_symtabs_matching (objfile,
|
||||
GLOBAL_BLOCK,
|
||||
name, STRUCT_DOMAIN);
|
||||
|
||||
ALL_OBJFILE_SYMTABS (objfile, s)
|
||||
if (s->primary)
|
||||
{
|
||||
|
@ -1621,6 +1714,18 @@ basic_lookup_transparent_type (const char *name)
|
|||
return SYMBOL_TYPE (sym);
|
||||
}
|
||||
}
|
||||
|
||||
if (objfile->sf)
|
||||
{
|
||||
sym
|
||||
= objfile->sf->qf->expand_one_symtab_matching (objfile,
|
||||
GLOBAL_BLOCK, name,
|
||||
STRUCT_DOMAIN,
|
||||
match_transparent_type,
|
||||
NULL);
|
||||
if (sym)
|
||||
return SYMBOL_TYPE (sym);
|
||||
}
|
||||
}
|
||||
|
||||
ALL_OBJFILES (objfile)
|
||||
|
@ -1640,10 +1745,6 @@ basic_lookup_transparent_type (const char *name)
|
|||
|
||||
ALL_OBJFILES (objfile)
|
||||
{
|
||||
if (objfile->sf)
|
||||
objfile->sf->qf->pre_expand_symtabs_matching (objfile, STATIC_BLOCK,
|
||||
name, STRUCT_DOMAIN);
|
||||
|
||||
ALL_OBJFILE_SYMTABS (objfile, s)
|
||||
{
|
||||
bv = BLOCKVECTOR (s);
|
||||
|
@ -1654,6 +1755,18 @@ basic_lookup_transparent_type (const char *name)
|
|||
return SYMBOL_TYPE (sym);
|
||||
}
|
||||
}
|
||||
|
||||
if (objfile->sf)
|
||||
{
|
||||
sym
|
||||
= objfile->sf->qf->expand_one_symtab_matching (objfile,
|
||||
STATIC_BLOCK, name,
|
||||
STRUCT_DOMAIN,
|
||||
match_transparent_type,
|
||||
NULL);
|
||||
if (sym)
|
||||
return SYMBOL_TYPE (sym);
|
||||
}
|
||||
}
|
||||
|
||||
ALL_OBJFILES (objfile)
|
||||
|
|
|
@ -977,6 +977,10 @@ extern int find_pc_line_pc_range (CORE_ADDR, CORE_ADDR *, CORE_ADDR *);
|
|||
|
||||
extern void reread_symbols (void);
|
||||
|
||||
extern struct symbol *lookup_type_symbol (const char* name,
|
||||
const struct block *block,
|
||||
const domain_enum domain,
|
||||
enum language lang);
|
||||
extern struct type *lookup_transparent_type (const char *);
|
||||
extern struct type *basic_lookup_transparent_type (const char *);
|
||||
|
||||
|
|
Loading…
Reference in New Issue