From 4dbdbfc4d3dff2234894d5a048a84f0361277213 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Wed, 17 Dec 1997 16:50:18 +0000 Subject: [PATCH] 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 --- gdb/ChangeLog | 27 ++++++++++++++++++++++++ gdb/elfread.c | 63 ++++++++++++++++++++++++++++++++++++++------------------ gdb/hpread.c | 15 +------------- gdb/mdebugread.c | 7 ------- gdb/os9kread.c | 18 +++------------- gdb/xcoffread.c | 15 +------------- 6 files changed, 75 insertions(+), 70 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0dceb05..c5660fc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,30 @@ +Thu Dec 18 00:26:46 1997 Andrew Cagney + + * mdebugread.c (parse_partial_symbols): Delete check that symbols + for file not already loaded. Did not work when an include file + was involved. + +Wed Dec 17 10:43:04 1997 Andrew Cagney + + * elfread.c (elf_symfile_read): Since the partial symbol table is + searched last in first, insert mdebug or XCOFF info into the + partial symbol table before any DWARF2 info. + +Thu Dec 18 00:00:48 1997 Andrew Cagney + + * symfile.c (init_psymbol_list): Handle init with zero elements. + + * elfread.c (elf_symfile_read): If `mainline', clear psymbol table + using init_psymbol_list 0. For build_psymtabs functions, pass + mainline==0 so that psymbol_list isn't re-initialized. + + * symfile.c (discard_psymtab): New function, correctly unlink an + empty psymtab from an object file. + * dbxread.c (end_psymtab): Call discard_psymtab. + * xcoffread.c (xcoff_end_psymtab): Ditto. + * hpread.c (hpread_end_psymtab): Ditto. + * os9kread.c (os9k_end_psymtab): Ditto. + Wed Dec 17 10:47:05 1997 Michael Snyder (msnyder@cleaver.cygnus.com) * tracepoint.c (set_raw_tracepoint): initialize addr_string 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 diff --git a/gdb/hpread.c b/gdb/hpread.c index 8183558..0e41746 100644 --- a/gdb/hpread.c +++ b/gdb/hpread.c @@ -938,21 +938,8 @@ hpread_end_psymtab (pst, include_list, num_includes, capping_symbol_offset, is wrong, in that a psymtab with N_SLINE entries but nothing else is not empty, but we don't realize that. Fixing that without slowing things down might be tricky. */ - struct partial_symtab *prev_pst; - /* First, snip it out of the psymtab chain */ - - if (pst->objfile->psymtabs == pst) - pst->objfile->psymtabs = pst->next; - else - for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next) - if (prev_pst->next == pst) - prev_pst->next = pst->next; - - /* Next, put it on a free list for recycling */ - - pst->next = pst->objfile->free_psymtabs; - pst->objfile->free_psymtabs = pst; + discard_psymtab (pst); /* Indicate that psymtab was thrown away. */ pst = (struct partial_symtab *)NULL; diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index f3f3ec4..807c36f 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -2490,13 +2490,6 @@ parse_partial_symbols (objfile, section_offsets) cur_fdr = fh = debug_info->fdr + f_idx; - /* If a partial symbol table has already been read for this file, - don't make another one. This works around a problem with some - compilers that emit both DWARF and mdebug sections for a single - module. */ - if (lookup_partial_symtab (fdr_name (fh))) - continue; - if (fh->csym == 0) { fdr_to_pst[f_idx].pst = NULL; diff --git a/gdb/os9kread.c b/gdb/os9kread.c index 4370653..e143090 100644 --- a/gdb/os9kread.c +++ b/gdb/os9kread.c @@ -1003,7 +1003,7 @@ os9k_end_psymtab (pst, include_list, num_includes, capping_symbol_cnt, CORE_ADDR capping_text; struct partial_symtab **dependency_list; int number_dependencies; -/* struct partial_symbol *capping_global, *capping_static;*/ + /* struct partial_symbol *capping_global, *capping_static; */ { int i; struct partial_symtab *p1; @@ -1160,22 +1160,10 @@ os9k_end_psymtab (pst, include_list, num_includes, capping_symbol_cnt, && pst->n_static_syms == 0) { /* Throw away this psymtab, it's empty. We can't deallocate it, since it is on the obstack, but we can forget to chain it on the list. */ - struct partial_symtab *prev_pst; - - /* First, snip it out of the psymtab chain */ - - if (pst->objfile->psymtabs == pst) - pst->objfile->psymtabs = pst->next; - else - for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next) - if (prev_pst->next == pst) - prev_pst->next = pst->next; + /* Indicate that psymtab was thrown away. */ - /* Next, put it on a free list for recycling */ - pst->next = pst->objfile->free_psymtabs; - pst->objfile->free_psymtabs = pst; + discard_psymtab (pst); - /* Indicate that psymtab was thrown away. */ pst = (struct partial_symtab *)NULL; } return pst; diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 956f576..dc34f32 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -2115,21 +2115,8 @@ xcoff_end_psymtab (pst, include_list, num_includes, capping_symbol_number, it is on the obstack, but we can forget to chain it on the list. */ /* Empty psymtabs happen as a result of header files which don't have any symbols in them. There can be a lot of them. */ - struct partial_symtab *prev_pst; - /* First, snip it out of the psymtab chain */ - - if (pst->objfile->psymtabs == pst) - pst->objfile->psymtabs = pst->next; - else - for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next) - if (prev_pst->next == pst) - prev_pst->next = pst->next; - - /* Next, put it on a free list for recycling */ - - pst->next = pst->objfile->free_psymtabs; - pst->objfile->free_psymtabs = pst; + discard_psymtab (pst); /* Indicate that psymtab was thrown away. */ pst = (struct partial_symtab *)NULL; -- 2.7.4