aboutsummaryrefslogtreecommitdiff
path: root/gdb/symtab.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2007-01-04 22:21:28 +0000
committerDaniel Jacobowitz <drow@false.org>2007-01-04 22:21:28 +0000
commitd1c79ecdc53fb00efe25b5c4d625df3c7eeb5a5c (patch)
treec3a6a50a3ad7f49fdeca28c827facad42b75ff28 /gdb/symtab.c
parente776119fdc2ba0eed3639762bb210095b0405549 (diff)
downloadgdb-d1c79ecdc53fb00efe25b5c4d625df3c7eeb5a5c.zip
gdb-d1c79ecdc53fb00efe25b5c4d625df3c7eeb5a5c.tar.gz
gdb-d1c79ecdc53fb00efe25b5c4d625df3c7eeb5a5c.tar.bz2
* symtab.c (find_pc_sect_psymtab): Add comments. Handle psymtabs
with no symbols.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r--gdb/symtab.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 6210935..8f79fee 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -795,7 +795,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section)
{
struct partial_symtab *tpst;
struct partial_symtab *best_pst = pst;
- struct partial_symbol *best_psym = NULL;
+ CORE_ADDR best_addr = pst->textlow;
/* An objfile that has its functions reordered might have
many partial symbol tables containing the PC, but
@@ -820,36 +820,42 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section)
if (pc >= tpst->textlow && pc < tpst->texthigh)
{
struct partial_symbol *p;
+ CORE_ADDR this_addr;
+ /* NOTE: This assumes that every psymbol has a
+ corresponding msymbol, which is not necessarily
+ true; the debug info might be much richer than the
+ object's symbol table. */
p = find_pc_sect_psymbol (tpst, pc, section);
if (p != NULL
&& SYMBOL_VALUE_ADDRESS (p)
== SYMBOL_VALUE_ADDRESS (msymbol))
return (tpst);
+
+ /* Also accept the textlow value of a psymtab as a
+ "symbol", to provide some support for partial
+ symbol tables with line information but no debug
+ symbols (e.g. those produced by an assembler). */
if (p != NULL)
+ this_addr = SYMBOL_VALUE_ADDRESS (p);
+ else
+ this_addr = tpst->textlow;
+
+ /* Check whether it is closer than our current
+ BEST_ADDR. Since this symbol address is
+ necessarily lower or equal to PC, the symbol closer
+ to PC is the symbol which address is the highest.
+ This way we return the psymtab which contains such
+ best match symbol. This can help in cases where the
+ symbol information/debuginfo is not complete, like
+ for instance on IRIX6 with gcc, where no debug info
+ is emitted for statics. (See also the nodebug.exp
+ testcase.) */
+ if (this_addr > best_addr)
{
- /* We found a symbol in this partial symtab which
- matches (or is closest to) PC, check whether it
- is closer than our current BEST_PSYM. Since
- this symbol address is necessarily lower or
- equal to PC, the symbol closer to PC is the
- symbol which address is the highest. */
- /* This way we return the psymtab which contains
- such best match symbol. This can help in cases
- where the symbol information/debuginfo is not
- complete, like for instance on IRIX6 with gcc,
- where no debug info is emitted for
- statics. (See also the nodebug.exp
- testcase.) */
- if (best_psym == NULL
- || SYMBOL_VALUE_ADDRESS (p)
- > SYMBOL_VALUE_ADDRESS (best_psym))
- {
- best_psym = p;
- best_pst = tpst;
- }
+ best_addr = this_addr;
+ best_pst = tpst;
}
-
}
}
return (best_pst);