annotate gcc/go/gospec.c @ 158:494b0b89df80 default tip

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