more vms changes
authorKen Raeburn <raeburn@cygnus>
Fri, 28 Jul 1995 00:45:53 +0000 (00:45 +0000)
committerKen Raeburn <raeburn@cygnus>
Fri, 28 Jul 1995 00:45:53 +0000 (00:45 +0000)
gas/ChangeLog
gas/config/obj-vms.c
gas/config/obj-vms.h

index 0847b101a57476cf5f2c3497321f64201e688019..681ba543266b08981152c76b6319f957b0de4eb3 100644 (file)
@@ -1,3 +1,19 @@
+Thu Jul 27 16:14:56 1995  Pat Rankin  <rankin@eql.caltech.edu>
+
+       * config/obj-vms.c (enum ps_type {ps_TEXT,ps_DATA,ps_COMMON,
+       ps_CONST}): New constants.
+       (VMS_Psect_Spec): Use them instead of literal strings.
+       (vms_write_object_file, global_symbol_directory): Adjust callers.
+
+Wed Jul 26 18:31:35 1995  Pat Rankin  <rankin@eql.caltech.edu>
+
+       * config/obj-vms.c (const_flag): Change from char to unsigned char.
+       * config/obj-vms.h (const_flag): Ditto.
+       (struct nlist): Replace union n_un and n_un.{n_name,n_next,n_strx}
+       fields with just n_name; delete field n_value; change n_other from
+       char to unsigned char and n_desc from short to int; insert explicit
+       padding for alignment.
+
 Mon Jul 24 20:06:17 1995  Ken Raeburn  <raeburn@cygnus.com>
 
        * subsegs.h (struct seg_info_trash): Make bitfield types valid.
@@ -6,6 +22,16 @@ Mon Jul 24 20:06:17 1995  Ken Raeburn  <raeburn@cygnus.com>
        be declared register since its address is taken for
        MD_APPLY_FIX3.
 
+       Fri Jul 21 15:28:18 1995  Pat Rankin  <rankin@eql.caltech.edu>
+
+       Split huge vms_write_object_file routine into managable pieces.
+
+       * config/obj-vms.c (vms_fixup_text_section, synthesize_data_segment,
+       vms_fixup_data_section, global_symbol_directory, local_symbols_DST,
+       vms_build_DST): New routines.
+       (vms_write_object_file): Call them.
+       (struct vms_obj_state): New file scope variable used by the above.
+
 Mon Jul 24 14:10:24 1995  Ian Lance Taylor  <ian@cygnus.com>
 
        * config/tc-sh.c (md_pseudo_table): Add "uses".
index 72ae2e4c1dae7d96190d06c01b073bf9ed2a3ba0..31a8c24cd8b88742b7e9c1ae7f7ef1bf847f7a5b 100644 (file)
@@ -100,6 +100,15 @@ 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().
+ */
+enum ps_type
+{
+  ps_TEXT, ps_DATA, ps_COMMON, ps_CONST
+};
+
 /*
  * This enum is used to keep track of the various types of variables that
  * may be present.
@@ -342,7 +351,7 @@ 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,const char *,
+static int VMS_Psect_Spec PARAMS ((const char *,int,enum ps_type,
                                   struct VMS_Symbol *));
 static int VMS_Initialized_Data_Size PARAMS ((symbolS *,int));
 
@@ -410,7 +419,7 @@ static void vms_build_DST PARAMS ((unsigned));
  *  use with VMS.
  */
 
-char const_flag = IN_DEFAULT_SECTION;
+unsigned char const_flag = IN_DEFAULT_SECTION;
 
 static void
 s_const (arg)
@@ -3835,7 +3844,7 @@ static int
 VMS_Psect_Spec (Name, Size, Type, vsp)
      const char *Name;
      int Size;
-     const char *Type;
+     enum ps_type Type;
      struct VMS_Symbol *vsp;
 {
   char Local[32];
@@ -3844,45 +3853,31 @@ VMS_Psect_Spec (Name, Size, Type, vsp)
   /*
    *   Generate the appropriate PSECT flags given the PSECT type
    */
-  if (strcmp (Type, "COMMON") == 0)
-    {
-      /*
-       *       Common block psects are:  PIC,OVR,REL,GBL,SHR,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);
-    }
-  else if (strcmp (Type, "CONST") == 0)
-    {
-      /*
-       *       Common block psects are:  PIC,OVR,REL,GBL,SHR,RD
-       */
-      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);
-    }
-  else if (strcmp (Type, "DATA") == 0)
-    {
-      /*
-       *       The Data psects are PIC,REL,RD,WRT
-       */
-      Psect_Attributes =
-       (GPS_S_M_PIC | GPS_S_M_REL | GPS_S_M_RD | GPS_S_M_WRT);
-    }
-  else if (strcmp (Type, "TEXT") == 0)
-    {
-      /*
-       *       The Text psects are PIC,REL,SHR,EXE,RD
-       */
-      Psect_Attributes =
-       (GPS_S_M_PIC | GPS_S_M_REL | GPS_S_M_SHR |
-        GPS_S_M_EXE | GPS_S_M_RD);
-    }
-  else
+  switch (Type)
     {
-      /*
-       *       Error: Unknown psect type
-       */
-      error ("Unknown VMS psect type");
+    case ps_TEXT:
+      /* 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. */
+      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. */
+      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);
+      break;
+    case ps_CONST:
+      /* Const data psects are:  PIC,OVR,REL,GBL,SHR,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);
+      break;
+    default:
+      /* impossible */
+      error ("Unknown VMS psect type (%ld)", (long) Type);
+      break;
     }
   /*
    *   Modify the psect attributes according to any attribute string
@@ -5051,7 +5046,7 @@ global_symbol_directory (text_siz, data_siz)
          /* Make the psect for this data.  */
          Globalref = VMS_Psect_Spec (S_GET_NAME (sp),
                                      vsp->Size,
-                                     S_GET_OTHER (sp) ? "CONST" : "COMMON",
+                                     S_GET_OTHER (sp) ? ps_CONST : ps_COMMON,
                                      vsp);
          if (Globalref)
            Psect_Number--;
@@ -5094,7 +5089,7 @@ global_symbol_directory (text_siz, data_siz)
          /* Make its psect.  */
          Globalref = VMS_Psect_Spec (S_GET_NAME (sp),
                                      vsp->Size,
-                                     S_GET_OTHER (sp) ? "CONST" : "COMMON",
+                                     S_GET_OTHER (sp) ? ps_CONST : ps_COMMON,
                                      vsp);
          if (Globalref)
            Psect_Number--;
@@ -5605,14 +5600,14 @@ vms_write_object_file (text_siz, data_siz, bss_siz, text_frag_root,
    *   Define the Text Psect
    */
   Text_Psect = Psect_Number++;
-  VMS_Psect_Spec ("$code", text_siz, "TEXT", 0);
+  VMS_Psect_Spec ("$code", text_siz, ps_TEXT, 0);
   /*
    *   Define the BSS Psect
    */
   if (bss_siz > 0)
     {
       Bss_Psect = Psect_Number++;
-      VMS_Psect_Spec ("$uninitialized_data", bss_siz, "DATA", 0);
+      VMS_Psect_Spec ("$uninitialized_data", bss_siz, ps_DATA, 0);
     }
   /*
    * Define symbols to the linker.
@@ -5624,7 +5619,7 @@ vms_write_object_file (text_siz, data_siz, bss_siz, text_frag_root,
   if (data_siz > 0 && Local_Initd_Data_Size > 0)
     {
       Data_Psect = Psect_Number++;
-      VMS_Psect_Spec ("$data", Local_Initd_Data_Size, "DATA", 0);
+      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.
index 34aa4a2b7898b36d1968007b212f20202db1a1b5..88f7155a2456d199846866243f1fd0cceb636822 100644 (file)
@@ -35,7 +35,7 @@ to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1
    data section.  By and large they are identical, but we set a no-write
    bit for psects in the const section.  */
 
-extern char const_flag;
+extern unsigned char const_flag;
 
 /* This is overloaded onto const_flag, for convenience.  It's used to flag
    dummy labels like "gcc2_compiled."  which occur before the first .text
@@ -81,27 +81,21 @@ typedef struct
     struct exec header;                /* a.out header */
     long string_table_size;    /* names + '\0' + sizeof(int) */
   }
-
 object_headers;
 
 /* A single entry in the symbol table
+ * (this started as a clone of bout.h's nlist, but much was unneeded).
  */
 struct nlist
   {
-    union
-      {
-       char *n_name;
-       struct nlist *n_next;
-       long n_strx;            /* Index into string table      */
-      }
-    n_un;
+    char *n_name;
     unsigned char n_type;      /* See below                            */
-    char n_other;              /* Used in i80960 support -- see below  */
-    short n_desc;
-    unsigned long n_value;
+    unsigned char n_other;     /* used for const_flag and "default section" */
+    unsigned   : 16;           /* padding for alignment */
+    int n_desc;                        /* source line number for N_SLINE stabs */
   };
 
-/* Legal values of n_type
+/* Legal values of n_type (see aout/stab.def for the majority of the codes).
  */
 #define N_UNDF 0               /* Undefined symbol     */
 #define N_ABS  2               /* Absolute symbol      */
@@ -156,9 +150,9 @@ typedef struct nlist obj_symbol_type;       /* Symbol table entry */
 
 /* Accessors */
 /* The name of the symbol */
-#define S_GET_NAME(s)          ((s)->sy_symbol.n_un.n_name)
+#define S_GET_NAME(s)          ((s)->sy_symbol.n_name)
 /* The pointer to the string table */
-#define S_GET_OFFSET(s)                ((s)->sy_symbol.n_un.n_strx)
+#define S_GET_OFFSET(s)                ((s)->sy_name_offset)
 /* The raw type of the symbol */
 #define S_GET_RAW_TYPE(s)              ((s)->sy_symbol.n_type)
 /* The type of the symbol */
@@ -179,9 +173,9 @@ typedef struct nlist obj_symbol_type;       /* Symbol table entry */
 /* The symbol is not external */
 #define S_CLEAR_EXTERNAL(s)    ((s)->sy_symbol.n_type &= ~N_EXT)
 /* Set the name of the symbol */
-#define S_SET_NAME(s,v)                ((s)->sy_symbol.n_un.n_name = (v))
+#define S_SET_NAME(s,v)                ((s)->sy_symbol.n_name = (v))
 /* Set the offset in the string table */
-#define S_SET_OFFSET(s,v)      ((s)->sy_symbol.n_un.n_strx = (v))
+#define S_SET_OFFSET(s,v)      ((s)->sy_name_offset = (v))
 /* Set the n_other expression value */
 #define S_SET_OTHER(s,v)       ((s)->sy_symbol.n_other = (v))
 /* Set the n_desc expression value */