* config/tc-m68k.c (md_apply_fix3): Change val back to a signed type.
[deliverable/binutils-gdb.git] / gas / config / obj-som.c
index fd8943a9bcdcc8211ffc3ab61158189e520d3d8b..b7e3f0fc1fab98d85b81876d927cfd4072ec744d 100644 (file)
@@ -1,5 +1,5 @@
 /* SOM object file format.
-   Copyright (C) 1993 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1998, 2000 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    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, 675 Mass Ave, Cambridge, MA 02139, 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 the Center for Software Science at the University of Utah
    and by Cygnus Support.  */
 #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}
 };
 
-/* Handle a .version directive.  FIXME.  We just parse the .version
-   directive and throw away the results!.  */
+static int version_seen = 0;
+static int copyright_seen = 0;
+static int compiler_seen = 0;
+
+/* Unused by SOM.  */
 
 void
-obj_som_version (unused)
+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.  */
+
+void
+obj_som_compiler (unused)
      int unused;
 {
+  char *buf;
+  char c;
+  char *filename;
+  char *language_name;
+  char *p;
+  char *version_id;
+
+  if (compiler_seen)
+    {
+      as_bad ("Only one .compiler pseudo-op per file!");
+      ignore_rest_of_line ();
+      return;
+    }
+
   SKIP_WHITESPACE ();
   if (*input_line_pointer == '\"')
     {
+      buf = input_line_pointer;
       ++input_line_pointer;
       while (is_a_char (next_char_of_string ()))
        ;
+      c = *input_line_pointer;
+      *input_line_pointer = '\000';
     }
   else
     {
       as_bad ("Expected quoted string");
+      ignore_rest_of_line ();
+      return;
+    }
+
+  /* Parse the quoted string into its component parts.  Skip the
+     quote.  */
+  filename = buf + 1;
+  p = filename;
+  while (*p != ' ' && *p != '\000')
+    p++;
+  if (*p == '\000')
+    {
+      as_bad (".compiler directive missing language and version");
+      return;
+    }
+  *p = '\000';
+
+  language_name = ++p;
+  while (*p != ' ' && *p != '\000')
+    p++;
+  if (*p == '\000')
+    {
+      as_bad (".compiler directive missing version");
+      return;
+    }
+  *p = '\000';
+
+  version_id = ++p;
+  while (*p != '\000')
+    p++;
+  /* Remove the trailing quote.  */
+  *(--p) = '\000';
+
+  compiler_seen = 1;
+  if (! bfd_som_attach_compilation_unit (stdoutput, filename, language_name,
+                                        "GNU Tools", version_id))
+    {
+      bfd_perror (stdoutput->filename);
+      as_fatal ("FATAL: Attaching compiler header %s", stdoutput->filename);
     }
+  *input_line_pointer = c;
+  demand_empty_rest_of_line ();
+}
+
+/* Handle a .version directive.  */
+
+void
+obj_som_version (unused)
+     int unused;
+{
+  char *version, c;
+
+  if (version_seen)
+    {
+      as_bad (_("Only one .version pseudo-op per file!"));
+      ignore_rest_of_line ();
+      return;
+    }
+
+  SKIP_WHITESPACE ();
+  if (*input_line_pointer == '\"')
+    {
+      version = input_line_pointer;
+      ++input_line_pointer;
+      while (is_a_char (next_char_of_string ()))
+       ;
+      c = *input_line_pointer;
+      *input_line_pointer = '\000';
+    }
+  else
+    {
+      as_bad (_("Expected quoted string"));
+      ignore_rest_of_line ();
+      return;
+    }
+
+  version_seen = 1;
+  if (bfd_som_attach_aux_hdr (stdoutput, VERSION_AUX_ID, version) == false)
+    {
+      bfd_perror (stdoutput->filename);
+      as_perror (_("FATAL: Attaching version header %s"),
+                stdoutput->filename);
+      exit (EXIT_FAILURE);
+    }
+  *input_line_pointer = c;
+  demand_empty_rest_of_line ();
+}
+
+/* Handle a .copyright directive.   This probably isn't complete, but
+   it's of dubious value anyway and (IMHO) not worth the time to finish.
+   If you care about copyright strings that much, you fix it.  */
+
+void
+obj_som_copyright (unused)
+     int unused;
+{
+  char *copyright, c;
+
+  if (copyright_seen)
+    {
+      as_bad (_("Only one .copyright pseudo-op per file!"));
+      ignore_rest_of_line ();
+      return;
+    }
+
+  SKIP_WHITESPACE ();
+  if (*input_line_pointer == '\"')
+    {
+      copyright = input_line_pointer;
+      ++input_line_pointer;
+      while (is_a_char (next_char_of_string ()))
+       ;
+      c = *input_line_pointer;
+      *input_line_pointer = '\000';
+    }
+  else
+    {
+      as_bad (_("Expected quoted string"));
+      ignore_rest_of_line ();
+      return;
+    }
+
+  copyright_seen = 1;
+  if (bfd_som_attach_aux_hdr (stdoutput, COPYRIGHT_AUX_ID, copyright) == false)
+    {
+      bfd_perror (stdoutput->filename);
+      as_perror (_("FATAL: Attaching copyright header %s"),
+                stdoutput->filename);
+      exit (EXIT_FAILURE);
+    }
+  *input_line_pointer = c;
   demand_empty_rest_of_line ();
 }
 
@@ -74,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
@@ -89,14 +251,15 @@ obj_som_init_stab_section (seg)
   obj_set_subsection_attributes (seg, space, 0x1f, 73, 0);
   bfd_set_section_alignment (stdoutput, seg, 2);
 
-  /* Make some space for the first stab entry which is special.
+  /* 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
      the call to get_stab_string_offset.  */
   p = frag_more (12);
+  memset (p, 0, 12);
   as_where (&file, (unsigned int *) NULL);
   stroff = get_stab_string_offset (file, "$GDB_STRINGS$");
   know (stroff == 1);
@@ -144,11 +307,41 @@ adjust_stab_sections (abfd, sec, xxx)
 }
 
 /* Called late in the asssembly phase to adjust the special
-   stab entry.  This is where any other late object-file dependent
-   processing which should happen.  */
+   stab entry and to set the starting address for each code subspace.  */
 
 void
 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 ();
+}
This page took 0.026861 seconds and 4 git commands to generate.