1*e4b17023SJohn Marino /* Specific flags and argument handling of the C++ front end.
2*e4b17023SJohn Marino Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3*e4b17023SJohn Marino 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4*e4b17023SJohn Marino
5*e4b17023SJohn Marino This file is part of GCC.
6*e4b17023SJohn Marino
7*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify
8*e4b17023SJohn Marino it under the terms of the GNU General Public License as published by
9*e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino any later version.
11*e4b17023SJohn Marino
12*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*e4b17023SJohn Marino GNU General Public License for more details.
16*e4b17023SJohn Marino
17*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
18*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see
19*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
20*e4b17023SJohn Marino
21*e4b17023SJohn Marino #include "config.h"
22*e4b17023SJohn Marino #include "system.h"
23*e4b17023SJohn Marino #include "coretypes.h"
24*e4b17023SJohn Marino #include "tm.h"
25*e4b17023SJohn Marino #include "gcc.h"
26*e4b17023SJohn Marino #include "opts.h"
27*e4b17023SJohn Marino
28*e4b17023SJohn Marino /* This bit is set if we saw a `-xfoo' language specification. */
29*e4b17023SJohn Marino #define LANGSPEC (1<<1)
30*e4b17023SJohn Marino /* This bit is set if they did `-lm' or `-lmath'. */
31*e4b17023SJohn Marino #define MATHLIB (1<<2)
32*e4b17023SJohn Marino /* This bit is set if they did `-lc'. */
33*e4b17023SJohn Marino #define WITHLIBC (1<<3)
34*e4b17023SJohn Marino /* Skip this option. */
35*e4b17023SJohn Marino #define SKIPOPT (1<<4)
36*e4b17023SJohn Marino
37*e4b17023SJohn Marino #ifndef MATH_LIBRARY
38*e4b17023SJohn Marino #define MATH_LIBRARY "m"
39*e4b17023SJohn Marino #endif
40*e4b17023SJohn Marino #ifndef MATH_LIBRARY_PROFILE
41*e4b17023SJohn Marino #define MATH_LIBRARY_PROFILE MATH_LIBRARY
42*e4b17023SJohn Marino #endif
43*e4b17023SJohn Marino
44*e4b17023SJohn Marino #ifndef LIBSTDCXX
45*e4b17023SJohn Marino #define LIBSTDCXX "stdc++"
46*e4b17023SJohn Marino #endif
47*e4b17023SJohn Marino #ifndef LIBSTDCXX_PROFILE
48*e4b17023SJohn Marino #define LIBSTDCXX_PROFILE LIBSTDCXX
49*e4b17023SJohn Marino #endif
50*e4b17023SJohn Marino #ifndef LIBSTDCXX_STATIC
51*e4b17023SJohn Marino #define LIBSTDCXX_STATIC NULL
52*e4b17023SJohn Marino #endif
53*e4b17023SJohn Marino
54*e4b17023SJohn Marino void
lang_specific_driver(struct cl_decoded_option ** in_decoded_options,unsigned int * in_decoded_options_count,int * in_added_libraries)55*e4b17023SJohn Marino lang_specific_driver (struct cl_decoded_option **in_decoded_options,
56*e4b17023SJohn Marino unsigned int *in_decoded_options_count,
57*e4b17023SJohn Marino int *in_added_libraries)
58*e4b17023SJohn Marino {
59*e4b17023SJohn Marino unsigned int i, j;
60*e4b17023SJohn Marino
61*e4b17023SJohn Marino /* If nonzero, the user gave us the `-p' or `-pg' flag. */
62*e4b17023SJohn Marino int saw_profile_flag = 0;
63*e4b17023SJohn Marino
64*e4b17023SJohn Marino /* What do with libstdc++:
65*e4b17023SJohn Marino -1 means we should not link in libstdc++
66*e4b17023SJohn Marino 0 means we should link in libstdc++ if it is needed
67*e4b17023SJohn Marino 1 means libstdc++ is needed and should be linked in.
68*e4b17023SJohn Marino 2 means libstdc++ is needed and should be linked statically. */
69*e4b17023SJohn Marino int library = 0;
70*e4b17023SJohn Marino
71*e4b17023SJohn Marino /* The number of arguments being added to what's in argv, other than
72*e4b17023SJohn Marino libraries. We use this to track the number of times we've inserted
73*e4b17023SJohn Marino -xc++/-xnone. */
74*e4b17023SJohn Marino int added = 0;
75*e4b17023SJohn Marino
76*e4b17023SJohn Marino /* The new argument list will be contained in this. */
77*e4b17023SJohn Marino struct cl_decoded_option *new_decoded_options;
78*e4b17023SJohn Marino
79*e4b17023SJohn Marino /* Nonzero if we saw a `-xfoo' language specification on the
80*e4b17023SJohn Marino command line. Used to avoid adding our own -xc++ if the user
81*e4b17023SJohn Marino already gave a language for the file. */
82*e4b17023SJohn Marino int saw_speclang = 0;
83*e4b17023SJohn Marino
84*e4b17023SJohn Marino /* "-lm" or "-lmath" if it appears on the command line. */
85*e4b17023SJohn Marino const struct cl_decoded_option *saw_math = NULL;
86*e4b17023SJohn Marino
87*e4b17023SJohn Marino /* "-lc" if it appears on the command line. */
88*e4b17023SJohn Marino const struct cl_decoded_option *saw_libc = NULL;
89*e4b17023SJohn Marino
90*e4b17023SJohn Marino /* An array used to flag each argument that needs a bit set for
91*e4b17023SJohn Marino LANGSPEC, MATHLIB, or WITHLIBC. */
92*e4b17023SJohn Marino int *args;
93*e4b17023SJohn Marino
94*e4b17023SJohn Marino /* By default, we throw on the math library if we have one. */
95*e4b17023SJohn Marino int need_math = (MATH_LIBRARY[0] != '\0');
96*e4b17023SJohn Marino
97*e4b17023SJohn Marino /* True if we saw -static. */
98*e4b17023SJohn Marino int static_link = 0;
99*e4b17023SJohn Marino
100*e4b17023SJohn Marino /* True if we should add -shared-libgcc to the command-line. */
101*e4b17023SJohn Marino int shared_libgcc = 1;
102*e4b17023SJohn Marino
103*e4b17023SJohn Marino /* The total number of arguments with the new stuff. */
104*e4b17023SJohn Marino unsigned int argc;
105*e4b17023SJohn Marino
106*e4b17023SJohn Marino /* The argument list. */
107*e4b17023SJohn Marino struct cl_decoded_option *decoded_options;
108*e4b17023SJohn Marino
109*e4b17023SJohn Marino /* The number of libraries added in. */
110*e4b17023SJohn Marino int added_libraries;
111*e4b17023SJohn Marino
112*e4b17023SJohn Marino /* The total number of arguments with the new stuff. */
113*e4b17023SJohn Marino unsigned int num_args = 1;
114*e4b17023SJohn Marino
115*e4b17023SJohn Marino argc = *in_decoded_options_count;
116*e4b17023SJohn Marino decoded_options = *in_decoded_options;
117*e4b17023SJohn Marino added_libraries = *in_added_libraries;
118*e4b17023SJohn Marino
119*e4b17023SJohn Marino args = XCNEWVEC (int, argc);
120*e4b17023SJohn Marino
121*e4b17023SJohn Marino for (i = 1; i < argc; i++)
122*e4b17023SJohn Marino {
123*e4b17023SJohn Marino const char *arg = decoded_options[i].arg;
124*e4b17023SJohn Marino if (decoded_options[i].errors & CL_ERR_MISSING_ARG)
125*e4b17023SJohn Marino continue; /* Avoid examining arguments of options missing them. */
126*e4b17023SJohn Marino
127*e4b17023SJohn Marino switch (decoded_options[i].opt_index)
128*e4b17023SJohn Marino {
129*e4b17023SJohn Marino case OPT_nostdlib:
130*e4b17023SJohn Marino case OPT_nodefaultlibs:
131*e4b17023SJohn Marino library = -1;
132*e4b17023SJohn Marino break;
133*e4b17023SJohn Marino
134*e4b17023SJohn Marino case OPT_l:
135*e4b17023SJohn Marino if (strcmp (arg, MATH_LIBRARY) == 0)
136*e4b17023SJohn Marino {
137*e4b17023SJohn Marino args[i] |= MATHLIB;
138*e4b17023SJohn Marino need_math = 0;
139*e4b17023SJohn Marino }
140*e4b17023SJohn Marino else if (strcmp (arg, "c") == 0)
141*e4b17023SJohn Marino args[i] |= WITHLIBC;
142*e4b17023SJohn Marino else
143*e4b17023SJohn Marino /* Unrecognized libraries (e.g. -lfoo) may require libstdc++. */
144*e4b17023SJohn Marino library = (library == 0) ? 1 : library;
145*e4b17023SJohn Marino break;
146*e4b17023SJohn Marino
147*e4b17023SJohn Marino case OPT_pg:
148*e4b17023SJohn Marino case OPT_p:
149*e4b17023SJohn Marino saw_profile_flag++;
150*e4b17023SJohn Marino break;
151*e4b17023SJohn Marino
152*e4b17023SJohn Marino case OPT_x:
153*e4b17023SJohn Marino if (library == 0
154*e4b17023SJohn Marino && (strcmp (arg, "c++") == 0
155*e4b17023SJohn Marino || strcmp (arg, "c++-cpp-output") == 0
156*e4b17023SJohn Marino || strcmp (arg, "objective-c++") == 0
157*e4b17023SJohn Marino || strcmp (arg, "objective-c++-cpp-output") == 0))
158*e4b17023SJohn Marino library = 1;
159*e4b17023SJohn Marino
160*e4b17023SJohn Marino saw_speclang = 1;
161*e4b17023SJohn Marino break;
162*e4b17023SJohn Marino
163*e4b17023SJohn Marino case OPT_Xlinker:
164*e4b17023SJohn Marino case OPT_Wl_:
165*e4b17023SJohn Marino /* Arguments that go directly to the linker might be .o files,
166*e4b17023SJohn Marino or something, and so might cause libstdc++ to be needed. */
167*e4b17023SJohn Marino if (library == 0)
168*e4b17023SJohn Marino library = 1;
169*e4b17023SJohn Marino break;
170*e4b17023SJohn Marino
171*e4b17023SJohn Marino case OPT_c:
172*e4b17023SJohn Marino case OPT_S:
173*e4b17023SJohn Marino case OPT_E:
174*e4b17023SJohn Marino case OPT_M:
175*e4b17023SJohn Marino case OPT_MM:
176*e4b17023SJohn Marino case OPT_fsyntax_only:
177*e4b17023SJohn Marino /* Don't specify libraries if we won't link, since that would
178*e4b17023SJohn Marino cause a warning. */
179*e4b17023SJohn Marino library = -1;
180*e4b17023SJohn Marino break;
181*e4b17023SJohn Marino
182*e4b17023SJohn Marino case OPT_static:
183*e4b17023SJohn Marino static_link = 1;
184*e4b17023SJohn Marino break;
185*e4b17023SJohn Marino
186*e4b17023SJohn Marino case OPT_static_libgcc:
187*e4b17023SJohn Marino shared_libgcc = 0;
188*e4b17023SJohn Marino break;
189*e4b17023SJohn Marino
190*e4b17023SJohn Marino case OPT_static_libstdc__:
191*e4b17023SJohn Marino library = library >= 0 ? 2 : library;
192*e4b17023SJohn Marino args[i] |= SKIPOPT;
193*e4b17023SJohn Marino break;
194*e4b17023SJohn Marino
195*e4b17023SJohn Marino case OPT_SPECIAL_input_file:
196*e4b17023SJohn Marino {
197*e4b17023SJohn Marino int len;
198*e4b17023SJohn Marino
199*e4b17023SJohn Marino /* We don't do this anymore, since we don't get them with minus
200*e4b17023SJohn Marino signs on them. */
201*e4b17023SJohn Marino if (arg[0] == '\0' || arg[1] == '\0')
202*e4b17023SJohn Marino continue;
203*e4b17023SJohn Marino
204*e4b17023SJohn Marino if (saw_speclang)
205*e4b17023SJohn Marino {
206*e4b17023SJohn Marino saw_speclang = 0;
207*e4b17023SJohn Marino continue;
208*e4b17023SJohn Marino }
209*e4b17023SJohn Marino
210*e4b17023SJohn Marino /* If the filename ends in .[chi], put options around it.
211*e4b17023SJohn Marino But not if a specified -x option is currently active. */
212*e4b17023SJohn Marino len = strlen (arg);
213*e4b17023SJohn Marino if (len > 2
214*e4b17023SJohn Marino && (arg[len - 1] == 'c'
215*e4b17023SJohn Marino || arg[len - 1] == 'i'
216*e4b17023SJohn Marino || arg[len - 1] == 'h')
217*e4b17023SJohn Marino && arg[len - 2] == '.')
218*e4b17023SJohn Marino {
219*e4b17023SJohn Marino args[i] |= LANGSPEC;
220*e4b17023SJohn Marino added += 2;
221*e4b17023SJohn Marino }
222*e4b17023SJohn Marino
223*e4b17023SJohn Marino /* If we don't know that this is a header file, we might
224*e4b17023SJohn Marino need to be linking in the libraries. */
225*e4b17023SJohn Marino if (library == 0)
226*e4b17023SJohn Marino {
227*e4b17023SJohn Marino if ((len <= 2 || strcmp (arg + (len - 2), ".H") != 0)
228*e4b17023SJohn Marino && (len <= 2 || strcmp (arg + (len - 2), ".h") != 0)
229*e4b17023SJohn Marino && (len <= 4 || strcmp (arg + (len - 4), ".hpp") != 0)
230*e4b17023SJohn Marino && (len <= 3 || strcmp (arg + (len - 3), ".hp") != 0)
231*e4b17023SJohn Marino && (len <= 4 || strcmp (arg + (len - 4), ".hxx") != 0)
232*e4b17023SJohn Marino && (len <= 4 || strcmp (arg + (len - 4), ".h++") != 0)
233*e4b17023SJohn Marino && (len <= 4 || strcmp (arg + (len - 4), ".HPP") != 0)
234*e4b17023SJohn Marino && (len <= 4 || strcmp (arg + (len - 4), ".tcc") != 0)
235*e4b17023SJohn Marino && (len <= 3 || strcmp (arg + (len - 3), ".hh") != 0))
236*e4b17023SJohn Marino library = 1;
237*e4b17023SJohn Marino }
238*e4b17023SJohn Marino }
239*e4b17023SJohn Marino break;
240*e4b17023SJohn Marino }
241*e4b17023SJohn Marino }
242*e4b17023SJohn Marino
243*e4b17023SJohn Marino /* There's no point adding -shared-libgcc if we don't have a shared
244*e4b17023SJohn Marino libgcc. */
245*e4b17023SJohn Marino #ifndef ENABLE_SHARED_LIBGCC
246*e4b17023SJohn Marino shared_libgcc = 0;
247*e4b17023SJohn Marino #endif
248*e4b17023SJohn Marino
249*e4b17023SJohn Marino /* Add one for shared_libgcc or extra static library. */
250*e4b17023SJohn Marino num_args = argc + added + need_math + (library > 0) * 4 + 1;
251*e4b17023SJohn Marino new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
252*e4b17023SJohn Marino
253*e4b17023SJohn Marino i = 0;
254*e4b17023SJohn Marino j = 0;
255*e4b17023SJohn Marino
256*e4b17023SJohn Marino /* Copy the 0th argument, i.e., the name of the program itself. */
257*e4b17023SJohn Marino new_decoded_options[j++] = decoded_options[i++];
258*e4b17023SJohn Marino
259*e4b17023SJohn Marino /* NOTE: We start at 1 now, not 0. */
260*e4b17023SJohn Marino while (i < argc)
261*e4b17023SJohn Marino {
262*e4b17023SJohn Marino new_decoded_options[j] = decoded_options[i];
263*e4b17023SJohn Marino
264*e4b17023SJohn Marino /* Make sure -lstdc++ is before the math library, since libstdc++
265*e4b17023SJohn Marino itself uses those math routines. */
266*e4b17023SJohn Marino if (!saw_math && (args[i] & MATHLIB) && library > 0)
267*e4b17023SJohn Marino {
268*e4b17023SJohn Marino --j;
269*e4b17023SJohn Marino saw_math = &decoded_options[i];
270*e4b17023SJohn Marino }
271*e4b17023SJohn Marino
272*e4b17023SJohn Marino if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
273*e4b17023SJohn Marino {
274*e4b17023SJohn Marino --j;
275*e4b17023SJohn Marino saw_libc = &decoded_options[i];
276*e4b17023SJohn Marino }
277*e4b17023SJohn Marino
278*e4b17023SJohn Marino /* Wrap foo.[chi] files in a language specification to
279*e4b17023SJohn Marino force the gcc compiler driver to run cc1plus on them. */
280*e4b17023SJohn Marino if (args[i] & LANGSPEC)
281*e4b17023SJohn Marino {
282*e4b17023SJohn Marino const char *arg = decoded_options[i].arg;
283*e4b17023SJohn Marino int len = strlen (arg);
284*e4b17023SJohn Marino switch (arg[len - 1])
285*e4b17023SJohn Marino {
286*e4b17023SJohn Marino case 'c':
287*e4b17023SJohn Marino generate_option (OPT_x, "c++", 1, CL_DRIVER,
288*e4b17023SJohn Marino &new_decoded_options[j++]);
289*e4b17023SJohn Marino break;
290*e4b17023SJohn Marino case 'i':
291*e4b17023SJohn Marino generate_option (OPT_x, "c++-cpp-output", 1, CL_DRIVER,
292*e4b17023SJohn Marino &new_decoded_options[j++]);
293*e4b17023SJohn Marino break;
294*e4b17023SJohn Marino case 'h':
295*e4b17023SJohn Marino generate_option (OPT_x, "c++-header", 1, CL_DRIVER,
296*e4b17023SJohn Marino &new_decoded_options[j++]);
297*e4b17023SJohn Marino break;
298*e4b17023SJohn Marino default:
299*e4b17023SJohn Marino gcc_unreachable ();
300*e4b17023SJohn Marino }
301*e4b17023SJohn Marino new_decoded_options[j++] = decoded_options[i];
302*e4b17023SJohn Marino generate_option (OPT_x, "none", 1, CL_DRIVER,
303*e4b17023SJohn Marino &new_decoded_options[j]);
304*e4b17023SJohn Marino }
305*e4b17023SJohn Marino
306*e4b17023SJohn Marino if ((args[i] & SKIPOPT) != 0)
307*e4b17023SJohn Marino --j;
308*e4b17023SJohn Marino
309*e4b17023SJohn Marino i++;
310*e4b17023SJohn Marino j++;
311*e4b17023SJohn Marino }
312*e4b17023SJohn Marino
313*e4b17023SJohn Marino /* Add `-lstdc++' if we haven't already done so. */
314*e4b17023SJohn Marino if (library > 0)
315*e4b17023SJohn Marino {
316*e4b17023SJohn Marino #ifdef HAVE_LD_STATIC_DYNAMIC
317*e4b17023SJohn Marino if (library > 1 && !static_link)
318*e4b17023SJohn Marino {
319*e4b17023SJohn Marino generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER,
320*e4b17023SJohn Marino &new_decoded_options[j]);
321*e4b17023SJohn Marino j++;
322*e4b17023SJohn Marino }
323*e4b17023SJohn Marino #endif
324*e4b17023SJohn Marino generate_option (OPT_l,
325*e4b17023SJohn Marino saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX, 1,
326*e4b17023SJohn Marino CL_DRIVER, &new_decoded_options[j]);
327*e4b17023SJohn Marino added_libraries++;
328*e4b17023SJohn Marino j++;
329*e4b17023SJohn Marino /* Add target-dependent static library, if necessary. */
330*e4b17023SJohn Marino if ((static_link || library > 1) && LIBSTDCXX_STATIC != NULL)
331*e4b17023SJohn Marino {
332*e4b17023SJohn Marino generate_option (OPT_l, LIBSTDCXX_STATIC, 1,
333*e4b17023SJohn Marino CL_DRIVER, &new_decoded_options[j]);
334*e4b17023SJohn Marino added_libraries++;
335*e4b17023SJohn Marino j++;
336*e4b17023SJohn Marino }
337*e4b17023SJohn Marino #ifdef HAVE_LD_STATIC_DYNAMIC
338*e4b17023SJohn Marino if (library > 1 && !static_link)
339*e4b17023SJohn Marino {
340*e4b17023SJohn Marino generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER,
341*e4b17023SJohn Marino &new_decoded_options[j]);
342*e4b17023SJohn Marino j++;
343*e4b17023SJohn Marino }
344*e4b17023SJohn Marino #endif
345*e4b17023SJohn Marino }
346*e4b17023SJohn Marino if (saw_math)
347*e4b17023SJohn Marino new_decoded_options[j++] = *saw_math;
348*e4b17023SJohn Marino else if (library > 0 && need_math)
349*e4b17023SJohn Marino {
350*e4b17023SJohn Marino generate_option (OPT_l,
351*e4b17023SJohn Marino saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY,
352*e4b17023SJohn Marino 1, CL_DRIVER, &new_decoded_options[j]);
353*e4b17023SJohn Marino added_libraries++;
354*e4b17023SJohn Marino j++;
355*e4b17023SJohn Marino }
356*e4b17023SJohn Marino if (saw_libc)
357*e4b17023SJohn Marino new_decoded_options[j++] = *saw_libc;
358*e4b17023SJohn Marino if (shared_libgcc && !static_link)
359*e4b17023SJohn Marino generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
360*e4b17023SJohn Marino &new_decoded_options[j++]);
361*e4b17023SJohn Marino
362*e4b17023SJohn Marino *in_decoded_options_count = j;
363*e4b17023SJohn Marino *in_decoded_options = new_decoded_options;
364*e4b17023SJohn Marino *in_added_libraries = added_libraries;
365*e4b17023SJohn Marino }
366*e4b17023SJohn Marino
367*e4b17023SJohn Marino /* Called before linking. Returns 0 on success and -1 on failure. */
lang_specific_pre_link(void)368*e4b17023SJohn Marino int lang_specific_pre_link (void) /* Not used for C++. */
369*e4b17023SJohn Marino {
370*e4b17023SJohn Marino return 0;
371*e4b17023SJohn Marino }
372*e4b17023SJohn Marino
373*e4b17023SJohn Marino /* Number of extra output files that lang_specific_pre_link may generate. */
374*e4b17023SJohn Marino int lang_specific_extra_outfiles = 0; /* Not used for C++. */
375