OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / go / gospec.c
1 /* gospec.c -- Specific flags and argument handling of the gcc Go front end.
2    Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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.
10
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.
15
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/>.  */
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
52 void
53 lang_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 + 5;
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   *in_decoded_options_count = j;
385   *in_decoded_options = new_decoded_options;
386   *in_added_libraries = added_libraries;
387 }
388
389 /* Called before linking.  Returns 0 on success and -1 on failure.  */
390 int lang_specific_pre_link (void)  /* Not used for Go.  */
391 {
392   return 0;
393 }
394
395 /* Number of extra output files that lang_specific_pre_link may generate.  */
396 int lang_specific_extra_outfiles = 0;  /* Not used for Go.  */