aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/symtab.c50
2 files changed, 33 insertions, 22 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 59eec00..96816cb 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2007-01-04 Daniel Jacobowitz <dan@codesourcery.com>
+ * symtab.c (find_pc_sect_psymtab): Add comments. Handle psymtabs
+ with no symbols.
+
+2007-01-04 Daniel Jacobowitz <dan@codesourcery.com>
+
* memory-map.c (struct_memory_map_parsing_data): Remove most
members. Make property_name an array.
(free_memory_map_parsing_data, memory_map_start_element)
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);