From 252b5132c753830d5fd56823373aed85f2a0db63 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 3 May 1999 07:29:11 +0000 Subject: 19990502 sourceware import --- gas/config/obj-som.c | 307 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 gas/config/obj-som.c (limited to 'gas/config/obj-som.c') diff --git a/gas/config/obj-som.c b/gas/config/obj-som.c new file mode 100644 index 0000000..80af18f --- /dev/null +++ b/gas/config/obj-som.c @@ -0,0 +1,307 @@ +/* SOM object file format. + Copyright (C) 1993, 1998 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, + or (at your option) any later version. + + GAS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + 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, 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 "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 () {} + +/* 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 (); +} + +/* Perform any initialization necessary for stabs support. + + For SOM we need to create the space which will contain the + two stabs subspaces. Additionally we need to set up the + space/subspace relationships and set space/subspace attributes + which BFD does not understand. */ + +void +obj_som_init_stab_section (seg) + segT seg; +{ + segT saved_seg = now_seg; + segT space; + subsegT saved_subseg = now_subseg; + char *p, *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. + + 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); + + /* 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); + + /* 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 + 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); + md_number_to_chars (p, stroff, 4); + seg_info (seg)->stabu.p = p; + + /* 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. */ + 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); + + 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; +{ + asection *strsec; + char *p; + int strsz, nsyms; + + if (strcmp ("$GDB_SYMBOLS$", sec->name)) + return; + + strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$"); + if (strsec) + strsz = bfd_section_size (abfd, strsec); + else + strsz = 0; + nsyms = bfd_section_size (abfd, sec) / 12 - 1; + + p = seg_info (sec)->stabu.p; + 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); +} + +/* 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 () +{ + bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0); +} -- cgit v1.1