armcoff.em revision 104834
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
3cat >e${EMULATION_NAME}.c <<EOF
4/* This file is is generated by a shell script.  DO NOT EDIT! */
5
6/* emulate the original gld for the given ${EMULATION_NAME}
7   Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002
8   Free Software Foundation, Inc.
9   Written by Steve Chamberlain steve@cygnus.com
10
11This file is part of GLD, the Gnu Linker.
12
13This program is free software; you can redistribute it and/or modify
14it under the terms of the GNU General Public License as published by
15the Free Software Foundation; either version 2 of the License, or
16(at your option) any later version.
17
18This program is distributed in the hope that it will be useful,
19but WITHOUT ANY WARRANTY; without even the implied warranty of
20MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21GNU General Public License for more details.
22
23You should have received a copy of the GNU General Public License
24along with this program; if not, write to the Free Software
25Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
26
27#define TARGET_IS_${EMULATION_NAME}
28
29#include "bfd.h"
30#include "sysdep.h"
31#include "bfdlink.h"
32#include "getopt.h"
33
34#include "ld.h"
35#include "ldmain.h"
36#include "ldmisc.h"
37
38#include "ldexp.h"
39#include "ldlang.h"
40#include "ldfile.h"
41#include "ldemul.h"
42
43static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
44static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
45static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
46static int  gld${EMULATION_NAME}_parse_args PARAMS((int, char **));
47static void gld${EMULATION_NAME}_list_options PARAMS ((FILE *));
48static void gld${EMULATION_NAME}_finish PARAMS ((void));
49static void gld${EMULATION_NAME}_after_open PARAMS ((void));
50
51/* If true, then interworking stubs which support calls to old, non-interworking
52   aware ARM code should be generated.  */
53
54static int support_old_code = 0;
55static char * thumb_entry_symbol = NULL;
56
57#define OPTION_SUPPORT_OLD_CODE		300
58#define OPTION_THUMB_ENTRY		301
59
60static struct option longopts[] =
61{
62  {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
63  {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
64  {NULL, no_argument, NULL, 0}
65};
66
67static void
68gld${EMULATION_NAME}_list_options (file)
69     FILE * file;
70{
71  fprintf (file, _("  --support-old-code   Support interworking with old code\n"));
72  fprintf (file, _("  --thumb-entry=<sym>  Set the entry point to be Thumb symbol <sym>\n"));
73}
74
75static int
76gld${EMULATION_NAME}_parse_args (argc, argv)
77     int     argc;
78     char ** argv;
79{
80  int        longind;
81  int        optc;
82  int        prevoptind = optind;
83  int        prevopterr = opterr;
84  int        wanterror;
85  static int lastoptind = -1;
86
87  if (lastoptind != optind)
88    opterr = 0;
89  
90  wanterror  = opterr;
91  lastoptind = optind;
92
93  optc   = getopt_long_only (argc, argv, "-", longopts, & longind);
94  opterr = prevopterr;
95
96  switch (optc)
97    {
98    default:
99      if (wanterror)
100	xexit (1);
101      optind =  prevoptind;
102      return 0;
103
104    case OPTION_SUPPORT_OLD_CODE:
105      support_old_code = 1;
106      break;
107
108    case OPTION_THUMB_ENTRY:
109      thumb_entry_symbol = optarg;
110      break;
111    }
112  
113  return 1;
114}
115
116static void
117gld${EMULATION_NAME}_before_parse ()
118{
119#ifndef TARGET_			/* I.e., if not generic.  */
120  ldfile_set_output_arch ("`echo ${ARCH}`");
121#endif /* not TARGET_ */
122}
123
124/* This is called after the sections have been attached to output
125   sections, but before any sizes or addresses have been set.  */
126
127static void
128gld${EMULATION_NAME}_before_allocation ()
129{
130  /* we should be able to set the size of the interworking stub section */
131
132  /* Here we rummage through the found bfds to collect glue information */
133  /* FIXME: should this be based on a command line option? krk@cygnus.com */
134  {
135    LANG_FOR_EACH_INPUT_STATEMENT (is)
136      {
137	if (! bfd_arm_process_before_allocation
138	    (is->the_bfd, & link_info, support_old_code))
139	  {
140	    /* xgettext:c-format */
141	    einfo (_("Errors encountered processing file %s"), is->filename);
142	  }
143      }
144  }
145
146  /* We have seen it all. Allocate it, and carry on */
147  bfd_arm_allocate_interworking_sections (& link_info);
148}
149
150static void
151gld${EMULATION_NAME}_after_open ()
152{
153  if (strstr (bfd_get_target (output_bfd), "arm") == NULL)
154    {
155      /* The arm backend needs special fields in the output hash structure.
156	 These will only be created if the output format is an arm format,
157	 hence we do not support linking and changing output formats at the
158	 same time.  Use a link followed by objcopy to change output formats.  */
159      einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
160      return;
161    }
162  
163  {
164    LANG_FOR_EACH_INPUT_STATEMENT (is)
165      {
166	if (bfd_arm_get_bfd_for_interworking (is->the_bfd, & link_info))
167	  break;
168      }
169  }
170}
171
172static void
173gld${EMULATION_NAME}_finish PARAMS((void))
174{
175  struct bfd_link_hash_entry * h;
176
177  if (thumb_entry_symbol == NULL)
178    return;
179  
180  h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, false, false, true);
181
182  if (h != (struct bfd_link_hash_entry *) NULL
183      && (h->type == bfd_link_hash_defined
184	  || h->type == bfd_link_hash_defweak)
185      && h->u.def.section->output_section != NULL)
186    {
187      static char buffer[32];
188      bfd_vma val;
189      
190      /* Special procesing is required for a Thumb entry symbol.  The
191	 bottom bit of its address must be set.  */
192      val = (h->u.def.value
193	     + bfd_get_section_vma (output_bfd,
194				    h->u.def.section->output_section)
195	     + h->u.def.section->output_offset);
196      
197      val |= 1;
198
199      /* Now convert this value into a string and store it in entry_symbol
200         where the lang_finish() function will pick it up.  */
201      buffer[0] = '0';
202      buffer[1] = 'x';
203      
204      sprintf_vma (buffer + 2, val);
205
206      if (entry_symbol.name != NULL && entry_from_cmdline)
207	einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
208	       thumb_entry_symbol, entry_symbol.name);
209      entry_symbol.name = buffer;
210    }
211  else
212    einfo (_("%P: warning: connot find thumb start symbol %s\n"), thumb_entry_symbol);
213}
214
215static char *
216gld${EMULATION_NAME}_get_script (isfile)
217     int *isfile;
218EOF
219
220if test -n "$COMPILE_IN"
221then
222# Scripts compiled in.
223
224# sed commands to quote an ld script as a C string.
225sc="-f stringify.sed"
226
227cat >>e${EMULATION_NAME}.c <<EOF
228{			     
229  *isfile = 0;
230
231  if (link_info.relocateable == true && config.build_constructors == true)
232    return
233EOF
234sed $sc ldscripts/${EMULATION_NAME}.xu                     >> e${EMULATION_NAME}.c
235echo '  ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
236sed $sc ldscripts/${EMULATION_NAME}.xr                     >> e${EMULATION_NAME}.c
237echo '  ; else if (!config.text_read_only) return'         >> e${EMULATION_NAME}.c
238sed $sc ldscripts/${EMULATION_NAME}.xbn                    >> e${EMULATION_NAME}.c
239echo '  ; else if (!config.magic_demand_paged) return'     >> e${EMULATION_NAME}.c
240sed $sc ldscripts/${EMULATION_NAME}.xn                     >> e${EMULATION_NAME}.c
241echo '  ; else return'                                     >> e${EMULATION_NAME}.c
242sed $sc ldscripts/${EMULATION_NAME}.x                      >> e${EMULATION_NAME}.c
243echo '; }'                                                 >> e${EMULATION_NAME}.c
244
245else
246# Scripts read from the filesystem.
247
248cat >>e${EMULATION_NAME}.c <<EOF
249{			     
250  *isfile = 1;
251
252  if (link_info.relocateable == true && config.build_constructors == true)
253    return "ldscripts/${EMULATION_NAME}.xu";
254  else if (link_info.relocateable == true)
255    return "ldscripts/${EMULATION_NAME}.xr";
256  else if (!config.text_read_only)
257    return "ldscripts/${EMULATION_NAME}.xbn";
258  else if (!config.magic_demand_paged)
259    return "ldscripts/${EMULATION_NAME}.xn";
260  else
261    return "ldscripts/${EMULATION_NAME}.x";
262}
263EOF
264
265fi
266
267cat >>e${EMULATION_NAME}.c <<EOF
268
269struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = 
270{
271  gld${EMULATION_NAME}_before_parse,
272  syslib_default,
273  hll_default,
274  after_parse_default,
275  gld${EMULATION_NAME}_after_open,
276  after_allocation_default,
277  set_output_arch_default,
278  ldemul_default_target,
279  gld${EMULATION_NAME}_before_allocation,
280  gld${EMULATION_NAME}_get_script,
281  "${EMULATION_NAME}",
282  "${OUTPUT_FORMAT}",
283  gld${EMULATION_NAME}_finish,
284  NULL,	/* create output section statements */
285  NULL,	/* open dynamic archive */
286  NULL,	/* place orphan */
287  NULL,	/* set symbols */
288  gld${EMULATION_NAME}_parse_args,
289  NULL,	/* unrecognised file */
290  gld${EMULATION_NAME}_list_options,
291  NULL,	/* recognized file */
292  NULL,	/* find_potential_libraries */
293  NULL	/* new_vers_pattern */
294};
295EOF
296