* symtab.c (error_in_psymtab_expansion): New function.
(lookup_symbol_aux_quick) (basic_lookup_transparent_type_quick): Remove "last resort" code. Use error_in_psymtab_expansion.
This commit is contained in:
parent
d5c7e0e967
commit
08c23b0d0f
|
@ -1,3 +1,10 @@
|
||||||
|
2013-03-14 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* symtab.c (error_in_psymtab_expansion): New function.
|
||||||
|
(lookup_symbol_aux_quick)
|
||||||
|
(basic_lookup_transparent_type_quick): Remove "last resort"
|
||||||
|
code. Use error_in_psymtab_expansion.
|
||||||
|
|
||||||
2013-03-14 Doug Evans <dje@google.com>
|
2013-03-14 Doug Evans <dje@google.com>
|
||||||
Jan Kratochvil <jan.kratochvil@redhat.com>
|
Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
|
57
gdb/symtab.c
57
gdb/symtab.c
|
@ -1616,6 +1616,20 @@ lookup_symbol_in_objfile_from_linkage_name (struct objfile *objfile,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A helper function that throws an exception when a symbol was found
|
||||||
|
in a psymtab but not in a symtab. */
|
||||||
|
|
||||||
|
static void ATTRIBUTE_NORETURN
|
||||||
|
error_in_psymtab_expansion (int kind, const char *name, struct symtab *symtab)
|
||||||
|
{
|
||||||
|
error (_("\
|
||||||
|
Internal: %s symbol `%s' found in %s psymtab but not in symtab.\n\
|
||||||
|
%s may be an inlined function, or may be a template function\n \
|
||||||
|
(if a template, try specifying an instantiation: %s<type>)."),
|
||||||
|
kind == GLOBAL_BLOCK ? "global" : "static",
|
||||||
|
name, symtab_to_filename_for_display (symtab), name, name);
|
||||||
|
}
|
||||||
|
|
||||||
/* A helper function for lookup_symbol_aux that interfaces with the
|
/* A helper function for lookup_symbol_aux that interfaces with the
|
||||||
"quick" symbol table functions. */
|
"quick" symbol table functions. */
|
||||||
|
|
||||||
|
@ -1638,30 +1652,7 @@ lookup_symbol_aux_quick (struct objfile *objfile, int kind,
|
||||||
block = BLOCKVECTOR_BLOCK (bv, kind);
|
block = BLOCKVECTOR_BLOCK (bv, kind);
|
||||||
sym = lookup_block_symbol (block, name, domain);
|
sym = lookup_block_symbol (block, name, domain);
|
||||||
if (!sym)
|
if (!sym)
|
||||||
{
|
error_in_psymtab_expansion (kind, name, symtab);
|
||||||
/* This shouldn't be necessary, but as a last resort try
|
|
||||||
looking in the statics even though the psymtab claimed
|
|
||||||
the symbol was global, or vice-versa. It's possible
|
|
||||||
that the psymtab gets it wrong in some cases. */
|
|
||||||
|
|
||||||
/* FIXME: carlton/2002-09-30: Should we really do that?
|
|
||||||
If that happens, isn't it likely to be a GDB error, in
|
|
||||||
which case we should fix the GDB error rather than
|
|
||||||
silently dealing with it here? So I'd vote for
|
|
||||||
removing the check for the symbol in the other
|
|
||||||
block. */
|
|
||||||
block = BLOCKVECTOR_BLOCK (bv,
|
|
||||||
kind == GLOBAL_BLOCK ?
|
|
||||||
STATIC_BLOCK : GLOBAL_BLOCK);
|
|
||||||
sym = lookup_block_symbol (block, name, domain);
|
|
||||||
if (!sym)
|
|
||||||
error (_("\
|
|
||||||
Internal: %s symbol `%s' found in %s psymtab but not in symtab.\n\
|
|
||||||
%s may be an inlined function, or may be a template function\n\
|
|
||||||
(if a template, try specifying an instantiation: %s<type>)."),
|
|
||||||
kind == GLOBAL_BLOCK ? "global" : "static",
|
|
||||||
name, symtab_to_filename_for_display (symtab), name, name);
|
|
||||||
}
|
|
||||||
return fixup_symbol_section (sym, objfile);
|
return fixup_symbol_section (sym, objfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1849,24 +1840,8 @@ basic_lookup_transparent_type_quick (struct objfile *objfile, int kind,
|
||||||
block = BLOCKVECTOR_BLOCK (bv, kind);
|
block = BLOCKVECTOR_BLOCK (bv, kind);
|
||||||
sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
|
sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
|
||||||
if (!sym)
|
if (!sym)
|
||||||
{
|
error_in_psymtab_expansion (kind, name, symtab);
|
||||||
int other_kind = kind == GLOBAL_BLOCK ? STATIC_BLOCK : GLOBAL_BLOCK;
|
|
||||||
|
|
||||||
/* This shouldn't be necessary, but as a last resort
|
|
||||||
* try looking in the 'other kind' even though the psymtab
|
|
||||||
* claimed the symbol was one thing. It's possible that
|
|
||||||
* the psymtab gets it wrong in some cases.
|
|
||||||
*/
|
|
||||||
block = BLOCKVECTOR_BLOCK (bv, other_kind);
|
|
||||||
sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
|
|
||||||
if (!sym)
|
|
||||||
/* FIXME; error is wrong in one case. */
|
|
||||||
error (_("\
|
|
||||||
Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\
|
|
||||||
%s may be an inlined function, or may be a template function\n\
|
|
||||||
(if a template, try specifying an instantiation: %s<type>)."),
|
|
||||||
name, symtab_to_filename_for_display (symtab), name, name);
|
|
||||||
}
|
|
||||||
if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
|
if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
|
||||||
return SYMBOL_TYPE (sym);
|
return SYMBOL_TYPE (sym);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue