]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/dbxread.c
* breakpoint.c:
[thirdparty/binutils-gdb.git] / gdb / dbxread.c
index a505c7774bcdcd16d454fd9fd9be3658e8440fb3..33d164e8c6c96ea0bc17eacad51c89caee0b9bbd 100644 (file)
@@ -1,5 +1,5 @@
 /* Read dbx symbol tables and convert to internal format, for GDB.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004.
    Free Software Foundation, Inc.
 
@@ -17,8 +17,8 @@
 
    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.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* This module provides three functions: dbx_symfile_init,
    which initializes to read a symbol file; dbx_new_init, which 
@@ -37,7 +37,7 @@
 #include "defs.h"
 #include "gdb_string.h"
 
-#if defined(USG) || defined(__CYGNUSCLIB__)
+#if defined(__CYGNUSCLIB__)
 #include <sys/types.h>
 #include <fcntl.h>
 #endif
 #include "stabsread.h"
 #include "gdb-stabs.h"
 #include "demangle.h"
-#include "language.h"          /* Needed for local_hex_string */
 #include "complaints.h"
 #include "cp-abi.h"
+
 #include "gdb_assert.h"
+#include "gdb_string.h"
 
 #include "aout/aout64.h"
 #include "aout/stab_gnu.h"     /* We always use GNU stabs, not native, now */
@@ -162,21 +163,21 @@ static int has_line_numbers;
 static void
 unknown_symtype_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, "unknown symbol type %s", arg1);
+  complaint (&symfile_complaints, _("unknown symbol type %s"), arg1);
 }
 
 static void
 lbrac_mismatch_complaint (int arg1)
 {
   complaint (&symfile_complaints,
-            "N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", arg1);
+            _("N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d"), arg1);
 }
 
 static void
 repeated_header_complaint (const char *arg1, int arg2)
 {
   complaint (&symfile_complaints,
-            "\"repeated\" header file %s not previously seen, at symtab pos %d",
+            _("\"repeated\" header file %s not previously seen, at symtab pos %d"),
             arg1, arg2);
 }
 
@@ -220,7 +221,7 @@ find_text_range (bfd * sym_bfd, struct objfile *objfile)
       }
 
   if (!found_any)
-    error ("Can't find any code sections in symbol file");
+    error (_("Can't find any code sections in symbol file"));
 
   DBX_TEXT_ADDR (objfile) = start;
   DBX_TEXT_SIZE (objfile) = end - start;
@@ -482,7 +483,7 @@ record_minimal_symbol (char *name, CORE_ADDR address, int type,
          Record it as global even if it's local, not global, so
          lookup_minimal_symbol can find it.  We don't check symbol_leading_char
          because for SunOS4 it always is '_'.  */
-      if (name[8] == 'C' && DEPRECATED_STREQ ("__DYNAMIC", name))
+      if (name[8] == 'C' && strcmp ("__DYNAMIC", name) == 0)
        ms_type = mst_data;
 
       /* Same with virtual function tables, both global and static.  */
@@ -624,9 +625,9 @@ dbx_symfile_init (struct objfile *objfile)
   unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
 
   /* 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 (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
+  objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *)
+    xmalloc (sizeof (struct dbx_symfile_info));
+  memset (objfile->deprecated_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");
@@ -642,7 +643,7 @@ dbx_symfile_init (struct objfile *objfile)
 
   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
   if (!text_sect)
-    error ("Can't find .text section in symbol file");
+    error (_("Can't find .text section in symbol file"));
   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
 
@@ -704,7 +705,7 @@ dbx_symfile_init (struct objfile *objfile)
 
          if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
              || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
-           error ("ridiculous string table size (%d bytes).",
+           error (_("ridiculous string table size (%d bytes)."),
                   DBX_STRINGTAB_SIZE (objfile));
 
          DBX_STRINGTAB (objfile) =
@@ -734,7 +735,7 @@ dbx_symfile_init (struct objfile *objfile)
 static void
 dbx_symfile_finish (struct objfile *objfile)
 {
-  if (objfile->sym_stab_info != NULL)
+  if (objfile->deprecated_sym_stab_info != NULL)
     {
       if (HEADER_FILES (objfile) != NULL)
        {
@@ -748,7 +749,7 @@ dbx_symfile_finish (struct objfile *objfile)
            }
          xfree (hfiles);
        }
-      xmfree (objfile->md, objfile->sym_stab_info);
+      xfree (objfile->deprecated_sym_stab_info);
     }
   free_header_files ();
 }
@@ -828,7 +829,7 @@ fill_symbuf (bfd *sym_bfd)
   if (nbytes < 0)
     perror_with_name (bfd_get_filename (sym_bfd));
   else if (nbytes == 0)
-    error ("Premature end of file reading symbol table");
+    error (_("Premature end of file reading symbol table"));
   symbuf_end = nbytes / symbol_size;
   symbuf_idx = 0;
   symbuf_left -= nbytes;
@@ -892,7 +893,7 @@ init_bincl_list (int number, struct objfile *objfile)
 {
   bincls_allocated = number;
   next_bincl = bincl_list = (struct header_file_location *)
-    xmmalloc (objfile->md, bincls_allocated * sizeof (struct header_file_location));
+    xmalloc (bincls_allocated * sizeof (struct header_file_location));
 }
 
 /* Add a bincl to the list.  */
@@ -905,8 +906,8 @@ add_bincl_to_list (struct partial_symtab *pst, char *name, int instance)
       int offset = next_bincl - bincl_list;
       bincls_allocated *= 2;
       bincl_list = (struct header_file_location *)
-       xmrealloc (pst->objfile->md, (char *) bincl_list,
-                  bincls_allocated * sizeof (struct header_file_location));
+       xrealloc ((char *) bincl_list,
+                 bincls_allocated * sizeof (struct header_file_location));
       next_bincl = bincl_list + offset;
     }
   next_bincl->pst = pst;
@@ -937,7 +938,7 @@ find_corresponding_bincl_psymtab (char *name, int instance)
 static void
 free_bincl_list (struct objfile *objfile)
 {
-  xmfree (objfile->md, bincl_list);
+  xfree (bincl_list);
   bincls_allocated = 0;
 }
 
@@ -965,7 +966,7 @@ set_namestring (struct objfile *objfile, struct internal_nlist nlist)
   if (((unsigned) nlist.n_strx + file_string_table_offset) >=
       DBX_STRINGTAB_SIZE (objfile))
     {
-      complaint (&symfile_complaints, "bad string table offset in symbol %d",
+      complaint (&symfile_complaints, _("bad string table offset in symbol %d"),
                 symnum);
       namestring = "<bad string table offset>";
     } 
@@ -1167,7 +1168,7 @@ 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);
 }
 
@@ -1416,7 +1417,7 @@ read_dbx_symtab (struct objfile *objfile)
            next_file_string_table_offset =
              file_string_table_offset + nlist.n_value;
            if (next_file_string_table_offset < file_string_table_offset)
-             error ("string table offset backs up at %d", symnum);
+             error (_("string table offset backs up at %d"), symnum);
            /* FIXME -- replace error() with complaint.  */
            continue;
          }
@@ -1563,7 +1564,7 @@ read_dbx_symtab (struct objfile *objfile)
              /* FIXME: we should not get here without a PST to work on.
                 Attempt to recover.  */
              complaint (&symfile_complaints,
-                        "N_BINCL %s not in entries for any file, at symtab pos %d",
+                        _("N_BINCL %s not in entries for any file, at symtab pos %d"),
                         namestring, symnum);
              continue;
            }
@@ -1981,7 +1982,7 @@ read_dbx_symtab (struct objfile *objfile)
               time searching to the end of every string looking for
               a backslash.  */
 
-           complaint (&symfile_complaints, "unknown symbol descriptor `%c'",
+           complaint (&symfile_complaints, _("unknown symbol descriptor `%c'"),
                       p[1]);
 
            /* Ignore it; perhaps it is an extension that we don't
@@ -2097,7 +2098,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.  */
-         unknown_symtype_complaint (local_hex_string (nlist.n_type));
+         unknown_symtype_complaint (hex_string (nlist.n_type));
          continue;
        }
     }
@@ -2504,13 +2505,13 @@ read_ofile_symtab (struct partial_symtab *pst)
        {
          const char *tempstring = namestring;
 
-         if (DEPRECATED_STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
+         if (strcmp (namestring, GCC_COMPILED_FLAG_SYMBOL) == 0)
            processing_gcc_compilation = 1;
-         else if (DEPRECATED_STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
+         else if (strcmp (namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0)
            processing_gcc_compilation = 2;
          if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
            ++tempstring;
-         if (DEPRECATED_STREQN (tempstring, "__gnu_compiled", 14))
+         if (strncmp (tempstring, "__gnu_compiled", 14) == 0)
            processing_gcc_compilation = 2;
        }
 
@@ -2542,7 +2543,7 @@ read_ofile_symtab (struct partial_symtab *pst)
     fill_symbuf (abfd);
   bufp = &symbuf[symbuf_idx];
   if (bfd_h_get_8 (abfd, bufp->e_type) != N_SO)
-    error ("First symbol in segment of executable not a source symbol");
+    error (_("First symbol in segment of executable not a source symbol"));
 
   max_symnum = sym_size / symbol_size;
 
@@ -2576,9 +2577,9 @@ read_ofile_symtab (struct partial_symtab *pst)
             However, there is no reason not to accept
             the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
 
-         if (DEPRECATED_STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
+         if (strcmp (namestring, GCC_COMPILED_FLAG_SYMBOL) == 0)
            processing_gcc_compilation = 1;
-         else if (DEPRECATED_STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
+         else if (strcmp (namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0)
            processing_gcc_compilation = 2;
 
 #if 0
@@ -2634,41 +2635,30 @@ read_ofile_symtab (struct partial_symtab *pst)
    DESC is the desc field of the ".stab" entry.
    VALU is the value field of the ".stab" entry.
    NAME is the symbol name, in our address space.
-   SECTION_OFFSETS is a set of amounts by which the sections of this object
-   file were relocated when it was loaded into memory.
-   Note that these section_offsets are not the 
-   objfile->section_offsets but the pst->section_offsets.
-   All symbols that refer
-   to memory locations need to be offset by these amounts.
-   OBJFILE is the object file from which we are reading symbols.
-   It is used in end_symtab.  */
+   SECTION_OFFSETS is a set of amounts by which the sections of this
+   object file were relocated when it was loaded into memory.  Note
+   that these section_offsets are not the objfile->section_offsets but
+   the pst->section_offsets.  All symbols that refer to memory
+   locations need to be offset by these amounts.
+   OBJFILE is the object file from which we are reading symbols.  It
+   is used in end_symtab.  */
 
 void
 process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
                    struct section_offsets *section_offsets,
                    struct objfile *objfile)
 {
-#ifdef SUN_FIXED_LBRAC_BUG
-  /* If SUN_FIXED_LBRAC_BUG is defined, then it tells us whether we need
-     to correct the address of N_LBRAC's.  If it is not defined, then
-     we never need to correct the addresses.  */
-
-  /* This records the last pc address we've seen.  We depend on there being
-     an SLINE or FUN or SO before the first LBRAC, since the variable does
-     not get reset in between reads of different symbol files.  */
-  static CORE_ADDR last_pc_address;
-#endif
-
   struct context_stack *new;
-  /* This remembers the address of the start of a function.  It is used
-     because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
-     relative to the current function's start address.  On systems
-     other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
-     used to relocate these symbol types rather than SECTION_OFFSETS.  */
+  /* This remembers the address of the start of a function.  It is
+     used because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries
+     are relative to the current function's start address.  On systems
+     other than Solaris 2, this just holds the SECT_OFF_TEXT value,
+     and is 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.  */
+  /* 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
@@ -2677,8 +2667,8 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
      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.  */
+  /* 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;
 
   /* The stab type used for the definition of the last function.
@@ -2686,12 +2676,15 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
   static int function_stab_type = 0;
 
   if (!block_address_function_relative)
-    /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
-       function start address, so just use the text offset.  */
-    function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
+    {
+      /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
+        function start address, so just use the text offset.  */
+      function_start_offset =
+       ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
+    }
 
-  /* Something is wrong if we see real data before
-     seeing a source file name.  */
+  /* Something is wrong if we see real data before seeing a source
+     file name.  */
 
   if (last_source_file == NULL && type != (unsigned char) N_SO)
     {
@@ -2709,8 +2702,8 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 
       if (*name == '\000')
        {
-         /* This N_FUN marks the end of a function.  This closes off the
-            current block.  */
+         /* This N_FUN marks the end of a function.  This closes off
+            the current block.  */
 
          if (context_stack_depth <= 0)
            {
@@ -2720,8 +2713,8 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 
          /* 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.  */
+            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);
 
@@ -2743,7 +2736,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 
       sline_found_in_function = 0;
 
-      /* Relocate for dynamic loading */
+      /* Relocate for dynamic loading */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       valu = SMASH_TEXT_ADDRESS (valu);
       last_function_start = valu;
@@ -2766,14 +2759,6 @@ 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;
 
-#ifdef SUN_FIXED_LBRAC_BUG
-      if (!SUN_FIXED_LBRAC_BUG && valu < last_pc_address)
-       {
-         /* Patch current LBRAC pc value to match last handy pc value */
-         complaint (&symfile_complaints, "bad block start address patched");
-         valu = last_pc_address;
-       }
-#endif
       new = push_context (desc, valu);
       break;
 
@@ -2804,16 +2789,16 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
        lbrac_mismatch_complaint (symnum);
 
       /* Some compilers put the variable decls inside of an
-         LBRAC/RBRAC block.  This macro should be nonzero if this
-         is true.  DESC is N_DESC from the N_RBRAC symbol.
-         GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
-         or the GCC2_COMPILED_SYMBOL.  */
+         LBRAC/RBRAC block.  This macro should be nonzero if this is
+         true.  DESC is N_DESC from the N_RBRAC symbol.  GCC_P is true
+         if we've detected the GCC_COMPILED_SYMBOL or the
+         GCC2_COMPILED_SYMBOL.  */
 #if !defined (VARIABLES_INSIDE_BLOCK)
 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
 #endif
 
       /* Can only use new->locals as local symbols here if we're in
-         gcc or on a machine that puts them before the lbrack.  */
+         GCC or on a machine that puts them before the lbrack.  */
       if (!VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
        {
          if (local_symbols != NULL)
@@ -2826,8 +2811,9 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
                 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");
+             complaint (&symfile_complaints, _("\
+misplaced N_LBRAC entry; discarding local symbols which have \
+no enclosing block"));
            }
          local_symbols = new->locals;
        }
@@ -2835,20 +2821,21 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       if (context_stack_depth
          > !VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
        {
-         /* This is not the outermost LBRAC...RBRAC pair in the function,
-            its local symbols preceded it, and are the ones just recovered
-            from the context stack.  Define the block for them (but don't
-            bother if the block contains no symbols.  Should we complain
-            on blocks without symbols?  I can't think of any useful purpose
-            for them).  */
+         /* This is not the outermost LBRAC...RBRAC pair in the
+            function, its local symbols preceded it, and are the ones
+            just recovered from the context stack.  Define the block
+            for them (but don't bother if the block contains no
+            symbols.  Should we complain on blocks without symbols?
+            I can't think of any useful purpose for them).  */
          if (local_symbols != NULL)
            {
-             /* Muzzle a compiler bug that makes end < start.  (which
-                compilers?  Is this ever harmful?).  */
+             /* Muzzle a compiler bug that makes end < start.
+
+                ??? Which compilers?  Is this ever harmful?.  */
              if (new->start_addr > valu)
                {
                  complaint (&symfile_complaints,
-                            "block start larger than block end");
+                            _("block start larger than block end"));
                  new->start_addr = valu;
                }
              /* Make a block for the local symbols within.  */
@@ -2872,39 +2859,26 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 
     case N_FN:
     case N_FN_SEQ:
-      /* This kind of symbol indicates the start of an object file.  */
-      /* Relocate for dynamic loading */
+      /* This kind of symbol indicates the start of an object file.
+         Relocate for dynamic loading.  */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       break;
 
     case N_SO:
-      /* This type of symbol indicates the start of data
-         for one source file.
-         Finish the symbol table of the previous source file
-         (if any) and start accumulating a new symbol table.  */
-      /* Relocate for dynamic loading */
+      /* This type of symbol indicates the start of data for one
+         source file.  Finish the symbol table of the previous source
+         file (if any) and start accumulating a new symbol table.
+         Relocate for dynamic loading.  */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
 
       n_opt_found = 0;
 
-#ifdef SUN_FIXED_LBRAC_BUG
-      last_pc_address = valu;  /* Save for SunOS bug circumcision */
-#endif
-
-#ifdef PCC_SOL_BROKEN
-      /* pcc bug, occasionally puts out SO for SOL.  */
-      if (context_stack_depth > 0)
-       {
-         start_subfile (name, NULL);
-         break;
-       }
-#endif
       if (last_source_file)
        {
          /* Check if previous symbol was also an N_SO (with some
-            sanity checks).  If so, that one was actually the directory
-            name, and the current one is the real file name.
-            Patch things up. */
+            sanity checks).  If so, that one was actually the
+            directory name, and the current one is the real file
+            name.  Patch things up. */
          if (previous_stab_code == (unsigned char) N_SO)
            {
              patch_subfile_names (current_subfile, name);
@@ -2914,8 +2888,8 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
          end_stabs ();
        }
 
-      /* Null name means this just marks the end of text for this .o file.
-         Don't start a new symtab in this case.  */
+      /* Null name means this just marks the end of text for this .o
+         file.  Don't start a new symtab in this case.  */
       if (*name == '\000')
        break;
 
@@ -2928,11 +2902,10 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       break;
 
     case N_SOL:
-      /* This type of symbol indicates the start of data for
-         a sub-source-file, one whose contents were copied or
-         included in the compilation of the main source file
-         (whose name was given in the N_SO symbol.)  */
-      /* Relocate for dynamic loading */
+      /* This type of symbol indicates the start of data for a
+         sub-source-file, one whose contents were copied or included
+         in the compilation of the main source file (whose name was
+         given in the N_SO symbol).  Relocate for dynamic loading.  */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       start_subfile (name, current_subfile->dirname);
       break;
@@ -2952,21 +2925,34 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       break;
 
     case N_SLINE:
-      /* This type of "symbol" really just records
-         one line-number -- core-address correspondence.
-         Enter it in the line list for this symbol table.  */
+      /* This type of "symbol" really just records one line-number --
+         core-address correspondence.  Enter it in the line list for
+         this symbol table.  */
 
-      /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
+      /* Relocate for dynamic loading and for ELF acc
+         function-relative symbols.  */
       valu += function_start_offset;
 
-#ifdef SUN_FIXED_LBRAC_BUG
-      last_pc_address = valu;  /* Save for SunOS bug circumcision */
-#endif
-      /* If this is the first SLINE note in the function, record it at
-        the start of the function instead of at the listed location.  */
+      /* GCC 2.95.3 emits the first N_SLINE stab somwehere in the
+        middle of the prologue instead of right at the start of the
+        function.  To deal with this we record the address for the
+        first N_SLINE stab to be the start of the function instead of
+        the listed location.  We really shouldn't to this.  When
+        compiling with optimization, this first N_SLINE stab might be
+        optimized away.  Other (non-GCC) compilers don't emit this
+        stab at all.  There is no real harm in having an extra
+        numbered line, although it can be a bit annoying for the
+        user.  However, it totally screws up our testsuite.
+
+        So for now, keep adjusting the address of the first N_SLINE
+        stab, but only for code compiled with GCC.  */
+
       if (within_function && sline_found_in_function == 0)
        {
-         record_line (current_subfile, desc, last_function_start);
+         if (processing_gcc_compilation == 2)
+           record_line (current_subfile, desc, last_function_start);
+         else
+           record_line (current_subfile, desc, valu);
          sline_found_in_function = 1;
        }
       else
@@ -2981,28 +2967,31 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       common_block_end (objfile);
       break;
 
-      /* The following symbol types need to have the appropriate offset added
-         to their value; then we process symbol definitions in the name.  */
+      /* The following symbol types need to have the appropriate
+         offset added to their value; then we process symbol
+         definitions in the name.  */
 
-    case N_STSYM:              /* Static symbol in data seg */
-    case N_LCSYM:              /* Static symbol in BSS seg */
-    case N_ROSYM:              /* Static symbol in Read-only data seg */
+    case N_STSYM:              /* Static symbol in data segment.  */
+    case N_LCSYM:              /* Static symbol in BSS segment.  */
+    case N_ROSYM:              /* Static symbol in read-only data segment.  */
       /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.
-         Solaris2's stabs-in-elf makes *most* symbols relative
-         but leaves a few absolute (at least for Solaris 2.1 and version
-         2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on the fence.
-         .stab "foo:S...",N_STSYM        is absolute (ld relocates it)
-         .stab "foo:V...",N_STSYM        is relative (section base subtracted).
-         This leaves us no choice but to search for the 'S' or 'V'...
-         (or pass the whole section_offsets stuff down ONE MORE function
-         call level, which we really don't want to do).  */
+         Solaris 2's stabs-in-elf makes *most* symbols relative but
+         leaves a few absolute (at least for Solaris 2.1 and version
+         2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on
+         the fence.  .stab "foo:S...",N_STSYM is absolute (ld
+         relocates it) .stab "foo:V...",N_STSYM is relative (section
+         base subtracted).  This leaves us no choice but to search for
+         the 'S' or 'V'...  (or pass the whole section_offsets stuff
+         down ONE MORE function call level, which we really don't want
+         to do).  */
       {
        char *p;
 
-       /* .o files and NLMs have non-zero text seg offsets, but don't need
-          their static syms offset in this fashion.  XXX - This is really a
-          crock that should be fixed in the solib handling code so that I
-          don't have to work around it here. */
+       /* Normal object file and NLMs have non-zero text seg offsets,
+          but don't need their static syms offset in this fashion.
+          XXX - This is really a crock that should be fixed in the
+          solib handling code so that I don't have to work around it
+          here.  */
 
        if (!symfile_relocatable)
          {
@@ -3010,20 +2999,22 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
            if (p != 0 && p[1] == 'S')
              {
                /* The linker relocated it.  We don't want to add an
-                  elfstab_offset_sections-type offset, but we *do* want
-                  to add whatever solib.c passed to symbol_file_add as
-                  addr (this is known to affect SunOS4, and I suspect ELF
-                  too).  Since elfstab_offset_sections currently does not
-                  muck with the text offset (there is no Ttext.text
+                  elfstab_offset_sections-type offset, but we *do*
+                  want to add whatever solib.c passed to
+                  symbol_file_add as addr (this is known to affect
+                  SunOS 4, and I suspect ELF too).  Since
+                  elfstab_offset_sections currently does not muck
+                  with the text offset (there is no Ttext.text
                   symbol), we can get addr from the text offset.  If
-                  elfstab_offset_sections ever starts dealing with the
-                  text offset, and we still need to do this, we need to
-                  invent a SECT_OFF_ADDR_KLUDGE or something.  */
+                  elfstab_offset_sections ever starts dealing with
+                  the text offset, and we still need to do this, we
+                  need to invent a SECT_OFF_ADDR_KLUDGE or something.  */
                valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
                goto define_a_symbol;
              }
          }
-       /* Since it's not the kludge case, re-dispatch to the right handler. */
+       /* Since it's not the kludge case, re-dispatch to the right
+           handler.  */
        switch (type)
          {
          case N_STSYM:
@@ -3033,60 +3024,62 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
          case N_ROSYM:
            goto case_N_ROSYM;
          default:
-           internal_error (__FILE__, __LINE__, "failed internal consistency check");
+           internal_error (__FILE__, __LINE__,
+                           _("failed internal consistency check"));
          }
       }
 
-    case_N_STSYM:              /* Static symbol in data seg */
-    case N_DSLINE:             /* Source line number, data seg */
+    case_N_STSYM:              /* Static symbol in data segment.  */
+    case N_DSLINE:             /* Source line number, data segment.  */
       valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
       goto define_a_symbol;
 
-    case_N_LCSYM:              /* Static symbol in BSS seg */
-    case N_BSLINE:             /* Source line number, bss seg */
-      /*   N_BROWS:       overlaps with N_BSLINE */
+    case_N_LCSYM:              /* Static symbol in BSS segment.  */
+    case N_BSLINE:             /* Source line number, BSS segment.  */
+      /* N_BROWS: overlaps with N_BSLINE.  */
       valu += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
       goto define_a_symbol;
 
-    case_N_ROSYM:              /* Static symbol in Read-only data seg */
+    case_N_ROSYM:              /* Static symbol in read-only data segment.  */
       valu += ANOFFSET (section_offsets, SECT_OFF_RODATA (objfile));
       goto define_a_symbol;
 
-    case N_ENTRY:              /* Alternate entry point */
-      /* Relocate for dynamic loading */
+    case N_ENTRY:              /* Alternate entry point */
+      /* Relocate for dynamic loading */
       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       goto define_a_symbol;
 
-      /* The following symbol types we don't know how to process.  Handle
-         them in a "default" way, but complain to people who care.  */
+      /* The following symbol types we don't know how to process.
+         Handle them in a "default" way, but complain to people who
+         care.  */
     default:
-    case N_CATCH:              /* Exception handler catcher */
-    case N_EHDECL:             /* Exception handler name */
-    case N_PC:                 /* Global symbol in Pascal */
-    case N_M2C:                /* Modula-2 compilation unit */
-      /*   N_MOD2:        overlaps with N_EHDECL */
-    case N_SCOPE:              /* Modula-2 scope information */
-    case N_ECOML:              /* End common (local name) */
-    case N_NBTEXT:             /* Gould Non-Base-Register symbols??? */
+    case N_CATCH:              /* Exception handler catcher */
+    case N_EHDECL:             /* Exception handler name */
+    case N_PC:                 /* Global symbol in Pascal */
+    case N_M2C:                        /* Modula-2 compilation unit.  */
+      /* N_MOD2: overlaps with N_EHDECL.  */
+    case N_SCOPE:              /* Modula-2 scope information */
+    case N_ECOML:              /* End common (local name) */
+    case N_NBTEXT:             /* Gould Non-Base-Register symbols???  */
     case N_NBDATA:
     case N_NBBSS:
     case N_NBSTS:
     case N_NBLCS:
-      unknown_symtype_complaint (local_hex_string (type));
+      unknown_symtype_complaint (hex_string (type));
       /* FALLTHROUGH */
 
-      /* The following symbol types don't need the address field relocated,
-         since it is either unused, or is absolute.  */
+      /* The following symbol types don't need the address field
+         relocated, since it is either unused, or is absolute.  */
     define_a_symbol:
-    case N_GSYM:               /* Global variable */
-    case N_NSYMS:              /* Number of symbols (ultrix) */
-    case N_NOMAP:              /* No map?  (ultrix) */
-    case N_RSYM:               /* Register variable */
-    case N_DEFD:               /* Modula-2 GNU module dependency */
-    case N_SSYM:               /* Struct or union element */
-    case N_LSYM:               /* Local symbol in stack */
-    case N_PSYM:               /* Parameter variable */
-    case N_LENG:               /* Length of preceding symbol type */
+    case N_GSYM:               /* Global variable */
+    case N_NSYMS:              /* Number of symbols (Ultrix).  */
+    case N_NOMAP:              /* No map?  (Ultrix).  */
+    case N_RSYM:               /* Register variable */
+    case N_DEFD:               /* Modula-2 GNU module dependency */
+    case N_SSYM:               /* Struct or union element */
+    case N_LSYM:               /* Local symbol in stack */
+    case N_PSYM:               /* Parameter variable */
+    case N_LENG:               /* Length of preceding symbol type */
       if (name)
        {
          int deftype;
@@ -3103,79 +3096,31 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
              function_stab_type = type;
 
 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
-             /* Deal with the SunPRO 3.0 compiler which omits the address
-                from N_FUN symbols.  */
+             /* Deal with the SunPRO 3.0 compiler which omits the
+                address from N_FUN symbols.  */
              if (type == N_FUN
-                 && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)))
+                 && valu == ANOFFSET (section_offsets,
+                                      SECT_OFF_TEXT (objfile)))
                {
                  CORE_ADDR minsym_valu = 
                    find_stab_function_addr (name, last_source_file, objfile);
 
-                 /* find_stab_function_addr will return 0 if the minimal
-                    symbol wasn't found.  (Unfortunately, this might also
-                    be a valid address.)  Anyway, if it *does* return 0,
-                    it is likely that the value was set correctly to begin
-                    with... */
+                 /* The function find_stab_function_addr will return
+                    0 if the minimal symbol wasn't found.
+                    (Unfortunately, this might also be a valid
+                    address.)  Anyway, if it *does* return 0, it is
+                    likely that the value was set correctly to begin
+                    with...  */
                  if (minsym_valu != 0)
                    valu = minsym_valu;
                }
 #endif
 
-#ifdef SUN_FIXED_LBRAC_BUG
-             /* The Sun acc compiler, under SunOS4, puts out
-                functions with N_GSYM or N_STSYM.  The problem is
-                that the address of the symbol is no good (for N_GSYM
-                it doesn't even attept an address; for N_STSYM it
-                puts out an address but then it gets relocated
-                relative to the data segment, not the text segment).
-                Currently we can't fix this up later as we do for
-                some types of symbol in scan_file_globals.
-                Fortunately we do have a way of finding the address -
-                we know that the value in last_pc_address is either
-                the one we want (if we're dealing with the first
-                function in an object file), or somewhere in the
-                previous function. This means that we can use the
-                minimal symbol table to get the address.  */
-
-             /* Starting with release 3.0, the Sun acc compiler,
-                under SunOS4, puts out functions with N_FUN and a value
-                of zero. This gets relocated to the start of the text
-                segment of the module, which is no good either.
-                Under SunOS4 we can deal with this as N_SLINE and N_SO
-                entries contain valid absolute addresses.
-                Release 3.0 acc also puts out N_OPT entries, which makes
-                it possible to discern acc from cc or gcc.  */
-
-             if (type == N_GSYM || type == N_STSYM
-                 || (type == N_FUN
-                     && n_opt_found && !block_address_function_relative))
-               {
-                 struct minimal_symbol *m;
-                 int l = colon_pos - name;
-
-                 m = lookup_minimal_symbol_by_pc (last_pc_address);
-                 if (m && strncmp (DEPRECATED_SYMBOL_NAME (m), name, l) == 0
-                     && DEPRECATED_SYMBOL_NAME (m)[l] == '\0')
-                   /* last_pc_address was in this function */
-                   valu = SYMBOL_VALUE (m);
-                 else if (m && DEPRECATED_SYMBOL_NAME (m + 1)
-                          && strncmp (DEPRECATED_SYMBOL_NAME (m + 1), name, l) == 0
-                          && DEPRECATED_SYMBOL_NAME (m + 1)[l] == '\0')
-                   /* last_pc_address was in last function */
-                   valu = SYMBOL_VALUE (m + 1);
-                 else
-                   /* Not found - use last_pc_address (for finish_block) */
-                   valu = last_pc_address;
-               }
-
-             last_pc_address = valu;   /* Save for SunOS bug circumcision */
-#endif
-
              if (block_address_function_relative)
-               /* For Solaris 2.0 compilers, the block addresses and
+               /* For Solaris 2 compilers, the block addresses and
                   N_SLINE's are relative to the start of the
-                  function.  On normal systems, and when using gcc on
-                  Solaris 2.0, these addresses are just absolute, or
+                  function.  On normal systems, and when using GCC on
+                  Solaris 2, these addresses are just absolute, or
                   relative to the N_SO, depending on
                   BLOCK_ADDRESS_ABSOLUTE.  */
                function_start_offset = valu;
@@ -3185,7 +3130,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
              if (context_stack_depth > 1)
                {
                  complaint (&symfile_complaints,
-                            "unmatched N_LBRAC before symtab pos %d", symnum);
+                            _("unmatched N_LBRAC before symtab pos %d"), symnum);
                  break;
                }
 
@@ -3211,15 +3156,16 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
          for a bunch of other flags, too.  Someday we may parse their
          flags; for now we ignore theirs and hope they'll ignore ours.  */
-    case N_OPT:                /* Solaris 2:  Compiler options */
+    case N_OPT:                        /* Solaris 2: Compiler options.  */
       if (name)
        {
          if (strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0)
            {
              processing_gcc_compilation = 2;
 #if 0                          /* Works, but is experimental.  -fnf */
-             /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
-                know whether it will use the old style or v3 mangling.  */
+             /* For now, stay with AUTO_DEMANGLING for g++ output, as
+                we don't know whether it will use the old style or v3
+                mangling.  */
              if (AUTO_DEMANGLING)
                {
                  set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
@@ -3245,12 +3191,12 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       break;
 
       /* The following symbol types can be ignored.  */
-    case N_OBJ:                /* Solaris 2:  Object file dir and name */
-    case N_PATCH:      /* Solaris2: Patch Run Time Checker.  */
-      /*   N_UNDF:                   Solaris 2:  file separator mark */
-      /*   N_UNDF: -- we will never encounter it, since we only process one
-         file's symbols at once.  */
-    case N_ENDM:               /* Solaris 2:  End of module */
+    case N_OBJ:                        /* Solaris 2: Object file dir and name.  */
+    case N_PATCH:              /* Solaris 2: Patch Run Time Checker.  */
+      /* N_UNDF:                   Solaris 2: File separator mark.  */
+      /* N_UNDF: -- we will never encounter it, since we only process
+         one file's symbols at once.  */
+    case N_ENDM:               /* Solaris 2: End of module.  */
     case N_ALIAS:              /* SunPro F77: alias name, ignore for now.  */
       break;
     }
@@ -3262,9 +3208,9 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
      symbol.  */
   if (name[0] == '#')
     {
-      /* Initialize symbol reference names and determine if this is 
-         a definition.  If symbol reference is being defined, go 
-         ahead and add it.  Otherwise, just return sym. */
+      /* Initialize symbol reference names and determine if this is a
+         definition.  If a symbol reference is being defined, go ahead
+         and add it.  Otherwise, just return.  */
 
       char *s = name;
       int refnum;
@@ -3281,7 +3227,6 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
       name = s;
     }
 
-
   previous_stab_code = type;
 }
 \f
@@ -3324,7 +3269,7 @@ coffstab_build_psymtabs (struct objfile *objfile, int mainline,
 
   /* There is already a dbx_symfile_info allocated by our caller.
      It might even contain some info from the coff symtab to help us.  */
-  info = objfile->sym_stab_info;
+  info = objfile->deprecated_sym_stab_info;
 
   DBX_TEXT_ADDR (objfile) = textaddr;
   DBX_TEXT_SIZE (objfile) = textsize;
@@ -3334,7 +3279,7 @@ coffstab_build_psymtabs (struct objfile *objfile, int mainline,
   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
 
   if (stabstrsize > bfd_get_size (sym_bfd))
-    error ("ridiculous string table size: %d bytes", stabstrsize);
+    error (_("ridiculous string table size: %d bytes"), stabstrsize);
   DBX_STRINGTAB (objfile) = (char *)
     obstack_alloc (&objfile->objfile_obstack, stabstrsize + 1);
   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
@@ -3416,7 +3361,7 @@ elfstab_build_psymtabs (struct objfile *objfile, int mainline,
 
   /* There is already a dbx_symfile_info allocated by our caller.
      It might even contain some info from the ELF symtab to help us.  */
-  info = objfile->sym_stab_info;
+  info = objfile->deprecated_sym_stab_info;
 
   /* Find the first and last text address.  dbx_symfile_read seems to
      want this.  */
@@ -3431,7 +3376,7 @@ elfstab_build_psymtabs (struct objfile *objfile, int mainline,
   DBX_STAB_SECTION (objfile) = stabsect;
 
   if (stabstrsize > bfd_get_size (sym_bfd))
-    error ("ridiculous string table size: %d bytes", stabstrsize);
+    error (_("ridiculous string table size: %d bytes"), stabstrsize);
   DBX_STRINGTAB (objfile) = (char *)
     obstack_alloc (&objfile->objfile_obstack, stabstrsize + 1);
   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
@@ -3505,16 +3450,16 @@ stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
     return;
 
   if (!stabstrsect)
-    error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
+    error (_("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)"),
           stab_name, stabstr_name);
 
-  objfile->sym_stab_info = (struct dbx_symfile_info *)
+  objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *)
     xmalloc (sizeof (struct dbx_symfile_info));
-  memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
+  memset (objfile->deprecated_sym_stab_info, 0, sizeof (struct dbx_symfile_info));
 
   text_sect = bfd_get_section_by_name (sym_bfd, text_name);
   if (!text_sect)
-    error ("Can't find %s section in symbol file", text_name);
+    error (_("Can't find %s section in symbol file"), text_name);
   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
 
@@ -3525,7 +3470,7 @@ stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
   DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;     /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
 
   if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
-    error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
+    error (_("ridiculous string table size: %d bytes"), DBX_STRINGTAB_SIZE (objfile));
   DBX_STRINGTAB (objfile) = (char *)
     obstack_alloc (&objfile->objfile_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
   OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);