* gdbint.texinfo (Host Definition): Remove description of
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index f3d01b59b1b07169c6a5e67d6387a4d6da52f66b..ed7e490850e050c1c8d55b13f66cd2fb8540907e 100644 (file)
@@ -1,5 +1,6 @@
 /* Read a symbol table in ECOFF format (Third-Eye).
-   Copyright 1986, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 1998
+   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001
    Free Software Foundation, Inc.
    Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
    CMU.  Major work by Per Bothner, John Gilmore and Ian Lance Taylor
@@ -78,8 +79,6 @@ typedef struct mips_extra_func_info
 #include "gdb_stat.h"
 #include "gdb_string.h"
 
-#include "gdb-stabs.h"
-
 #include "bfd.h"
 
 #include "coff/ecoff.h"                /* COFF-like aspects of ecoff files */
@@ -379,7 +378,7 @@ static PTR xzalloc (unsigned int);
 
 static void sort_blocks (struct symtab *);
 
-static int compare_blocks (const void *, const void *);
+static int compare_blocks (const PTR, const PTR);
 
 static struct partial_symtab *new_psymtab (char *, struct objfile *);
 
@@ -492,6 +491,11 @@ mdebug_build_psymtabs (struct objfile *objfile,
   debug_swap = swap;
   debug_info = info;
 
+  stabsread_new_init ();
+  buildsym_new_init ();
+  free_header_files ();
+  init_header_files ();
+        
   /* Make sure all the FDR information is swapped in.  */
   if (info->fdr == (FDR *) NULL)
     {
@@ -3211,10 +3215,11 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
   void (*swap_sym_in) (bfd *, PTR, SYMR *);
   void (*swap_pdr_in) (bfd *, PTR, PDR *);
   int i;
-  struct symtab *st;
+  struct symtab *st = NULL;
   FDR *fh;
   struct linetable *lines;
   CORE_ADDR lowest_pdr_addr = 0;
+  int last_symtab_ended = 0;
 
   if (pst->readin)
     return;
@@ -3320,8 +3325,30 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
                 complaining about them.  */
              if (type_code & N_STAB)
                {
-                 process_one_symbol (type_code, 0, valu, name,
-                                     pst->section_offsets, pst->objfile);
+                 /* If we found a trailing N_SO with no name, process
+                     it here instead of in process_one_symbol, so we
+                     can keep a handle to its symtab.  The symtab
+                     would otherwise be ended twice, once in
+                     process_one_symbol, and once after this loop. */
+                 if (type_code == N_SO
+                     && last_source_file
+                     && previous_stab_code != (unsigned char) N_SO
+                     && *name == '\000')
+                   {
+                     valu += ANOFFSET (pst->section_offsets,
+                                       SECT_OFF_TEXT (pst->objfile));
+                     previous_stab_code = N_SO;
+                     st = end_symtab (valu, pst->objfile,
+                                      SECT_OFF_TEXT (pst->objfile));
+                     end_stabs ();
+                     last_symtab_ended = 1;
+                   }
+                 else
+                   {
+                     last_symtab_ended = 0;
+                     process_one_symbol (type_code, 0, valu, name,
+                                         pst->section_offsets, pst->objfile);
+                   }
                }
              /* Similarly a hack.  */
              else if (name[0] == '#')
@@ -3370,8 +3397,12 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
          else
            complain (&stab_unknown_complaint, name);
        }
-      st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT (pst->objfile));
-      end_stabs ();
+
+      if (! last_symtab_ended)
+       {
+         st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT (pst->objfile));
+         end_stabs ();
+       }
 
       /* Sort the symbol table now, we are done adding symbols to it.
          We must do this before parse_procedure calls lookup_symbol.  */
This page took 0.024159 seconds and 4 git commands to generate.