]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: make find_sal_for_pc_sect attempt to fill sal section
authorSébastien Darche <sdarche@efficios.com>
Fri, 3 Oct 2025 12:47:55 +0000 (08:47 -0400)
committerSébastien Darche <sdarche@efficios.com>
Tue, 28 Oct 2025 13:43:30 +0000 (09:43 -0400)
The find_sal_for_pc_section function inconsistently fills the section
field from its output symtab_and_line, depending on whether a symtab is
present or not. In the case that we cannot find a symtab for the pc and
section, the function would construct a sal with a pc but no section,
even though it could be either forwarded from the arguments, or
computed from the pc.

With the proposed changes, the function attempts to set the section in
all code paths and performs a section lookup when it is not provided as
an argument. This change is part of a patch series to fix
inconsistencies in symtab_and_line constructions, making it the
responsibility of the sal creator to fill out the section field (when
possible).

This section may be passed from a minsym in an unmapped overlay section.
Leaving the section field empty would mean in most cases losing some
important context (e.g. which overlay section this pc corresponds to).

Approved-By: Tom Tromey <tom@tromey.com>
Change-Id: I818a08c4f61803b6d2cadd32ec106fe416af4c66

gdb/symtab.c

index 0ddb25f2879997abe8ab447739c286696a3472a4..bd3d55eecb0160d0a845cdfd76d49fb16c123560 100644 (file)
@@ -2905,6 +2905,13 @@ find_sal_for_pc_sect (CORE_ADDR pc, struct obj_section *section, int notcurrent)
   CORE_ADDR best_end = 0;
   struct symtab *best_symtab = 0;
 
+  if (section == nullptr)
+    {
+      section = find_pc_overlay (pc);
+      if (section == nullptr)
+       section = find_pc_section (pc);
+    }
+
   /* Store here the first line number
      of a file which contains the line at the smallest pc after PC.
      If we don't find a line whose range contains PC,
@@ -3030,6 +3037,7 @@ find_sal_for_pc_sect (CORE_ADDR pc, struct obj_section *section, int notcurrent)
       if (notcurrent)
        pc++;
       val.pc = pc;
+      val.section = section;
       return val;
     }