From 49c1de0e72098e71c28faa13ae2705988de81220 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 13 Jan 2023 09:59:29 -0700 Subject: [PATCH] Merge fixup_section and fixup_symbol_section fixup_symbol_section delegates all its work to fixup_section, so merge the two. Because there is only a single caller to fixup_symbol_section, we can also remove some of the introductory logic. For example, this will never be called with a NULL objfile any more. The LOC_BLOCK case can be removed, because such symbols are handled by the buildsym code now. Finally, a symbol can only appear in a SEC_ALLOC section, so the loop is modified to skip sections that do not have this flag set. --- gdb/symtab.c | 107 +++++++++++++++++++-------------------------------- gdb/symtab.h | 8 +++- 2 files changed, 45 insertions(+), 70 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index d3b2edfba9a..9d6ee388ca2 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -1701,18 +1701,39 @@ symtab_free_objfile_observer (struct objfile *objfile) symbol_cache_flush (objfile->pspace); } -/* Debug symbols usually don't have section information. We need to dig that - out of the minimal symbols and stash that in the debug symbol. - - DEFAULT_SECTION is the section index to use as the default if the - correct section cannot be found. It may be -1, in which case a - built-in default is used. */ +/* See symtab.h. */ -static void -fixup_section (struct general_symbol_info *ginfo, - CORE_ADDR addr, struct objfile *objfile, - int default_section) +void +fixup_symbol_section (struct symbol *sym, struct objfile *objfile) { + gdb_assert (sym != nullptr); + gdb_assert (sym->is_objfile_owned ()); + gdb_assert (objfile != nullptr); + gdb_assert (sym->section_index () == -1); + + /* Note that if this ends up as -1, fixup_section will handle that + reasonably well. So, it's fine to use the objfile's section + index without doing the check that is done by the wrapper macros + like SECT_OFF_TEXT. */ + int fallback; + switch (sym->aclass ()) + { + case LOC_STATIC: + fallback = objfile->sect_index_data; + break; + + case LOC_LABEL: + fallback = objfile->sect_index_text; + break; + + default: + /* Nothing else will be listed in the minsyms -- no use looking + it up. */ + return; + } + + CORE_ADDR addr = sym->value_address (); + struct minimal_symbol *msym; /* First, check whether a minimal symbol with the same name exists @@ -1720,10 +1741,10 @@ fixup_section (struct general_symbol_info *ginfo, 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. */ - msym = lookup_minimal_symbol_by_pc_name (addr, ginfo->linkage_name (), + msym = lookup_minimal_symbol_by_pc_name (addr, sym->linkage_name (), objfile); if (msym) - ginfo->set_section_index (msym->section_index ()); + sym->set_section_index (msym->section_index ()); else { /* Static, function-local variables do appear in the linker @@ -1762,10 +1783,12 @@ fixup_section (struct general_symbol_info *ginfo, a search of the section table. */ struct obj_section *s; - int fallback = default_section; ALL_OBJFILE_OSECTIONS (objfile, s) { + if ((bfd_section_flags (s->the_bfd_section) & SEC_ALLOC) == 0) + continue; + int idx = s - objfile->sections; CORE_ADDR offset = objfile->section_offsets[idx]; @@ -1774,7 +1797,7 @@ fixup_section (struct general_symbol_info *ginfo, if (s->addr () - offset <= addr && addr < s->endaddr () - offset) { - ginfo->set_section_index (idx); + sym->set_section_index (idx); return; } } @@ -1783,62 +1806,10 @@ fixup_section (struct general_symbol_info *ginfo, section. If there is no allocated section, then it hardly matters what we pick, so just pick zero. */ if (fallback == -1) - ginfo->set_section_index (0); + sym->set_section_index (0); else - ginfo->set_section_index (fallback); - } -} - -struct symbol * -fixup_symbol_section (struct symbol *sym, struct objfile *objfile) -{ - CORE_ADDR addr; - - if (!sym) - return NULL; - - if (!sym->is_objfile_owned ()) - return sym; - - /* We either have an OBJFILE, or we can get at it from the sym's - symtab. Anything else is a bug. */ - gdb_assert (objfile || sym->symtab ()); - - if (objfile == NULL) - objfile = sym->objfile (); - - if (sym->obj_section (objfile) != nullptr) - return sym; - - /* We should have an objfile by now. */ - gdb_assert (objfile); - - /* Note that if this ends up as -1, fixup_section will handle that - reasonably well. So, it's fine to use the objfile's section - index without doing the check that is done by the wrapper macros - like SECT_OFF_TEXT. */ - int default_section = objfile->sect_index_text; - switch (sym->aclass ()) - { - case LOC_STATIC: - default_section = objfile->sect_index_data; - /* FALLTHROUGH. */ - case LOC_LABEL: - addr = sym->value_address (); - break; - case LOC_BLOCK: - addr = sym->value_block ()->entry_pc (); - break; - - default: - /* Nothing else will be listed in the minsyms -- no use looking - it up. */ - return sym; + sym->set_section_index (fallback); } - - fixup_section (sym, addr, objfile, default_section); - - return sym; } /* See symtab.h. */ diff --git a/gdb/symtab.h b/gdb/symtab.h index 50ce7525793..11ff875c6b8 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -2381,8 +2381,12 @@ extern void skip_prologue_sal (struct symtab_and_line *); extern CORE_ADDR skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr); -extern struct symbol *fixup_symbol_section (struct symbol *, - struct objfile *); +/* If SYM requires a section index, find it either via minimal symbols + or examining OBJFILE's sections. Note that SYM's current address + must not have any runtime offsets applied. */ + +extern void fixup_symbol_section (struct symbol *sym, + struct objfile *objfile); /* If MSYMBOL is an text symbol, look for a function debug symbol with the same address. Returns NULL if not found. This is necessary in -- 2.30.2