[RFC/RFA] find_pc_sect_psymtab(): symbol table not always complete

Joel Brobecker
2003-11-19T18:19:13Z

[-- Attachment #1: Type: text/plain, Size: 1391 bytes --]

Hello,

Re: http://sources.redhat.com/ml/gdb-patches/2003-11/msg00368.html

The following change tweaks find_pc_sect_psymtab() to stop assuming
that the symbol table will contain all symbols. So when we don't find
a partial symtab containing a symbol at the same address as the minimal
symbol we found, we return the symtab containing symbol which address
is the closest to the given PC address.

This fixes the problem reported in the message referenced above.

As noted by Daniel J, the cleanest fix, in the long run, is probably to
record accurate code ranges rather insted of the textlow/texthigh
addresses. This is a more long term project which I wanted to tackle
without the pressure of the users not being able to debug comfortably.
This will be the subject of another post coming shortly.

2003-11-19 J. Brobecker <brobecker@gnat.com>

* symtab.c (find_pc_sect_psymtab): Refine the search for the
partial symtab corresponding to the given PC address, taking
into account the fact that the symbol table might be incomplete.

It has been tested on x86-linux with stabs & dwarf-2 with no regression.
It has also been tested on mips-irix but on a 5.3-based version of GDB
(we haven't moved to a more recent version of GDB on this platform yet,
and the HEAD version is giving me some trouble that I need to sort out).

Comments? OK to apply?

Thanks,
--
Joel

[-- Attachment #2: symtab.c.diff --]
[-- Type: text/plain, Size: 1777 bytes --]

Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.122
diff -u -p -r1.122 symtab.c
--- symtab.c 8 Nov 2003 00:13:03 -0000 1.122
+++ symtab.c 19 Nov 2003 18:04:15 -0000
@@ -698,6 +698,8 @@ find_pc_sect_psymtab (CORE_ADDR pc, asec
if (pc >= pst->textlow && pc < pst->texthigh)
{
struct partial_symtab *tpst;
+ struct partial_symtab *best_pst = pst;
+ struct partial_symbol *best_psym = NULL;

/* An objfile that has its functions reordered might have
many partial symbol tables containing the PC, but
@@ -710,6 +712,11 @@ find_pc_sect_psymtab (CORE_ADDR pc, asec
if (msymbol == NULL)
return (pst);

+ /* The code range of partial symtabs sometimes overlap, so
+ we need to check all partial symtabs and find the one that
+ fits better for the given PC address. We select the partial
+ symtab that contains a symbol which address is closest to
+ the PC address. */
for (tpst = pst; tpst != NULL; tpst = tpst->next)
{
if (pc >= tpst->textlow && pc < tpst->texthigh)
@@ -721,9 +728,19 @@ find_pc_sect_psymtab (CORE_ADDR pc, asec
&& SYMBOL_VALUE_ADDRESS (p)
== SYMBOL_VALUE_ADDRESS (msymbol))
return (tpst);
+ if (p != NULL)
+ {
+ if (best_psym == NULL
+ || SYMBOL_VALUE_ADDRESS (p)
+ > SYMBOL_VALUE_ADDRESS (best_psym))
+ {
+ best_psym = p;
+ best_pst = tpst;
+ }
+ }
}
}
- return (pst);
+ return best_pst;
}
}
return (NULL);