aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>1997-12-17 16:50:18 +0000
committerAndrew Cagney <cagney@redhat.com>1997-12-17 16:50:18 +0000
commit4dbdbfc4d3dff2234894d5a048a84f0361277213 (patch)
tree39a40cd323fcdceb56e40d75be1d960cbd458edb
parent6124cd1e59f077d87fb718f1e36ead2cbe38c6ff (diff)
downloadgdb-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
-rw-r--r--gdb/ChangeLog27
-rw-r--r--gdb/elfread.c63
-rw-r--r--gdb/hpread.c15
-rw-r--r--gdb/mdebugread.c7
-rw-r--r--gdb/os9kread.c18
-rw-r--r--gdb/xcoffread.c15
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 <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
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;