1 /* gospec.c -- Specific flags and argument handling of the gcc Go front end.
2 Copyright (C) 2009, 2010 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
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
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/>. */
22 #include "coretypes.h"
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)
39 #define MATH_LIBRARY "m"
41 #ifndef MATH_LIBRARY_PROFILE
42 #define MATH_LIBRARY_PROFILE MATH_LIBRARY
45 #define THREAD_LIBRARY "pthread"
46 #define THREAD_LIBRARY_PROFILE THREAD_LIBRARY
49 #define LIBGO_PROFILE LIBGO
50 #define LIBGOBEGIN "gobegin"
53 lang_specific_driver (struct cl_decoded_option **in_decoded_options,
54 unsigned int *in_decoded_options_count,
55 int *in_added_libraries)
59 /* If true, the user gave us the `-p' or `-pg' flag. */
60 bool saw_profile_flag = false;
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. */
69 /* The new argument list will be contained in this. */
70 struct cl_decoded_option *new_decoded_options;
72 /* "-lm" or "-lmath" if it appears on the command line. */
73 const struct cl_decoded_option *saw_math = 0;
75 /* "-lpthread" if it appears on the command line. */
76 const struct cl_decoded_option *saw_thread = 0;
78 /* "-lc" if it appears on the command line. */
79 const struct cl_decoded_option *saw_libc = 0;
81 /* An array used to flag each argument that needs a bit set for
82 LANGSPEC, MATHLIB, or WITHLIBC. */
85 /* Whether we need the thread library. */
88 /* By default, we throw on the math library if we have one. */
89 int need_math = (MATH_LIBRARY[0] != '\0');
91 /* True if we saw -static. */
94 /* True if we should add -shared-libgcc to the command-line. */
95 int shared_libgcc = 1;
97 /* The total number of arguments with the new stuff. */
100 /* The argument list. */
101 struct cl_decoded_option *decoded_options;
103 /* The number of libraries added in. */
106 /* The total number of arguments with the new stuff. */
109 argc = *in_decoded_options_count;
110 decoded_options = *in_decoded_options;
111 added_libraries = *in_added_libraries;
113 args = XCNEWVEC (int, argc);
115 for (i = 1; i < argc; i++)
117 const char *arg = decoded_options[i].arg;
119 switch (decoded_options[i].opt_index)
122 case OPT_nodefaultlibs:
127 if (strcmp (arg, MATH_LIBRARY) == 0)
132 else if (strcmp (arg, THREAD_LIBRARY) == 0)
133 args[i] |= THREADLIB;
134 else if (strcmp (arg, "c") == 0)
137 /* Unrecognized libraries (e.g. -lfoo) may require libgo. */
138 library = (library == 0) ? 1 : library;
143 saw_profile_flag = true;
147 if (library == 0 && strcmp (arg, "go") == 0)
153 /* Arguments that go directly to the linker might be .o files,
154 or something, and so might cause libgo to be needed. */
164 case OPT_fsyntax_only:
165 /* Don't specify libraries if we won't link, since that would
174 case OPT_static_libgcc:
178 case OPT_static_libgo:
179 library = library >= 0 ? 2 : library;
183 case OPT_SPECIAL_input_file:
190 /* There's no point adding -shared-libgcc if we don't have a shared
192 #ifndef ENABLE_SHARED_LIBGCC
196 /* Make sure to have room for the trailing NULL argument. */
197 num_args = argc + need_math + shared_libgcc + (library > 0) * 5 + 5;
198 new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
203 /* Copy the 0th argument, i.e., the name of the program itself. */
204 new_decoded_options[j++] = decoded_options[i++];
206 /* If we are linking, pass -fsplit-stack if it is supported. */
207 #ifdef TARGET_CAN_SPLIT_STACK
210 generate_option (OPT_fsplit_stack, NULL, 1, CL_DRIVER,
211 &new_decoded_options[j]);
216 /* NOTE: We start at 1 now, not 0. */
219 new_decoded_options[j] = decoded_options[i];
221 /* Make sure -lgo is before the math library, since libgo itself
222 uses those math routines. */
223 if (!saw_math && (args[i] & MATHLIB) && library > 0)
226 saw_math = &decoded_options[i];
229 if (!saw_thread && (args[i] & THREADLIB) && library > 0)
232 saw_thread = &decoded_options[i];
235 if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
238 saw_libc = &decoded_options[i];
241 if ((args[i] & SKIPOPT) != 0)
248 /* Add `-lgo' if we haven't already done so. */
251 generate_option (OPT_l, LIBGOBEGIN, 1, CL_DRIVER,
252 &new_decoded_options[j]);
256 #ifdef HAVE_LD_STATIC_DYNAMIC
257 if (library > 1 && !static_link)
259 generate_option (OPT_Wl_, "-Bstatic", 1, CL_DRIVER,
260 &new_decoded_options[j]);
265 generate_option (OPT_l, saw_profile_flag ? LIBGO_PROFILE : LIBGO, 1,
266 CL_DRIVER, &new_decoded_options[j]);
270 #ifdef HAVE_LD_STATIC_DYNAMIC
271 if (library > 1 && !static_link)
273 generate_option (OPT_Wl_, "-Bdynamic", 1, CL_DRIVER,
274 &new_decoded_options[j]);
279 /* When linking libgo statically we also need to link with the
281 if (library > 1 || static_link)
286 new_decoded_options[j++] = *saw_thread;
287 else if (library > 0 && need_thread)
289 generate_option (OPT_l,
291 ? THREAD_LIBRARY_PROFILE
293 1, CL_DRIVER, &new_decoded_options[j]);
299 new_decoded_options[j++] = *saw_math;
300 else if (library > 0 && need_math)
302 generate_option (OPT_l,
303 saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY,
304 1, CL_DRIVER, &new_decoded_options[j]);
310 new_decoded_options[j++] = *saw_libc;
311 if (shared_libgcc && !static_link)
312 generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
313 &new_decoded_options[j++]);
315 *in_decoded_options_count = j;
316 *in_decoded_options = new_decoded_options;
317 *in_added_libraries = added_libraries;
320 /* Called before linking. Returns 0 on success and -1 on failure. */
321 int lang_specific_pre_link (void) /* Not used for Go. */
326 /* Number of extra output files that lang_specific_pre_link may generate. */
327 int lang_specific_extra_outfiles = 0; /* Not used for Go. */