diff options
author | Andrew Cagney <cagney@redhat.com> | 1997-12-17 16:50:18 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 1997-12-17 16:50:18 +0000 |
commit | 4dbdbfc4d3dff2234894d5a048a84f0361277213 (patch) | |
tree | 39a40cd323fcdceb56e40d75be1d960cbd458edb /gdb/elfread.c | |
parent | 6124cd1e59f077d87fb718f1e36ead2cbe38c6ff (diff) | |
download | gdb-4dbdbfc4d3dff2234894d5a048a84f0361277213.zip gdb-4dbdbfc4d3dff2234894d5a048a84f0361277213.tar.gz gdb-4dbdbfc4d3dff2234894d5a048a84f0361277213.tar.bz2 |
o Fix code deleting psymtab entry from objfile's list.
Only worked if the first element in the list was
being deleted.
o When MAINLINE (reading main objectfile and need to
clear out old data), change elfread.c so that the
psymbol table is emptied once (in elf_symfile_read)
instead of multiple times in each *_read_psymtab
function.
o For elf_symfile_read, load dwarf2 symbols last
(so that they are searched for first).
o In mdebug_psymtab_read, delete check to see if
symbols for current source file already loaded.
Test doesn't work for .h files. Above change
works better
Diffstat (limited to 'gdb/elfread.c')
-rw-r--r-- | gdb/elfread.c | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/gdb/elfread.c b/gdb/elfread.c index d698be7..179a0ef 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -615,21 +615,42 @@ elf_symfile_read (objfile, section_offsets, mainline) elf_symtab_read (abfd, offset, objfile, 1); /* Now process debugging information, which is contained in - special ELF sections. We first have to find them... */ + special ELF sections. */ - bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei); - if (dwarf2_has_info (abfd)) + /* If we are reinitializing, or if we have never loaded syms yet, + set table to empty. MAINLINE is cleared so that *_read_psymtab + functions do not all also re-initialize the psymbol table. */ + if (mainline) { - /* DWARF 2 sections */ - dwarf2_build_psymtabs (objfile, section_offsets, mainline); + init_psymbol_list (objfile, 0); + mainline = 0; } - else if (ei.dboffset && ei.lnoffset) + + /* We first have to find them... */ + bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei); + + /* ELF debugging information is inserted into the psymtab in the + order of least informative first - most informative last. Since + the psymtab table is searched `most recent insertion first' this + increases the probability that more detailed debug information + for a section is found. + + For instance, an object file might contain both .mdebug (XCOFF) + and .debug_info (DWARF2) sections then .mdebug is inserted first + (searched last) and DWARF2 is inserted last (searched first). If + we don't do this then the XCOFF info is found first - for code in + an included file XCOFF info is useless. */ + + if (ei.mdebugsect) { - /* DWARF sections */ - dwarf_build_psymtabs (objfile, - section_offsets, mainline, - ei.dboffset, ei.dbsize, - ei.lnoffset, ei.lnsize); + const struct ecoff_debug_swap *swap; + + /* .mdebug section, presumably holding ECOFF debugging + information. */ + swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; + if (swap) + elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect, + section_offsets); } if (ei.stabsect) { @@ -649,16 +670,18 @@ elf_symfile_read (objfile, section_offsets, mainline) str_sect->filepos, bfd_section_size (abfd, str_sect)); } - if (ei.mdebugsect) + if (dwarf2_has_info (abfd)) { - const struct ecoff_debug_swap *swap; - - /* .mdebug section, presumably holding ECOFF debugging - information. */ - swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; - if (swap) - elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect, - section_offsets); + /* DWARF 2 sections */ + dwarf2_build_psymtabs (objfile, section_offsets, mainline); + } + else if (ei.dboffset && ei.lnoffset) + { + /* DWARF sections */ + dwarf_build_psymtabs (objfile, + section_offsets, mainline, + ei.dboffset, ei.dbsize, + ei.lnoffset, ei.lnsize); } /* Install any minimal symbols that have been collected as the current |