* target.h (struct section_table): Rename to ...
[deliverable/binutils-gdb.git] / gdb / xcoffread.c
index 4ecd0a266813310e39fac65fafc1977ed16addf4..9ae929f24d5bd60be9546a0d83db2b7d59525b0e 100644 (file)
@@ -1,6 +1,6 @@
 /* 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, 2002, 2003, 2004
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
    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"
@@ -41,6 +39,7 @@
 #include "coff/xcoff.h"
 #include "libxcoff.h"
 #include "coff/rs6000.h"
+#include "xcoffread.h"
 
 #include "symtab.h"
 #include "gdbtypes.h"
@@ -154,21 +153,21 @@ struct coff_symfile_info
 static void
 bf_notfound_complaint (void)
 {
-  complaint (&symfile_complaints, "line numbers off, `.bf' symbol not found");
+  complaint (&symfile_complaints, _("line numbers off, `.bf' symbol not found"));
 }
 
 static void
 ef_complaint (int arg1)
 {
   complaint (&symfile_complaints,
-            "Mismatched .ef symbol ignored starting at symnum %d", arg1);
+            _("Mismatched .ef symbol ignored starting at symnum %d"), arg1);
 }
 
 static void
 eb_complaint (int arg1)
 {
   complaint (&symfile_complaints,
-            "Mismatched .eb symbol ignored starting at symnum %d", arg1);
+            _("Mismatched .eb symbol ignored starting at symnum %d"), arg1);
 }
 
 static void xcoff_initial_scan (struct objfile *, int);
@@ -490,7 +489,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.  */
-      complaint (&symfile_complaints, "Nested C_BINCL symbols");
+      complaint (&symfile_complaints, _("Nested C_BINCL symbols"));
     }
   ++inclDepth;
 
@@ -507,7 +506,7 @@ record_include_end (struct coff_symbol *cs)
 
   if (inclDepth == 0)
     {
-      complaint (&symfile_complaints, "Mismatched C_BINCL/C_EINCL pair");
+      complaint (&symfile_complaints, _("Mismatched C_BINCL/C_EINCL pair"));
     }
 
   allocate_include_entry ();
@@ -601,17 +600,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
+           {
 
-         tmpSubfile = inclTable[ii].subfile =
-           (struct subfile *) xmalloc (sizeof (struct subfile));
+             /* Have a new subfile for the include file.  */
 
-         memset (tmpSubfile, '\0', sizeof (struct subfile));
-         firstLine = &(inclTable[ii].funStartLine);
+             tmpSubfile = inclTable[ii].subfile =
+               (struct subfile *) xmalloc (sizeof (struct subfile));
 
-         /* Enter include file's lines now.  */
-         enter_line_range (tmpSubfile, inclTable[ii].begin,
-                           inclTable[ii].end, start, 0, firstLine);
+             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);
+           }
 
          if (offset <= inclTable[ii].end)
            offset = inclTable[ii].end + linesz;
@@ -657,7 +671,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;
 
@@ -729,7 +744,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 */
@@ -770,7 +785,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
       if (endoffset >= limit_offset)
        {
          complaint (&symfile_complaints,
-                    "Bad line table offset in C_EINCL directive");
+                    _("Bad line table offset in C_EINCL directive"));
          return;
        }
       limit_offset = endoffset;
@@ -836,7 +851,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;                                      \
 }
 
@@ -868,12 +883,13 @@ xcoff_next_symbol_text (struct objfile *objfile)
   struct internal_syment symbol;
   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)
     {
-      complaint (&symfile_complaints, "Unexpected symbol continuation");
+      complaint (&symfile_complaints, _("Unexpected symbol continuation"));
 
       /* Return something which points to '\0' and hope the symbol reading
          code does something reasonable.  */
@@ -890,7 +906,7 @@ xcoff_next_symbol_text (struct objfile *objfile)
     }
   else
     {
-      complaint (&symfile_complaints, "Unexpected symbol continuation");
+      complaint (&symfile_complaints, _("Unexpected symbol continuation"));
 
       /* Return something which points to '\0' and hope the symbol reading
          code does something reasonable.  */
@@ -924,7 +940,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;
@@ -1252,7 +1268,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
          break;
 
        case C_FCN:
-         if (DEPRECATED_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 +1285,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
              if (new->name != NULL)
                SYMBOL_SECTION (new->name) = SECT_OFF_TEXT (objfile);
            }
-         else if (DEPRECATED_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,
@@ -1332,7 +1348,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
        case C_UNTAG:
        case C_ENTAG:
          {
-           complaint (&symfile_complaints, "Unrecognized storage class %d.",
+           complaint (&symfile_complaints, _("Unrecognized storage class %d."),
                       cs->c_sclass);
          }
          break;
@@ -1363,7 +1379,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
          break;
 
        case C_BLOCK:
-         if (DEPRECATED_STREQ (cs->c_name, ".bb"))
+         if (strcmp (cs->c_name, ".bb") == 0)
            {
              depth++;
              new = push_context (depth,
@@ -1371,7 +1387,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
                                   + ANOFFSET (objfile->section_offsets,
                                               SECT_OFF_TEXT (objfile))));
            }
-         else if (DEPRECATED_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 */
@@ -1428,17 +1444,15 @@ read_xcoff_symtab (struct partial_symtab *pst)
 
 
 #define        SYMNAME_ALLOC(NAME, ALLOCED)    \
-  (ALLOCED) ? (NAME) : obsavestring ((NAME), strlen (NAME), &objfile->objfile_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 (struct coff_symbol *cs, struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   struct symbol onesymbol;
   struct symbol *sym = &onesymbol;
   struct symbol *sym2 = NULL;
@@ -1477,8 +1491,8 @@ process_xcoff_symbol (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.  */
 
-      DEPRECATED_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) = builtin_type (gdbarch)->nodebug_text_symbol;
 
       SYMBOL_CLASS (sym) = LOC_BLOCK;
       SYMBOL_DUP (sym, sym2);
@@ -1491,7 +1505,7 @@ process_xcoff_symbol (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) = builtin_type (gdbarch)->nodebug_data_symbol;
 
       switch (cs->c_sclass)
        {
@@ -1519,7 +1533,7 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
          break;
 
        default:
-         complaint (&symfile_complaints, "Unexpected storage class: %d",
+         complaint (&symfile_complaints, _("Unexpected storage class: %d"),
                     cs->c_sclass);
          /* FALLTHROUGH */
 
@@ -1601,7 +1615,7 @@ read_symbol (struct internal_syment *symbol, int symno)
   ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl;
   if (symno < 0 || symno >= nsyms)
     {
-      complaint (&symfile_complaints, "Invalid symbol offset");
+      complaint (&symfile_complaints, _("Invalid symbol offset"));
       symbol->n_value = 0;
       symbol->n_scnum = -1;
       return;
@@ -1670,7 +1684,7 @@ read_symbol_lineno (int symno)
       if (symbol->n_sclass == C_FCN)
        {
          char *name = xcoff64 ? strtbl + symbol->n_offset : symbol->n_name;
-         if (DEPRECATED_STREQ (name, ".bf"))
+         if (strcmp (name, ".bf") == 0)
            goto gotit;
        }
       symno += symbol->n_numaux + 1;
@@ -1704,7 +1718,7 @@ find_linenos (struct bfd *abfd, struct bfd_section *asect, void *vpinfo)
 
   count = asect->lineno_count;
 
-  if (!DEPRECATED_STREQ (asect->name, ".text") || count == 0)
+  if (strcmp (asect->name, ".text") != 0 || count == 0)
     return;
 
   size = count * coff_data (abfd)->local_linesz;
@@ -1880,7 +1894,7 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
   ((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);
@@ -1907,10 +1921,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;
 }
@@ -2115,13 +2129,14 @@ static void
 function_outside_compilation_unit_complaint (const char *arg1)
 {
   complaint (&symfile_complaints,
-            "function `%s' appears to be defined outside of all compilation units",
+            _("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;
 
@@ -2170,6 +2185,7 @@ 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->deprecated_sym_private)->symtbl;
   nsyms = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms;
@@ -2286,13 +2302,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.  */
@@ -2361,7 +2377,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;
                  }
@@ -2378,7 +2394,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;
                  }
@@ -2445,7 +2461,7 @@ scan_xcoff_symtab (struct objfile *objfile)
        default:
          {
            complaint (&symfile_complaints,
-                      "Storage class %d not recognized during scan", sclass);
+                      _("Storage class %d not recognized during scan"), sclass);
          }
          /* FALLTHROUGH */
 
@@ -2528,12 +2544,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 && DEPRECATED_STREQ (namestring, pst->filename))
+           if (pst && strcmp (namestring, pst->filename) == 0)
              continue;
            {
              int i;
              for (i = 0; i < includes_used; i++)
-               if (DEPRECATED_STREQ (namestring, psymtab_include_list[i]))
+               if (strcmp (namestring, psymtab_include_list[i]) == 0)
                  {
                    i = -1;
                    break;
@@ -2584,9 +2600,11 @@ 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
+
+               if (gdbarch_static_transform_name_p (gdbarch))
+                 namestring = gdbarch_static_transform_name
+                                (gdbarch, namestring);
+
                add_psymbol_to_list (namestring, p - namestring,
                                     VAR_DOMAIN, LOC_STATIC,
                                     &objfile->static_psymbols,
@@ -2754,6 +2772,14 @@ scan_xcoff_symtab (struct objfile *objfile)
                    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_DOMAIN, LOC_BLOCK,
@@ -2800,7 +2826,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                   a backslash.  */
 
                complaint (&symfile_complaints,
-                          "unknown symbol descriptor `%c'", p[1]);
+                          _("unknown symbol descriptor `%c'"), p[1]);
 
                /* Ignore it; perhaps it is an extension that we don't
                   know about.  */
@@ -2827,7 +2853,7 @@ scan_xcoff_symtab (struct objfile *objfile)
 /* 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->deprecated_sym_private)->toc_offset;
@@ -2893,7 +2919,7 @@ xcoff_initial_scan (struct objfile *objfile, int mainline)
                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 ()));
                  }
              }
@@ -2907,7 +2933,7 @@ 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->deprecated_sym_private)->symtbl =
@@ -2918,7 +2944,7 @@ xcoff_initial_scan (struct objfile *objfile, int mainline)
   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
@@ -3013,18 +3039,17 @@ 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 */
   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.034429 seconds and 4 git commands to generate.