forked from Imagelibrary/binutils-gdb
gdb/
2008-05-15 Pedro Alves <pedro@codesourcery.com> Ulrich Weigand <uweigand@de.ibm.com> * minsyms.c (lookup_minimal_symbol_by_pc_name): New function. * symtab.h (lookup_minimal_symbol_by_pc_name): Add prototype. * symtab.c (fixup_section): Remove prototype. Add ADDR parameter; use it instead of ginfo->value.address. Look up minimal symbol by address and name. Assume OBJFILE is non-NULL. (fixup_symbol_section): Ensure we always have an objfile to look into. Extract and pass to fixup_section the symbol's address that will match the minimal symbol's address. (fixup_psymbol_section): Likewise. (find_pc_sect_psymtab): Fall back to non-addrmap case when debugging overlays and the addrmap returned the wrong section. * dwarf2read.c (var_decode_location): Set SYMBOL_CLASS before calling fixup_symbol_section. gdb/testsuite/ 2008-05-15 Pedro Alves <pedro@codesourcery.com> * gdb.base/fixsection.exp: New file. * gdb.base/fixsection0.c: New file. * gdb.base/fixsection1.c: New file.
This commit is contained in:
84
gdb/symtab.c
84
gdb/symtab.c
@@ -110,8 +110,6 @@ struct symbol *lookup_symbol_aux_psymtabs (int block_index,
|
||||
const domain_enum domain,
|
||||
struct symtab **symtab);
|
||||
|
||||
static void fixup_section (struct general_symbol_info *, struct objfile *);
|
||||
|
||||
static int file_matches (char *, char **, int);
|
||||
|
||||
static void print_symbol_info (domain_enum,
|
||||
@@ -878,6 +876,23 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section)
|
||||
pst = addrmap_find (objfile->psymtabs_addrmap, pc);
|
||||
if (pst != NULL)
|
||||
{
|
||||
/* FIXME: addrmaps currently do not handle overlayed sections,
|
||||
so fall back to the non-addrmap case if we're debugging
|
||||
overlays and the addrmap returned the wrong section. */
|
||||
if (overlay_debugging && msymbol && section)
|
||||
{
|
||||
struct partial_symbol *p;
|
||||
/* NOTE: This assumes that every psymbol has a
|
||||
corresponding msymbol, which is not necessarily
|
||||
true; the debug info might be much richer than the
|
||||
object's symbol table. */
|
||||
p = find_pc_sect_psymbol (pst, pc, section);
|
||||
if (!p
|
||||
|| SYMBOL_VALUE_ADDRESS (p)
|
||||
!= SYMBOL_VALUE_ADDRESS (msymbol))
|
||||
continue;
|
||||
}
|
||||
|
||||
/* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
|
||||
PSYMTABS_ADDRMAP we used has already the best 1-byte
|
||||
granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
|
||||
@@ -1010,23 +1025,23 @@ find_pc_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc)
|
||||
out of the minimal symbols and stash that in the debug symbol. */
|
||||
|
||||
static void
|
||||
fixup_section (struct general_symbol_info *ginfo, struct objfile *objfile)
|
||||
fixup_section (struct general_symbol_info *ginfo,
|
||||
CORE_ADDR addr, struct objfile *objfile)
|
||||
{
|
||||
struct minimal_symbol *msym;
|
||||
msym = lookup_minimal_symbol (ginfo->name, NULL, objfile);
|
||||
|
||||
/* First, check whether a minimal symbol with the same name exists
|
||||
and points to the same address. The address check is required
|
||||
e.g. on PowerPC64, where the minimal symbol for a function will
|
||||
point to the function descriptor, while the debug symbol will
|
||||
point to the actual function code. */
|
||||
if (msym
|
||||
&& SYMBOL_VALUE_ADDRESS (msym) == ginfo->value.address)
|
||||
msym = lookup_minimal_symbol_by_pc_name (addr, ginfo->name, objfile);
|
||||
if (msym)
|
||||
{
|
||||
ginfo->bfd_section = SYMBOL_BFD_SECTION (msym);
|
||||
ginfo->section = SYMBOL_SECTION (msym);
|
||||
}
|
||||
else if (objfile)
|
||||
else
|
||||
{
|
||||
/* Static, function-local variables do appear in the linker
|
||||
(minimal) symbols, but are frequently given names that won't
|
||||
@@ -1064,11 +1079,7 @@ fixup_section (struct general_symbol_info *ginfo, struct objfile *objfile)
|
||||
this reason, we still attempt a lookup by name prior to doing
|
||||
a search of the section table. */
|
||||
|
||||
CORE_ADDR addr;
|
||||
struct obj_section *s;
|
||||
|
||||
addr = ginfo->value.address;
|
||||
|
||||
ALL_OBJFILE_OSECTIONS (objfile, s)
|
||||
{
|
||||
int idx = s->the_bfd_section->index;
|
||||
@@ -1087,13 +1098,42 @@ fixup_section (struct general_symbol_info *ginfo, struct objfile *objfile)
|
||||
struct symbol *
|
||||
fixup_symbol_section (struct symbol *sym, struct objfile *objfile)
|
||||
{
|
||||
CORE_ADDR addr;
|
||||
|
||||
if (!sym)
|
||||
return NULL;
|
||||
|
||||
if (SYMBOL_BFD_SECTION (sym))
|
||||
return sym;
|
||||
|
||||
fixup_section (&sym->ginfo, objfile);
|
||||
/* We either have an OBJFILE, or we can get at it from the sym's
|
||||
symtab. Anything else is a bug. */
|
||||
gdb_assert (objfile || SYMBOL_SYMTAB (sym));
|
||||
|
||||
if (objfile == NULL)
|
||||
objfile = SYMBOL_SYMTAB (sym)->objfile;
|
||||
|
||||
/* We should have an objfile by now. */
|
||||
gdb_assert (objfile);
|
||||
|
||||
switch (SYMBOL_CLASS (sym))
|
||||
{
|
||||
case LOC_STATIC:
|
||||
case LOC_LABEL:
|
||||
case LOC_INDIRECT:
|
||||
addr = SYMBOL_VALUE_ADDRESS (sym);
|
||||
break;
|
||||
case LOC_BLOCK:
|
||||
addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Nothing else will be listed in the minsyms -- no use looking
|
||||
it up. */
|
||||
return sym;
|
||||
}
|
||||
|
||||
fixup_section (&sym->ginfo, addr, objfile);
|
||||
|
||||
return sym;
|
||||
}
|
||||
@@ -1101,13 +1141,31 @@ fixup_symbol_section (struct symbol *sym, struct objfile *objfile)
|
||||
struct partial_symbol *
|
||||
fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
|
||||
{
|
||||
CORE_ADDR addr;
|
||||
|
||||
if (!psym)
|
||||
return NULL;
|
||||
|
||||
if (SYMBOL_BFD_SECTION (psym))
|
||||
return psym;
|
||||
|
||||
fixup_section (&psym->ginfo, objfile);
|
||||
gdb_assert (objfile);
|
||||
|
||||
switch (SYMBOL_CLASS (psym))
|
||||
{
|
||||
case LOC_STATIC:
|
||||
case LOC_LABEL:
|
||||
case LOC_INDIRECT:
|
||||
case LOC_BLOCK:
|
||||
addr = SYMBOL_VALUE_ADDRESS (psym);
|
||||
break;
|
||||
default:
|
||||
/* Nothing else will be listed in the minsyms -- no use looking
|
||||
it up. */
|
||||
return psym;
|
||||
}
|
||||
|
||||
fixup_section (&psym->ginfo, addr, objfile);
|
||||
|
||||
return psym;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user