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