Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFC/RFA] find_pc_sect_psymtab(): symbol table not always complete
@ 2003-11-19 18:19 Joel Brobecker
  2003-11-19 18:26 ` Daniel Jacobowitz
  0 siblings, 1 reply; 7+ messages in thread
From: Joel Brobecker @ 2003-11-19 18:19 UTC (permalink / raw)
  To: gdb-patches

[-- 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);

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2004-02-20 17:11 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-19 18:19 [RFC/RFA] find_pc_sect_psymtab(): symbol table not always complete Joel Brobecker
2003-11-19 18:26 ` Daniel Jacobowitz
2003-11-20  0:24   ` Joel Brobecker
2003-12-02 16:15     ` Daniel Jacobowitz
2004-01-17  8:13     ` Joel Brobecker
2004-02-19 19:01     ` Elena Zannoni
2004-02-20 17:11       ` Joel Brobecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox