From: drow Date: Thu, 4 Jan 2007 22:21:28 +0000 (+0000) Subject: * symtab.c (find_pc_sect_psymtab): Add comments. Handle psymtabs X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=72e2955c0f01e8370e2cd748b0f3f86a6f6fcadf;p=pf3gnuchains%2Fpf3gnuchains3x.git * symtab.c (find_pc_sect_psymtab): Add comments. Handle psymtabs with no symbols. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 59eec00340..96816cbedd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2007-01-04 Daniel Jacobowitz + * symtab.c (find_pc_sect_psymtab): Add comments. Handle psymtabs + with no symbols. + +2007-01-04 Daniel Jacobowitz + * 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 62109358ff..8f79feeaf7 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);