public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] Merge fixup_section and fixup_symbol_section
@ 2023-02-08 16:47 Tom Tromey
0 siblings, 0 replies; only message in thread
From: Tom Tromey @ 2023-02-08 16:47 UTC (permalink / raw)
To: gdb-cvs
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=49c1de0e72098e71c28faa13ae2705988de81220
commit 49c1de0e72098e71c28faa13ae2705988de81220
Author: Tom Tromey <tromey@adacore.com>
Date: Fri Jan 13 09:59:29 2023 -0700
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.
Diff:
---
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);
}
\f
-/* 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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-02-08 16:47 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-08 16:47 [binutils-gdb] Merge fixup_section and fixup_symbol_section Tom Tromey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).