X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fconfig%2Fobj-som.c;h=a736c9658ead6130f13ec9eaa68c8645caf0f7cb;hb=351e2b5aa7a71258e6b682ac1a3228964de8d22c;hp=fd8943a9bcdcc8211ffc3ab61158189e520d3d8b;hpb=42ecb40985feacfd0eaa23d6a049d1e9e188093e;p=binutils-gdb.git diff --git a/gas/config/obj-som.c b/gas/config/obj-som.c index fd8943a9bcd..a736c9658ea 100644 --- a/gas/config/obj-som.c +++ b/gas/config/obj-som.c @@ -1,5 +1,5 @@ /* SOM object file format. - Copyright (C) 1993 Free Software Foundation, Inc. + Copyright 1993, 1994, 1998, 2000, 2002 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -13,9 +13,10 @@ 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. */ @@ -25,31 +26,192 @@ #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)) + { + 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)) + { + 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 @@ -86,17 +248,18 @@ 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 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); @@ -108,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); @@ -143,12 +306,42 @@ 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 - stab entry. This is where any other late object-file dependent - processing which should happen. */ +/* 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 () { 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 (); +}