* config/tc-mips.c (append_insn): Add jump address range overflow
[deliverable/binutils-gdb.git] / gas / config / obj-som.c
index 80beab33b5169686ad6e28d10ab0cdd84e5c8740..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}
 };
 
 static int version_seen = 0;
 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.  */
+
+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.  */
 
@@ -48,7 +135,7 @@ obj_som_version (unused)
 
   if (version_seen)
     {
-      as_bad ("Only one .version pseudo-op per file!");
+      as_bad (_("Only one .version pseudo-op per file!"));
       ignore_rest_of_line ();
       return;
     }
@@ -65,13 +152,19 @@ obj_som_version (unused)
     }
   else
     {
-      as_bad ("Expected quoted string");
+      as_bad (_("Expected quoted string"));
       ignore_rest_of_line ();
       return;
     }
 
   version_seen = 1;
-  bfd_som_attach_aux_hdr (stdoutput, VERSION_AUX_ID, version);
+  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 ();
 }
@@ -88,7 +181,7 @@ obj_som_copyright (unused)
 
   if (copyright_seen)
     {
-      as_bad ("Only one .copyright pseudo-op per file!");
+      as_bad (_("Only one .copyright pseudo-op per file!"));
       ignore_rest_of_line ();
       return;
     }
@@ -105,13 +198,19 @@ obj_som_copyright (unused)
     }
   else
     {
-      as_bad ("Expected quoted string");
+      as_bad (_("Expected quoted string"));
       ignore_rest_of_line ();
       return;
     }
 
   copyright_seen = 1;
-  bfd_som_attach_aux_hdr (stdoutput, COPYRIGHT_AUX_ID, copyright);
+  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 ();
 }
@@ -137,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
@@ -152,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);
@@ -206,24 +306,6 @@ adjust_stab_sections (abfd, sec, xxx)
   bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
 }
 
-#if 0
-/* Adjust the VMA address for each $CODE$ subspace.  */
-static void
-adjust_code_sections (abfd, sec, xxx)
-     bfd *abfd;
-     asection *sec;
-     PTR xxx;
-{
-  static unsigned size_so_far = 0;
-
-  if (strcmp (sec->name, "$CODE$"))
-    return;
-
-  bfd_set_section_vma (stdoutput, sec, size_so_far);
-  size_so_far += bfd_get_section_size_before_reloc (sec);
-}
-#endif
-
 /* Called late in the asssembly phase to adjust the special
    stab entry and to set the starting address for each code subspace.  */
 
@@ -231,8 +313,35 @@ 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
-  See comment in tc-hppa.c:pa_proc about GDB lossage
-  bfd_map_over_sections (stdoutput, adjust_code_sections, (PTR) 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.026247 seconds and 4 git commands to generate.