bfd_section_* macros
[deliverable/binutils-gdb.git] / gas / config / obj-som.c
index 80beab33b5169686ad6e28d10ab0cdd84e5c8740..20213b8b327c03fcbecb6be46f02e7c3b6223819 100644 (file)
@@ -1,11 +1,11 @@
 /* SOM object file format.
-   Copyright (C) 1993 Free Software Foundation, Inc.
+   Copyright (C) 1993-2019 Free Software Foundation, Inc.
 
    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,
+   published by the Free Software Foundation; either version 3,
    or (at your option) any later version.
 
    GAS is distributed in the hope that it will be useful, but
    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, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.
 
    Written by the Center for Software Science at the University of Utah
    and by Cygnus Support.  */
 #include "as.h"
 #include "subsegs.h"
 #include "aout/stab_gnu.h"
-#include "obstack.h"
-
-/* SOM does not need any pseudo-ops.  */
-
-const pseudo_typeS obj_pseudo_table[] =
-{
-  {NULL}
-};
 
 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 (void)
+{
+}
+
+/* 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 (int unused ATTRIBUTE_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;
+obj_som_version (int unused ATTRIBUTE_UNUSED)
 {
   char *version, c;
 
   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 +141,16 @@ 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))
+    as_fatal (_("attaching version header %s: %s"),
+             stdoutput->filename, bfd_errmsg (bfd_get_error ()));
+
   *input_line_pointer = c;
   demand_empty_rest_of_line ();
 }
@@ -81,14 +160,13 @@ obj_som_version (unused)
    If you care about copyright strings that much, you fix it.  */
 
 void
-obj_som_copyright (unused)
-     int unused;
+obj_som_copyright (int unused ATTRIBUTE_UNUSED)
 {
   char *copyright, c;
 
   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 +183,16 @@ 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))
+    as_fatal (_("attaching copyright header %s: %s"),
+             stdoutput->filename, bfd_errmsg (bfd_get_error ()));
+
   *input_line_pointer = c;
   demand_empty_rest_of_line ();
 }
@@ -124,44 +205,45 @@ obj_som_copyright (unused)
    which BFD does not understand.  */
 
 void
-obj_som_init_stab_section (seg)
-     segT seg;
+obj_som_init_stab_section (segT seg)
 {
   segT saved_seg = now_seg;
   segT space;
   subsegT saved_subseg = now_subseg;
-  char *p, *file;
+  char *p;
+ const char * file;
   unsigned int stroff;
 
   /* Make the space which will contain the debug subspaces.  */
   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
      reserve range 72/73 which appear to work well.  */
   obj_set_section_attributes (space, 1, 1, 72, 2);
-  bfd_set_section_alignment (stdoutput, space, 2);
+  bfd_set_section_alignment (space, 2);
 
   /* Set the containing space for both stab sections to be $GDB_DEBUG$
      (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);
-  bfd_set_section_alignment (stdoutput, seg, 2);
+  obj_set_subsection_attributes (seg, space, 0x1f, 73, 0, 0, 0, 0);
+  bfd_set_section_alignment (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);
-  as_where (&file, (unsigned int *) NULL);
-  stroff = get_stab_string_offset (file, "$GDB_STRINGS$");
+  memset (p, 0, 12);
+  file = as_where ((unsigned int *) NULL);
+  stroff = get_stab_string_offset (file, "$GDB_STRINGS$", FALSE);
   know (stroff == 1);
   md_number_to_chars (p, stroff, 4);
   seg_info (seg)->stabu.p = p;
@@ -171,8 +253,8 @@ 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);
-  bfd_set_section_alignment (stdoutput, seg, 2);
+  obj_set_subsection_attributes (seg, space, 0x1f, 72, 0, 0, 0, 0);
+  bfd_set_section_alignment (seg, 2);
 
   subseg_set (saved_seg, saved_subseg);
 }
@@ -180,10 +262,7 @@ obj_som_init_stab_section (seg)
 /* Fill in the counts in the first entry in a .stabs section.  */
 
 static void
-adjust_stab_sections (abfd, sec, xxx)
-     bfd *abfd;
-     asection *sec;
-     PTR xxx;
+adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
 {
   asection *strsec;
   char *p;
@@ -194,45 +273,55 @@ adjust_stab_sections (abfd, sec, xxx)
 
   strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$");
   if (strsec)
-    strsz = bfd_section_size (abfd, strsec);
+    strsz = bfd_section_size (strsec);
   else
     strsz = 0;
-  nsyms = bfd_section_size (abfd, sec) / 12 - 1;
+  nsyms = bfd_section_size (sec) / 12 - 1;
 
   p = seg_info (sec)->stabu.p;
-  assert (p != 0);
+  gas_assert (p != 0);
 
   bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
   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;
+/* Called late in the assembly phase to adjust the special
+   stab entry and to set the starting address for each code subspace.  */
+
+void
+som_frob_file (void)
 {
-  static unsigned size_so_far = 0;
+  bfd_map_over_sections (stdoutput, adjust_stab_sections, (void *) 0);
+}
 
-  if (strcmp (sec->name, "$CODE$"))
-    return;
+static void
+obj_som_weak (int ignore ATTRIBUTE_UNUSED)
+{
+  char *name;
+  int c;
+  symbolS *symbolP;
 
-  bfd_set_section_vma (stdoutput, sec, size_so_far);
-  size_so_far += bfd_get_section_size_before_reloc (sec);
+  do
+    {
+      c = get_symbol_name (&name);
+      symbolP = symbol_find_or_make (name);
+      *input_line_pointer = c;
+      SKIP_WHITESPACE_AFTER_NAME ();
+      S_SET_WEAK (symbolP);
+      if (c == ',')
+       {
+         input_line_pointer++;
+         SKIP_WHITESPACE ();
+         if (*input_line_pointer == '\n')
+           c = '\n';
+       }
+    }
+  while (c == ',');
+  demand_empty_rest_of_line ();
 }
-#endif
-
-/* Called late in the asssembly phase to adjust the special
-   stab entry and to set the starting address for each code subspace.  */
 
-void
-som_frob_file ()
+const pseudo_typeS obj_pseudo_table[] =
 {
-  bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0);
-#if 0
-  See comment in tc-hppa.c:pa_proc about GDB lossage
-  bfd_map_over_sections (stdoutput, adjust_code_sections, (PTR) 0);
-#endif
-}
+  {"weak", obj_som_weak, 0},
+  {NULL, NULL, 0}
+};
This page took 0.031241 seconds and 4 git commands to generate.