diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2008-05-16 12:58:49 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2008-05-16 12:58:49 +0000 |
commit | 907fc2026807534a7c2772aac13ab8ab0b42aa92 (patch) | |
tree | 7663e6f23c90bf0f1b2b95373673673da1cb0928 /gdb/symtab.c | |
parent | 42848c965696a7e9cb46d09b6417212b946ab987 (diff) | |
download | gdb-907fc2026807534a7c2772aac13ab8ab0b42aa92.zip gdb-907fc2026807534a7c2772aac13ab8ab0b42aa92.tar.gz gdb-907fc2026807534a7c2772aac13ab8ab0b42aa92.tar.bz2 |
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.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r-- | gdb/symtab.c | 84 |
1 files changed, 71 insertions, 13 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c index 3d4389e..33efe12 100644 --- a/gdb/symtab.c +++ b/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; } |