* frame.c (deprecated_safe_get_selected_frame): New function.
[deliverable/binutils-gdb.git] / gdb / dbxread.c
index 26be70c18bbbe5f7cbf36709ff9fd05b4ed4ba01..fbfd1a987b6ab73b04e0c400c0d09aa9511d8879 100644 (file)
@@ -1,6 +1,6 @@
 /* Read dbx symbol tables and convert to internal format, for GDB.
    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003.
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -42,7 +42,7 @@
 #include <fcntl.h>
 #endif
 
-#include "obstack.h"
+#include "gdb_obstack.h"
 #include "gdb_stat.h"
 #include "symtab.h"
 #include "breakpoint.h"
 
 struct symloc
   {
-    /* The start (inclusive) and end (exclusive) addresses for this
-       partial symtab's text.  STABS doesn't reliably give us nice
-       start and end addresses for each function.  Instead, we are
-       told the addresses of various boundary points, and we have to
-       gather those together to build ranges.  These are our running
-       best guess as to the range of text addresses for this psymtab.  */
-    CORE_ADDR textlow, texthigh;
-
     /* Offset within the file symbol table of first local symbol for this
        file.  */
 
@@ -112,8 +104,6 @@ struct symloc
 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
-#define TEXTLOW(p) (SYMLOC(p)->textlow)
-#define TEXTHIGH(p) (SYMLOC(p)->texthigh)
 #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
 #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
 #define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
@@ -177,33 +167,27 @@ static int has_line_numbers;
 
 /* Complaints about the symbols we have encountered.  */
 
-struct complaint lbrac_complaint =
-{"bad block start address patched", 0, 0};
-
-struct complaint string_table_offset_complaint =
-{"bad string table offset in symbol %d", 0, 0};
-
-struct complaint unknown_symtype_complaint =
-{"unknown symbol type %s", 0, 0};
-
-struct complaint unknown_symchar_complaint =
-{"unknown symbol descriptor `%c'", 0, 0};
-
-struct complaint lbrac_rbrac_complaint =
-{"block start larger than block end", 0, 0};
-
-struct complaint lbrac_unmatched_complaint =
-{"unmatched N_LBRAC before symtab pos %d", 0, 0};
+static void
+unknown_symtype_complaint (const char *arg1)
+{
+  complaint (&symfile_complaints, "unknown symbol type %s", arg1);
+}
 
-struct complaint lbrac_mismatch_complaint =
-{"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
+static void
+lbrac_mismatch_complaint (int arg1)
+{
+  complaint (&symfile_complaints,
+            "N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", arg1);
+}
 
-struct complaint repeated_header_complaint =
-{"\"repeated\" header file %s not previously seen, at symtab pos %d", 0, 0};
+static void
+repeated_header_complaint (const char *arg1, int arg2)
+{
+  complaint (&symfile_complaints,
+            "\"repeated\" header file %s not previously seen, at symtab pos %d",
+            arg1, arg2);
+}
 
-struct complaint unclaimed_bincl_complaint =
-{"N_BINCL %s not in entries for any file, at symtab pos %d", 0, 0};
-\f
 /* find_text_range --- find start and end of loadable code sections
 
    The find_text_range function finds the shortest address range that
@@ -273,7 +257,9 @@ static int bincls_allocated;
 
 extern void _initialize_dbxread (void);
 
-static void process_now (struct objfile *);
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE static void process_now (struct objfile *);
+#endif /* OBSOLETE CFront */
 
 static void read_ofile_symtab (struct partial_symtab *);
 
@@ -374,7 +360,7 @@ add_old_header_file (char *name, int instance)
        add_this_object_header_file (i);
        return;
       }
-  complain (&repeated_header_complaint, name, symnum);
+  repeated_header_complaint (name, symnum);
 }
 
 /* Add to this file a "new" header file: definitions for its types follow.
@@ -604,19 +590,6 @@ dbx_symfile_read (struct objfile *objfile, int mainline)
 
   read_dbx_dynamic_symtab (objfile);
 
-  /* Take the text ranges the STABS partial symbol scanner computed
-     for each of the psymtabs and convert it into the canonical form
-     for psymtabs.  */
-  {
-    struct partial_symtab *p;
-
-    ALL_OBJFILE_PSYMTABS (objfile, p)
-      {
-        p->textlow = TEXTLOW (p);
-        p->texthigh = TEXTHIGH (p);
-      }
-  }
-
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile. */
 
@@ -665,7 +638,7 @@ dbx_symfile_init (struct objfile *objfile)
   /* Allocate struct to keep track of the symfile */
   objfile->sym_stab_info = (struct dbx_symfile_info *)
     xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
-  memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
+  memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
 
   DBX_TEXT_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
   DBX_DATA_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".data");
@@ -717,8 +690,8 @@ dbx_symfile_init (struct objfile *objfile)
       if (val < 0)
        perror_with_name (name);
 
-      memset ((PTR) size_temp, 0, sizeof (size_temp));
-      val = bfd_bread ((PTR) size_temp, sizeof (size_temp), sym_bfd);
+      memset (size_temp, 0, sizeof (size_temp));
+      val = bfd_bread (size_temp, sizeof (size_temp), sym_bfd);
       if (val < 0)
        {
          perror_with_name (name);
@@ -799,105 +772,106 @@ static struct external_nlist symbuf[4096];
 static int symbuf_idx;
 static int symbuf_end;
 
-/* cont_elem is used for continuing information in cfront.
-   It saves information about which types need to be fixed up and 
-   completed after all the stabs are read.  */
-struct cont_elem
-  {
-    /* sym and stabstring for continuing information in cfront */
-    struct symbol *sym;
-    char *stabs;
-    /* state dependencies (statics that must be preserved) */
-    int sym_idx;
-    int sym_end;
-    int symnum;
-    int (*func) (struct objfile *, struct symbol *, char *);
-    /* other state dependencies include:
-       (assumption is that these will not change since process_now FIXME!!)
-       stringtab_global
-       n_stabs
-       objfile
-       symfile_bfd */
-  };
-
-static struct cont_elem *cont_list = 0;
-static int cont_limit = 0;
-static int cont_count = 0;
-
-/* Arrange for function F to be called with arguments SYM and P later
-   in the stabs reading process.  */
-void
-process_later (struct symbol *sym, char *p,
-              int (*f) (struct objfile *, struct symbol *, char *))
-{
-
-  /* Allocate more space for the deferred list.  */
-  if (cont_count >= cont_limit - 1)
-    {
-      cont_limit += 32;                /* chunk size */
-
-      cont_list
-       = (struct cont_elem *) xrealloc (cont_list,
-                                        (cont_limit
-                                         * sizeof (struct cont_elem)));
-      if (!cont_list)
-       error ("Virtual memory exhausted\n");
-    }
-
-  /* Save state variables so we can process these stabs later.  */
-  cont_list[cont_count].sym_idx = symbuf_idx;
-  cont_list[cont_count].sym_end = symbuf_end;
-  cont_list[cont_count].symnum = symnum;
-  cont_list[cont_count].sym = sym;
-  cont_list[cont_count].stabs = p;
-  cont_list[cont_count].func = f;
-  cont_count++;
-}
-
-/* Call deferred funtions in CONT_LIST.  */
-
-static void
-process_now (struct objfile *objfile)
-{
-  int i;
-  int save_symbuf_idx;
-  int save_symbuf_end;
-  int save_symnum;
-  struct symbol *sym;
-  char *stabs;
-  int err;
-  int (*func) (struct objfile *, struct symbol *, char *);
-
-  /* Save the state of our caller, we'll want to restore it before
-     returning.  */
-  save_symbuf_idx = symbuf_idx;
-  save_symbuf_end = symbuf_end;
-  save_symnum = symnum;
-
-  /* Iterate over all the deferred stabs.  */
-  for (i = 0; i < cont_count; i++)
-    {
-      /* Restore the state for this deferred stab.  */
-      symbuf_idx = cont_list[i].sym_idx;
-      symbuf_end = cont_list[i].sym_end;
-      symnum = cont_list[i].symnum;
-      sym = cont_list[i].sym;
-      stabs = cont_list[i].stabs;
-      func = cont_list[i].func;
-
-      /* Call the function to handle this deferrd stab.  */
-      err = (*func) (objfile, sym, stabs);
-      if (err)
-       error ("Internal error: unable to resolve stab.\n");
-    }
-
-  /* Restore our caller's state.  */
-  symbuf_idx = save_symbuf_idx;
-  symbuf_end = save_symbuf_end;
-  symnum = save_symnum;
-  cont_count = 0;
-}
-
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE  /* cont_elem is used for continuing information in cfront.
+// OBSOLETE     It saves information about which types need to be fixed up and 
+// OBSOLETE     completed after all the stabs are read.  */
+// OBSOLETE  struct cont_elem
+// OBSOLETE    {
+// OBSOLETE      /* sym and stabstring for continuing information in cfront */
+// OBSOLETE      struct symbol *sym;
+// OBSOLETE      char *stabs;
+// OBSOLETE      /* state dependencies (statics that must be preserved) */
+// OBSOLETE      int sym_idx;
+// OBSOLETE      int sym_end;
+// OBSOLETE      int symnum;
+// OBSOLETE      int (*func) (struct objfile *, struct symbol *, char *);
+// OBSOLETE      /* other state dependencies include:
+// OBSOLETE         (assumption is that these will not change since process_now FIXME!!)
+// OBSOLETE         stringtab_global
+// OBSOLETE         n_stabs
+// OBSOLETE         objfile
+// OBSOLETE         symfile_bfd */
+// OBSOLETE    };
+
+// OBSOLETE  static struct cont_elem *cont_list = 0;
+// OBSOLETE  static int cont_limit = 0;
+// OBSOLETE  static int cont_count = 0;
+
+// OBSOLETE  /* Arrange for function F to be called with arguments SYM and P later
+// OBSOLETE     in the stabs reading process.  */
+// OBSOLETE  void
+// OBSOLETE  process_later (struct symbol *sym, char *p,
+// OBSOLETE           int (*f) (struct objfile *, struct symbol *, char *))
+// OBSOLETE  {
+
+// OBSOLETE    /* Allocate more space for the deferred list.  */
+// OBSOLETE    if (cont_count >= cont_limit - 1)
+// OBSOLETE      {
+// OBSOLETE        cont_limit += 32;           /* chunk size */
+
+// OBSOLETE        cont_list
+// OBSOLETE    = (struct cont_elem *) xrealloc (cont_list,
+// OBSOLETE                                     (cont_limit
+// OBSOLETE                                      * sizeof (struct cont_elem)));
+// OBSOLETE        if (!cont_list)
+// OBSOLETE    error ("Virtual memory exhausted\n");
+// OBSOLETE      }
+
+// OBSOLETE    /* Save state variables so we can process these stabs later.  */
+// OBSOLETE    cont_list[cont_count].sym_idx = symbuf_idx;
+// OBSOLETE    cont_list[cont_count].sym_end = symbuf_end;
+// OBSOLETE    cont_list[cont_count].symnum = symnum;
+// OBSOLETE    cont_list[cont_count].sym = sym;
+// OBSOLETE    cont_list[cont_count].stabs = p;
+// OBSOLETE    cont_list[cont_count].func = f;
+// OBSOLETE    cont_count++;
+// OBSOLETE  }
+
+// OBSOLETE  /* Call deferred funtions in CONT_LIST.  */
+
+// OBSOLETE  static void
+// OBSOLETE  process_now (struct objfile *objfile)
+// OBSOLETE  {
+// OBSOLETE    int i;
+// OBSOLETE    int save_symbuf_idx;
+// OBSOLETE    int save_symbuf_end;
+// OBSOLETE    int save_symnum;
+// OBSOLETE    struct symbol *sym;
+// OBSOLETE    char *stabs;
+// OBSOLETE    int err;
+// OBSOLETE    int (*func) (struct objfile *, struct symbol *, char *);
+
+// OBSOLETE    /* Save the state of our caller, we'll want to restore it before
+// OBSOLETE       returning.  */
+// OBSOLETE    save_symbuf_idx = symbuf_idx;
+// OBSOLETE    save_symbuf_end = symbuf_end;
+// OBSOLETE    save_symnum = symnum;
+
+// OBSOLETE    /* Iterate over all the deferred stabs.  */
+// OBSOLETE    for (i = 0; i < cont_count; i++)
+// OBSOLETE      {
+// OBSOLETE        /* Restore the state for this deferred stab.  */
+// OBSOLETE        symbuf_idx = cont_list[i].sym_idx;
+// OBSOLETE        symbuf_end = cont_list[i].sym_end;
+// OBSOLETE        symnum = cont_list[i].symnum;
+// OBSOLETE        sym = cont_list[i].sym;
+// OBSOLETE        stabs = cont_list[i].stabs;
+// OBSOLETE        func = cont_list[i].func;
+
+// OBSOLETE        /* Call the function to handle this deferrd stab.  */
+// OBSOLETE        err = (*func) (objfile, sym, stabs);
+// OBSOLETE        if (err)
+// OBSOLETE    error ("Internal error: unable to resolve stab.\n");
+// OBSOLETE      }
+
+// OBSOLETE    /* Restore our caller's state.  */
+// OBSOLETE    symbuf_idx = save_symbuf_idx;
+// OBSOLETE    symbuf_end = save_symbuf_end;
+// OBSOLETE    symnum = save_symnum;
+// OBSOLETE    cont_count = 0;
+// OBSOLETE  }
+#endif /* OBSOLETE CFront */
 
 /* Name of last function encountered.  Used in Solaris to approximate
    object file boundaries.  */
@@ -919,6 +893,10 @@ static struct stab_section_list *symbuf_sections;
 static unsigned int symbuf_left;
 static unsigned int symbuf_read;
 
+/* This variable stores a global stabs buffer, if we read stabs into
+   memory in one chunk in order to process relocations.  */
+static bfd_byte *stabs_data;
+
 /* Refill the symbol table input buffer
    and set the variables that control fetching entries from it.
    Reports an error if no data available.
@@ -931,8 +909,18 @@ fill_symbuf (bfd *sym_bfd)
   unsigned int count;
   int nbytes;
 
-  if (symbuf_sections == NULL)
-    count = sizeof (symbuf);
+  if (stabs_data)
+    {
+      nbytes = sizeof (symbuf);
+      if (nbytes > symbuf_left)
+        nbytes = symbuf_left;
+      memcpy (symbuf, stabs_data + symbuf_read, nbytes);
+    }
+  else if (symbuf_sections == NULL)
+    {
+      count = sizeof (symbuf);
+      nbytes = bfd_bread (symbuf, count, sym_bfd);
+    }
   else
     {
       if (symbuf_left <= 0)
@@ -948,9 +936,9 @@ fill_symbuf (bfd *sym_bfd)
       count = symbuf_left;
       if (count > sizeof (symbuf))
        count = sizeof (symbuf);
+      nbytes = bfd_bread (symbuf, count, sym_bfd);
     }
 
-  nbytes = bfd_bread ((PTR) symbuf, count, sym_bfd);
   if (nbytes < 0)
     perror_with_name (bfd_get_filename (sym_bfd));
   else if (nbytes == 0)
@@ -961,6 +949,18 @@ fill_symbuf (bfd *sym_bfd)
   symbuf_read += nbytes;
 }
 
+static void
+stabs_seek (int sym_offset)
+{
+  if (stabs_data)
+    {
+      symbuf_read += sym_offset;
+      symbuf_left -= sym_offset;
+    }
+  else
+    bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
+}
+
 #define INTERNALIZE_SYMBOL(intern, extern, abfd)                       \
   {                                                                    \
     (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);            \
@@ -1042,7 +1042,7 @@ find_corresponding_bincl_psymtab (char *name, int instance)
        && STREQ (name, bincl->name))
       return bincl->pst;
 
-  complain (&repeated_header_complaint, name, symnum);
+  repeated_header_complaint (name, symnum);
   return (struct partial_symtab *) 0;
 }
 
@@ -1051,7 +1051,7 @@ find_corresponding_bincl_psymtab (char *name, int instance)
 static void
 free_bincl_list (struct objfile *objfile)
 {
-  xmfree (objfile->md, (PTR) bincl_list);
+  xmfree (objfile->md, bincl_list);
   bincls_allocated = 0;
 }
 
@@ -1079,7 +1079,8 @@ set_namestring (struct objfile *objfile, struct internal_nlist nlist)
   if (((unsigned) nlist.n_strx + file_string_table_offset) >=
       DBX_STRINGTAB_SIZE (objfile))
     {
-      complain (&string_table_offset_complaint, symnum);
+      complaint (&symfile_complaints, "bad string table offset in symbol %d",
+                symnum);
       namestring = "<bad string table offset>";
     } 
   else
@@ -1230,6 +1231,60 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
   do_cleanups (back_to);
 }
 
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+static CORE_ADDR
+find_stab_function_addr (char *namestring, char *filename,
+                        struct objfile *objfile)
+{
+  struct minimal_symbol *msym;
+  char *p;
+  int n;
+
+  p = strchr (namestring, ':');
+  if (p == NULL)
+    p = namestring;
+  n = p - namestring;
+  p = alloca (n + 2);
+  strncpy (p, namestring, n);
+  p[n] = 0;
+
+  msym = lookup_minimal_symbol (p, filename, objfile);
+  if (msym == NULL)
+    {
+      /* Sun Fortran appends an underscore to the minimal symbol name,
+         try again with an appended underscore if the minimal symbol
+         was not found.  */
+      p[n] = '_';
+      p[n + 1] = 0;
+      msym = lookup_minimal_symbol (p, filename, objfile);
+    }
+
+  if (msym == NULL && filename != NULL)
+    {
+      /* Try again without the filename. */
+      p[n] = 0;
+      msym = lookup_minimal_symbol (p, NULL, objfile);
+    }
+  if (msym == NULL && filename != NULL)
+    {
+      /* And try again for Sun Fortran, but without the filename. */
+      p[n] = '_';
+      p[n + 1] = 0;
+      msym = lookup_minimal_symbol (p, NULL, objfile);
+    }
+
+  return msym == NULL ? 0 : SYMBOL_VALUE_ADDRESS (msym);
+}
+#endif /* SOFUN_ADDRESS_MAYBE_MISSING */
+
+static void
+function_outside_compilation_unit_complaint (const char *arg1)
+{
+  complaint (&symfile_complaints,
+            "function `%s' appears to be defined outside of all compilation units",
+            arg1);
+}
+
 /* Setup partial_symtab's describing each source file for which
    debugging information is available. */
 
@@ -1334,9 +1389,6 @@ read_dbx_symtab (struct objfile *objfile)
 
       switch (nlist.n_type)
        {
-         static struct complaint function_outside_compilation_unit = {
-           "function `%s' appears to be defined outside of all compilation units", 0, 0
-         };
          char *p;
          /*
           * Standard, external, non-debugger, symbols
@@ -1396,12 +1448,12 @@ read_dbx_symtab (struct objfile *objfile)
            if (past_first_source_file && pst
                /* The gould NP1 uses low values for .o and -l symbols
                   which are not the address.  */
-               && nlist.n_value >= TEXTLOW (pst))
+               && nlist.n_value >= pst->textlow)
              {
                end_psymtab (pst, psymtab_include_list, includes_used,
                             symnum * symbol_size,
-                            nlist.n_value > TEXTHIGH (pst)
-                            ? nlist.n_value : TEXTHIGH (pst),
+                            nlist.n_value > pst->texthigh
+                            ? nlist.n_value : pst->texthigh,
                             dependency_list, dependencies_used, textlow_not_set);
                pst = (struct partial_symtab *) 0;
                includes_used = 0;
@@ -1523,7 +1575,7 @@ read_dbx_symtab (struct objfile *objfile)
                  {
                    end_psymtab (pst, psymtab_include_list, includes_used,
                                 symnum * symbol_size,
-                                valu > TEXTHIGH (pst) ? valu : TEXTHIGH (pst),
+                                valu > pst->texthigh ? valu : pst->texthigh,
                                 dependency_list, dependencies_used,
                                 prev_textlow_not_set);
                    pst = (struct partial_symtab *) 0;
@@ -1587,7 +1639,9 @@ read_dbx_symtab (struct objfile *objfile)
            {
              /* FIXME: we should not get here without a PST to work on.
                 Attempt to recover.  */
-             complain (&unclaimed_bincl_complaint, namestring, symnum);
+             complaint (&symfile_complaints,
+                        "N_BINCL %s not in entries for any file, at symtab pos %d",
+                        namestring, symnum);
              continue;
            }
            add_bincl_to_list (pst, namestring, nlist.n_value);
@@ -1648,7 +1702,7 @@ read_dbx_symtab (struct objfile *objfile)
              psymtab_include_list = (char **)
                alloca ((includes_allocated *= 2) *
                        sizeof (char *));
-             memcpy ((PTR) psymtab_include_list, (PTR) orig,
+             memcpy (psymtab_include_list, orig,
                      includes_used * sizeof (char *));
            }
            continue;
@@ -1682,8 +1736,8 @@ read_dbx_symtab (struct objfile *objfile)
               function relative stabs, or the address of the function's
               end for old style stabs.  */
            valu = nlist.n_value + last_function_start;
-           if (TEXTHIGH (pst) == 0 || valu > TEXTHIGH (pst))
-             TEXTHIGH (pst) = valu;
+           if (pst->texthigh == 0 || valu > pst->texthigh)
+             pst->texthigh = valu;
            break;
          }
 
@@ -1708,7 +1762,7 @@ read_dbx_symtab (struct objfile *objfile)
            namestring = STATIC_TRANSFORM_NAME (namestring);
 #endif
            add_psymbol_to_list (namestring, p - namestring,
-                                VAR_NAMESPACE, LOC_STATIC,
+                                VAR_DOMAIN, LOC_STATIC,
                                 &objfile->static_psymbols,
                                 0, nlist.n_value,
                                 psymtab_language, objfile);
@@ -1718,7 +1772,7 @@ read_dbx_symtab (struct objfile *objfile)
            /* The addresses in these entries are reported to be
               wrong.  See the code that reads 'G's for symtabs. */
            add_psymbol_to_list (namestring, p - namestring,
-                                VAR_NAMESPACE, LOC_STATIC,
+                                VAR_DOMAIN, LOC_STATIC,
                                 &objfile->global_psymbols,
                                 0, nlist.n_value,
                                 psymtab_language, objfile);
@@ -1736,7 +1790,7 @@ read_dbx_symtab (struct objfile *objfile)
                    && namestring[0] != ' '))
              {
                add_psymbol_to_list (namestring, p - namestring,
-                                    STRUCT_NAMESPACE, LOC_TYPEDEF,
+                                    STRUCT_DOMAIN, LOC_TYPEDEF,
                                     &objfile->static_psymbols,
                                     nlist.n_value, 0,
                                     psymtab_language, objfile);
@@ -1744,33 +1798,35 @@ read_dbx_symtab (struct objfile *objfile)
                  {
                    /* Also a typedef with the same name.  */
                    add_psymbol_to_list (namestring, p - namestring,
-                                        VAR_NAMESPACE, LOC_TYPEDEF,
+                                        VAR_DOMAIN, LOC_TYPEDEF,
                                         &objfile->static_psymbols,
                                         nlist.n_value, 0,
                                         psymtab_language, objfile);
                    p += 1;
                  }
-               /* The semantics of C++ state that "struct foo { ... }"
-                  also defines a typedef for "foo".  Unfortuantely, cfront
-                  never makes the typedef when translating from C++ to C.
-                  We make the typedef here so that "ptype foo" works as
-                  expected for cfront translated code.  */
-               else if (psymtab_language == language_cplus)
-                 {
-                   /* Also a typedef with the same name.  */
-                   add_psymbol_to_list (namestring, p - namestring,
-                                        VAR_NAMESPACE, LOC_TYPEDEF,
-                                        &objfile->static_psymbols,
-                                        nlist.n_value, 0,
-                                        psymtab_language, objfile);
-                 }
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE            /* The semantics of C++ state that "struct foo { ... }"
+// OBSOLETE               also defines a typedef for "foo".  Unfortuantely, cfront
+// OBSOLETE               never makes the typedef when translating from C++ to C.
+// OBSOLETE               We make the typedef here so that "ptype foo" works as
+// OBSOLETE               expected for cfront translated code.  */
+// OBSOLETE            else if (psymtab_language == language_cplus)
+// OBSOLETE              {
+// OBSOLETE                /* Also a typedef with the same name.  */
+// OBSOLETE                add_psymbol_to_list (namestring, p - namestring,
+// OBSOLETE                                     VAR_DOMAIN, LOC_TYPEDEF,
+// OBSOLETE                                     &objfile->static_psymbols,
+// OBSOLETE                                     nlist.n_value, 0,
+// OBSOLETE                                     psymtab_language, objfile);
+// OBSOLETE              }
+#endif /* OBSOLETE CFront */
              }
            goto check_enum;
          case 't':
            if (p != namestring)        /* a name is there, not just :T... */
              {
                add_psymbol_to_list (namestring, p - namestring,
-                                    VAR_NAMESPACE, LOC_TYPEDEF,
+                                    VAR_DOMAIN, LOC_TYPEDEF,
                                     &objfile->static_psymbols,
                                     nlist.n_value, 0,
                                     psymtab_language, objfile);
@@ -1832,7 +1888,7 @@ read_dbx_symtab (struct objfile *objfile)
                    /* Note that the value doesn't matter for
                       enum constants in psymtabs, just in symtabs.  */
                    add_psymbol_to_list (p, q - p,
-                                        VAR_NAMESPACE, LOC_CONST,
+                                        VAR_DOMAIN, LOC_CONST,
                                         &objfile->static_psymbols, 0,
                                         0, psymtab_language, objfile);
                    /* Point past the name.  */
@@ -1849,7 +1905,7 @@ read_dbx_symtab (struct objfile *objfile)
          case 'c':
            /* Constant, e.g. from "const" in Pascal.  */
            add_psymbol_to_list (namestring, p - namestring,
-                                VAR_NAMESPACE, LOC_CONST,
+                                VAR_DOMAIN, LOC_CONST,
                                 &objfile->static_psymbols, nlist.n_value,
                                 0, psymtab_language, objfile);
            continue;
@@ -1861,7 +1917,7 @@ read_dbx_symtab (struct objfile *objfile)
                char *name = xmalloc (name_len + 1);
                memcpy (name, namestring, name_len);
                name[name_len] = '\0';
-               complain (&function_outside_compilation_unit, name);
+               function_outside_compilation_unit_complaint (name);
                xfree (name);
              }
            nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
@@ -1885,7 +1941,7 @@ read_dbx_symtab (struct objfile *objfile)
              }
            if (pst && textlow_not_set)
              {
-               TEXTLOW (pst) = nlist.n_value;
+               pst->textlow = nlist.n_value;
                textlow_not_set = 0;
              }
 #endif
@@ -1901,16 +1957,16 @@ read_dbx_symtab (struct objfile *objfile)
               the partial symbol table.  */
            if (pst
                && (textlow_not_set
-                   || (nlist.n_value < TEXTLOW (pst)
+                   || (nlist.n_value < pst->textlow
                        && (nlist.n_value
                            != ANOFFSET (objfile->section_offsets,
                                         SECT_OFF_TEXT (objfile))))))
              {
-               TEXTLOW (pst) = nlist.n_value;
+               pst->textlow = nlist.n_value;
                textlow_not_set = 0;
              }
            add_psymbol_to_list (namestring, p - namestring,
-                                VAR_NAMESPACE, LOC_BLOCK,
+                                VAR_DOMAIN, LOC_BLOCK,
                                 &objfile->static_psymbols,
                                 0, nlist.n_value,
                                 psymtab_language, objfile);
@@ -1926,7 +1982,7 @@ read_dbx_symtab (struct objfile *objfile)
                char *name = xmalloc (name_len + 1);
                memcpy (name, namestring, name_len);
                name[name_len] = '\0';
-               complain (&function_outside_compilation_unit, name);
+               function_outside_compilation_unit_complaint (name);
                xfree (name);
              }
            nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
@@ -1950,7 +2006,7 @@ read_dbx_symtab (struct objfile *objfile)
              }
            if (pst && textlow_not_set)
              {
-               TEXTLOW (pst) = nlist.n_value;
+               pst->textlow = nlist.n_value;
                textlow_not_set = 0;
              }
 #endif
@@ -1966,16 +2022,16 @@ read_dbx_symtab (struct objfile *objfile)
               the partial symbol table.  */
            if (pst
                && (textlow_not_set
-                   || (nlist.n_value < TEXTLOW (pst)
+                   || (nlist.n_value < pst->textlow
                        && (nlist.n_value
                            != ANOFFSET (objfile->section_offsets,
                                         SECT_OFF_TEXT (objfile))))))
              {
-               TEXTLOW (pst) = nlist.n_value;
+               pst->textlow = nlist.n_value;
                textlow_not_set = 0;
              }
            add_psymbol_to_list (namestring, p - namestring,
-                                VAR_NAMESPACE, LOC_BLOCK,
+                                VAR_DOMAIN, LOC_BLOCK,
                                 &objfile->global_psymbols,
                                 0, nlist.n_value,
                                 psymtab_language, objfile);
@@ -1998,9 +2054,11 @@ read_dbx_symtab (struct objfile *objfile)
          case '9':
          case '-':
          case '#':             /* for symbol identification (used in live ranges) */
-           /* added to support cfront stabs strings */
-         case 'Z':             /* for definition continuations */
-         case 'P':             /* for prototypes */
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE        /* added to support cfront stabs strings */
+// OBSOLETE      case 'Z':             /* for definition continuations */
+// OBSOLETE      case 'P':             /* for prototypes */
+#endif /* OBSOLETE CFront */
            continue;
 
          case ':':
@@ -2021,7 +2079,8 @@ read_dbx_symtab (struct objfile *objfile)
               time searching to the end of every string looking for
               a backslash.  */
 
-           complain (&unknown_symchar_complaint, p[1]);
+           complaint (&symfile_complaints, "unknown symbol descriptor `%c'",
+                      p[1]);
 
            /* Ignore it; perhaps it is an extension that we don't
               know about.  */
@@ -2067,7 +2126,7 @@ read_dbx_symtab (struct objfile *objfile)
                      (struct partial_symtab **)
                      alloca ((dependencies_allocated *= 2)
                              * sizeof (struct partial_symtab *));
-                   memcpy ((PTR) dependency_list, (PTR) orig,
+                   memcpy (dependency_list, orig,
                            (dependencies_used
                             * sizeof (struct partial_symtab *)));
 #ifdef DEBUG_INFO
@@ -2083,7 +2142,7 @@ read_dbx_symtab (struct objfile *objfile)
          case N_ENDM:
 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
          /* Solaris 2 end of module, finish current partial symbol table.
-            end_psymtab will set TEXTHIGH (pst) to the proper value, which
+            end_psymtab will set pst->texthigh to the proper value, which
             is necessary if a module compiled without debugging info
             follows this module.  */
          if (pst)
@@ -2135,8 +2194,7 @@ read_dbx_symtab (struct objfile *objfile)
          default:
          /* If we haven't found it yet, ignore it.  It's probably some
             new type we don't know about yet.  */
-         complain (&unknown_symtype_complaint,
-                   local_hex_string (nlist.n_type));
+         unknown_symtype_complaint (local_hex_string (nlist.n_type));
          continue;
        }
     }
@@ -2163,7 +2221,7 @@ read_dbx_symtab (struct objfile *objfile)
 
       end_psymtab (pst, psymtab_include_list, includes_used,
                   symnum * symbol_size,
-                  text_end > TEXTHIGH (pst) ? text_end : TEXTHIGH (pst),
+                  text_end > pst->texthigh ? text_end : pst->texthigh,
                   dependency_list, dependencies_used, textlow_not_set);
     }
 
@@ -2189,8 +2247,6 @@ start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
 
   result->read_symtab_private = (char *)
     obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
-  TEXTLOW (result) = result->textlow;
-  TEXTHIGH (result) = result->texthigh;
   LDSYMOFF (result) = ldsymoff;
   result->read_symtab = dbx_psymtab_to_symtab;
   SYMBOL_SIZE (result) = symbol_size;
@@ -2226,7 +2282,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
 
   if (capping_symbol_offset != -1)
     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
-  TEXTHIGH (pst) = capping_text;
+  pst->texthigh = capping_text;
 
 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
   /* Under Solaris, the N_SO symbols always have a value of 0,
@@ -2244,7 +2300,7 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
      a reliable texthigh by taking the address plus size of the
      last function in the file.  */
 
-  if (TEXTHIGH (pst) == 0 && last_function_name)
+  if (pst->texthigh == 0 && last_function_name)
     {
       char *p;
       int n;
@@ -2270,14 +2326,14 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
        }
 
       if (minsym)
-       TEXTHIGH (pst) = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
+       pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
 
       last_function_name = NULL;
     }
 
   /* this test will be true if the last .o file is only data */
   if (textlow_not_set)
-    TEXTLOW (pst) = TEXTHIGH (pst);
+    pst->textlow = pst->texthigh;
   else
     {
       struct partial_symtab *p1;
@@ -2290,12 +2346,12 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
 
       ALL_OBJFILE_PSYMTABS (objfile, p1)
       {
-       if (TEXTHIGH (p1) == 0 && TEXTLOW (p1) != 0 && p1 != pst)
+       if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
          {
-           TEXTHIGH (p1) = TEXTLOW (pst);
+           p1->texthigh = pst->textlow;
            /* if this file has only data, then make textlow match texthigh */
-           if (TEXTLOW (p1) == 0)
-             TEXTLOW (p1) = TEXTHIGH (p1);
+           if (p1->textlow == 0)
+             p1->textlow = p1->texthigh;
          }
       }
     }
@@ -2332,8 +2388,8 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
                                sizeof (struct symloc));
       LDSYMOFF (subpst) =
        LDSYMLEN (subpst) =
-       TEXTLOW (subpst) =
-       TEXTHIGH (subpst) = 0;
+       subpst->textlow =
+       subpst->texthigh = 0;
 
       /* We could save slight bits of space by only making one of these,
          shared by the entire set of include files.  FIXME-someday.  */
@@ -2428,7 +2484,6 @@ dbx_psymtab_to_symtab_1 (struct partial_symtab *pst)
       /* Read in this file's symbols */
       bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
       read_ofile_symtab (pst);
-      sort_symtab_syms (pst->symtab);
 
       do_cleanups (old_chain);
     }
@@ -2443,6 +2498,7 @@ static void
 dbx_psymtab_to_symtab (struct partial_symtab *pst)
 {
   bfd *sym_bfd;
+  struct cleanup *back_to = NULL;
 
   if (!pst)
     return;
@@ -2468,8 +2524,21 @@ dbx_psymtab_to_symtab (struct partial_symtab *pst)
 
       next_symbol_text_func = dbx_next_symbol_text;
 
+      if (DBX_STAB_SECTION (pst->objfile))
+       {
+         stabs_data
+           = symfile_relocate_debug_section (pst->objfile->obfd,
+                                             DBX_STAB_SECTION (pst->objfile),
+                                             NULL);
+         if (stabs_data)
+           back_to = make_cleanup (free_current_contents, (void *) &stabs_data);
+       }
+
       dbx_psymtab_to_symtab_1 (pst);
 
+      if (back_to)
+       do_cleanups (back_to);
+
       /* Match with global symbols.  This only needs to be done once,
          after all of the symtabs and dependencies have been read in.   */
       scan_file_globals (pst->objfile);
@@ -2501,8 +2570,8 @@ read_ofile_symtab (struct partial_symtab *pst)
   objfile = pst->objfile;
   sym_offset = LDSYMOFF (pst);
   sym_size = LDSYMLEN (pst);
-  text_offset = TEXTLOW (pst);
-  text_size = TEXTHIGH (pst) - TEXTLOW (pst);
+  text_offset = pst->textlow;
+  text_size = pst->texthigh - pst->textlow;
   /* This cannot be simply objfile->section_offsets because of
      elfstab_offset_sections() which initializes the psymtab section
      offsets information in a special way, and that is different from
@@ -2518,6 +2587,8 @@ read_ofile_symtab (struct partial_symtab *pst)
   abfd = objfile->obfd;
   symfile_bfd = objfile->obfd; /* Implicit param to next_text_symbol */
   symbuf_end = symbuf_idx = 0;
+  symbuf_read = 0;
+  symbuf_left = sym_offset + sym_size;
 
   /* It is necessary to actually read one symbol *before* the start
      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
@@ -2527,7 +2598,7 @@ read_ofile_symtab (struct partial_symtab *pst)
      would slow down initial readin, so we look for it here instead.  */
   if (!processing_acc_compilation && sym_offset >= (int) symbol_size)
     {
-      bfd_seek (symfile_bfd, sym_offset - symbol_size, SEEK_CUR);
+      stabs_seek (sym_offset - symbol_size);
       fill_symbuf (abfd);
       bufp = &symbuf[symbuf_idx++];
       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
@@ -2570,7 +2641,7 @@ read_ofile_symtab (struct partial_symtab *pst)
       /* The N_SO starting this symtab is the first symbol, so we
          better not check the symbol before it.  I'm not this can
          happen, but it doesn't hurt to check for it.  */
-      bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
+      stabs_seek (sym_offset);
       processing_gcc_compilation = 0;
     }
 
@@ -2647,22 +2718,23 @@ read_ofile_symtab (struct partial_symtab *pst)
 
   /* In a Solaris elf file, this variable, which comes from the
      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
-     which comes from TEXTLOW (pst) is correct. */
+     which comes from pst->textlow is correct. */
   if (last_source_start_addr == 0)
     last_source_start_addr = text_offset;
 
   /* In reordered executables last_source_start_addr may not be the
      lower bound for this symtab, instead use text_offset which comes
-     from TEXTLOW (pst) which is correct.  */
+     from pst->textlow which is correct.  */
   if (last_source_start_addr > text_offset)
     last_source_start_addr = text_offset;
 
   pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
 
-  /* Process items which we had to "process_later" due to dependencies 
-     on other stabs.  */
-  process_now (objfile);
-
+#if 0 /* OBSOLETE CFront */
+// OBSOLETE    /* Process items which we had to "process_later" due to dependencies 
+// OBSOLETE       on other stabs.  */
+// OBSOLETE    process_now (objfile);
+#endif /* OBSOLETE CFront */
   end_stabs ();
 }
 \f
@@ -2707,6 +2779,16 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
      used to relocate these symbol types rather than SECTION_OFFSETS.  */
   static CORE_ADDR function_start_offset;
 
+  /* This holds the address of the start of a function, without the system
+     peculiarities of function_start_offset.  */
+  static CORE_ADDR last_function_start;
+
+  /* If this is nonzero, we've seen an N_SLINE since the start of the
+     current function.  We use this to tell us to move the first sline
+     to the beginning of the function regardless of what its given
+     value is. */
+  static int sline_found_in_function = 1;
+
   /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
      file.  Used to detect the SunPRO solaris compiler.  */
   static int n_opt_found;
@@ -2741,7 +2823,20 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
        {
          /* This N_FUN marks the end of a function.  This closes off the
             current block.  */
-         record_line (current_subfile, 0, function_start_offset + valu);
+
+         if (context_stack_depth <= 0)
+           {
+             lbrac_mismatch_complaint (symnum);
+             break;
+           }
+
+         /* The following check is added before recording line 0 at
+            end of function so as to handle hand-generated stabs
+            which may have an N_FUN stabs at the end of the function, but
+            no N_SLINE stabs.  */
+         if (sline_found_in_function)
+           record_line (current_subfile, 0, last_function_start + valu);
+
          within_function = 0;
          new = pop_context ();
 
@@ -2758,9 +2853,13 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
          break;
        }
 
+      sline_found_in_function = 0;
+
       /* Relocate for dynamic loading */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       valu = SMASH_TEXT_ADDRESS (valu);
+      last_function_start = valu;
+
       goto define_a_symbol;
 
     case N_LBRAC:
@@ -2783,7 +2882,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       if (!SUN_FIXED_LBRAC_BUG && valu < last_pc_address)
        {
          /* Patch current LBRAC pc value to match last handy pc value */
-         complain (&lbrac_complaint);
+         complaint (&symfile_complaints, "bad block start address patched");
          valu = last_pc_address;
        }
 #endif
@@ -2806,9 +2905,15 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
           N_SO, the linker did not relocate them (sigh).  */
        valu += last_source_start_addr;
 
+      if (context_stack_depth <= 0)
+       {
+         lbrac_mismatch_complaint (symnum);
+         break;
+       }
+
       new = pop_context ();
       if (desc != new->depth)
-       complain (&lbrac_mismatch_complaint, symnum);
+       lbrac_mismatch_complaint (symnum);
 
       /* Some compilers put the variable decls inside of an
          LBRAC/RBRAC block.  This macro should be nonzero if this
@@ -2822,7 +2927,22 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       /* Can only use new->locals as local symbols here if we're in
          gcc or on a machine that puts them before the lbrack.  */
       if (!VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
-       local_symbols = new->locals;
+       {
+         if (local_symbols != NULL)
+           {
+             /* GCC development snapshots from March to December of
+                2000 would output N_LSYM entries after N_LBRAC
+                entries.  As a consequence, these symbols are simply
+                discarded.  Complain if this is the case.  Note that
+                there are some compilers which legitimately put local
+                symbols within an LBRAC/RBRAC block; this complaint
+                might also help sort out problems in which
+                VARIABLES_INSIDE_BLOCK is incorrectly defined.  */
+             complaint (&symfile_complaints,
+                        "misplaced N_LBRAC entry; discarding local symbols which have no enclosing block");
+           }
+         local_symbols = new->locals;
+       }
 
       if (context_stack_depth
          > !VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
@@ -2839,7 +2959,8 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
                 compilers?  Is this ever harmful?).  */
              if (new->start_addr > valu)
                {
-                 complain (&lbrac_rbrac_complaint);
+                 complaint (&symfile_complaints,
+                            "block start larger than block end");
                  new->start_addr = valu;
                }
              /* Make a block for the local symbols within.  */
@@ -2953,7 +3074,15 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 #ifdef SUN_FIXED_LBRAC_BUG
       last_pc_address = valu;  /* Save for SunOS bug circumcision */
 #endif
-      record_line (current_subfile, desc, valu);
+      /* If this is the first SLINE note in the function, record it at
+        the start of the function instead of at the listed location.  */
+      if (within_function && sline_found_in_function == 0)
+       {
+         record_line (current_subfile, desc, last_function_start);
+         sline_found_in_function = 1;
+       }
+      else
+       record_line (current_subfile, desc, valu);
       break;
 
     case N_BCOMM:
@@ -3055,7 +3184,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
     case N_NBBSS:
     case N_NBSTS:
     case N_NBLCS:
-      complain (&unknown_symtype_complaint, local_hex_string (type));
+      unknown_symtype_complaint (local_hex_string (type));
       /* FALLTHROUGH */
 
       /* The following symbol types don't need the address field relocated,
@@ -3137,13 +3266,13 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
                  int l = colon_pos - name;
 
                  m = lookup_minimal_symbol_by_pc (last_pc_address);
-                 if (m && STREQN (SYMBOL_NAME (m), name, l)
-                     && SYMBOL_NAME (m)[l] == '\0')
+                 if (m && STREQN (DEPRECATED_SYMBOL_NAME (m), name, l)
+                     && DEPRECATED_SYMBOL_NAME (m)[l] == '\0')
                    /* last_pc_address was in this function */
                    valu = SYMBOL_VALUE (m);
-                 else if (m && SYMBOL_NAME (m + 1)
-                          && STREQN (SYMBOL_NAME (m + 1), name, l)
-                          && SYMBOL_NAME (m + 1)[l] == '\0')
+                 else if (m && DEPRECATED_SYMBOL_NAME (m + 1)
+                          && STREQN (DEPRECATED_SYMBOL_NAME (m + 1), name, l)
+                          && DEPRECATED_SYMBOL_NAME (m + 1)[l] == '\0')
                    /* last_pc_address was in last function */
                    valu = SYMBOL_VALUE (m + 1);
                  else
@@ -3167,7 +3296,8 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 
              if (context_stack_depth > 1)
                {
-                 complain (&lbrac_unmatched_complaint, symnum);
+                 complaint (&symfile_complaints,
+                            "unmatched N_LBRAC before symtab pos %d", symnum);
                  break;
                }
 
@@ -3378,8 +3508,7 @@ coffstab_build_psymtabs (struct objfile *objfile, int mainline,
    the base address of the text segment).
    MAINLINE is true if we are reading the main symbol
    table (as opposed to a shared lib or dynamically loaded file).
-   STABOFFSET and STABSIZE define the location in OBJFILE where the .stab
-   section exists.
+   STABSECT is the BFD section information for the .stab section.
    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
    .stabstr section exists.
 
@@ -3388,13 +3517,14 @@ coffstab_build_psymtabs (struct objfile *objfile, int mainline,
 
 void
 elfstab_build_psymtabs (struct objfile *objfile, int mainline,
-                       file_ptr staboffset, unsigned int stabsize,
+                       asection *stabsect,
                        file_ptr stabstroffset, unsigned int stabstrsize)
 {
   int val;
   bfd *sym_bfd = objfile->obfd;
   char *name = bfd_get_filename (sym_bfd);
   struct dbx_symfile_info *info;
+  struct cleanup *back_to = NULL;
 
   /* There is already a dbx_symfile_info allocated by our caller.
      It might even contain some info from the ELF symtab to help us.  */
@@ -3406,9 +3536,11 @@ elfstab_build_psymtabs (struct objfile *objfile, int mainline,
 
 #define        ELF_STABS_SYMBOL_SIZE   12      /* XXX FIXME XXX */
   DBX_SYMBOL_SIZE (objfile) = ELF_STABS_SYMBOL_SIZE;
-  DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
+  DBX_SYMCOUNT (objfile)
+    = bfd_section_size (objfile->obfd, stabsect) / DBX_SYMBOL_SIZE (objfile);
   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
-  DBX_SYMTAB_OFFSET (objfile) = staboffset;
+  DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;
+  DBX_STAB_SECTION (objfile) = stabsect;
 
   if (stabstrsize > bfd_get_size (sym_bfd))
     error ("ridiculous string table size: %d bytes", stabstrsize);
@@ -3429,14 +3561,25 @@ elfstab_build_psymtabs (struct objfile *objfile, int mainline,
   buildsym_new_init ();
   free_header_files ();
   init_header_files ();
-  install_minimal_symbols (objfile);
 
   processing_acc_compilation = 1;
 
+  symbuf_read = 0;
+  symbuf_left = bfd_section_size (objfile->obfd, stabsect);
+  stabs_data = symfile_relocate_debug_section (objfile->obfd, stabsect, NULL);
+  if (stabs_data)
+    back_to = make_cleanup (free_current_contents, (void *) &stabs_data);
+
   /* In an elf file, we've already installed the minimal symbols that came
      from the elf (non-stab) symbol table, so always act like an
-     incremental load here. */
+     incremental load here.  dbx_symfile_read should not generate any new
+     minimal symbols, since we will have already read the ELF dynamic symbol
+     table and normal symbol entries won't be in the ".stab" section; but in
+     case it does, it will install them itself.  */
   dbx_symfile_read (objfile, 0);
+
+  if (back_to)
+    do_cleanups (back_to);
 }
 \f
 /* Scan and build partial symbols for a file with special sections for stabs
@@ -3514,7 +3657,6 @@ stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
   buildsym_new_init ();
   free_header_files ();
   init_header_files ();
-  install_minimal_symbols (objfile);
 
   /* Now, do an incremental load */
 
This page took 0.038076 seconds and 4 git commands to generate.