Merge fixup_section and fixup_symbol_section
authorTom Tromey <tromey@adacore.com>
Fri, 13 Jan 2023 16:59:29 +0000 (09:59 -0700)
committerTom Tromey <tromey@adacore.com>
Wed, 8 Feb 2023 15:20:39 +0000 (08:20 -0700)
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
gdb/symtab.h

index d3b2edfba9aec02578a57c258c82b959e2a987f6..9d6ee388ca204d08b524236f56bad8aab1deec72 100644 (file)
@@ -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.  */
index 50ce7525793b922e8cc8963c482021c556d1f162..11ff875c6b89e8536c4fba3fd5b8c8c57b7ebe85 100644 (file)
@@ -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