o Fix code deleting psymtab entry from objfile's list.
authorAndrew Cagney <cagney@redhat.com>
Wed, 17 Dec 1997 16:50:18 +0000 (16:50 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 17 Dec 1997 16:50:18 +0000 (16:50 +0000)
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
gdb/elfread.c
gdb/hpread.c
gdb/mdebugread.c
gdb/os9kread.c
gdb/xcoffread.c

index 0dceb05d2db31abf5b89d6ec68dd5db0d38732a3..c5660fc79271e435a5a705386fc1d55e675508e5 100644 (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
index d698be7be2928a4445c7b63217f32d2f09e51357..179a0ef08a85ebf486b5b1aa6731b6d7b621566f 100644 (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
index 8183558568940109cb31a0f77b82e67cdbbad73d..0e4174600eeb0881a63da0b1eb9aa8b4c861e45a 100644 (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;
index f3f3ec42093bedba1e9655ba92a78761ccdc20ac..807c36f9df6cc9d85cea28aad4d12799a1264ef7 100644 (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;
index 4370653c781e59f8565f42598a1e35e5ea8f2b00..e143090e13ddde79a987e7eae476ed643734ed47 100644 (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;
+    /* 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;
index 956f576e991e4e6607b1386e8bec780aa0ed8cf8..dc34f3285b88146b47866584ae3de4e58ea9279b 100644 (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;