* som.c (struct som_misc_symbol_info): Add is_comdat, is_common and
[binutils-gdb.git] / gas / config / obj-som.c
index 80af18fd37b3ec4651bc9e3c13923d5eba1c14e1..a736c9658ead6130f13ec9eaa68c8645caf0f7cb 100644 (file)
@@ -1,5 +1,5 @@
 /* SOM object file format.
-   Copyright (C) 1993, 1998 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1998, 2000, 2002 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
 #include "aout/stab_gnu.h"
 #include "obstack.h"
 
-/* SOM does not need any pseudo-ops.  */
+static void obj_som_weak PARAMS ((int));
 
 const pseudo_typeS obj_pseudo_table[] =
 {
-  {NULL}
+  {"weak", obj_som_weak, 0},
+  {NULL, NULL, 0}
 };
 
 static int version_seen = 0;
@@ -38,12 +39,16 @@ static int copyright_seen = 0;
 static int compiler_seen = 0;
 
 /* Unused by SOM.  */
-void obj_read_begin_hook () {}
+
+void
+obj_read_begin_hook ()
+{
+}
 
 /* Handle a .compiler directive.   This is intended to create the
    compilation unit auxiliary header for MPE such that the linkeditor
    can handle SOM extraction from archives. The format of the quoted
-   string is "sourcefile language version" and is delimited by blanks.*/
+   string is "sourcefile language version" and is delimited by blanks.  */
 
 void
 obj_som_compiler (unused)
@@ -93,8 +98,9 @@ obj_som_compiler (unused)
     }
   *p = '\000';
 
-  language_name        = ++p;
-  while (*p != ' ' && *p != '\000') p++;
+  language_name = ++p;
+  while (*p != ' ' && *p != '\000')
+    p++;
   if (*p == '\000')
     {
       as_bad (".compiler directive missing version");
@@ -102,8 +108,9 @@ obj_som_compiler (unused)
     }
   *p = '\000';
 
-  version_id   = ++p;
-  while (*p != '\000') p++;
+  version_id = ++p;
+  while (*p != '\000')
+    p++;
   /* Remove the trailing quote.  */
   *(--p) = '\000';
 
@@ -151,10 +158,11 @@ obj_som_version (unused)
     }
 
   version_seen = 1;
-  if (bfd_som_attach_aux_hdr (stdoutput, VERSION_AUX_ID, version) == false)
+  if (!bfd_som_attach_aux_hdr (stdoutput, VERSION_AUX_ID, version))
     {
       bfd_perror (stdoutput->filename);
-      as_perror (_("FATAL: Attaching version header %s"), stdoutput->filename);
+      as_perror (_("FATAL: Attaching version header %s"),
+                stdoutput->filename);
       exit (EXIT_FAILURE);
     }
   *input_line_pointer = c;
@@ -196,10 +204,11 @@ obj_som_copyright (unused)
     }
 
   copyright_seen = 1;
-  if (bfd_som_attach_aux_hdr (stdoutput, COPYRIGHT_AUX_ID, copyright) == false)
+  if (!bfd_som_attach_aux_hdr (stdoutput, COPYRIGHT_AUX_ID, copyright))
     {
       bfd_perror (stdoutput->filename);
-      as_perror (_("FATAL: Attaching copyright header %s"), stdoutput->filename);
+      as_perror (_("FATAL: Attaching copyright header %s"),
+                stdoutput->filename);
       exit (EXIT_FAILURE);
     }
   *input_line_pointer = c;
@@ -227,7 +236,7 @@ obj_som_init_stab_section (seg)
   space = bfd_make_section_old_way (stdoutput, "$GDB_DEBUG$");
 
   /* Set SOM specific attributes for the space.  In particular we set
-     the space "defined", "private", "sort_key", and "spnum" values. 
+     the space "defined", "private", "sort_key", and "spnum" values.
 
      Due to a bug in pxdb (called by hpux linker), the sort keys
      of the various stabs spaces/subspaces need to be "small".  We
@@ -239,12 +248,12 @@ obj_som_init_stab_section (seg)
      (just created above).  Also set some attributes which BFD does
      not understand.  In particular, access bits, sort keys, and load
      quadrant.  */
-  obj_set_subsection_attributes (seg, space, 0x1f, 73, 0);
+  obj_set_subsection_attributes (seg, space, 0x1f, 73, 0, 0, 0, 0);
   bfd_set_section_alignment (stdoutput, seg, 2);
 
   /* Make some space for the first special stab entry and zero the memory.
      It contains information about the length of this file's
-     stab string and the like.  Using it avoids the need to 
+     stab string and the like.  Using it avoids the need to
      relocate the stab strings.
 
      The $GDB_STRINGS$ space will be created as a side effect of
@@ -262,7 +271,7 @@ obj_som_init_stab_section (seg)
      not understand.  In particular, access bits, sort keys, and load
      quadrant.  */
   seg = bfd_get_section_by_name (stdoutput, "$GDB_STRINGS$");
-  obj_set_subsection_attributes (seg, space, 0x1f, 72, 0);
+  obj_set_subsection_attributes (seg, space, 0x1f, 72, 0, 0, 0, 0);
   bfd_set_section_alignment (stdoutput, seg, 2);
 
   subseg_set (saved_seg, saved_subseg);
@@ -297,7 +306,7 @@ adjust_stab_sections (abfd, sec, xxx)
   bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
 }
 
-/* Called late in the asssembly phase to adjust the special
+/* Called late in the assembly phase to adjust the special
    stab entry and to set the starting address for each code subspace.  */
 
 void
@@ -305,3 +314,34 @@ som_frob_file ()
 {
   bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0);
 }
+
+static void
+obj_som_weak (ignore)
+     int ignore ATTRIBUTE_UNUSED;
+{
+  char *name;
+  int c;
+  symbolS *symbolP;
+
+  do
+    {
+      name = input_line_pointer;
+      c = get_symbol_end ();
+      symbolP = symbol_find_or_make (name);
+      *input_line_pointer = c;
+      SKIP_WHITESPACE ();
+      S_SET_WEAK (symbolP);
+#if 0
+      symbol_get_obj (symbolP)->local = 1;
+#endif
+      if (c == ',')
+       {
+         input_line_pointer++;
+         SKIP_WHITESPACE ();
+         if (*input_line_pointer == '\n')
+           c = '\n';
+       }
+    }
+  while (c == ',');
+  demand_empty_rest_of_line ();
+}