]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/g++spec.cc
Update copyright years.
[thirdparty/gcc.git] / gcc / cp / g++spec.cc
CommitLineData
3b426391 1/* Specific flags and argument handling of the C++ front end.
a945c346 2 Copyright (C) 1996-2024 Free Software Foundation, Inc.
5b76d03b 3
f5adbb8d 4This file is part of GCC.
5b76d03b 5
f5adbb8d 6GCC is free software; you can redistribute it and/or modify
5b76d03b 7it under the terms of the GNU General Public License as published by
e77f031d 8the Free Software Foundation; either version 3, or (at your option)
5b76d03b
BK
9any later version.
10
f5adbb8d 11GCC is distributed in the hope that it will be useful,
5b76d03b
BK
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
e77f031d
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
5b76d03b 19
da20811c 20#include "config.h"
8d052bc7 21#include "system.h"
4977bab6
ZW
22#include "coretypes.h"
23#include "tm.h"
d9d16a19 24#include "opts.h"
2ba25f50 25
f442f723
MS
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 `-lc'. */
55ebb0d6 31#define WITHLIBC (1<<3)
96be7a11 32/* Skip this option. */
55ebb0d6 33#define SKIPOPT (1<<4)
2efb237f
JCI
34/* Add -lstdc++exp for experimental features that need library support. */
35#define EXPERIMENTAL (1<<5)
f442f723
MS
36
37#ifndef MATH_LIBRARY
d9d16a19 38#define MATH_LIBRARY "m"
f442f723 39#endif
271f61fb 40#ifndef MATH_LIBRARY_PROFILE
61fec9ff 41#define MATH_LIBRARY_PROFILE MATH_LIBRARY
271f61fb 42#endif
f442f723 43
18cd4ded 44#ifndef LIBSTDCXX
d9d16a19 45#define LIBSTDCXX "stdc++"
18cd4ded 46#endif
271f61fb 47#ifndef LIBSTDCXX_PROFILE
4afd7f6c 48#define LIBSTDCXX_PROFILE LIBSTDCXX
271f61fb 49#endif
ce75e1dd 50#ifndef LIBSTDCXX_STATIC
a322799d 51#define LIBSTDCXX_STATIC NULL
ce75e1dd 52#endif
18cd4ded 53
662b9c55
IS
54#ifndef LIBCXX
55#define LIBCXX "c++"
56#endif
57#ifndef LIBCXX_PROFILE
58#define LIBCXX_PROFILE LIBCXX
59#endif
60#ifndef LIBCXX_STATIC
61#define LIBCXX_STATIC NULL
62#endif
63
64#ifndef LIBCXXABI
65#define LIBCXXABI "c++abi"
66#endif
67#ifndef LIBCXXABI_PROFILE
68#define LIBCXXABI_PROFILE LIBCXXABI
69#endif
70#ifndef LIBCXXABI_STATIC
71#define LIBCXXABI_STATIC NULL
72#endif
73
74/* The values used here must match those of the stdlib_kind enumeration
75 in c.opt. */
76enum stdcxxlib_kind
77{
78 USE_LIBSTDCXX = 1,
79 USE_LIBCXX = 2
80};
81
f442f723 82void
d9d16a19
JM
83lang_specific_driver (struct cl_decoded_option **in_decoded_options,
84 unsigned int *in_decoded_options_count,
5671bf27 85 int *in_added_libraries)
f442f723 86{
d9d16a19 87 unsigned int i, j;
f442f723 88
838dfd8a 89 /* If nonzero, the user gave us the `-p' or `-pg' flag. */
271f61fb
DB
90 int saw_profile_flag = 0;
91
662b9c55
IS
92 /* What action to take for the c++ runtime library:
93 -1 means we should not link it in.
94 0 means we should link it if it is needed.
95 1 means it is needed and should be linked in.
96 2 means it is needed but should be linked statically. */
17211ab5 97 int library = 0;
f442f723 98
662b9c55
IS
99 /* Which c++ runtime library to link. */
100 stdcxxlib_kind which_library = USE_LIBSTDCXX;
101
f442f723
MS
102 /* The number of arguments being added to what's in argv, other than
103 libraries. We use this to track the number of times we've inserted
104 -xc++/-xnone. */
17211ab5 105 int added = 0;
f442f723 106
f442f723 107 /* The new argument list will be contained in this. */
d9d16a19 108 struct cl_decoded_option *new_decoded_options;
f442f723 109
838dfd8a 110 /* Nonzero if we saw a `-xfoo' language specification on the
f442f723
MS
111 command line. Used to avoid adding our own -xc++ if the user
112 already gave a language for the file. */
113 int saw_speclang = 0;
114
115 /* "-lm" or "-lmath" if it appears on the command line. */
d9d16a19 116 const struct cl_decoded_option *saw_math = NULL;
f442f723 117
ff082cab
RO
118 /* "-lrt" or eqivalent if it appears on the command line. */
119 const struct cl_decoded_option *saw_time = NULL;
120
f442f723 121 /* "-lc" if it appears on the command line. */
d9d16a19 122 const struct cl_decoded_option *saw_libc = NULL;
f442f723
MS
123
124 /* An array used to flag each argument that needs a bit set for
55ebb0d6 125 LANGSPEC, MATHLIB, or WITHLIBC. */
f442f723
MS
126 int *args;
127
b54ccf71
JM
128 /* By default, we throw on the math library if we have one. */
129 int need_math = (MATH_LIBRARY[0] != '\0');
f442f723 130
b20a3854
JM
131 /* By default, we don't add -lstdc++exp. */
132 bool need_experimental = false;
133
96be7a11
ILT
134 /* True if we saw -static. */
135 int static_link = 0;
136
049f6ec9
MM
137 /* True if we should add -shared-libgcc to the command-line. */
138 int shared_libgcc = 1;
139
f442f723 140 /* The total number of arguments with the new stuff. */
d9d16a19 141 unsigned int argc;
f442f723
MS
142
143 /* The argument list. */
d9d16a19 144 struct cl_decoded_option *decoded_options;
f442f723 145
84914634
JW
146 /* The number of libraries added in. */
147 int added_libraries;
148
f442f723 149 /* The total number of arguments with the new stuff. */
d9d16a19 150 unsigned int num_args = 1;
f442f723 151
d9d16a19
JM
152 argc = *in_decoded_options_count;
153 decoded_options = *in_decoded_options;
84914634 154 added_libraries = *in_added_libraries;
f442f723 155
67f5655f 156 args = XCNEWVEC (int, argc);
f442f723 157
1bf2b2d2 158 for (i = 1; i < argc; i++)
f442f723 159 {
d9d16a19
JM
160 const char *arg = decoded_options[i].arg;
161 if (decoded_options[i].errors & CL_ERR_MISSING_ARG)
162 continue; /* Avoid examining arguments of options missing them. */
f442f723 163
d9d16a19 164 switch (decoded_options[i].opt_index)
f442f723 165 {
2efb237f 166 case OPT_fcontracts:
b20a3854 167 need_experimental = true;
2efb237f
JCI
168 break;
169
fc2fb4fd 170 case OPT_nostdlib__:
6d3c634c
JM
171 args[i] |= SKIPOPT;
172 /* FALLTHRU */
173 case OPT_nostdlib:
d9d16a19
JM
174 case OPT_nodefaultlibs:
175 library = -1;
176 break;
177
178 case OPT_l:
179 if (strcmp (arg, MATH_LIBRARY) == 0)
f442f723
MS
180 {
181 args[i] |= MATHLIB;
182 need_math = 0;
183 }
d9d16a19 184 else if (strcmp (arg, "c") == 0)
f442f723 185 args[i] |= WITHLIBC;
d9d16a19
JM
186 else
187 /* Unrecognized libraries (e.g. -lfoo) may require libstdc++. */
188 library = (library == 0) ? 1 : library;
189 break;
190
191 case OPT_pg:
192 case OPT_p:
193 saw_profile_flag++;
194 break;
195
196 case OPT_x:
197 if (library == 0
198 && (strcmp (arg, "c++") == 0
199 || strcmp (arg, "c++-cpp-output") == 0
200 || strcmp (arg, "objective-c++") == 0
201 || strcmp (arg, "objective-c++-cpp-output") == 0))
202 library = 1;
a073516d 203
d9d16a19
JM
204 saw_speclang = 1;
205 break;
206
207 case OPT_Xlinker:
208 case OPT_Wl_:
01e05466
GK
209 /* Arguments that go directly to the linker might be .o files,
210 or something, and so might cause libstdc++ to be needed. */
d9d16a19
JM
211 if (library == 0)
212 library = 1;
213 break;
214
215 case OPT_c:
0b7fb27b 216 case OPT_r:
d9d16a19
JM
217 case OPT_S:
218 case OPT_E:
219 case OPT_M:
220 case OPT_MM:
221 case OPT_fsyntax_only:
222 /* Don't specify libraries if we won't link, since that would
223 cause a warning. */
224 library = -1;
225 break;
226
227 case OPT_static:
228 static_link = 1;
229 break;
230
231 case OPT_static_libgcc:
232 shared_libgcc = 0;
233 break;
234
235 case OPT_static_libstdc__:
236 library = library >= 0 ? 2 : library;
a8468177
IS
237#ifdef HAVE_LD_STATIC_DYNAMIC
238 /* Remove -static-libstdc++ from the command only if target supports
239 LD_STATIC_DYNAMIC. When not supported, it is left in so that a
240 back-end target can use outfile substitution. */
d9d16a19 241 args[i] |= SKIPOPT;
a8468177 242#endif
d9d16a19
JM
243 break;
244
662b9c55
IS
245 case OPT_stdlib_:
246 which_library = (stdcxxlib_kind) decoded_options[i].value;
247 break;
248
d9d16a19
JM
249 case OPT_SPECIAL_input_file:
250 {
251 int len;
252
253 /* We don't do this anymore, since we don't get them with minus
254 signs on them. */
255 if (arg[0] == '\0' || arg[1] == '\0')
f442f723 256 continue;
f442f723 257
d9d16a19
JM
258 if (saw_speclang)
259 {
260 saw_speclang = 0;
261 continue;
262 }
263
264 /* If the filename ends in .[chi], put options around it.
265 But not if a specified -x option is currently active. */
266 len = strlen (arg);
267 if (len > 2
268 && (arg[len - 1] == 'c'
269 || arg[len - 1] == 'i'
270 || arg[len - 1] == 'h')
271 && arg[len - 2] == '.')
272 {
273 args[i] |= LANGSPEC;
274 added += 2;
275 }
276
277 /* If we don't know that this is a header file, we might
278 need to be linking in the libraries. */
279 if (library == 0)
280 {
281 if ((len <= 2 || strcmp (arg + (len - 2), ".H") != 0)
282 && (len <= 2 || strcmp (arg + (len - 2), ".h") != 0)
283 && (len <= 4 || strcmp (arg + (len - 4), ".hpp") != 0)
284 && (len <= 3 || strcmp (arg + (len - 3), ".hp") != 0)
285 && (len <= 4 || strcmp (arg + (len - 4), ".hxx") != 0)
286 && (len <= 4 || strcmp (arg + (len - 4), ".h++") != 0)
287 && (len <= 4 || strcmp (arg + (len - 4), ".HPP") != 0)
288 && (len <= 4 || strcmp (arg + (len - 4), ".tcc") != 0)
289 && (len <= 3 || strcmp (arg + (len - 3), ".hh") != 0))
290 library = 1;
291 }
292 }
293 break;
f442f723
MS
294 }
295 }
296
049f6ec9
MM
297 /* There's no point adding -shared-libgcc if we don't have a shared
298 libgcc. */
299#ifndef ENABLE_SHARED_LIBGCC
300 shared_libgcc = 0;
301#endif
302
d9d16a19 303 /* Add one for shared_libgcc or extra static library. */
b20a3854
JM
304 num_args = (argc + added + need_math + need_experimental
305 + (library > 0) * 4 + 1);
662b9c55
IS
306 /* For libc++, on most platforms, the ABI library (usually called libc++abi)
307 is provided as a separate DSO, which we must also append.
308 However, a platform might have the ability to forward the ABI library
309 from libc++, or combine it in some other way; in that case, LIBCXXABI
310 should be set to NULL to signal that it need not be appended. */
311 if (which_library == USE_LIBCXX && LIBCXXABI != NULL)
312 num_args += 4;
d9d16a19 313 new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
f442f723 314
834c6dff
MM
315 i = 0;
316 j = 0;
c8094d83 317
834c6dff 318 /* Copy the 0th argument, i.e., the name of the program itself. */
d9d16a19 319 new_decoded_options[j++] = decoded_options[i++];
834c6dff 320
f442f723 321 /* NOTE: We start at 1 now, not 0. */
834c6dff 322 while (i < argc)
f442f723 323 {
d9d16a19 324 new_decoded_options[j] = decoded_options[i];
f442f723
MS
325
326 /* Make sure -lstdc++ is before the math library, since libstdc++
327 itself uses those math routines. */
17211ab5 328 if (!saw_math && (args[i] & MATHLIB) && library > 0)
f442f723
MS
329 {
330 --j;
d9d16a19 331 saw_math = &decoded_options[i];
f442f723
MS
332 }
333
17211ab5 334 if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
f442f723
MS
335 {
336 --j;
d9d16a19 337 saw_libc = &decoded_options[i];
f442f723
MS
338 }
339
17211ab5 340 /* Wrap foo.[chi] files in a language specification to
f442f723
MS
341 force the gcc compiler driver to run cc1plus on them. */
342 if (args[i] & LANGSPEC)
343 {
d9d16a19
JM
344 const char *arg = decoded_options[i].arg;
345 int len = strlen (arg);
346 switch (arg[len - 1])
17211ab5
GK
347 {
348 case 'c':
d9d16a19
JM
349 generate_option (OPT_x, "c++", 1, CL_DRIVER,
350 &new_decoded_options[j++]);
17211ab5
GK
351 break;
352 case 'i':
d9d16a19
JM
353 generate_option (OPT_x, "c++-cpp-output", 1, CL_DRIVER,
354 &new_decoded_options[j++]);
17211ab5
GK
355 break;
356 case 'h':
d9d16a19
JM
357 generate_option (OPT_x, "c++-header", 1, CL_DRIVER,
358 &new_decoded_options[j++]);
17211ab5
GK
359 break;
360 default:
8dc2b103 361 gcc_unreachable ();
17211ab5 362 }
d9d16a19
JM
363 new_decoded_options[j++] = decoded_options[i];
364 generate_option (OPT_x, "none", 1, CL_DRIVER,
365 &new_decoded_options[j]);
f442f723 366 }
f442f723 367
96be7a11
ILT
368 if ((args[i] & SKIPOPT) != 0)
369 --j;
370
834c6dff
MM
371 i++;
372 j++;
373 }
eeb109f2 374
f442f723 375 /* Add `-lstdc++' if we haven't already done so. */
17211ab5 376 if (library > 0)
84914634 377 {
b20a3854
JM
378 if (need_experimental && which_library == USE_LIBSTDCXX)
379 {
380 generate_option (OPT_l, "stdc++exp", 1, CL_DRIVER,
381 &new_decoded_options[j++]);
382 ++added_libraries;
383 }
96be7a11
ILT
384#ifdef HAVE_LD_STATIC_DYNAMIC
385 if (library > 1 && !static_link)
386 {
c6092243 387 generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER,
d9d16a19 388 &new_decoded_options[j]);
96be7a11
ILT
389 j++;
390 }
391#endif
662b9c55
IS
392 if (which_library == USE_LIBCXX)
393 {
394 generate_option (OPT_l,
395 saw_profile_flag ? LIBCXX_PROFILE : LIBCXX, 1,
396 CL_DRIVER, &new_decoded_options[j]);
397 if (LIBCXXABI != NULL)
398 {
399 j++;
400 added_libraries++;
401 generate_option (OPT_l,
402 saw_profile_flag ? LIBCXXABI_PROFILE
403 : LIBCXXABI, 1,
404 CL_DRIVER, &new_decoded_options[j]);
405 }
406 }
407 else
408 generate_option (OPT_l,
409 saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX, 1,
410 CL_DRIVER, &new_decoded_options[j]);
d9d16a19 411 added_libraries++;
a322799d 412 j++;
96be7a11
ILT
413 /* Add target-dependent static library, if necessary. */
414 if ((static_link || library > 1) && LIBSTDCXX_STATIC != NULL)
415 {
d9d16a19
JM
416 generate_option (OPT_l, LIBSTDCXX_STATIC, 1,
417 CL_DRIVER, &new_decoded_options[j]);
418 added_libraries++;
96be7a11
ILT
419 j++;
420 }
421#ifdef HAVE_LD_STATIC_DYNAMIC
422 if (library > 1 && !static_link)
423 {
c6092243 424 generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER,
d9d16a19 425 &new_decoded_options[j]);
96be7a11
ILT
426 j++;
427 }
428#endif
84914634 429 }
f442f723 430 if (saw_math)
d9d16a19 431 new_decoded_options[j++] = *saw_math;
17211ab5 432 else if (library > 0 && need_math)
84914634 433 {
d9d16a19
JM
434 generate_option (OPT_l,
435 saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY,
436 1, CL_DRIVER, &new_decoded_options[j]);
437 added_libraries++;
4afd7f6c 438 j++;
84914634 439 }
ff082cab
RO
440 if (saw_time)
441 new_decoded_options[j++] = *saw_time;
f442f723 442 if (saw_libc)
d9d16a19 443 new_decoded_options[j++] = *saw_libc;
96be7a11 444 if (shared_libgcc && !static_link)
d9d16a19
JM
445 generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
446 &new_decoded_options[j++]);
f442f723 447
d9d16a19
JM
448 *in_decoded_options_count = j;
449 *in_decoded_options = new_decoded_options;
84914634 450 *in_added_libraries = added_libraries;
f442f723 451}
240661ba 452
c6002625 453/* Called before linking. Returns 0 on success and -1 on failure. */
bf9d3c27 454int lang_specific_pre_link (void) /* Not used for C++. */
240661ba
PB
455{
456 return 0;
457}
458
c6002625
KH
459/* Number of extra output files that lang_specific_pre_link may generate. */
460int lang_specific_extra_outfiles = 0; /* Not used for C++. */