Remove redundant returns in void functions.
[binutils-gdb.git] / gas / config / obj-vms.c
index 55ca06c4bea0faac96751485c8ad082e936ee3ea..18b4fd409620652b019b4ab0095245b2079a6286 100644 (file)
@@ -1,21 +1,24 @@
 /* vms.c -- Write out a VAX/VMS object file
-   Copyright (C) 1987, 1988, 1992, 1994, 1995 Free Software Foundation, Inc.
+   Copyright 1987, 1988, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001,
+   2002, 2003
+   Free Software Foundation, Inc.
 
-This file is part of GAS, the GNU Assembler.
+   This file is part of GAS, the GNU Assembler.
 
-GAS 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, or (at your option)
-any later version.
+   GAS 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, or (at your option)
+   any later version.
 
-GAS is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   GAS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with GAS; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with GAS; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.  */
 
 /* Written by David L. Kashtan */
 /* Modified by Eric Youngdale to write VMS debug records for program
@@ -26,23 +29,23 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307
 
 #include "as.h"
 #include "config.h"
+#include "safe-ctype.h"
 #include "subsegs.h"
 #include "obstack.h"
+#include <fcntl.h>
 
-/* What we do if there is a goof. */
+/* What we do if there is a goof.  */
 #define error as_fatal
 
-#ifdef VMS                     /* These are of no use if we are cross assembling. */
-#include <fab.h>               /* Define File Access Block       */
-#include <nam.h>               /* Define NAM Block               */
-#include <xab.h>               /* Define XAB - all different types*/
+#ifdef VMS                     /* These are of no use if we are cross assembling.  */
+#include <fab.h>               /* Define File Access Block.  */
+#include <nam.h>               /* Define NAM Block.  */
+#include <xab.h>               /* Define XAB - all different types.  */
 extern int sys$open(), sys$close(), sys$asctim();
 #endif
 
-/*
- *     Version string of the compiler that produced the code we are
- *     assembling.  (And this assembler, if we do not have compiler info.)
- */
+/* Version string of the compiler that produced the code we are
+   assembling.  (And this assembler, if we do not have compiler info).  */
 char *compiler_version_string;
 
 extern int flag_hash_long_names;       /* -+ */
@@ -51,24 +54,22 @@ extern int flag_show_after_trunc;   /* -H */
 extern int flag_no_hash_mixed_case;    /* -h NUM */
 
 /* Flag that determines how we map names.  This takes several values, and
* is set with the -h switch.  A value of zero implies names should be
* upper case, and the presence of the -h switch inhibits the case hack.
* No -h switch at all sets vms_name_mapping to 0, and allows case hacking.
* A value of 2 (set with -h2) implies names should be
* all lower case, with no case hack.  A value of 3 (set with -h3) implies
* that case should be preserved.  */
  is set with the -h switch.  A value of zero implies names should be
  upper case, and the presence of the -h switch inhibits the case hack.
  No -h switch at all sets vms_name_mapping to 0, and allows case hacking.
  A value of 2 (set with -h2) implies names should be
  all lower case, with no case hack.  A value of 3 (set with -h3) implies
  that case should be preserved.  */
 
 /* If the -+ switch is given, then the hash is appended to any name that is
- * longer than 31 characters, regardless of the setting of the -h switch.
- */
+   longer than 31 characters, regardless of the setting of the -h switch.  */
 
 char vms_name_mapping = 0;
 
 static symbolS *Entry_Point_Symbol = 0;        /* Pointer to "_main" */
 
-/*
- *     We augment the "gas" symbol structure with this
- */
+/* We augment the "gas" symbol structure with this.  */
+
 struct VMS_Symbol
 {
   struct VMS_Symbol *Next;
@@ -79,10 +80,11 @@ struct VMS_Symbol
 };
 
 struct VMS_Symbol *VMS_Symbols = 0;
+struct VMS_Symbol *Ctors_Symbols = 0;
+struct VMS_Symbol *Dtors_Symbols = 0;
 
 /* We need this to keep track of the various input files, so that we can
- * give the debugger the correct source line.
- */
+   give the debugger the correct source line.  */
 
 struct input_file
 {
@@ -99,67 +101,60 @@ struct input_file
 
 static struct input_file *file_root = (struct input_file *) NULL;
 
-
-/*
- * Styles of PSECTS (program sections) that we generate; just shorthand
- * to avoid lists of section attributes.  Used by VMS_Psect_Spec().
- */
+/* Styles of PSECTS (program sections) that we generate; just shorthand
+   to avoid lists of section attributes.  Used by VMS_Psect_Spec().  */
 enum ps_type
 {
-  ps_TEXT, ps_DATA, ps_COMMON, ps_CONST
+  ps_TEXT, ps_DATA, ps_COMMON, ps_CONST, ps_CTORS, ps_DTORS
 };
 
-/*
- * This enum is used to keep track of the various types of variables that
- * may be present.
- */
+/* This enum is used to keep track of the various types of variables that
+   may be present.  */
 
 enum advanced_type
 {
   BASIC, POINTER, ARRAY, ENUM, STRUCT, UNION, FUNCTION, VOID, ALIAS, UNKNOWN
 };
 
-/*
- * This structure contains the information from the stabs directives, and the
- * information is filled in by VMS_typedef_parse.  Everything that is needed
- * to generate the debugging record for a given symbol is present here.
- * This could be done more efficiently, using nested struct/unions, but for now
- * I am happy that it works.
- */
+/* This structure contains the information from the stabs directives, and the
+   information is filled in by VMS_typedef_parse.  Everything that is needed
+   to generate the debugging record for a given symbol is present here.
+   This could be done more efficiently, using nested struct/unions, but for
+   now I am happy that it works.  */
+
 struct VMS_DBG_Symbol
 {
   struct VMS_DBG_Symbol *next;
-  /* description of what this is */
+  /* Description of what this is.  */
   enum advanced_type advanced;
-  /* this record is for this type */
+  /* This record is for this type.  */
   int dbx_type;
   /* For advanced types this is the type referred to.  I.e., the type
      a pointer points to, or the type of object that makes up an
      array.  */
   int type2;
-  /* Use this type when generating a variable def */
+  /* Use this type when generating a variable def */
   int VMS_type;
-  /* used for arrays - this will be present for all */
+  /* Used for arrays - this will be present for all.  */
   int index_min;
-  /* entries, but will be meaningless for non-arrays */
+  /* Entries, but will be meaningless for non-arrays.  */
   int index_max;
   /* Size in bytes of the data type.  For an array, this is the size
-     of one element in the array */
+     of one element in the array */
   int data_size;
-  /* Number of the structure/union/enum - used for ref */
+  /* Number of the structure/union/enum - used for ref */
   int struc_numb;
 };
 
-#define SYMTYPLST_SIZE (1<<4)  /* 16; must be power of two */
-#define SYMTYP_HASH(x) ((unsigned)(x) & (SYMTYPLST_SIZE-1))
+#define SYMTYPLST_SIZE (1<<4)  /* 16; Must be power of two.  */
+#define SYMTYP_HASH(x) ((unsigned) (x) & (SYMTYPLST_SIZE - 1))
+
 struct VMS_DBG_Symbol *VMS_Symbol_type_list[SYMTYPLST_SIZE];
 
-/*
- * We need this structure to keep track of forward references to
- * struct/union/enum that have not been defined yet.  When they are ultimately
- * defined, then we can go back and generate the TIR commands to make a back
- * reference.
- */
+/* We need this structure to keep track of forward references to
+   struct/union/enum that have not been defined yet.  When they are
+   ultimately defined, then we can go back and generate the TIR
+   commands to make a back reference.  */
 
 struct forward_ref
 {
@@ -171,38 +166,35 @@ struct forward_ref
 
 struct forward_ref *f_ref_root = (struct forward_ref *) NULL;
 
-/*
- * This routine is used to compare the names of certain types to various
- * fixed types that are known by the debugger.
- */
+/* This routine is used to compare the names of certain types to various
+   fixed types that are known by the debugger.  */
+
 #define type_check(X)  !strcmp (symbol_name, X)
 
-/*
- * This variable is used to keep track of the name of the symbol we are
- * working on while we are parsing the stabs directives.
- */
+/* This variable is used to keep track of the name of the symbol we are
+   working on while we are parsing the stabs directives.  */
+
 static const char *symbol_name;
 
 /* We use this counter to assign numbers to all of the structures, unions
- * and enums that we define.  When we actually declare a variable to the
- * debugger, we can simply do it by number, rather than describing the
- * whole thing each time.
- */
+   and enums that we define.  When we actually declare a variable to the
+   debugger, we can simply do it by number, rather than describing the
+   whole thing each time.  */
 
-static structure_count = 0;
+static int structure_count = 0;
 
 /* This variable is used to indicate that we are making the last attempt to
    parse the stabs, and that we should define as much as we can, and ignore
-   the rest */
+   the rest */
 
 static int final_pass;
 
 /* This variable is used to keep track of the current structure number
* for a given variable.  If this is < 0, that means that the structure
* has not yet been defined to the debugger.  This is still cool, since
* the VMS object language has ways of fixing things up after the fact,
- * so we just make a note of this, and generate fixups at the end.
- */
  for a given variable.  If this is < 0, that means that the structure
  has not yet been defined to the debugger.  This is still cool, since
  the VMS object language has ways of fixing things up after the fact,
+   so we just make a note of this, and generate fixups at the end.  */
+
 static int struct_number;
 
 /* This is used to distinguish between D_float and G_float for telling
@@ -224,57 +216,53 @@ static int Current_Environment = -1;
 
 static char Module_Name[255+1];
 
-/*
- * Variable descriptors are used tell the debugger the data types of certain
- * more complicated variables (basically anything involving a structure,
- * union, enum, array or pointer).  Some non-pointer variables of the
- * basic types that the debugger knows about do not require a variable
- * descriptor.
- *
- * Since it is impossible to have a variable descriptor longer than 128
- * bytes by virtue of the way that the VMS object language is set up,
- * it makes not sense to make the arrays any longer than this, or worrying
- * about dynamic sizing of the array.
- *
- * These are the arrays and counters that we use to build a variable
- * descriptor.
- */
+/* Variable descriptors are used tell the debugger the data types of certain
+   more complicated variables (basically anything involving a structure,
+   union, enum, array or pointer).  Some non-pointer variables of the
+   basic types that the debugger knows about do not require a variable
+   descriptor.
+
+   Since it is impossible to have a variable descriptor longer than 128
+   bytes by virtue of the way that the VMS object language is set up,
+   it makes not sense to make the arrays any longer than this, or worrying
+   about dynamic sizing of the array.
+
+   These are the arrays and counters that we use to build a variable
+   descriptor.  */
 
 #define MAX_DEBUG_RECORD 128
-static char Local[MAX_DEBUG_RECORD];   /* buffer for variable descriptor */
-static char Asuffix[MAX_DEBUG_RECORD]; /* buffer for array descriptor */
-static int Lpnt;               /* index into Local */
-static int Apoint;             /* index into Asuffix */
-static char overflow;          /* flag to indicate we have written too much*/
-static int total_len;          /* used to calculate the total length of variable
-                               descriptor plus array descriptor - used for len byte*/
+static char Local[MAX_DEBUG_RECORD];   /* Buffer for variable descriptor.  */
+static char Asuffix[MAX_DEBUG_RECORD]; /* Buffer for array descriptor.  */
+static int Lpnt;               /* Index into Local.  */
+static int Apoint;             /* Index into Asuffix.  */
+static char overflow;          /* Flag to indicate we have written too much.  */
+static int total_len;          /* Used to calculate the total length of
+                                  variable descriptor plus array descriptor
+                                  - used for len byte.  */
 
 /* Flag if we have told user about finding global constants in the text
-   section. */
+   section.  */
 static int gave_compiler_message = 0;
 
+/* Global data (Object records limited to 512 bytes by VAX-11 "C" runtime).  */
+
+static int VMS_Object_File_FD;         /* File Descriptor for object file.  */
+static char Object_Record_Buffer[512]; /* Buffer for object file records.  */
+static size_t Object_Record_Offset;    /* Offset to end of data.  */
+static int Current_Object_Record_Type; /* Type of record in above.  */
 
-/*
- *     Global data (Object records limited to 512 bytes by VAX-11 "C" runtime)
- */
-static int VMS_Object_File_FD; /* File Descriptor for object file */
-static char Object_Record_Buffer[512]; /* Buffer for object file records  */
-static int Object_Record_Offset;/* Offset to end of data          */
-static int Current_Object_Record_Type; /* Type of record in above         */
-
-/*
- *     Macros for moving data around.  Must work on big-endian systems.
- */
-#ifdef VMS  /* These are more efficient for VMS->VMS systems */
-#define COPY_LONG(dest,val)    ( *(long *)(dest) = (val) )
-#define COPY_SHORT(dest,val)   ( *(short *)(dest) = (val) )
+/* Macros for moving data around.  Must work on big-endian systems.  */
+
+#ifdef VMS  /* These are more efficient for VMS->VMS systems.  */
+#define COPY_LONG(dest,val)    ( *(long *) (dest) = (val) )
+#define COPY_SHORT(dest,val)   ( *(short *) (dest) = (val) )
 #else
 #define COPY_LONG(dest,val)    md_number_to_chars ((dest), (val), 4)
 #define COPY_SHORT(dest,val)   md_number_to_chars ((dest), (val), 2)
 #endif
-/*
- *     Macros for placing data into the object record buffer.
- */
+
+/* Macros for placing data into the object record buffer.  */
+
 #define PUT_LONG(val) \
        ( COPY_LONG (&Object_Record_Buffer[Object_Record_Offset], (val)), \
          Object_Record_Offset += 4 )
@@ -283,17 +271,22 @@ static int Current_Object_Record_Type;    /* Type of record in above         */
        ( COPY_SHORT (&Object_Record_Buffer[Object_Record_Offset], (val)), \
          Object_Record_Offset += 2 )
 
-#define PUT_CHAR(val) ( Object_Record_Buffer[Object_Record_Offset++] = (val) )
+#define PUT_CHAR(val) (Object_Record_Buffer[Object_Record_Offset++] = (val))
 
-#define PUT_COUNTED_STRING(cp) do { \
-                       register const char *p = (cp); \
-                       PUT_CHAR ((char) strlen (p)); \
-                       while (*p) PUT_CHAR (*p++); } while (0)
+#define PUT_COUNTED_STRING(cp)                 \
+  do                                           \
+    {                                          \
+      const char *p = (cp);                    \
+                                               \
+      PUT_CHAR ((char) strlen (p));            \
+      while (*p)                               \
+       PUT_CHAR (*p++);                        \
+    }                                          \
+  while (0)
+
+/* Macro for determining if a Name has psect attributes attached
+   to it.   */
 
-/*
- *     Macro for determining if a Name has psect attributes attached
- *     to it.
- */
 #define PSECT_ATTRIBUTES_STRING                "$$PsectAttributes_"
 #define PSECT_ATTRIBUTES_STRING_LENGTH 18
 
@@ -339,95 +332,13 @@ const segT N_TYPE_seg[N_TYPE + 2] =
 };
 \f
 
-/* Local support routines which return a value.  */
-
-static struct input_file *find_file PARAMS ((symbolS *));
-static struct VMS_DBG_Symbol *find_symbol PARAMS ((int));
-static symbolS *Define_Routine PARAMS ((symbolS *,int,symbolS *,int));
-
-static char *cvt_integer PARAMS ((char *,int *));
-static char *fix_name PARAMS ((char *));
-static char *get_struct_name PARAMS ((char *));
-
-static offsetT VMS_Initialized_Data_Size PARAMS ((symbolS *,unsigned));
-
-static int VMS_TBT_Source_File PARAMS ((char *,int));
-static int gen1 PARAMS ((struct VMS_DBG_Symbol *,int));
-static int forward_reference PARAMS ((char *));
-static int final_forward_reference PARAMS ((struct VMS_DBG_Symbol *));
-static int VMS_typedef_parse PARAMS ((char *));
-static int hash_string PARAMS ((const char *));
-static int VMS_Psect_Spec PARAMS ((const char *,int,enum ps_type,
-                                  struct VMS_Symbol *));
-
-/* Local support routines which don't directly return any value.  */
-
-static void s_const PARAMS ((int));
-static void Create_VMS_Object_File PARAMS ((void));
-static void Flush_VMS_Object_Record_Buffer PARAMS ((void));
-static void Set_VMS_Object_File_Record PARAMS ((int));
-static void Close_VMS_Object_File PARAMS ((void));
-static void vms_tir_stack_psect PARAMS ((int,int,int));
-static void VMS_Store_Immediate_Data PARAMS ((const char *,int,int));
-static void VMS_Set_Data PARAMS ((int,int,int,int));
-static void VMS_Store_Struct PARAMS ((int));
-static void VMS_Def_Struct PARAMS ((int));
-static void VMS_Set_Struct PARAMS ((int));
-static void VMS_TBT_Module_Begin PARAMS ((void));
-static void VMS_TBT_Module_End PARAMS ((void));
-static void VMS_TBT_Routine_Begin PARAMS ((symbolS *,int));
-static void VMS_TBT_Routine_End PARAMS ((int,symbolS *));
-static void VMS_TBT_Block_Begin PARAMS ((symbolS *,int,char *));
-static void VMS_TBT_Block_End PARAMS ((valueT));
-static void VMS_TBT_Line_PC_Correlation PARAMS ((int,int,int,int));
-static void VMS_TBT_Source_Lines PARAMS ((int,int,int));
-static void fpush PARAMS ((int,int));
-static void rpush PARAMS ((int,int));
-static void array_suffix PARAMS ((struct VMS_DBG_Symbol *));
-static void new_forward_ref PARAMS ((int));
-static void generate_suffix PARAMS ((struct VMS_DBG_Symbol *,int));
-static void bitfield_suffix PARAMS ((struct VMS_DBG_Symbol *,int));
-static void setup_basic_type PARAMS ((struct VMS_DBG_Symbol *));
-static void VMS_DBG_record PARAMS ((struct VMS_DBG_Symbol *,int,int,char *));
-static void VMS_local_stab_Parse PARAMS ((symbolS *));
-static void VMS_stab_parse PARAMS ((symbolS *,int,int,int,int));
-static void VMS_GSYM_Parse PARAMS ((symbolS *,int));
-static void VMS_LCSYM_Parse PARAMS ((symbolS *,int));
-static void VMS_STSYM_Parse PARAMS ((symbolS *,int));
-static void VMS_RSYM_Parse PARAMS ((symbolS *,symbolS *,int));
-static void VMS_LSYM_Parse PARAMS ((void));
-static void Define_Local_Symbols PARAMS ((symbolS *,symbolS *,symbolS *,int));
-static void Write_VMS_MHD_Records PARAMS ((void));
-static void Write_VMS_EOM_Record PARAMS ((int,valueT));
-static void VMS_Case_Hack_Symbol PARAMS ((const char *,char *));
-static void VMS_Modify_Psect_Attributes PARAMS ((const char *,int *));
-static void VMS_Global_Symbol_Spec PARAMS ((const char *,int,int,int));
-static void VMS_Local_Environment_Setup PARAMS ((const char *));
-static void VMS_Emit_Globalvalues PARAMS ((unsigned,unsigned,char *));
-static void VMS_Procedure_Entry_Pt PARAMS ((char *,int,int,int));
-static void VMS_Set_Psect PARAMS ((int,int,int));
-static void VMS_Store_Repeated_Data PARAMS ((int,char *,int,int));
-static void VMS_Store_PIC_Symbol_Reference PARAMS ((symbolS *,int,
-                                                   int,int,int,int));
-static void VMS_Fix_Indirect_Reference PARAMS ((int,int,fragS *,fragS *));
-
-/* Support code which used to be inline within vms_write_object_file.  */
-static void vms_fixup_text_section PARAMS ((unsigned,struct frag *,struct frag *));
-static void synthesize_data_segment PARAMS ((unsigned,unsigned,struct frag *));
-static void vms_fixup_data_section PARAMS ((unsigned,unsigned));
-static void global_symbol_directory PARAMS ((unsigned,unsigned));
-static void local_symbols_DST PARAMS ((symbolS *,symbolS *));
-static void vms_build_DST PARAMS ((unsigned));
-\f
-
 /* The following code defines the special types of pseudo-ops that we
    use with VMS.  */
 
 unsigned char const_flag = IN_DEFAULT_SECTION;
 
 static void
-s_const (arg)
-     int arg;  /* 3rd field from obj_pseudo_table[]; not needed here */
+s_const (int arg)
 {
   /* Since we don't need `arg', use it as our scratch variable so that
      we won't get any "not used" warnings about it.  */
@@ -443,31 +354,25 @@ const pseudo_typeS obj_pseudo_table[] =
   {0, 0, 0},
 };                             /* obj_pseudo_table */
 
-
 /* Routine to perform RESOLVE_SYMBOL_REDEFINITION().  */
 
 int
-vms_resolve_symbol_redef (sym)
-     symbolS *sym;
+vms_resolve_symbol_redef (symbolS *sym)
 {
-  /*
-   *   If the new symbol is .comm AND it has a size of zero,
-   *   we ignore it (i.e. the old symbol overrides it)
-   */
+  /* If the new symbol is .comm AND it has a size of zero,
+     we ignore it (i.e. the old symbol overrides it).  */
   if (SEGMENT_TO_SYMBOL_TYPE ((int) now_seg) == (N_UNDF | N_EXT)
       && frag_now_fix () == 0)
     {
-      as_warn ("compiler emitted zero-size common symbol `%s' already defined",
+      as_warn (_("compiler emitted zero-size common symbol `%s' already defined"),
               S_GET_NAME (sym));
       return 1;
     }
-  /*
-   *   If the old symbol is .comm and it has a size of zero,
-   *   we override it with the new symbol value.
-   */
+  /* If the old symbol is .comm and it has a size of zero,
+     we override it with the new symbol value.  */
   if (S_IS_EXTERNAL (sym) && S_IS_DEFINED (sym) && S_GET_VALUE (sym) == 0)
     {
-      as_warn ("compiler redefined zero-size common symbol `%s'",
+      as_warn (_("compiler redefined zero-size common symbol `%s'"),
               S_GET_NAME (sym));
       sym->sy_frag  = frag_now;
       S_SET_OTHER (sym, const_flag);
@@ -480,15 +385,13 @@ vms_resolve_symbol_redef (sym)
   return 0;
 }
 
-
 /* `tc_frob_label' handler for colon(symbols.c), used to examine the
    dummy label(s) gcc inserts at the beginning of each file it generates.
    gcc 1.x put "gcc_compiled."; gcc 2.x (as of 2.7) puts "gcc2_compiled."
    and "__gnu_language_<name>" and possibly "__vax_<type>_doubles".  */
 
 void
-vms_check_for_special_label (symbolP)
-symbolS *symbolP;
+vms_check_for_special_label (symbolS *symbolP)
 {
   /* Special labels only occur prior to explicit section directives.  */
   if ((const_flag & IN_DEFAULT_SECTION) != 0)
@@ -504,33 +407,28 @@ symbolS *symbolP;
       else if (!strcmp (sym_name, "__vax_d_doubles"))
        vax_g_doubles = 0;
 #endif
-#if 0  /* these are potential alternatives to tc-vax.c's md_parse_options() */
+#if 0  /* These are potential alternatives to tc-vax.c's md_parse_options().  */
       else if (!strcmp (sym_name, "gcc_compiled."))
        flag_one = 1;
       else if (!strcmp (sym_name, "__gnu_language_cplusplus"))
        flag_hash_long_names = 1;
 #endif
     }
-  return;
 }
 
-
 void
-obj_read_begin_hook ()
+obj_read_begin_hook (void)
 {
-  return;
 }
 
-
 void
-obj_crawl_symbol_chain (headers)
-     object_headers *headers;
+obj_crawl_symbol_chain (object_headers *headers)
 {
   symbolS *symbolP;
   symbolS **symbolPP;
   int symbol_number = 0;
 
-  symbolPP = &symbol_rootP;    /* -> last symbol chain link. */
+  symbolPP = &symbol_rootP;    /* -> last symbol chain link.  */
   while ((symbolP = *symbolPP) != NULL)
     {
       resolve_symbol_value (symbolP);
@@ -553,59 +451,60 @@ obj_crawl_symbol_chain (headers)
        {
          symbolP->sy_number = symbol_number++;
          symbolP->sy_name_offset = 0;
-         symbolPP = &(symbol_next (symbolP));
+         symbolPP = &symbolP->sy_next;
        }
       else
        {
          if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP))
-           {
-             as_bad ("Local symbol %s never defined", S_GET_NAME (symbolP));
-           }                   /* oops. */
+           as_bad (_("Local symbol %s never defined"),
+                   S_GET_NAME (symbolP));
 
          /* Unhook it from the chain.  */
          *symbolPP = symbol_next (symbolP);
-       }                       /* if this symbol should be in the output */
-
-    }                  /* for each symbol */
+       }
+    }
 
   H_SET_STRING_SIZE (headers, string_byte_count);
   H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number);
-}                              /* obj_crawl_symbol_chain() */
+}
 \f
 
- /****** VMS OBJECT FILE HACKING ROUTINES *******/
-
+/* VMS OBJECT FILE HACKING ROUTINES.  */
 
 /* Create the VMS object file.  */
 
 static void
-Create_VMS_Object_File ()
+Create_VMS_Object_File (void)
 {
-#if    defined(eunice) || !defined(VMS)
+#ifdef eunice
   VMS_Object_File_FD = creat (out_file_name, 0777, "var");
-#else  /* eunice */
+#else
+#ifndef VMS
+  VMS_Object_File_FD = creat (out_file_name, 0777);
+#else  /* VMS */
   VMS_Object_File_FD = creat (out_file_name, 0, "rfm=var",
-                             "mbc=16", "deq=64", "fop=tef", "shr=nil");
-#endif /* eunice */
+                             "ctx=bin", "mbc=16", "deq=64", "fop=tef",
+                             "shr=nil");
+#endif /* !VMS */
+#endif /* !eunice */
   /* Deal with errors.  */
   if (VMS_Object_File_FD < 0)
-    as_fatal ("Couldn't create VMS object file \"%s\"", out_file_name);
+    as_fatal (_("Couldn't create VMS object file \"%s\""), out_file_name);
   /* Initialize object file hacking variables.  */
   Object_Record_Offset = 0;
   Current_Object_Record_Type = -1;
 }
 
-
 /* Flush the object record buffer to the object file.  */
 
 static void
-Flush_VMS_Object_Record_Buffer ()
+Flush_VMS_Object_Record_Buffer (void)
 {
   /* If the buffer is empty, there's nothing to do.  */
   if (Object_Record_Offset == 0)
     return;
 
-#ifndef VMS                    /* For cross-assembly purposes. */
+#ifndef VMS                    /* For cross-assembly purposes.  */
   {
     char RecLen[2];
 
@@ -615,7 +514,7 @@ Flush_VMS_Object_Record_Buffer ()
        When cross-assembling, we must write it explicitly.  */
     md_number_to_chars (RecLen, Object_Record_Offset, 2);
     if (write (VMS_Object_File_FD, RecLen, 2) != 2)
-      error ("I/O error writing VMS object file (length prefix)");
+      error (_("I/O error writing VMS object file (length prefix)"));
     /* We also need to force the actual record to be an even number of
        bytes.  For native output, that's automatic; when cross-assembling,
        pad with a NUL byte if length is odd.  Do so _after_ writing the
@@ -627,20 +526,18 @@ Flush_VMS_Object_Record_Buffer ()
 #endif /* not VMS */
 
   /* Write the data to the file.  */
-  if (write (VMS_Object_File_FD, Object_Record_Buffer, Object_Record_Offset)
-      != Object_Record_Offset)
-    error ("I/O error writing VMS object file");
+  if ((size_t) write (VMS_Object_File_FD, Object_Record_Buffer,
+                     Object_Record_Offset) != Object_Record_Offset)
+    error (_("I/O error writing VMS object file"));
 
   /* The buffer is now empty.  */
   Object_Record_Offset = 0;
 }
 
-
 /* Declare a particular type of object file record.  */
 
 static void
-Set_VMS_Object_File_Record (Type)
-     int Type;
+Set_VMS_Object_File_Record (int Type)
 {
   /* If the type matches, we are done.  */
   if (Type == Current_Object_Record_Type)
@@ -651,16 +548,15 @@ Set_VMS_Object_File_Record (Type)
   Current_Object_Record_Type = Type;
 }
 
-
 /* Close the VMS Object file.  */
 
 static void
-Close_VMS_Object_File ()
+Close_VMS_Object_File (void)
 {
   /* Flush (should never be necessary) and reset saved record-type context.  */
   Set_VMS_Object_File_Record (-1);
 
-#ifndef VMS                    /* For cross-assembly purposes. */
+#ifndef VMS                    /* For cross-assembly purposes.  */
   {
     char RecLen[2];
     int minus_one = -1;
@@ -681,18 +577,13 @@ Close_VMS_Object_File ()
   close (VMS_Object_File_FD);
 }
 \f
-
- /****** Text Information and Relocation routines ******/
-
+/* Text Information and Relocation routines. */
 
 /* Stack Psect base followed by signed, varying-sized offset.
    Common to several object records.  */
 
 static void
-vms_tir_stack_psect (Psect_Index, Offset, Force)
-     int Psect_Index;
-     int Offset;
-     int Force;
+vms_tir_stack_psect (int Psect_Index, int Offset, int Force)
 {
   int psect_width, offset_width;
 
@@ -700,19 +591,19 @@ vms_tir_stack_psect (Psect_Index, Offset, Force)
   offset_width = (Force || Offset > 32767 || Offset < -32768) ? 4
                 : (Offset > 127 || Offset < -128) ? 2 : 1;
 #define Sta_P(p,o) (((o)<<1) | ((p)-1))
-  /* byte or word psect; byte, word, or longword offset */
+  /* Byte or word psect; byte, word, or longword offset.  */
   switch (Sta_P(psect_width,offset_width))
     {
       case Sta_P(1,1): PUT_CHAR (TIR_S_C_STA_PB);
-                       PUT_CHAR ((char)(unsigned char) Psect_Index);
+                       PUT_CHAR ((char) (unsigned char) Psect_Index);
                        PUT_CHAR ((char) Offset);
                        break;
       case Sta_P(1,2): PUT_CHAR (TIR_S_C_STA_PW);
-                       PUT_CHAR ((char)(unsigned char) Psect_Index);
+                       PUT_CHAR ((char) (unsigned char) Psect_Index);
                        PUT_SHORT (Offset);
                        break;
       case Sta_P(1,4): PUT_CHAR (TIR_S_C_STA_PL);
-                       PUT_CHAR ((char)(unsigned char) Psect_Index);
+                       PUT_CHAR ((char) (unsigned char) Psect_Index);
                        PUT_LONG (Offset);
                        break;
       case Sta_P(2,1): PUT_CHAR (TIR_S_C_STA_WPB);
@@ -731,16 +622,12 @@ vms_tir_stack_psect (Psect_Index, Offset, Force)
 #undef Sta_P
 }
 
-
 /* Store immediate data in current Psect.  */
 
 static void
-VMS_Store_Immediate_Data (Pointer, Size, Record_Type)
-     const char *Pointer;
-     int Size;
-     int Record_Type;
+VMS_Store_Immediate_Data (const char *Pointer, int Size, int Record_Type)
 {
-  register int i;
+  int i;
 
   Set_VMS_Object_File_Record (Record_Type);
   /* We can only store as most 128 bytes at a time due to the way that
@@ -768,15 +655,10 @@ VMS_Store_Immediate_Data (Pointer, Size, Record_Type)
     Flush_VMS_Object_Record_Buffer ();
 }
 
-
 /* Make a data reference.  */
 
 static void
-VMS_Set_Data (Psect_Index, Offset, Record_Type, Force)
-     int Psect_Index;
-     int Offset;
-     int Record_Type;
-     int Force;
+VMS_Set_Data (int Psect_Index, int Offset, int Record_Type, int Force)
 {
   Set_VMS_Object_File_Record (Record_Type);
   /* If the buffer is empty we must insert the record type.  */
@@ -791,12 +673,10 @@ VMS_Set_Data (Psect_Index, Offset, Record_Type, Force)
     Flush_VMS_Object_Record_Buffer ();
 }
 
-
 /* Make a debugger reference to a struct, union or enum.  */
 
 static void
-VMS_Store_Struct (Struct_Index)
-     int Struct_Index;
+VMS_Store_Struct (int Struct_Index)
 {
   /* We are writing a debug record.  */
   Set_VMS_Object_File_Record (OBJ_S_C_DBG);
@@ -812,12 +692,10 @@ VMS_Store_Struct (Struct_Index)
     Flush_VMS_Object_Record_Buffer ();
 }
 
-
 /* Make a debugger reference to partially define a struct, union or enum.  */
 
 static void
-VMS_Def_Struct (Struct_Index)
-     int Struct_Index;
+VMS_Def_Struct (int Struct_Index)
 {
   /* We are writing a debug record.  */
   Set_VMS_Object_File_Record (OBJ_S_C_DBG);
@@ -833,9 +711,8 @@ VMS_Def_Struct (Struct_Index)
 }
 
 static void
-VMS_Set_Struct (Struct_Index)
-     int Struct_Index;
-{                              /* see previous functions for comments */
+VMS_Set_Struct (int Struct_Index)
+{
   Set_VMS_Object_File_Record (OBJ_S_C_DBG);
   if (Object_Record_Offset == 0)
     PUT_CHAR (OBJ_S_C_DBG);
@@ -846,16 +723,14 @@ VMS_Set_Struct (Struct_Index)
     Flush_VMS_Object_Record_Buffer ();
 }
 \f
-
- /****** Traceback Information routines ******/
-
+/* Traceback Information routines.  */
 
 /* Write the Traceback Module Begin record.  */
 
 static void
-VMS_TBT_Module_Begin ()
+VMS_TBT_Module_Begin (void)
 {
-  register char *cp, *cp1;
+  char *cp, *cp1;
   int Size;
   char Local[256];
 
@@ -864,11 +739,8 @@ VMS_TBT_Module_Begin ()
   /* Begin module.  */
   *cp++ = DST_S_C_MODBEG;
   *cp++ = 0;           /* flags; not used */
-  /*
-   *   Language type == "C"
-   *
-   * (FIXME:  this should be based on the input...)
-   */
+  /* Language type == "C"
+    (FIXME:  this should be based on the input...)  */
   COPY_LONG (cp, DST_S_C_C);
   cp += 4;
   /* Store the module name.  */
@@ -883,11 +755,10 @@ VMS_TBT_Module_Begin ()
   VMS_Store_Immediate_Data (Local, Size, OBJ_S_C_TBT);
 }
 
-
 /* Write the Traceback Module End record.  */
 
 static void
-VMS_TBT_Module_End ()
+VMS_TBT_Module_End (void)
 {
   char Local[2];
 
@@ -898,15 +769,12 @@ VMS_TBT_Module_End ()
   VMS_Store_Immediate_Data (Local, 2, OBJ_S_C_TBT);
 }
 
-
 /* Write a Traceback Routine Begin record.  */
 
 static void
-VMS_TBT_Routine_Begin (symbolP, Psect)
-     symbolS *symbolP;
-     int Psect;
+VMS_TBT_Routine_Begin (symbolS *symbolP, int Psect)
 {
-  register char *cp, *cp1;
+  char *cp, *cp1;
   char *Name;
   int Offset;
   int Size;
@@ -944,22 +812,19 @@ VMS_TBT_Routine_Begin (symbolP, Psect)
   VMS_Store_Immediate_Data (Local, Size, OBJ_S_C_TBT);
 }
 
-
 /* Write a Traceback Routine End record.
 
    We *must* search the symbol table to find the next routine, since the
-   assember has a way of reassembling the symbol table OUT OF ORDER Thus
+   assembler has a way of reassembling the symbol table OUT OF ORDER Thus
    the next routine in the symbol list is not necessarily the next one in
    memory.  For debugging to work correctly we must know the size of the
    routine.  */
 
 static void
-VMS_TBT_Routine_End (Max_Size, sp)
-     int Max_Size;
-     symbolS *sp;
+VMS_TBT_Routine_End (int Max_Size, symbolS *sp)
 {
   symbolS *symbolP;
-  int Size = 0x7fffffff;
+  unsigned long Size = 0x7fffffff;
   char Local[16];
   valueT sym_value, sp_value = S_GET_VALUE (sp);
 
@@ -973,17 +838,15 @@ VMS_TBT_Routine_End (Max_Size, sp)
          if (sym_value > sp_value && sym_value < Size)
            Size = sym_value;
 
-         /*
-          * Dummy labels like "gcc_compiled." should no longer reach here.
-          */
+         /* Dummy labels like "gcc_compiled." should no longer reach here.  */
 #if 0
          else
-         /* check if gcc_compiled. has size of zero */
-         if (sym_value == sp_value &&
-             sp != symbolP &&
-             (!strcmp (S_GET_NAME (sp), "gcc_compiled.") ||
-              !strcmp (S_GET_NAME (sp), "gcc2_compiled.")))
-           Size = sym_value;
+           /* Check if gcc_compiled. has size of zero.  */
+           if (sym_value == sp_value &&
+               sp != symbolP &&
+               (!strcmp (S_GET_NAME (sp), "gcc_compiled.") ||
+                !strcmp (S_GET_NAME (sp), "gcc2_compiled.")))
+             Size = sym_value;
 #endif
        }
     }
@@ -1001,16 +864,12 @@ VMS_TBT_Routine_End (Max_Size, sp)
   VMS_Store_Immediate_Data (Local, 7, OBJ_S_C_TBT);
 }
 
-
 /* Write a Traceback Block Begin record.  */
 
 static void
-VMS_TBT_Block_Begin (symbolP, Psect, Name)
-     symbolS *symbolP;
-     int Psect;
-     char *Name;
+VMS_TBT_Block_Begin (symbolS *symbolP, int Psect, char *Name)
 {
-  register char *cp, *cp1;
+  char *cp, *cp1;
   int Offset;
   int Size;
   char Local[512];
@@ -1045,12 +904,10 @@ VMS_TBT_Block_Begin (symbolP, Psect, Name)
   VMS_Store_Immediate_Data (Local, Size, OBJ_S_C_DBG);
 }
 
-
 /* Write a Traceback Block End record.  */
 
 static void
-VMS_TBT_Block_End (Size)
-     valueT Size;
+VMS_TBT_Block_End (valueT Size)
 {
   char Local[16];
 
@@ -1066,20 +923,15 @@ VMS_TBT_Block_End (Size)
 /* Write a Line number <-> Program Counter correlation record.  */
 
 static void
-VMS_TBT_Line_PC_Correlation (Line_Number, Offset, Psect, Do_Delta)
-     int Line_Number;
-     int Offset;
-     int Psect;
-     int Do_Delta;
+VMS_TBT_Line_PC_Correlation (int Line_Number, int Offset,
+                            int Psect, int Do_Delta)
 {
-  register char *cp;
+  char *cp;
   char Local[64];
 
   if (Do_Delta == 0)
     {
-      /*
-       *  If not delta, set our PC/Line number correlation.
-       */
+      /* If not delta, set our PC/Line number correlation.  */
       cp = &Local[1];  /* Put size in Local[0] later.  */
       /* DST type is "Line Number/PC correlation".  */
       *cp++ = DST_S_C_LINE_NUM;
@@ -1121,9 +973,7 @@ VMS_TBT_Line_PC_Correlation (Line_Number, Offset, Psect, Do_Delta)
     {
       if (Do_Delta < 0)
        {
-         /*
-          *  When delta is negative, terminate the line numbers.
-          */
+         /* When delta is negative, terminate the line numbers.  */
          Local[0] = 1 + 1 + 4;
          Local[1] = DST_S_C_LINE_NUM;
          Local[2] = DST_S_C_TERM_L;
@@ -1131,9 +981,7 @@ VMS_TBT_Line_PC_Correlation (Line_Number, Offset, Psect, Do_Delta)
          VMS_Store_Immediate_Data (Local, 7, OBJ_S_C_TBT);
          return;
        }
-      /*
-       *  Do a PC/Line delta.
-       */
+      /* Do a PC/Line delta.  */
       cp = &Local[1];
       *cp++ = DST_S_C_LINE_NUM;
       if (Line_Number > 1)
@@ -1155,9 +1003,7 @@ VMS_TBT_Line_PC_Correlation (Line_Number, Offset, Psect, Do_Delta)
              COPY_LONG (cp, Line_Number - 1),  cp += 4;
            }
        }
-      /*
-       *       Increment the PC
-       */
+      /* Increment the PC.  */
       if (Offset <= 128)
        {
          /* Small offsets are encoded as negative numbers, rather than the
@@ -1184,25 +1030,21 @@ VMS_TBT_Line_PC_Correlation (Line_Number, Offset, Psect, Do_Delta)
 /* Describe a source file to the debugger.  */
 
 static int
-VMS_TBT_Source_File (Filename, ID_Number)
-     char *Filename;
-     int ID_Number;
+VMS_TBT_Source_File (char *Filename, int ID_Number)
 {
-  register char *cp;
+  char *cp;
   int len, rfo, ffb, ebk;
   char cdt[8];
   char Local[512];
 #ifdef VMS                     /* Used for native assembly */
   unsigned Status;
-  struct FAB fab;                      /* RMS file access block */
-  struct NAM nam;                      /* file name information */
-  struct XABDAT xabdat;                        /* date+time fields */
-  struct XABFHC xabfhc;                        /* file header characteristics */
+  struct FAB fab;              /* RMS file access block */
+  struct NAM nam;              /* file name information */
+  struct XABDAT xabdat;                /* date+time fields */
+  struct XABFHC xabfhc;                /* file header characteristics */
   char resultant_string_buffer[255 + 1];
 
-  /*
-   *   Set up RMS structures:
-   */
+  /* Set up RMS structures:  */
   /* FAB -- file access block */
   memset ((char *) &fab, 0, sizeof fab);
   fab.fab$b_bid = FAB$C_BID;
@@ -1211,13 +1053,13 @@ VMS_TBT_Source_File (Filename, ID_Number)
   fab.fab$b_fns = (unsigned char) strlen (Filename);
   fab.fab$l_nam = (char *) &nam;
   fab.fab$l_xab = (char *) &xabdat;
-  /* NAM -- file name block */
+  /* NAM -- file name block */
   memset ((char *) &nam, 0, sizeof nam);
   nam.nam$b_bid = NAM$C_BID;
   nam.nam$b_bln = (unsigned char) sizeof nam;
   nam.nam$l_rsa = resultant_string_buffer;
   nam.nam$b_rss = (unsigned char) (sizeof resultant_string_buffer - 1);
-  /* XABs -- extended attributes blocks */
+  /* XABs -- extended attributes blocks */
   memset ((char *) &xabdat, 0, sizeof xabdat);
   xabdat.xab$b_cod = XAB$C_DAT;
   xabdat.xab$b_bln = (unsigned char) sizeof xabdat;
@@ -1226,13 +1068,12 @@ VMS_TBT_Source_File (Filename, ID_Number)
   xabfhc.xab$b_cod = XAB$C_FHC;
   xabfhc.xab$b_bln = (unsigned char) sizeof xabfhc;
   xabfhc.xab$l_nxt = 0;
-  /*
-   *   Get the file information
-   */
+
+  /* Get the file information.  */
   Status = sys$open (&fab);
   if (!(Status & 1))
     {
-      as_tsktsk ("Couldn't find source file \"%s\", status=%%X%x",
+      as_tsktsk (_("Couldn't find source file \"%s\", status=%%X%x"),
                 Filename, Status);
       return 0;
     }
@@ -1276,13 +1117,12 @@ VMS_TBT_Source_File (Filename, ID_Number)
   /* Library module name (none).  */
   *cp++ = 0;
   /* Now that size is known, fill it in and write out the record.  */
-  Local[4] = cp - &Local[5];           /* source file declaration size */ 
+  Local[4] = cp - &Local[5];           /* source file declaration size */
   Local[0] = cp - &Local[1];           /* TBT record size */
   VMS_Store_Immediate_Data (Local, cp - Local, OBJ_S_C_TBT);
   return 1;
 }
 
-
 /* Traceback information is described in terms of lines from compiler
    listing files, not lines from source files.  We need to set up the
    correlation between listing line numbers and source line numbers.
@@ -1290,14 +1130,12 @@ VMS_TBT_Source_File (Filename, ID_Number)
    need to describe a one-to-one correspondence.  */
 
 static void
-VMS_TBT_Source_Lines (ID_Number, Starting_Line_Number, Number_Of_Lines)
-     int ID_Number;
-     int Starting_Line_Number;
-     int Number_Of_Lines;
+VMS_TBT_Source_Lines (int ID_Number, int Starting_Line_Number,
+                     int Number_Of_Lines)
 {
   char *cp;
   int chunk_limit;
-  char Local[128];     /* room enough to describe 1310700 lines... */
+  char Local[128];     /* room enough to describe 1310700 lines...  */
 
   cp = &Local[1];      /* Put size in Local[0] later.  */
   *cp++ = DST_S_C_SOURCE;              /* DST type is "source file".  */
@@ -1340,16 +1178,14 @@ VMS_TBT_Source_Lines (ID_Number, Starting_Line_Number, Number_Of_Lines)
 }
 \f
 
- /****** Debugger Information support routines ******/
-
+/* Debugger Information support routines. */
 
 /* This routine locates a file in the list of files.  If an entry does
    not exist, one is created.  For include files, a new entry is always
    created such that inline functions can be properly debugged.  */
 
 static struct input_file *
-find_file (sp)
-     symbolS *sp;
+find_file (symbolS *sp)
 {
   struct input_file *same_file = 0;
   struct input_file *fpnt, *last = 0;
@@ -1372,7 +1208,7 @@ find_file (sp)
          break;
        }
     }
-  fpnt = (struct input_file *) xmalloc (sizeof (struct input_file));
+  fpnt = xmalloc (sizeof (struct input_file));
   if (!file_root)
     file_root = fpnt;
   else
@@ -1389,15 +1225,12 @@ find_file (sp)
   return fpnt;
 }
 
-
 /* This routine converts a number string into an integer, and stops when
    it sees an invalid character.  The return value is the address of the
    character just past the last character read.  No error is generated.  */
 
 static char *
-cvt_integer (str, rtn)
-     char *str;
-     int *rtn;
+cvt_integer (char *str, int *rtn)
 {
   int ival = 0, sgn = 1;
 
@@ -1410,17 +1243,14 @@ cvt_integer (str, rtn)
 }
 \f
 
-/*
- * The following functions and definitions are used to generate object
- * records that will describe program variables to the VMS debugger.
- *
- * This file contains many of the routines needed to output debugging info
- * into the object file that the VMS debugger needs to understand symbols.
- * These routines are called very late in the assembly process, and thus
- * we can be fairly lax about changing things, since the GSD and the TIR
- * sections have already been output.
- */
+/* The following functions and definitions are used to generate object
+   records that will describe program variables to the VMS debugger.
 
+   This file contains many of the routines needed to output debugging info
+   into the object file that the VMS debugger needs to understand symbols.
+   These routines are called very late in the assembly process, and thus
+   we can be fairly lax about changing things, since the GSD and the TIR
+   sections have already been output.  */
 
 /* This routine fixes the names that are generated by C++, ".this" is a good
    example.  The period does not work for the debugger, since it looks like
@@ -1430,8 +1260,7 @@ cvt_integer (str, rtn)
    write a debugger record.  */
 
 static char *
-fix_name (pnt)
-     char *pnt;
+fix_name (char *pnt)
 {
   char *pnt1;
 
@@ -1463,7 +1292,6 @@ fix_name (pnt)
   return pnt;
 }
 
-
 /* When defining a structure, this routine is called to find the name of
    the actual structure.  It is assumed that str points to the equal sign
    in the definition, and it moves backward until it finds the start of the
@@ -1471,8 +1299,7 @@ fix_name (pnt)
    outermost level, and thus symbol_name points to the symbol name.  */
 
 static char *
-get_struct_name (str)
-     char *str;
+get_struct_name (char *str)
 {
   char *pnt;
   pnt = str;
@@ -1492,13 +1319,11 @@ get_struct_name (str)
   return pnt;
 }
 
-
 /* Search symbol list for type number dbx_type.
    Return a pointer to struct.  */
 
 static struct VMS_DBG_Symbol *
-find_symbol (dbx_type)
-     int dbx_type;
+find_symbol (int dbx_type)
 {
   struct VMS_DBG_Symbol *spnt;
 
@@ -1514,16 +1339,14 @@ find_symbol (dbx_type)
   return find_symbol (spnt->type2);
 }
 
-
 #if 0          /* obsolete */
-/* this routine puts info into either Local or Asuffix, depending on the sign
* of size.  The reason is that it is easier to build the variable descriptor
* backwards, while the array descriptor is best built forwards.  In the end
- * they get put together, if there is not a struct/union/enum along the way
- */
+/* This routine puts info into either Local or Asuffix, depending on the sign
  of size.  The reason is that it is easier to build the variable descriptor
  backwards, while the array descriptor is best built forwards.  In the end
+   they get put together, if there is not a struct/union/enum along the way.  */
+
 static void
-push (value, size1)
-     int value, size1;
+push (int value, int size1)
 {
   if (size1 < 0)
     {
@@ -1551,10 +1374,8 @@ push (value, size1)
 }
 #endif
 
-
 static void
-fpush (value, size)
-     int value, size;
+fpush (int value, int size)
 {
   if (Apoint + size >= MAX_DEBUG_RECORD)
     {
@@ -1572,8 +1393,7 @@ fpush (value, size)
 }
 
 static void
-rpush (value, size)
-     int value, size;
+rpush (int value, int size)
 {
   if (Lpnt < size)
     {
@@ -1590,12 +1410,10 @@ rpush (value, size)
     }
 }
 
-
 /* This routine generates the array descriptor for a given array.  */
 
 static void
-array_suffix (spnt2)
-     struct VMS_DBG_Symbol *spnt2;
+array_suffix (struct VMS_DBG_Symbol *spnt2)
 {
   struct VMS_DBG_Symbol *spnt;
   struct VMS_DBG_Symbol *spnt1;
@@ -1647,18 +1465,17 @@ array_suffix (spnt2)
     }
 }
 
-
 /* This routine generates the start of a variable descriptor based upon
    a struct/union/enum that has yet to be defined.  We define this spot as
    a new location, and save four bytes for the address.  When the struct is
    finally defined, then we can go back and plug in the correct address.  */
 
 static void
-new_forward_ref (dbx_type)
-     int dbx_type;
+new_forward_ref (int dbx_type)
 {
   struct forward_ref *fpnt;
-  fpnt = (struct forward_ref *) xmalloc (sizeof (struct forward_ref));
+
+  fpnt = xmalloc (sizeof (struct forward_ref));
   fpnt->next = f_ref_root;
   f_ref_root = fpnt;
   fpnt->dbx_type = dbx_type;
@@ -1670,7 +1487,6 @@ new_forward_ref (dbx_type)
   struct_number = -fpnt->struc_numb;
 }
 
-
 /* This routine generates the variable descriptor used to describe non-basic
    variables.  It calls itself recursively until it gets to the bottom of it
    all, and then builds the descriptor backwards.  It is easiest to do it
@@ -1678,9 +1494,7 @@ new_forward_ref (dbx_type)
    if we know the value when it is time to write it.  */
 
 static int
-gen1 (spnt, array_suffix_len)
-     struct VMS_DBG_Symbol *spnt;
-     int array_suffix_len;
+gen1 (struct VMS_DBG_Symbol *spnt, int array_suffix_len)
 {
   struct VMS_DBG_Symbol *spnt1;
   int i;
@@ -1704,7 +1518,7 @@ gen1 (spnt, array_suffix_len)
        }
       rpush (0, 4);
       rpush (DST_K_VFLAGS_DSC, 1);
-      rpush (DST_K_TS_DSC, 1); /* descriptor type specification */
+      rpush (DST_K_TS_DSC, 1); /* Descriptor type specification.  */
       total_len = -2;
       return 1;
     case STRUCT:
@@ -1728,7 +1542,8 @@ gen1 (spnt, array_suffix_len)
       else
        i = gen1 (spnt1, 0);
       if (i)
-       {       /* (*void) is a special case, do not put pointer suffix */
+       {
+         /* (*void) is a special case, do not put pointer suffix.  */
          rpush (DBG_S_C_POINTER, 1);
          total_len += 3;
          rpush (total_len, 2);
@@ -1741,13 +1556,13 @@ gen1 (spnt, array_suffix_len)
          spnt1 = find_symbol (spnt1->type2);
          if (!spnt1)
            {
-             as_tsktsk ("debugger forward reference error, dbx type %d",
+             as_tsktsk (_("debugger forward reference error, dbx type %d"),
                         spnt->type2);
              return 0;
            }
        }
-/* It is too late to generate forward references, so the user gets a message.
* This should only happen on a compiler error */
+      /* It is too late to generate forward references, so the user
       gets a message.  This should only happen on a compiler error.  */
       (void) gen1 (spnt1, 1);
       i = Apoint;
       array_suffix (spnt);
@@ -1762,20 +1577,19 @@ gen1 (spnt, array_suffix_len)
          total_len += 2;
          rpush (total_len, 2);
          rpush (DST_K_VFLAGS_DSC, 1);
-         rpush (1, 1);         /* flags: element value spec included */
-         rpush (1, 1);         /* one dimension */
+         rpush (1, 1);         /* Flags: element value spec included.  */
+         rpush (1, 1);         /* One dimension.  */
          rpush (DBG_S_C_COMPLEX_ARRAY, 1);
        }
       total_len += array_suffix_len + 8;
       rpush (total_len, 2);
       break;
-    default:   /* lint suppression */
+    default:
       break;
     }
   return 0;
 }
 
-
 /* This generates a suffix for a variable.  If it is not a defined type yet,
    then dbx_type contains the type we are expecting so we can generate a
    forward reference.  This calls gen1 to build most of the descriptor, and
@@ -1783,17 +1597,16 @@ gen1 (spnt, array_suffix_len)
    to get a complete descriptor (i.e. struct reference, array suffix).  */
 
 static void
-generate_suffix (spnt, dbx_type)
-     struct VMS_DBG_Symbol *spnt;
-     int dbx_type;
+generate_suffix (struct VMS_DBG_Symbol *spnt, int dbx_type)
 {
-  static const char pvoid[6] = {
-               5,              /* record.length == 5 */
-               DST_K_TYPSPEC,  /* record.type == 1 (type specification) */
-               0,              /* name.length == 0, no name follows */
-               1, 0,           /* type.length == 1 {2 bytes, little endian} */
-               DBG_S_C_VOID    /* type.type == 5 (pointer to unspecified) */
-  };
+  static const char pvoid[6] =
+    {
+      5,               /* record.length == 5 */
+      DST_K_TYPSPEC,   /* record.type == 1 (type specification) */
+      0,               /* name.length == 0, no name follows */
+      1, 0,            /* type.length == 1 {2 bytes, little endian} */
+      DBG_S_C_VOID     /* type.type == 5 (pointer to unspecified) */
+    };
   int i;
 
   Apoint = 0;
@@ -1817,7 +1630,7 @@ generate_suffix (spnt, dbx_type)
      for a pointer to void.  */
   if ((total_len >= MAX_DEBUG_RECORD) || overflow)
     {
-      as_warn ("Variable descriptor %d too complicated.  Defined as `void *'.",
+      as_warn (_("Variable descriptor %d too complicated.  Defined as `void *'."),
                spnt->dbx_type);
       VMS_Store_Immediate_Data (pvoid, 6, OBJ_S_C_DBG);
       return;
@@ -1826,7 +1639,7 @@ generate_suffix (spnt, dbx_type)
   while (Lpnt < MAX_DEBUG_RECORD - 1)
     Local[i++] = Local[++Lpnt];
   Lpnt = i;
-  /* we use this for reference to structure that has already been defined */
+  /* We use this for reference to structure that has already been defined.  */
   if (struct_number > 0)
     {
       VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG);
@@ -1855,17 +1668,14 @@ generate_suffix (spnt, dbx_type)
   Lpnt = 0;
 }
 
-
-       /* "novel length" type doesn't work for simple atomic types */
+/* "novel length" type doesn't work for simple atomic types.  */
 #define USE_BITSTRING_DESCRIPTOR(t) ((t)->advanced == BASIC)
 #undef SETUP_BASIC_TYPES
 
 /* This routine generates a type description for a bitfield.  */
 
 static void
-bitfield_suffix (spnt, width)
-     struct VMS_DBG_Symbol *spnt;
-     int width;
+bitfield_suffix (struct VMS_DBG_Symbol *spnt, int width)
 {
   Local[Lpnt++] = 13;                  /* rec.len==13 */
   Local[Lpnt++] = DST_K_TYPSPEC;       /* a type specification record */
@@ -1882,15 +1692,13 @@ bitfield_suffix (spnt, width)
   VMS_Store_Struct (spnt->struc_numb); /* output 4 more bytes */
 }
 
-
 /* Formally define a builtin type, so that it can serve as the target of
    an indirect reference.  It makes bitfield_suffix() easier by avoiding
    the need to use a forward reference for the first occurrence of each
    type used in a bitfield.  */
 
 static void
-setup_basic_type (spnt)
-     struct VMS_DBG_Symbol *spnt;
+setup_basic_type (struct VMS_DBG_Symbol *spnt ATTRIBUTE_UNUSED)
 {
 #ifdef SETUP_BASIC_TYPES
   /* This would be very useful if "novel length" fields actually worked
@@ -1903,7 +1711,7 @@ setup_basic_type (spnt)
      ought to have distinct type records rather than sharing one.  */
   struct VMS_DBG_Symbol *spnt2;
 
-  /* first check whether this type has already been seen by another name */
+  /* First check whether this type has already been seen by another name.  */
   for (spnt2 = VMS_Symbol_type_list[SYMTYP_HASH (spnt->VMS_type)];
        spnt2;
        spnt2 = spnt2->next)
@@ -1934,32 +1742,28 @@ setup_basic_type (spnt)
   VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG);
   Lpnt = 0;
 #endif /* SETUP_BASIC_TYPES */
-  return;
 }
 
-
-/* This routine generates a symbol definition for a C symbol for the debugger.
-   It takes a psect and offset for global symbols; if psect < 0, then this is
-   a local variable and the offset is relative to FP.  In this case it can
-   be either a variable (Offset < 0) or a parameter (Offset > 0).  */
+/* This routine generates a symbol definition for a C symbol for the
+   debugger.  It takes a psect and offset for global symbols; if psect < 0,
+   then this is a local variable and the offset is relative to FP.  In this
+   case it can be either a variable (Offset < 0) or a parameter (Offset > 0).  */
 
 static void
-VMS_DBG_record (spnt, Psect, Offset, Name)
-     struct VMS_DBG_Symbol *spnt;
-     int Psect;
-     int Offset;
-     char *Name;
+VMS_DBG_record (struct VMS_DBG_Symbol *spnt, int Psect,
+               int Offset, char *Name)
 {
   char *Name_pnt;
   int len;
   int i = 0;
 
-  /* if there are bad characters in name, convert them */
+  /* If there are bad characters in name, convert them.  */
   Name_pnt = fix_name (Name);
 
   len = strlen (Name_pnt);
   if (Psect < 0)
-    {                          /* this is a local variable, referenced to SP */
+    {
+      /* This is a local variable, referenced to SP.  */
       Local[i++] = 7 + len;
       Local[i++] = spnt->VMS_type;
       Local[i++] = (Offset > 0) ? DBG_C_FUNCTION_PARAM : DBG_C_LOCAL_SYM;
@@ -1983,13 +1787,11 @@ VMS_DBG_record (spnt, Psect, Offset, Name)
     generate_suffix (spnt, 0);
 }
 
-
 /* This routine parses the stabs entries in order to make the definition
    for the debugger of local symbols and function parameters.  */
 
 static void
-VMS_local_stab_Parse (sp)
-     symbolS *sp;
+VMS_local_stab_Parse (symbolS *sp)
 {
   struct VMS_DBG_Symbol *spnt;
   char *pnt;
@@ -2001,17 +1803,21 @@ VMS_local_stab_Parse (sp)
   str = S_GET_NAME (sp);
   pnt = (char *) strchr (str, ':');
   if (!pnt)
-    return;                    /* no colon present */
-  pnt1 = pnt++;                        /* save this for later, and skip colon */
+    return;
+  
+  /* Save this for later, and skip colon.  */
+  pnt1 = pnt++;
+
+  /* Ignore static constants.  */
   if (*pnt == 'c')
-    return;                    /* ignore static constants */
-
-/* there is one little catch that we must be aware of.  Sometimes function
- * parameters are optimized into registers, and the compiler, in its infiite
- * wisdom outputs stabs records for *both*.  In general we want to use the
- * register if it is present, so we must search the rest of the symbols for
- * this function to see if this parameter is assigned to a register.
- */
+    return;
+  
+  /* There is one little catch that we must be aware of.  Sometimes function
+     parameters are optimized into registers, and the compiler, in its
+     infiite wisdom outputs stabs records for *both*.  In general we want to
+     use the register if it is present, so we must search the rest of the
+     symbols for this function to see if this parameter is assigned to a
    register.  */
   {
     symbolS *sp1;
     char *str1;
@@ -2041,22 +1847,27 @@ VMS_local_stab_Parse (sp)
                str1++;
              }
            if (*str1 == ':' && *pnt2 == ':')
-             return;   /* they are the same!  lets skip this one */
-         }                     /* for */
-       pnt++;                  /* skip p in case no register */
-      }                        /* if */
-  }                            /* p block */
+             return;   /* They are the same!  Let's skip this one.  */
+         }
+
+       /* Skip p in case no register.  */
+       pnt++;
+      }
+  }
 
   pnt = cvt_integer (pnt, &dbx_type);
+
   spnt = find_symbol (dbx_type);
   if (!spnt)
-    return;                    /*Dunno what this is*/
+    /* Dunno what this is.  */
+    return;
+  
   *pnt1 = '\0';
   VMS_DBG_record (spnt, -1, S_GET_VALUE (sp), str);
-  *pnt1 = ':';                 /* and restore the string */
-  return;
-}
 
+  /* ...and restore the string.  */
+  *pnt1 = ':';
+}
 
 /* This routine parses a stabs entry to find the information required
    to define a variable.  It is used for global and static variables.
@@ -2071,10 +1882,8 @@ VMS_local_stab_Parse (sp)
    to do with it.  */
 
 static void
-VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect)
-     symbolS *sp;
-     int expected_type;        /* char */
-     int type1, type2, Text_Psect;
+VMS_stab_parse (symbolS *sp, int expected_type,
+               int type1, int type2, int Text_Psect)
 {
   char *pnt;
   char *pnt1;
@@ -2086,10 +1895,14 @@ VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect)
 
   dbx_type = 0;
   str = S_GET_NAME (sp);
+
   pnt = (char *) strchr (str, ':');
   if (!pnt)
-    return;                    /* no colon present */
-  pnt1 = pnt;                  /* save this for later*/
+    /* No colon present.  */
+    return;
+  
+  /* Save this for later. */
+  pnt1 = pnt;
   pnt++;
   if (*pnt == expected_type)
     {
@@ -2097,10 +1910,8 @@ VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect)
       spnt = find_symbol (dbx_type);
       if (!spnt)
        return;         /*Dunno what this is*/
-      /*
-       * Now we need to search the symbol table to find the psect and
-       * offset for this variable.
-       */
+      /* Now we need to search the symbol table to find the psect and
+         offset for this variable.  */
       *pnt1 = '\0';
       vsp = VMS_Symbols;
       while (vsp)
@@ -2124,9 +1935,7 @@ VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect)
          "entry point" if it was a constant.  */
       for (sp1 = symbol_rootP; sp1; sp1 = symbol_next (sp1))
        {
-         /*
-          *    Dispatch on STAB type
-          */
+         /* Dispatch on STAB type.  */
          if (S_IS_DEBUG (sp1) || (S_GET_TYPE (sp1) != N_TEXT))
            continue;
          pnt = S_GET_NAME (sp1);
@@ -2136,14 +1945,14 @@ VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect)
            {
              if (!gave_compiler_message && expected_type == 'G')
                {
-                 static const char long_const_msg[] = "\
+                 char *long_const_msg = _("\
 ***Warning - the assembly code generated by the compiler has placed \n\
  global constant(s) in the text psect.  These will not be available to \n\
  other modules, since this is not the correct way to handle this. You \n\
  have two options: 1) get a patched compiler that does not put global \n\
  constants in the text psect, or 2) remove the 'const' keyword from \n\
  definitions of global variables in your source module(s).  Don't say \n\
- I didn't warn you! \n";
+ I didn't warn you! \n");
 
                  as_tsktsk (long_const_msg);
                  gave_compiler_message = 1;
@@ -2153,7 +1962,7 @@ VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect)
                              S_GET_VALUE (sp1),
                              str);
              *pnt1 = ':';
-             /* fool assembler to not output this as a routine in the TBT */
+             /* Fool assembler to not output this as a routine in the TBT.  */
              pnt1 = S_GET_NAME (sp1);
              *pnt1 = 'L';
              S_SET_NAME (sp1, pnt1);
@@ -2161,38 +1970,31 @@ VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect)
            }
        }
     }
-  *pnt1 = ':';                 /* and restore the string */
-  return;
-}
 
+  /* ...and restore the string.  */
+  *pnt1 = ':';
+}
 
 /* Simpler interfaces into VMS_stab_parse().  */
 
 static void
-VMS_GSYM_Parse (sp, Text_Psect)
-     symbolS *sp;
-     int Text_Psect;
+VMS_GSYM_Parse (symbolS *sp, int Text_Psect)
 {                              /* Global variables */
   VMS_stab_parse (sp, 'G', (N_UNDF | N_EXT), (N_DATA | N_EXT), Text_Psect);
 }
 
 static void
-VMS_LCSYM_Parse (sp, Text_Psect)
-     symbolS *sp;
-     int Text_Psect;
-{                              /* Static symbols - uninitialized */
+VMS_LCSYM_Parse (symbolS *sp, int Text_Psect)
+{
   VMS_stab_parse (sp, 'S', N_BSS, -1, Text_Psect);
 }
 
 static void
-VMS_STSYM_Parse (sp, Text_Psect)
-     symbolS *sp;
-     int Text_Psect;
-{                              /* Static symbols - initialized */
+VMS_STSYM_Parse (symbolS *sp, int Text_Psect)
+{
   VMS_stab_parse (sp, 'S', N_DATA, -1, Text_Psect);
 }
 
-
 /* For register symbols, we must figure out what range of addresses
    within the psect are valid.  We will use the brackets in the stab
    directives to give us guidance as to the PC range that this variable
@@ -2201,9 +2003,8 @@ VMS_STSYM_Parse (sp, Text_Psect)
    Caveat Emptor.  */
 
 static void
-VMS_RSYM_Parse (sp, Current_Routine, Text_Psect)
-     symbolS *sp, *Current_Routine;
-     int Text_Psect;
+VMS_RSYM_Parse (symbolS *sp, symbolS *Current_Routine ATTRIBUTE_UNUSED,
+               int Text_Psect)
 {
   symbolS *symbolP;
   struct VMS_DBG_Symbol *spnt;
@@ -2219,9 +2020,7 @@ VMS_RSYM_Parse (sp, Current_Routine, Text_Psect)
 
   for (symbolP = sp; symbolP; symbolP = symbol_next (symbolP))
     {
-      /*
-       *       Dispatch on STAB type
-       */
+      /* Dispatch on STAB type.  */
       switch (S_GET_RAW_TYPE (symbolP))
        {
        case N_LBRAC:
@@ -2314,15 +2113,13 @@ VMS_RSYM_Parse (sp, Current_Routine, Text_Psect)
     generate_suffix (spnt, 0);
 }
 
-
 /* This function examines a structure definition, checking all of the elements
    to make sure that all of them are fully defined.  The only thing that we
    kick out are arrays of undefined structs, since we do not know how big
    they are.  All others we can handle with a normal forward reference.  */
 
 static int
-forward_reference (pnt)
-     char *pnt;
+forward_reference (char *pnt)
 {
   struct VMS_DBG_Symbol *spnt, *spnt1;
   int i;
@@ -2345,15 +2142,13 @@ forward_reference (pnt)
       pnt = cvt_integer (pnt + 1, &i);
       pnt = cvt_integer (pnt + 1, &i);
     } while (*++pnt != ';');
-  return 0;                    /* no forward refences found */
+  return 0;                    /* no forward references found */
 }
 
-
 /* Used to check a single element of a structure on the final pass.  */
 
 static int
-final_forward_reference (spnt)
-     struct VMS_DBG_Symbol *spnt;
+final_forward_reference (struct VMS_DBG_Symbol *spnt)
 {
   struct VMS_DBG_Symbol *spnt1;
 
@@ -2364,10 +2159,9 @@ final_forward_reference (spnt)
        return 1;
       spnt = spnt1;
     }
-  return 0;    /* no forward refences found */
+  return 0;    /* no forward references found */
 }
 
-
 /* This routine parses the stabs directives to find any definitions of dbx
    type numbers.  It makes a note of all of them, creating a structure
    element of VMS_DBG_Symbol that describes it.  This also generates the
@@ -2386,8 +2180,7 @@ final_forward_reference (spnt)
    definition, and only the first one has the definition.  */
 
 static int
-VMS_typedef_parse (str)
-     char *str;
+VMS_typedef_parse (char *str)
 {
   char *pnt;
   char *pnt1;
@@ -2416,23 +2209,25 @@ VMS_typedef_parse (str)
   pnt++;                       /* and get back to the number */
   cvt_integer (pnt, &i1);
   spnt = find_symbol (i1);
-  /* first see if this has been defined already, due to forward reference */
+  /* First see if this has been defined already, due to forward reference.  */
   if (!spnt)
     {
       i2 = SYMTYP_HASH (i1);
-      spnt = (struct VMS_DBG_Symbol *) xmalloc (sizeof (struct VMS_DBG_Symbol));
+      spnt = xmalloc (sizeof (struct VMS_DBG_Symbol));
       spnt->next = VMS_Symbol_type_list[i2];
       VMS_Symbol_type_list[i2] = spnt;
       spnt->dbx_type = i1;     /* and save the type */
       spnt->type2 = spnt->VMS_type = spnt->data_size = 0;
       spnt->index_min = spnt->index_max = spnt->struc_numb = 0;
     }
-  /*
-   * For structs and unions, do a partial parse, otherwise we sometimes get
-   * circular definitions that are impossible to resolve.  We read enough
-   * info so that any reference to this type has enough info to be resolved.
-   */
-  pnt = str + 1;               /* point to character past equal sign */
+
+  /* For structs and unions, do a partial parse, otherwise we sometimes get
+     circular definitions that are impossible to resolve.  We read enough
+     info so that any reference to this type has enough info to be resolved.  */
+
+  /* Point to character past equal sign.  */
+  pnt = str + 1;
+
   if (*pnt >= '0' && *pnt <= '9')
     {
       if (type_check ("void"))
@@ -2455,12 +2250,14 @@ VMS_typedef_parse (str)
          strcpy (str, pnt1);
          return 0;
        }
-      as_tsktsk ("debugginer output: %d is an unknown untyped variable.",
+      as_tsktsk (_("debugginer output: %d is an unknown untyped variable."),
                 spnt->dbx_type);
       return 1;                        /* do not know what this is */
     }
 
-  pnt = str + 1;               /* point to character past equal sign */
+  /* Point to character past equal sign.  */
+  pnt = str + 1;
+
   switch (*pnt)
     {
     case 'r':
@@ -2554,10 +2351,8 @@ VMS_typedef_parse (str)
        }
       else
        {
-         /*    [pr]
-          * Shouldn't get here, but if we do, something
-          * more substantial ought to be done...
-          */
+         /* Shouldn't get here, but if we do, something
+            more substantial ought to be done...  */
          spnt->VMS_type = 0;
          spnt->data_size = 0;
        }
@@ -2608,8 +2403,10 @@ VMS_typedef_parse (str)
       if (pnt != symbol_name)
        {
          pnt += strlen (pnt);
+         /* Replace colon for later.  */
          *pnt = ':';
-       }                       /* replace colon for later */
+       }
+
       while (*++pnt1 != ';')
        {
          pnt = (char *) strchr (pnt1, ':');
@@ -2632,7 +2429,7 @@ VMS_typedef_parse (str)
                                    || spnt1->VMS_type == DBG_S_C_USINT
                                    || spnt1->VMS_type == DBG_S_C_UCHAR
                                    || spnt1->VMS_type == DBG_S_C_UQUAD
-                                   || spnt1->advanced == ENUM); /* (approximate) */
+                                   || spnt1->advanced == ENUM);
                  Apoint = 0;
                  fpush (19 + len, 1);
                  fpush (unsigned_type ? DBG_S_C_UBITU : DBG_S_C_SBITU, 1);
@@ -2668,12 +2465,12 @@ VMS_typedef_parse (str)
                  bitfield_suffix (spnt1, i3);
             }
            }
-         else
-           {                   /* not a bitfield */
-             /* check if this is a forward reference */
+         else /* Not a bitfield.  */
+           {
+             /* Check if this is a forward reference.  */
              if (final_pass && final_forward_reference (spnt1))
                {
-                 as_tsktsk ("debugger output: structure element `%s' has undefined type",
+                 as_tsktsk (_("debugger output: structure element `%s' has undefined type"),
                           pnt2);
                  continue;
                }
@@ -2784,7 +2581,7 @@ VMS_typedef_parse (str)
     default:
       spnt->advanced = UNKNOWN;
       spnt->VMS_type = 0;
-      as_tsktsk ("debugger output: %d is an unknown type of variable.",
+      as_tsktsk (_("debugger output: %d is an unknown type of variable."),
                 spnt->dbx_type);
       return 1;                        /* unable to decipher */
     }
@@ -2797,7 +2594,6 @@ VMS_typedef_parse (str)
   return 0;
 }
 
-
 /* This is the root routine that parses the stabs entries for definitions.
    it calls VMS_typedef_parse, which can in turn call itself.  We need to
    be careful, since sometimes there are forward references to other symbol
@@ -2808,7 +2604,7 @@ VMS_typedef_parse (str)
    VMS_typedef_parse.  */
 
 static void
-VMS_LSYM_Parse ()
+VMS_LSYM_Parse (void)
 {
   char *pnt;
   char *pnt1;
@@ -2829,14 +2625,10 @@ VMS_LSYM_Parse ()
       incomplete = 0;
       for (sp = symbol_rootP; sp; sp = symbol_next (sp))
        {
-         /*
-          *    Deal with STAB symbols
-          */
+         /* Deal with STAB symbols.  */
          if (S_IS_DEBUG (sp))
            {
-             /*
-              *        Dispatch on STAB type
-              */
+             /* Dispatch on STAB type.  */
              switch (S_GET_RAW_TYPE (sp))
                {
                case N_GSYM:
@@ -2845,7 +2637,7 @@ VMS_LSYM_Parse ()
                case N_PSYM:
                case N_RSYM:
                case N_LSYM:
-               case N_FUN:     /*sometimes these contain typedefs*/
+               case N_FUN:     /* Sometimes these contain typedefs. */
                  str = S_GET_NAME (sp);
                  symbol_name = str;
                  pnt = str + strlen (str) - 1;
@@ -2855,31 +2647,39 @@ VMS_LSYM_Parse ()
                      int tlen = 0;
 
                      spnext = sp;
-                     do {
-                       tlen += strlen (str) - 1;
-                       spnext = symbol_next (spnext);
-                       str = S_GET_NAME (spnext);
-                       pnt = str + strlen (str) - 1;
-                     } while (*pnt == '?');
+                     do
+                       {
+                         tlen += strlen (str) - 1;
+                         spnext = symbol_next (spnext);
+                         str = S_GET_NAME (spnext);
+                         pnt = str + strlen (str) - 1;
+                       }
+                     while (*pnt == '?');
+
                      tlen += strlen (str);
-                     parse_buffer = (char *) xmalloc (tlen + 1);
+                     parse_buffer = xmalloc (tlen + 1);
                      strcpy (parse_buffer, S_GET_NAME (sp));
                      pnt2 = parse_buffer + strlen (parse_buffer) - 1;
                      *pnt2 = '\0';
                      spnext = sp;
-                     do {
-                       spnext = symbol_next (spnext);
-                       str = S_GET_NAME (spnext);
-                       strcat (pnt2, str);
-                       pnt2 +=  strlen (str) - 1;
-                       *str = '\0';  /* Erase this string  */
-                    /* S_SET_NAME (spnext, str); */
-                       if (*pnt2 != '?') break;
-                       *pnt2 = '\0';
-                     } while (1);
+
+                     do
+                       {
+                         spnext = symbol_next (spnext);
+                         str = S_GET_NAME (spnext);
+                         strcat (pnt2, str);
+                         pnt2 +=  strlen (str) - 1;
+                         *str = '\0';  /* Erase this string  */
+                         /* S_SET_NAME (spnext, str); */
+                         if (*pnt2 != '?') break;
+                         *pnt2 = '\0';
+                       }
+                     while (1);
+
                      str = parse_buffer;
                      symbol_name = str;
                    }
+
                  if ((pnt = (char *) strchr (str, ':')) != 0)
                    {
                      *pnt = '\0';
@@ -2894,33 +2694,32 @@ VMS_LSYM_Parse ()
                              shorter than the original line.  */
                          pnt2 = S_GET_NAME (sp);
                          strcpy (pnt2, parse_buffer);
-                      /* S_SET_NAME (sp, pnt2); */
+                         /* S_SET_NAME (sp, pnt2); */
                          free (parse_buffer),  parse_buffer = 0;
                        }
-                     *pnt = ':';       /* put back colon to restore dbx_type */
+                     /* Put back colon to restore dbx_type.  */
+                     *pnt = ':';
                    }
                  break;
-               }               /*switch*/
-           }                   /* if */
-       }                       /*for*/
+               }
+           }
+       }
       pass++;
-      /*
-       * Make one last pass, if needed, and define whatever we can
-       * that is left.
-       */
+
+      /* Make one last pass, if needed, and define whatever we can
+         that is left.  */
       if (final_pass == 0 && incomplete == incom1)
        {
          final_pass = 1;
-         incom1++;     /* Force one last pass through */
+         incom1++;     /* Force one last pass through */
        }
-  } while (incomplete != 0 && incomplete != incom1);
-  /* repeat until all refs resolved if possible */
-/*     if (pass > 1) printf (" Required %d passes\n", pass); */
-  if (incomplete != 0)
-    {
-      as_tsktsk ("debugger output: Unable to resolve %d circular references.",
-                incomplete);
     }
+  while (incomplete != 0 && incomplete != incom1);
+
+  if (incomplete != 0)
+    as_tsktsk (_("debugger output: Unable to resolve %d circular references."),
+              incomplete);
+
   fpnt = f_ref_root;
   symbol_name = "\0";
   while (fpnt)
@@ -2929,7 +2728,7 @@ VMS_LSYM_Parse ()
        {
          if (find_symbol (fpnt->dbx_type))
            {
-             as_tsktsk ("debugger forward reference error, dbx type %d",
+             as_tsktsk (_("debugger forward reference error, dbx type %d"),
                         fpnt->dbx_type);
              break;
            }
@@ -2942,14 +2741,11 @@ VMS_LSYM_Parse ()
     }
 }
 
-
 static void
-Define_Local_Symbols (s0P, s2P, Current_Routine, Text_Psect)
-     symbolS *s0P, *s2P;
-     symbolS *Current_Routine;
-     int Text_Psect;
+Define_Local_Symbols (symbolS *s0P, symbolS *s2P, symbolS *Current_Routine,
+                     int Text_Psect)
 {
-  symbolS *s1P;                /* each symbol from s0P .. s2P (exclusive) */
+  symbolS *s1P;                /* Each symbol from s0P .. s2P (exclusive).  */
 
   for (s1P = symbol_next (s0P); s1P != s2P; s1P = symbol_next (s1P))
     {
@@ -2962,13 +2758,12 @@ Define_Local_Symbols (s0P, s2P, Current_Routine, Text_Psect)
        }
       if (!S_IS_DEBUG (s1P))
        continue;
-      /*
-       *       Dispatch on STAB type
-       */
+      /* Dispatch on STAB type.  */
       switch (S_GET_RAW_TYPE (s1P))
        {
        default:
-         continue;             /* not left or right brace */
+         /* Not left or right brace.  */
+         continue;
 
        case N_LSYM:
        case N_PSYM:
@@ -2978,22 +2773,18 @@ Define_Local_Symbols (s0P, s2P, Current_Routine, Text_Psect)
        case N_RSYM:
          VMS_RSYM_Parse (s1P, Current_Routine, Text_Psect);
          break;
-       }                       /*switch*/
-    }                          /* for */
+       }
+    }
 }
 
-
 /* This function crawls the symbol chain searching for local symbols that
    need to be described to the debugger.  When we enter a new scope with
    a "{", it creates a new "block", which helps the debugger keep track
    of which scope we are currently in.  */
 
 static symbolS *
-Define_Routine (s0P, Level, Current_Routine, Text_Psect)
-     symbolS *s0P;
-     int Level;
-     symbolS *Current_Routine;
-     int Text_Psect;
+Define_Routine (symbolS *s0P, int Level, symbolS *Current_Routine,
+               int Text_Psect)
 {
   symbolS *s1P;
   valueT Offset;
@@ -3008,13 +2799,11 @@ Define_Routine (s0P, Level, Current_Routine, Text_Psect)
        }
       if (!S_IS_DEBUG (s1P))
        continue;
-      /*
-       *       Dispatch on STAB type
-       */
+      /* Dispatch on STAB type.  */
       switch (S_GET_RAW_TYPE (s1P))
        {
        default:
-         continue;             /* not left or right brace */
+         continue;
 
        case N_LBRAC:
          if (Level != 0)
@@ -3023,7 +2812,8 @@ Define_Routine (s0P, Level, Current_Routine, Text_Psect)
              sprintf (str, "$%d", rcount++);
              VMS_TBT_Block_Begin (s1P, Text_Psect, str);
            }
-         Offset = S_GET_VALUE (s1P);   /* side-effect: fully resolve symbol */
+         /* Side-effect: fully resolve symbol.  */
+         Offset = S_GET_VALUE (s1P);
          Define_Local_Symbols (s0P, s1P, Current_Routine, Text_Psect);
          s1P = Define_Routine (s1P, Level + 1, Current_Routine, Text_Psect);
          if (Level != 0)
@@ -3033,8 +2823,8 @@ Define_Routine (s0P, Level, Current_Routine, Text_Psect)
 
        case N_RBRAC:
          return s1P;
-       }                       /*switch*/
-    }                          /* for */
+       }
+    }
 
   /* We end up here if there were no brackets in this function.
      Define everything.  */
@@ -3046,12 +2836,11 @@ Define_Routine (s0P, Level, Current_Routine, Text_Psect)
 #ifndef VMS
 #include <sys/types.h>
 #include <time.h>
-static void get_VMS_time_on_unix PARAMS ((char *));
+static void get_VMS_time_on_unix (char *);
 
 /* Manufacture a VMS-like time string on a Unix based system.  */
 static void
-get_VMS_time_on_unix (Now)
-     char *Now;
+get_VMS_time_on_unix (char *Now)
 {
   char *pnt;
   time_t timeb;
@@ -3067,15 +2856,14 @@ get_VMS_time_on_unix (Now)
 }
 #endif /* not VMS */
 
-
 /* Write the MHD (Module Header) records.  */
 
 static void
-Write_VMS_MHD_Records ()
+Write_VMS_MHD_Records (void)
 {
-  register const char *cp;
-  register char *cp1;
-  register int i;
+  const char *cp;
+  char *cp1;
+  int i;
 #ifdef VMS
   struct { unsigned short len, mbz; char *ptr; } Descriptor;
 #endif
@@ -3083,11 +2871,7 @@ Write_VMS_MHD_Records ()
 
   /* We are writing a module header record.  */
   Set_VMS_Object_File_Record (OBJ_S_C_HDR);
-  /*
-   *   ***************************
-   *   *MAIN MODULE HEADER RECORD*
-   *   ***************************
-   */
+  /* MAIN MODULE HEADER RECORD.  */
   /* Store record type and header type.  */
   PUT_CHAR (OBJ_S_C_HDR);
   PUT_CHAR (MHD_S_C_MHD);
@@ -3096,10 +2880,8 @@ Write_VMS_MHD_Records ()
   /* Maximum record size is size of the object record buffer.  */
   PUT_SHORT (sizeof (Object_Record_Buffer));
 
-       /*
-        *      FIXME:  module name and version should be user
-        *              specifiable via `.ident' and/or `#pragma ident'.
-        */
+  /* FIXME:  module name and version should be user
+            specifiable via `.ident' and/or `#pragma ident'.  */
 
   /* Get module name (the FILENAME part of the object file).  */
   cp = out_file_name;
@@ -3112,7 +2894,7 @@ Write_VMS_MHD_Records ()
          cp++;
          continue;
        }
-      *cp1++ = islower (*cp) ? toupper (*cp++) : *cp++;
+      *cp1++ = TOUPPER (*cp++);
     }
   *cp1 = '\0';
 
@@ -3123,7 +2905,7 @@ Write_VMS_MHD_Records ()
   if (strlen (Module_Name) > 31)
     {
       if (flag_hash_long_names)
-       as_tsktsk ("Module name truncated: %s\n", Module_Name);
+       as_tsktsk (_("Module name truncated: %s\n"), Module_Name);
       Module_Name[31] = '\0';
     }
   PUT_COUNTED_STRING (Module_Name);
@@ -3146,27 +2928,23 @@ Write_VMS_MHD_Records ()
   /* Force this to be a separate output record.  */
   Flush_VMS_Object_Record_Buffer ();
 
-  /*
-   *   *************************
-   *   *LANGUAGE PROCESSOR NAME*
-   *   *************************
-   */
+  /* LANGUAGE PROCESSOR NAME.  */
+
   /* Store record type and header type.  */
   PUT_CHAR (OBJ_S_C_HDR);
   PUT_CHAR (MHD_S_C_LNM);
-  /*
-   * Store language processor name and version (not a counted string!).
-   *
-   * This is normally supplied by the gcc driver for the command line
-   * which invokes gas.  If absent, we fall back to gas's version.
-   */
+
+  /* Store language processor name and version (not a counted string!).
+     This is normally supplied by the gcc driver for the command line
+     which invokes gas.  If absent, we fall back to gas's version.  */
+  
   cp = compiler_version_string;
   if (cp == 0)
     {
       cp = "GNU AS  V";
       while (*cp)
        PUT_CHAR (*cp++);
-      cp = GAS_VERSION;
+      cp = VERSION;
     }
   while (*cp >= ' ')
     PUT_CHAR (*cp++);
@@ -3174,26 +2952,20 @@ Write_VMS_MHD_Records ()
   Flush_VMS_Object_Record_Buffer ();
 }
 
-
 /* Write the EOM (End Of Module) record.  */
 
 static void
-Write_VMS_EOM_Record (Psect, Offset)
-     int Psect;
-     valueT Offset;
+Write_VMS_EOM_Record (int Psect, valueT Offset)
 {
-  /*
-   *   We are writing an end-of-module record
-   *   (this assumes that the entry point will always be in a psect
-   *    represented by a single byte, which is the case for code in
-   *    Text_Psect==0)
-   */
+  /* We are writing an end-of-module record
+     (this assumes that the entry point will always be in a psect
+     represented by a single byte, which is the case for code in
+     Text_Psect==0).  */
+  
   Set_VMS_Object_File_Record (OBJ_S_C_EOM);
   PUT_CHAR (OBJ_S_C_EOM);      /* Record type.  */
-  PUT_CHAR (0);                        /* Error severity level (we ignore it). */
-  /*
-   *   Store the entry point, if it exists
-   */
+  PUT_CHAR (0);                        /* Error severity level (we ignore it).  */
+  /* Store the entry point, if it exists.  */
   if (Psect >= 0)
     {
       PUT_CHAR (Psect);
@@ -3204,16 +2976,16 @@ Write_VMS_EOM_Record (Psect, Offset)
 }
 \f
 
-/* this hash routine borrowed from GNU-EMACS, and strengthened slightly  ERY*/
+/* This hash routine borrowed from GNU-EMACS, and strengthened slightly
+   ERY.  */
 
 static int
-hash_string (ptr)
-     const char *ptr;
+hash_string (const char *ptr)
 {
-  register const unsigned char *p = (unsigned char *) ptr;
-  register const unsigned char *end = p + strlen (ptr);
-  register unsigned char c;
-  register int hash = 0;
+  const unsigned char *p = (unsigned char *) ptr;
+  const unsigned char *end = p + strlen (ptr);
+  unsigned char c;
+  int hash = 0;
 
   while (p != end)
     {
@@ -3223,50 +2995,41 @@ hash_string (ptr)
   return hash;
 }
 
-/*
- *     Generate a Case-Hacked VMS symbol name (limited to 31 chars)
- */
+/* Generate a Case-Hacked VMS symbol name (limited to 31 chars).  */
+
 static void
-VMS_Case_Hack_Symbol (In, Out)
-     register const char *In;
-     register char *Out;
+VMS_Case_Hack_Symbol (const char *In, char *Out)
 {
   long int init;
   long int result;
   char *pnt = 0;
   char *new_name;
   const char *old_name;
-  register int i;
-  int destructor = 0;          /*hack to allow for case sens in a destructor*/
+  int i;
+  int destructor = 0;          /* Hack to allow for case sens in a destructor.  */
   int truncate = 0;
   int Case_Hack_Bits = 0;
   int Saw_Dollar = 0;
   static char Hex_Table[16] =
   {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
-  /*
-   *   Kill any leading "_"
-   */
+  /* Kill any leading "_".  */
   if ((In[0] == '_') && ((In[1] > '9') || (In[1] < '0')))
     In++;
 
-  new_name = Out;              /* save this for later*/
+  new_name = Out;              /* Save this for later.  */
 
-#if barfoo                     /* Dead code */
+#if 0
   if ((In[0] == '_') && (In[1] == '$') && (In[2] == '_'))
     destructor = 1;
 #endif
 
-  /* We may need to truncate the symbol, save the hash for later*/
+  /* We may need to truncate the symbol, save the hash for later.  */
   result = (strlen (In) > 23) ? hash_string (In) : 0;
-  /*
-   *   Is there a Psect Attribute to skip??
-   */
+  /* Is there a Psect Attribute to skip?  */
   if (HAS_PSECT_ATTRIBUTES (In))
     {
-      /*
-       *       Yes: Skip it
-       */
+      /* Yes: Skip it.  */
       In += PSECT_ATTRIBUTES_STRING_LENGTH;
       while (*In)
        {
@@ -3280,12 +3043,13 @@ VMS_Case_Hack_Symbol (In, Out)
     }
 
   old_name = In;
-/*     if (strlen (In) > 31 && flag_hash_long_names)
-         as_tsktsk ("Symbol name truncated: %s\n", In); */
-  /*
-   *   Do the case conversion
-   */
-  i = 23;                      /* Maximum of 23 chars */
+#if 0
+  if (strlen (In) > 31 && flag_hash_long_names)
+    as_tsktsk ("Symbol name truncated: %s\n", In);
+#endif
+  /* Do the case conversion.  */
+  /* Maximum of 23 chars */
+  i = 23;
   while (*In && (--i >= 0))
     {
       Case_Hack_Bits <<= 1;
@@ -3293,54 +3057,50 @@ VMS_Case_Hack_Symbol (In, Out)
        Saw_Dollar = 1;
       if ((destructor == 1) && (i == 21))
        Saw_Dollar = 0;
+
       switch (vms_name_mapping)
        {
        case 0:
-         if (isupper (*In)) {
-           *Out++ = *In++;
-           Case_Hack_Bits |= 1;
-         } else {
-           *Out++ = islower (*In) ? toupper (*In++) : *In++;
-         }
+         if (ISUPPER (*In))
+           {
+             *Out++ = *In++;
+             Case_Hack_Bits |= 1;
+           }
+         else
+           *Out++ = TOUPPER (*In++);
          break;
-       case 3: *Out++ = *In++;
+
+       case 3:
+         *Out++ = *In++;
          break;
+
        case 2:
-         if (islower (*In)) {
+         if (ISLOWER (*In))
            *Out++ = *In++;
-         } else {
-           *Out++ = isupper (*In) ? tolower (*In++) : *In++;
-         }
+         else
+           *Out++ = TOLOWER (*In++);
          break;
        }
     }
-  /*
-   *   If we saw a dollar sign, we don't do case hacking
-   */
+  /* If we saw a dollar sign, we don't do case hacking.  */
   if (flag_no_hash_mixed_case || Saw_Dollar)
     Case_Hack_Bits = 0;
 
-  /*
-   *   If we have more than 23 characters and everything is lowercase
-   *   we can insert the full 31 characters
-   */
+  /* If we have more than 23 characters and everything is lowercase
+     we can insert the full 31 characters.  */
   if (*In)
     {
-      /*
-       *       We  have more than 23 characters
-       * If we must add the case hack, then we have truncated the str
-       */
+      /* We have more than 23 characters
+         If we must add the case hack, then we have truncated the str.  */
       pnt = Out;
       truncate = 1;
       if (Case_Hack_Bits == 0)
        {
-         /*
-          *    And so far they are all lower case:
-          *            Check up to 8 more characters
-          *            and ensure that they are lowercase
-          */
+         /* And so far they are all lower case:
+            Check up to 8 more characters
+            and ensure that they are lowercase.  */
          for (i = 0; (In[i] != 0) && (i < 8); i++)
-           if (isupper (In[i]) && !Saw_Dollar && !flag_no_hash_mixed_case)
+           if (ISUPPER (In[i]) && !Saw_Dollar && !flag_no_hash_mixed_case)
              break;
 
          if (In[i] == 0)
@@ -3348,29 +3108,25 @@ VMS_Case_Hack_Symbol (In, Out)
 
          if ((i == 8) || (In[i] == 0))
            {
-             /*
-              *        They are:  Copy up to 31 characters
-              *                        to the output string
-              */
+             /* They are:  Copy up to 31 characters
+                to the output string.  */
              i = 8;
              while ((--i >= 0) && (*In))
                switch (vms_name_mapping){
-               case 0: *Out++ = islower (*In) ? toupper (*In++) : *In++;
+               case 0: *Out++ = TOUPPER (*In++);
                  break;
                case 3: *Out++ = *In++;
                  break;
-               case 2: *Out++ = isupper (*In) ? tolower (*In++) : *In++;
+               case 2: *Out++ = TOLOWER (*In++);
                  break;
                }
            }
        }
     }
-  /*
-   *   If there were any uppercase characters in the name we
-   *   take on the case hacking string
-   */
+  /* If there were any uppercase characters in the name we
+     take on the case hacking string.  */
 
-  /* Old behavior for regular GNU-C compiler */
+  /* Old behavior for regular GNU-C compiler */
   if (!flag_hash_long_names)
     truncate = 0;
   if ((Case_Hack_Bits != 0) || (truncate == 1))
@@ -3387,7 +3143,7 @@ VMS_Case_Hack_Symbol (In, Out)
        }
       else
        {
-         Out = pnt;            /*Cut back to 23 characters maximum */
+         Out = pnt;            /* Cut back to 23 characters maximum.  */
          *Out++ = '_';
          for (i = 0; i < 7; i++)
            {
@@ -3396,30 +3152,24 @@ VMS_Case_Hack_Symbol (In, Out)
              result = result >> 5;
            }
        }
-    }                          /*Case Hack */
-  /*
-   *   Done
-   */
+    }
+  /* Done.  */
   *Out = 0;
   if (truncate == 1 && flag_hash_long_names && flag_show_after_trunc)
-    as_tsktsk ("Symbol %s replaced by %s\n", old_name, new_name);
+    as_tsktsk (_("Symbol %s replaced by %s\n"), old_name, new_name);
 }
 \f
 
-/*
- *     Scan a symbol name for a psect attribute specification
- */
+/* Scan a symbol name for a psect attribute specification.  */
+
 #define GLOBALSYMBOL_BIT       0x10000
 #define GLOBALVALUE_BIT                0x20000
 
-
 static void
-VMS_Modify_Psect_Attributes (Name, Attribute_Pointer)
-     const char *Name;
-     int *Attribute_Pointer;
+VMS_Modify_Psect_Attributes (const char *Name, int *Attribute_Pointer)
 {
-  register int i;
-  register const char *cp;
+  int i;
+  const char *cp;
   int Negate;
   static const struct
   {
@@ -3442,74 +3192,48 @@ VMS_Modify_Psect_Attributes (Name, Attribute_Pointer)
     {0, 0}
   };
 
-  /*
-   *   Kill leading "_"
-   */
+  /* Kill leading "_".  */
   if (*Name == '_')
     Name++;
-  /*
-   *   Check for a PSECT attribute list
-   */
+  /* Check for a PSECT attribute list.  */
   if (!HAS_PSECT_ATTRIBUTES (Name))
-    return;                    /* If not, return */
-  /*
-   *   Skip the attribute list indicator
-   */
+    return;
+  /* Skip the attribute list indicator.  */
   Name += PSECT_ATTRIBUTES_STRING_LENGTH;
-  /*
-   *   Process the attributes ("_" separated, "$" terminated)
-   */
+  /* Process the attributes ("_" separated, "$" terminated).  */
   while (*Name != '$')
     {
-      /*
-       *       Assume not negating
-       */
+      /* Assume not negating.  */
       Negate = 0;
-      /*
-       *       Check for "NO"
-       */
+      /* Check for "NO".  */
       if ((Name[0] == 'N') && (Name[1] == 'O'))
        {
-         /*
-          *    We are negating (and skip the NO)
-          */
+         /* We are negating (and skip the NO).  */
          Negate = 1;
          Name += 2;
        }
-      /*
-       *       Find the token delimiter
-       */
+      /* Find the token delimiter.  */
       cp = Name;
       while (*cp && (*cp != '_') && (*cp != '$'))
        cp++;
-      /*
-       *       Look for the token in the attribute list
-       */
+      /* Look for the token in the attribute list.  */
       for (i = 0; Attributes[i].Name; i++)
        {
-         /*
-          *    If the strings match, set/clear the attr.
-          */
+         /* If the strings match, set/clear the attr.  */
          if (strncmp (Name, Attributes[i].Name, cp - Name) == 0)
            {
-             /*
-              *        Set or clear
-              */
+             /* Set or clear.  */
              if (Negate)
                *Attribute_Pointer &=
                  ~Attributes[i].Value;
              else
                *Attribute_Pointer |=
                  Attributes[i].Value;
-             /*
-              *        Done
-              */
+             /* Done.  */
              break;
            }
        }
-      /*
-       *       Now skip the attribute
-       */
+      /* Now skip the attribute.  */
       Name = cp;
       if (*Name == '_')
        Name++;
@@ -3520,92 +3244,78 @@ VMS_Modify_Psect_Attributes (Name, Attribute_Pointer)
 #define GBLSYM_REF 0
 #define GBLSYM_DEF 1
 #define GBLSYM_VAL 2
-#define GBLSYM_LCL 4   /* not GBL after all... */
+#define GBLSYM_LCL 4   /* not GBL after all...  */
+#define GBLSYM_WEAK 8
+
+/* Define a global symbol (or possibly a local one).  */
 
-/*
- *     Define a global symbol (or possibly a local one).
- */
 static void
-VMS_Global_Symbol_Spec (Name, Psect_Number, Psect_Offset, Flags)
-     const char *Name;
-     int Psect_Number;
-     int Psect_Offset;
-     int Flags;
+VMS_Global_Symbol_Spec (const char *Name, int Psect_Number, int Psect_Offset, int Flags)
 {
   char Local[32];
 
-  /*
-   *   We are writing a GSD record
-   */
+  /* We are writing a GSD record.  */
   Set_VMS_Object_File_Record (OBJ_S_C_GSD);
-  /*
-   *   If the buffer is empty we must insert the GSD record type
-   */
+
+  /* If the buffer is empty we must insert the GSD record type.  */
   if (Object_Record_Offset == 0)
     PUT_CHAR (OBJ_S_C_GSD);
-  /*
-   *   We are writing a Global (or local) symbol definition subrecord.
-   */
+
+  /* We are writing a Global (or local) symbol definition subrecord.  */
   PUT_CHAR ((Flags & GBLSYM_LCL) != 0 ? GSD_S_C_LSY :
            ((unsigned) Psect_Number <= 255) ? GSD_S_C_SYM : GSD_S_C_SYMW);
-  /*
-   *   Data type is undefined
-   */
+
+  /* Data type is undefined.  */
   PUT_CHAR (0);
-  /*
-   *   Switch on Definition/Reference
-   */
+
+  /* Switch on Definition/Reference.  */
   if ((Flags & GBLSYM_DEF) == 0)
     {
-      /*
-       *       Reference
-       */
+      /* Reference.  */
       PUT_SHORT (((Flags & GBLSYM_VAL) == 0) ? GSY_S_M_REL : 0);
       if ((Flags & GBLSYM_LCL) != 0)   /* local symbols have extra field */
        PUT_SHORT (Current_Environment);
     }
   else
     {
-      /*
-       *       Definition
-       *[ assert (LSY_S_M_DEF == GSY_S_M_DEF && LSY_S_M_REL == GSY_S_M_REL); ]
-       */
-      PUT_SHORT (((Flags & GBLSYM_VAL) == 0) ?
-                 GSY_S_M_DEF | GSY_S_M_REL : GSY_S_M_DEF);
+      int sym_flags;
+
+      /* Definition
+         [ assert (LSY_S_M_DEF == GSY_S_M_DEF && LSY_S_M_REL == GSY_S_M_REL); ].  */
+      sym_flags = GSY_S_M_DEF;
+      if (Flags & GBLSYM_WEAK)
+       sym_flags |= GSY_S_M_WEAK;
+      if ((Flags & GBLSYM_VAL) == 0)
+       sym_flags |= GSY_S_M_REL;
+      PUT_SHORT (sym_flags);
       if ((Flags & GBLSYM_LCL) != 0)   /* local symbols have extra field */
        PUT_SHORT (Current_Environment);
-      /*
-       *       Psect Number
-       */
+
+      /* Psect Number.  */
       if ((Flags & GBLSYM_LCL) == 0 && (unsigned) Psect_Number <= 255)
        PUT_CHAR (Psect_Number);
       else
        PUT_SHORT (Psect_Number);
-      /*
-       *       Offset
-       */
+
+      /* Offset.  */
       PUT_LONG (Psect_Offset);
     }
-  /*
-   *   Finally, the global symbol name
-   */
+
+  /* Finally, the global symbol name.  */
   VMS_Case_Hack_Symbol (Name, Local);
   PUT_COUNTED_STRING (Local);
-  /*
-   *   Flush the buffer if it is more than 75% full
-   */
+
+  /* Flush the buffer if it is more than 75% full.  */
   if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4))
     Flush_VMS_Object_Record_Buffer ();
 }
 
-/*
- *     Define an environment to support local symbol references.
- *     This is just to mollify the linker; we don't actually do
- *     anything useful with it.
- */
+/* Define an environment to support local symbol references.
+   This is just to mollify the linker; we don't actually do
+   anything useful with it.  */
+
 static void
-VMS_Local_Environment_Setup (Env_Name)
-    const char *Env_Name;
+VMS_Local_Environment_Setup (const char *Env_Name)
 {
   /* We are writing a GSD record.  */
   Set_VMS_Object_File_Record (OBJ_S_C_GSD);
@@ -3632,65 +3342,60 @@ VMS_Local_Environment_Setup (Env_Name)
 }
 \f
 
-/*
- *     Define a psect
- */
+/* Define a psect.  */
+
 static int
-VMS_Psect_Spec (Name, Size, Type, vsp)
-     const char *Name;
-     int Size;
-     enum ps_type Type;
-     struct VMS_Symbol *vsp;
+VMS_Psect_Spec (const char *Name, int Size, enum ps_type Type, struct VMS_Symbol *vsp)
 {
   char Local[32];
   int Psect_Attributes;
 
-  /*
-   *   Generate the appropriate PSECT flags given the PSECT type
-   */
+  /* Generate the appropriate PSECT flags given the PSECT type.  */
   switch (Type)
     {
     case ps_TEXT:
-      /* Text psects are PIC,noOVR,REL,noGBL,SHR,EXE,RD,noWRT. */
+      /* Text psects are PIC,noOVR,REL,noGBL,SHR,EXE,RD,noWRT.  */
       Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_SHR|GPS_S_M_EXE
                          |GPS_S_M_RD);
       break;
     case ps_DATA:
-      /* Data psects are PIC,noOVR,REL,noGBL,noSHR,noEXE,RD,WRT. */
+      /* Data psects are PIC,noOVR,REL,noGBL,noSHR,noEXE,RD,WRT.  */
       Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_RD|GPS_S_M_WRT);
       break;
     case ps_COMMON:
-      /* Common block psects are:  PIC,OVR,REL,GBL,SHR,noEXE,RD,WRT. */
+      /* Common block psects are:  PIC,OVR,REL,GBL,noSHR,noEXE,RD,WRT.  */
       Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_OVR|GPS_S_M_REL|GPS_S_M_GBL
-                         |GPS_S_M_SHR|GPS_S_M_RD|GPS_S_M_WRT);
+                         |GPS_S_M_RD|GPS_S_M_WRT);
       break;
     case ps_CONST:
-      /* Const data psects are:  PIC,OVR,REL,GBL,SHR,noEXE,RD,noWRT. */
+      /* Const data psects are:  PIC,OVR,REL,GBL,noSHR,noEXE,RD,noWRT.  */
       Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_OVR|GPS_S_M_REL|GPS_S_M_GBL
-                         |GPS_S_M_SHR|GPS_S_M_RD);
+                         |GPS_S_M_RD);
+      break;
+    case ps_CTORS:
+      /* Ctor psects are PIC,noOVR,REL,GBL,noSHR,noEXE,RD,noWRT.  */
+      Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_GBL|GPS_S_M_RD);
+      break;
+    case ps_DTORS:
+      /* Dtor psects are PIC,noOVR,REL,GBL,noSHR,noEXE,RD,noWRT.  */
+      Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_GBL|GPS_S_M_RD);
       break;
     default:
       /* impossible */
-      error ("Unknown VMS psect type (%ld)", (long) Type);
+      error (_("Unknown VMS psect type (%ld)"), (long) Type);
       break;
     }
-  /*
-   *   Modify the psect attributes according to any attribute string
-   */
+  /* Modify the psect attributes according to any attribute string.  */
   if (vsp && S_GET_TYPE (vsp->Symbol) == N_ABS)
     Psect_Attributes |= GLOBALVALUE_BIT;
   else if (HAS_PSECT_ATTRIBUTES (Name))
     VMS_Modify_Psect_Attributes (Name, &Psect_Attributes);
-  /*
-   *   Check for globalref/def/val.
-   */
+  /* Check for globalref/def/val.  */
   if ((Psect_Attributes & GLOBALVALUE_BIT) != 0)
     {
-      /*
-       * globalvalue symbols were generated before. This code
-       * prevents unsightly psect buildup, and makes sure that
-       * fixup references are emitted correctly.
-       */
+      /* globalvalue symbols were generated before. This code
+         prevents unsightly psect buildup, and makes sure that
+         fixup references are emitted correctly.  */
       vsp->Psect_Index = -1;   /* to catch errors */
       S_SET_TYPE (vsp->Symbol, N_UNDF);                /* make refs work */
       return 1;                        /* decrement psect counter */
@@ -3705,53 +3410,41 @@ VMS_Psect_Spec (Name, Size, Type, vsp)
                                  vsp->Psect_Offset, GBLSYM_REF);
          vsp->Psect_Index = -1;
          S_SET_TYPE (vsp->Symbol, N_UNDF);
-         return 1;             /* return and indicate no psect */
+         /* Return and indicate no psect.  */
+         return 1;
+         
        case N_DATA | N_EXT:
          VMS_Global_Symbol_Spec (Name, vsp->Psect_Index,
                                  vsp->Psect_Offset, GBLSYM_DEF);
-         /* In this case we still generate the psect */
+         /* In this case we still generate the psect. */
          break;
+         
        default:
-         as_fatal ("Globalsymbol attribute for symbol %s was unexpected.",
+         as_fatal (_("Globalsymbol attribute for symbol %s was unexpected."),
                    Name);
          break;
-       }                       /* switch */
+       }
     }
 
-  Psect_Attributes &= 0xffff;  /* clear out the globalref/def stuff */
-  /*
-   *   We are writing a GSD record
-   */
+  /* Clear out the globalref/def stuff.  */
+  Psect_Attributes &= 0xffff;
+  /* We are writing a GSD record.  */
   Set_VMS_Object_File_Record (OBJ_S_C_GSD);
-  /*
-   *   If the buffer is empty we must insert the GSD record type
-   */
+  /* If the buffer is empty we must insert the GSD record type.  */
   if (Object_Record_Offset == 0)
     PUT_CHAR (OBJ_S_C_GSD);
-  /*
-   *   We are writing a PSECT definition subrecord
-   */
+  /* We are writing a PSECT definition subrecord.  */
   PUT_CHAR (GSD_S_C_PSC);
-  /*
-   *   Psects are always LONGWORD aligned
-   */
+  /* Psects are always LONGWORD aligned.  */
   PUT_CHAR (2);
-  /*
-   *   Specify the psect attributes
-   */
+  /* Specify the psect attributes.  */
   PUT_SHORT (Psect_Attributes);
-  /*
-   *   Specify the allocation
-   */
+  /* Specify the allocation.  */
   PUT_LONG (Size);
-  /*
-   *   Finally, the psect name
-   */
+  /* Finally, the psect name.  */
   VMS_Case_Hack_Symbol (Name, Local);
   PUT_COUNTED_STRING (Local);
-  /*
-   *   Flush the buffer if it is more than 75% full
-   */
+  /* Flush the buffer if it is more than 75% full.  */
   if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4))
     Flush_VMS_Object_Record_Buffer ();
   return 0;
@@ -3763,9 +3456,7 @@ VMS_Psect_Spec (Name, Size, Type, vsp)
    which will indicate the start of another datum.  */
 
 static offsetT
-VMS_Initialized_Data_Size (s0P, End_Of_Data)
-     register symbolS *s0P;
-     unsigned End_Of_Data;
+VMS_Initialized_Data_Size (symbolS *s0P, unsigned End_Of_Data)
 {
   symbolS *s1P;
   valueT s0P_val = S_GET_VALUE (s0P), s1P_val,
@@ -3785,42 +3476,33 @@ VMS_Initialized_Data_Size (s0P, End_Of_Data)
   return (offsetT) (nearest_val - s0P_val);
 }
 
-
 /* Check symbol names for the Psect hack with a globalvalue, and then
    generate globalvalues for those that have it.  */
 
 static void
-VMS_Emit_Globalvalues (text_siz, data_siz, Data_Segment)
-     unsigned text_siz;
-     unsigned data_siz;
-     char *Data_Segment;
+VMS_Emit_Globalvalues (unsigned text_siz, unsigned data_siz,
+                      char *Data_Segment)
 {
-  register symbolS *sp;
+  symbolS *sp;
   char *stripped_name, *Name;
   int Size;
   int Psect_Attributes;
   int globalvalue;
   int typ, abstyp;
 
-  /*
-   * Scan the symbol table for globalvalues, and emit def/ref when
-   * required.  These will be caught again later and converted to
-   * N_UNDF
-   */
+  /* Scan the symbol table for globalvalues, and emit def/ref when
+     required.  These will be caught again later and converted to
+     N_UNDF.  */
   for (sp = symbol_rootP; sp; sp = sp->sy_next)
     {
       typ = S_GET_RAW_TYPE (sp);
       abstyp = ((typ & ~N_EXT) == N_ABS);
-      /*
-       *       See if this is something we want to look at.
-       */
+      /* See if this is something we want to look at.  */
       if (!abstyp &&
          typ != (N_DATA | N_EXT) &&
          typ != (N_UNDF | N_EXT))
        continue;
-      /*
-       *       See if this has globalvalue specification.
-       */
+      /* See if this has globalvalue specification.  */
       Name = S_GET_NAME (sp);
 
       if (abstyp)
@@ -3830,7 +3512,7 @@ VMS_Emit_Globalvalues (text_siz, data_siz, Data_Segment)
        }
       else if (HAS_PSECT_ATTRIBUTES (Name))
        {
-         stripped_name = (char *) xmalloc (strlen (Name) + 1);
+         stripped_name = xmalloc (strlen (Name) + 1);
          strcpy (stripped_name, Name);
          Psect_Attributes = 0;
          VMS_Modify_Psect_Attributes (stripped_name, &Psect_Attributes);
@@ -3862,8 +3544,8 @@ VMS_Emit_Globalvalues (text_siz, data_siz, Data_Segment)
            case N_DATA | N_EXT:
              Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz);
              if (Size > 4)
-               error ("Invalid data type for globalvalue");
-             globalvalue = md_chars_to_number (Data_Segment + 
+               error (_("Invalid data type for globalvalue"));
+             globalvalue = md_chars_to_number (Data_Segment +
                     S_GET_VALUE (sp) - text_siz , Size);
              /* Three times for good luck.  The linker seems to get confused
                 if there are fewer than three */
@@ -3874,125 +3556,82 @@ VMS_Emit_Globalvalues (text_siz, data_siz, Data_Segment)
                                      GBLSYM_DEF|GBLSYM_VAL);
              break;
            default:
-             as_warn ("Invalid globalvalue of %s", stripped_name);
+             as_warn (_("Invalid globalvalue of %s"), stripped_name);
              break;
-           }                   /* switch */
-       }                       /* if */
-      if (stripped_name) free (stripped_name); /* clean up */
-    }                          /* for */
+           }
+       }
+
+      if (stripped_name)
+       free (stripped_name);
+    }
 
 }
 \f
 
-/*
- *     Define a procedure entry pt/mask
- */
+/* Define a procedure entry pt/mask.  */
+
 static void
-VMS_Procedure_Entry_Pt (Name, Psect_Number, Psect_Offset, Entry_Mask)
-     char *Name;
-     int Psect_Number;
-     int Psect_Offset;
-     int Entry_Mask;
+VMS_Procedure_Entry_Pt (char *Name, int Psect_Number, int Psect_Offset,
+                       int Entry_Mask)
 {
   char Local[32];
 
-  /*
-   *   We are writing a GSD record
-   */
+  /* We are writing a GSD record.  */
   Set_VMS_Object_File_Record (OBJ_S_C_GSD);
-  /*
-   *   If the buffer is empty we must insert the GSD record type
-   */
+  /* If the buffer is empty we must insert the GSD record type.  */
   if (Object_Record_Offset == 0)
     PUT_CHAR (OBJ_S_C_GSD);
-  /*
-   *   We are writing a Procedure Entry Pt/Mask subrecord
-   */
+  /* We are writing a Procedure Entry Pt/Mask subrecord.  */
   PUT_CHAR (((unsigned) Psect_Number <= 255) ? GSD_S_C_EPM : GSD_S_C_EPMW);
-  /*
-   *   Data type is undefined
-   */
+  /* Data type is undefined.  */
   PUT_CHAR (0);
-  /*
-   *   Flags = "RELOCATABLE" and "DEFINED"
-   */
+  /* Flags = "RELOCATABLE" and "DEFINED".  */
   PUT_SHORT (GSY_S_M_DEF | GSY_S_M_REL);
-  /*
-   *   Psect Number
-   */
+  /* Psect Number.  */
   if ((unsigned) Psect_Number <= 255)
     PUT_CHAR (Psect_Number);
   else
     PUT_SHORT (Psect_Number);
-  /*
-   *   Offset
-   */
+  /* Offset.  */
   PUT_LONG (Psect_Offset);
-  /*
-   *   Entry mask
-   */
+  /* Entry mask.  */
   PUT_SHORT (Entry_Mask);
-  /*
-   *   Finally, the global symbol name
-   */
+  /* Finally, the global symbol name.  */
   VMS_Case_Hack_Symbol (Name, Local);
   PUT_COUNTED_STRING (Local);
-  /*
-   *   Flush the buffer if it is more than 75% full
-   */
+  /* Flush the buffer if it is more than 75% full.  */
   if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4))
     Flush_VMS_Object_Record_Buffer ();
 }
 \f
 
-/*
- *     Set the current location counter to a particular Psect and Offset
- */
+/* Set the current location counter to a particular Psect and Offset.  */
+
 static void
-VMS_Set_Psect (Psect_Index, Offset, Record_Type)
-     int Psect_Index;
-     int Offset;
-     int Record_Type;
+VMS_Set_Psect (int Psect_Index, int Offset, int Record_Type)
 {
-  /*
-   *   We are writing a "Record_Type" record
-   */
+  /* We are writing a "Record_Type" record.  */
   Set_VMS_Object_File_Record (Record_Type);
-  /*
-   *   If the buffer is empty we must insert the record type
-   */
+  /* If the buffer is empty we must insert the record type.  */
   if (Object_Record_Offset == 0)
     PUT_CHAR (Record_Type);
-  /*
-   *   Stack the Psect base + Offset
-   */
+  /* Stack the Psect base + Offset.  */
   vms_tir_stack_psect (Psect_Index, Offset, 0);
-  /*
-   *   Set relocation base
-   */
+  /* Set relocation base.  */
   PUT_CHAR (TIR_S_C_CTL_SETRB);
-  /*
-   *   Flush the buffer if it is more than 75% full
-   */
+  /* Flush the buffer if it is more than 75% full.  */
   if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4))
     Flush_VMS_Object_Record_Buffer ();
 }
 \f
 
-/*
- *     Store repeated immediate data in current Psect
- */
+/* Store repeated immediate data in current Psect.  */
+
 static void
-VMS_Store_Repeated_Data (Repeat_Count, Pointer, Size, Record_Type)
-     int Repeat_Count;
-     register char *Pointer;
-     int Size;
-     int Record_Type;
+VMS_Store_Repeated_Data (int Repeat_Count, char *Pointer, int Size,
+                        int Record_Type)
 {
-
-  /*
-   *   Ignore zero bytes/words/longwords
-   */
+  /* Ignore zero bytes/words/longwords.  */
   switch (Size)
     {
     case 4:
@@ -4008,93 +3647,62 @@ VMS_Store_Repeated_Data (Repeat_Count, Pointer, Size, Record_Type)
     default:
       break;
     }
-  /*
-   *   If the data is too big for a TIR_S_C_STO_RIVB sub-record
-   *   then we do it manually
-   */
+  /* If the data is too big for a TIR_S_C_STO_RIVB sub-record
+     then we do it manually.  */
   if (Size > 255)
     {
       while (--Repeat_Count >= 0)
        VMS_Store_Immediate_Data (Pointer, Size, Record_Type);
       return;
     }
-  /*
-   *   We are writing a "Record_Type" record
-   */
+  /* We are writing a "Record_Type" record.  */
   Set_VMS_Object_File_Record (Record_Type);
-  /*
-   *   If the buffer is empty we must insert record type
-   */
+  /* If the buffer is empty we must insert record type.  */
   if (Object_Record_Offset == 0)
     PUT_CHAR (Record_Type);
-  /*
-   *   Stack the repeat count
-   */
+  /* Stack the repeat count.  */
   PUT_CHAR (TIR_S_C_STA_LW);
   PUT_LONG (Repeat_Count);
-  /*
-   *   And now the command and its data
-   */
+  /* And now the command and its data.  */
   PUT_CHAR (TIR_S_C_STO_RIVB);
   PUT_CHAR (Size);
   while (--Size >= 0)
     PUT_CHAR (*Pointer++);
-  /*
-   *   Flush the buffer if it is more than 75% full
-   */
+  /* Flush the buffer if it is more than 75% full.  */
   if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4))
     Flush_VMS_Object_Record_Buffer ();
 }
 \f
 
-/*
- *     Store a Position Independent Reference
- */
+/* Store a Position Independent Reference.  */
+
 static void
-VMS_Store_PIC_Symbol_Reference (Symbol, Offset, PC_Relative,
-                               Psect, Psect_Offset, Record_Type)
-     symbolS *Symbol;
-     int Offset;
-     int PC_Relative;
-     int Psect;
-     int Psect_Offset;
-     int Record_Type;
+VMS_Store_PIC_Symbol_Reference (symbolS *Symbol, int Offset, int PC_Relative,
+                               int Psect, int Psect_Offset, int Record_Type)
 {
-  register struct VMS_Symbol *vsp = Symbol->sy_obj;
+  struct VMS_Symbol *vsp = Symbol->sy_obj;
   char Local[32];
   int local_sym = 0;
 
-  /*
-   *   We are writing a "Record_Type" record
-   */
+  /* We are writing a "Record_Type" record.  */
   Set_VMS_Object_File_Record (Record_Type);
-  /*
-   *   If the buffer is empty we must insert record type
-   */
+  /* If the buffer is empty we must insert record type.  */
   if (Object_Record_Offset == 0)
     PUT_CHAR (Record_Type);
-  /*
-   *   Set to the appropriate offset in the Psect.
-   *   For a Code reference we need to fix the operand
-   *   specifier as well, so back up 1 byte;
-   *   for a Data reference we just store HERE.
-   */
+  /* Set to the appropriate offset in the Psect.
+     For a Code reference we need to fix the operand
+     specifier as well, so back up 1 byte;
+     for a Data reference we just store HERE.  */
   VMS_Set_Psect (Psect,
                 PC_Relative ? Psect_Offset - 1 : Psect_Offset,
                 Record_Type);
-  /*
-   *   Make sure we are still generating a "Record Type" record
-   */
+  /* Make sure we are still generating a "Record Type" record.  */
   if (Object_Record_Offset == 0)
     PUT_CHAR (Record_Type);
-  /*
-   *   Dispatch on symbol type (so we can stack its value)
-   */
+  /* Dispatch on symbol type (so we can stack its value).  */
   switch (S_GET_RAW_TYPE (Symbol))
     {
-      /*
-       *       Global symbol
-       */
+      /* Global symbol.  */
     case N_ABS:
       local_sym = 1;
       /*FALLTHRU*/
@@ -4105,13 +3713,9 @@ VMS_Store_PIC_Symbol_Reference (Symbol, Offset, PC_Relative,
 #endif /* NOT_VAX_11_C_COMPATIBLE */
     case N_UNDF:
     case N_TEXT | N_EXT:
-      /*
-       *       Get the symbol name (case hacked)
-       */
+      /* Get the symbol name (case hacked).  */
       VMS_Case_Hack_Symbol (S_GET_NAME (Symbol), Local);
-      /*
-       *       Stack the global symbol value
-       */
+      /* Stack the global symbol value.  */
       if (!local_sym)
        {
          PUT_CHAR (TIR_S_C_STA_GBL);
@@ -4125,149 +3729,111 @@ VMS_Store_PIC_Symbol_Reference (Symbol, Offset, PC_Relative,
       PUT_COUNTED_STRING (Local);
       if (Offset)
        {
-         /*
-          *    Stack the longword offset
-          */
+         /* Stack the longword offset.  */
          PUT_CHAR (TIR_S_C_STA_LW);
          PUT_LONG (Offset);
-         /*
-          *    Add the two, leaving the result on the stack
-          */
+         /* Add the two, leaving the result on the stack.  */
          PUT_CHAR (TIR_S_C_OPR_ADD);
        }
       break;
-      /*
-       *       Uninitialized local data
-       */
+      /* Uninitialized local data.  */
     case N_BSS:
-      /*
-       *       Stack the Psect (+offset)
-       */
+      /* Stack the Psect (+offset).  */
       vms_tir_stack_psect (vsp->Psect_Index,
                           vsp->Psect_Offset + Offset,
                           0);
       break;
-      /*
-       *       Local text
-       */
+      /* Local text.  */
     case N_TEXT:
-      /*
-       *       Stack the Psect (+offset)
-       */
+      /* Stack the Psect (+offset).  */
       vms_tir_stack_psect (vsp->Psect_Index,
                           S_GET_VALUE (Symbol) + Offset,
                           0);
       break;
-      /*
-       *       Initialized local or global data
-       */
+      /* Initialized local or global data.  */
     case N_DATA:
 #ifndef        NOT_VAX_11_C_COMPATIBLE
     case N_UNDF | N_EXT:
     case N_DATA | N_EXT:
 #endif /* NOT_VAX_11_C_COMPATIBLE */
-      /*
-       *       Stack the Psect (+offset)
-       */
+      /* Stack the Psect (+offset).  */
       vms_tir_stack_psect (vsp->Psect_Index,
                           vsp->Psect_Offset + Offset,
                           0);
       break;
     }
-  /*
-   *   Store either a code or data reference
-   */
+  /* Store either a code or data reference.  */
   PUT_CHAR (PC_Relative ? TIR_S_C_STO_PICR : TIR_S_C_STO_PIDR);
-  /*
-   *   Flush the buffer if it is more than 75% full
-   */
+  /* Flush the buffer if it is more than 75% full.  */
   if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4))
     Flush_VMS_Object_Record_Buffer ();
 }
 \f
 
-/*
- *     Check in the text area for an indirect pc-relative reference
- *     and fix it up with addressing mode 0xff [PC indirect]
- *
- *     THIS SHOULD BE REPLACED BY THE USE OF TIR_S_C_STO_PIRR IN THE
- *     PIC CODE GENERATING FIXUP ROUTINE.
- */
+/* Check in the text area for an indirect pc-relative reference
+   and fix it up with addressing mode 0xff [PC indirect]
+
+   THIS SHOULD BE REPLACED BY THE USE OF TIR_S_C_STO_PIRR IN THE
+   PIC CODE GENERATING FIXUP ROUTINE.  */
+
 static void
-VMS_Fix_Indirect_Reference (Text_Psect, Offset, fragP, text_frag_root)
-     int Text_Psect;
-     int Offset;
-     register fragS *fragP;
-     fragS *text_frag_root;
+VMS_Fix_Indirect_Reference (int Text_Psect, addressT Offset,
+                           fragS *fragP, fragS *text_frag_root)
 {
-  /*
-   *   The addressing mode byte is 1 byte before the address
-   */
+  /* The addressing mode byte is 1 byte before the address.  */
   Offset--;
-  /*
-   *   Is it in THIS frag??
-   */
+  /* Is it in THIS frag?  */
   if ((Offset < fragP->fr_address) ||
       (Offset >= (fragP->fr_address + fragP->fr_fix)))
     {
-      /*
-       *       We need to search for the fragment containing this
-       *       Offset
-       */
+      /* We need to search for the fragment containing this
+         Offset.  */
       for (fragP = text_frag_root; fragP; fragP = fragP->fr_next)
        {
          if ((Offset >= fragP->fr_address) &&
              (Offset < (fragP->fr_address + fragP->fr_fix)))
            break;
        }
-      /*
-       *       If we couldn't find the frag, things are BAD!!
-       */
+      /* If we couldn't find the frag, things are BAD!  */
       if (fragP == 0)
-       error ("Couldn't find fixup fragment when checking for indirect reference");
+       error (_("Couldn't find fixup fragment when checking for indirect reference"));
     }
-  /*
-   *   Check for indirect PC relative addressing mode
-   */
+  /* Check for indirect PC relative addressing mode.  */
   if (fragP->fr_literal[Offset - fragP->fr_address] == (char) 0xff)
     {
       static char Address_Mode = (char) 0xff;
 
-      /*
-       *       Yes: Store the indirect mode back into the image
-       *            to fix up the damage done by STO_PICR
-       */
+      /* Yes: Store the indirect mode back into the image
+         to fix up the damage done by STO_PICR.  */
       VMS_Set_Psect (Text_Psect, Offset, OBJ_S_C_TIR);
       VMS_Store_Immediate_Data (&Address_Mode, 1, OBJ_S_C_TIR);
     }
 }
 \f
 
-/*
- *     If the procedure "main()" exists we have to add the instruction
- *     "jsb c$main_args" at the beginning to be compatible with VAX-11 "C".
- *
- *     FIXME:  the macro name `HACK_DEC_C_STARTUP' should be renamed
- *             to `HACK_VAXCRTL_STARTUP' because Digital's compiler
- *             named "DEC C" uses run-time library "DECC$SHR", but this
- *             startup code is for "VAXCRTL", the library for Digital's
- *             older "VAX C".  Also, this extra code isn't needed for
- *             supporting gcc because it already generates the VAXCRTL
- *             startup call when compiling main().  The reference to
- *             `flag_hash_long_names' looks very suspicious too;
- *             probably an old-style command line option was inadvertently
- *             overloaded here, then blindly converted into the new one.
- */
+/* If the procedure "main()" exists we have to add the instruction
+   "jsb c$main_args" at the beginning to be compatible with VAX-11 "C".
+
+   FIXME:  the macro name `HACK_DEC_C_STARTUP' should be renamed
+          to `HACK_VAXCRTL_STARTUP' because Digital's compiler
+          named "DEC C" uses run-time library "DECC$SHR", but this
+          startup code is for "VAXCRTL", the library for Digital's
+          older "VAX C".  Also, this extra code isn't needed for
+          supporting gcc because it already generates the VAXCRTL
+          startup call when compiling main().  The reference to
+          `flag_hash_long_names' looks very suspicious too;
+          probably an old-style command line option was inadvertently
+          overloaded here, then blindly converted into the new one.  */
 void
-vms_check_for_main ()
+vms_check_for_main (void)
 {
-  register symbolS *symbolP;
+  symbolS *symbolP;
 #ifdef HACK_DEC_C_STARTUP      /* JF */
-  register struct frchain *frchainP;
-  register fragS *fragP;
-  register fragS **prev_fragPP;
-  register struct fix *fixP;
-  register fragS *New_Frag;
+  struct frchain *frchainP;
+  fragS *fragP;
+  fragS **prev_fragPP;
+  struct fix *fixP;
+  fragS *New_Frag;
   int i;
 #endif /* HACK_DEC_C_STARTUP */
 
@@ -4279,56 +3845,42 @@ vms_check_for_main ()
       if (!flag_hash_long_names)
        {
 #endif
-         /*
-          *    Remember the entry point symbol
-          */
+         /* Remember the entry point symbol.  */
          Entry_Point_Symbol = symbolP;
 #ifdef HACK_DEC_C_STARTUP
        }
       else
        {
-         /*
-          *    Scan all the fragment chains for the one with "_main"
-          *    (Actually we know the fragment from the symbol, but we need
-          *     the previous fragment so we can change its pointer)
-          */
+         /* Scan all the fragment chains for the one with "_main"
+            (Actually we know the fragment from the symbol, but we need
+            the previous fragment so we can change its pointer).  */
          frchainP = frchain_root;
          while (frchainP)
            {
-             /*
-              *        Scan all the fragments in this chain, remembering
-              *        the "previous fragment"
-              */
+             /* Scan all the fragments in this chain, remembering
+                the "previous fragment".  */
              prev_fragPP = &frchainP->frch_root;
              fragP = frchainP->frch_root;
              while (fragP && (fragP != frchainP->frch_last))
                {
-                 /*
-                  *    Is this the fragment?
-                  */
+                 /* Is this the fragment ?  */
                  if (fragP == symbolP->sy_frag)
                    {
-                     /*
-                      *        Yes: Modify the fragment by replacing
-                      *             it with a new fragment.
-                      */
-                     New_Frag = (fragS *)
+                     /* Yes: Modify the fragment by replacing
+                        it with a new fragment.  */
+                     New_Frag =
                        xmalloc (sizeof (*New_Frag) +
                                 fragP->fr_fix +
                                 fragP->fr_var +
                                 5);
-                     /*
-                      *        The fragments are the same except
-                      *        that the "fixed" area is larger
-                      */
+                     /* The fragments are the same except
+                               that the "fixed" area is larger.  */
                      *New_Frag = *fragP;
                      New_Frag->fr_fix += 6;
-                     /*
-                      *        Copy the literal data opening a hole
-                      *        2 bytes after "_main" (i.e. just after
-                      *        the entry mask).  Into which we place
-                      *        the JSB instruction.
-                      */
+                     /* Copy the literal data opening a hole
+                        2 bytes after "_main" (i.e. just after
+                        the entry mask).  Into which we place
+                        the JSB instruction.  */
                      New_Frag->fr_literal[0] = fragP->fr_literal[0];
                      New_Frag->fr_literal[1] = fragP->fr_literal[1];
                      New_Frag->fr_literal[2] = 0x16;   /* Jsb */
@@ -4340,82 +3892,50 @@ vms_check_for_main ()
                      for (i = 2; i < fragP->fr_fix + fragP->fr_var; i++)
                        New_Frag->fr_literal[i + 6] =
                          fragP->fr_literal[i];
-                     /*
-                      *        Now replace the old fragment with the
-                      *        newly generated one.
-                      */
+                     /* Now replace the old fragment with the
+                        newly generated one.  */
                      *prev_fragPP = New_Frag;
-                     /*
-                      *        Remember the entry point symbol
-                      */
+                     /* Remember the entry point symbol.  */
                      Entry_Point_Symbol = symbolP;
-                     /*
-                      *        Scan the text area fixup structures
-                      *        as offsets in the fragment may have
-                      *        changed
-                      */
+                     /* Scan the text area fixup structures
+                        as offsets in the fragment may have changed.  */
                      for (fixP = text_fix_root; fixP; fixP = fixP->fx_next)
                        {
-                         /*
-                          *    Look for references to this
-                          *    fragment.
-                          */
+                         /* Look for references to this fragment.  */
                          if (fixP->fx_frag == fragP)
                            {
-                             /*
-                              *        Change the fragment
-                              *        pointer
-                              */
+                             /* Change the fragment pointer.  */
                              fixP->fx_frag = New_Frag;
-                             /*
-                              *        If the offset is after
-                              *        the entry mask we need
-                              *        to account for the JSB
-                              *        instruction we just
-                              *        inserted.
-                              */
+                             /* If the offset is after the entry mask we need
+                                to account for the JSB instruction we just
+                                inserted.  */
                              if (fixP->fx_where >= 2)
                                fixP->fx_where += 6;
                            }
                        }
-                     /*
-                      *        Scan the symbols as offsets in the
-                      *        fragment may have changed
-                      */
+                     /* Scan the symbols as offsets in the
+                       fragment may have changed.  */
                      for (symbolP = symbol_rootP;
                           symbolP;
                           symbolP = symbol_next (symbolP))
                        {
-                         /*
-                          *    Look for references to this
-                          *    fragment.
-                          */
+                         /* Look for references to this fragment.  */
                          if (symbolP->sy_frag == fragP)
                            {
-                             /*
-                              *        Change the fragment
-                              *        pointer
-                              */
+                             /* Change the fragment pointer.  */
                              symbolP->sy_frag = New_Frag;
-                             /*
-                              *        If the offset is after
-                              *        the entry mask we need
-                              *        to account for the JSB
-                              *        instruction we just
-                              *        inserted.
-                              */
+                             /* If the offset is after the entry mask we need
+                                to account for the JSB instruction we just
+                                inserted.  */
                              if (S_GET_VALUE (symbolP) >= 2)
                                S_SET_VALUE (symbolP,
                                             S_GET_VALUE (symbolP) + 6);
                            }
                        }
-                     /*
-                      *        Make a symbol reference to
-                      *        "_c$main_args" so we can get
-                      *        its address inserted into the
-                      *        JSB instruction.
-                      */
-                     symbolP = (symbolS *) xmalloc (sizeof (*symbolP));
+                     /*  Make a symbol reference to "_c$main_args" so we
+                         can get its address inserted into the JSB
+                         instruction.  */
+                     symbolP = xmalloc (sizeof (*symbolP));
                      S_SET_NAME (symbolP, "_C$MAIN_ARGS");
                      S_SET_TYPE (symbolP, N_UNDF);
                      S_SET_OTHER (symbolP, 0);
@@ -4427,17 +3947,15 @@ vms_check_for_main ()
                      symbolP->sy_frag = New_Frag;
                      symbolP->sy_resolved = 0;
                      symbolP->sy_resolving = 0;
-                     /* this actually inserts at the beginning of the list */
+                     /* This actually inserts at the beginning of the list.  */
                      symbol_append (symbol_rootP, symbolP,
                                     &symbol_rootP, &symbol_lastP);
 
                      symbol_rootP = symbolP;
-                     /*
-                      *        Generate a text fixup structure
-                      *        to get "_c$main_args" stored into the
-                      *        JSB instruction.
-                      */
-                     fixP = (struct fix *) xmalloc (sizeof (*fixP));
+                     /* Generate a text fixup structure
+                        to get "_c$main_args" stored into the
+                        JSB instruction.  */
+                     fixP = xmalloc (sizeof (*fixP));
                      fixP->fx_frag = New_Frag;
                      fixP->fx_where = 4;
                      fixP->fx_addsy = symbolP;
@@ -4447,21 +3965,15 @@ vms_check_for_main ()
                      fixP->fx_pcrel = 1;
                      fixP->fx_next = text_fix_root;
                      text_fix_root = fixP;
-                     /*
-                      *        Now make sure we exit from the loop
-                      */
+                     /* Now make sure we exit from the loop.  */
                      frchainP = 0;
                      break;
                    }
-                 /*
-                  *    Try the next fragment
-                  */
+                 /* Try the next fragment.  */
                  prev_fragPP = &fragP->fr_next;
                  fragP = fragP->fr_next;
                }
-             /*
-              *        Try the next fragment chain
-              */
+             /* Try the next fragment chain.  */
              if (frchainP)
                frchainP = frchainP->frch_next;
            }
@@ -4471,13 +3983,11 @@ vms_check_for_main ()
 }
 \f
 
-/*
- *     Beginning of vms_write_object_file().
- */
+/* Beginning of vms_write_object_file().  */
 
 static
-struct vms_obj_state {
-
+struct vms_obj_state
+{
   /* Next program section index to use.  */
   int  psect_number;
 
@@ -4490,6 +4000,12 @@ struct vms_obj_state {
   /* Psect index for uninitialized static variables.  */
   int  bss_psect;
 
+  /* Psect index for static constructors.  */
+  int  ctors_psect;
+
+  /* Psect index for static destructors.  */
+  int  dtors_psect;
+
   /* Number of bytes used for local symbol data.  */
   int  local_initd_data_size;
 
@@ -4502,23 +4018,25 @@ struct vms_obj_state {
 #define Text_Psect             vms_obj_state.text_psect
 #define Data_Psect             vms_obj_state.data_psect
 #define Bss_Psect              vms_obj_state.bss_psect
+#define Ctors_Psect            vms_obj_state.ctors_psect
+#define Dtors_Psect            vms_obj_state.dtors_psect
 #define Local_Initd_Data_Size  vms_obj_state.local_initd_data_size
 #define Data_Segment           vms_obj_state.data_segment
 
-
 #define IS_GXX_VTABLE(symP) (strncmp (S_GET_NAME (symP), "__vt.", 5) == 0)
+#define IS_GXX_XTOR(symP) (strncmp (S_GET_NAME (symP), "__GLOBAL_.", 10) == 0)
+#define XTOR_SIZE 4
 \f
 
 /* Perform text segment fixups.  */
 
 static void
-vms_fixup_text_section (text_siz, text_frag_root, data_frag_root)
-     unsigned text_siz;
-     struct frag *text_frag_root;
-     struct frag *data_frag_root;
+vms_fixup_text_section (unsigned text_siz ATTRIBUTE_UNUSED,
+                       struct frag *text_frag_root,
+                       struct frag *data_frag_root)
 {
-  register fragS *fragP;
-  register struct fix *fixP;
+  fragS *fragP;
+  struct fix *fixP;
   offsetT dif;
 
   /* Scan the text fragments.  */
@@ -4530,7 +4048,7 @@ vms_fixup_text_section (text_siz, text_frag_root, data_frag_root)
       /* Ignore fragments with no data.  */
       if ((fragP->fr_fix == 0) && (fragP->fr_var == 0))
        continue;
-      /* Go the the appropriate offset in the Text Psect.  */
+      /* Go to the appropriate offset in the Text Psect.  */
       VMS_Set_Psect (Text_Psect, fragP->fr_address, OBJ_S_C_TIR);
       /* Store the "fixed" part.  */
       if (fragP->fr_fix)
@@ -4543,12 +4061,10 @@ vms_fixup_text_section (text_siz, text_frag_root, data_frag_root)
                                 fragP->fr_literal + fragP->fr_fix,
                                 fragP->fr_var,
                                 OBJ_S_C_TIR);
-    }                  /* text frag loop */
+    }
 
-  /*
-   *   Now we go through the text segment fixups and generate
-   *   TIR records to fix up addresses within the Text Psect.
-   */
+  /* Now we go through the text segment fixups and generate
+     TIR records to fix up addresses within the Text Psect.  */
   for (fixP = text_fix_root; fixP; fixP = fixP->fx_next)
     {
       /* We DO handle the case of "Symbol - Symbol" as
@@ -4558,14 +4074,14 @@ vms_fixup_text_section (text_siz, text_frag_root, data_frag_root)
          /* They need to be in the same segment.  */
          if (S_GET_RAW_TYPE (fixP->fx_subsy) !=
              S_GET_RAW_TYPE (fixP->fx_addsy))
-           error ("Fixup data addsy and subsy don't have the same type");
+           error (_("Fixup data addsy and subsy don't have the same type"));
          /* And they need to be in one that we can check the psect on.  */
          if ((S_GET_TYPE (fixP->fx_addsy) != N_DATA) &&
                    (S_GET_TYPE (fixP->fx_addsy) != N_TEXT))
-           error ("Fixup data addsy and subsy don't have an appropriate type");
+           error (_("Fixup data addsy and subsy don't have an appropriate type"));
          /* This had better not be PC relative!  */
          if (fixP->fx_pcrel)
-           error ("Fixup data is erroneously \"pcrel\"");
+           error (_("Fixup data is erroneously \"pcrel\""));
          /* Subtract their values to get the difference.  */
          dif = S_GET_VALUE (fixP->fx_addsy) - S_GET_VALUE (fixP->fx_subsy);
          md_number_to_chars (Local, (valueT)dif, fixP->fx_size);
@@ -4577,15 +4093,15 @@ vms_fixup_text_section (text_siz, text_frag_root, data_frag_root)
          VMS_Store_Immediate_Data (Local,
                                    fixP->fx_size,
                                    OBJ_S_C_TIR);
-         continue;     /* done with this fixup */
-           }           /* if fx_subsy && fx_addsy */
+         continue;
+       }
       /* Size will HAVE to be "long".  */
       if (fixP->fx_size != 4)
-       error ("Fixup datum is not a longword");
+       error (_("Fixup datum is not a longword"));
       /* Symbol must be "added" (if it is ever
         subtracted we can fix this assumption).  */
       if (fixP->fx_addsy == 0)
-       error ("Fixup datum is not \"fixP->fx_addsy\"");
+       error (_("Fixup datum is not \"fixP->fx_addsy\""));
       /* Store the symbol value in a PIC fashion.  */
       VMS_Store_PIC_Symbol_Reference (fixP->fx_addsy,
                                      fixP->fx_offset,
@@ -4593,32 +4109,30 @@ vms_fixup_text_section (text_siz, text_frag_root, data_frag_root)
                                      Text_Psect,
                                    fixP->fx_where + fixP->fx_frag->fr_address,
                                      OBJ_S_C_TIR);
-         /*
-          *  Check for indirect address reference, which has to be fixed up
-          *  (as the linker will screw it up with TIR_S_C_STO_PICR)...
-          */
+         /* Check for indirect address reference, which has to be fixed up
+            (as the linker will screw it up with TIR_S_C_STO_PICR).  */
       if (fixP->fx_pcrel)
        VMS_Fix_Indirect_Reference (Text_Psect,
                                    fixP->fx_where + fixP->fx_frag->fr_address,
                                    fixP->fx_frag,
                                    text_frag_root);
-    }                  /* text fix loop */
+    }
 }
 \f
 
 /* Create a buffer holding the data segment.  */
 
 static void
-synthesize_data_segment (data_siz, text_siz, data_frag_root)
-     unsigned data_siz, text_siz;
-     struct frag *data_frag_root;
+synthesize_data_segment (unsigned data_siz, unsigned text_siz,
+                        struct frag *data_frag_root)
 {
-  register fragS *fragP;
+  fragS *fragP;
   char *fill_literal;
   long fill_size, count, i;
 
   /* Allocate the data segment.  */
-  Data_Segment = (char *) xmalloc (data_siz);
+  Data_Segment = xmalloc (data_siz);
+  
   /* Run through the data fragments, filling in the segment.  */
   for (fragP = data_frag_root; fragP; fragP = fragP->fr_next)
     {
@@ -4636,21 +4150,18 @@ synthesize_data_segment (data_siz, text_siz, data_frag_root)
              i += fill_size;
            }
        }
-    }                  /* data frag loop */
-
-  return;
+    }
 }
 
-
 /* Perform data segment fixups.  */
 
 static void
-vms_fixup_data_section (data_siz, text_siz)
-     unsigned data_siz, text_siz;
+vms_fixup_data_section (unsigned int data_siz ATTRIBUTE_UNUSED,
+                       unsigned int text_siz)
 {
-  register struct VMS_Symbol *vsp;
-  register struct fix *fixP;
-  register symbolS *sp;
+  struct VMS_Symbol *vsp;
+  struct fix *fixP;
+  symbolS *sp;
   addressT fr_address;
   offsetT dif;
   valueT val;
@@ -4672,10 +4183,8 @@ vms_fixup_data_section (data_siz, text_siz)
                                OBJ_S_C_TIR);
     }                  /* N_DATA symbol loop */
 
-  /*
-   *   Now we go through the data segment fixups and generate
-   *   TIR records to fix up addresses within the Data Psects.
-   */
+  /* Now we go through the data segment fixups and generate
+     TIR records to fix up addresses within the Data Psects.  */
   for (fixP = data_fix_root; fixP; fixP = fixP->fx_next)
     {
       /* Find the symbol for the containing datum.  */
@@ -4700,21 +4209,19 @@ vms_fixup_data_section (data_siz, text_siz)
              /* They need to be in the same segment.  */
              if (S_GET_RAW_TYPE (fixP->fx_subsy) !=
                  S_GET_RAW_TYPE (fixP->fx_addsy))
-               error ("Fixup data addsy and subsy don't have the same type");
+               error (_("Fixup data addsy and subsy don't have the same type"));
              /* And they need to be in one that we can check the psect on.  */
              if ((S_GET_TYPE (fixP->fx_addsy) != N_DATA) &&
                  (S_GET_TYPE (fixP->fx_addsy) != N_TEXT))
-               error ("Fixup data addsy and subsy don't have an appropriate type");
+               error (_("Fixup data addsy and subsy don't have an appropriate type"));
              /* This had better not be PC relative!  */
              if (fixP->fx_pcrel)
-               error ("Fixup data is erroneously \"pcrel\"");
+               error (_("Fixup data is erroneously \"pcrel\""));
              /* Subtract their values to get the difference.  */
              dif = S_GET_VALUE (fixP->fx_addsy) - S_GET_VALUE (fixP->fx_subsy);
              md_number_to_chars (Local, (valueT)dif, fixP->fx_size);
-             /*
-              * Now generate the fixup object records;
-              * set the psect and store the data.
-              */
+             /* Now generate the fixup object records;
+                set the psect and store the data.  */
              VMS_Set_Psect (vsp->Psect_Index,
                             fr_address + fixP->fx_where
                                 - val + vsp->Psect_Offset,
@@ -4726,11 +4233,11 @@ vms_fixup_data_section (data_siz, text_siz)
                }
          /* Size will HAVE to be "long".  */
          if (fixP->fx_size != 4)
-           error ("Fixup datum is not a longword");
+           error (_("Fixup datum is not a longword"));
          /* Symbol must be "added" (if it is ever
             subtracted we can fix this assumption).  */
          if (fixP->fx_addsy == 0)
-           error ("Fixup datum is not \"fixP->fx_addsy\"");
+           error (_("Fixup datum is not \"fixP->fx_addsy\""));
          /* Store the symbol value in a PIC fashion.  */
          VMS_Store_PIC_Symbol_Reference (fixP->fx_addsy,
                                          fixP->fx_offset,
@@ -4741,44 +4248,67 @@ vms_fixup_data_section (data_siz, text_siz)
                                          OBJ_S_C_TIR);
          /* Done with this fixup.  */
          break;
-       }               /* vms_symbol loop */
+       }
+    }
+}
+
+/* Perform ctors/dtors segment fixups.  */
+
+static void
+vms_fixup_xtors_section (struct VMS_Symbol *symbols,
+                        int sect_no ATTRIBUTE_UNUSED)
+{
+  struct VMS_Symbol *vsp;
+
+  /* Run through all the symbols and store the data.  */
+  for (vsp = symbols; vsp; vsp = vsp->Next)
+    {
+      symbolS *sp;
 
-    }                  /* data fix loop */
+      /* Set relocation base.  */
+      VMS_Set_Psect (vsp->Psect_Index, vsp->Psect_Offset, OBJ_S_C_TIR);
+
+      sp = vsp->Symbol;
+      /* Stack the Psect base with its offset.  */
+      VMS_Set_Data (Text_Psect, S_GET_VALUE (sp), OBJ_S_C_TIR, 0);
+    }
+  /* Flush the buffer if it is more than 75% full.  */
+  if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4))
+    Flush_VMS_Object_Record_Buffer ();
 }
 \f
 
 /* Define symbols for the linker.  */
 
 static void
-global_symbol_directory (text_siz, data_siz)
-     unsigned text_siz, data_siz;
+global_symbol_directory (unsigned text_siz, unsigned data_siz)
 {
-  register fragS *fragP;
-  register symbolS *sp;
-  register struct VMS_Symbol *vsp;
+  fragS *fragP;
+  symbolS *sp;
+  struct VMS_Symbol *vsp;
   int Globalref, define_as_global_symbol;
 
-#ifndef gxx_bug_fixed
-  /*
-   * The g++ compiler does not write out external references to vtables
-   * correctly.  Check for this and holler if we see it happening.
-   * If that compiler bug is ever fixed we can remove this.
-   * (Jun'95:  gcc 2.7.0's cc1plus still exhibits this behavior.)
-   */
+#if 0
+  /* The g++ compiler does not write out external references to
+     vtables correctly.  Check for this and holler if we see it
+     happening.  If that compiler bug is ever fixed we can remove
+     this.
+
+     (Jun'95: gcc 2.7.0's cc1plus still exhibits this behavior.)
+
+     This was reportedly fixed as of June 2, 1998.   */
+
   for (sp = symbol_rootP; sp; sp = symbol_next (sp))
     if (S_GET_RAW_TYPE (sp) == N_UNDF && IS_GXX_VTABLE (sp))
       {
        S_SET_TYPE (sp, N_UNDF | N_EXT);
        S_SET_OTHER (sp, 1);
-       as_warn ("g++ wrote an extern reference to `%s' as a routine.\n%s",
-                S_GET_NAME (sp),
-                "I will fix it, but I hope that it was not really a routine.");
+       as_warn (_("g++ wrote an extern reference to `%s' as a routine.\nI will fix it, but I hope that it was note really a routine."),
+                S_GET_NAME (sp));
       }
-#endif /* gxx_bug_fixed */
+#endif
 
-  /*
-   * Now scan the symbols and emit the appropriate GSD records
-   */
+  /* Now scan the symbols and emit the appropriate GSD records.  */
   for (sp = symbol_rootP; sp; sp = symbol_next (sp))
     {
       define_as_global_symbol = 0;
@@ -4790,7 +4320,7 @@ global_symbol_directory (text_siz, data_siz)
        /* Global uninitialized data.  */
        case N_UNDF | N_EXT:
          /* Make a VMS data symbol entry.  */
-         vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp);
+         vsp = xmalloc (sizeof *vsp);
          vsp->Symbol = sp;
          vsp->Size = S_GET_VALUE (sp);
          vsp->Psect_Index = Psect_Number++;
@@ -4820,7 +4350,7 @@ global_symbol_directory (text_siz, data_siz)
        /* Local uninitialized data.  */
        case N_BSS:
          /* Make a VMS data symbol entry.  */
-         vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp);
+         vsp = xmalloc (sizeof *vsp);
          vsp->Symbol = sp;
          vsp->Size = 0;
          vsp->Psect_Index = Bss_Psect;
@@ -4833,7 +4363,7 @@ global_symbol_directory (text_siz, data_siz)
        /* Global initialized data.  */
        case N_DATA | N_EXT:
          /* Make a VMS data symbol entry.  */
-         vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp);
+         vsp = xmalloc (sizeof *vsp);
          vsp->Symbol = sp;
          vsp->Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz);
          vsp->Psect_Index = Psect_Number++;
@@ -4866,7 +4396,7 @@ global_symbol_directory (text_siz, data_siz)
              break;
 
            /* Make a VMS data symbol entry.  */
-           vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp);
+           vsp = xmalloc (sizeof *vsp);
            vsp->Symbol = sp;
            vsp->Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz);
            vsp->Psect_Index = Data_Psect;
@@ -4881,33 +4411,65 @@ global_symbol_directory (text_siz, data_siz)
        /* Global Text definition.  */
        case N_TEXT | N_EXT:
          {
-           unsigned short Entry_Mask;
-
-           /* Get the entry mask.  */
-           fragP = sp->sy_frag;
-           /* First frag might be empty if we're generating listings.
-              So skip empty rs_fill frags.  */
-           while (fragP && fragP->fr_type == rs_fill && fragP->fr_fix == 0)
-             fragP = fragP->fr_next;
-
-           /* If first frag doesn't contain the data, what do we do?
-              If it's possibly smaller than two bytes, that would
-              imply that the entry mask is not stored where we're
-              expecting it.
-
-              If you can find a test case that triggers this, report
-              it (and tell me what the entry mask field ought to be),
-              and I'll try to fix it.  KR */
-           if (fragP->fr_fix < 2)
-             abort ();
-
-           Entry_Mask = (fragP->fr_literal[0] & 0x00ff) |
-                        ((fragP->fr_literal[1] & 0x00ff) << 8);
-           /* Define the procedure entry point.  */
-           VMS_Procedure_Entry_Pt (S_GET_NAME (sp),
+
+           if (IS_GXX_XTOR (sp))
+             {
+               vsp = xmalloc (sizeof *vsp);
+               vsp->Symbol = sp;
+               vsp->Size = XTOR_SIZE;
+               sp->sy_obj = vsp;
+               switch ((S_GET_NAME (sp))[10])
+                 {
+                   case 'I':
+                     vsp->Psect_Index = Ctors_Psect;
+                     vsp->Psect_Offset = (Ctors_Symbols==0)?0:(Ctors_Symbols->Psect_Offset+XTOR_SIZE);
+                     vsp->Next = Ctors_Symbols;
+                     Ctors_Symbols = vsp;
+                     break;
+                   case 'D':
+                     vsp->Psect_Index = Dtors_Psect;
+                     vsp->Psect_Offset = (Dtors_Symbols==0)?0:(Dtors_Symbols->Psect_Offset+XTOR_SIZE);
+                     vsp->Next = Dtors_Symbols;
+                     Dtors_Symbols = vsp;
+                     break;
+                   case 'G':
+                     as_warn (_("Can't handle global xtors symbols yet."));
+                     break;
+                   default:
+                     as_warn (_("Unknown %s"), S_GET_NAME (sp));
+                     break;
+                 }
+             }
+           else
+             {
+               unsigned short Entry_Mask;
+
+               /* Get the entry mask.  */
+               fragP = sp->sy_frag;
+               /* First frag might be empty if we're generating listings.
+                  So skip empty rs_fill frags.  */
+               while (fragP && fragP->fr_type == rs_fill && fragP->fr_fix == 0)
+                 fragP = fragP->fr_next;
+
+               /* If first frag doesn't contain the data, what do we do?
+                  If it's possibly smaller than two bytes, that would
+                  imply that the entry mask is not stored where we're
+                  expecting it.
+
+                  If you can find a test case that triggers this, report
+                  it (and tell me what the entry mask field ought to be),
+                  and I'll try to fix it.  KR */
+               if (fragP->fr_fix < 2)
+                 abort ();
+
+               Entry_Mask = (fragP->fr_literal[0] & 0x00ff) |
+                            ((fragP->fr_literal[1] & 0x00ff) << 8);
+               /* Define the procedure entry point.  */
+               VMS_Procedure_Entry_Pt (S_GET_NAME (sp),
                                    Text_Psect,
                                    S_GET_VALUE (sp),
                                    Entry_Mask);
+             }
            break;
          }
 
@@ -4916,7 +4478,7 @@ global_symbol_directory (text_siz, data_siz)
          /* Make a VMS data symbol entry.  */
          if (Text_Psect != -1)
            {
-             vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp);
+             vsp = xmalloc (sizeof *vsp);
              vsp->Symbol = sp;
              vsp->Size = 0;
              vsp->Psect_Index = Text_Psect;
@@ -4941,7 +4503,7 @@ global_symbol_directory (text_siz, data_siz)
        case N_ABS | N_EXT:
          /* gcc doesn't generate these;
             VMS_Emit_Globalvalue handles them though.  */
-         vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp);
+         vsp = xmalloc (sizeof *vsp);
          vsp->Symbol = sp;
          vsp->Size = 4;                /* always assume 32 bits */
          vsp->Psect_Index = 0;
@@ -4959,7 +4521,7 @@ global_symbol_directory (text_siz, data_siz)
          /*
           *    Error otherwise.
           */
-         as_tsktsk ("unhandled stab type %d", S_GET_TYPE (sp));
+         as_tsktsk (_("unhandled stab type %d"), S_GET_TYPE (sp));
          break;
        }
 
@@ -4970,8 +4532,6 @@ global_symbol_directory (text_siz, data_siz)
                                0,
                                GBLSYM_DEF);
     }
-
-  return;
 }
 \f
 
@@ -4979,8 +4539,7 @@ global_symbol_directory (text_siz, data_siz)
    are local to a specific routine.  */
 
 static void
-local_symbols_DST (s0P, Current_Routine)
-     symbolS *s0P, *Current_Routine;
+local_symbols_DST (symbolS *s0P, symbolS *Current_Routine)
 {
   symbolS *s1P;
   char *s0P_name, *pnt0, *pnt1;
@@ -5013,14 +4572,12 @@ local_symbols_DST (s0P, Current_Routine)
     }
 }
 
-
 /* Construct and output the debug symbol table.  */
 
 static void
-vms_build_DST (text_siz)
-     unsigned text_siz;
+vms_build_DST (unsigned text_siz)
 {
-  register symbolS *symbolP;
+  symbolS *symbolP;
   symbolS *Current_Routine = 0;
   struct input_file *Cur_File = 0;
   offsetT Cur_Offset = -1;
@@ -5034,31 +4591,27 @@ vms_build_DST (text_siz)
   /* Write the Traceback Begin Module record.  */
   VMS_TBT_Module_Begin ();
 
-  /*
-   *   Output debugging info for global variables and static variables
-   *   that are not specific to one routine.  We also need to examine
-   *   all stabs directives, to find the definitions to all of the
-   *   advanced data types, and this is done by VMS_LSYM_Parse.  This
-   *   needs to be done before any definitions are output to the object
-   *   file, since there can be forward references in the stabs
-   *   directives.  When through with parsing, the text of the stabs
-   *   directive is altered, with the definitions removed, so that later
-   *   passes will see directives as they would be written if the type
-   *   were already defined.
-   *
-   *   We also look for files and include files, and make a list of
-   *   them.  We examine the source file numbers to establish the actual
-   *   lines that code was generated from, and then generate offsets.
-   */
+  /* Output debugging info for global variables and static variables
+     that are not specific to one routine.  We also need to examine
+     all stabs directives, to find the definitions to all of the
+     advanced data types, and this is done by VMS_LSYM_Parse.  This
+     needs to be done before any definitions are output to the object
+     file, since there can be forward references in the stabs
+     directives.  When through with parsing, the text of the stabs
+     directive is altered, with the definitions removed, so that later
+     passes will see directives as they would be written if the type
+     were already defined.
+
+     We also look for files and include files, and make a list of
+     them.  We examine the source file numbers to establish the actual
+     lines that code was generated from, and then generate offsets.  */
   VMS_LSYM_Parse ();
   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
     {
       /* Only deal with STAB symbols here.  */
       if (!S_IS_DEBUG (symbolP))
        continue;
-      /*
-       *       Dispatch on STAB type.
-       */
+      /* Dispatch on STAB type.  */
       switch (S_GET_RAW_TYPE (symbolP))
        {
        case N_SLINE:
@@ -5088,15 +4641,13 @@ vms_build_DST (text_siz)
          break;
        default:
          break;
-       }               /* switch */
-    }                  /* for */
-
-  /*
-   *   Now we take a quick sweep through the files and assign offsets
-   *   to each one.  This will essentially be the starting line number to
-   *   the debugger for each file.  Output the info for the debugger to
-   *   specify the files, and then tell it how many lines to use.
-   */
+       }
+    }
+
+  /* Now we take a quick sweep through the files and assign offsets
+     to each one.  This will essentially be the starting line number to
+     the debugger for each file.  Output the info for the debugger to
+     specify the files, and then tell it how many lines to use.  */
   for (Cur_File = file_root; Cur_File; Cur_File = Cur_File->next)
     {
       if (Cur_File->max_line == 0)
@@ -5134,64 +4685,42 @@ vms_build_DST (text_siz)
   }                    /* for */
   Cur_File = (struct input_file *) NULL;
 
-  /*
-   *   Scan the symbols and write out the routines
-   *   (this makes the assumption that symbols are in
-   *    order of ascending text segment offset)
-   */
+  /* Scan the symbols and write out the routines
+     (this makes the assumption that symbols are in
+     order of ascending text segment offset).  */
   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
     {
-      /*
-       *       Deal with text symbols.
-       */
+      /* Deal with text symbols.  */
       if (!S_IS_DEBUG (symbolP) && S_GET_TYPE (symbolP) == N_TEXT)
        {
-         /*
-          * Ignore symbols starting with "L", as they are local symbols.
-          */
+         /* Ignore symbols starting with "L", as they are local symbols.  */
          if (*S_GET_NAME (symbolP) == 'L')
            continue;
-         /*
-          * If there is a routine start defined, terminate it.
-          */
+         /* If there is a routine start defined, terminate it.  */
          if (Current_Routine)
            VMS_TBT_Routine_End (text_siz, Current_Routine);
 
-         /*
-          * Check for & skip dummy labels like "gcc_compiled.".
-          * They're identified by the IN_DEFAULT_SECTION flag.
-          */
+         /* Check for & skip dummy labels like "gcc_compiled.".
+          * They're identified by the IN_DEFAULT_SECTION flag.  */
          if ((S_GET_OTHER (symbolP) & IN_DEFAULT_SECTION) != 0 &&
              S_GET_VALUE (symbolP) == 0)
            continue;
-         /*
-          * Store the routine begin traceback info.
-          */
+         /* Store the routine begin traceback info.  */
          VMS_TBT_Routine_Begin (symbolP, Text_Psect);
          Current_Routine = symbolP;
-         /*
-          * Define symbols local to this routine.
-          */
+         /* Define symbols local to this routine.  */
          local_symbols_DST (symbolP, Current_Routine);
-         /*
-          *    Done
-          */
+         /* Done.  */
          continue;
 
        }
-      /*
-       *       Deal with STAB symbols.
-       */
+      /* Deal with STAB symbols.  */
       else if (S_IS_DEBUG (symbolP))
        {
-         /*
-          *  Dispatch on STAB type.
-          */
+         /* Dispatch on STAB type.  */
          switch (S_GET_RAW_TYPE (symbolP))
            {
-               /*
-                *      Line number
-                */
+             /* Line number.  */
            case N_SLINE:
              /* Offset the line into the correct portion of the file.  */
              if (Cur_File->file_number == 0)
@@ -5204,17 +4733,13 @@ vms_build_DST (text_siz)
              if (val == Cur_Offset && Cur_File->file_number != 1)
                break;
 
-             /* calculate actual debugger source line */
+             /* Calculate actual debugger source line.  */
              dsc = S_GET_DESC (symbolP) + Cur_File->offset;
              S_SET_DESC (symbolP, dsc);
-             /*
-              * Define PC/Line correlation.
-              */
+             /* Define PC/Line correlation.  */
              if (Cur_Offset == -1)
                {
-                 /*
-                  * First N_SLINE; set up initial correlation.
-                  */
+                 /* First N_SLINE; set up initial correlation.  */
                  VMS_TBT_Line_PC_Correlation (dsc,
                                               val,
                                               Text_Psect,
@@ -5222,10 +4747,8 @@ vms_build_DST (text_siz)
                }
              else if ((dsc - Cur_Line_Number) <= 0)
                {
-                 /*
-                  * Line delta is not +ve, we need to close the line and
-                  * start a new PC/Line correlation.
-                  */
+                 /* Line delta is not +ve, we need to close the line and
+                    start a new PC/Line correlation.  */
                  VMS_TBT_Line_PC_Correlation (0,
                                               val - Cur_Offset,
                                               0,
@@ -5237,9 +4760,7 @@ vms_build_DST (text_siz)
                }
              else
                {
-                 /*
-                  * Line delta is +ve, all is well.
-                  */
+                 /* Line delta is +ve, all is well.  */
                  VMS_TBT_Line_PC_Correlation (dsc - Cur_Line_Number,
                                               val - Cur_Offset,
                                               0,
@@ -5250,9 +4771,7 @@ vms_build_DST (text_siz)
              Cur_Offset = val;
              break;
 
-               /*
-                *      Source file
-                */
+               /* Source file.  */
            case N_SO:
              /* Remember that we had a source file and emit
                 the source file debugger record.  */
@@ -5268,14 +4787,12 @@ vms_build_DST (text_siz)
 
            default:
              break;
-           }           /* switch */
-       }               /* if (IS_DEBUG) */
-    }                  /* for */
-
-    /*
-     * If there is a routine start defined, terminate it
-     * (and the line numbers).
-     */
+           }
+       }
+    }
+
+    /* If there is a routine start defined, terminate it
+       (and the line numbers).  */
     if (Current_Routine)
       {
        /* Terminate the line numbers.  */
@@ -5295,127 +4812,122 @@ vms_build_DST (text_siz)
 /* Write a VAX/VMS object file (everything else has been done!).  */
 
 void
-vms_write_object_file (text_siz, data_siz, bss_siz, text_frag_root,
-                      data_frag_root)
-     unsigned text_siz;
-     unsigned data_siz;
-     unsigned bss_siz;
-     fragS *text_frag_root;
-     fragS *data_frag_root;
+vms_write_object_file (unsigned text_siz, unsigned data_siz, unsigned bss_siz,
+                      fragS *text_frag_root, fragS *data_frag_root)
 {
-  register struct VMS_Symbol *vsp;
+  struct VMS_Symbol *vsp;
 
-  /*
-   * Initialize program section indices; values get updated later.
-   */
+  /* Initialize program section indices; values get updated later.  */
   Psect_Number = 0;            /* next Psect Index to use */
   Text_Psect = -1;             /* Text Psect Index   */
   Data_Psect = -2;             /* Data Psect Index   JF: Was -1 */
   Bss_Psect = -3;              /* Bss Psect Index    JF: Was -1 */
+  Ctors_Psect = -4;            /* Ctors Psect Index  */
+  Dtors_Psect = -5;            /* Dtors Psect Index  */
   /* Initialize other state variables.  */
   Data_Segment = 0;
   Local_Initd_Data_Size = 0;
 
-  /*
-   *   Create the actual output file and populate it with required
-   *   "module header" information.
-   */
+  /* Create the actual output file and populate it with required
+     "module header" information.  */
   Create_VMS_Object_File ();
   Write_VMS_MHD_Records ();
 
-  /*
-   *   Create the Data segment:
-   *
-   *   Since this is REALLY hard to do any other way,
-   *   we actually manufacture the data segment and
-   *   then store the appropriate values out of it.
-   *   We need to generate this early, so that globalvalues
-   *   can be properly emitted.
-   */
+  /* Create the Data segment:
+
+     Since this is REALLY hard to do any other way,
+     we actually manufacture the data segment and
+     then store the appropriate values out of it.
+     We need to generate this early, so that globalvalues
+     can be properly emitted.  */
   if (data_siz > 0)
     synthesize_data_segment (data_siz, text_siz, data_frag_root);
 
+  /* Global Symbol Directory.  */
 
-  /*******  Global Symbol Directory  *******/
-
-  /*
-   *   Emit globalvalues now.  We must do this before the text psect is
-   *   defined, or we will get linker warnings about multiply defined
-   *   symbols.  All of the globalvalues "reference" psect 0, although
-   *   it really does not have anything to do with it.
-   */
+  /* Emit globalvalues now.  We must do this before the text psect is
+     defined, or we will get linker warnings about multiply defined
+     symbols.  All of the globalvalues "reference" psect 0, although
+     it really does not have anything to do with it.  */
   VMS_Emit_Globalvalues (text_siz, data_siz, Data_Segment);
-  /*
-   *   Define the Text Psect
-   */
+  /* Define the Text Psect.  */
   Text_Psect = Psect_Number++;
   VMS_Psect_Spec ("$code", text_siz, ps_TEXT, 0);
-  /*
-   *   Define the BSS Psect
-   */
+  /* Define the BSS Psect.  */
   if (bss_siz > 0)
     {
       Bss_Psect = Psect_Number++;
       VMS_Psect_Spec ("$uninitialized_data", bss_siz, ps_DATA, 0);
     }
-  /*
-   * Define symbols to the linker.
-   */
+  /* Define symbols to the linker.  */
   global_symbol_directory (text_siz, data_siz);
-  /*
-   *   Define the Data Psect
-   */
+  /* Define the Data Psect.  */
   if (data_siz > 0 && Local_Initd_Data_Size > 0)
     {
       Data_Psect = Psect_Number++;
       VMS_Psect_Spec ("$data", Local_Initd_Data_Size, ps_DATA, 0);
-      /*
-       * Local initialized data (N_DATA) symbols need to be updated to the
-       * proper value of Data_Psect now that it's actually been defined.
-       * (A dummy value was used in global_symbol_directory() above.)
-       */
+      /* Local initialized data (N_DATA) symbols need to be updated to the
+         proper value of Data_Psect now that it's actually been defined.
+         (A dummy value was used in global_symbol_directory() above.)  */
       for (vsp = VMS_Symbols; vsp; vsp = vsp->Next)
        if (vsp->Psect_Index < 0 && S_GET_RAW_TYPE (vsp->Symbol) == N_DATA)
          vsp->Psect_Index = Data_Psect;
     }
 
+  if (Ctors_Symbols != 0)
+    {
+      char *ps_name = "$ctors";
+      Ctors_Psect = Psect_Number++;
+      VMS_Psect_Spec (ps_name, Ctors_Symbols->Psect_Offset + XTOR_SIZE,
+                     ps_CTORS, 0);
+      VMS_Global_Symbol_Spec (ps_name, Ctors_Psect,
+                                 0, GBLSYM_DEF|GBLSYM_WEAK);
+      for (vsp = Ctors_Symbols; vsp; vsp = vsp->Next)
+       vsp->Psect_Index = Ctors_Psect;
+    }
 
-  /*******  Text Information and Relocation Records  *******/
+  if (Dtors_Symbols != 0)
+    {
+      char *ps_name = "$dtors";
+      Dtors_Psect = Psect_Number++;
+      VMS_Psect_Spec (ps_name, Dtors_Symbols->Psect_Offset + XTOR_SIZE,
+                     ps_DTORS, 0);
+      VMS_Global_Symbol_Spec (ps_name, Dtors_Psect,
+                                 0, GBLSYM_DEF|GBLSYM_WEAK);
+      for (vsp = Dtors_Symbols; vsp; vsp = vsp->Next)
+       vsp->Psect_Index = Dtors_Psect;
+    }
 
-  /*
-   *   Write the text segment data
-   */
+  /* Text Information and Relocation Records.  */
+
+  /* Write the text segment data.  */
   if (text_siz > 0)
     vms_fixup_text_section (text_siz, text_frag_root, data_frag_root);
-  /*
-   *   Write the data segment data, then discard it.
-   */
+  /* Write the data segment data, then discard it.  */
   if (data_siz > 0)
     {
       vms_fixup_data_section (data_siz, text_siz);
       free (Data_Segment),  Data_Segment = 0;
     }
 
+  if (Ctors_Symbols != 0)
+    vms_fixup_xtors_section (Ctors_Symbols, Ctors_Psect);
 
-  /*******  Debugger Symbol Table Records  *******/
+  if (Dtors_Symbols != 0)
+    vms_fixup_xtors_section (Dtors_Symbols, Dtors_Psect);
 
-  vms_build_DST (text_siz);
+  /* Debugger Symbol Table Records.  */
 
+  vms_build_DST (text_siz);
 
-  /*******  Wrap things up  *******/
+  /* Wrap things up.  */
 
-  /*
-   *   Write the End Of Module record
-   */
+  /* Write the End Of Module record.  */
   if (Entry_Point_Symbol)
     Write_VMS_EOM_Record (Text_Psect, S_GET_VALUE (Entry_Point_Symbol));
   else
     Write_VMS_EOM_Record (-1, (valueT) 0);
 
-  /*
-   *   All done, close the object file
-   */
+  /* All done, close the object file.  */
   Close_VMS_Object_File ();
 }
-
-/* end of obj-vms.c */