/* SOM object file format.
- Copyright (C) 1993 Free Software Foundation, Inc.
+ Copyright (C) 1993-2020 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;
}
}
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 ();
}
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;
}
}
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 ();
}
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;
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);
}
/* 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;
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}
+};