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
This commit is contained in:
Andrew Cagney 1997-12-17 16:50:18 +00:00
parent 6124cd1e59
commit 4dbdbfc4d3
6 changed files with 76 additions and 71 deletions

View file

@ -1,3 +1,30 @@
Thu Dec 18 00:26:46 1997 Andrew Cagney <cagney@b1.cygnus.com>
* 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 <cagney@b1.cygnus.com>
* 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 <cagney@b1.cygnus.com>
* 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

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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;
/* Next, put it on a free list for recycling */
pst->next = pst->objfile->free_psymtabs;
pst->objfile->free_psymtabs = pst;
/* Indicate that psymtab was thrown away. */
discard_psymtab (pst);
pst = (struct partial_symtab *)NULL;
}
return pst;

View file

@ -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;