*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / xcoffread.c
index 87329f1c1c1629e3ae6e8de45464f94957f6738b..2720f6db2cd4f214cec93de6c882a709b9e7c1bd 100644 (file)
@@ -1,7 +1,7 @@
 /* Read AIX xcoff 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
-   Free Software Foundation, Inc.
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009,
+   2010 Free Software Foundation, Inc.
    Derived from coffread.c, dbxread.c, and a lot of hacking.
    Contributed by IBM Corporation.
 
@@ -9,7 +9,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +18,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "bfd.h"
@@ -31,7 +29,7 @@
 #include "gdb_string.h"
 
 #include <sys/param.h>
-#ifndef        NO_SYS_FILE
+#ifdef HAVE_SYS_FILE_H
 #include <sys/file.h>
 #endif
 #include "gdb_stat.h"
 #include "coff/xcoff.h"
 #include "libxcoff.h"
 #include "coff/rs6000.h"
+#include "xcoffread.h"
 
 #include "symtab.h"
 #include "gdbtypes.h"
+/* FIXME: ezannoni/2004-02-13 Verify if the include below is really needed.  */
 #include "symfile.h"
 #include "objfiles.h"
 #include "buildsym.h"
 #include "stabsread.h"
 #include "expression.h"
 #include "complaints.h"
+#include "psympriv.h"
 
 #include "gdb-stabs.h"
 
@@ -150,17 +151,25 @@ struct coff_symfile_info
     CORE_ADDR toc_offset;
   };
 
-static struct deprecated_complaint storclass_complaint =
-{"Unexpected storage class: %d", 0, 0};
-
-static struct deprecated_complaint bf_notfound_complaint =
-{"line numbers off, `.bf' symbol not found", 0, 0};
+static void
+bf_notfound_complaint (void)
+{
+  complaint (&symfile_complaints, _("line numbers off, `.bf' symbol not found"));
+}
 
-static struct deprecated_complaint ef_complaint =
-{"Mismatched .ef symbol ignored starting at symnum %d", 0, 0};
+static void
+ef_complaint (int arg1)
+{
+  complaint (&symfile_complaints,
+            _("Mismatched .ef symbol ignored starting at symnum %d"), arg1);
+}
 
-static struct deprecated_complaint eb_complaint =
-{"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
+static void
+eb_complaint (int arg1)
+{
+  complaint (&symfile_complaints,
+            _("Mismatched .eb symbol ignored starting at symnum %d"), arg1);
+}
 
 static void xcoff_initial_scan (struct objfile *, int);
 
@@ -182,10 +191,8 @@ static void xcoff_new_init (struct objfile *);
 
 static void xcoff_symfile_finish (struct objfile *);
 
-static void
-xcoff_symfile_offsets (struct objfile *, struct section_addr_info *addrs);
-
-static void find_linenos (bfd *, sec_ptr, PTR);
+static void xcoff_symfile_offsets (struct objfile *,
+                                  struct section_addr_info *addrs);
 
 static char *coff_getfilename (union internal_auxent *, struct objfile *);
 
@@ -229,7 +236,7 @@ struct find_targ_sec_arg
 static void find_targ_sec (bfd *, asection *, void *);
 
 static void
-find_targ_sec (bfd *abfd, asection *sect, PTR obj)
+find_targ_sec (bfd *abfd, asection *sect, void *obj)
 {
   struct find_targ_sec_arg *args = (struct find_targ_sec_arg *) obj;
   struct objfile *objfile = args->objfile;
@@ -483,9 +490,7 @@ record_include_begin (struct coff_symbol *cs)
       /* This can happen with old versions of GCC.
          GCC 2.3.3-930426 does not exhibit this on a test case which
          a user said produced the message for him.  */
-      static struct deprecated_complaint msg =
-      {"Nested C_BINCL symbols", 0, 0};
-      complain (&msg);
+      complaint (&symfile_complaints, _("Nested C_BINCL symbols"));
     }
   ++inclDepth;
 
@@ -502,9 +507,7 @@ record_include_end (struct coff_symbol *cs)
 
   if (inclDepth == 0)
     {
-      static struct deprecated_complaint msg =
-      {"Mismatched C_BINCL/C_EINCL pair", 0, 0};
-      complain (&msg);
+      complaint (&symfile_complaints, _("Mismatched C_BINCL/C_EINCL pair"));
     }
 
   allocate_include_entry ();
@@ -550,7 +553,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
 {
   int offset, ii;
   file_ptr max_offset =
-  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
+  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)
   ->max_lineno_offset;
 
   /* subfile structure for the main compilation unit.  */
@@ -598,17 +601,32 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
                 start, 0, &main_source_baseline);
            }
 
-         /* Have a new subfile for the include file.  */
+         if (strcmp (inclTable[ii].name, last_source_file) == 0)
+           {
+              /* The entry in the include table refers to the main source
+                 file. Add the lines to the main subfile.  */
+
+             main_source_baseline = inclTable[ii].funStartLine;
+             enter_line_range
+               (&main_subfile, inclTable[ii].begin, inclTable[ii].end,
+                start, 0, &main_source_baseline);
+             inclTable[ii].subfile = &main_subfile;
+           }
+         else
+           {
+
+             /* Have a new subfile for the include file.  */
 
-         tmpSubfile = inclTable[ii].subfile =
-           (struct subfile *) xmalloc (sizeof (struct subfile));
+             tmpSubfile = inclTable[ii].subfile =
+               (struct subfile *) xmalloc (sizeof (struct subfile));
 
-         memset (tmpSubfile, '\0', sizeof (struct subfile));
-         firstLine = &(inclTable[ii].funStartLine);
+             memset (tmpSubfile, '\0', sizeof (struct subfile));
+             firstLine = &(inclTable[ii].funStartLine);
 
-         /* Enter include file's lines now.  */
-         enter_line_range (tmpSubfile, inclTable[ii].begin,
-                           inclTable[ii].end, start, 0, firstLine);
+             /* Enter include file's lines now.  */
+             enter_line_range (tmpSubfile, inclTable[ii].begin,
+                               inclTable[ii].end, start, 0, firstLine);
+           }
 
          if (offset <= inclTable[ii].end)
            offset = inclTable[ii].end + linesz;
@@ -654,7 +672,8 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
 
   for (ii = 0; ii < inclIndx; ++ii)
     {
-      if ((inclTable[ii].subfile)->line_vector)                /* Useless if!!! FIXMEmgo */
+      if (inclTable[ii].subfile != ((struct subfile *) &main_subfile)
+          && (inclTable[ii].subfile)->line_vector)             /* Useless if!!! FIXMEmgo */
        {
          struct linetable *lineTb, *lv;
 
@@ -726,7 +745,7 @@ return_after_cleanup:
   memset (&main_subfile, '\0', sizeof (struct subfile));
 }
 
-void
+static void
 aix_process_linenos (void)
 {
   /* process line numbers and enter them into line vector */
@@ -747,6 +766,8 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
                  CORE_ADDR startaddr,  /* offsets to line table */
                  CORE_ADDR endaddr, unsigned *firstLine)
 {
+  struct objfile *objfile = this_symtab_psymtab->objfile;
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   unsigned int curoffset;
   CORE_ADDR addr;
   void *ext_lnno;
@@ -759,16 +780,15 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
     return;
   curoffset = beginoffset;
   limit_offset =
-    ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
+    ((struct coff_symfile_info *) objfile->deprecated_sym_private)
     ->max_lineno_offset;
 
   if (endoffset != 0)
     {
       if (endoffset >= limit_offset)
        {
-         static struct deprecated_complaint msg =
-         {"Bad line table offset in C_EINCL directive", 0, 0};
-         complain (&msg);
+         complaint (&symfile_complaints,
+                    _("Bad line table offset in C_EINCL directive"));
          return;
        }
       limit_offset = endoffset;
@@ -776,7 +796,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
   else
     limit_offset -= 1;
 
-  abfd = this_symtab_psymtab->objfile->obfd;
+  abfd = objfile->obfd;
   linesz = coff_data (abfd)->local_linesz;
   ext_lnno = alloca (linesz);
 
@@ -790,8 +810,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
       addr = (int_lnno.l_lnno
              ? int_lnno.l_addr.l_paddr
              : read_symbol_nvalue (int_lnno.l_addr.l_symndx));
-      addr += ANOFFSET (this_symtab_psymtab->objfile->section_offsets,
-                       SECT_OFF_TEXT (this_symtab_psymtab->objfile));
+      addr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 
       if (addr < startaddr || (endaddr && addr >= endaddr))
        return;
@@ -799,11 +818,12 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
       if (int_lnno.l_lnno == 0)
        {
          *firstLine = read_symbol_lineno (int_lnno.l_addr.l_symndx);
-         record_line (subfile, 0, addr);
+         record_line (subfile, 0, gdbarch_addr_bits_remove (gdbarch, addr));
          --(*firstLine);
        }
       else
-       record_line (subfile, *firstLine + int_lnno.l_lnno, addr);
+       record_line (subfile, *firstLine + int_lnno.l_lnno,
+                    gdbarch_addr_bits_remove (gdbarch, addr));
       curoffset += linesz;
     }
 }
@@ -814,8 +834,8 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
    text address for the file, and SIZE is the number of bytes of text.  */
 
 #define complete_symtab(name, start_addr) {    \
-  last_source_file = savestring (name, strlen (name)); \
-  last_source_start_addr = start_addr;                 \
+  last_source_file = xstrdup (name);           \
+  last_source_start_addr = start_addr;         \
 }
 
 
@@ -834,7 +854,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
   namestr = (NAME); \
   if (namestr[0] == '.') ++namestr; \
   prim_record_minimal_symbol_and_info (namestr, (ADDR), (TYPE), \
-                                      (char *)NULL, (SECTION), (asection *)NULL, (OBJFILE)); \
+                                      (SECTION), (asection *)NULL, (OBJFILE)); \
   misc_func_recorded = 1;                                      \
 }
 
@@ -864,16 +884,15 @@ static char *
 xcoff_next_symbol_text (struct objfile *objfile)
 {
   struct internal_syment symbol;
-  static struct deprecated_complaint msg =
-  {"Unexpected symbol continuation", 0, 0};
   char *retval;
   /* FIXME: is this the same as the passed arg? */
-  objfile = this_symtab_psymtab->objfile;
+  if (this_symtab_psymtab)
+    objfile = this_symtab_psymtab->objfile;
 
   bfd_coff_swap_sym_in (objfile->obfd, raw_symbol, &symbol);
   if (symbol.n_zeroes)
     {
-      complain (&msg);
+      complaint (&symfile_complaints, _("Unexpected symbol continuation"));
 
       /* Return something which points to '\0' and hope the symbol reading
          code does something reasonable.  */
@@ -882,7 +901,7 @@ xcoff_next_symbol_text (struct objfile *objfile)
   else if (symbol.n_sclass & 0x80)
     {
       retval =
-       ((struct coff_symfile_info *) objfile->sym_private)->debugsec
+       ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec
        + symbol.n_offset;
       raw_symbol +=
        coff_data (objfile->obfd)->local_symesz;
@@ -890,7 +909,7 @@ xcoff_next_symbol_text (struct objfile *objfile)
     }
   else
     {
-      complain (&msg);
+      complaint (&symfile_complaints, _("Unexpected symbol continuation"));
 
       /* Return something which points to '\0' and hope the symbol reading
          code does something reasonable.  */
@@ -907,9 +926,9 @@ read_xcoff_symtab (struct partial_symtab *pst)
   struct objfile *objfile = pst->objfile;
   bfd *abfd = objfile->obfd;
   char *raw_auxptr;            /* Pointer to first raw aux entry for sym */
-  char *strtbl = ((struct coff_symfile_info *) objfile->sym_private)->strtbl;
+  char *strtbl = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl;
   char *debugsec =
-  ((struct coff_symfile_info *) objfile->sym_private)->debugsec;
+  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec;
   char *debugfmt = bfd_xcoff_is_xcoff64 (abfd) ? "XCOFF64" : "XCOFF";
 
   struct internal_syment symbol[1];
@@ -924,7 +943,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
   int depth = 0;
   int fcn_start_addr = 0;
 
-  struct coff_symbol fcn_stab_saved;
+  struct coff_symbol fcn_stab_saved = { 0 };
 
   /* fcn_cs_saved is global because process_xcoff_symbol needs it. */
   union internal_auxent fcn_aux_saved;
@@ -955,7 +974,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
   first_object_file_end = 0;
 
   raw_symbol =
-    ((struct coff_symfile_info *) objfile->sym_private)->symtbl
+    ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl
     + symnum * local_symesz;
 
   while (symnum < max_symnum)
@@ -989,7 +1008,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
            if (cs->c_name[E_SYMNMLEN - 1] != '\0')
              {
                char *p;
-               p = obstack_alloc (&objfile->symbol_obstack, E_SYMNMLEN + 1);
+               p = obstack_alloc (&objfile->objfile_obstack, E_SYMNMLEN + 1);
                strncpy (p, cs->c_name, E_SYMNMLEN);
                p[E_SYMNMLEN] = '\0';
                cs->c_name = p;
@@ -1252,7 +1271,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
          break;
 
        case C_FCN:
-         if (STREQ (cs->c_name, ".bf"))
+         if (strcmp (cs->c_name, ".bf") == 0)
            {
              CORE_ADDR off = ANOFFSET (objfile->section_offsets,
                                        SECT_OFF_TEXT (objfile));
@@ -1269,7 +1288,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
              if (new->name != NULL)
                SYMBOL_SECTION (new->name) = SECT_OFF_TEXT (objfile);
            }
-         else if (STREQ (cs->c_name, ".ef"))
+         else if (strcmp (cs->c_name, ".ef") == 0)
            {
 
              bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
@@ -1282,7 +1301,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
 
              if (context_stack_depth <= 0)
                {               /* We attempted to pop an empty context stack */
-                 complain (&ef_complaint, cs->c_symnum);
+                 ef_complaint (cs->c_symnum);
                  within_function = 0;
                  break;
                }
@@ -1290,7 +1309,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
              /* Stack must be empty now.  */
              if (context_stack_depth > 0 || new == NULL)
                {
-                 complain (&ef_complaint, cs->c_symnum);
+                 ef_complaint (cs->c_symnum);
                  within_function = 0;
                  break;
                }
@@ -1332,9 +1351,8 @@ read_xcoff_symtab (struct partial_symtab *pst)
        case C_UNTAG:
        case C_ENTAG:
          {
-           static struct deprecated_complaint msg =
-           {"Unrecognized storage class %d.", 0, 0};
-           complain (&msg, cs->c_sclass);
+           complaint (&symfile_complaints, _("Unrecognized storage class %d."),
+                      cs->c_sclass);
          }
          break;
 
@@ -1364,7 +1382,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
          break;
 
        case C_BLOCK:
-         if (STREQ (cs->c_name, ".bb"))
+         if (strcmp (cs->c_name, ".bb") == 0)
            {
              depth++;
              new = push_context (depth,
@@ -1372,17 +1390,17 @@ read_xcoff_symtab (struct partial_symtab *pst)
                                   + ANOFFSET (objfile->section_offsets,
                                               SECT_OFF_TEXT (objfile))));
            }
-         else if (STREQ (cs->c_name, ".eb"))
+         else if (strcmp (cs->c_name, ".eb") == 0)
            {
              if (context_stack_depth <= 0)
                {               /* We attempted to pop an empty context stack */
-                 complain (&eb_complaint, cs->c_symnum);
+                 eb_complaint (cs->c_symnum);
                  break;
                }
              new = pop_context ();
              if (depth-- != new->depth)
                {
-                 complain (&eb_complaint, cs->c_symnum);
+                 eb_complaint (cs->c_symnum);
                  break;
                }
              if (local_symbols && context_stack_depth > 0)
@@ -1424,24 +1442,21 @@ read_xcoff_symtab (struct partial_symtab *pst)
 
 #define        SYMBOL_DUP(SYMBOL1, SYMBOL2)    \
   (SYMBOL2) = (struct symbol *)                \
-       obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
+       obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol)); \
   *(SYMBOL2) = *(SYMBOL1);
 
 
 #define        SYMNAME_ALLOC(NAME, ALLOCED)    \
-  (ALLOCED) ? (NAME) : obsavestring ((NAME), strlen (NAME), &objfile->symbol_obstack);
-
+  ((ALLOCED) ? (NAME) : obsavestring ((NAME), strlen (NAME), &objfile->objfile_obstack))
 
-static struct type *func_symbol_type;
-static struct type *var_symbol_type;
 
 /* process one xcoff symbol. */
 
 static struct symbol *
-process_xcoff_symbol (register struct coff_symbol *cs, struct objfile *objfile)
+process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
 {
   struct symbol onesymbol;
-  register struct symbol *sym = &onesymbol;
+  struct symbol *sym = &onesymbol;
   struct symbol *sym2 = NULL;
   char *name, *pp;
 
@@ -1469,7 +1484,7 @@ process_xcoff_symbol (register struct coff_symbol *cs, struct objfile *objfile)
 
   /* default assumptions */
   SYMBOL_VALUE_ADDRESS (sym) = cs->c_value + off;
-  SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
+  SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
   SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
 
   if (ISFCN (cs->c_type))
@@ -1478,8 +1493,8 @@ process_xcoff_symbol (register struct coff_symbol *cs, struct objfile *objfile)
          will be patched with the type from its stab entry later on in
          patch_block_stabs (), unless the file was compiled without -g.  */
 
-      SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
-      SYMBOL_TYPE (sym) = func_symbol_type;
+      SYMBOL_SET_LINKAGE_NAME (sym, SYMNAME_ALLOC (name, symname_alloced));
+      SYMBOL_TYPE (sym) = objfile_type (objfile)->nodebug_text_symbol;
 
       SYMBOL_CLASS (sym) = LOC_BLOCK;
       SYMBOL_DUP (sym, sym2);
@@ -1492,7 +1507,7 @@ process_xcoff_symbol (register struct coff_symbol *cs, struct objfile *objfile)
   else
     {
       /* In case we can't figure out the type, provide default. */
-      SYMBOL_TYPE (sym) = var_symbol_type;
+      SYMBOL_TYPE (sym) = objfile_type (objfile)->nodebug_data_symbol;
 
       switch (cs->c_sclass)
        {
@@ -1520,7 +1535,8 @@ process_xcoff_symbol (register struct coff_symbol *cs, struct objfile *objfile)
          break;
 
        default:
-         complain (&storclass_complaint, cs->c_sclass);
+         complaint (&symfile_complaints, _("Unexpected storage class: %d"),
+                    cs->c_sclass);
          /* FALLTHROUGH */
 
        case C_DECL:
@@ -1581,7 +1597,7 @@ coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile)
 
   if (aux_entry->x_file.x_n.x_zeroes == 0)
     strcpy (buffer,
-           ((struct coff_symfile_info *) objfile->sym_private)->strtbl
+           ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
            + aux_entry->x_file.x_n.x_offset);
   else
     {
@@ -1596,16 +1612,12 @@ static void
 read_symbol (struct internal_syment *symbol, int symno)
 {
   int nsyms =
-  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
-  ->symtbl_num_syms;
+  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl_num_syms;
   char *stbl =
-  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
-  ->symtbl;
+  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl;
   if (symno < 0 || symno >= nsyms)
     {
-      static struct deprecated_complaint msg =
-      {"Invalid symbol offset", 0, 0};
-      complain (&msg);
+      complaint (&symfile_complaints, _("Invalid symbol offset"));
       symbol->n_value = 0;
       symbol->n_scnum = -1;
       return;
@@ -1637,7 +1649,7 @@ read_symbol_lineno (int symno)
   int xcoff64 = bfd_xcoff_is_xcoff64 (objfile->obfd);
 
   struct coff_symfile_info *info =
-    (struct coff_symfile_info *)objfile->sym_private;
+    (struct coff_symfile_info *)objfile->deprecated_sym_private;
   int nsyms = info->symtbl_num_syms;
   char *stbl = info->symtbl;
   char *strtbl = info->strtbl;
@@ -1647,7 +1659,7 @@ read_symbol_lineno (int symno)
 
   if (symno < 0)
     {
-      complain (&bf_notfound_complaint);
+      bf_notfound_complaint ();
       return 0;
     }
 
@@ -1674,13 +1686,13 @@ read_symbol_lineno (int symno)
       if (symbol->n_sclass == C_FCN)
        {
          char *name = xcoff64 ? strtbl + symbol->n_offset : symbol->n_name;
-         if (STREQ (name, ".bf"))
+         if (strcmp (name, ".bf") == 0)
            goto gotit;
        }
       symno += symbol->n_numaux + 1;
     }
 
-  complain (&bf_notfound_complaint);
+  bf_notfound_complaint ();
   return 0;
 
 gotit:
@@ -1700,7 +1712,7 @@ gotit:
  * mainline code can read the whole thing for efficiency.
  */
 static void
-find_linenos (bfd *abfd, sec_ptr asect, PTR vpinfo)
+find_linenos (struct bfd *abfd, struct bfd_section *asect, void *vpinfo)
 {
   struct coff_symfile_info *info;
   int size, count;
@@ -1708,7 +1720,7 @@ find_linenos (bfd *abfd, sec_ptr asect, PTR vpinfo)
 
   count = asect->lineno_count;
 
-  if (!STREQ (asect->name, ".text") || count == 0)
+  if (strcmp (asect->name, ".text") != 0 || count == 0)
     return;
 
   size = count * coff_data (abfd)->local_linesz;
@@ -1768,7 +1780,6 @@ xcoff_psymtab_to_symtab_1 (struct partial_symtab *pst)
       old_chain = make_cleanup (really_free_pendings, 0);
 
       read_xcoff_symtab (pst);
-      sort_symtab_syms (pst->symtab);
 
       do_cleanups (old_chain);
     }
@@ -1841,8 +1852,7 @@ static void
 xcoff_symfile_init (struct objfile *objfile)
 {
   /* Allocate struct to keep track of the symfile */
-  objfile->sym_private = xmmalloc (objfile->md,
-                                  sizeof (struct coff_symfile_info));
+  objfile->deprecated_sym_private = xmalloc (sizeof (struct coff_symfile_info));
 
   /* XCOFF objects may be reordered, so set OBJF_REORDERED.  If we
      find this causes a significant slowdown in gdb then we could
@@ -1860,9 +1870,9 @@ xcoff_symfile_init (struct objfile *objfile)
 static void
 xcoff_symfile_finish (struct objfile *objfile)
 {
-  if (objfile->sym_private != NULL)
+  if (objfile->deprecated_sym_private != NULL)
     {
-      xmfree (objfile->md, objfile->sym_private);
+      xfree (objfile->deprecated_sym_private);
     }
 
   /* Start with a fresh include table for the next objfile.  */
@@ -1883,10 +1893,10 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
   unsigned char lengthbuf[4];
   char *strtbl;
 
-  ((struct coff_symfile_info *) objfile->sym_private)->strtbl = NULL;
+  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl = NULL;
 
   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
-    error ("cannot seek to string table in %s: %s",
+    error (_("cannot seek to string table in %s: %s"),
           bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
 
   val = bfd_bread ((char *) lengthbuf, sizeof lengthbuf, abfd);
@@ -1898,11 +1908,11 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
   if (val != sizeof lengthbuf || length < sizeof lengthbuf)
     return;
 
-  /* Allocate string table from symbol_obstack. We will need this table
+  /* Allocate string table from objfile_obstack. We will need this table
      as long as we have its symbol table around. */
 
-  strtbl = (char *) obstack_alloc (&objfile->symbol_obstack, length);
-  ((struct coff_symfile_info *) objfile->sym_private)->strtbl = strtbl;
+  strtbl = (char *) obstack_alloc (&objfile->objfile_obstack, length);
+  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl = strtbl;
 
   /* Copy length buffer, the first byte is usually zero and is
      used for stabs with a name length of zero.  */
@@ -1913,10 +1923,10 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
   val = bfd_bread (strtbl + sizeof lengthbuf, length - sizeof lengthbuf, abfd);
 
   if (val != length - sizeof lengthbuf)
-    error ("cannot read string table from %s: %s",
+    error (_("cannot read string table from %s: %s"),
           bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
   if (strtbl[length - 1] != '\0')
-    error ("bad symbol file: string table does not end with null character");
+    error (_("bad symbol file: string table does not end with null character"));
 
   return;
 }
@@ -1949,8 +1959,8 @@ xcoff_start_psymtab (struct objfile *objfile, char *filename, int first_symnum,
                        0,
                        global_syms, static_syms);
 
-  result->read_symtab_private = (char *)
-    obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
+  result->read_symtab_private = obstack_alloc (&objfile->objfile_obstack,
+                                              sizeof (struct symloc));
   ((struct symloc *) result->read_symtab_private)->first_symnum = first_symnum;
   result->read_symtab = xcoff_psymtab_to_symtab;
 
@@ -1997,7 +2007,7 @@ xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
   if (number_dependencies)
     {
       pst->dependencies = (struct partial_symtab **)
-       obstack_alloc (&objfile->psymbol_obstack,
+       obstack_alloc (&objfile->objfile_obstack,
                    number_dependencies * sizeof (struct partial_symtab *));
       memcpy (pst->dependencies, dependency_list,
              number_dependencies * sizeof (struct partial_symtab *));
@@ -2011,9 +2021,8 @@ xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
       allocate_psymtab (include_list[i], objfile);
 
       subpst->section_offsets = pst->section_offsets;
-      subpst->read_symtab_private =
-       (char *) obstack_alloc (&objfile->psymbol_obstack,
-                               sizeof (struct symloc));
+      subpst->read_symtab_private = obstack_alloc (&objfile->objfile_obstack,
+                                                  sizeof (struct symloc));
       ((struct symloc *) subpst->read_symtab_private)->first_symnum = 0;
       ((struct symloc *) subpst->read_symtab_private)->numsyms = 0;
       subpst->textlow = 0;
@@ -2022,7 +2031,7 @@ xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
       /* We could save slight bits of space by only making one of these,
          shared by the entire set of include files.  FIXME-someday.  */
       subpst->dependencies = (struct partial_symtab **)
-       obstack_alloc (&objfile->psymbol_obstack,
+       obstack_alloc (&objfile->objfile_obstack,
                       sizeof (struct partial_symtab *));
       subpst->dependencies[0] = pst;
       subpst->number_of_dependencies = 1;
@@ -2039,11 +2048,6 @@ xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
 
   sort_pst_symbols (pst);
 
-  /* If there is already a psymtab or symtab for a file of this name,
-     remove it.  (If there is a symtab, more drastic things also
-     happen.)  This happens in VxWorks.  */
-  free_named_symtabs (pst->filename);
-
   if (num_includes == 0
       && number_dependencies == 0
       && pst->n_global_syms == 0
@@ -2085,7 +2089,7 @@ swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
          /* FIXME: wastes memory for symbols which we don't end up putting
             into the minimal symbols.  */
          char *p;
-         p = obstack_alloc (&objfile->psymbol_obstack, E_SYMNMLEN + 1);
+         p = obstack_alloc (&objfile->objfile_obstack, E_SYMNMLEN + 1);
          strncpy (p, symbol->n_name, E_SYMNMLEN);
          p[E_SYMNMLEN] = '\0';
          *name = p;
@@ -2097,12 +2101,12 @@ swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
     }
   else if (symbol->n_sclass & 0x80)
     {
-      *name = ((struct coff_symfile_info *) objfile->sym_private)->debugsec
+      *name = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec
        + symbol->n_offset;
     }
   else
     {
-      *name = ((struct coff_symfile_info *) objfile->sym_private)->strtbl
+      *name = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
        + symbol->n_offset;
     }
   ++*symnump;
@@ -2117,9 +2121,18 @@ swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
     }
 }
 
+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);
+}
+
 static void
 scan_xcoff_symtab (struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   CORE_ADDR toc_offset = 0;    /* toc offset value in data section. */
   char *filestring = NULL;
 
@@ -2168,9 +2181,10 @@ scan_xcoff_symtab (struct objfile *objfile)
   last_source_file = NULL;
 
   abfd = objfile->obfd;
+  next_symbol_text_func = xcoff_next_symbol_text;
 
-  sraw_symbol = ((struct coff_symfile_info *) objfile->sym_private)->symtbl;
-  nsyms = ((struct coff_symfile_info *) objfile->sym_private)->symtbl_num_syms;
+  sraw_symbol = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl;
+  nsyms = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms;
   ssymnum = 0;
   while (ssymnum < nsyms)
     {
@@ -2284,13 +2298,13 @@ scan_xcoff_symtab (struct objfile *objfile)
                      prim_record_minimal_symbol_and_info
                        (namestring, symbol.n_value,
                         sclass == C_HIDEXT ? mst_file_data : mst_data,
-                        NULL, secnum_to_section (symbol.n_scnum, objfile),
+                        secnum_to_section (symbol.n_scnum, objfile),
                         NULL, objfile);
                    break;
 
                  case XMC_TC0:
                    if (toc_offset)
-                     warning ("More than one XMC_TC0 symbol found.");
+                     warning (_("More than one XMC_TC0 symbol found."));
                    toc_offset = symbol.n_value;
 
                    /* Make TOC offset relative to start address of section.  */
@@ -2359,7 +2373,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                      prim_record_minimal_symbol_and_info
                        (namestring, symbol.n_value,
                         sclass == C_HIDEXT ? mst_file_data : mst_data,
-                        NULL, secnum_to_section (symbol.n_scnum, objfile),
+                        secnum_to_section (symbol.n_scnum, objfile),
                         NULL, objfile);
                    break;
                  }
@@ -2376,7 +2390,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                      prim_record_minimal_symbol_and_info
                        (namestring, symbol.n_value,
                         sclass == C_HIDEXT ? mst_file_bss : mst_bss,
-                        NULL, secnum_to_section (symbol.n_scnum, objfile),
+                        secnum_to_section (symbol.n_scnum, objfile),
                         NULL, objfile);
                    break;
                  }
@@ -2442,9 +2456,8 @@ scan_xcoff_symtab (struct objfile *objfile)
 
        default:
          {
-           static struct deprecated_complaint msg =
-           {"Storage class %d not recognized during scan", 0, 0};
-           complain (&msg, sclass);
+           complaint (&symfile_complaints,
+                      _("Storage class %d not recognized during scan"), sclass);
          }
          /* FALLTHROUGH */
 
@@ -2527,12 +2540,12 @@ scan_xcoff_symtab (struct objfile *objfile)
               things like "break c-exp.y:435" need to work (I
               suppose the psymtab_include_list could be hashed or put
               in a binary tree, if profiling shows this is a major hog).  */
-           if (pst && STREQ (namestring, pst->filename))
+           if (pst && strcmp (namestring, pst->filename) == 0)
              continue;
            {
-             register int i;
+             int i;
              for (i = 0; i < includes_used; i++)
-               if (STREQ (namestring, psymtab_include_list[i]))
+               if (strcmp (namestring, psymtab_include_list[i]) == 0)
                  {
                    i = -1;
                    break;
@@ -2548,7 +2561,7 @@ scan_xcoff_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;
@@ -2564,11 +2577,6 @@ scan_xcoff_symtab (struct objfile *objfile)
        case C_DECL:
        case C_STSYM:
          {
-
-           static struct deprecated_complaint function_outside_compilation_unit = {
-             "function `%s' appears to be defined outside of all compilation units", 0, 0
-           };
-
            char *p;
            swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
                      &ssymnum, objfile);
@@ -2588,11 +2596,13 @@ scan_xcoff_symtab (struct objfile *objfile)
              {
              case 'S':
                symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
-#ifdef STATIC_TRANSFORM_NAME
-               namestring = STATIC_TRANSFORM_NAME (namestring);
-#endif
-               add_psymbol_to_list (namestring, p - namestring,
-                                    VAR_NAMESPACE, LOC_STATIC,
+
+               if (gdbarch_static_transform_name_p (gdbarch))
+                 namestring = gdbarch_static_transform_name
+                                (gdbarch, namestring);
+
+               add_psymbol_to_list (namestring, p - namestring, 1,
+                                    VAR_DOMAIN, LOC_STATIC,
                                     &objfile->static_psymbols,
                                     0, symbol.n_value,
                                     psymtab_language, objfile);
@@ -2602,8 +2612,8 @@ scan_xcoff_symtab (struct objfile *objfile)
                symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (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,
+               add_psymbol_to_list (namestring, p - namestring, 1,
+                                    VAR_DOMAIN, LOC_STATIC,
                                     &objfile->global_psymbols,
                                     0, symbol.n_value,
                                     psymtab_language, objfile);
@@ -2620,43 +2630,29 @@ scan_xcoff_symtab (struct objfile *objfile)
                    || (p == namestring + 1
                        && namestring[0] != ' '))
                  {
-                   add_psymbol_to_list (namestring, p - namestring,
-                                        STRUCT_NAMESPACE, LOC_TYPEDEF,
+                   add_psymbol_to_list (namestring, p - namestring, 1,
+                                        STRUCT_DOMAIN, LOC_TYPEDEF,
                                         &objfile->static_psymbols,
                                         symbol.n_value, 0,
                                         psymtab_language, objfile);
                    if (p[2] == 't')
                      {
                        /* Also a typedef with the same name.  */
-                       add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_TYPEDEF,
+                       add_psymbol_to_list (namestring, p - namestring, 1,
+                                            VAR_DOMAIN, LOC_TYPEDEF,
                                             &objfile->static_psymbols,
                                             symbol.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,
-                                            symbol.n_value, 0,
-                                            psymtab_language, objfile);
-                     }
                  }
                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,
+                   add_psymbol_to_list (namestring, p - namestring, 1,
+                                        VAR_DOMAIN, LOC_TYPEDEF,
                                         &objfile->static_psymbols,
                                         symbol.n_value, 0,
                                         psymtab_language, objfile);
@@ -2717,8 +2713,8 @@ scan_xcoff_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,
+                       add_psymbol_to_list (p, q - p, 1,
+                                            VAR_DOMAIN, LOC_CONST,
                                             &objfile->static_psymbols, 0,
                                             0, psymtab_language, objfile);
                        /* Point past the name.  */
@@ -2735,8 +2731,8 @@ scan_xcoff_symtab (struct objfile *objfile)
 
              case 'c':
                /* Constant, e.g. from "const" in Pascal.  */
-               add_psymbol_to_list (namestring, p - namestring,
-                                    VAR_NAMESPACE, LOC_CONST,
+               add_psymbol_to_list (namestring, p - namestring, 1,
+                                    VAR_DOMAIN, LOC_CONST,
                                     &objfile->static_psymbols, symbol.n_value,
                                     0, psymtab_language, objfile);
                continue;
@@ -2748,12 +2744,12 @@ scan_xcoff_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);
                  }
                symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-               add_psymbol_to_list (namestring, p - namestring,
-                                    VAR_NAMESPACE, LOC_BLOCK,
+               add_psymbol_to_list (namestring, p - namestring, 1,
+                                    VAR_DOMAIN, LOC_BLOCK,
                                     &objfile->static_psymbols,
                                     0, symbol.n_value,
                                     psymtab_language, objfile);
@@ -2769,12 +2765,20 @@ scan_xcoff_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);
                  }
+
+               /* We need only the minimal symbols for these
+                  loader-generated definitions.   Keeping the global
+                  symbols leads to "in psymbols but not in symbols"
+                  errors. */
+               if (strncmp (namestring, "@FIX", 4) == 0)
+                 continue;
+
                symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-               add_psymbol_to_list (namestring, p - namestring,
-                                    VAR_NAMESPACE, LOC_BLOCK,
+               add_psymbol_to_list (namestring, p - namestring, 1,
+                                    VAR_DOMAIN, LOC_BLOCK,
                                     &objfile->global_psymbols,
                                     0, symbol.n_value,
                                     psymtab_language, objfile);
@@ -2797,9 +2801,6 @@ scan_xcoff_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 */
                continue;
 
              case ':':
@@ -2820,7 +2821,8 @@ scan_xcoff_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.  */
@@ -2841,16 +2843,16 @@ scan_xcoff_symtab (struct objfile *objfile)
      If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
      this information would be file auxiliary header. */
 
-  ((struct coff_symfile_info *) objfile->sym_private)->toc_offset = toc_offset;
+  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset = toc_offset;
 }
 
 /* Return the toc offset value for a given objfile.  */
 
 CORE_ADDR
-get_toc_offset (struct objfile *objfile)
+xcoff_get_toc_offset (struct objfile *objfile)
 {
   if (objfile)
-    return ((struct coff_symfile_info *) objfile->sym_private)->toc_offset;
+    return ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset;
   return 0;
 }
 
@@ -2861,11 +2863,10 @@ get_toc_offset (struct objfile *objfile)
 
    SECTION_OFFSETS contains offsets relative to which the symbols in the
    various sections are (depending where the sections were actually loaded).
-   MAINLINE is true if we are reading the main symbol
-   table (as opposed to a shared lib or dynamically loaded file).  */
+*/
 
 static void
-xcoff_initial_scan (struct objfile *objfile, int mainline)
+xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
 {
   bfd *abfd;
   int val;
@@ -2877,7 +2878,7 @@ xcoff_initial_scan (struct objfile *objfile, int mainline)
   char *name;
   unsigned int size;
 
-  info = (struct coff_symfile_info *) objfile->sym_private;
+  info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
   symfile_bfd = abfd = objfile->obfd;
   name = objfile->name;
 
@@ -2897,7 +2898,7 @@ xcoff_initial_scan (struct objfile *objfile, int mainline)
 
       /* Read the .debug section, if present.  */
       {
-       sec_ptr secp;
+       struct bfd_section *secp;
        bfd_size_type length;
        char *debugsec = NULL;
 
@@ -2908,17 +2909,17 @@ xcoff_initial_scan (struct objfile *objfile, int mainline)
            if (length)
              {
                debugsec =
-                 (char *) obstack_alloc (&objfile->symbol_obstack, length);
+                 (char *) obstack_alloc (&objfile->objfile_obstack, length);
 
                if (!bfd_get_section_contents (abfd, secp, debugsec,
                                               (file_ptr) 0, length))
                  {
-                   error ("Error reading .debug section of `%s': %s",
+                   error (_("Error reading .debug section of `%s': %s"),
                           name, bfd_errmsg (bfd_get_error ()));
                  }
              }
          }
-       ((struct coff_symfile_info *) objfile->sym_private)->debugsec =
+       ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec =
          debugsec;
       }
     }
@@ -2927,23 +2928,21 @@ xcoff_initial_scan (struct objfile *objfile, int mainline)
      access them randomly in read_symbol*.  */
   val = bfd_seek (abfd, symtab_offset, SEEK_SET);
   if (val < 0)
-    error ("Error reading symbols from %s: %s",
+    error (_("Error reading symbols from %s: %s"),
           name, bfd_errmsg (bfd_get_error ()));
   size = coff_data (abfd)->local_symesz * num_symbols;
-  ((struct coff_symfile_info *) objfile->sym_private)->symtbl =
-    obstack_alloc (&objfile->symbol_obstack, size);
-  ((struct coff_symfile_info *) objfile->sym_private)->symtbl_num_syms =
+  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl =
+    obstack_alloc (&objfile->objfile_obstack, size);
+  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms =
     num_symbols;
 
-  val = bfd_bread (((struct coff_symfile_info *) objfile->sym_private)->symtbl,
+  val = bfd_bread (((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl,
                   size, abfd);
   if (val != size)
-    perror_with_name ("reading symbol table");
+    perror_with_name (_("reading symbol table"));
 
   /* If we are reinitializing, or if we have never loaded syms yet, init */
-  if (mainline
-      || (objfile->global_psymbols.size == 0
-         && objfile->static_psymbols.size == 0))
+  if (objfile->global_psymbols.size == 0 && objfile->static_psymbols.size == 0)
     /* I'm not sure how how good num_symbols is; the rule of thumb in
        init_psymbol_list was developed for a.out.  On the one hand,
        num_symbols includes auxents.  On the other hand, it doesn't
@@ -2975,9 +2974,10 @@ xcoff_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
   asection *sect = NULL;
   int i;
 
-  objfile->num_sections = SECT_OFF_MAX;
+  objfile->num_sections = bfd_count_sections (objfile->obfd);
   objfile->section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
+    obstack_alloc (&objfile->objfile_obstack, 
+                  SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
 
   /* Initialize the section indexes for future use. */
   sect = bfd_get_section_by_name (objfile->obfd, ".text");
@@ -3032,18 +3032,19 @@ static struct sym_fns xcoff_sym_fns =
   xcoff_initial_scan,          /* sym_read: read a symbol file into symtab */
   xcoff_symfile_finish,                /* sym_finish: finished with file, cleanup */
   xcoff_symfile_offsets,       /* sym_offsets: xlate offsets ext->int form */
+  default_symfile_segments,    /* sym_segments: Get segment information from
+                                  a file.  */
+  aix_process_linenos,          /* sym_read_linetable */
+  default_symfile_relocate,    /* sym_relocate: Relocate a debug section.  */
+  &psym_functions,
   NULL                         /* next: pointer to next struct sym_fns */
 };
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_xcoffread;
+
 void
 _initialize_xcoffread (void)
 {
   add_symtab_fns (&xcoff_sym_fns);
-
-  func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0,
-                               "<function, no debug info>", NULL);
-  TYPE_TARGET_TYPE (func_symbol_type) = builtin_type_int;
-  var_symbol_type =
-    init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0,
-              "<variable, no debug info>", NULL);
 }
This page took 0.04354 seconds and 4 git commands to generate.