1/* gospec.c -- Specific flags and argument handling of the gcc Go front end.
2   Copyright (C) 2009-2015 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3.  If not see
18<http://www.gnu.org/licenses/>.  */
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
23#include "tm.h"
24#include "gcc.h"
25#include "opts.h"
26
27/* This bit is set if we saw a `-xfoo' language specification.  */
28#define LANGSPEC	(1<<1)
29/* This bit is set if they did `-lm' or `-lmath'.  */
30#define MATHLIB		(1<<2)
31/* This bit is set if they did `-lpthread'.  */
32#define THREADLIB	(1<<3)
33/* This bit is set if they did `-lc'.  */
34#define WITHLIBC	(1<<4)
35/* Skip this option.  */
36#define SKIPOPT		(1<<5)
37
38#ifndef MATH_LIBRARY
39#define MATH_LIBRARY "m"
40#endif
41#ifndef MATH_LIBRARY_PROFILE
42#define MATH_LIBRARY_PROFILE MATH_LIBRARY
43#endif
44
45#define THREAD_LIBRARY "pthread"
46#define THREAD_LIBRARY_PROFILE THREAD_LIBRARY
47
48#define LIBGO "go"
49#define LIBGO_PROFILE LIBGO
50#define LIBGOBEGIN "gobegin"
51
52void
53lang_specific_driver (struct cl_decoded_option **in_decoded_options,
54		      unsigned int *in_decoded_options_count,
55		      int *in_added_libraries)
56{
57  unsigned int i, j;
58
59  /* If true, the user gave us the `-p' or `-pg' flag.  */
60  bool saw_profile_flag = false;
61
62  /* This is a tristate:
63     -1 means we should not link in libgo
64     0  means we should link in libgo if it is needed
65     1  means libgo is needed and should be linked in.
66     2  means libgo is needed and should be linked statically.  */
67  int library = 0;
68
69  /* The new argument list will be contained in this.  */
70  struct cl_decoded_option *new_decoded_options;
71
72  /* "-lm" or "-lmath" if it appears on the command line.  */
73  const struct cl_decoded_option *saw_math = 0;
74
75  /* "-lpthread" if it appears on the command line.  */
76  const struct cl_decoded_option *saw_thread = 0;
77
78  /* "-lc" if it appears on the command line.  */
79  const struct cl_decoded_option *saw_libc = 0;
80
81  /* An array used to flag each argument that needs a bit set for
82     LANGSPEC, MATHLIB, or WITHLIBC.  */
83  int *args;
84
85  /* Whether we need the thread library.  */
86  int need_thread = 0;
87
88  /* By default, we throw on the math library if we have one.  */
89  int need_math = (MATH_LIBRARY[0] != '\0');
90
91  /* True if we saw -static.  */
92  int static_link = 0;
93
94  /* True if we should add -shared-libgcc to the command-line.  */
95  int shared_libgcc = 1;
96
97  /* The total number of arguments with the new stuff.  */
98  unsigned int argc;
99
100  /* The argument list.  */
101  struct cl_decoded_option *decoded_options;
102
103  /* The number of libraries added in.  */
104  int added_libraries;
105
106  /* The total number of arguments with the new stuff.  */
107  int num_args = 1;
108
109  /* Whether the -o option was used.  */
110  bool saw_opt_o = false;
111
112  /* Whether the -c option was used.  Also used for -E, -fsyntax-only,
113     in general anything which implies only compilation and not
114     linking.  */
115  bool saw_opt_c = false;
116
117  /* Whether the -S option was used.  */
118  bool saw_opt_S = false;
119
120  /* The first input file with an extension of .go.  */
121  const char *first_go_file = NULL;
122
123  argc = *in_decoded_options_count;
124  decoded_options = *in_decoded_options;
125  added_libraries = *in_added_libraries;
126
127  args = XCNEWVEC (int, argc);
128
129  for (i = 1; i < argc; i++)
130    {
131      const char *arg = decoded_options[i].arg;
132
133      switch (decoded_options[i].opt_index)
134	{
135	case OPT_nostdlib:
136	case OPT_nodefaultlibs:
137	  library = -1;
138	  break;
139
140	case OPT_l:
141	  if (strcmp (arg, MATH_LIBRARY) == 0)
142	    {
143	      args[i] |= MATHLIB;
144	      need_math = 0;
145	    }
146	  else if (strcmp (arg, THREAD_LIBRARY) == 0)
147	    args[i] |= THREADLIB;
148	  else if (strcmp (arg, "c") == 0)
149	    args[i] |= WITHLIBC;
150	  else
151	    /* Unrecognized libraries (e.g. -lfoo) may require libgo.  */
152	    library = (library == 0) ? 1 : library;
153	  break;
154
155	case OPT_pg:
156	case OPT_p:
157	  saw_profile_flag = true;
158	  break;
159
160	case OPT_x:
161	  if (library == 0 && strcmp (arg, "go") == 0)
162	    library = 1;
163	  break;
164
165	case OPT_Xlinker:
166	case OPT_Wl_:
167	  /* Arguments that go directly to the linker might be .o files,
168	     or something, and so might cause libgo to be needed.  */
169	  if (library == 0)
170	    library = 1;
171	  break;
172
173	case OPT_c:
174	case OPT_E:
175	case OPT_M:
176	case OPT_MM:
177	case OPT_fsyntax_only:
178	  /* Don't specify libraries if we won't link, since that would
179	     cause a warning.  */
180	  saw_opt_c = true;
181	  library = -1;
182	  break;
183
184	case OPT_S:
185	  saw_opt_S = true;
186	  library = -1;
187	  break;
188
189	case OPT_o:
190	  saw_opt_o = true;
191	  break;
192
193	case OPT_static:
194	  static_link = 1;
195	  break;
196
197	case OPT_static_libgcc:
198	  shared_libgcc = 0;
199	  break;
200
201	case OPT_static_libgo:
202	  library = library >= 0 ? 2 : library;
203	  args[i] |= SKIPOPT;
204	  break;
205
206	case OPT_SPECIAL_input_file:
207	  if (library == 0)
208	    library = 1;
209
210	  if (first_go_file == NULL)
211	    {
212	      int len;
213
214	      len = strlen (arg);
215	      if (len > 3 && strcmp (arg + len - 3, ".go") == 0)
216		first_go_file = arg;
217	    }
218
219	  break;
220	}
221    }
222
223  /* There's no point adding -shared-libgcc if we don't have a shared
224     libgcc.  */
225#ifndef ENABLE_SHARED_LIBGCC
226  shared_libgcc = 0;
227#endif
228
229  /* Make sure to have room for the trailing NULL argument.  */
230  num_args = argc + need_math + shared_libgcc + (library > 0) * 5 + 10;
231  new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
232
233  i = 0;
234  j = 0;
235
236  /* Copy the 0th argument, i.e., the name of the program itself.  */
237  new_decoded_options[j++] = decoded_options[i++];
238
239  /* If we are linking, pass -fsplit-stack if it is supported.  */
240#ifdef TARGET_CAN_SPLIT_STACK
241  if (library >= 0)
242    {
243      generate_option (OPT_fsplit_stack, NULL, 1, CL_DRIVER,
244		       &new_decoded_options[j]);
245      j++;
246    }
247#endif
248
249  /* NOTE: We start at 1 now, not 0.  */
250  while (i < argc)
251    {
252      new_decoded_options[j] = decoded_options[i];
253
254      /* Make sure -lgo is before the math library, since libgo itself
255	 uses those math routines.  */
256      if (!saw_math && (args[i] & MATHLIB) && library > 0)
257	{
258	  --j;
259	  saw_math = &decoded_options[i];
260	}
261
262      if (!saw_thread && (args[i] & THREADLIB) && library > 0)
263	{
264	  --j;
265	  saw_thread = &decoded_options[i];
266	}
267
268      if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
269	{
270	  --j;
271	  saw_libc = &decoded_options[i];
272	}
273
274      if ((args[i] & SKIPOPT) != 0)
275	--j;
276
277      i++;
278      j++;
279    }
280
281  /* If we didn't see a -o option, add one.  This is because we need
282     the driver to pass all .go files to go1.  Without a -o option the
283     driver will invoke go1 separately for each input file.  FIXME:
284     This should probably use some other interface to force the driver
285     to set combine_inputs.  */
286  if (first_go_file != NULL && !saw_opt_o)
287    {
288      if (saw_opt_c || saw_opt_S)
289	{
290	  const char *base;
291	  int baselen;
292	  int alen;
293	  char *out;
294
295	  base = lbasename (first_go_file);
296	  baselen = strlen (base) - 3;
297	  alen = baselen + 3;
298	  out = XNEWVEC (char, alen);
299	  memcpy (out, base, baselen);
300	  /* The driver will convert .o to some other suffix (e.g.,
301	     .obj) if appropriate.  */
302	  out[baselen] = '.';
303	  if (saw_opt_S)
304	    out[baselen + 1] = 's';
305	  else
306	    out[baselen + 1] = 'o';
307	  out[baselen + 2] = '\0';
308	  generate_option (OPT_o, out, 1, CL_DRIVER,
309			   &new_decoded_options[j]);
310	}
311      else
312	generate_option (OPT_o, "a.out", 1, CL_DRIVER,
313			 &new_decoded_options[j]);
314      j++;
315    }
316
317  /* Add `-lgo' if we haven't already done so.  */
318  if (library > 0)
319    {
320      generate_option (OPT_l, LIBGOBEGIN, 1, CL_DRIVER,
321		       &new_decoded_options[j]);
322      added_libraries++;
323      j++;
324
325#ifdef HAVE_LD_STATIC_DYNAMIC
326      if (library > 1 && !static_link)
327	{
328	  generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER,
329			   &new_decoded_options[j]);
330	  j++;
331	}
332#endif
333
334      generate_option (OPT_l, saw_profile_flag ? LIBGO_PROFILE : LIBGO, 1,
335		       CL_DRIVER, &new_decoded_options[j]);
336      added_libraries++;
337      j++;
338
339#ifdef HAVE_LD_STATIC_DYNAMIC
340      if (library > 1 && !static_link)
341	{
342	  generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER,
343			   &new_decoded_options[j]);
344	  j++;
345	}
346#endif
347
348      /* When linking libgo statically we also need to link with the
349	 pthread library.  */
350      if (library > 1 || static_link)
351	need_thread = 1;
352    }
353
354  if (saw_thread)
355    new_decoded_options[j++] = *saw_thread;
356  else if (library > 0 && need_thread)
357    {
358      generate_option (OPT_l,
359		       (saw_profile_flag
360			? THREAD_LIBRARY_PROFILE
361			: THREAD_LIBRARY),
362		       1, CL_DRIVER, &new_decoded_options[j]);
363      added_libraries++;
364      j++;
365    }
366
367  if (saw_math)
368    new_decoded_options[j++] = *saw_math;
369  else if (library > 0 && need_math)
370    {
371      generate_option (OPT_l,
372		       saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY,
373		       1, CL_DRIVER, &new_decoded_options[j]);
374      added_libraries++;
375      j++;
376    }
377
378  if (saw_libc)
379    new_decoded_options[j++] = *saw_libc;
380  if (shared_libgcc && !static_link)
381    generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
382		     &new_decoded_options[j++]);
383
384#ifdef TARGET_CAN_SPLIT_STACK
385  /* libgcc wraps pthread_create to support split stack, however, due to
386     relative ordering of -lpthread and -lgcc, we can't just mark
387     __real_pthread_create in libgcc as non-weak.  But we need to link in
388     pthread_create from pthread if we are statically linking, so we work-
389     around by passing -u pthread_create to to the linker. */
390  if (static_link)
391    {
392      generate_option (OPT_Wl_, "-u,pthread_create", 1, CL_DRIVER,
393		       &new_decoded_options[j]);
394      j++;
395    }
396#endif
397
398#if defined(TARGET_SOLARIS) && !defined(USE_GLD)
399  /* We use a common symbol for go$zerovalue.  On Solaris, when not
400     using the GNU linker, the Solaris linker needs an option to not
401     warn about this.  Everything works without this option, but you
402     get unsightly warnings at link time.  */
403  generate_option (OPT_Wl_, "-t", 1, CL_DRIVER, &new_decoded_options[j]);
404  j++;
405#endif
406
407  *in_decoded_options_count = j;
408  *in_decoded_options = new_decoded_options;
409  *in_added_libraries = added_libraries;
410}
411
412/* Called before linking.  Returns 0 on success and -1 on failure.  */
413int lang_specific_pre_link (void)  /* Not used for Go.  */
414{
415  return 0;
416}
417
418/* Number of extra output files that lang_specific_pre_link may generate.  */
419int lang_specific_extra_outfiles = 0;  /* Not used for Go.  */
420