]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gcc.c
re PR fortran/44054 (Handle -Werror, -Werror=, -fdiagnostics-show-option, !GCC$ diagn...
[thirdparty/gcc.git] / gcc / gcc.c
CommitLineData
ed1f651b 1/* Compiler driver program that can handle many languages.
98db73df 2 Copyright (C) 1987-2014 Free Software Foundation, Inc.
ed1f651b 3
1322177d 4This file is part of GCC.
ed1f651b 5
1322177d
LB
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
1322177d 9version.
ed1f651b 10
1322177d
LB
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
ed1f651b
RS
15
16You should have received a copy of the GNU General Public License
9dcd6f09 17along with GCC; see the file COPYING3. If not see
8a554c70 18<http://www.gnu.org/licenses/>. */
ed1f651b
RS
19
20/* This program is the user interface to the C compiler and possibly to
21other compilers. It is used because compilation is a complicated procedure
22which involves running several programs and passing temporary files between
23them, forwarding the users switches to those programs selectively,
24and deleting the temporary files at the end.
25
26CC recognizes how to compile each input file by suffixes in the file names.
27Once it knows which kind of compilation to perform, the procedure for
28compilation is specified by a string called a "spec". */
c5c76735 29
e9a25f70 30#include "config.h"
670ee920 31#include "system.h"
4977bab6 32#include "coretypes.h"
1713a69f 33#include "multilib.h" /* before tm.h */
4977bab6 34#include "tm.h"
ed5b9f96 35#include "xregex.h"
17248a6b 36#include "obstack.h"
ab87f8c8 37#include "intl.h"
460ee112 38#include "prefix.h"
9257393c 39#include "gcc.h"
6afbc885 40#include "diagnostic.h"
8a63621f 41#include "flags.h"
14c7833c 42#include "opts.h"
a7d0d30f 43#include "params.h"
5b634ee0 44#include "vec.h"
ba78087b 45#include "filenames.h"
c10d53dd 46
45936a85
DD
47/* By default there is no special suffix for target executables. */
48/* FIXME: when autoconf is fixed, remove the host check - dj */
49#if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
50#define HAVE_TARGET_EXECUTABLE_SUFFIX
ed1f651b 51#endif
f6ec7e54 52
45936a85
DD
53/* By default there is no special suffix for host executables. */
54#ifdef HOST_EXECUTABLE_SUFFIX
55#define HAVE_HOST_EXECUTABLE_SUFFIX
f70165f6 56#else
45936a85
DD
57#define HOST_EXECUTABLE_SUFFIX ""
58#endif
59
60/* By default, the suffix for target object files is ".o". */
61#ifdef TARGET_OBJECT_SUFFIX
62#define HAVE_TARGET_OBJECT_SUFFIX
63#else
64#define TARGET_OBJECT_SUFFIX ".o"
ed7dae04
RK
65#endif
66
8b60264b 67static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
48ff801b 68
512b62fb
JM
69/* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
70#ifndef LIBRARY_PATH_ENV
71#define LIBRARY_PATH_ENV "LIBRARY_PATH"
72#endif
73
ed1f651b
RS
74/* If a stage of compilation returns an exit status >= 1,
75 compilation of that file ceases. */
76
77#define MIN_FATAL_STATUS 1
78
69927b59
NB
79/* Flag set by cppspec.c to 1. */
80int is_cpp_driver;
81
110abdbc 82/* Flag set to nonzero if an @file argument has been supplied to gcc. */
2091ff66
NF
83static bool at_file_supplied;
84
f5fa9a5b
PE
85/* Definition of string containing the arguments given to configure. */
86#include "configargs.h"
87
b8468bc7
NC
88/* Flag saying to print the command line options understood by gcc and its
89 sub-processes. */
90
91static int print_help_list;
92
41fd0f9b
RAE
93/* Flag saying to print the version of gcc and its sub-processes. */
94
95static int print_version;
96
99f78cdd
IR
97/* Flag indicating whether we should ONLY print the command and
98 arguments (like verbose_flag) without executing the command.
99 Displayed arguments are quoted so that the generated command
100 line is suitable for execution. This is intended for use in
101 shell scripts to capture the driver-generated command line. */
102static int verbose_only_flag;
103
c662432e 104/* Flag indicating how to print command line options of sub-processes. */
91606ce2 105
c662432e 106static int print_subprocess_help;
91606ce2 107
b78e932d
L
108/* Linker suffix passed to -fuse-ld=... */
109static const char *use_ld;
110
bdde878c
AO
111/* Whether we should report subprocess execution times to a file. */
112
113FILE *report_times_to_file = NULL;
114
4977bab6
ZW
115/* Nonzero means place this string before uses of /, so that include
116 and library files can be found in an alternate location. */
117
db720d9a 118#ifdef TARGET_SYSTEM_ROOT
4977bab6 119static const char *target_system_root = TARGET_SYSTEM_ROOT;
db720d9a
DJ
120#else
121static const char *target_system_root = 0;
122#endif
4977bab6 123
047d636f
DJ
124/* Nonzero means pass the updated target_system_root to the compiler. */
125
126static int target_system_root_changed;
127
e7f13528
GP
128/* Nonzero means append this string to target_system_root. */
129
130static const char *target_sysroot_suffix = 0;
131
132/* Nonzero means append this string to target_system_root for headers. */
133
134static const char *target_sysroot_hdrs_suffix = 0;
135
ed1f651b
RS
136/* Nonzero means write "temp" files in source directory
137 and use the source file's name in them, and don't delete them. */
138
14fdc613
MM
139static enum save_temps {
140 SAVE_TEMPS_NONE, /* no -save-temps */
141 SAVE_TEMPS_CWD, /* -save-temps in current directory */
142 SAVE_TEMPS_OBJ /* -save-temps in object directory */
143} save_temps_flag;
144
145/* Output file to use to get the object directory for -save-temps=obj */
146static char *save_temps_prefix = 0;
147static size_t save_temps_length = 0;
ed1f651b 148
53117a2f 149/* The compiler version. */
ed1f651b 150
3b304f5b 151static const char *compiler_version;
53117a2f 152
1401cf37 153/* The target version. */
53117a2f 154
37a4aa31 155static const char *const spec_version = DEFAULT_TARGET_VERSION;
ed1f651b 156
1401cf37 157/* The target machine. */
ed1f651b 158
878f32c3 159static const char *spec_machine = DEFAULT_TARGET_MACHINE;
ed1f651b 160
004fd4d5
RS
161/* Nonzero if cross-compiling.
162 When -b is used, the value comes from the `specs' file. */
163
2989d30c 164#ifdef CROSS_DIRECTORY_STRUCTURE
3b304f5b 165static const char *cross_compile = "1";
004fd4d5 166#else
3b304f5b 167static const char *cross_compile = "0";
004fd4d5
RS
168#endif
169
14a774a9
RK
170/* Greatest exit code of sub-processes that has been encountered up to
171 now. */
172static int greatest_status = 1;
173
ed1f651b
RS
174/* This is the obstack which we use to allocate many strings. */
175
176static struct obstack obstack;
177
b3865ca9 178/* This is the obstack to build an environment variable to pass to
6dc42e49 179 collect2 that describes all of the relevant switches of what to
b3865ca9
RS
180 pass the compiler in building the list of pointers to constructors
181 and destructors. */
182
183static struct obstack collect_obstack;
184
99360286
DE
185/* Forward declaration for prototypes. */
186struct path_prefix;
76391e5a 187struct prefix_list;
99360286 188
1d088dee
AJ
189static void init_spec (void);
190static void store_arg (const char *, int, int);
fe7df9c4 191static void insert_wrapper (const char *);
1d088dee 192static char *load_specs (const char *);
d168aaee
CB
193static void read_specs (const char *, bool, bool);
194static void set_spec (const char *, const char *, bool);
1d088dee 195static struct compiler *lookup_compiler (const char *, size_t, const char *);
00dcee0c
AM
196static char *build_search_list (const struct path_prefix *, const char *,
197 bool, bool);
e9c15f6e 198static void xputenv (const char *);
00dcee0c
AM
199static void putenv_from_prefixes (const struct path_prefix *, const char *,
200 bool);
1d088dee 201static int access_check (const char *, int);
00dcee0c 202static char *find_a_file (const struct path_prefix *, const char *, int, bool);
1d088dee 203static void add_prefix (struct path_prefix *, const char *, const char *,
1a5d37a1 204 int, int, int);
1d088dee 205static void add_sysrooted_prefix (struct path_prefix *, const char *,
1a5d37a1 206 const char *, int, int, int);
1d088dee
AJ
207static char *skip_whitespace (char *);
208static void delete_if_ordinary (const char *);
209static void delete_temp_files (void);
210static void delete_failure_queue (void);
211static void clear_failure_queue (void);
212static int check_live_switch (int, int);
213static const char *handle_braces (const char *);
214static inline bool input_suffix_matches (const char *, const char *);
215static inline bool switch_matches (const char *, const char *, int);
216static inline void mark_matching_switches (const char *, const char *, int);
217static inline void process_marked_switches (void);
218static const char *process_brace_body (const char *, const char *, const char *, int, int);
219static const struct spec_function *lookup_spec_function (const char *);
220static const char *eval_spec_function (const char *, const char *);
de5a5fa1 221static const char *handle_spec_function (const char *, bool *);
1d088dee
AJ
222static char *save_string (const char *, int);
223static void set_collect_gcc_options (void);
224static int do_spec_1 (const char *, int, const char *);
225static int do_spec_2 (const char *);
226static void do_option_spec (const char *, const char *);
227static void do_self_spec (const char *);
228static const char *find_file (const char *);
00dcee0c 229static int is_directory (const char *, bool);
d168aaee 230static const char *validate_switches (const char *, bool);
1d088dee 231static void validate_all_switches (void);
d168aaee 232static inline void validate_switches_from_spec (const char *, bool);
1d088dee
AJ
233static void give_switch (int, int);
234static int used_arg (const char *, int);
235static int default_arg (const char *, int);
236static void set_multilib_dir (void);
237static void print_multilib_info (void);
238static void perror_with_name (const char *);
1d088dee
AJ
239static void display_help (void);
240static void add_preprocessor_option (const char *, int);
241static void add_assembler_option (const char *, int);
242static void add_linker_option (const char *, int);
60cf253a 243static void process_command (unsigned int, struct cl_decoded_option *);
1d088dee
AJ
244static int execute (void);
245static void alloc_args (void);
246static void clear_args (void);
2dec80c7 247static void fatal_signal (int);
328163dc 248#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1d088dee
AJ
249static void init_gcc_specs (struct obstack *, const char *, const char *,
250 const char *);
6894579f 251#endif
40cdfca6 252#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
1d088dee 253static const char *convert_filename (const char *, int, int);
40cdfca6 254#endif
f3226a90 255
1120a850 256static void try_generate_repro (const char **argv);
30d8946b 257static const char *getenv_spec_function (int, const char **);
1d088dee
AJ
258static const char *if_exists_spec_function (int, const char **);
259static const char *if_exists_else_spec_function (int, const char **);
de5a5fa1 260static const char *sanitize_spec_function (int, const char **);
3dd53121 261static const char *replace_outfile_spec_function (int, const char **);
2642f659 262static const char *remove_outfile_spec_function (int, const char **);
ed5b9f96 263static const char *version_compare_spec_function (int, const char **);
953ff289 264static const char *include_spec_function (int, const char **);
4adbd5dd 265static const char *find_file_spec_function (int, const char **);
c1ce46a5 266static const char *find_plugindir_spec_function (int, const char **);
a0f87454 267static const char *print_asm_header_spec_function (int, const char **);
2153915d
AO
268static const char *compare_debug_dump_opt_spec_function (int, const char **);
269static const char *compare_debug_self_opt_spec_function (int, const char **);
270static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
9a37bc07 271static const char *pass_through_libs_spec_func (int, const char **);
99ea153e 272static const char *replace_extension_spec_func (int, const char **);
3c27ce4c 273static char *convert_white_space (char *);
ed1f651b 274\f
d991c721
BK
275/* The Specs Language
276
277Specs are strings containing lines, each of which (if not blank)
ed1f651b
RS
278is made up of a program name, and arguments separated by spaces.
279The program name must be exact and start from root, since no path
280is searched and it is unreliable to depend on the current working directory.
281Redirection of input or output is not supported; the subprograms must
282accept filenames saying what files to read and write.
283
284In addition, the specs can contain %-sequences to substitute variable text
285or for conditional text. Here is a table of all defined %-sequences.
286Note that spaces are not generated automatically around the results of
287expanding these sequences; therefore, you can concatenate them together
288or with constant text in a single argument.
289
290 %% substitute one % into the program name or argument.
291 %i substitute the name of the input file being processed.
292 %b substitute the basename of the input file being processed.
293 This is the substring up to (and not including) the last period
14fdc613 294 and not including the directory unless -save-temps was specified
3beb864c 295 to put temporaries in a different location.
ea414c97 296 %B same as %b, but include the file suffix (text after the last period).
dd75c292
CB
297 %gSUFFIX
298 substitute a file name that has suffix SUFFIX and is chosen
299 once per compilation, and mark the argument a la %d. To reduce
300 exposure to denial-of-service attacks, the file name is now
301 chosen in a way that is hard to predict even when previously
302 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
303 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
a92dd235 304 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
a1d9074c
TT
305 had been pre-processed. Previously, %g was simply substituted
306 with a file name chosen once per compilation, without regard
307 to any appended suffix (which was therefore treated just like
308 ordinary text), making such attacks more likely to succeed.
4977bab6
ZW
309 %|SUFFIX
310 like %g, but if -pipe is in effect, expands simply to "-".
311 %mSUFFIX
312 like %g, but if -pipe is in effect, expands to nothing. (We have both
313 %| and %m to accommodate differences between system assemblers; see
314 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
dd75c292
CB
315 %uSUFFIX
316 like %g, but generates a new temporary file name even if %uSUFFIX
317 was already seen.
318 %USUFFIX
319 substitutes the last file name generated with %uSUFFIX, generating a
320 new one if there is no such last file name. In the absence of any
321 %uSUFFIX, this is just like %gSUFFIX, except they don't share
322 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
323 would involve the generation of two distinct file names, one
324 for each `%g.s' and another for each `%U.s'. Previously, %U was
325 simply substituted with a file name chosen for the previous %u,
326 without regard to any appended suffix.
49009afd
JL
327 %jSUFFIX
328 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
329 writable, and if save-temps is off; otherwise, substitute the name
330 of a temporary file, just like %u. This temporary file is not
331 meant for communication between processes, but rather as a junk
332 disposal mechanism.
11972f66
NS
333 %.SUFFIX
334 substitutes .SUFFIX for the suffixes of a matched switch's args when
335 it is subsequently output with %*. SUFFIX is terminated by the next
336 space or %.
ed1f651b 337 %d marks the argument containing or following the %d as a
ee618c17 338 temporary file name, so that that file will be deleted if GCC exits
ed1f651b
RS
339 successfully. Unlike %g, this contributes no text to the argument.
340 %w marks the argument containing or following the %w as the
341 "output file" of this compilation. This puts the argument
342 into the sequence of arguments that %o will substitute later.
17211ab5 343 %V indicates that this compilation produces no "output file".
ed1f651b
RS
344 %W{...}
345 like %{...} but mark last argument supplied within
346 as a file to be deleted on failure.
347 %o substitutes the names of all the output files, with spaces
348 automatically placed around them. You should write spaces
349 around the %o as well or the results are undefined.
350 %o is for use in the specs for running the linker.
351 Input files whose names have no recognized suffix are not compiled
352 at all, but they are included among the output files, so they will
353 be linked.
dd75c292 354 %O substitutes the suffix for object files. Note that this is
a1d9074c
TT
355 handled specially when it immediately follows %g, %u, or %U
356 (with or without a suffix argument) because of the need for
357 those to form complete file names. The handling is such that
358 %O is treated exactly as if it had already been substituted,
359 except that %g, %u, and %U do not currently support additional
360 SUFFIX characters following %O as they would following, for
361 example, `.o'.
047d636f 362 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
2b6dd222
JM
363 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
364 and -B options) and -imultilib as necessary.
ed1f651b
RS
365 %s current argument is the name of a library or startup file of some sort.
366 Search for that file in a standard list of directories
367 and substitute the full name found.
368 %eSTR Print STR as an error message. STR is terminated by a newline.
369 Use this when inconsistent options are detected.
09da1532 370 %nSTR Print STR as a notice. STR is terminated by a newline.
ed1f651b
RS
371 %x{OPTION} Accumulate an option for %X.
372 %X Output the accumulated linker options specified by compilations.
c9ebacb8 373 %Y Output the accumulated assembler options specified by compilations.
57cb9b60 374 %Z Output the accumulated preprocessor options specified by compilations.
ed1f651b
RS
375 %a process ASM_SPEC as a spec.
376 This allows config.h to specify part of the spec for running as.
377 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
378 used here. This can be used to run a post-processor after the
9ec36da5 379 assembler has done its job.
48ff801b 380 %D Dump out a -L option for each directory in startfile_prefixes.
60103a34 381 If multilib_dir is set, extra entries are generated with it affixed.
ed1f651b
RS
382 %l process LINK_SPEC as a spec.
383 %L process LIB_SPEC as a spec.
3cd50158 384 %M Output multilib_os_dir.
68d69835 385 %G process LIBGCC_SPEC as a spec.
380e5ca4
MM
386 %R Output the concatenation of target_system_root and
387 target_sysroot_suffix.
ed1f651b
RS
388 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
389 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
9db0819e 390 %C process CPP_SPEC as a spec.
ed1f651b
RS
391 %1 process CC1_SPEC as a spec.
392 %2 process CC1PLUS_SPEC as a spec.
393 %* substitute the variable part of a matched option. (See below.)
394 Note that each comma in the substituted string is replaced by
25990163
NC
395 a single space. A space is appended after the last substition
396 unless there is more text in current sequence.
4977bab6
ZW
397 %<S remove all occurrences of -S from the command line.
398 Note - this command is position dependent. % commands in the
399 spec string before this one will see -S, % commands in the
400 spec string after this one will not.
96f5b137 401 %>S Similar to "%<S", but keep it in the GCC command line.
4977bab6
ZW
402 %<S* remove all occurrences of all switches beginning with -S from the
403 command line.
f3226a90
JT
404 %:function(args)
405 Call the named function FUNCTION, passing it ARGS. ARGS is
406 first processed as a nested spec string, then split into an
407 argument vector in the usual fashion. The function returns
408 a string which is processed as if it had appeared literally
409 as part of the current spec.
ee618c17 410 %{S} substitutes the -S switch, if that switch was given to GCC.
ed1f651b
RS
411 If that switch was not specified, this substitutes nothing.
412 Here S is a metasyntactic variable.
ee618c17 413 %{S*} substitutes all the switches specified to GCC whose names start
196a37f4 414 with -S. This is used for -o, -I, etc; switches that take
ee618c17 415 arguments. GCC considers `-o foo' as being one switch whose
ed1f651b
RS
416 name starts with `o'. %{o*} would substitute this text,
417 including the space; thus, two arguments would be generated.
196a37f4 418 %{S*&T*} likewise, but preserve order of S and T options (the order
1d088dee
AJ
419 of S and T in the spec is not significant). Can be any number
420 of ampersand-separated variables; for each the wild card is
421 optional. Useful for CPP as %{D*&U*&A*}.
4977bab6 422
ee618c17
BE
423 %{S:X} substitutes X, if the -S switch was given to GCC.
424 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
4977bab6 425 %{S*:X} substitutes X if one or more switches whose names start
ee618c17 426 with -S was given to GCC. Normally X is substituted only
4977bab6
ZW
427 once, no matter how many such switches appeared. However,
428 if %* appears somewhere in X, then X will be substituted
429 once for each matching switch, with the %* replaced by the
25990163
NC
430 part of that switch that matched the '*'. A space will be
431 appended after the last substition unless there is more
432 text in current sequence.
4977bab6
ZW
433 %{.S:X} substitutes X, if processing a file with suffix S.
434 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
48137d59
GK
435 %{,S:X} substitutes X, if processing a file which will use spec S.
436 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
3beb864c 437
ee618c17 438 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
48137d59
GK
439 combined with '!', '.', ',', and '*' as above binding stronger
440 than the OR.
4977bab6
ZW
441 If %* appears in X, all of the alternatives must be starred, and
442 only the first matching alternative is substituted.
de5a5fa1
MP
443 %{%:function(args):X}
444 Call function named FUNCTION with args ARGS. If the function
445 returns non-NULL, then X is substituted, if it returns
446 NULL, it isn't substituted.
ee618c17
BE
447 %{S:X; if S was given to GCC, substitutes X;
448 T:Y; else if T was given to GCC, substitutes Y;
4977bab6 449 :D} else substitutes D. There can be as many clauses as you need.
48137d59 450 This may be combined with '.', '!', ',', '|', and '*' as above.
4977bab6 451
b3865ca9 452 %(Spec) processes a specification defined in a specs file as *Spec:
ed1f651b 453
4977bab6 454The conditional text X in a %{S:X} or similar construct may contain
ed1f651b 455other nested % constructs or spaces, or even newlines. They are
4977bab6
ZW
456processed as usual, as described above. Trailing white space in X is
457ignored. White space may also appear anywhere on the left side of the
458colon in these constructs, except between . or * and the corresponding
459word.
ed1f651b 460
99ea153e 461The -O, -f, -g, -m, and -W switches are handled specifically in these
f5b0eb4e
RK
462constructs. If another value of -O or the negated form of a -f, -m, or
463-W switch is found later in the command line, the earlier switch
6c396fb5
RK
464value is ignored, except with {S*} where S is just one letter; this
465passes all matching options.
f5b0eb4e 466
9bf09437
RH
467The character | at the beginning of the predicate text is used to indicate
468that a command should be piped to the following command, but only if -pipe
469is specified.
ed1f651b 470
ee618c17 471Note that it is built into GCC which switches take arguments and which
ed1f651b
RS
472do not. You might think it would be useful to generalize this to
473allow each compiler's spec to say which switches take arguments. But
ee618c17 474this cannot be done in a consistent fashion. GCC cannot even decide
ed1f651b
RS
475which input files have been specified without knowing which switches
476take arguments, and it must know which input files to compile in order
477to tell which compilers to run.
478
ee618c17 479GCC also knows implicitly that arguments starting in `-l' are to be
ed1f651b
RS
480treated as compiler output files, and passed to the linker in their
481proper position among the other output files. */
482\f
0fef3fd0 483/* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
ed1f651b
RS
484
485/* config.h can define ASM_SPEC to provide extra args to the assembler
486 or extra switch-translations. */
487#ifndef ASM_SPEC
488#define ASM_SPEC ""
489#endif
490
491/* config.h can define ASM_FINAL_SPEC to run a post processor after
492 the assembler has run. */
493#ifndef ASM_FINAL_SPEC
99ea153e
SA
494#define ASM_FINAL_SPEC \
495 "%{gsplit-dwarf: \n\
496 objcopy --extract-dwo \
497 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
498 %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo} \n\
499 objcopy --strip-dwo \
500 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
501 }"
ed1f651b
RS
502#endif
503
504/* config.h can define CPP_SPEC to provide extra args to the C preprocessor
505 or extra switch-translations. */
506#ifndef CPP_SPEC
507#define CPP_SPEC ""
508#endif
509
510/* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
511 or extra switch-translations. */
512#ifndef CC1_SPEC
513#define CC1_SPEC ""
514#endif
515
516/* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
517 or extra switch-translations. */
518#ifndef CC1PLUS_SPEC
519#define CC1PLUS_SPEC ""
520#endif
521
522/* config.h can define LINK_SPEC to provide extra args to the linker
523 or extra switch-translations. */
524#ifndef LINK_SPEC
525#define LINK_SPEC ""
526#endif
527
528/* config.h can define LIB_SPEC to override the default libraries. */
529#ifndef LIB_SPEC
68d69835
JM
530#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
531#endif
532
7458026b
ILT
533/* When using -fsplit-stack we need to wrap pthread_create, in order
534 to initialize the stack guard. We always use wrapping, rather than
535 shared library ordering, and we keep the wrapper function in
536 libgcc. This is not yet a real spec, though it could become one;
537 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
98906124 538 only works with GNU ld and gold. */
7458026b
ILT
539#define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
540
7e8d1b2d 541#ifndef LIBASAN_SPEC
35814b03
JJ
542#define STATIC_LIBASAN_LIBS \
543 " %{static-libasan:%:include(libsanitizer.spec)%(link_libasan)}"
e60e09a0 544#ifdef LIBASAN_EARLY_SPEC
35814b03 545#define LIBASAN_SPEC STATIC_LIBASAN_LIBS
e60e09a0 546#elif defined(HAVE_LD_STATIC_DYNAMIC)
7e8d1b2d 547#define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
03d670c8 548 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
35814b03 549 STATIC_LIBASAN_LIBS
7e8d1b2d 550#else
35814b03 551#define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
7e8d1b2d
L
552#endif
553#endif
554
e60e09a0
JJ
555#ifndef LIBASAN_EARLY_SPEC
556#define LIBASAN_EARLY_SPEC ""
557#endif
558
32b4b7f5 559#ifndef LIBTSAN_SPEC
35814b03
JJ
560#define STATIC_LIBTSAN_LIBS \
561 " %{static-libtsan:%:include(libsanitizer.spec)%(link_libtsan)}"
a74db9bd 562#ifdef LIBTSAN_EARLY_SPEC
35814b03 563#define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
a74db9bd 564#elif defined(HAVE_LD_STATIC_DYNAMIC)
32b4b7f5 565#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
a74db9bd 566 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
35814b03 567 STATIC_LIBTSAN_LIBS
32b4b7f5 568#else
35814b03 569#define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
a74db9bd 570#endif
32b4b7f5 571#endif
a74db9bd
JJ
572
573#ifndef LIBTSAN_EARLY_SPEC
574#define LIBTSAN_EARLY_SPEC ""
32b4b7f5
DV
575#endif
576
9065ada9 577#ifndef LIBLSAN_SPEC
35814b03
JJ
578#define STATIC_LIBLSAN_LIBS \
579 " %{static-liblsan:%:include(libsanitizer.spec)%(link_liblsan)}"
d30c7670
JJ
580#ifdef LIBLSAN_EARLY_SPEC
581#define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
582#elif defined(HAVE_LD_STATIC_DYNAMIC)
583#define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
9065ada9 584 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
d30c7670 585 STATIC_LIBLSAN_LIBS
9065ada9 586#else
d30c7670 587#define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
9065ada9
JJ
588#endif
589#endif
590
d30c7670
JJ
591#ifndef LIBLSAN_EARLY_SPEC
592#define LIBLSAN_EARLY_SPEC ""
593#endif
594
de5a5fa1 595#ifndef LIBUBSAN_SPEC
35814b03
JJ
596#define STATIC_LIBUBSAN_LIBS \
597 " %{static-libubsan:%:include(libsanitizer.spec)%(link_libubsan)}"
9065ada9 598#ifdef HAVE_LD_STATIC_DYNAMIC
de5a5fa1
MP
599#define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
600 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
35814b03 601 STATIC_LIBUBSAN_LIBS
de5a5fa1 602#else
35814b03 603#define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
de5a5fa1
MP
604#endif
605#endif
606
29d7cbd1
RO
607/* Linker options for compressed debug sections. */
608#if HAVE_LD_COMPRESS_DEBUG == 0
609/* No linker support. */
610#define LINK_COMPRESS_DEBUG_SPEC \
611 " %{gz*:%e-gz is not supported in this configuration} "
612#elif HAVE_LD_COMPRESS_DEBUG == 1
613/* GNU style on input, GNU ld options. Reject, not useful. */
614#define LINK_COMPRESS_DEBUG_SPEC \
615 " %{gz*:%e-gz is not supported in this configuration} "
616#elif HAVE_LD_COMPRESS_DEBUG == 2
617/* GNU style, GNU gold options. */
618#define LINK_COMPRESS_DEBUG_SPEC \
619 " %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
620 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
621 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
622#elif HAVE_LD_COMPRESS_DEBUG == 3
623/* ELF gABI style. */
624#define LINK_COMPRESS_DEBUG_SPEC \
625 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
626 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
627 " %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
628#else
629#error Unknown value for HAVE_LD_COMPRESS_DEBUG.
630#endif
631
68d69835
JM
632/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
633 included. */
634#ifndef LIBGCC_SPEC
328163dc
MA
635#if defined(REAL_LIBGCC_SPEC)
636#define LIBGCC_SPEC REAL_LIBGCC_SPEC
57642751 637#elif defined(LINK_LIBGCC_SPECIAL_1)
68d69835 638/* Have gcc do the search for libgcc.a. */
ba2b7435 639#define LIBGCC_SPEC "libgcc.a%s"
68d69835 640#else
ba2b7435 641#define LIBGCC_SPEC "-lgcc"
68d69835 642#endif
ed1f651b
RS
643#endif
644
645/* config.h can define STARTFILE_SPEC to override the default crt0 files. */
646#ifndef STARTFILE_SPEC
647#define STARTFILE_SPEC \
adcb8d7d 648 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
ed1f651b
RS
649#endif
650
ed1f651b
RS
651/* config.h can define ENDFILE_SPEC to override the default crtn files. */
652#ifndef ENDFILE_SPEC
653#define ENDFILE_SPEC ""
654#endif
655
10da1131
BM
656#ifndef LINKER_NAME
657#define LINKER_NAME "collect2"
658#endif
659
c8aea42c
PB
660#ifdef HAVE_AS_DEBUG_PREFIX_MAP
661#define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
662#else
663#define ASM_MAP ""
664#endif
665
29d7cbd1
RO
666/* Assembler options for compressed debug sections. */
667#if HAVE_LD_COMPRESS_DEBUG < 2
668/* Reject if the linker cannot write compressed debug sections. */
669#define ASM_COMPRESS_DEBUG_SPEC \
670 " %{gz*:%e-gz is not supported in this configuration} "
671#else /* HAVE_LD_COMPRESS_DEBUG >= 2 */
672#if HAVE_AS_COMPRESS_DEBUG == 0
673/* No assembler support. Ignore silently. */
674#define ASM_COMPRESS_DEBUG_SPEC \
675 " %{gz*:} "
676#elif HAVE_AS_COMPRESS_DEBUG == 1
677/* GNU style, GNU as options. */
678#define ASM_COMPRESS_DEBUG_SPEC \
679 " %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "}" \
680 " %{gz=none:" AS_NO_COMPRESS_DEBUG_OPTION "}" \
681 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
682#elif HAVE_AS_COMPRESS_DEBUG == 2
683/* ELF gABI style. */
684#define ASM_COMPRESS_DEBUG_SPEC \
685 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
686 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
687 " %{gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
688#else
689#error Unknown value for HAVE_AS_COMPRESS_DEBUG.
690#endif
691#endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */
692
5f0e9ea2
GK
693/* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
694 to the assembler. */
695#ifndef ASM_DEBUG_SPEC
b2ace8a4
JJ
696# if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
697 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
c8aea42c
PB
698# define ASM_DEBUG_SPEC \
699 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
6782438d 700 ? "%{!g0:%{gdwarf*:--gdwarf2}%{!gdwarf*:%{g*:--gstabs}}}" ASM_MAP \
c7b94907 701 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
b2ace8a4
JJ
702# else
703# if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
c7b94907 704# define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
b2ace8a4
JJ
705# endif
706# if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
c7b94907 707# define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
5f0e9ea2 708# endif
5f0e9ea2
GK
709# endif
710#endif
8a63621f
JJ
711#ifndef ASM_DEBUG_SPEC
712# define ASM_DEBUG_SPEC ""
713#endif
5f0e9ea2 714
ea414c97
ZW
715/* Here is the spec for running the linker, after compiling all files. */
716
bbd7687d
DM
717/* This is overridable by the target in case they need to specify the
718 -lgcc and -lc order specially, yet not require them to override all
719 of LINK_COMMAND_SPEC. */
720#ifndef LINK_GCC_C_SEQUENCE_SPEC
721#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
722#endif
723
77008252
JJ
724#ifndef LINK_SSP_SPEC
725#ifdef TARGET_LIBC_PROVIDES_SSP
726#define LINK_SSP_SPEC "%{fstack-protector:}"
727#else
f6bc1c4a 728#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-strong|fstack-protector-all:-lssp_nonshared -lssp}"
77008252
JJ
729#endif
730#endif
731
24a4dd31
JJ
732#ifndef LINK_PIE_SPEC
733#ifdef HAVE_LD_PIE
734#define LINK_PIE_SPEC "%{pie:-pie} "
735#else
736#define LINK_PIE_SPEC "%{pie:} "
737#endif
738#endif
739
cd533689
PP
740#ifndef LINK_BUILDID_SPEC
741# if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
742# define LINK_BUILDID_SPEC "%{!r:--build-id} "
743# endif
744#endif
745
55b46574 746/* Conditional to test whether the LTO plugin is used or not.
56e22cab
JH
747 FIXME: For slim LTO we will need to enable plugin unconditionally. This
748 still cause problems with PLUGIN_LD != LD and when plugin is built but
749 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
750 plugin only when LTO is enabled. We still honor explicit
55b46574
RO
751 -fuse-linker-plugin if the linker used understands -plugin. */
752
753/* The linker has some plugin support. */
754#if HAVE_LTO_PLUGIN > 0
755/* The linker used has full plugin support, use LTO plugin by default. */
756#if HAVE_LTO_PLUGIN == 2
f3ba16d0 757#define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
56e22cab 758#define PLUGIN_COND_CLOSE "}"
96bdf9b4 759#else
55b46574
RO
760/* The linker used has limited plugin support, use LTO plugin with explicit
761 -fuse-linker-plugin. */
96bdf9b4 762#define PLUGIN_COND "fuse-linker-plugin"
56e22cab 763#define PLUGIN_COND_CLOSE ""
96bdf9b4 764#endif
55b46574
RO
765#define LINK_PLUGIN_SPEC \
766 "%{"PLUGIN_COND": \
767 -plugin %(linker_plugin_file) \
768 -plugin-opt=%(lto_wrapper) \
769 -plugin-opt=-fresolution=%u.res \
770 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
771 }"PLUGIN_COND_CLOSE
772#else
773/* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
774#define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
775 %e-fuse-linker-plugin is not supported in this configuration}"
776#endif
96bdf9b4 777
a74db9bd
JJ
778/* Linker command line options for -fsanitize= early on the command line. */
779#ifndef SANITIZER_EARLY_SPEC
780#define SANITIZER_EARLY_SPEC "\
de5a5fa1 781%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
d30c7670
JJ
782 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
783 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}"
a74db9bd
JJ
784#endif
785
786/* Linker command line options for -fsanitize= late on the command line. */
787#ifndef SANITIZER_SPEC
788#define SANITIZER_SPEC "\
de5a5fa1 789%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
fec4842d 790 %{static:%ecannot specify -static with -fsanitize=address}}\
de5a5fa1
MP
791 %{%:sanitize(thread):" LIBTSAN_SPEC "\
792 %{!pie:%{!shared:%e-fsanitize=thread linking must be done with -pie or -shared}}}\
9065ada9
JJ
793 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
794 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}"
a74db9bd 795#endif
cd533689 796
2077db1b
CT
797/* This is the spec to use, once the code for creating the vtable
798 verification runtime library, libvtv.so, has been created. Currently
799 the vtable verification runtime functions are in libstdc++, so we use
800 the spec just below this one. */
801#ifndef VTABLE_VERIFICATION_SPEC
802#define VTABLE_VERIFICATION_SPEC "\
803%{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
804 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}"
805#endif
806
ea414c97
ZW
807/* -u* was put back because both BSD and SysV seem to support it. */
808/* %{static:} simply prevents an error message if the target machine
809 doesn't handle -static. */
810/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
811 scripts which exist in user specified directories, or in standard
812 directories. */
014d92e1 813/* We pass any -flto flags on to the linker, which is expected
d7f09764 814 to understand them. In practice, this means it had better be collect2. */
fa381cb2 815/* %{e*} includes -export-dynamic; see comment in common.opt. */
ea414c97
ZW
816#ifndef LINK_COMMAND_SPEC
817#define LINK_COMMAND_SPEC "\
818%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
55b46574
RO
819 %(linker) " \
820 LINK_PLUGIN_SPEC \
a74db9bd 821 "%{flto|flto=*:%<fcompare-debug*} \
d8857ac6 822 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
29d7cbd1
RO
823 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
824 "%X %{o*} %{e*} %{N} %{n} %{r}\
2077db1b 825 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
a74db9bd 826 %{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
7458026b 827 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
b9487dd8 828 %{fcilkplus:%:include(libcilkrts.spec)%(link_cilkrts)}\
255a9a1b 829 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
7458026b 830 %(mflib) " STACK_SPLIT_SPEC "\
a74db9bd 831 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
9714c911 832 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
12b57b0f 833 %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}"
ea414c97
ZW
834#endif
835
836#ifndef LINK_LIBGCC_SPEC
57642751
DJ
837/* Generate -L options for startfile prefix list. */
838# define LINK_LIBGCC_SPEC "%D"
ea414c97
ZW
839#endif
840
343f59d9
AM
841#ifndef STARTFILE_PREFIX_SPEC
842# define STARTFILE_PREFIX_SPEC ""
843#endif
844
380e5ca4
MM
845#ifndef SYSROOT_SPEC
846# define SYSROOT_SPEC "--sysroot=%R"
847#endif
848
e7f13528
GP
849#ifndef SYSROOT_SUFFIX_SPEC
850# define SYSROOT_SUFFIX_SPEC ""
851#endif
852
853#ifndef SYSROOT_HEADERS_SUFFIX_SPEC
854# define SYSROOT_HEADERS_SUFFIX_SPEC ""
855#endif
856
b24513a1 857static const char *asm_debug = ASM_DEBUG_SPEC;
3b304f5b 858static const char *cpp_spec = CPP_SPEC;
3b304f5b
ZW
859static const char *cc1_spec = CC1_SPEC;
860static const char *cc1plus_spec = CC1PLUS_SPEC;
bbd7687d 861static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
77008252 862static const char *link_ssp_spec = LINK_SSP_SPEC;
3b304f5b
ZW
863static const char *asm_spec = ASM_SPEC;
864static const char *asm_final_spec = ASM_FINAL_SPEC;
865static const char *link_spec = LINK_SPEC;
866static const char *lib_spec = LIB_SPEC;
953ff289 867static const char *link_gomp_spec = "";
3b304f5b
ZW
868static const char *libgcc_spec = LIBGCC_SPEC;
869static const char *endfile_spec = ENDFILE_SPEC;
870static const char *startfile_spec = STARTFILE_SPEC;
3b304f5b 871static const char *linker_name_spec = LINKER_NAME;
d7f09764
DN
872static const char *linker_plugin_file_spec = "";
873static const char *lto_wrapper_spec = "";
874static const char *lto_gcc_spec = "";
ea414c97
ZW
875static const char *link_command_spec = LINK_COMMAND_SPEC;
876static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
343f59d9 877static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
380e5ca4 878static const char *sysroot_spec = SYSROOT_SPEC;
e7f13528
GP
879static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
880static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
84f405a1 881static const char *self_spec = "";
ea414c97
ZW
882
883/* Standard options to cpp, cc1, and as, to reduce duplication in specs.
884 There should be no need to override these in target dependent files,
885 but we need to copy them to the specs file so that newer versions
886 of the GCC driver can correctly drive older tool chains with the
887 appropriate -B options. */
888
e5f5feea
NB
889/* When cpplib handles traditional preprocessing, get rid of this, and
890 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
891 that we default the front end language better. */
ea414c97 892static const char *trad_capable_cpp =
3028a95c 893"cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
ea414c97 894
4ca1256f
NB
895/* We don't wrap .d files in %W{} since a missing .d file, and
896 therefore no dependency entry, confuses make into thinking a .o
897 file that happens to exist is up-to-date. */
ffdeea47 898static const char *cpp_unique_options =
9cc54940 899"%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
c878765b
JM
900 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
901 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
4ca1256f 902 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
3dfe046f 903 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
3a610de8 904 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
c1ce46a5 905 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
3a610de8 906 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
56cd5b95 907 %{E|M|MM:%W{o*}}";
ffdeea47
JJ
908
909/* This contains cpp options which are common with cc1_options and are passed
059ba716
CD
910 only when preprocessing only to avoid duplication. We pass the cc1 spec
911 options to the preprocessor so that it the cc1 spec may manipulate
912 options used to set target flags. Those special target flags settings may
913 in turn cause preprocessor symbols to be defined specially. */
ffdeea47 914static const char *cpp_options =
740ca4b2 915"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
09828811 916 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
14fdc613 917 %{undef} %{save-temps*:-fpch-preprocess}";
ea414c97 918
8b968bd1
MW
919/* This contains cpp options which are not passed when the preprocessor
920 output will be used by another program. */
921static const char *cpp_debug_options = "%{d*}";
922
708bceb7 923/* NB: This is shared amongst all front-ends, except for Ada. */
ea414c97
ZW
924static const char *cc1_options =
925"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
c1ce46a5 926 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1890bccc 927 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
2153915d
AO
928 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
929 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
740ca4b2 930 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
3df89291 931 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
dd9f93dc 932 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
e200444e
JM
933 %{-target-help:--target-help}\
934 %{-version:--version}\
935 %{-help=*:--help=%*}\
49009afd 936 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
6de9cd9a 937 %{fsyntax-only:-o %j} %{-param*}\
ee4c708e 938 %{coverage:-fprofile-arcs -ftest-coverage}";
ea414c97
ZW
939
940static const char *asm_options =
a016dc83 941"%{-target-help:%:print-asm-header()} "
dc60b775
CD
942#if HAVE_GNU_AS
943/* If GNU AS is used, then convert -w (no warnings), -I, and -v
944 to the assembler equivalents. */
945"%{v} %{w:-W} %{I*} "
946#endif
29d7cbd1 947ASM_COMPRESS_DEBUG_SPEC
dc60b775 948"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
ffd86336 949
5a8e2650 950static const char *invoke_as =
4977bab6 951#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
f300e7b8 952"%{!fwpa*:\
d7f09764
DN
953 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
954 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
955 }";
4977bab6 956#else
f300e7b8 957"%{!fwpa*:\
d7f09764
DN
958 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
959 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
960 }";
4977bab6 961#endif
5a8e2650 962
ffd86336 963/* Some compilers have limits on line lengths, and the multilib_select
961b7009
MM
964 and/or multilib_matches strings can be very long, so we build them at
965 run time. */
ffd86336 966static struct obstack multilib_obstack;
3b304f5b
ZW
967static const char *multilib_select;
968static const char *multilib_matches;
969static const char *multilib_defaults;
970static const char *multilib_exclusions;
e7f49d92 971static const char *multilib_reuse;
961b7009
MM
972
973/* Check whether a particular argument is a default argument. */
974
975#ifndef MULTILIB_DEFAULTS
976#define MULTILIB_DEFAULTS { "" }
977#endif
978
d25a45d4 979static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
ed1f651b 980
db36994b
RS
981#ifndef DRIVER_SELF_SPECS
982#define DRIVER_SELF_SPECS ""
983#endif
984
de14871c 985/* Linking to libgomp implies pthreads. This is particularly important
953ff289
DN
986 for targets that use different start files and suchlike. */
987#ifndef GOMP_SELF_SPECS
daf49354 988#define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
953ff289
DN
989#endif
990
255a9a1b
EB
991/* Likewise for -fgnu-tm. */
992#ifndef GTM_SELF_SPECS
993#define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
994#endif
995
b9487dd8
TB
996/* Likewise for -fcilkplus. */
997#ifndef CILK_SELF_SPECS
998#define CILK_SELF_SPECS "%{fcilkplus: -pthread}"
999#endif
1000
953ff289 1001static const char *const driver_self_specs[] = {
b5b8b0ac 1002 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
b9487dd8
TB
1003 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS,
1004 CILK_SELF_SPECS
953ff289 1005};
db36994b 1006
7816bea0
DJ
1007#ifndef OPTION_DEFAULT_SPECS
1008#define OPTION_DEFAULT_SPECS { "", "" }
1009#endif
1010
1011struct default_spec
1012{
1013 const char *name;
1014 const char *spec;
1015};
1016
1017static const struct default_spec
1018 option_default_specs[] = { OPTION_DEFAULT_SPECS };
1019
3ac63d94
NC
1020struct user_specs
1021{
d9ac3a07 1022 struct user_specs *next;
878f32c3 1023 const char *filename;
d9ac3a07
MM
1024};
1025
1026static struct user_specs *user_specs_head, *user_specs_tail;
1027
ed1f651b
RS
1028\f
1029/* Record the mapping from file suffixes for compilation specs. */
1030
1031struct compiler
1032{
878f32c3 1033 const char *suffix; /* Use this compiler for input files
ed1f651b 1034 whose names end in this suffix. */
ec32609a 1035
ea414c97 1036 const char *spec; /* To use this compiler, run this spec. */
a9374841
MM
1037
1038 const char *cpp_spec; /* If non-NULL, substitute this spec
1039 for `%C', rather than the usual
1040 cpp_spec. */
1ea7e6ad 1041 const int combinable; /* If nonzero, compiler can deal with
0855eab7 1042 multiple source files at once (IMA). */
1ea7e6ad 1043 const int needs_preprocessing; /* If nonzero, source files need to
0855eab7 1044 be run through a preprocessor. */
ed1f651b
RS
1045};
1046
1047/* Pointer to a vector of `struct compiler' that gives the spec for
1048 compiling a file, based on its suffix.
1049 A file that does not end in any of these suffixes will be passed
1050 unchanged to the loader and nothing else will be done to it.
1051
1052 An entry containing two 0s is used to terminate the vector.
1053
1054 If multiple entries match a file, the last matching one is used. */
1055
1056static struct compiler *compilers;
1057
1058/* Number of entries in `compilers', not counting the null terminator. */
1059
1060static int n_compilers;
1061
1062/* The default list of file name suffixes and their compilation specs. */
1063
5e65297b 1064static const struct compiler default_compilers[] =
ed1f651b 1065{
4689ad58 1066 /* Add lists of suffixes of known languages here. If those languages
e9a25f70
JL
1067 were not present when we built the driver, we will hit these copies
1068 and be given a more meaningful error than "file not used since
4689ad58 1069 linking is not done". */
0855eab7 1070 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
ad8c162b
ZL
1071 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1072 {".mii", "#Objective-C++", 0, 0, 0},
7904f95f
EC
1073 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1074 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
0855eab7
CT
1075 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1076 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1077 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
3135ce84
FXC
1078 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1079 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1080 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1081 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1082 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1083 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1084 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1085 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
0855eab7
CT
1086 {".r", "#Ratfor", 0, 0, 0},
1087 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1088 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1089 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
7a938933 1090 {".go", "#Go", 0, 1, 0},
4689ad58 1091 /* Next come the entries for C. */
c3224d6f 1092 {".c", "@c", 0, 0, 1},
ed1f651b 1093 {"@c",
5a8e2650 1094 /* cc1 has an integrated ISO C preprocessor. We should invoke the
f458d1d5 1095 external preprocessor if -save-temps is given. */
f749a36b 1096 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
5a8e2650 1097 %{!E:%{!M:%{!MM:\
3028a95c 1098 %{traditional:\
f458d1d5 1099%eGNU C no longer supports -traditional without -E}\
c3224d6f
RG
1100 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1101 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1102 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1103 %(cc1_options)}\
1104 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1105 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1106 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
ed1f651b 1107 {"-",
6ba40dd7 1108 "%{!E:%e-E or -x required when input is from standard input}\
0855eab7
CT
1109 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1110 {".h", "@c-header", 0, 0, 0},
ed1f651b 1111 {"@c-header",
17211ab5
GK
1112 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1113 external preprocessor if -save-temps is given. */
1114 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1115 %{!E:%{!M:%{!MM:\
14fdc613
MM
1116 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1117 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1118 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
0de12fcc 1119 %(cc1_options)\
9cc54940
AC
1120 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1121 %W{o*:--output-pch=%*}}%V}\
14fdc613 1122 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
17211ab5 1123 cc1 %(cpp_unique_options) %(cc1_options)\
9cc54940
AC
1124 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1125 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
c3224d6f 1126 {".i", "@cpp-output", 0, 0, 0},
ed1f651b 1127 {"@cpp-output",
ca3da783 1128 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
a0d43bac 1129 {".s", "@assembler", 0, 0, 0},
ed1f651b 1130 {"@assembler",
a0d43bac
JZ
1131 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1132 {".sx", "@assembler-with-cpp", 0, 0, 0},
1133 {".S", "@assembler-with-cpp", 0, 0, 0},
ed1f651b 1134 {"@assembler-with-cpp",
4977bab6 1135#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
2710d6d7 1136 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
8b968bd1 1137 %{E|M|MM:%(cpp_debug_options)}\
4977bab6
ZW
1138 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1139 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1140#else
2710d6d7 1141 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
4977bab6
ZW
1142 %{E|M|MM:%(cpp_debug_options)}\
1143 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1144 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1145#endif
a0d43bac 1146 , 0, 0, 0},
1d088dee 1147
1346ae41 1148#include "specs.h"
f9da5064 1149 /* Mark end of table. */
0855eab7 1150 {0, 0, 0, 0, 0}
ed1f651b
RS
1151};
1152
1153/* Number of elements in default_compilers, not counting the terminator. */
1154
ca7558fc 1155static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
ed1f651b 1156
69d540bd 1157typedef char *char_p; /* For DEF_VEC_P. */
69d540bd 1158
ed1f651b 1159/* A vector of options to give to the linker.
368dfd3a 1160 These options are accumulated by %x,
ed1f651b 1161 and substituted into the linker command with %X. */
9771b263 1162static vec<char_p> linker_options;
c9ebacb8
RS
1163
1164/* A vector of options to give to the assembler.
1165 These options are accumulated by -Wa,
57cb9b60 1166 and substituted into the assembler command with %Y. */
9771b263 1167static vec<char_p> assembler_options;
57cb9b60
JW
1168
1169/* A vector of options to give to the preprocessor.
1170 These options are accumulated by -Wp,
1171 and substituted into the preprocessor command with %Z. */
9771b263 1172static vec<char_p> preprocessor_options;
ed1f651b 1173\f
ed1f651b 1174static char *
1d088dee 1175skip_whitespace (char *p)
ed1f651b
RS
1176{
1177 while (1)
1178 {
1179 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1180 be considered whitespace. */
1181 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1182 return p + 1;
1183 else if (*p == '\n' || *p == ' ' || *p == '\t')
1184 p++;
1185 else if (*p == '#')
1186 {
d25a45d4
KH
1187 while (*p != '\n')
1188 p++;
ed1f651b
RS
1189 p++;
1190 }
1191 else
1192 break;
1193 }
1194
1195 return p;
1196}
2296d164
RK
1197/* Structures to keep track of prefixes to try when looking for files. */
1198
1199struct prefix_list
1200{
8060c8ee 1201 const char *prefix; /* String to prepend to the path. */
2296d164
RK
1202 struct prefix_list *next; /* Next in linked list. */
1203 int require_machine_suffix; /* Don't use without machine_suffix. */
1204 /* 2 means try both machine_suffix and just_machine_suffix. */
5bbcd587
JJ
1205 int priority; /* Sort key - priority within list. */
1206 int os_multilib; /* 1 if OS multilib scheme should be used,
1207 0 for GCC multilib scheme. */
2296d164
RK
1208};
1209
1210struct path_prefix
1211{
1212 struct prefix_list *plist; /* List of prefixes to try */
1213 int max_len; /* Max length of a prefix in PLIST */
1214 const char *name; /* Name of this list (used in config stuff) */
1215};
1216
1217/* List of prefixes to try when looking for executables. */
1218
1219static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1220
1221/* List of prefixes to try when looking for startup (crt0) files. */
1222
1223static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1224
1225/* List of prefixes to try when looking for include files. */
1226
1227static struct path_prefix include_prefixes = { 0, 0, "include" };
1228
1229/* Suffix to attach to directories searched for commands.
1230 This looks like `MACHINE/VERSION/'. */
1231
1232static const char *machine_suffix = 0;
1233
1234/* Suffix to attach to directories searched for commands.
1235 This is just `MACHINE/'. */
1236
1237static const char *just_machine_suffix = 0;
1238
1239/* Adjusted value of GCC_EXEC_PREFIX envvar. */
1240
1241static const char *gcc_exec_prefix;
1242
a8ee6e2d
GK
1243/* Adjusted value of standard_libexec_prefix. */
1244
1245static const char *gcc_libexec_prefix;
1246
2296d164
RK
1247/* Default prefixes to attach to command names. */
1248
656c7a3a
AL
1249#ifndef STANDARD_STARTFILE_PREFIX_1
1250#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1251#endif
1252#ifndef STANDARD_STARTFILE_PREFIX_2
1253#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1254#endif
7904f95f 1255
2989d30c 1256#ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
2296d164
RK
1257#undef MD_EXEC_PREFIX
1258#undef MD_STARTFILE_PREFIX
1259#undef MD_STARTFILE_PREFIX_1
1260#endif
1261
1262/* If no prefixes defined, use the null string, which will disable them. */
1263#ifndef MD_EXEC_PREFIX
1264#define MD_EXEC_PREFIX ""
1265#endif
1266#ifndef MD_STARTFILE_PREFIX
1267#define MD_STARTFILE_PREFIX ""
1268#endif
1269#ifndef MD_STARTFILE_PREFIX_1
1270#define MD_STARTFILE_PREFIX_1 ""
1271#endif
1272
f4c0a303
CD
1273/* These directories are locations set at configure-time based on the
1274 --prefix option provided to configure. Their initializers are
1275 defined in Makefile.in. These paths are not *directly* used when
1276 gcc_exec_prefix is set because, in that case, we know where the
1277 compiler has been installed, and use paths relative to that
1278 location instead. */
27c38fbe 1279static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
f4c0a303
CD
1280static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1281static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1282static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1283
1284/* For native compilers, these are well-known paths containing
1285 components that may be provided by the system. For cross
1286 compilers, these paths are not used. */
2296d164 1287static const char *md_exec_prefix = MD_EXEC_PREFIX;
2296d164
RK
1288static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1289static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
c662432e 1290static const char *const standard_startfile_prefix_1
656c7a3a
AL
1291 = STANDARD_STARTFILE_PREFIX_1;
1292static const char *const standard_startfile_prefix_2
1293 = STANDARD_STARTFILE_PREFIX_2;
2296d164 1294
f4c0a303
CD
1295/* A relative path to be used in finding the location of tools
1296 relative to the driver. */
27c38fbe 1297static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
a8ee6e2d 1298
2296d164
RK
1299/* Subdirectory to use for locating libraries. Set by
1300 set_multilib_dir based on the compilation options. */
1301
1302static const char *multilib_dir;
5bbcd587
JJ
1303
1304/* Subdirectory to use for locating libraries in OS conventions. Set by
1305 set_multilib_dir based on the compilation options. */
1306
1307static const char *multilib_os_dir;
e0cdc09f
MK
1308
1309/* Subdirectory to use for locating libraries in multiarch conventions. Set by
1310 set_multilib_dir based on the compilation options. */
1311
1312static const char *multiarch_dir;
ed1f651b 1313\f
0f41302f 1314/* Structure to keep track of the specs that have been defined so far.
3ce9f090
JM
1315 These are accessed using %(specname) in a compiler or link
1316 spec. */
ed1f651b
RS
1317
1318struct spec_list
1319{
79aff5ac
MM
1320 /* The following 2 fields must be first */
1321 /* to allow EXTRA_SPECS to be initialized */
3b304f5b
ZW
1322 const char *name; /* name of the spec. */
1323 const char *ptr; /* available ptr if no static pointer */
79aff5ac
MM
1324
1325 /* The following fields are not initialized */
1326 /* by EXTRA_SPECS */
3b304f5b 1327 const char **ptr_spec; /* pointer to the spec itself. */
79aff5ac
MM
1328 struct spec_list *next; /* Next spec in linked list. */
1329 int name_len; /* length of the name */
d168aaee
CB
1330 bool user_p; /* whether string come from file spec. */
1331 bool alloc_p; /* whether string was allocated */
ed1f651b
RS
1332};
1333
79aff5ac 1334#define INIT_STATIC_SPEC(NAME,PTR) \
d168aaee 1335 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false }
79aff5ac 1336
3ac63d94
NC
1337/* List of statically defined specs. */
1338static struct spec_list static_specs[] =
1339{
79aff5ac 1340 INIT_STATIC_SPEC ("asm", &asm_spec),
5f0e9ea2 1341 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
79aff5ac 1342 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
ea414c97 1343 INIT_STATIC_SPEC ("asm_options", &asm_options),
5a8e2650 1344 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
79aff5ac 1345 INIT_STATIC_SPEC ("cpp", &cpp_spec),
ea414c97 1346 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
8b968bd1 1347 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
ffdeea47 1348 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
ea414c97 1349 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
79aff5ac 1350 INIT_STATIC_SPEC ("cc1", &cc1_spec),
ea414c97 1351 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
79aff5ac 1352 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
bbd7687d 1353 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
77008252 1354 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
79aff5ac
MM
1355 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1356 INIT_STATIC_SPEC ("link", &link_spec),
1357 INIT_STATIC_SPEC ("lib", &lib_spec),
953ff289 1358 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
79aff5ac
MM
1359 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1360 INIT_STATIC_SPEC ("startfile", &startfile_spec),
79aff5ac
MM
1361 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1362 INIT_STATIC_SPEC ("version", &compiler_version),
1363 INIT_STATIC_SPEC ("multilib", &multilib_select),
1364 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1365 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1366 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
0a8d6618 1367 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
5bbcd587 1368 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
e7f49d92 1369 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
10da1131 1370 INIT_STATIC_SPEC ("linker", &linker_name_spec),
d7f09764
DN
1371 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1372 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1373 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
ea414c97 1374 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
2296d164
RK
1375 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1376 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1377 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
343f59d9 1378 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
380e5ca4 1379 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
e7f13528
GP
1380 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1381 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
84f405a1 1382 INIT_STATIC_SPEC ("self_spec", &self_spec),
79aff5ac
MM
1383};
1384
1385#ifdef EXTRA_SPECS /* additional specs needed */
829245be 1386/* Structure to keep track of just the first two args of a spec_list.
3ac63d94 1387 That is all that the EXTRA_SPECS macro gives us. */
829245be
KG
1388struct spec_list_1
1389{
8b60264b
KG
1390 const char *const name;
1391 const char *const ptr;
829245be
KG
1392};
1393
8b60264b 1394static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
d25a45d4 1395static struct spec_list *extra_specs = (struct spec_list *) 0;
79aff5ac
MM
1396#endif
1397
1398/* List of dynamically allocates specs that have been defined so far. */
1399
9218435e 1400static struct spec_list *specs = (struct spec_list *) 0;
79aff5ac 1401\f
f3226a90
JT
1402/* List of static spec functions. */
1403
1404static const struct spec_function static_spec_functions[] =
1405{
30d8946b 1406 { "getenv", getenv_spec_function },
f3226a90 1407 { "if-exists", if_exists_spec_function },
152a5a9c 1408 { "if-exists-else", if_exists_else_spec_function },
de5a5fa1 1409 { "sanitize", sanitize_spec_function },
3dd53121 1410 { "replace-outfile", replace_outfile_spec_function },
2642f659 1411 { "remove-outfile", remove_outfile_spec_function },
ed5b9f96 1412 { "version-compare", version_compare_spec_function },
953ff289 1413 { "include", include_spec_function },
4adbd5dd 1414 { "find-file", find_file_spec_function },
c1ce46a5 1415 { "find-plugindir", find_plugindir_spec_function },
a0f87454 1416 { "print-asm-header", print_asm_header_spec_function },
2153915d
AO
1417 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1418 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1419 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
9a37bc07 1420 { "pass-through-libs", pass_through_libs_spec_func },
99ea153e 1421 { "replace-extension", replace_extension_spec_func },
fa959ce4
MM
1422#ifdef EXTRA_SPEC_FUNCTIONS
1423 EXTRA_SPEC_FUNCTIONS
1424#endif
f3226a90
JT
1425 { 0, 0 }
1426};
1427
1428static int processing_spec_function;
1429\f
049f6ec9
MM
1430/* Add appropriate libgcc specs to OBSTACK, taking into account
1431 various permutations of -shared-libgcc, -shared, and such. */
1432
328163dc 1433#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
8efcd34f
AM
1434
1435#ifndef USE_LD_AS_NEEDED
1436#define USE_LD_AS_NEEDED 0
1437#endif
1438
049f6ec9 1439static void
1d088dee
AJ
1440init_gcc_specs (struct obstack *obstack, const char *shared_name,
1441 const char *static_name, const char *eh_name)
049f6ec9 1442{
5c181756
AO
1443 char *buf;
1444
5e4f1974
AM
1445 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1446 "%{!static:%{!static-libgcc:"
8efcd34f 1447#if USE_LD_AS_NEEDED
5e4f1974 1448 "%{!shared-libgcc:",
e927b6ad
RO
1449 static_name, " " LD_AS_NEEDED_OPTION " ",
1450 shared_name, " " LD_NO_AS_NEEDED_OPTION
5e4f1974
AM
1451 "}"
1452 "%{shared-libgcc:",
1453 shared_name, "%{!shared: ", static_name, "}"
1454 "}"
765f1bf9 1455#else
5e4f1974
AM
1456 "%{!shared:"
1457 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1458 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1459 "}"
275b60d6 1460#ifdef LINK_EH_SPEC
5e4f1974
AM
1461 "%{shared:"
1462 "%{shared-libgcc:", shared_name, "}"
1463 "%{!shared-libgcc:", static_name, "}"
1464 "}"
275b60d6 1465#else
5e4f1974 1466 "%{shared:", shared_name, "}"
765f1bf9 1467#endif
275b60d6 1468#endif
5e4f1974 1469 "}}", NULL);
5c181756
AO
1470
1471 obstack_grow (obstack, buf, strlen (buf));
1472 free (buf);
049f6ec9 1473}
6894579f 1474#endif /* ENABLE_SHARED_LIBGCC */
049f6ec9 1475
79aff5ac
MM
1476/* Initialize the specs lookup routines. */
1477
1478static void
7e51717c 1479init_spec (void)
79aff5ac 1480{
9218435e
KH
1481 struct spec_list *next = (struct spec_list *) 0;
1482 struct spec_list *sl = (struct spec_list *) 0;
79aff5ac
MM
1483 int i;
1484
1485 if (specs)
3ac63d94 1486 return; /* Already initialized. */
79aff5ac 1487
20df0482 1488 if (verbose_flag)
2dec80c7 1489 fnotice (stderr, "Using built-in specs.\n");
20df0482 1490
79aff5ac 1491#ifdef EXTRA_SPECS
e1e4cdc4 1492 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
9218435e 1493
b6a1cbae 1494 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
03fc1620
JW
1495 {
1496 sl = &extra_specs[i];
829245be
KG
1497 sl->name = extra_specs_1[i].name;
1498 sl->ptr = extra_specs_1[i].ptr;
03fc1620
JW
1499 sl->next = next;
1500 sl->name_len = strlen (sl->name);
1501 sl->ptr_spec = &sl->ptr;
1502 next = sl;
1503 }
79aff5ac
MM
1504#endif
1505
b6a1cbae 1506 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
79aff5ac
MM
1507 {
1508 sl = &static_specs[i];
1509 sl->next = next;
1510 next = sl;
1511 }
1512
328163dc 1513#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
9db0819e
RH
1514 /* ??? If neither -shared-libgcc nor --static-libgcc was
1515 seen, then we should be making an educated guess. Some proposed
1516 heuristics for ELF include:
1517
1518 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1519 program will be doing dynamic loading, which will likely
1520 need the shared libgcc.
1521
1522 (2) If "-ldl", then it's also a fair bet that we're doing
1523 dynamic loading.
1524
1525 (3) For each ET_DYN we're linking against (either through -lfoo
1526 or /some/path/foo.so), check to see whether it or one of
ff7cc307 1527 its dependencies depends on a shared libgcc.
9db0819e
RH
1528
1529 (4) If "-shared"
1530
1531 If the runtime is fixed to look for program headers instead
1532 of calling __register_frame_info at all, for each object,
1533 use the shared libgcc if any EH symbol referenced.
1534
1535 If crtstuff is fixed to not invoke __register_frame_info
1536 automatically, for each object, use the shared libgcc if
1537 any non-empty unwind section found.
1538
1539 Doing any of this probably requires invoking an external program to
1540 do the actual object file scanning. */
1541 {
1542 const char *p = libgcc_spec;
1543 int in_sep = 1;
589005ff 1544
16757495 1545 /* Transform the extant libgcc_spec into one that uses the shared libgcc
9db0819e
RH
1546 when given the proper command line arguments. */
1547 while (*p)
1548 {
589005ff 1549 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
9db0819e 1550 {
049f6ec9 1551 init_gcc_specs (&obstack,
049f6ec9 1552 "-lgcc_s"
443728bb
L
1553#ifdef USE_LIBUNWIND_EXCEPTIONS
1554 " -lunwind"
4977bab6 1555#endif
348d71c7
JW
1556 ,
1557 "-lgcc",
1558 "-lgcc_eh"
4977bab6 1559#ifdef USE_LIBUNWIND_EXCEPTIONS
7e9d8517 1560# ifdef HAVE_LD_STATIC_DYNAMIC
c6092243
RO
1561 " %{!static:" LD_STATIC_OPTION "} -lunwind"
1562 " %{!static:" LD_DYNAMIC_OPTION "}"
7e9d8517 1563# else
4977bab6 1564 " -lunwind"
7e9d8517 1565# endif
9db0819e 1566#endif
348d71c7
JW
1567 );
1568
ba2b7435 1569 p += 5;
9db0819e
RH
1570 in_sep = 0;
1571 }
ba2b7435 1572 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
9db0819e
RH
1573 {
1574 /* Ug. We don't know shared library extensions. Hope that
1575 systems that use this form don't do shared libraries. */
049f6ec9 1576 init_gcc_specs (&obstack,
4e8d0554 1577 "-lgcc_s",
275b60d6 1578 "libgcc.a%s",
aedec8dd
JW
1579 "libgcc_eh.a%s"
1580#ifdef USE_LIBUNWIND_EXCEPTIONS
1581 " -lunwind"
1582#endif
1583 );
ba2b7435 1584 p += 10;
9db0819e
RH
1585 in_sep = 0;
1586 }
1587 else
1588 {
1589 obstack_1grow (&obstack, *p);
1590 in_sep = (*p == ' ');
1591 p += 1;
1592 }
1593 }
1594
1595 obstack_1grow (&obstack, '\0');
7973fd2a 1596 libgcc_spec = XOBFINISH (&obstack, const char *);
9db0819e
RH
1597 }
1598#endif
c64688ae
RH
1599#ifdef USE_AS_TRADITIONAL_FORMAT
1600 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1601 {
8b60264b 1602 static const char tf[] = "--traditional-format ";
c3284718 1603 obstack_grow (&obstack, tf, sizeof (tf) - 1);
c64688ae 1604 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
7973fd2a 1605 asm_spec = XOBFINISH (&obstack, const char *);
c64688ae
RH
1606 }
1607#endif
cd533689 1608
79bec923
ST
1609#if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1610 defined LINKER_HASH_STYLE
cd533689
PP
1611# ifdef LINK_BUILDID_SPEC
1612 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
c3284718 1613 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
cd533689
PP
1614# endif
1615# ifdef LINK_EH_SPEC
275b60d6 1616 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
c3284718 1617 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
79bec923
ST
1618# endif
1619# ifdef LINKER_HASH_STYLE
1620 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1621 before. */
1622 {
1623 static const char hash_style[] = "--hash-style=";
c3284718
RS
1624 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1625 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
79bec923
ST
1626 obstack_1grow (&obstack, ' ');
1627 }
cd533689 1628# endif
275b60d6 1629 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
7973fd2a 1630 link_spec = XOBFINISH (&obstack, const char *);
275b60d6 1631#endif
9db0819e 1632
79aff5ac
MM
1633 specs = sl;
1634}
ed1f651b
RS
1635\f
1636/* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1637 removed; If the spec starts with a + then SPEC is added to the end of the
0f41302f 1638 current spec. */
ed1f651b
RS
1639
1640static void
d168aaee 1641set_spec (const char *name, const char *spec, bool user_p)
ed1f651b
RS
1642{
1643 struct spec_list *sl;
3b304f5b 1644 const char *old_spec;
79aff5ac
MM
1645 int name_len = strlen (name);
1646 int i;
1647
3ac63d94 1648 /* If this is the first call, initialize the statically allocated specs. */
20df0482
MM
1649 if (!specs)
1650 {
9218435e 1651 struct spec_list *next = (struct spec_list *) 0;
b6a1cbae 1652 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
20df0482
MM
1653 {
1654 sl = &static_specs[i];
1655 sl->next = next;
1656 next = sl;
1657 }
1658 specs = sl;
1659 }
1660
3ac63d94 1661 /* See if the spec already exists. */
ed1f651b 1662 for (sl = specs; sl; sl = sl->next)
79aff5ac 1663 if (name_len == sl->name_len && !strcmp (sl->name, name))
ed1f651b
RS
1664 break;
1665
1666 if (!sl)
1667 {
3ac63d94 1668 /* Not found - make it. */
5ed6ace5 1669 sl = XNEW (struct spec_list);
ad85216e 1670 sl->name = xstrdup (name);
79aff5ac
MM
1671 sl->name_len = name_len;
1672 sl->ptr_spec = &sl->ptr;
1673 sl->alloc_p = 0;
1674 *(sl->ptr_spec) = "";
ed1f651b
RS
1675 sl->next = specs;
1676 specs = sl;
1677 }
1678
79aff5ac 1679 old_spec = *(sl->ptr_spec);
e51712db 1680 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
d4f2852f 1681 ? concat (old_spec, spec + 1, NULL)
ad85216e 1682 : xstrdup (spec));
841faeed 1683
20df0482
MM
1684#ifdef DEBUG_SPECS
1685 if (verbose_flag)
2dec80c7 1686 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
20df0482
MM
1687#endif
1688
3ac63d94 1689 /* Free the old spec. */
79aff5ac 1690 if (old_spec && sl->alloc_p)
c3284718 1691 free (CONST_CAST (char *, old_spec));
79aff5ac 1692
d168aaee
CB
1693 sl->user_p = user_p;
1694 sl->alloc_p = true;
ed1f651b
RS
1695}
1696\f
1697/* Accumulate a command (program name and args), and run it. */
1698
5b634ee0 1699typedef const char *const_char_p; /* For DEF_VEC_P. */
ed1f651b 1700
5b634ee0 1701/* Vector of pointers to arguments in the current line of specifications. */
ed1f651b 1702
9771b263 1703static vec<const_char_p> argbuf;
ed1f651b 1704
10a24138
MLI
1705/* Position in the argbuf vector containing the name of the output file
1706 (the value associated with the "-o" flag). */
1707
1708static int have_o_argbuf_index = 0;
1709
1b5bc8e9 1710/* Were the options -c, -S or -E passed. */
af41c57d
AP
1711static int have_c = 0;
1712
1713/* Was the option -o passed. */
1714static int have_o = 0;
1715
49009afd
JL
1716/* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1717 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1718 it here. */
fb266030
TW
1719
1720static struct temp_name {
878f32c3 1721 const char *suffix; /* suffix associated with the code. */
fb266030
TW
1722 int length; /* strlen (suffix). */
1723 int unique; /* Indicates whether %g or %u/%U was used. */
878f32c3 1724 const char *filename; /* associated filename. */
fb266030
TW
1725 int filename_length; /* strlen (filename). */
1726 struct temp_name *next;
1727} *temp_names;
39d45901 1728
ed1f651b
RS
1729/* Number of commands executed so far. */
1730
1731static int execution_count;
1732
3b9b4d3f
RS
1733/* Number of commands that exited with a signal. */
1734
1735static int signal_count;
ed1f651b 1736\f
f3226a90
JT
1737/* Allocate the argument vector. */
1738
1739static void
7e51717c 1740alloc_args (void)
f3226a90 1741{
9771b263 1742 argbuf.create (10);
f3226a90
JT
1743}
1744
ed1f651b
RS
1745/* Clear out the vector of arguments (after a command is executed). */
1746
1747static void
1d088dee 1748clear_args (void)
ed1f651b 1749{
9771b263 1750 argbuf.truncate (0);
ed1f651b
RS
1751}
1752
1753/* Add one argument to the vector at the end.
1754 This is done when a space is seen or at the end of the line.
1755 If DELETE_ALWAYS is nonzero, the arg is a filename
1756 and the file should be deleted eventually.
1757 If DELETE_FAILURE is nonzero, the arg is a filename
1758 and the file should be deleted if this compilation fails. */
1759
1760static void
1d088dee 1761store_arg (const char *arg, int delete_always, int delete_failure)
ed1f651b 1762{
9771b263 1763 argbuf.safe_push (arg);
ed1f651b 1764
10a24138
MLI
1765 if (strcmp (arg, "-o") == 0)
1766 have_o_argbuf_index = argbuf.length ();
ed1f651b 1767 if (delete_always || delete_failure)
d6205185
RG
1768 {
1769 const char *p;
1770 /* If the temporary file we should delete is specified as
1771 part of a joined argument extract the filename. */
1772 if (arg[0] == '-'
1773 && (p = strrchr (arg, '=')))
1774 arg = p + 1;
1775 record_temp_file (arg, delete_always, delete_failure);
1776 }
ed1f651b
RS
1777}
1778\f
ff7cc307 1779/* Load specs from a file name named FILENAME, replacing occurrences of
9218435e 1780 various different types of line-endings, \r\n, \n\r and just \r, with
b633b6c0 1781 a single \n. */
20df0482 1782
d25a45d4 1783static char *
1d088dee 1784load_specs (const char *filename)
20df0482
MM
1785{
1786 int desc;
1787 int readlen;
1788 struct stat statbuf;
1789 char *buffer;
b633b6c0
MK
1790 char *buffer_p;
1791 char *specs;
1792 char *specs_p;
20df0482
MM
1793
1794 if (verbose_flag)
2dec80c7 1795 fnotice (stderr, "Reading specs from %s\n", filename);
20df0482
MM
1796
1797 /* Open and stat the file. */
1798 desc = open (filename, O_RDONLY, 0);
1799 if (desc < 0)
1800 pfatal_with_name (filename);
1801 if (stat (filename, &statbuf) < 0)
1802 pfatal_with_name (filename);
1803
1804 /* Read contents of file into BUFFER. */
5ed6ace5 1805 buffer = XNEWVEC (char, statbuf.st_size + 1);
20df0482
MM
1806 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1807 if (readlen < 0)
1808 pfatal_with_name (filename);
1809 buffer[readlen] = 0;
1810 close (desc);
1811
5ed6ace5 1812 specs = XNEWVEC (char, readlen + 1);
b633b6c0
MK
1813 specs_p = specs;
1814 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1815 {
1816 int skip = 0;
1817 char c = *buffer_p;
1818 if (c == '\r')
d25a45d4
KH
1819 {
1820 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
b633b6c0 1821 skip = 1;
d25a45d4 1822 else if (*(buffer_p + 1) == '\n') /* \r\n */
b633b6c0
MK
1823 skip = 1;
1824 else /* \r */
1825 c = '\n';
1826 }
1827 if (! skip)
1828 *specs_p++ = c;
1829 }
1830 *specs_p = '\0';
1831
1832 free (buffer);
1833 return (specs);
1834}
1835
1836/* Read compilation specs from a file named FILENAME,
1837 replacing the default ones.
1838
1839 A suffix which starts with `*' is a definition for
1840 one of the machine-specific sub-specs. The "suffix" should be
0fef3fd0 1841 *asm, *cc1, *cpp, *link, *startfile, etc.
b633b6c0
MK
1842 The corresponding spec is stored in asm_spec, etc.,
1843 rather than in the `compilers' vector.
1844
1845 Anything invalid in the file is a fatal error. */
1846
1847static void
d168aaee 1848read_specs (const char *filename, bool main_p, bool user_p)
b633b6c0
MK
1849{
1850 char *buffer;
b3694847 1851 char *p;
b633b6c0
MK
1852
1853 buffer = load_specs (filename);
1854
20df0482
MM
1855 /* Scan BUFFER for specs, putting them in the vector. */
1856 p = buffer;
1857 while (1)
1858 {
1859 char *suffix;
1860 char *spec;
1861 char *in, *out, *p1, *p2, *p3;
1862
1863 /* Advance P in BUFFER to the next nonblank nocomment line. */
1864 p = skip_whitespace (p);
1865 if (*p == 0)
1866 break;
1867
1868 /* Is this a special command that starts with '%'? */
1869 /* Don't allow this for the main specs file, since it would
1870 encourage people to overwrite it. */
1871 if (*p == '%' && !main_p)
1872 {
1873 p1 = p;
e9a25f70
JL
1874 while (*p && *p != '\n')
1875 p++;
1876
d25a45d4
KH
1877 /* Skip '\n'. */
1878 p++;
20df0482 1879
d25a45d4 1880 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
e9a25f70
JL
1881 && (p1[sizeof "%include" - 1] == ' '
1882 || p1[sizeof "%include" - 1] == '\t'))
20df0482
MM
1883 {
1884 char *new_filename;
1885
1886 p1 += sizeof ("%include");
e9a25f70
JL
1887 while (*p1 == ' ' || *p1 == '\t')
1888 p1++;
20df0482
MM
1889
1890 if (*p1++ != '<' || p[-2] != '>')
2dec80c7
JM
1891 fatal_error ("specs %%include syntax malformed after "
1892 "%ld characters",
1893 (long) (p1 - buffer + 1));
20df0482
MM
1894
1895 p[-2] = '\0';
00dcee0c 1896 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
d168aaee 1897 read_specs (new_filename ? new_filename : p1, false, user_p);
20df0482
MM
1898 continue;
1899 }
e9a25f70
JL
1900 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1901 && (p1[sizeof "%include_noerr" - 1] == ' '
1902 || p1[sizeof "%include_noerr" - 1] == '\t'))
20df0482
MM
1903 {
1904 char *new_filename;
1905
e9a25f70 1906 p1 += sizeof "%include_noerr";
d25a45d4
KH
1907 while (*p1 == ' ' || *p1 == '\t')
1908 p1++;
20df0482
MM
1909
1910 if (*p1++ != '<' || p[-2] != '>')
2dec80c7
JM
1911 fatal_error ("specs %%include syntax malformed after "
1912 "%ld characters",
1913 (long) (p1 - buffer + 1));
20df0482
MM
1914
1915 p[-2] = '\0';
00dcee0c 1916 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
20df0482 1917 if (new_filename)
d168aaee 1918 read_specs (new_filename, false, user_p);
20df0482 1919 else if (verbose_flag)
2dec80c7 1920 fnotice (stderr, "could not find specs file %s\n", p1);
20df0482
MM
1921 continue;
1922 }
e9a25f70
JL
1923 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1924 && (p1[sizeof "%rename" - 1] == ' '
1925 || p1[sizeof "%rename" - 1] == '\t'))
20df0482
MM
1926 {
1927 int name_len;
1928 struct spec_list *sl;
169ce44d 1929 struct spec_list *newsl;
20df0482 1930
169ce44d 1931 /* Get original name. */
e9a25f70
JL
1932 p1 += sizeof "%rename";
1933 while (*p1 == ' ' || *p1 == '\t')
1934 p1++;
1935
9218435e 1936 if (! ISALPHA ((unsigned char) *p1))
2dec80c7
JM
1937 fatal_error ("specs %%rename syntax malformed after "
1938 "%ld characters",
1939 (long) (p1 - buffer));
20df0482
MM
1940
1941 p2 = p1;
9218435e 1942 while (*p2 && !ISSPACE ((unsigned char) *p2))
e9a25f70
JL
1943 p2++;
1944
20df0482 1945 if (*p2 != ' ' && *p2 != '\t')
2dec80c7
JM
1946 fatal_error ("specs %%rename syntax malformed after "
1947 "%ld characters",
1948 (long) (p2 - buffer));
20df0482
MM
1949
1950 name_len = p2 - p1;
1951 *p2++ = '\0';
e9a25f70
JL
1952 while (*p2 == ' ' || *p2 == '\t')
1953 p2++;
1954
9218435e 1955 if (! ISALPHA ((unsigned char) *p2))
2dec80c7
JM
1956 fatal_error ("specs %%rename syntax malformed after "
1957 "%ld characters",
1958 (long) (p2 - buffer));
20df0482 1959
d25a45d4 1960 /* Get new spec name. */
20df0482 1961 p3 = p2;
9218435e 1962 while (*p3 && !ISSPACE ((unsigned char) *p3))
e9a25f70
JL
1963 p3++;
1964
d25a45d4 1965 if (p3 != p - 1)
2dec80c7
JM
1966 fatal_error ("specs %%rename syntax malformed after "
1967 "%ld characters",
1968 (long) (p3 - buffer));
20df0482
MM
1969 *p3 = '\0';
1970
1971 for (sl = specs; sl; sl = sl->next)
1972 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1973 break;
1974
1975 if (!sl)
2dec80c7 1976 fatal_error ("specs %s spec was not found to be renamed", p1);
20df0482 1977
e9a25f70 1978 if (strcmp (p1, p2) == 0)
20df0482
MM
1979 continue;
1980
169ce44d
NC
1981 for (newsl = specs; newsl; newsl = newsl->next)
1982 if (strcmp (newsl->name, p2) == 0)
bdc6b402
JM
1983 fatal_error ("%s: attempt to rename spec %qs to "
1984 "already defined spec %qs",
169ce44d
NC
1985 filename, p1, p2);
1986
20df0482
MM
1987 if (verbose_flag)
1988 {
2dec80c7 1989 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
20df0482 1990#ifdef DEBUG_SPECS
2dec80c7 1991 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
20df0482
MM
1992#endif
1993 }
1994
d168aaee 1995 set_spec (p2, *(sl->ptr_spec), user_p);
20df0482 1996 if (sl->alloc_p)
b1d5455a 1997 free (CONST_CAST (char *, *(sl->ptr_spec)));
20df0482
MM
1998
1999 *(sl->ptr_spec) = "";
2000 sl->alloc_p = 0;
2001 continue;
2002 }
2003 else
2dec80c7
JM
2004 fatal_error ("specs unknown %% command after %ld characters",
2005 (long) (p1 - buffer));
20df0482
MM
2006 }
2007
2008 /* Find the colon that should end the suffix. */
2009 p1 = p;
e9a25f70
JL
2010 while (*p1 && *p1 != ':' && *p1 != '\n')
2011 p1++;
2012
20df0482
MM
2013 /* The colon shouldn't be missing. */
2014 if (*p1 != ':')
2dec80c7
JM
2015 fatal_error ("specs file malformed after %ld characters",
2016 (long) (p1 - buffer));
e9a25f70 2017
20df0482
MM
2018 /* Skip back over trailing whitespace. */
2019 p2 = p1;
e9a25f70
JL
2020 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2021 p2--;
2022
20df0482
MM
2023 /* Copy the suffix to a string. */
2024 suffix = save_string (p, p2 - p);
2025 /* Find the next line. */
2026 p = skip_whitespace (p1 + 1);
2027 if (p[1] == 0)
2dec80c7
JM
2028 fatal_error ("specs file malformed after %ld characters",
2029 (long) (p - buffer));
e9a25f70 2030
20df0482 2031 p1 = p;
bbeb7b65
JW
2032 /* Find next blank line or end of string. */
2033 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
e9a25f70
JL
2034 p1++;
2035
20df0482
MM
2036 /* Specs end at the blank line and do not include the newline. */
2037 spec = save_string (p, p1 - p);
2038 p = p1;
2039
2040 /* Delete backslash-newline sequences from the spec. */
2041 in = spec;
2042 out = spec;
2043 while (*in != 0)
2044 {
2045 if (in[0] == '\\' && in[1] == '\n')
2046 in += 2;
2047 else if (in[0] == '#')
e9a25f70
JL
2048 while (*in && *in != '\n')
2049 in++;
2050
20df0482
MM
2051 else
2052 *out++ = *in++;
2053 }
2054 *out = 0;
2055
2056 if (suffix[0] == '*')
2057 {
2058 if (! strcmp (suffix, "*link_command"))
2059 link_command_spec = spec;
2060 else
d168aaee 2061 set_spec (suffix + 1, spec, user_p);
20df0482
MM
2062 }
2063 else
2064 {
2065 /* Add this pair to the vector. */
2066 compilers
e1e4cdc4 2067 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
e9a25f70 2068
20df0482 2069 compilers[n_compilers].suffix = suffix;
ea414c97 2070 compilers[n_compilers].spec = spec;
20df0482 2071 n_compilers++;
9257393c 2072 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
20df0482
MM
2073 }
2074
2075 if (*suffix == 0)
2076 link_command_spec = spec;
2077 }
2078
2079 if (link_command_spec == 0)
2dec80c7 2080 fatal_error ("spec file has no spec for linking");
20df0482
MM
2081}
2082\f
ed1f651b
RS
2083/* Record the names of temporary files we tell compilers to write,
2084 and delete them at the end of the run. */
2085
aa34f42c
RG
2086/* This is the common prefix we use to make temp file names.
2087 It is chosen once for each run of this program.
2088 It is substituted into a spec by %g or %j.
2089 Thus, all temp file names contain this prefix.
2090 In practice, all temp file names start with this prefix.
2091
2092 This prefix comes from the envvar TMPDIR if it is defined;
2093 otherwise, from the P_tmpdir macro if that is defined;
2094 otherwise, in /usr/tmp or /tmp;
2095 or finally the current directory if all else fails. */
2096
2097static const char *temp_filename;
2098
2099/* Length of the prefix. */
2100
2101static int temp_filename_length;
2102
ed1f651b
RS
2103/* Define the list of temporary files to delete. */
2104
2105struct temp_file
2106{
878f32c3 2107 const char *name;
ed1f651b
RS
2108 struct temp_file *next;
2109};
2110
2111/* Queue of files to delete on success or failure of compilation. */
2112static struct temp_file *always_delete_queue;
2113/* Queue of files to delete on failure of compilation. */
2114static struct temp_file *failure_delete_queue;
2115
2116/* Record FILENAME as a file to be deleted automatically.
2117 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2118 otherwise delete it in any case.
2119 FAIL_DELETE nonzero means delete it if a compilation step fails;
2120 otherwise delete it in any case. */
2121
d991c721 2122void
1d088dee 2123record_temp_file (const char *filename, int always_delete, int fail_delete)
ed1f651b 2124{
b3694847 2125 char *const name = xstrdup (filename);
ed1f651b
RS
2126
2127 if (always_delete)
2128 {
b3694847 2129 struct temp_file *temp;
ed1f651b 2130 for (temp = always_delete_queue; temp; temp = temp->next)
ba78087b 2131 if (! filename_cmp (name, temp->name))
ed1f651b 2132 goto already1;
e9a25f70 2133
5ed6ace5 2134 temp = XNEW (struct temp_file);
ed1f651b
RS
2135 temp->next = always_delete_queue;
2136 temp->name = name;
2137 always_delete_queue = temp;
e9a25f70 2138
ed1f651b
RS
2139 already1:;
2140 }
2141
2142 if (fail_delete)
2143 {
b3694847 2144 struct temp_file *temp;
ed1f651b 2145 for (temp = failure_delete_queue; temp; temp = temp->next)
ba78087b 2146 if (! filename_cmp (name, temp->name))
fc429b48
TB
2147 {
2148 free (name);
2149 goto already2;
2150 }
e9a25f70 2151
5ed6ace5 2152 temp = XNEW (struct temp_file);
ed1f651b
RS
2153 temp->next = failure_delete_queue;
2154 temp->name = name;
2155 failure_delete_queue = temp;
e9a25f70 2156
ed1f651b
RS
2157 already2:;
2158 }
2159}
2160
2161/* Delete all the temporary files whose names we previously recorded. */
2162
8fd58397
DR
2163#ifndef DELETE_IF_ORDINARY
2164#define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2165do \
2166 { \
2167 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2168 if (unlink (NAME) < 0) \
2169 if (VERBOSE_FLAG) \
2170 perror_with_name (NAME); \
2171 } while (0)
2172#endif
2173
d5ea2ac4 2174static void
1d088dee 2175delete_if_ordinary (const char *name)
d5ea2ac4
RK
2176{
2177 struct stat st;
2178#ifdef DEBUG
2179 int i, c;
2180
2181 printf ("Delete %s? (y or n) ", name);
2182 fflush (stdout);
2183 i = getchar ();
2184 if (i != '\n')
e9a25f70
JL
2185 while ((c = getchar ()) != '\n' && c != EOF)
2186 ;
2187
d5ea2ac4
RK
2188 if (i == 'y' || i == 'Y')
2189#endif /* DEBUG */
8fd58397 2190 DELETE_IF_ORDINARY (name, st, verbose_flag);
d5ea2ac4
RK
2191}
2192
ed1f651b 2193static void
1d088dee 2194delete_temp_files (void)
ed1f651b 2195{
b3694847 2196 struct temp_file *temp;
ed1f651b
RS
2197
2198 for (temp = always_delete_queue; temp; temp = temp->next)
d5ea2ac4 2199 delete_if_ordinary (temp->name);
ed1f651b
RS
2200 always_delete_queue = 0;
2201}
2202
2203/* Delete all the files to be deleted on error. */
2204
2205static void
1d088dee 2206delete_failure_queue (void)
ed1f651b 2207{
b3694847 2208 struct temp_file *temp;
ed1f651b
RS
2209
2210 for (temp = failure_delete_queue; temp; temp = temp->next)
d5ea2ac4 2211 delete_if_ordinary (temp->name);
ed1f651b
RS
2212}
2213
2214static void
1d088dee 2215clear_failure_queue (void)
ed1f651b
RS
2216{
2217 failure_delete_queue = 0;
2218}
b3865ca9 2219\f
00dcee0c
AM
2220/* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2221 returns non-NULL.
2222 If DO_MULTI is true iterate over the paths twice, first with multilib
2223 suffix then without, otherwise iterate over the paths once without
2224 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2225 to avoid visiting the same path twice, but we could do better. For
2226 instance, /usr/lib/../lib is considered different from /usr/lib.
2227 At least EXTRA_SPACE chars past the end of the path passed to
2228 CALLBACK are available for use by the callback.
2229 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2230
2231 Returns the value returned by CALLBACK. */
2232
2233static void *
2234for_each_path (const struct path_prefix *paths,
2235 bool do_multi,
2236 size_t extra_space,
2237 void *(*callback) (char *, void *),
2238 void *callback_info)
b3865ca9 2239{
00dcee0c
AM
2240 struct prefix_list *pl;
2241 const char *multi_dir = NULL;
2242 const char *multi_os_dir = NULL;
e0cdc09f 2243 const char *multiarch_suffix = NULL;
00dcee0c
AM
2244 const char *multi_suffix;
2245 const char *just_multi_suffix;
2246 char *path = NULL;
2247 void *ret = NULL;
2248 bool skip_multi_dir = false;
2249 bool skip_multi_os_dir = false;
2250
2251 multi_suffix = machine_suffix;
2252 just_multi_suffix = just_machine_suffix;
2253 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
b3865ca9 2254 {
00dcee0c
AM
2255 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2256 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2257 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2258 }
2259 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2260 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
e0cdc09f
MK
2261 if (multiarch_dir)
2262 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
b3865ca9 2263
00dcee0c
AM
2264 while (1)
2265 {
2266 size_t multi_dir_len = 0;
2267 size_t multi_os_dir_len = 0;
e0cdc09f 2268 size_t multiarch_len = 0;
00dcee0c
AM
2269 size_t suffix_len;
2270 size_t just_suffix_len;
2271 size_t len;
2272
2273 if (multi_dir)
2274 multi_dir_len = strlen (multi_dir);
2275 if (multi_os_dir)
2276 multi_os_dir_len = strlen (multi_os_dir);
e0cdc09f
MK
2277 if (multiarch_suffix)
2278 multiarch_len = strlen (multiarch_suffix);
00dcee0c
AM
2279 suffix_len = strlen (multi_suffix);
2280 just_suffix_len = strlen (just_multi_suffix);
2281
2282 if (path == NULL)
b3865ca9 2283 {
00dcee0c 2284 len = paths->max_len + extra_space + 1;
e0cdc09f 2285 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
5ed6ace5 2286 path = XNEWVEC (char, len);
b3865ca9
RS
2287 }
2288
00dcee0c 2289 for (pl = paths->plist; pl != 0; pl = pl->next)
ae04227b 2290 {
00dcee0c
AM
2291 len = strlen (pl->prefix);
2292 memcpy (path, pl->prefix, len);
9218435e 2293
00dcee0c
AM
2294 /* Look first in MACHINE/VERSION subdirectory. */
2295 if (!skip_multi_dir)
2296 {
2297 memcpy (path + len, multi_suffix, suffix_len + 1);
2298 ret = callback (path, callback_info);
2299 if (ret)
2300 break;
2301 }
2302
2303 /* Some paths are tried with just the machine (ie. target)
2304 subdir. This is used for finding as, ld, etc. */
2305 if (!skip_multi_dir
2306 && pl->require_machine_suffix == 2)
2307 {
2308 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2309 ret = callback (path, callback_info);
2310 if (ret)
2311 break;
2312 }
2313
e0cdc09f
MK
2314 /* Now try the multiarch path. */
2315 if (!skip_multi_dir
2316 && !pl->require_machine_suffix && multiarch_dir)
2317 {
2318 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2319 ret = callback (path, callback_info);
2320 if (ret)
2321 break;
2322 }
2323
00dcee0c
AM
2324 /* Now try the base path. */
2325 if (!pl->require_machine_suffix
2326 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2327 {
2328 const char *this_multi;
2329 size_t this_multi_len;
2330
2331 if (pl->os_multilib)
2332 {
2333 this_multi = multi_os_dir;
2334 this_multi_len = multi_os_dir_len;
2335 }
2336 else
2337 {
2338 this_multi = multi_dir;
2339 this_multi_len = multi_dir_len;
2340 }
2341
2342 if (this_multi_len)
2343 memcpy (path + len, this_multi, this_multi_len + 1);
2344 else
2345 path[len] = '\0';
2346
2347 ret = callback (path, callback_info);
2348 if (ret)
2349 break;
2350 }
ae04227b 2351 }
00dcee0c
AM
2352 if (pl)
2353 break;
ae04227b 2354
00dcee0c
AM
2355 if (multi_dir == NULL && multi_os_dir == NULL)
2356 break;
b3865ca9 2357
00dcee0c
AM
2358 /* Run through the paths again, this time without multilibs.
2359 Don't repeat any we have already seen. */
2360 if (multi_dir)
2361 {
b1d5455a 2362 free (CONST_CAST (char *, multi_dir));
00dcee0c 2363 multi_dir = NULL;
b1d5455a 2364 free (CONST_CAST (char *, multi_suffix));
00dcee0c 2365 multi_suffix = machine_suffix;
b1d5455a 2366 free (CONST_CAST (char *, just_multi_suffix));
00dcee0c 2367 just_multi_suffix = just_machine_suffix;
b3865ca9 2368 }
00dcee0c
AM
2369 else
2370 skip_multi_dir = true;
2371 if (multi_os_dir)
2372 {
b1d5455a 2373 free (CONST_CAST (char *, multi_os_dir));
00dcee0c
AM
2374 multi_os_dir = NULL;
2375 }
2376 else
2377 skip_multi_os_dir = true;
2378 }
2379
2380 if (multi_dir)
2381 {
b1d5455a
KG
2382 free (CONST_CAST (char *, multi_dir));
2383 free (CONST_CAST (char *, multi_suffix));
2384 free (CONST_CAST (char *, just_multi_suffix));
b3865ca9 2385 }
00dcee0c 2386 if (multi_os_dir)
b1d5455a 2387 free (CONST_CAST (char *, multi_os_dir));
00dcee0c
AM
2388 if (ret != path)
2389 free (path);
2390 return ret;
2391}
2392
2393/* Callback for build_search_list. Adds path to obstack being built. */
2394
2395struct add_to_obstack_info {
2396 struct obstack *ob;
2397 bool check_dir;
2398 bool first_time;
2399};
2400
2401static void *
2402add_to_obstack (char *path, void *data)
2403{
e1e4cdc4 2404 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
00dcee0c
AM
2405
2406 if (info->check_dir && !is_directory (path, false))
2407 return NULL;
2408
2409 if (!info->first_time)
2410 obstack_1grow (info->ob, PATH_SEPARATOR);
2411
2412 obstack_grow (info->ob, path, strlen (path));
2413
2414 info->first_time = false;
2415 return NULL;
2416}
2417
47d33318
FXC
2418/* Add or change the value of an environment variable, outputting the
2419 change to standard error if in verbose mode. */
2420static void
e9c15f6e 2421xputenv (const char *string)
47d33318
FXC
2422{
2423 if (verbose_flag)
2dec80c7 2424 fnotice (stderr, "%s\n", string);
e9c15f6e 2425 putenv (CONST_CAST (char *, string));
47d33318
FXC
2426}
2427
00dcee0c
AM
2428/* Build a list of search directories from PATHS.
2429 PREFIX is a string to prepend to the list.
2430 If CHECK_DIR_P is true we ensure the directory exists.
2431 If DO_MULTI is true, multilib paths are output first, then
2432 non-multilib paths.
2433 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2434 It is also used by the --print-search-dirs flag. */
2435
2436static char *
2437build_search_list (const struct path_prefix *paths, const char *prefix,
2438 bool check_dir, bool do_multi)
2439{
2440 struct add_to_obstack_info info;
2441
2442 info.ob = &collect_obstack;
2443 info.check_dir = check_dir;
2444 info.first_time = true;
2445
2446 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2447 obstack_1grow (&collect_obstack, '=');
2448
2449 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
e9a25f70 2450
3ae7de4e 2451 obstack_1grow (&collect_obstack, '\0');
7973fd2a 2452 return XOBFINISH (&collect_obstack, char *);
b3865ca9
RS
2453}
2454
0f41302f
MS
2455/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2456 for collect. */
2628b9d3
DE
2457
2458static void
00dcee0c
AM
2459putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2460 bool do_multi)
2628b9d3 2461{
47d33318 2462 xputenv (build_search_list (paths, env_var, true, do_multi));
2628b9d3 2463}
ed1f651b 2464\f
ca606201
ILT
2465/* Check whether NAME can be accessed in MODE. This is like access,
2466 except that it never considers directories to be executable. */
2467
2468static int
1d088dee 2469access_check (const char *name, int mode)
ca606201
ILT
2470{
2471 if (mode == X_OK)
2472 {
2473 struct stat st;
2474
2475 if (stat (name, &st) < 0
2476 || S_ISDIR (st.st_mode))
2477 return -1;
2478 }
2479
2480 return access (name, mode);
2481}
2482
00dcee0c
AM
2483/* Callback for find_a_file. Appends the file name to the directory
2484 path. If the resulting file exists in the right mode, return the
2485 full pathname to the file. */
2486
2487struct file_at_path_info {
2488 const char *name;
2489 const char *suffix;
2490 int name_len;
2491 int suffix_len;
2492 int mode;
2493};
2494
2495static void *
2496file_at_path (char *path, void *data)
2497{
e1e4cdc4 2498 struct file_at_path_info *info = (struct file_at_path_info *) data;
00dcee0c
AM
2499 size_t len = strlen (path);
2500
2501 memcpy (path + len, info->name, info->name_len);
2502 len += info->name_len;
2503
2504 /* Some systems have a suffix for executable files.
2505 So try appending that first. */
2506 if (info->suffix_len)
2507 {
2508 memcpy (path + len, info->suffix, info->suffix_len + 1);
2509 if (access_check (path, info->mode) == 0)
2510 return path;
2511 }
2512
2513 path[len] = '\0';
2514 if (access_check (path, info->mode) == 0)
2515 return path;
2516
2517 return NULL;
2518}
2519
ed1f651b 2520/* Search for NAME using the prefix list PREFIXES. MODE is passed to
00dcee0c
AM
2521 access to check permissions. If DO_MULTI is true, search multilib
2522 paths then non-multilib paths, otherwise do not search multilib paths.
0f41302f 2523 Return 0 if not found, otherwise return its name, allocated with malloc. */
ed1f651b
RS
2524
2525static char *
00dcee0c
AM
2526find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2527 bool do_multi)
ed1f651b 2528{
00dcee0c 2529 struct file_at_path_info info;
ed1f651b 2530
ab339d62 2531#ifdef DEFAULT_ASSEMBLER
c5c0b3d9 2532 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
ad85216e 2533 return xstrdup (DEFAULT_ASSEMBLER);
ab339d62
AO
2534#endif
2535
2536#ifdef DEFAULT_LINKER
c3284718 2537 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, mode) == 0)
ad85216e 2538 return xstrdup (DEFAULT_LINKER);
ab339d62
AO
2539#endif
2540
ed1f651b
RS
2541 /* Determine the filename to execute (special case for absolute paths). */
2542
3dce1408 2543 if (IS_ABSOLUTE_PATH (name))
ed1f651b 2544 {
ab339d62 2545 if (access (name, mode) == 0)
00dcee0c 2546 return xstrdup (name);
460dcab4 2547
00dcee0c
AM
2548 return NULL;
2549 }
460dcab4 2550
00dcee0c
AM
2551 info.name = name;
2552 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2553 info.name_len = strlen (info.name);
2554 info.suffix_len = strlen (info.suffix);
2555 info.mode = mode;
ed1f651b 2556
e1e4cdc4
KG
2557 return (char*) for_each_path (pprefix, do_multi,
2558 info.name_len + info.suffix_len,
2559 file_at_path, &info);
ed1f651b
RS
2560}
2561
922a4beb 2562/* Ranking of prefixes in the sort list. -B prefixes are put before
9218435e 2563 all others. */
922a4beb
AC
2564
2565enum path_prefix_priority
2566{
2567 PREFIX_PRIORITY_B_OPT,
2568 PREFIX_PRIORITY_LAST
2569};
2570
fbe5a4a6 2571/* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
922a4beb
AC
2572 order according to PRIORITY. Within each PRIORITY, new entries are
2573 appended.
ed1f651b
RS
2574
2575 If WARN is nonzero, we will warn if no file is found
2576 through this prefix. WARN should point to an int
ae04227b
CH
2577 which will be set to 1 if this entry is used.
2578
e9a25f70
JL
2579 COMPONENT is the value to be passed to update_path.
2580
ae04227b
CH
2581 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2582 the complete value of machine_suffix.
2583 2 means try both machine_suffix and just_machine_suffix. */
ed1f651b
RS
2584
2585static void
1d088dee
AJ
2586add_prefix (struct path_prefix *pprefix, const char *prefix,
2587 const char *component, /* enum prefix_priority */ int priority,
1a5d37a1 2588 int require_machine_suffix, int os_multilib)
ed1f651b
RS
2589{
2590 struct prefix_list *pl, **prev;
2591 int len;
2592
922a4beb
AC
2593 for (prev = &pprefix->plist;
2594 (*prev) != NULL && (*prev)->priority <= priority;
2595 prev = &(*prev)->next)
2596 ;
ed1f651b 2597
f9da5064 2598 /* Keep track of the longest prefix. */
ed1f651b 2599
e9a25f70 2600 prefix = update_path (prefix, component);
ed1f651b
RS
2601 len = strlen (prefix);
2602 if (len > pprefix->max_len)
2603 pprefix->max_len = len;
2604
5ed6ace5 2605 pl = XNEW (struct prefix_list);
51c04256 2606 pl->prefix = prefix;
ed1f651b 2607 pl->require_machine_suffix = require_machine_suffix;
922a4beb 2608 pl->priority = priority;
5bbcd587 2609 pl->os_multilib = os_multilib;
ed1f651b 2610
f9da5064 2611 /* Insert after PREV. */
922a4beb
AC
2612 pl->next = (*prev);
2613 (*prev) = pl;
ed1f651b 2614}
4977bab6
ZW
2615
2616/* Same as add_prefix, but prepending target_system_root to prefix. */
f4c0a303 2617/* The target_system_root prefix has been relocated by gcc_exec_prefix. */
4977bab6 2618static void
1d088dee
AJ
2619add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2620 const char *component,
2621 /* enum prefix_priority */ int priority,
1a5d37a1 2622 int require_machine_suffix, int os_multilib)
4977bab6 2623{
3dce1408 2624 if (!IS_ABSOLUTE_PATH (prefix))
bdc6b402 2625 fatal_error ("system path %qs is not absolute", prefix);
4977bab6
ZW
2626
2627 if (target_system_root)
2628 {
2fda54bd
MK
2629 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2630 size_t sysroot_len = strlen (target_system_root);
2631
2632 if (sysroot_len > 0
2633 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2634 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2635
e7f13528 2636 if (target_sysroot_suffix)
fc429b48
TB
2637 prefix = concat (sysroot_no_trailing_dir_separator,
2638 target_sysroot_suffix, prefix, NULL);
2639 else
2640 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
2641
2fda54bd 2642 free (sysroot_no_trailing_dir_separator);
e7f13528 2643
4977bab6
ZW
2644 /* We have to override this because GCC's notion of sysroot
2645 moves along with GCC. */
2646 component = "GCC";
2647 }
2648
2649 add_prefix (pprefix, prefix, component, priority,
1a5d37a1 2650 require_machine_suffix, os_multilib);
4977bab6 2651}
ed1f651b
RS
2652\f
2653/* Execute the command specified by the arguments on the current line of spec.
2654 When using pipes, this includes several piped-together commands
2655 with `|' between them.
2656
2657 Return 0 if successful, -1 if failed. */
2658
2659static int
1d088dee 2660execute (void)
ed1f651b
RS
2661{
2662 int i;
2663 int n_commands; /* # of command. */
2664 char *string;
054e88a8 2665 struct pex_obj *pex;
ed1f651b 2666 struct command
d25a45d4
KH
2667 {
2668 const char *prog; /* program name. */
2669 const char **argv; /* vector of args. */
d25a45d4 2670 };
5b634ee0 2671 const char *arg;
ed1f651b
RS
2672
2673 struct command *commands; /* each command buffer with above info. */
2674
3b5edfee 2675 gcc_assert (!processing_spec_function);
f3226a90 2676
fe7df9c4
SP
2677 if (wrapper_string)
2678 {
5b634ee0 2679 string = find_a_file (&exec_prefixes,
9771b263 2680 argbuf[0], X_OK, false);
5b634ee0 2681 if (string)
9771b263 2682 argbuf[0] = string;
fe7df9c4
SP
2683 insert_wrapper (wrapper_string);
2684 }
2685
ed1f651b 2686 /* Count # of piped commands. */
9771b263 2687 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
5b634ee0 2688 if (strcmp (arg, "|") == 0)
ed1f651b
RS
2689 n_commands++;
2690
2691 /* Get storage for each command. */
e1e4cdc4 2692 commands = (struct command *) alloca (n_commands * sizeof (struct command));
ed1f651b
RS
2693
2694 /* Split argbuf into its separate piped processes,
2695 and record info about each one.
2696 Also search for the programs that are to be run. */
2697
9771b263 2698 argbuf.safe_push (0);
5b634ee0 2699
9771b263
DN
2700 commands[0].prog = argbuf[0]; /* first command. */
2701 commands[0].argv = argbuf.address ();
b8698a0f 2702
fe7df9c4
SP
2703 if (!wrapper_string)
2704 {
2705 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2706 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2707 }
ed1f651b 2708
9771b263 2709 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
5b634ee0 2710 if (arg && strcmp (arg, "|") == 0)
ed1f651b 2711 { /* each command. */
6405c0ec 2712#if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2dec80c7 2713 fatal_error ("-pipe not supported");
ed1f651b 2714#endif
9771b263 2715 argbuf[i] = 0; /* Termination of
5b634ee0 2716 command args. */
9771b263 2717 commands[n_commands].prog = argbuf[i + 1];
5b634ee0 2718 commands[n_commands].argv
9771b263 2719 = &(argbuf.address ())[i + 1];
5bbcd587 2720 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
00dcee0c 2721 X_OK, false);
ed1f651b
RS
2722 if (string)
2723 commands[n_commands].argv[0] = string;
2724 n_commands++;
2725 }
2726
ed1f651b
RS
2727 /* If -v, print what we are about to do, and maybe query. */
2728
b3865ca9 2729 if (verbose_flag)
ed1f651b 2730 {
b8468bc7
NC
2731 /* For help listings, put a blank line between sub-processes. */
2732 if (print_help_list)
2733 fputc ('\n', stderr);
9218435e 2734
ed1f651b 2735 /* Print each piped command as a separate line. */
d25a45d4 2736 for (i = 0; i < n_commands; i++)
ed1f651b 2737 {
37620334 2738 const char *const *j;
ed1f651b 2739
589005ff
KH
2740 if (verbose_only_flag)
2741 {
99f78cdd
IR
2742 for (j = commands[i].argv; *j; j++)
2743 {
88f92c0f 2744 const char *p;
99f78cdd 2745 for (p = *j; *p; ++p)
09b201fc
JJ
2746 if (!ISALNUM ((unsigned char) *p)
2747 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
2748 break;
2749 if (*p || !*j)
99f78cdd 2750 {
09b201fc
JJ
2751 fprintf (stderr, " \"");
2752 for (p = *j; *p; ++p)
2753 {
2754 if (*p == '"' || *p == '\\' || *p == '$')
2755 fputc ('\\', stderr);
2756 fputc (*p, stderr);
2757 }
2758 fputc ('"', stderr);
99f78cdd 2759 }
7fcf46f5
JZ
2760 /* If it's empty, print "". */
2761 else if (!**j)
2762 fprintf (stderr, " \"\"");
09b201fc
JJ
2763 else
2764 fprintf (stderr, " %s", *j);
99f78cdd 2765 }
589005ff
KH
2766 }
2767 else
99f78cdd 2768 for (j = commands[i].argv; *j; j++)
7fcf46f5
JZ
2769 /* If it's empty, print "". */
2770 if (!**j)
2771 fprintf (stderr, " \"\"");
2772 else
2773 fprintf (stderr, " %s", *j);
ed1f651b
RS
2774
2775 /* Print a pipe symbol after all but the last command. */
2776 if (i + 1 != n_commands)
2777 fprintf (stderr, " |");
2778 fprintf (stderr, "\n");
2779 }
2780 fflush (stderr);
99f78cdd 2781 if (verbose_only_flag != 0)
6a40fb21
AP
2782 {
2783 /* verbose_only_flag should act as if the spec was
2784 executed, so increment execution_count before
ba228239 2785 returning. This prevents spurious warnings about
6a40fb21
AP
2786 unused linker input files, etc. */
2787 execution_count++;
2788 return 0;
2789 }
ed1f651b 2790#ifdef DEBUG
2dec80c7 2791 fnotice (stderr, "\nGo ahead? (y or n) ");
ed1f651b
RS
2792 fflush (stderr);
2793 i = getchar ();
2794 if (i != '\n')
e9a25f70
JL
2795 while (getchar () != '\n')
2796 ;
2797
ed1f651b
RS
2798 if (i != 'y' && i != 'Y')
2799 return 0;
2800#endif /* DEBUG */
2801 }
2802
414d23ae 2803#ifdef ENABLE_VALGRIND_CHECKING
fbe5a4a6 2804 /* Run the each command through valgrind. To simplify prepending the
414d23ae
HPN
2805 path to valgrind and the option "-q" (for quiet operation unless
2806 something triggers), we allocate a separate argv array. */
2807
2808 for (i = 0; i < n_commands; i++)
2809 {
2810 const char **argv;
2811 int argc;
2812 int j;
2813
2814 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
2815 ;
2816
63ab5b8c 2817 argv = XALLOCAVEC (const char *, argc + 3);
414d23ae
HPN
2818
2819 argv[0] = VALGRIND_PATH;
2820 argv[1] = "-q";
2821 for (j = 2; j < argc + 2; j++)
2822 argv[j] = commands[i].argv[j - 2];
2823 argv[j] = NULL;
2824
2825 commands[i].argv = argv;
2826 commands[i].prog = argv[0];
2827 }
2828#endif
2829
ed1f651b
RS
2830 /* Run each piped subprocess. */
2831
bdde878c
AO
2832 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
2833 ? PEX_RECORD_TIMES : 0),
6afbc885 2834 progname, temp_filename);
054e88a8 2835 if (pex == NULL)
bdc6b402 2836 fatal_error ("pex_init failed: %m");
054e88a8 2837
ed1f651b
RS
2838 for (i = 0; i < n_commands; i++)
2839 {
054e88a8
ILT
2840 const char *errmsg;
2841 int err;
fbd40359 2842 const char *string = commands[i].argv[0];
ed1f651b 2843
054e88a8
ILT
2844 errmsg = pex_run (pex,
2845 ((i + 1 == n_commands ? PEX_LAST : 0)
2846 | (string == commands[i].prog ? PEX_SEARCH : 0)),
b1d5455a 2847 string, CONST_CAST (char **, commands[i].argv),
054e88a8
ILT
2848 NULL, NULL, &err);
2849 if (errmsg != NULL)
2850 {
2851 if (err == 0)
2dec80c7 2852 fatal_error (errmsg);
054e88a8
ILT
2853 else
2854 {
2855 errno = err;
2856 pfatal_with_name (errmsg);
2857 }
2858 }
ed1f651b 2859
dc10fd96 2860 if (i && string != commands[i].prog)
b1d5455a 2861 free (CONST_CAST (char *, string));
ed1f651b
RS
2862 }
2863
2864 execution_count++;
2865
054e88a8 2866 /* Wait for all the subprocesses to finish. */
ed1f651b
RS
2867
2868 {
054e88a8
ILT
2869 int *statuses;
2870 struct pex_time *times = NULL;
ed1f651b
RS
2871 int ret_code = 0;
2872
e1e4cdc4 2873 statuses = (int *) alloca (n_commands * sizeof (int));
054e88a8 2874 if (!pex_get_status (pex, n_commands, statuses))
bdc6b402 2875 fatal_error ("failed to get exit status: %m");
054e88a8 2876
bdde878c 2877 if (report_times || report_times_to_file)
ed1f651b 2878 {
e1e4cdc4 2879 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
054e88a8 2880 if (!pex_get_times (pex, n_commands, times))
bdc6b402 2881 fatal_error ("failed to get process times: %m");
054e88a8 2882 }
ed1f651b 2883
054e88a8 2884 pex_free (pex);
ed1f651b 2885
054e88a8
ILT
2886 for (i = 0; i < n_commands; ++i)
2887 {
2888 int status = statuses[i];
03c41c05 2889
054e88a8
ILT
2890 if (WIFSIGNALED (status))
2891 {
c334349b 2892#ifdef SIGPIPE
054e88a8
ILT
2893 /* SIGPIPE is a special case. It happens in -pipe mode
2894 when the compiler dies before the preprocessor is done,
2895 or the assembler dies before the compiler is done.
2896 There's generally been an error already, and this is
2897 just fallout. So don't generate another error unless
2898 we would otherwise have succeeded. */
2899 if (WTERMSIG (status) == SIGPIPE
2900 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
eeac616e
VR
2901 {
2902 signal_count++;
2903 ret_code = -1;
2904 }
054e88a8
ILT
2905 else
2906#endif
6afbc885
JM
2907 internal_error ("%s (program %s)",
2908 strsignal (WTERMSIG (status)), commands[i].prog);
054e88a8
ILT
2909 }
2910 else if (WIFEXITED (status)
2911 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2912 {
dc10fd96
JJ
2913 /* For ICEs in cc1, cc1obj, cc1plus see if it is
2914 reproducible or not. */
2915 const char *p;
2916 if (flag_report_bug
2917 && WEXITSTATUS (status) == ICE_EXIT_CODE
2918 && i == 0
2919 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR))
2920 && ! strncmp (p + 1, "cc1", 3))
1120a850 2921 try_generate_repro (commands[0].argv);
054e88a8
ILT
2922 if (WEXITSTATUS (status) > greatest_status)
2923 greatest_status = WEXITSTATUS (status);
2924 ret_code = -1;
2925 }
2926
bdde878c 2927 if (report_times || report_times_to_file)
054e88a8
ILT
2928 {
2929 struct pex_time *pt = &times[i];
2930 double ut, st;
2931
2932 ut = ((double) pt->user_seconds
2933 + (double) pt->user_microseconds / 1.0e6);
2934 st = ((double) pt->system_seconds
2935 + (double) pt->system_microseconds / 1.0e6);
2936
2937 if (ut + st != 0)
bdde878c
AO
2938 {
2939 if (report_times)
2dec80c7
JM
2940 fnotice (stderr, "# %s %.2f %.2f\n",
2941 commands[i].prog, ut, st);
bdde878c
AO
2942
2943 if (report_times_to_file)
2944 {
2945 int c = 0;
2946 const char *const *j;
2947
2948 fprintf (report_times_to_file, "%g %g", ut, st);
2949
2950 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
2951 {
2952 const char *p;
2953 for (p = *j; *p; ++p)
2954 if (*p == '"' || *p == '\\' || *p == '$'
2955 || ISSPACE (*p))
2956 break;
2957
2958 if (*p)
2959 {
2960 fprintf (report_times_to_file, " \"");
2961 for (p = *j; *p; ++p)
2962 {
2963 if (*p == '"' || *p == '\\' || *p == '$')
2964 fputc ('\\', report_times_to_file);
2965 fputc (*p, report_times_to_file);
2966 }
2967 fputc ('"', report_times_to_file);
2968 }
2969 else
2970 fprintf (report_times_to_file, " %s", *j);
2971 }
2972
2973 fputc ('\n', report_times_to_file);
2974 }
2975 }
054e88a8 2976 }
ed1f651b 2977 }
054e88a8 2978
dc10fd96
JJ
2979 if (commands[0].argv[0] != commands[0].prog)
2980 free (CONST_CAST (char *, commands[0].argv[0]));
2981
ed1f651b
RS
2982 return ret_code;
2983 }
2984}
2985\f
2986/* Find all the switches given to us
2987 and make a vector describing them.
2988 The elements of the vector are strings, one per switch given.
2989 If a switch uses following arguments, then the `part1' field
2990 is the switch itself and the `args' field
2991 is a null-terminated vector containing the following arguments.
3371362c
L
2992 Bits in the `live_cond' field are:
2993 SWITCH_LIVE to indicate this switch is true in a conditional spec.
2994 SWITCH_FALSE to indicate this switch is overridden by a later switch.
2995 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
94b90527
JJ
2996 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
2997 in all do_spec calls afterwards. Used for %<S from self specs.
ab87f8c8 2998 The `validated' field is nonzero if any spec has looked at this switch;
ed1f651b
RS
2999 if it remains zero at the end of the run, it must be meaningless. */
3000
96f5b137
L
3001#define SWITCH_LIVE (1 << 0)
3002#define SWITCH_FALSE (1 << 1)
3003#define SWITCH_IGNORE (1 << 2)
3004#define SWITCH_IGNORE_PERMANENTLY (1 << 3)
3005#define SWITCH_KEEP_FOR_GCC (1 << 4)
8097c429 3006
ed1f651b
RS
3007struct switchstr
3008{
878f32c3 3009 const char *part1;
fbd40359 3010 const char **args;
3371362c 3011 unsigned int live_cond;
d168aaee
CB
3012 bool known;
3013 bool validated;
3014 bool ordering;
ed1f651b
RS
3015};
3016
3017static struct switchstr *switches;
3018
3019static int n_switches;
3020
922e1882
JM
3021static int n_switches_alloc;
3022
2153915d
AO
3023/* Set to zero if -fcompare-debug is disabled, positive if it's
3024 enabled and we're running the first compilation, negative if it's
3025 enabled and we're running the second compilation. For most of the
3026 time, it's in the range -1..1, but it can be temporarily set to 2
3027 or 3 to indicate that the -fcompare-debug flags didn't come from
3028 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3029 variable, until a synthesized -fcompare-debug flag is added to the
3030 command line. */
3031int compare_debug;
3032
3033/* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3034int compare_debug_second;
3035
3036/* Set to the flags that should be passed to the second compilation in
3037 a -fcompare-debug compilation. */
3038const char *compare_debug_opt;
3039
3040static struct switchstr *switches_debug_check[2];
3041
3042static int n_switches_debug_check[2];
3043
efe5e5a0
JM
3044static int n_switches_alloc_debug_check[2];
3045
2153915d
AO
3046static char *debug_check_temp_file[2];
3047
817a8255
EC
3048/* Language is one of three things:
3049
3050 1) The name of a real programming language.
3051 2) NULL, indicating that no one has figured out
3052 what it is yet.
3053 3) '*', indicating that the file should be passed
3054 to the linker. */
ed1f651b
RS
3055struct infile
3056{
878f32c3
KG
3057 const char *name;
3058 const char *language;
0855eab7
CT
3059 struct compiler *incompiler;
3060 bool compiled;
3061 bool preprocessed;
ed1f651b
RS
3062};
3063
3064/* Also a vector of input files specified. */
3065
3066static struct infile *infiles;
3067
3a5a9edc 3068int n_infiles;
ed1f651b 3069
922e1882
JM
3070static int n_infiles_alloc;
3071
d1bd0ded
GK
3072/* True if multiple input files are being compiled to a single
3073 assembly file. */
3074
3075static bool combine_inputs;
3076
08dc830e 3077/* This counts the number of libraries added by lang_specific_driver, so that
a2a05b0a
JW
3078 we can tell if there were any user supplied any files or libraries. */
3079
3080static int added_libraries;
3081
ed1f651b
RS
3082/* And a vector of corresponding output files is made up later. */
3083
3a5a9edc 3084const char **outfiles;
853e0b2d 3085\f
45936a85 3086#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
853e0b2d
RK
3087
3088/* Convert NAME to a new name if it is the standard suffix. DO_EXE
a9657ce8
DR
3089 is true if we should look for an executable suffix. DO_OBJ
3090 is true if we should look for an object suffix. */
853e0b2d 3091
40cdfca6 3092static const char *
1d088dee
AJ
3093convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3094 int do_obj ATTRIBUTE_UNUSED)
853e0b2d 3095{
40cdfca6 3096#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
853e0b2d 3097 int i;
40cdfca6 3098#endif
87e690e2
MK
3099 int len;
3100
3101 if (name == NULL)
3102 return NULL;
9218435e 3103
87e690e2 3104 len = strlen (name);
853e0b2d 3105
45936a85
DD
3106#ifdef HAVE_TARGET_OBJECT_SUFFIX
3107 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
a9657ce8 3108 if (do_obj && len > 2
853e0b2d
RK
3109 && name[len - 2] == '.'
3110 && name[len - 1] == 'o')
3111 {
bdc5ed93 3112 obstack_grow (&obstack, name, len - 2);
45936a85 3113 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
7973fd2a 3114 name = XOBFINISH (&obstack, const char *);
853e0b2d
RK
3115 }
3116#endif
3117
45936a85 3118#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
853e0b2d
RK
3119 /* If there is no filetype, make it the executable suffix (which includes
3120 the "."). But don't get confused if we have just "-o". */
45936a85 3121 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
853e0b2d
RK
3122 return name;
3123
e0040a8e 3124 for (i = len - 1; i >= 0; i--)
509781a4 3125 if (IS_DIR_SEPARATOR (name[i]))
e0040a8e
RK
3126 break;
3127
3128 for (i++; i < len; i++)
853e0b2d
RK
3129 if (name[i] == '.')
3130 return name;
3131
3132 obstack_grow (&obstack, name, len);
5d9669fd
RK
3133 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3134 strlen (TARGET_EXECUTABLE_SUFFIX));
7973fd2a 3135 name = XOBFINISH (&obstack, const char *);
853e0b2d
RK
3136#endif
3137
3138 return name;
3139}
3140#endif
b8468bc7
NC
3141\f
3142/* Display the command line switches accepted by gcc. */
3143static void
1d088dee 3144display_help (void)
b8468bc7 3145{
6afbc885 3146 printf (_("Usage: %s [options] file...\n"), progname);
5e4adfba 3147 fputs (_("Options:\n"), stdout);
b8468bc7 3148
5e4adfba
PT
3149 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3150 fputs (_(" --help Display this information\n"), stdout);
91606ce2 3151 fputs (_(" --target-help Display target specific command line options\n"), stdout);
cdbfc61d 3152 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
c662432e 3153 fputs (_(" Display specific types of command line options\n"), stdout);
b8468bc7 3154 if (! verbose_flag)
5e4adfba 3155 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
1156c176 3156 fputs (_(" --version Display compiler version information\n"), stdout);
5e4adfba
PT
3157 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3158 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3159 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3160 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3161 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3162 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3163 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
e0cdc09f
MK
3164 fputs (_("\
3165 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3166 a component in the library path\n"), stdout);
5e4adfba
PT
3167 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3168 fputs (_("\
3169 -print-multi-lib Display the mapping between command line options and\n\
3170 multiple library search directories\n"), stdout);
5bbcd587 3171 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3def1397 3172 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
14da6073 3173 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
5e4adfba
PT
3174 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3175 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3176 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
4977bab6
ZW
3177 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3178 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
5e4adfba
PT
3179 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3180 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
14fdc613 3181 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
ba0c638e
SB
3182 fputs (_("\
3183 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3184 prefixes to other gcc components\n"), stdout);
5e4adfba
PT
3185 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3186 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
b0287a90 3187 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
5e4adfba 3188 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
160633c6
MM
3189 fputs (_("\
3190 --sysroot=<directory> Use <directory> as the root directory for headers\n\
b3cccd58 3191 and libraries\n"), stdout);
5e4adfba 3192 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
5e4adfba 3193 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
99f78cdd 3194 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
5e4adfba
PT
3195 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3196 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3197 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3198 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
5460e1fc
JJ
3199 fputs (_(" -pie Create a position independent executable\n"), stdout);
3200 fputs (_(" -shared Create a shared library\n"), stdout);
5e4adfba
PT
3201 fputs (_("\
3202 -x <language> Specify the language of the following input files\n\
8e854b76 3203 Permissible languages include: c c++ assembler none\n\
1737c953 3204 'none' means revert to the default behavior of\n\
5e4adfba
PT
3205 guessing the language based on the file's extension\n\
3206"), stdout);
3207
0c386769 3208 printf (_("\
d991c721
BK
3209\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3210 passed on to the various sub-processes invoked by %s. In order to pass\n\
3211 other options on to these processes the -W<letter> options must be used.\n\
6afbc885 3212"), progname);
b8468bc7
NC
3213
3214 /* The rest of the options are displayed by invocations of the various
3215 sub-processes. */
3216}
3217
9218435e 3218static void
1d088dee 3219add_preprocessor_option (const char *option, int len)
9218435e 3220{
9771b263 3221 preprocessor_options.safe_push (save_string (option, len));
40f943dd 3222}
9218435e
KH
3223
3224static void
1d088dee 3225add_assembler_option (const char *option, int len)
878f32c3 3226{
9771b263 3227 assembler_options.safe_push (save_string (option, len));
b8468bc7 3228}
9218435e
KH
3229
3230static void
1d088dee 3231add_linker_option (const char *option, int len)
878f32c3 3232{
9771b263 3233 linker_options.safe_push (save_string (option, len));
40f943dd 3234}
853e0b2d 3235\f
922e1882
JM
3236/* Allocate space for an input file in infiles. */
3237
3238static void
3239alloc_infile (void)
3240{
3241 if (n_infiles_alloc == 0)
3242 {
3243 n_infiles_alloc = 16;
3244 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3245 }
3246 else if (n_infiles_alloc == n_infiles)
3247 {
3248 n_infiles_alloc *= 2;
3249 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3250 }
3251}
3252
3253/* Store an input file with the given NAME and LANGUAGE in
3254 infiles. */
3255
3256static void
3257add_infile (const char *name, const char *language)
3258{
3259 alloc_infile ();
3260 infiles[n_infiles].name = name;
3261 infiles[n_infiles++].language = language;
3262}
3263
3264/* Allocate space for a switch in switches. */
3265
3266static void
3267alloc_switch (void)
3268{
3269 if (n_switches_alloc == 0)
3270 {
3271 n_switches_alloc = 16;
3272 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3273 }
3274 else if (n_switches_alloc == n_switches)
3275 {
3276 n_switches_alloc *= 2;
3277 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3278 }
3279}
3280
603349bf 3281/* Save an option OPT with N_ARGS arguments in array ARGS, marking it
d168aaee 3282 as validated if VALIDATED and KNOWN if it is an internal switch. */
603349bf
JM
3283
3284static void
3285save_switch (const char *opt, size_t n_args, const char *const *args,
d168aaee 3286 bool validated, bool known)
603349bf
JM
3287{
3288 alloc_switch ();
3289 switches[n_switches].part1 = opt + 1;
3290 if (n_args == 0)
3291 switches[n_switches].args = 0;
3292 else
3293 {
3294 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3295 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3296 switches[n_switches].args[n_args] = NULL;
3297 }
3298
3299 switches[n_switches].live_cond = 0;
3300 switches[n_switches].validated = validated;
d168aaee 3301 switches[n_switches].known = known;
603349bf
JM
3302 switches[n_switches].ordering = 0;
3303 n_switches++;
3304}
3305
3306/* Handle an option DECODED that is unknown to the option-processing
66017846 3307 machinery. */
603349bf
JM
3308
3309static bool
3310driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3311{
66017846
JM
3312 const char *opt = decoded->arg;
3313 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3314 && !(decoded->errors & CL_ERR_NEGATIVE))
3315 {
3316 /* Leave unknown -Wno-* options for the compiler proper, to be
3317 diagnosed only if there are warnings. */
3318 save_switch (decoded->canonical_option[0],
3319 decoded->canonical_option_num_elements - 1,
d168aaee
CB
3320 &decoded->canonical_option[1], false, true);
3321 return false;
3322 }
3323 if (decoded->opt_index == OPT_SPECIAL_unknown)
3324 {
3325 /* Give it a chance to define it a a spec file. */
3326 save_switch (decoded->canonical_option[0],
3327 decoded->canonical_option_num_elements - 1,
3328 &decoded->canonical_option[1], false, false);
66017846
JM
3329 return false;
3330 }
3331 else
3332 return true;
603349bf
JM
3333}
3334
3335/* Handle an option DECODED that is not marked as CL_DRIVER.
3336 LANG_MASK will always be CL_DRIVER. */
3337
3338static void
3339driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3340 unsigned int lang_mask ATTRIBUTE_UNUSED)
3341{
3342 /* At this point, non-driver options are accepted (and expected to
3343 be passed down by specs) unless marked to be rejected by the
3344 driver. Options to be rejected by the driver but accepted by the
3345 compilers proper are treated just like completely unknown
3346 options. */
3347 const struct cl_option *option = &cl_options[decoded->opt_index];
3348
300d83d9 3349 if (option->cl_reject_driver)
603349bf
JM
3350 error ("unrecognized command line option %qs",
3351 decoded->orig_option_with_args_text);
3352 else
66017846
JM
3353 save_switch (decoded->canonical_option[0],
3354 decoded->canonical_option_num_elements - 1,
d168aaee 3355 &decoded->canonical_option[1], false, true);
603349bf
JM
3356}
3357
603349bf
JM
3358static const char *spec_lang = 0;
3359static int last_language_n_infiles;
3360
3361/* Handle a driver option; arguments and return value as for
3362 handle_option. */
3363
3364static bool
46625112 3365driver_handle_option (struct gcc_options *opts,
d4d24ba4 3366 struct gcc_options *opts_set,
46625112 3367 const struct cl_decoded_option *decoded,
603349bf 3368 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
a4d8c676 3369 location_t loc,
d5478783
JM
3370 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
3371 diagnostic_context *dc)
603349bf
JM
3372{
3373 size_t opt_index = decoded->opt_index;
3374 const char *arg = decoded->arg;
3375 const char *compare_debug_replacement_opt;
3376 int value = decoded->value;
3377 bool validated = false;
3378 bool do_save = true;
3379
46625112 3380 gcc_assert (opts == &global_options);
d4d24ba4 3381 gcc_assert (opts_set == &global_options_set);
603349bf 3382 gcc_assert (kind == DK_UNSPECIFIED);
a4d8c676 3383 gcc_assert (loc == UNKNOWN_LOCATION);
d5478783 3384 gcc_assert (dc == global_dc);
603349bf
JM
3385
3386 switch (opt_index)
3387 {
3388 case OPT_dumpspecs:
3389 {
3390 struct spec_list *sl;
3391 init_spec ();
3392 for (sl = specs; sl; sl = sl->next)
3393 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3394 if (link_command_spec)
3395 printf ("*link_command:\n%s\n\n", link_command_spec);
3396 exit (0);
3397 }
3398
3399 case OPT_dumpversion:
3400 printf ("%s\n", spec_version);
3401 exit (0);
3402
3403 case OPT_dumpmachine:
3404 printf ("%s\n", spec_machine);
3405 exit (0);
3406
e200444e 3407 case OPT__version:
603349bf
JM
3408 print_version = 1;
3409
3410 /* CPP driver cannot obtain switch from cc1_options. */
3411 if (is_cpp_driver)
3412 add_preprocessor_option ("--version", strlen ("--version"));
3413 add_assembler_option ("--version", strlen ("--version"));
3414 add_linker_option ("--version", strlen ("--version"));
3415 break;
3416
e200444e 3417 case OPT__help:
603349bf
JM
3418 print_help_list = 1;
3419
3420 /* CPP driver cannot obtain switch from cc1_options. */
3421 if (is_cpp_driver)
3422 add_preprocessor_option ("--help", 6);
3423 add_assembler_option ("--help", 6);
3424 add_linker_option ("--help", 6);
3425 break;
3426
e200444e 3427 case OPT__help_:
603349bf
JM
3428 print_subprocess_help = 2;
3429 break;
3430
e200444e 3431 case OPT__target_help:
603349bf
JM
3432 print_subprocess_help = 1;
3433
3434 /* CPP driver cannot obtain switch from cc1_options. */
3435 if (is_cpp_driver)
3436 add_preprocessor_option ("--target-help", 13);
3437 add_assembler_option ("--target-help", 13);
3438 add_linker_option ("--target-help", 13);
3439 break;
3440
28b4fc51 3441 case OPT__no_sysroot_suffix:
603349bf
JM
3442 case OPT_pass_exit_codes:
3443 case OPT_print_search_dirs:
3444 case OPT_print_file_name_:
3445 case OPT_print_prog_name_:
3446 case OPT_print_multi_lib:
3447 case OPT_print_multi_directory:
3448 case OPT_print_sysroot:
3449 case OPT_print_multi_os_directory:
e0cdc09f 3450 case OPT_print_multiarch:
603349bf
JM
3451 case OPT_print_sysroot_headers_suffix:
3452 case OPT_time:
3453 case OPT_wrapper:
3454 /* These options set the variables specified in common.opt
3455 automatically, and do not need to be saved for spec
3456 processing. */
3457 do_save = false;
3458 break;
3459
3460 case OPT_print_libgcc_file_name:
3461 print_file_name = "libgcc.a";
3462 do_save = false;
3463 break;
3464
b78e932d
L
3465 case OPT_fuse_ld_bfd:
3466 use_ld = ".bfd";
3467 break;
3468
3469 case OPT_fuse_ld_gold:
3470 use_ld = ".gold";
3471 break;
3472
603349bf
JM
3473 case OPT_fcompare_debug_second:
3474 compare_debug_second = 1;
3475 break;
3476
3477 case OPT_fcompare_debug:
3478 switch (value)
3479 {
3480 case 0:
3481 compare_debug_replacement_opt = "-fcompare-debug=";
3482 arg = "";
3483 goto compare_debug_with_arg;
3484
3485 case 1:
3486 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
3487 arg = "-gtoggle";
3488 goto compare_debug_with_arg;
3489
3490 default:
3491 gcc_unreachable ();
3492 }
3493 break;
3494
3495 case OPT_fcompare_debug_:
3496 compare_debug_replacement_opt = decoded->canonical_option[0];
3497 compare_debug_with_arg:
3498 gcc_assert (decoded->canonical_option_num_elements == 1);
3499 gcc_assert (arg != NULL);
28c14a04 3500 if (*arg)
603349bf
JM
3501 compare_debug = 1;
3502 else
3503 compare_debug = -1;
3504 if (compare_debug < 0)
3505 compare_debug_opt = NULL;
3506 else
3507 compare_debug_opt = arg;
d168aaee 3508 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
603349bf
JM
3509 return true;
3510
3511 case OPT_Wa_:
3512 {
3513 int prev, j;
3514 /* Pass the rest of this option to the assembler. */
3515
3516 /* Split the argument at commas. */
3517 prev = 0;
3518 for (j = 0; arg[j]; j++)
3519 if (arg[j] == ',')
3520 {
3521 add_assembler_option (arg + prev, j - prev);
3522 prev = j + 1;
3523 }
3524
3525 /* Record the part after the last comma. */
3526 add_assembler_option (arg + prev, j - prev);
3527 }
3528 do_save = false;
3529 break;
3530
3531 case OPT_Wp_:
3532 {
3533 int prev, j;
3534 /* Pass the rest of this option to the preprocessor. */
3535
3536 /* Split the argument at commas. */
3537 prev = 0;
3538 for (j = 0; arg[j]; j++)
3539 if (arg[j] == ',')
3540 {
3541 add_preprocessor_option (arg + prev, j - prev);
3542 prev = j + 1;
3543 }
3544
3545 /* Record the part after the last comma. */
3546 add_preprocessor_option (arg + prev, j - prev);
3547 }
3548 do_save = false;
3549 break;
3550
3551 case OPT_Wl_:
3552 {
3553 int prev, j;
3554 /* Split the argument at commas. */
3555 prev = 0;
3556 for (j = 0; arg[j]; j++)
3557 if (arg[j] == ',')
3558 {
3559 add_infile (save_string (arg + prev, j - prev), "*");
3560 prev = j + 1;
3561 }
3562 /* Record the part after the last comma. */
3563 add_infile (arg + prev, "*");
3564 }
3565 do_save = false;
3566 break;
3567
3568 case OPT_Xlinker:
3569 add_infile (arg, "*");
3570 do_save = false;
3571 break;
3572
3573 case OPT_Xpreprocessor:
3574 add_preprocessor_option (arg, strlen (arg));
3575 do_save = false;
3576 break;
3577
3578 case OPT_Xassembler:
3579 add_assembler_option (arg, strlen (arg));
3580 do_save = false;
3581 break;
3582
3583 case OPT_l:
3584 /* POSIX allows separation of -l and the lib arg; canonicalize
3585 by concatenating -l with its arg */
3586 add_infile (concat ("-l", arg, NULL), "*");
3587 do_save = false;
3588 break;
3589
5de8299c
JM
3590 case OPT_L:
3591 /* Similarly, canonicalize -L for linkers that may not accept
3592 separate arguments. */
d168aaee 3593 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
5de8299c
JM
3594 return true;
3595
a350a6c8
IS
3596 case OPT_F:
3597 /* Likewise -F. */
d168aaee 3598 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
a350a6c8
IS
3599 return true;
3600
603349bf
JM
3601 case OPT_save_temps:
3602 save_temps_flag = SAVE_TEMPS_CWD;
3603 validated = true;
3604 break;
3605
3606 case OPT_save_temps_:
3607 if (strcmp (arg, "cwd") == 0)
3608 save_temps_flag = SAVE_TEMPS_CWD;
3609 else if (strcmp (arg, "obj") == 0
3610 || strcmp (arg, "object") == 0)
3611 save_temps_flag = SAVE_TEMPS_OBJ;
3612 else
3613 fatal_error ("%qs is an unknown -save-temps option",
3614 decoded->orig_option_with_args_text);
3615 break;
3616
3617 case OPT_no_canonical_prefixes:
3618 /* Already handled as a special case, so ignored here. */
3619 do_save = false;
3620 break;
3621
3622 case OPT_pipe:
3623 validated = true;
603349bf
JM
3624 /* These options set the variables specified in common.opt
3625 automatically, but do need to be saved for spec
3626 processing. */
3627 break;
3628
603349bf
JM
3629 case OPT_specs_:
3630 {
3631 struct user_specs *user = XNEW (struct user_specs);
3632
3633 user->next = (struct user_specs *) 0;
3634 user->filename = arg;
3635 if (user_specs_tail)
3636 user_specs_tail->next = user;
3637 else
3638 user_specs_head = user;
3639 user_specs_tail = user;
3640 }
d168aaee 3641 validated = true;
603349bf
JM
3642 break;
3643
3644 case OPT__sysroot_:
3645 target_system_root = arg;
3646 target_system_root_changed = 1;
3647 do_save = false;
3648 break;
3649
3650 case OPT_time_:
3651 if (report_times_to_file)
3652 fclose (report_times_to_file);
3653 report_times_to_file = fopen (arg, "a");
3654 do_save = false;
3655 break;
3656
3657 case OPT____:
3658 /* "-###"
3659 This is similar to -v except that there is no execution
3660 of the commands and the echoed arguments are quoted. It
3661 is intended for use in shell scripts to capture the
3662 driver-generated command line. */
3663 verbose_only_flag++;
d5478783 3664 verbose_flag = 1;
603349bf
JM
3665 do_save = false;
3666 break;
3667
3668 case OPT_B:
3669 {
3670 size_t len = strlen (arg);
3671
3672 /* Catch the case where the user has forgotten to append a
3673 directory separator to the path. Note, they may be using
3674 -B to add an executable name prefix, eg "i386-elf-", in
3675 order to distinguish between multiple installations of
3676 GCC in the same directory. Hence we must check to see
3677 if appending a directory separator actually makes a
3678 valid directory name. */
3679 if (!IS_DIR_SEPARATOR (arg[len - 1])
3680 && is_directory (arg, false))
3681 {
3682 char *tmp = XNEWVEC (char, len + 2);
3683 strcpy (tmp, arg);
3684 tmp[len] = DIR_SEPARATOR;
3685 tmp[++len] = 0;
3686 arg = tmp;
3687 }
3688
3689 add_prefix (&exec_prefixes, arg, NULL,
3690 PREFIX_PRIORITY_B_OPT, 0, 0);
3691 add_prefix (&startfile_prefixes, arg, NULL,
3692 PREFIX_PRIORITY_B_OPT, 0, 0);
3693 add_prefix (&include_prefixes, arg, NULL,
3694 PREFIX_PRIORITY_B_OPT, 0, 0);
3695 }
3696 validated = true;
3697 break;
3698
603349bf
JM
3699 case OPT_x:
3700 spec_lang = arg;
3701 if (!strcmp (spec_lang, "none"))
3702 /* Suppress the warning if -xnone comes after the last input
3703 file, because alternate command interfaces like g++ might
3704 find it useful to place -xnone after each input file. */
3705 spec_lang = 0;
3706 else
3707 last_language_n_infiles = n_infiles;
3708 do_save = false;
3709 break;
3710
603349bf
JM
3711 case OPT_o:
3712 have_o = 1;
3713#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3714 arg = convert_filename (arg, ! have_c, 0);
3715#endif
3716 /* Save the output name in case -save-temps=obj was used. */
3717 save_temps_prefix = xstrdup (arg);
3718 /* On some systems, ld cannot handle "-o" without a space. So
3719 split the option from its argument. */
d168aaee 3720 save_switch ("-o", 1, &arg, validated, true);
603349bf
JM
3721 return true;
3722
3723 case OPT_static_libgcc:
3724 case OPT_shared_libgcc:
3725 case OPT_static_libgfortran:
3726 case OPT_static_libstdc__:
3727 /* These are always valid, since gcc.c itself understands the
3728 first two, gfortranspec.c understands -static-libgfortran and
3729 g++spec.c understands -static-libstdc++ */
3730 validated = true;
3731 break;
3732
f300e7b8
JH
3733 case OPT_fwpa:
3734 flag_wpa = "";
3735 break;
3736
603349bf 3737 default:
d9d16a19
JM
3738 /* Various driver options need no special processing at this
3739 point, having been handled in a prescan above or being
3740 handled by specs. */
3741 break;
603349bf
JM
3742 }
3743
3744 if (do_save)
3745 save_switch (decoded->canonical_option[0],
3746 decoded->canonical_option_num_elements - 1,
d168aaee 3747 &decoded->canonical_option[1], validated, true);
603349bf
JM
3748 return true;
3749}
3750
efe5e5a0
JM
3751/* Put the driver's standard set of option handlers in *HANDLERS. */
3752
3753static void
3754set_option_handlers (struct cl_option_handlers *handlers)
3755{
3756 handlers->unknown_option_callback = driver_unknown_option_callback;
3757 handlers->wrong_lang_callback = driver_wrong_lang_callback;
a7d0d30f 3758 handlers->num_handlers = 3;
efe5e5a0
JM
3759 handlers->handlers[0].handler = driver_handle_option;
3760 handlers->handlers[0].mask = CL_DRIVER;
a7d0d30f
JM
3761 handlers->handlers[1].handler = common_handle_option;
3762 handlers->handlers[1].mask = CL_COMMON;
3763 handlers->handlers[2].handler = target_handle_option;
3764 handlers->handlers[2].mask = CL_TARGET;
efe5e5a0
JM
3765}
3766
ed1f651b
RS
3767/* Create the vector `switches' and its contents.
3768 Store its length in `n_switches'. */
3769
3770static void
60cf253a
JM
3771process_command (unsigned int decoded_options_count,
3772 struct cl_decoded_option *decoded_options)
ed1f651b 3773{
878f32c3
KG
3774 const char *temp;
3775 char *temp1;
fc429b48 3776 char *tooldir_prefix, *tooldir_prefix2;
ba0c638e
SB
3777 char *(*get_relative_prefix) (const char *, const char *,
3778 const char *) = NULL;
603349bf 3779 struct cl_option_handlers handlers;
60cf253a 3780 unsigned int j;
ed1f651b 3781
71f3e391 3782 gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
8eebb258 3783
ed1f651b
RS
3784 n_switches = 0;
3785 n_infiles = 0;
a2a05b0a 3786 added_libraries = 0;
2484b6d2 3787
53117a2f
RK
3788 /* Figure compiler version from version string. */
3789
9218435e 3790 compiler_version = temp1 = xstrdup (version_string);
ad85216e 3791
878f32c3 3792 for (; *temp1; ++temp1)
53117a2f 3793 {
878f32c3 3794 if (*temp1 == ' ')
53117a2f 3795 {
878f32c3 3796 *temp1 = '\0';
53117a2f
RK
3797 break;
3798 }
3799 }
ed1f651b 3800
ba0c638e
SB
3801 /* Handle any -no-canonical-prefixes flag early, to assign the function
3802 that builds relative prefixes. This function creates default search
3803 paths that are needed later in normal option handling. */
3804
e200444e 3805 for (j = 1; j < decoded_options_count; j++)
ba0c638e 3806 {
e200444e 3807 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
ba0c638e
SB
3808 {
3809 get_relative_prefix = make_relative_prefix_ignore_links;
3810 break;
3811 }
3812 }
3813 if (! get_relative_prefix)
3814 get_relative_prefix = make_relative_prefix;
3815
0deb20df 3816 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
60cf253a
JM
3817 see if we can create it from the pathname specified in
3818 decoded_options[0].arg. */
0deb20df 3819
a8ee6e2d 3820 gcc_libexec_prefix = standard_libexec_prefix;
0deb20df
TT
3821#ifndef VMS
3822 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3823 if (!gcc_exec_prefix)
3824 {
60cf253a 3825 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
ba0c638e
SB
3826 standard_bindir_prefix,
3827 standard_exec_prefix);
60cf253a 3828 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
ba0c638e
SB
3829 standard_bindir_prefix,
3830 standard_libexec_prefix);
0deb20df 3831 if (gcc_exec_prefix)
47d33318 3832 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
0deb20df 3833 }
a8ee6e2d 3834 else
c7370b83
JM
3835 {
3836 /* make_relative_prefix requires a program name, but
3837 GCC_EXEC_PREFIX is typically a directory name with a trailing
3838 / (which is ignored by make_relative_prefix), so append a
3839 program name. */
3840 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
ba0c638e
SB
3841 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3842 standard_exec_prefix,
3843 standard_libexec_prefix);
f4c0a303
CD
3844
3845 /* The path is unrelocated, so fallback to the original setting. */
3846 if (!gcc_libexec_prefix)
3847 gcc_libexec_prefix = standard_libexec_prefix;
3848
c7370b83
JM
3849 free (tmp_prefix);
3850 }
a8ee6e2d 3851#else
0deb20df 3852#endif
f4c0a303
CD
3853 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3854 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
60cf253a
JM
3855 or an automatically created GCC_EXEC_PREFIX from
3856 decoded_options[0].arg. */
ed1f651b 3857
a288b143 3858 /* Do language-specific adjustment/addition of flags. */
d9d16a19 3859 lang_specific_driver (&decoded_options, &decoded_options_count,
a288b143
AH
3860 &added_libraries);
3861
8eebb258 3862 if (gcc_exec_prefix)
ed1f651b 3863 {
6ed4bb9a 3864 int len = strlen (gcc_exec_prefix);
c5c0b3d9 3865
a8ee6e2d 3866 if (len > (int) sizeof ("/lib/gcc/") - 1
509781a4 3867 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
6ed4bb9a 3868 {
a8ee6e2d 3869 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
509781a4 3870 if (IS_DIR_SEPARATOR (*temp)
ba78087b 3871 && filename_ncmp (temp + 1, "lib", 3) == 0
509781a4 3872 && IS_DIR_SEPARATOR (temp[4])
ba78087b 3873 && filename_ncmp (temp + 5, "gcc", 3) == 0)
a8ee6e2d 3874 len -= sizeof ("/lib/gcc/") - 1;
6ed4bb9a
MM
3875 }
3876
3877 set_std_prefix (gcc_exec_prefix, len);
a8ee6e2d 3878 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
1a5d37a1 3879 PREFIX_PRIORITY_LAST, 0, 0);
922a4beb 3880 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
1a5d37a1 3881 PREFIX_PRIORITY_LAST, 0, 0);
ed1f651b
RS
3882 }
3883
3884 /* COMPILER_PATH and LIBRARY_PATH have values
3885 that are lists of directory names with colons. */
3886
71f3e391 3887 temp = getenv ("COMPILER_PATH");
ed1f651b
RS
3888 if (temp)
3889 {
878f32c3 3890 const char *startp, *endp;
e1e4cdc4 3891 char *nstore = (char *) alloca (strlen (temp) + 3);
ed1f651b
RS
3892
3893 startp = endp = temp;
3894 while (1)
3895 {
f6ec7e54 3896 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b 3897 {
d25a45d4 3898 strncpy (nstore, startp, endp - startp);
ed1f651b 3899 if (endp == startp)
d4f2852f 3900 strcpy (nstore, concat (".", dir_separator_str, NULL));
509781a4 3901 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3902 {
d25a45d4
KH
3903 nstore[endp - startp] = DIR_SEPARATOR;
3904 nstore[endp - startp + 1] = 0;
ed1f651b
RS
3905 }
3906 else
d25a45d4 3907 nstore[endp - startp] = 0;
922a4beb 3908 add_prefix (&exec_prefixes, nstore, 0,
1a5d37a1 3909 PREFIX_PRIORITY_LAST, 0, 0);
76391e5a 3910 add_prefix (&include_prefixes, nstore, 0,
1a5d37a1 3911 PREFIX_PRIORITY_LAST, 0, 0);
ed1f651b
RS
3912 if (*endp == 0)
3913 break;
3914 endp = startp = endp + 1;
3915 }
3916 else
3917 endp++;
3918 }
3919 }
3920
71f3e391 3921 temp = getenv (LIBRARY_PATH_ENV);
fcc9ad83 3922 if (temp && *cross_compile == '0')
ed1f651b 3923 {
878f32c3 3924 const char *startp, *endp;
e1e4cdc4 3925 char *nstore = (char *) alloca (strlen (temp) + 3);
ed1f651b
RS
3926
3927 startp = endp = temp;
3928 while (1)
3929 {
f6ec7e54 3930 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b 3931 {
d25a45d4 3932 strncpy (nstore, startp, endp - startp);
ed1f651b 3933 if (endp == startp)
d4f2852f 3934 strcpy (nstore, concat (".", dir_separator_str, NULL));
509781a4 3935 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3936 {
d25a45d4
KH
3937 nstore[endp - startp] = DIR_SEPARATOR;
3938 nstore[endp - startp + 1] = 0;
ed1f651b
RS
3939 }
3940 else
d25a45d4 3941 nstore[endp - startp] = 0;
6496a589 3942 add_prefix (&startfile_prefixes, nstore, NULL,
1a5d37a1 3943 PREFIX_PRIORITY_LAST, 0, 1);
ed1f651b
RS
3944 if (*endp == 0)
3945 break;
3946 endp = startp = endp + 1;
3947 }
3948 else
3949 endp++;
3950 }
3951 }
3952
3953 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
71f3e391 3954 temp = getenv ("LPATH");
fcc9ad83 3955 if (temp && *cross_compile == '0')
ed1f651b 3956 {
878f32c3 3957 const char *startp, *endp;
e1e4cdc4 3958 char *nstore = (char *) alloca (strlen (temp) + 3);
ed1f651b
RS
3959
3960 startp = endp = temp;
3961 while (1)
3962 {
f6ec7e54 3963 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b 3964 {
d25a45d4 3965 strncpy (nstore, startp, endp - startp);
ed1f651b 3966 if (endp == startp)
d4f2852f 3967 strcpy (nstore, concat (".", dir_separator_str, NULL));
509781a4 3968 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3969 {
d25a45d4
KH
3970 nstore[endp - startp] = DIR_SEPARATOR;
3971 nstore[endp - startp + 1] = 0;
ed1f651b
RS
3972 }
3973 else
d25a45d4 3974 nstore[endp - startp] = 0;
6496a589 3975 add_prefix (&startfile_prefixes, nstore, NULL,
1a5d37a1 3976 PREFIX_PRIORITY_LAST, 0, 1);
ed1f651b
RS
3977 if (*endp == 0)
3978 break;
3979 endp = startp = endp + 1;
3980 }
3981 else
3982 endp++;
3983 }
3984 }
3985
922e1882
JM
3986 /* Process the options and store input files and switches in their
3987 vectors. */
3988
3989 last_language_n_infiles = -1;
ed1f651b 3990
efe5e5a0 3991 set_option_handlers (&handlers);
fe7df9c4 3992
603349bf
JM
3993 for (j = 1; j < decoded_options_count; j++)
3994 {
3995 switch (decoded_options[j].opt_index)
99f78cdd 3996 {
603349bf
JM
3997 case OPT_S:
3998 case OPT_c:
3999 case OPT_E:
4000 have_c = 1;
4001 break;
99f78cdd 4002 }
603349bf
JM
4003 if (have_c)
4004 break;
4005 }
ed1f651b 4006
603349bf
JM
4007 for (j = 1; j < decoded_options_count; j++)
4008 {
4009 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
3a265431 4010 {
603349bf
JM
4011 const char *arg = decoded_options[j].arg;
4012 const char *p = strrchr (arg, '@');
922e1882
JM
4013 char *fname;
4014 long offset;
4015 int consumed;
4016#ifdef HAVE_TARGET_OBJECT_SUFFIX
603349bf 4017 arg = convert_filename (arg, 0, access (arg, F_OK));
922e1882
JM
4018#endif
4019 /* For LTO static archive support we handle input file
4020 specifications that are composed of a filename and
4021 an offset like FNAME@OFFSET. */
4022 if (p
603349bf 4023 && p != arg
922e1882
JM
4024 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4025 && strlen (p) == (unsigned int)consumed)
4026 {
603349bf
JM
4027 fname = (char *)xmalloc (p - arg + 1);
4028 memcpy (fname, arg, p - arg);
4029 fname[p - arg] = '\0';
922e1882
JM
4030 /* Only accept non-stdin and existing FNAME parts, otherwise
4031 try with the full name. */
4032 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4033 {
4034 free (fname);
603349bf 4035 fname = xstrdup (arg);
922e1882
JM
4036 }
4037 }
4038 else
603349bf 4039 fname = xstrdup (arg);
d168aaee 4040
922e1882
JM
4041 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4042 perror_with_name (fname);
4043 else
603349bf 4044 add_infile (arg, spec_lang);
922e1882
JM
4045
4046 free (fname);
603349bf 4047 continue;
3a265431 4048 }
603349bf 4049
d4d24ba4 4050 read_cmdline_option (&global_options, &global_options_set,
a4d8c676
JM
4051 decoded_options + j, UNKNOWN_LOCATION,
4052 CL_DRIVER, &handlers, global_dc);
ed1f651b
RS
4053 }
4054
14fdc613
MM
4055 /* If -save-temps=obj and -o name, create the prefix to use for %b.
4056 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
4057 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4058 {
4059 save_temps_length = strlen (save_temps_prefix);
4060 temp = strrchr (lbasename (save_temps_prefix), '.');
4061 if (temp)
4062 {
4063 save_temps_length -= strlen (temp);
4064 save_temps_prefix[save_temps_length] = '\0';
4065 }
4066
4067 }
4068 else if (save_temps_prefix != NULL)
4069 {
4070 free (save_temps_prefix);
4071 save_temps_prefix = NULL;
4072 }
4073
054e88a8 4074 if (save_temps_flag && use_pipes)
4977bab6
ZW
4075 {
4076 /* -save-temps overrides -pipe, so that temp files are produced */
4077 if (save_temps_flag)
2dec80c7 4078 warning (0, "-pipe ignored because -save-temps specified");
4977bab6
ZW
4079 use_pipes = 0;
4080 }
1d088dee 4081
2153915d
AO
4082 if (!compare_debug)
4083 {
4084 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
4085
4086 if (gcd && gcd[0] == '-')
4087 {
4088 compare_debug = 2;
4089 compare_debug_opt = gcd;
2153915d
AO
4090 }
4091 else if (gcd && *gcd && strcmp (gcd, "0"))
4092 {
4093 compare_debug = 3;
4094 compare_debug_opt = "-gtoggle";
2153915d
AO
4095 }
4096 }
4097 else if (compare_debug < 0)
4098 {
4099 compare_debug = 0;
4100 gcc_assert (!compare_debug_opt);
4101 }
4102
f4c0a303
CD
4103 /* Set up the search paths. We add directories that we expect to
4104 contain GNU Toolchain components before directories specified by
4105 the machine description so that we will find GNU components (like
b8698a0f 4106 the GNU assembler) before those of the host system. */
ed1f651b 4107
f4c0a303
CD
4108 /* If we don't know where the toolchain has been installed, use the
4109 configured-in locations. */
4110 if (!gcc_exec_prefix)
4111 {
48ff801b 4112#ifndef OS2
f4c0a303
CD
4113 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4114 PREFIX_PRIORITY_LAST, 1, 0);
4115 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4116 PREFIX_PRIORITY_LAST, 2, 0);
4117 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4118 PREFIX_PRIORITY_LAST, 2, 0);
48ff801b 4119#endif
f4c0a303
CD
4120 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4121 PREFIX_PRIORITY_LAST, 1, 0);
4122 }
ed1f651b 4123
f4c0a303 4124 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
fc429b48
TB
4125 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
4126 dir_separator_str, NULL);
c648ab8a 4127
f4c0a303
CD
4128 /* Look for tools relative to the location from which the driver is
4129 running, or, if that is not available, the configured prefix. */
4130 tooldir_prefix
4131 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4132 spec_machine, dir_separator_str,
fc429b48
TB
4133 spec_version, dir_separator_str, tooldir_prefix2, NULL);
4134 free (tooldir_prefix2);
c648ab8a 4135
9218435e 4136 add_prefix (&exec_prefixes,
d4f2852f 4137 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
1a5d37a1 4138 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
48ff801b 4139 add_prefix (&startfile_prefixes,
d4f2852f 4140 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
1a5d37a1 4141 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
fc429b48 4142 free (tooldir_prefix);
f18fd956 4143
047d636f
DJ
4144#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4145 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4146 then consider it to relocate with the rest of the GCC installation
4147 if GCC_EXEC_PREFIX is set.
4148 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
922e1882 4149 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4977bab6 4150 {
60cf253a 4151 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
ba0c638e
SB
4152 standard_bindir_prefix,
4153 target_system_root);
4977bab6 4154 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
047d636f
DJ
4155 {
4156 target_system_root = tmp_prefix;
4157 target_system_root_changed = 1;
4158 }
4977bab6 4159 }
047d636f 4160#endif
4977bab6 4161
004fd4d5
RS
4162 /* More prefixes are enabled in main, after we read the specs file
4163 and determine whether this is cross-compilation or not. */
ed1f651b 4164
fa0d5369 4165 if (n_infiles == last_language_n_infiles && spec_lang != 0)
bdc6b402 4166 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
ed1f651b 4167
3ad2d621
DG
4168 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4169 environment variable. */
2153915d
AO
4170 if (compare_debug == 2 || compare_debug == 3)
4171 {
3ad2d621
DG
4172 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4173 save_switch (opt, 0, NULL, false, true);
2153915d
AO
4174 compare_debug = 1;
4175 }
4176
69927b59 4177 /* Ensure we only invoke each subprocess once. */
41fd0f9b 4178 if (print_subprocess_help || print_help_list || print_version)
69927b59 4179 {
922e1882 4180 n_infiles = 0;
69927b59 4181
c662432e
NC
4182 /* Create a dummy input file, so that we can pass
4183 the help option on to the various sub-processes. */
922e1882 4184 add_infile ("help-dummy", "c");
69927b59
NB
4185 }
4186
922e1882 4187 alloc_switch ();
ed1f651b 4188 switches[n_switches].part1 = 0;
922e1882 4189 alloc_infile ();
ed1f651b
RS
4190 infiles[n_infiles].name = 0;
4191}
b856c15d 4192
4977bab6 4193/* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
b856c15d
RO
4194 and place that in the environment. */
4195
4196static void
1d088dee 4197set_collect_gcc_options (void)
b856c15d
RO
4198{
4199 int i;
4200 int first_time;
4201
4202 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4203 the compiler. */
4204 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4205 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4206
4207 first_time = TRUE;
4208 for (i = 0; (int) i < n_switches; i++)
4209 {
4210 const char *const *args;
4211 const char *p, *q;
4212 if (!first_time)
4213 obstack_grow (&collect_obstack, " ", 1);
4214
4215 first_time = FALSE;
4216
4217 /* Ignore elided switches. */
96f5b137
L
4218 if ((switches[i].live_cond
4219 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4220 == SWITCH_IGNORE)
b856c15d
RO
4221 continue;
4222
4223 obstack_grow (&collect_obstack, "'-", 2);
4224 q = switches[i].part1;
4225 while ((p = strchr (q, '\'')))
4226 {
4227 obstack_grow (&collect_obstack, q, p - q);
4228 obstack_grow (&collect_obstack, "'\\''", 4);
4229 q = ++p;
4230 }
4231 obstack_grow (&collect_obstack, q, strlen (q));
4232 obstack_grow (&collect_obstack, "'", 1);
4233
4234 for (args = switches[i].args; args && *args; args++)
4235 {
4236 obstack_grow (&collect_obstack, " '", 2);
4237 q = *args;
4238 while ((p = strchr (q, '\'')))
4239 {
4240 obstack_grow (&collect_obstack, q, p - q);
4241 obstack_grow (&collect_obstack, "'\\''", 4);
4242 q = ++p;
4243 }
4244 obstack_grow (&collect_obstack, q, strlen (q));
4245 obstack_grow (&collect_obstack, "'", 1);
4246 }
4247 }
4248 obstack_grow (&collect_obstack, "\0", 1);
47d33318 4249 xputenv (XOBFINISH (&collect_obstack, char *));
b856c15d 4250}
ed1f651b
RS
4251\f
4252/* Process a spec string, accumulating and running commands. */
4253
4254/* These variables describe the input file name.
4255 input_file_number is the index on outfiles of this file,
4256 so that the output file name can be stored for later use by %o.
4257 input_basename is the start of the part of the input file
4258 sans all directory names, and basename_length is the number
4259 of characters starting there excluding the suffix .c or whatever. */
4260
6afbc885 4261static const char *gcc_input_filename;
ed1f651b 4262static int input_file_number;
f271358e 4263size_t input_filename_length;
ed1f651b 4264static int basename_length;
ea414c97 4265static int suffixed_basename_length;
878f32c3
KG
4266static const char *input_basename;
4267static const char *input_suffix;
a9024779 4268#ifndef HOST_LACKS_INODE_NUMBERS
99f78cdd 4269static struct stat input_stat;
a9024779 4270#endif
99f78cdd 4271static int input_stat_set;
ed1f651b 4272
a9374841
MM
4273/* The compiler used to process the current input file. */
4274static struct compiler *input_file_compiler;
4275
ed1f651b
RS
4276/* These are variables used within do_spec and do_spec_1. */
4277
4278/* Nonzero if an arg has been started and not yet terminated
4279 (with space, tab or newline). */
4280static int arg_going;
4281
4282/* Nonzero means %d or %g has been seen; the next arg to be terminated
4283 is a temporary file name. */
4284static int delete_this_arg;
4285
4286/* Nonzero means %w has been seen; the next arg to be terminated
4287 is the output file name of this compilation. */
4288static int this_is_output_file;
4289
4290/* Nonzero means %s has been seen; the next arg to be terminated
4291 is the name of a library file and we should try the standard
4292 search dirs for it. */
4293static int this_is_library_file;
4294
3beb864c
NC
4295/* Nonzero means %T has been seen; the next arg to be terminated
4296 is the name of a linker script and we should try all of the
4297 standard search dirs for it. If it is found insert a --script
4298 command line switch and then substitute the full path in place,
4299 otherwise generate an error message. */
4300static int this_is_linker_script;
4301
a99bf70c
JW
4302/* Nonzero means that the input of this command is coming from a pipe. */
4303static int input_from_pipe;
4304
11972f66 4305/* Nonnull means substitute this for any suffix when outputting a switches
dc297297 4306 arguments. */
11972f66
NS
4307static const char *suffix_subst;
4308
13e7cedb
DH
4309/* If there is an argument being accumulated, terminate it and store it. */
4310
4311static void
4312end_going_arg (void)
4313{
4314 if (arg_going)
4315 {
4316 const char *string;
4317
4318 obstack_1grow (&obstack, 0);
4319 string = XOBFINISH (&obstack, const char *);
4320 if (this_is_library_file)
4321 string = find_file (string);
3beb864c
NC
4322 if (this_is_linker_script)
4323 {
4324 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4325
4326 if (full_script_path == NULL)
4327 {
bdc6b402 4328 error ("unable to locate default linker script %qs in the library search paths", string);
3beb864c
NC
4329 /* Script was not found on search path. */
4330 return;
4331 }
4332 store_arg ("--script", false, false);
4333 string = full_script_path;
4334 }
13e7cedb
DH
4335 store_arg (string, delete_this_arg, this_is_output_file);
4336 if (this_is_output_file)
4337 outfiles[input_file_number] = string;
4338 arg_going = 0;
4339 }
4340}
4341
fe7df9c4
SP
4342
4343/* Parse the WRAPPER string which is a comma separated list of the command line
4344 and insert them into the beginning of argbuf. */
4345
4346static void
4347insert_wrapper (const char *wrapper)
4348{
4349 int n = 0;
4350 int i;
4351 char *buf = xstrdup (wrapper);
4352 char *p = buf;
9771b263 4353 unsigned int old_length = argbuf.length ();
fe7df9c4
SP
4354
4355 do
4356 {
4357 n++;
4358 while (*p == ',')
4359 p++;
4360 }
4361 while ((p = strchr (p, ',')) != NULL);
4362
9771b263
DN
4363 argbuf.safe_grow (old_length + n);
4364 memmove (argbuf.address () + n,
4365 argbuf.address (),
5b634ee0 4366 old_length * sizeof (const_char_p));
fe7df9c4
SP
4367
4368 i = 0;
4369 p = buf;
4370 do
4371 {
4372 while (*p == ',')
4373 {
4374 *p = 0;
4375 p++;
4376 }
9771b263 4377 argbuf[i] = p;
5b634ee0 4378 i++;
fe7df9c4
SP
4379 }
4380 while ((p = strchr (p, ',')) != NULL);
4381 gcc_assert (i == n);
fe7df9c4
SP
4382}
4383
ed1f651b
RS
4384/* Process the spec SPEC and run the commands specified therein.
4385 Returns 0 if the spec is successfully processed; -1 if failed. */
4386
f271358e 4387int
1d088dee 4388do_spec (const char *spec)
ed1f651b
RS
4389{
4390 int value;
4391
343f59d9 4392 value = do_spec_2 (spec);
ed1f651b
RS
4393
4394 /* Force out any unfinished command.
4395 If -pipe, this forces out the last command if it ended in `|'. */
4396 if (value == 0)
4397 {
9771b263
DN
4398 if (argbuf.length () > 0
4399 && !strcmp (argbuf.last (), "|"))
4400 argbuf.pop ();
ed1f651b 4401
b856c15d
RO
4402 set_collect_gcc_options ();
4403
9771b263 4404 if (argbuf.length () > 0)
ed1f651b
RS
4405 value = execute ();
4406 }
4407
4408 return value;
4409}
4410
343f59d9 4411static int
1d088dee 4412do_spec_2 (const char *spec)
343f59d9 4413{
6544fbcb
RS
4414 int result;
4415
343f59d9
AM
4416 clear_args ();
4417 arg_going = 0;
4418 delete_this_arg = 0;
4419 this_is_output_file = 0;
4420 this_is_library_file = 0;
3beb864c 4421 this_is_linker_script = 0;
343f59d9
AM
4422 input_from_pipe = 0;
4423 suffix_subst = NULL;
4424
6544fbcb
RS
4425 result = do_spec_1 (spec, 0, NULL);
4426
13e7cedb 4427 end_going_arg ();
6544fbcb
RS
4428
4429 return result;
343f59d9
AM
4430}
4431
db36994b 4432
7816bea0
DJ
4433/* Process the given spec string and add any new options to the end
4434 of the switches/n_switches array. */
4435
4436static void
1d088dee 4437do_option_spec (const char *name, const char *spec)
7816bea0
DJ
4438{
4439 unsigned int i, value_count, value_len;
4440 const char *p, *q, *value;
4441 char *tmp_spec, *tmp_spec_p;
4442
4443 if (configure_default_options[0].name == NULL)
4444 return;
4445
4446 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4447 if (strcmp (configure_default_options[i].name, name) == 0)
4448 break;
4449 if (i == ARRAY_SIZE (configure_default_options))
4450 return;
4451
4452 value = configure_default_options[i].value;
4453 value_len = strlen (value);
4454
4455 /* Compute the size of the final spec. */
4456 value_count = 0;
4457 p = spec;
4458 while ((p = strstr (p, "%(VALUE)")) != NULL)
4459 {
4460 p ++;
4461 value_count ++;
4462 }
4463
4464 /* Replace each %(VALUE) by the specified value. */
e1e4cdc4 4465 tmp_spec = (char *) alloca (strlen (spec) + 1
7816bea0
DJ
4466 + value_count * (value_len - strlen ("%(VALUE)")));
4467 tmp_spec_p = tmp_spec;
4468 q = spec;
4469 while ((p = strstr (q, "%(VALUE)")) != NULL)
4470 {
4471 memcpy (tmp_spec_p, q, p - q);
4472 tmp_spec_p = tmp_spec_p + (p - q);
4473 memcpy (tmp_spec_p, value, value_len);
4474 tmp_spec_p += value_len;
4475 q = p + strlen ("%(VALUE)");
4476 }
4477 strcpy (tmp_spec_p, q);
4478
4479 do_self_spec (tmp_spec);
4480}
4481
db36994b
RS
4482/* Process the given spec string and add any new options to the end
4483 of the switches/n_switches array. */
4484
4485static void
1d088dee 4486do_self_spec (const char *spec)
db36994b 4487{
94b90527
JJ
4488 int i;
4489
db36994b
RS
4490 do_spec_2 (spec);
4491 do_spec_1 (" ", 0, NULL);
4492
94b90527
JJ
4493 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4494 do_self_specs adds the replacements to switches array, so it shouldn't
4495 be processed afterwards. */
4496 for (i = 0; i < n_switches; i++)
4497 if ((switches[i].live_cond & SWITCH_IGNORE))
4498 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4499
9771b263 4500 if (argbuf.length () > 0)
db36994b 4501 {
efe5e5a0
JM
4502 const char **argbuf_copy;
4503 struct cl_decoded_option *decoded_options;
4504 struct cl_option_handlers handlers;
4505 unsigned int decoded_options_count;
4506 unsigned int j;
db36994b 4507
efe5e5a0
JM
4508 /* Create a copy of argbuf with a dummy argv[0] entry for
4509 decode_cmdline_options_to_array. */
5b634ee0 4510 argbuf_copy = XNEWVEC (const char *,
9771b263 4511 argbuf.length () + 1);
efe5e5a0 4512 argbuf_copy[0] = "";
9771b263
DN
4513 memcpy (argbuf_copy + 1, argbuf.address (),
4514 argbuf.length () * sizeof (const char *));
db36994b 4515
9771b263 4516 decode_cmdline_options_to_array (argbuf.length () + 1,
5b634ee0 4517 argbuf_copy,
efe5e5a0
JM
4518 CL_DRIVER, &decoded_options,
4519 &decoded_options_count);
fc429b48 4520 free (argbuf_copy);
2153915d 4521
efe5e5a0 4522 set_option_handlers (&handlers);
2153915d 4523
efe5e5a0
JM
4524 for (j = 1; j < decoded_options_count; j++)
4525 {
4526 switch (decoded_options[j].opt_index)
2153915d 4527 {
efe5e5a0
JM
4528 case OPT_SPECIAL_input_file:
4529 /* Specs should only generate options, not input
4530 files. */
4531 if (strcmp (decoded_options[j].arg, "-") != 0)
4532 fatal_error ("switch %qs does not start with %<-%>",
4533 decoded_options[j].arg);
4534 else
4535 fatal_error ("spec-generated switch is just %<-%>");
4536 break;
2153915d 4537
efe5e5a0
JM
4538 case OPT_fcompare_debug_second:
4539 case OPT_fcompare_debug:
4540 case OPT_fcompare_debug_:
4541 case OPT_o:
4542 /* Avoid duplicate processing of some options from
4543 compare-debug specs; just save them here. */
4544 save_switch (decoded_options[j].canonical_option[0],
4545 (decoded_options[j].canonical_option_num_elements
4546 - 1),
d168aaee 4547 &decoded_options[j].canonical_option[1], false, true);
efe5e5a0
JM
4548 break;
4549
4550 default:
4551 read_cmdline_option (&global_options, &global_options_set,
a4d8c676
JM
4552 decoded_options + j, UNKNOWN_LOCATION,
4553 CL_DRIVER, &handlers, global_dc);
efe5e5a0 4554 break;
2153915d 4555 }
db36994b 4556 }
2153915d 4557
efe5e5a0 4558 alloc_switch ();
2153915d 4559 switches[n_switches].part1 = 0;
db36994b
RS
4560 }
4561}
4562
00dcee0c
AM
4563/* Callback for processing %D and %I specs. */
4564
4565struct spec_path_info {
4566 const char *option;
4567 const char *append;
4568 size_t append_len;
4569 bool omit_relative;
4570 bool separate_options;
4571};
4572
4573static void *
4574spec_path (char *path, void *data)
76391e5a 4575{
e1e4cdc4 4576 struct spec_path_info *info = (struct spec_path_info *) data;
00dcee0c
AM
4577 size_t len = 0;
4578 char save = 0;
76391e5a 4579
00dcee0c
AM
4580 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4581 return NULL;
4582
4583 if (info->append_len != 0)
76391e5a 4584 {
00dcee0c
AM
4585 len = strlen (path);
4586 memcpy (path + len, info->append, info->append_len + 1);
76391e5a
PB
4587 }
4588
00dcee0c
AM
4589 if (!is_directory (path, true))
4590 return NULL;
76391e5a 4591
00dcee0c
AM
4592 do_spec_1 (info->option, 1, NULL);
4593 if (info->separate_options)
4594 do_spec_1 (" ", 0, NULL);
4595
4596 if (info->append_len == 0)
76391e5a 4597 {
00dcee0c
AM
4598 len = strlen (path);
4599 save = path[len - 1];
4600 if (IS_DIR_SEPARATOR (path[len - 1]))
4601 path[len - 1] = '\0';
76391e5a 4602 }
00dcee0c
AM
4603
4604 do_spec_1 (path, 1, NULL);
4605 do_spec_1 (" ", 0, NULL);
4606
4607 /* Must not damage the original path. */
4608 if (info->append_len == 0)
4609 path[len - 1] = save;
4610
4611 return NULL;
76391e5a
PB
4612}
4613
5a691e98
RAE
4614/* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4615 argument list. */
4616
4617static void
4618create_at_file (char **argv)
4619{
4620 char *temp_file = make_temp_file ("");
4621 char *at_argument = concat ("@", temp_file, NULL);
4622 FILE *f = fopen (temp_file, "w");
4623 int status;
4624
4625 if (f == NULL)
2dec80c7
JM
4626 fatal_error ("could not open temporary response file %s",
4627 temp_file);
5a691e98
RAE
4628
4629 status = writeargv (argv, f);
4630
4631 if (status)
2dec80c7
JM
4632 fatal_error ("could not write to temporary response file %s",
4633 temp_file);
5a691e98
RAE
4634
4635 status = fclose (f);
4636
4637 if (EOF == status)
2dec80c7
JM
4638 fatal_error ("could not close temporary response file %s",
4639 temp_file);
5a691e98
RAE
4640
4641 store_arg (at_argument, 0, 0);
4642
4643 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
4644}
4645
4646/* True if we should compile INFILE. */
4647
4648static bool
4649compile_input_file_p (struct infile *infile)
4650{
4651 if ((!infile->language) || (infile->language[0] != '*'))
4652 if (infile->incompiler == input_file_compiler)
4653 return true;
4654 return false;
4655}
4656
69d540bd
NF
4657/* Process each member of VEC as a spec. */
4658
4659static void
9771b263 4660do_specs_vec (vec<char_p> vec)
69d540bd
NF
4661{
4662 unsigned ix;
4663 char *opt;
4664
9771b263 4665 FOR_EACH_VEC_ELT (vec, ix, opt)
69d540bd
NF
4666 {
4667 do_spec_1 (opt, 1, NULL);
4668 /* Make each accumulated option a separate argument. */
4669 do_spec_1 (" ", 0, NULL);
4670 }
4671}
4672
ed1f651b
RS
4673/* Process the sub-spec SPEC as a portion of a larger spec.
4674 This is like processing a whole spec except that we do
4675 not initialize at the beginning and we do not supply a
4676 newline by default at the end.
4677 INSWITCH nonzero means don't process %-sequences in SPEC;
4678 in this case, % is treated as an ordinary character.
4679 This is used while substituting switches.
4680 INSWITCH nonzero also causes SPC not to terminate an argument.
4681
4682 Value is zero unless a line was finished
4683 and the command on that line reported an error. */
4684
4685static int
1d088dee 4686do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
ed1f651b 4687{
b3694847
SS
4688 const char *p = spec;
4689 int c;
ed1f651b 4690 int i;
3279bba6 4691 int value;
ed1f651b 4692
7fcf46f5
JZ
4693 /* If it's an empty string argument to a switch, keep it as is. */
4694 if (inswitch && !*p)
4695 arg_going = 1;
4696
ededb2fc 4697 while ((c = *p++))
ed1f651b
RS
4698 /* If substituting a switch, treat all chars like letters.
4699 Otherwise, NL, SPC, TAB and % are special. */
4700 switch (inswitch ? 'a' : c)
4701 {
4702 case '\n':
13e7cedb 4703 end_going_arg ();
ed1f651b 4704
9771b263
DN
4705 if (argbuf.length () > 0
4706 && !strcmp (argbuf.last (), "|"))
ed1f651b 4707 {
ed1f651b
RS
4708 /* A `|' before the newline means use a pipe here,
4709 but only if -pipe was specified.
4710 Otherwise, execute now and don't pass the `|' as an arg. */
4977bab6 4711 if (use_pipes)
ed1f651b 4712 {
a99bf70c 4713 input_from_pipe = 1;
ed1f651b
RS
4714 break;
4715 }
4716 else
9771b263 4717 argbuf.pop ();
ed1f651b
RS
4718 }
4719
b856c15d
RO
4720 set_collect_gcc_options ();
4721
9771b263 4722 if (argbuf.length () > 0)
ed1f651b 4723 {
3279bba6 4724 value = execute ();
ed1f651b
RS
4725 if (value)
4726 return value;
4727 }
4728 /* Reinitialize for a new command, and for a new argument. */
4729 clear_args ();
4730 arg_going = 0;
4731 delete_this_arg = 0;
4732 this_is_output_file = 0;
4733 this_is_library_file = 0;
3beb864c 4734 this_is_linker_script = 0;
a99bf70c 4735 input_from_pipe = 0;
ed1f651b
RS
4736 break;
4737
4738 case '|':
13e7cedb 4739 end_going_arg ();
ed1f651b
RS
4740
4741 /* Use pipe */
4742 obstack_1grow (&obstack, c);
4743 arg_going = 1;
4744 break;
4745
4746 case '\t':
4747 case ' ':
13e7cedb
DH
4748 end_going_arg ();
4749
ed1f651b 4750 /* Reinitialize for a new argument. */
ed1f651b
RS
4751 delete_this_arg = 0;
4752 this_is_output_file = 0;
4753 this_is_library_file = 0;
3beb864c 4754 this_is_linker_script = 0;
ed1f651b
RS
4755 break;
4756
4757 case '%':
4758 switch (c = *p++)
4759 {
4760 case 0:
bdc6b402 4761 fatal_error ("spec %qs invalid", spec);
ed1f651b
RS
4762
4763 case 'b':
14fdc613
MM
4764 if (save_temps_length)
4765 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4766 else
4767 obstack_grow (&obstack, input_basename, basename_length);
2153915d
AO
4768 if (compare_debug < 0)
4769 obstack_grow (&obstack, ".gk", 3);
ed1f651b
RS
4770 arg_going = 1;
4771 break;
4772
ea414c97 4773 case 'B':
14fdc613
MM
4774 if (save_temps_length)
4775 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4776 else
4777 obstack_grow (&obstack, input_basename, suffixed_basename_length);
2153915d
AO
4778 if (compare_debug < 0)
4779 obstack_grow (&obstack, ".gk", 3);
ea414c97
ZW
4780 arg_going = 1;
4781 break;
4782
ed1f651b
RS
4783 case 'd':
4784 delete_this_arg = 2;
4785 break;
4786
4787 /* Dump out the directories specified with LIBRARY_PATH,
004fd4d5
RS
4788 followed by the absolute directories
4789 that we search for startfiles. */
ed1f651b 4790 case 'D':
8cacec76 4791 {
00dcee0c 4792 struct spec_path_info info;
59014d0a 4793
00dcee0c
AM
4794 info.option = "-L";
4795 info.append_len = 0;
76391e5a 4796#ifdef RELATIVE_PREFIX_NOT_LINKDIR
00dcee0c
AM
4797 /* Used on systems which record the specified -L dirs
4798 and use them to search for dynamic linking.
4799 Relative directories always come from -B,
4800 and it is better not to use them for searching
4801 at run time. In particular, stage1 loses. */
4802 info.omit_relative = true;
76391e5a 4803#else
00dcee0c 4804 info.omit_relative = false;
004fd4d5 4805#endif
00dcee0c
AM
4806 info.separate_options = false;
4807
4808 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
8cacec76 4809 }
ed1f651b
RS
4810 break;
4811
4812 case 'e':
ab87f8c8 4813 /* %efoo means report an error with `foo' as error message
ed1f651b
RS
4814 and don't execute any more commands for this file. */
4815 {
878f32c3 4816 const char *q = p;
ed1f651b 4817 char *buf;
d25a45d4
KH
4818 while (*p != 0 && *p != '\n')
4819 p++;
e1e4cdc4 4820 buf = (char *) alloca (p - q + 1);
ed1f651b
RS
4821 strncpy (buf, q, p - q);
4822 buf[p - q] = 0;
5bc69b92 4823 error ("%s", _(buf));
ed1f651b
RS
4824 return -1;
4825 }
4826 break;
4a88a060 4827 case 'n':
09da1532 4828 /* %nfoo means report a notice with `foo' on stderr. */
4a88a060
JH
4829 {
4830 const char *q = p;
4831 char *buf;
4832 while (*p != 0 && *p != '\n')
4833 p++;
e1e4cdc4 4834 buf = (char *) alloca (p - q + 1);
4a88a060
JH
4835 strncpy (buf, q, p - q);
4836 buf[p - q] = 0;
2dec80c7 4837 inform (0, "%s", _(buf));
4a88a060
JH
4838 if (*p)
4839 p++;
4840 }
4841 break;
ed1f651b 4842
d25a45d4
KH
4843 case 'j':
4844 {
4845 struct stat st;
4846
4977bab6
ZW
4847 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4848 defined, and it is not a directory, and it is
4849 writable, use it. Otherwise, treat this like any
4850 other temporary file. */
d25a45d4
KH
4851
4852 if ((!save_temps_flag)
4853 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4854 && (access (HOST_BIT_BUCKET, W_OK) == 0))
4855 {
4856 obstack_grow (&obstack, HOST_BIT_BUCKET,
4857 strlen (HOST_BIT_BUCKET));
4858 delete_this_arg = 0;
4859 arg_going = 1;
4860 break;
4861 }
4862 }
4977bab6
ZW
4863 goto create_temp_file;
4864 case '|':
4865 if (use_pipes)
4866 {
4867 obstack_1grow (&obstack, '-');
4868 delete_this_arg = 0;
4869 arg_going = 1;
4870
4871 /* consume suffix */
a92dd235 4872 while (*p == '.' || ISALNUM ((unsigned char) *p))
4977bab6
ZW
4873 p++;
4874 if (p[0] == '%' && p[1] == 'O')
4875 p += 2;
1d088dee 4876
4977bab6
ZW
4877 break;
4878 }
4879 goto create_temp_file;
4880 case 'm':
4881 if (use_pipes)
4882 {
4883 /* consume suffix */
a92dd235 4884 while (*p == '.' || ISALNUM ((unsigned char) *p))
4977bab6
ZW
4885 p++;
4886 if (p[0] == '%' && p[1] == 'O')
4887 p += 2;
1d088dee 4888
4977bab6
ZW
4889 break;
4890 }
4891 goto create_temp_file;
ed1f651b 4892 case 'g':
d887e808 4893 case 'u':
4401b31c 4894 case 'U':
4977bab6 4895 create_temp_file:
ed1f651b 4896 {
fb266030 4897 struct temp_name *t;
dd75c292 4898 int suffix_length;
878f32c3 4899 const char *suffix = p;
a1d9074c 4900 char *saved_suffix = NULL;
dd75c292 4901
a92dd235 4902 while (*p == '.' || ISALNUM ((unsigned char) *p))
a1d9074c
TT
4903 p++;
4904 suffix_length = p - suffix;
dd75c292
CB
4905 if (p[0] == '%' && p[1] == 'O')
4906 {
cbc54665 4907 p += 2;
dd75c292 4908 /* We don't support extra suffix characters after %O. */
a92dd235 4909 if (*p == '.' || ISALNUM ((unsigned char) *p))
bdc6b402 4910 fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
a1d9074c 4911 if (suffix_length == 0)
45936a85 4912 suffix = TARGET_OBJECT_SUFFIX;
a1d9074c
TT
4913 else
4914 {
4915 saved_suffix
5ed6ace5 4916 = XNEWVEC (char, suffix_length
e3cb8f05 4917 + strlen (TARGET_OBJECT_SUFFIX) + 1);
a1d9074c
TT
4918 strncpy (saved_suffix, suffix, suffix_length);
4919 strcpy (saved_suffix + suffix_length,
45936a85 4920 TARGET_OBJECT_SUFFIX);
a1d9074c 4921 }
45936a85 4922 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
dd75c292 4923 }
589005ff 4924
2153915d
AO
4925 if (compare_debug < 0)
4926 {
4927 suffix = concat (".gk", suffix, NULL);
4928 suffix_length += 3;
4929 }
4930
14fdc613
MM
4931 /* If -save-temps=obj and -o were specified, use that for the
4932 temp file. */
4933 if (save_temps_length)
4934 {
4935 char *tmp;
4936 temp_filename_length
4937 = save_temps_length + suffix_length + 1;
4938 tmp = (char *) alloca (temp_filename_length);
4939 memcpy (tmp, save_temps_prefix, save_temps_length);
4940 memcpy (tmp + save_temps_length, suffix, suffix_length);
4941 tmp[save_temps_length + suffix_length] = '\0';
fc429b48
TB
4942 temp_filename = save_string (tmp, save_temps_length
4943 + suffix_length);
14fdc613
MM
4944 obstack_grow (&obstack, temp_filename,
4945 temp_filename_length);
4946 arg_going = 1;
4947 delete_this_arg = 0;
4948 break;
4949 }
4950
6afbc885 4951 /* If the gcc_input_filename has the same suffix specified
99f78cdd
IR
4952 for the %g, %u, or %U, and -save-temps is specified,
4953 we could end up using that file as an intermediate
4954 thus clobbering the user's source file (.e.g.,
4955 gcc -save-temps foo.s would clobber foo.s with the
4956 output of cpp0). So check for this condition and
4957 generate a temp file as the intermediate. */
589005ff 4958
99f78cdd
IR
4959 if (save_temps_flag)
4960 {
6ea2b70d 4961 char *tmp;
14fdc613
MM
4962 temp_filename_length = basename_length + suffix_length + 1;
4963 tmp = (char *) alloca (temp_filename_length);
4964 memcpy (tmp, input_basename, basename_length);
4965 memcpy (tmp + basename_length, suffix, suffix_length);
4966 tmp[basename_length + suffix_length] = '\0';
6ea2b70d 4967 temp_filename = tmp;
14fdc613 4968
ba78087b 4969 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
99f78cdd 4970 {
a9024779 4971#ifndef HOST_LACKS_INODE_NUMBERS
1d088dee 4972 struct stat st_temp;
589005ff 4973
1d088dee
AJ
4974 /* Note, set_input() resets input_stat_set to 0. */
4975 if (input_stat_set == 0)
4976 {
6afbc885
JM
4977 input_stat_set = stat (gcc_input_filename,
4978 &input_stat);
1d088dee
AJ
4979 if (input_stat_set >= 0)
4980 input_stat_set = 1;
4981 }
589005ff 4982
6afbc885 4983 /* If we have the stat for the gcc_input_filename
1d088dee
AJ
4984 and we can do the stat for the temp_filename
4985 then the they could still refer to the same
4986 file if st_dev/st_ino's are the same. */
99f78cdd
IR
4987 if (input_stat_set != 1
4988 || stat (temp_filename, &st_temp) < 0
4989 || input_stat.st_dev != st_temp.st_dev
4990 || input_stat.st_ino != st_temp.st_ino)
a9024779
DS
4991#else
4992 /* Just compare canonical pathnames. */
6afbc885 4993 char* input_realname = lrealpath (gcc_input_filename);
a9024779 4994 char* temp_realname = lrealpath (temp_filename);
ba78087b 4995 bool files_differ = filename_cmp (input_realname, temp_realname);
a9024779
DS
4996 free (input_realname);
4997 free (temp_realname);
7904f95f 4998 if (files_differ)
a9024779 4999#endif
589005ff 5000 {
99f78cdd
IR
5001 temp_filename = save_string (temp_filename,
5002 temp_filename_length + 1);
5003 obstack_grow (&obstack, temp_filename,
1d088dee 5004 temp_filename_length);
99f78cdd 5005 arg_going = 1;
d2dff06b 5006 delete_this_arg = 0;
99f78cdd
IR
5007 break;
5008 }
5009 }
5010 }
fb266030
TW
5011
5012 /* See if we already have an association of %g/%u/%U and
5013 suffix. */
5014 for (t = temp_names; t; t = t->next)
dd75c292
CB
5015 if (t->length == suffix_length
5016 && strncmp (t->suffix, suffix, suffix_length) == 0
95456d43 5017 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
fb266030
TW
5018 break;
5019
2297fdf1
TT
5020 /* Make a new association if needed. %u and %j
5021 require one. */
49009afd 5022 if (t == 0 || c == 'u' || c == 'j')
fb266030
TW
5023 {
5024 if (t == 0)
5025 {
e1e4cdc4 5026 t = XNEW (struct temp_name);
fb266030
TW
5027 t->next = temp_names;
5028 temp_names = t;
5029 }
dd75c292 5030 t->length = suffix_length;
2297fdf1
TT
5031 if (saved_suffix)
5032 {
5033 t->suffix = saved_suffix;
5034 saved_suffix = NULL;
5035 }
5036 else
5037 t->suffix = save_string (suffix, suffix_length);
95456d43 5038 t->unique = (c == 'u' || c == 'U' || c == 'j');
dd75c292 5039 temp_filename = make_temp_file (t->suffix);
6aa62cff 5040 temp_filename_length = strlen (temp_filename);
fb266030
TW
5041 t->filename = temp_filename;
5042 t->filename_length = temp_filename_length;
5043 }
5044
04695783 5045 free (saved_suffix);
a1d9074c 5046
fb266030 5047 obstack_grow (&obstack, t->filename, t->filename_length);
b9490a6e 5048 delete_this_arg = 1;
ed1f651b
RS
5049 }
5050 arg_going = 1;
5051 break;
5052
5053 case 'i':
d1bd0ded
GK
5054 if (combine_inputs)
5055 {
5a691e98
RAE
5056 if (at_file_supplied)
5057 {
5058 /* We are going to expand `%i' to `@FILE', where FILE
5059 is a newly-created temporary filename. The filenames
5060 that would usually be expanded in place of %o will be
5061 written to the temporary file. */
5062 char **argv;
5063 int n_files = 0;
5064 int j;
5065
5066 for (i = 0; i < n_infiles; i++)
5067 if (compile_input_file_p (&infiles[i]))
5068 n_files++;
5069
5070 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5071
5072 /* Copy the strings over. */
5073 for (i = 0, j = 0; i < n_infiles; i++)
5074 if (compile_input_file_p (&infiles[i]))
5075 {
5076 argv[j] = CONST_CAST (char *, infiles[i].name);
5077 infiles[i].compiled = true;
5078 j++;
5079 }
5080 argv[j] = NULL;
5081
5082 create_at_file (argv);
5083 }
5084 else
5085 for (i = 0; (int) i < n_infiles; i++)
5086 if (compile_input_file_p (&infiles[i]))
0855eab7
CT
5087 {
5088 store_arg (infiles[i].name, 0, 0);
5089 infiles[i].compiled = true;
5090 }
d1bd0ded
GK
5091 }
5092 else
5093 {
6afbc885
JM
5094 obstack_grow (&obstack, gcc_input_filename,
5095 input_filename_length);
d1bd0ded
GK
5096 arg_going = 1;
5097 }
ed1f651b
RS
5098 break;
5099
8eebb258 5100 case 'I':
2d879387 5101 {
00dcee0c 5102 struct spec_path_info info;
2d879387 5103
2b6dd222
JM
5104 if (multilib_dir)
5105 {
5106 do_spec_1 ("-imultilib", 1, NULL);
5107 /* Make this a separate argument. */
5108 do_spec_1 (" ", 0, NULL);
5109 do_spec_1 (multilib_dir, 1, NULL);
5110 do_spec_1 (" ", 0, NULL);
5111 }
5112
e0cdc09f
MK
5113 if (multiarch_dir)
5114 {
5115 do_spec_1 ("-imultiarch", 1, NULL);
5116 /* Make this a separate argument. */
5117 do_spec_1 (" ", 0, NULL);
5118 do_spec_1 (multiarch_dir, 1, NULL);
5119 do_spec_1 (" ", 0, NULL);
5120 }
5121
2d879387
JW
5122 if (gcc_exec_prefix)
5123 {
6496a589 5124 do_spec_1 ("-iprefix", 1, NULL);
2d879387 5125 /* Make this a separate argument. */
6496a589
KG
5126 do_spec_1 (" ", 0, NULL);
5127 do_spec_1 (gcc_exec_prefix, 1, NULL);
5128 do_spec_1 (" ", 0, NULL);
2d879387
JW
5129 }
5130
e7f13528
GP
5131 if (target_system_root_changed ||
5132 (target_system_root && target_sysroot_hdrs_suffix))
047d636f
DJ
5133 {
5134 do_spec_1 ("-isysroot", 1, NULL);
5135 /* Make this a separate argument. */
5136 do_spec_1 (" ", 0, NULL);
5137 do_spec_1 (target_system_root, 1, NULL);
e7f13528
GP
5138 if (target_sysroot_hdrs_suffix)
5139 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
047d636f
DJ
5140 do_spec_1 (" ", 0, NULL);
5141 }
5142
00dcee0c
AM
5143 info.option = "-isystem";
5144 info.append = "include";
5145 info.append_len = strlen (info.append);
5146 info.omit_relative = false;
5147 info.separate_options = true;
5148
5149 for_each_path (&include_prefixes, false, info.append_len,
5150 spec_path, &info);
f686ec05
JM
5151
5152 info.append = "include-fixed";
14da6073
JM
5153 if (*sysroot_hdrs_suffix_spec)
5154 info.append = concat (info.append, dir_separator_str,
5155 multilib_dir, NULL);
f686ec05
JM
5156 info.append_len = strlen (info.append);
5157 for_each_path (&include_prefixes, false, info.append_len,
5158 spec_path, &info);
2d879387 5159 }
8eebb258
RS
5160 break;
5161
ed1f651b 5162 case 'o':
15c5edb9
TT
5163 {
5164 int max = n_infiles;
15c5edb9 5165 max += lang_specific_extra_outfiles;
08dc830e 5166
2091ff66
NF
5167 if (HAVE_GNU_LD && at_file_supplied)
5168 {
5169 /* We are going to expand `%o' to `@FILE', where FILE
5170 is a newly-created temporary filename. The filenames
5171 that would usually be expanded in place of %o will be
5172 written to the temporary file. */
5173
2091ff66 5174 char **argv;
5a691e98 5175 int n_files, j;
2091ff66
NF
5176
5177 /* Convert OUTFILES into a form suitable for writeargv. */
5178
5179 /* Determine how many are non-NULL. */
5180 for (n_files = 0, i = 0; i < max; i++)
5181 n_files += outfiles[i] != NULL;
5182
e1e4cdc4 5183 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
2091ff66
NF
5184
5185 /* Copy the strings over. */
5186 for (i = 0, j = 0; i < max; i++)
5187 if (outfiles[i])
5188 {
b1d5455a 5189 argv[j] = CONST_CAST (char *, outfiles[i]);
2091ff66
NF
5190 j++;
5191 }
5192 argv[j] = NULL;
5193
5a691e98 5194 create_at_file (argv);
2091ff66
NF
5195 }
5196 else
5197 for (i = 0; i < max; i++)
5198 if (outfiles[i])
5199 store_arg (outfiles[i], 0, 0);
15c5edb9
TT
5200 break;
5201 }
ed1f651b 5202
ed7dae04 5203 case 'O':
45936a85 5204 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
ed7dae04
RK
5205 arg_going = 1;
5206 break;
5207
ed1f651b
RS
5208 case 's':
5209 this_is_library_file = 1;
5210 break;
5211
3beb864c
NC
5212 case 'T':
5213 this_is_linker_script = 1;
5214 break;
5215
17211ab5
GK
5216 case 'V':
5217 outfiles[input_file_number] = NULL;
5218 break;
5219
ed1f651b
RS
5220 case 'w':
5221 this_is_output_file = 1;
5222 break;
5223
5224 case 'W':
5225 {
9771b263 5226 unsigned int cur_index = argbuf.length ();
ed1f651b
RS
5227 /* Handle the {...} following the %W. */
5228 if (*p != '{')
bdc6b402 5229 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
ed1f651b
RS
5230 p = handle_braces (p + 1);
5231 if (p == 0)
5232 return -1;
13e7cedb 5233 end_going_arg ();
ed1f651b
RS
5234 /* If any args were output, mark the last one for deletion
5235 on failure. */
9771b263
DN
5236 if (argbuf.length () != cur_index)
5237 record_temp_file (argbuf.last (), 0, 1);
ed1f651b
RS
5238 break;
5239 }
5240
5241 /* %x{OPTION} records OPTION for %X to output. */
5242 case 'x':
5243 {
878f32c3 5244 const char *p1 = p;
ed1f651b 5245 char *string;
69d540bd
NF
5246 char *opt;
5247 unsigned ix;
ed1f651b
RS
5248
5249 /* Skip past the option value and make a copy. */
5250 if (*p != '{')
bdc6b402 5251 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
ed1f651b
RS
5252 while (*p++ != '}')
5253 ;
5254 string = save_string (p1 + 1, p - p1 - 2);
5255
5256 /* See if we already recorded this option. */
9771b263 5257 FOR_EACH_VEC_ELT (linker_options, ix, opt)
69d540bd 5258 if (! strcmp (string, opt))
ed1f651b
RS
5259 {
5260 free (string);
5261 return 0;
5262 }
5263
5264 /* This option is new; add it. */
b8468bc7 5265 add_linker_option (string, strlen (string));
fc429b48 5266 free (string);
ed1f651b
RS
5267 }
5268 break;
5269
368dfd3a 5270 /* Dump out the options accumulated previously using %x. */
ed1f651b 5271 case 'X':
69d540bd 5272 do_specs_vec (linker_options);
ed1f651b
RS
5273 break;
5274
c9ebacb8
RS
5275 /* Dump out the options accumulated previously using -Wa,. */
5276 case 'Y':
69d540bd 5277 do_specs_vec (assembler_options);
c9ebacb8
RS
5278 break;
5279
57cb9b60
JW
5280 /* Dump out the options accumulated previously using -Wp,. */
5281 case 'Z':
69d540bd 5282 do_specs_vec (preprocessor_options);
57cb9b60
JW
5283 break;
5284
ed1f651b
RS
5285 /* Here are digits and numbers that just process
5286 a certain constant string as a spec. */
5287
5288 case '1':
6496a589 5289 value = do_spec_1 (cc1_spec, 0, NULL);
3279bba6
RS
5290 if (value != 0)
5291 return value;
ed1f651b
RS
5292 break;
5293
5294 case '2':
6496a589 5295 value = do_spec_1 (cc1plus_spec, 0, NULL);
3279bba6
RS
5296 if (value != 0)
5297 return value;
ed1f651b
RS
5298 break;
5299
5300 case 'a':
6496a589 5301 value = do_spec_1 (asm_spec, 0, NULL);
3279bba6
RS
5302 if (value != 0)
5303 return value;
ed1f651b
RS
5304 break;
5305
5306 case 'A':
6496a589 5307 value = do_spec_1 (asm_final_spec, 0, NULL);
3279bba6
RS
5308 if (value != 0)
5309 return value;
ed1f651b
RS
5310 break;
5311
ed1f651b 5312 case 'C':
a9374841 5313 {
83182544 5314 const char *const spec
589005ff
KH
5315 = (input_file_compiler->cpp_spec
5316 ? input_file_compiler->cpp_spec
a9374841 5317 : cpp_spec);
6496a589 5318 value = do_spec_1 (spec, 0, NULL);
a9374841
MM
5319 if (value != 0)
5320 return value;
5321 }
ed1f651b
RS
5322 break;
5323
5324 case 'E':
6496a589 5325 value = do_spec_1 (endfile_spec, 0, NULL);
3279bba6
RS
5326 if (value != 0)
5327 return value;
ed1f651b
RS
5328 break;
5329
5330 case 'l':
6496a589 5331 value = do_spec_1 (link_spec, 0, NULL);
3279bba6
RS
5332 if (value != 0)
5333 return value;
ed1f651b
RS
5334 break;
5335
5336 case 'L':
6496a589 5337 value = do_spec_1 (lib_spec, 0, NULL);
3279bba6
RS
5338 if (value != 0)
5339 return value;
ed1f651b
RS
5340 break;
5341
3cd50158
SD
5342 case 'M':
5343 if (multilib_os_dir == NULL)
5344 obstack_1grow (&obstack, '.');
5345 else
5346 obstack_grow (&obstack, multilib_os_dir,
5347 strlen (multilib_os_dir));
5348 break;
5349
68d69835 5350 case 'G':
6496a589 5351 value = do_spec_1 (libgcc_spec, 0, NULL);
68d69835
JM
5352 if (value != 0)
5353 return value;
5354 break;
5355
4977bab6
ZW
5356 case 'R':
5357 /* We assume there is a directory
5358 separator at the end of this string. */
5359 if (target_system_root)
1d088dee
AJ
5360 {
5361 obstack_grow (&obstack, target_system_root,
e7f13528
GP
5362 strlen (target_system_root));
5363 if (target_sysroot_suffix)
1d088dee 5364 obstack_grow (&obstack, target_sysroot_suffix,
e7f13528
GP
5365 strlen (target_sysroot_suffix));
5366 }
4977bab6
ZW
5367 break;
5368
ed1f651b 5369 case 'S':
6496a589 5370 value = do_spec_1 (startfile_spec, 0, NULL);
3279bba6
RS
5371 if (value != 0)
5372 return value;
ed1f651b
RS
5373 break;
5374
5375 /* Here we define characters other than letters and digits. */
5376
5377 case '{':
5378 p = handle_braces (p);
5379 if (p == 0)
5380 return -1;
5381 break;
5382
f3226a90 5383 case ':':
de5a5fa1 5384 p = handle_spec_function (p, NULL);
f3226a90
JT
5385 if (p == 0)
5386 return -1;
5387 break;
5388
ed1f651b
RS
5389 case '%':
5390 obstack_1grow (&obstack, '%');
5391 break;
5392
589005ff
KH
5393 case '.':
5394 {
5395 unsigned len = 0;
11972f66 5396
589005ff
KH
5397 while (p[len] && p[len] != ' ' && p[len] != '%')
5398 len++;
5399 suffix_subst = save_string (p - 1, len + 1);
5400 p += len;
5401 }
11972f66 5402 break;
589005ff 5403
4977bab6
ZW
5404 /* Henceforth ignore the option(s) matching the pattern
5405 after the %<. */
5406 case '<':
96f5b137 5407 case '>':
4977bab6
ZW
5408 {
5409 unsigned len = 0;
5410 int have_wildcard = 0;
5411 int i;
96f5b137
L
5412 int switch_option;
5413
5414 if (c == '>')
5415 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
5416 else
5417 switch_option = SWITCH_IGNORE;
4977bab6
ZW
5418
5419 while (p[len] && p[len] != ' ' && p[len] != '\t')
5420 len++;
5421
5422 if (p[len-1] == '*')
5423 have_wildcard = 1;
5424
5425 for (i = 0; i < n_switches; i++)
5426 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5427 && (have_wildcard || switches[i].part1[len] == '\0'))
5428 {
96f5b137 5429 switches[i].live_cond |= switch_option;
d168aaee
CB
5430 /* User switch be validated from validate_all_switches.
5431 when the definition is seen from the spec file.
5432 If not defined anywhere, will be rejected. */
5433 if (switches[i].known)
5434 switches[i].validated = true;
4977bab6
ZW
5435 }
5436
5437 p += len;
5438 }
5439 break;
5440
ed1f651b 5441 case '*':
3ac63d94
NC
5442 if (soft_matched_part)
5443 {
7fcf46f5
JZ
5444 if (soft_matched_part[0])
5445 do_spec_1 (soft_matched_part, 1, NULL);
25990163
NC
5446 /* Only insert a space after the substitution if it is at the
5447 end of the current sequence. So if:
5448
5449 "%{foo=*:bar%*}%{foo=*:one%*two}"
5450
5451 matches -foo=hello then it will produce:
5452
5453 barhello onehellotwo
5454 */
5455 if (*p == 0 || *p == '}')
5456 do_spec_1 (" ", 0, NULL);
3ac63d94
NC
5457 }
5458 else
5459 /* Catch the case where a spec string contains something like
454ff5cb 5460 '%{foo:%*}'. i.e. there is no * in the pattern on the left
3ac63d94 5461 hand side of the :. */
bdc6b402 5462 error ("spec failure: %<%%*%> has not been initialized by pattern match");
ed1f651b
RS
5463 break;
5464
5465 /* Process a string found as the value of a spec given by name.
5466 This feature allows individual machine descriptions
3ce9f090 5467 to add and use their own specs. */
ed1f651b 5468 case '(':
ed1f651b 5469 {
878f32c3 5470 const char *name = p;
ed1f651b
RS
5471 struct spec_list *sl;
5472 int len;
5473
5474 /* The string after the S/P is the name of a spec that is to be
0f41302f 5475 processed. */
3ce9f090 5476 while (*p && *p != ')')
ed1f651b
RS
5477 p++;
5478
3ac63d94 5479 /* See if it's in the list. */
ed1f651b 5480 for (len = p - name, sl = specs; sl; sl = sl->next)
79aff5ac 5481 if (sl->name_len == len && !strncmp (sl->name, name, len))
ed1f651b 5482 {
79aff5ac 5483 name = *(sl->ptr_spec);
20df0482 5484#ifdef DEBUG_SPECS
3ce9f090
JM
5485 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
5486 sl->name, name);
20df0482 5487#endif
ed1f651b
RS
5488 break;
5489 }
5490
5491 if (sl)
5492 {
3ce9f090
JM
5493 value = do_spec_1 (name, 0, NULL);
5494 if (value != 0)
5495 return value;
ed1f651b 5496 }
b3865ca9 5497
3ce9f090 5498 /* Discard the closing paren. */
b3865ca9
RS
5499 if (*p)
5500 p++;
ed1f651b
RS
5501 }
5502 break;
5503
5504 default:
bdc6b402 5505 error ("spec failure: unrecognized spec option %qc", c);
3ac63d94 5506 break;
ed1f651b
RS
5507 }
5508 break;
5509
5510 case '\\':
5511 /* Backslash: treat next character as ordinary. */
5512 c = *p++;
5513
938d968e 5514 /* Fall through. */
ed1f651b
RS
5515 default:
5516 /* Ordinary character: put it into the current argument. */
5517 obstack_1grow (&obstack, c);
5518 arg_going = 1;
5519 }
5520
f3226a90
JT
5521 /* End of string. If we are processing a spec function, we need to
5522 end any pending argument. */
13e7cedb
DH
5523 if (processing_spec_function)
5524 end_going_arg ();
f3226a90 5525
d25a45d4 5526 return 0;
ed1f651b
RS
5527}
5528
f3226a90
JT
5529/* Look up a spec function. */
5530
5531static const struct spec_function *
1d088dee 5532lookup_spec_function (const char *name)
f3226a90 5533{
f3226a90 5534 const struct spec_function *sf;
f3226a90 5535
4c360e1f
RE
5536 for (sf = static_spec_functions; sf->name != NULL; sf++)
5537 if (strcmp (sf->name, name) == 0)
5538 return sf;
f3226a90
JT
5539
5540 return NULL;
5541}
5542
5543/* Evaluate a spec function. */
5544
5545static const char *
1d088dee 5546eval_spec_function (const char *func, const char *args)
f3226a90
JT
5547{
5548 const struct spec_function *sf;
5549 const char *funcval;
5550
5551 /* Saved spec processing context. */
9771b263 5552 vec<const_char_p> save_argbuf;
f3226a90
JT
5553
5554 int save_arg_going;
5555 int save_delete_this_arg;
5556 int save_this_is_output_file;
5557 int save_this_is_library_file;
5558 int save_input_from_pipe;
3beb864c 5559 int save_this_is_linker_script;
f3226a90
JT
5560 const char *save_suffix_subst;
5561
b50ff8bb 5562 int save_growing_size;
f87604f8 5563 void *save_growing_value = NULL;
f3226a90
JT
5564
5565 sf = lookup_spec_function (func);
5566 if (sf == NULL)
bdc6b402 5567 fatal_error ("unknown spec function %qs", func);
f3226a90
JT
5568
5569 /* Push the spec processing context. */
f3226a90
JT
5570 save_argbuf = argbuf;
5571
5572 save_arg_going = arg_going;
5573 save_delete_this_arg = delete_this_arg;
5574 save_this_is_output_file = this_is_output_file;
5575 save_this_is_library_file = this_is_library_file;
3beb864c 5576 save_this_is_linker_script = this_is_linker_script;
f3226a90
JT
5577 save_input_from_pipe = input_from_pipe;
5578 save_suffix_subst = suffix_subst;
5579
b50ff8bb
OH
5580 /* If we have some object growing now, finalize it so the args and function
5581 eval proceed from a cleared context. This is needed to prevent the first
5582 constructed arg from mistakenly including the growing value. We'll push
5583 this value back on the obstack once the function evaluation is done, to
5584 restore a consistent processing context for our caller. This is fine as
5585 the address of growing objects isn't guaranteed to remain stable until
5586 they are finalized, and we expect this situation to be rare enough for
5587 the extra copy not to be an issue. */
5588 save_growing_size = obstack_object_size (&obstack);
5589 if (save_growing_size > 0)
5590 save_growing_value = obstack_finish (&obstack);
5591
f3226a90
JT
5592 /* Create a new spec processing context, and build the function
5593 arguments. */
5594
5595 alloc_args ();
5596 if (do_spec_2 (args) < 0)
bdc6b402 5597 fatal_error ("error in args to spec function %qs", func);
f3226a90
JT
5598
5599 /* argbuf_index is an index for the next argument to be inserted, and
5600 so contains the count of the args already inserted. */
5601
9771b263
DN
5602 funcval = (*sf->func) (argbuf.length (),
5603 argbuf.address ());
f3226a90
JT
5604
5605 /* Pop the spec processing context. */
9771b263 5606 argbuf.release ();
f3226a90
JT
5607 argbuf = save_argbuf;
5608
5609 arg_going = save_arg_going;
5610 delete_this_arg = save_delete_this_arg;
5611 this_is_output_file = save_this_is_output_file;
5612 this_is_library_file = save_this_is_library_file;
3beb864c 5613 this_is_linker_script = save_this_is_linker_script;
f3226a90
JT
5614 input_from_pipe = save_input_from_pipe;
5615 suffix_subst = save_suffix_subst;
5616
b50ff8bb
OH
5617 if (save_growing_size > 0)
5618 obstack_grow (&obstack, save_growing_value, save_growing_size);
5619
f3226a90
JT
5620 return funcval;
5621}
5622
5623/* Handle a spec function call of the form:
5624
5625 %:function(args)
5626
5627 ARGS is processed as a spec in a separate context and split into an
5628 argument vector in the normal fashion. The function returns a string
5629 containing a spec which we then process in the caller's context, or
de5a5fa1
MP
5630 NULL if no processing is required.
5631
5632 If RETVAL_NONNULL is not NULL, then store a bool whether function
5633 returned non-NULL. */
f3226a90
JT
5634
5635static const char *
de5a5fa1 5636handle_spec_function (const char *p, bool *retval_nonnull)
f3226a90
JT
5637{
5638 char *func, *args;
5639 const char *endp, *funcval;
5640 int count;
5641
5642 processing_spec_function++;
5643
5644 /* Get the function name. */
5645 for (endp = p; *endp != '\0'; endp++)
5646 {
5647 if (*endp == '(') /* ) */
5648 break;
5649 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5650 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
2dec80c7 5651 fatal_error ("malformed spec function name");
f3226a90
JT
5652 }
5653 if (*endp != '(') /* ) */
2dec80c7 5654 fatal_error ("no arguments for spec function");
f3226a90
JT
5655 func = save_string (p, endp - p);
5656 p = ++endp;
5657
5658 /* Get the arguments. */
5659 for (count = 0; *endp != '\0'; endp++)
5660 {
5661 /* ( */
5662 if (*endp == ')')
5663 {
5664 if (count == 0)
5665 break;
5666 count--;
5667 }
5668 else if (*endp == '(') /* ) */
5669 count++;
5670 }
5671 /* ( */
5672 if (*endp != ')')
2dec80c7 5673 fatal_error ("malformed spec function arguments");
f3226a90
JT
5674 args = save_string (p, endp - p);
5675 p = ++endp;
5676
5677 /* p now points to just past the end of the spec function expression. */
5678
5679 funcval = eval_spec_function (func, args);
5680 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5681 p = NULL;
de5a5fa1
MP
5682 if (retval_nonnull)
5683 *retval_nonnull = funcval != NULL;
f3226a90
JT
5684
5685 free (func);
5686 free (args);
5687
5688 processing_spec_function--;
5689
5690 return p;
5691}
5692
4977bab6
ZW
5693/* Inline subroutine of handle_braces. Returns true if the current
5694 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5695static inline bool
1d088dee 5696input_suffix_matches (const char *atom, const char *end_atom)
4977bab6
ZW
5697{
5698 return (input_suffix
5699 && !strncmp (input_suffix, atom, end_atom - atom)
5700 && input_suffix[end_atom - atom] == '\0');
5701}
ed1f651b 5702
48137d59
GK
5703/* Subroutine of handle_braces. Returns true if the current
5704 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
5705static bool
5706input_spec_matches (const char *atom, const char *end_atom)
5707{
5708 return (input_file_compiler
5709 && input_file_compiler->suffix
5710 && input_file_compiler->suffix[0] != '\0'
5711 && !strncmp (input_file_compiler->suffix + 1, atom,
5712 end_atom - atom)
5713 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
5714}
5715
953ff289 5716/* Subroutine of handle_braces. Returns true if a switch
4977bab6
ZW
5717 matching the atom bracketed by ATOM and END_ATOM appeared on the
5718 command line. */
953ff289 5719static bool
1d088dee 5720switch_matches (const char *atom, const char *end_atom, int starred)
ed1f651b 5721{
4977bab6
ZW
5722 int i;
5723 int len = end_atom - atom;
5724 int plen = starred ? len : -1;
ed1f651b 5725
4977bab6
ZW
5726 for (i = 0; i < n_switches; i++)
5727 if (!strncmp (switches[i].part1, atom, len)
5728 && (starred || switches[i].part1[len] == '\0')
5729 && check_live_switch (i, plen))
5730 return true;
8097c429 5731
5371f719
MG
5732 /* Check if a switch with separated form matching the atom.
5733 We check -D and -U switches. */
5734 else if (switches[i].args != 0)
5735 {
5736 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
5737 && *switches[i].part1 == atom[0])
5738 {
5739 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
5740 && (starred || (switches[i].part1[1] == '\0'
5741 && switches[i].args[0][len - 1] == '\0'))
5742 && check_live_switch (i, (starred ? 1 : -1)))
5743 return true;
5744 }
5745 }
5746
4977bab6
ZW
5747 return false;
5748}
ed1f651b 5749
4977bab6
ZW
5750/* Inline subroutine of handle_braces. Mark all of the switches which
5751 match ATOM (extends to END_ATOM; STARRED indicates whether there
5752 was a star after the atom) for later processing. */
5753static inline void
1d088dee 5754mark_matching_switches (const char *atom, const char *end_atom, int starred)
4977bab6
ZW
5755{
5756 int i;
5757 int len = end_atom - atom;
5758 int plen = starred ? len : -1;
5759
5760 for (i = 0; i < n_switches; i++)
5761 if (!strncmp (switches[i].part1, atom, len)
5762 && (starred || switches[i].part1[len] == '\0')
5763 && check_live_switch (i, plen))
5764 switches[i].ordering = 1;
5765}
9bf09437 5766
4977bab6
ZW
5767/* Inline subroutine of handle_braces. Process all the currently
5768 marked switches through give_switch, and clear the marks. */
5769static inline void
1d088dee 5770process_marked_switches (void)
4977bab6
ZW
5771{
5772 int i;
ed1f651b 5773
4977bab6
ZW
5774 for (i = 0; i < n_switches; i++)
5775 if (switches[i].ordering == 1)
5776 {
5777 switches[i].ordering = 0;
5778 give_switch (i, 0);
5779 }
5780}
ed1f651b 5781
4977bab6
ZW
5782/* Handle a %{ ... } construct. P points just inside the leading {.
5783 Returns a pointer one past the end of the brace block, or 0
5784 if we call do_spec_1 and that returns -1. */
ed1f651b 5785
4977bab6 5786static const char *
1d088dee 5787handle_braces (const char *p)
4977bab6
ZW
5788{
5789 const char *atom, *end_atom;
5790 const char *d_atom = NULL, *d_end_atom = NULL;
3b5edfee 5791 const char *orig = p;
8097c429 5792
4977bab6 5793 bool a_is_suffix;
48137d59 5794 bool a_is_spectype;
4977bab6
ZW
5795 bool a_is_starred;
5796 bool a_is_negated;
5797 bool a_matched;
9bf09437 5798
4977bab6
ZW
5799 bool a_must_be_last = false;
5800 bool ordered_set = false;
5801 bool disjunct_set = false;
5802 bool disj_matched = false;
5803 bool disj_starred = true;
5804 bool n_way_choice = false;
5805 bool n_way_matched = false;
5806
5807#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
9bf09437 5808
4977bab6 5809 do
ed1f651b 5810 {
4977bab6 5811 if (a_must_be_last)
3b5edfee 5812 goto invalid;
9bf09437 5813
4977bab6 5814 /* Scan one "atom" (S in the description above of %{}, possibly
48137d59
GK
5815 with '!', '.', '@', ',', or '*' modifiers). */
5816 a_matched = false;
5817 a_is_suffix = false;
5818 a_is_starred = false;
5819 a_is_negated = false;
5820 a_is_spectype = false;
9218435e 5821
c3284718 5822 SKIP_WHITE ();
4977bab6
ZW
5823 if (*p == '!')
5824 p++, a_is_negated = true;
ed1f651b 5825
c3284718 5826 SKIP_WHITE ();
de5a5fa1
MP
5827 if (*p == '%' && p[1] == ':')
5828 {
5829 atom = NULL;
5830 end_atom = NULL;
5831 p = handle_spec_function (p + 2, &a_matched);
5832 }
5833 else
5834 {
5835 if (*p == '.')
5836 p++, a_is_suffix = true;
5837 else if (*p == ',')
5838 p++, a_is_spectype = true;
5839
5840 atom = p;
c3284718 5841 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
de5a5fa1
MP
5842 || *p == ',' || *p == '.' || *p == '@')
5843 p++;
5844 end_atom = p;
ed1f651b 5845
de5a5fa1
MP
5846 if (*p == '*')
5847 p++, a_is_starred = 1;
5848 }
196a37f4 5849
c3284718 5850 SKIP_WHITE ();
3b5edfee 5851 switch (*p)
4977bab6 5852 {
3b5edfee 5853 case '&': case '}':
4977bab6
ZW
5854 /* Substitute the switch(es) indicated by the current atom. */
5855 ordered_set = true;
5856 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
48137d59 5857 || a_is_spectype || atom == end_atom)
3b5edfee 5858 goto invalid;
ed1f651b 5859
4977bab6
ZW
5860 mark_matching_switches (atom, end_atom, a_is_starred);
5861
5862 if (*p == '}')
5863 process_marked_switches ();
3b5edfee
NS
5864 break;
5865
5866 case '|': case ':':
4977bab6
ZW
5867 /* Substitute some text if the current atom appears as a switch
5868 or suffix. */
5869 disjunct_set = true;
5870 if (ordered_set)
3b5edfee 5871 goto invalid;
ed1f651b 5872
de5a5fa1 5873 if (atom && atom == end_atom)
ed1f651b 5874 {
4977bab6 5875 if (!n_way_choice || disj_matched || *p == '|'
b8698a0f 5876 || a_is_negated || a_is_suffix || a_is_spectype
48137d59 5877 || a_is_starred)
3b5edfee 5878 goto invalid;
4977bab6
ZW
5879
5880 /* An empty term may appear as the last choice of an
5881 N-way choice set; it means "otherwise". */
5882 a_must_be_last = true;
5883 disj_matched = !n_way_matched;
5884 disj_starred = false;
ed1f651b 5885 }
4977bab6 5886 else
ed1f651b 5887 {
48137d59
GK
5888 if ((a_is_suffix || a_is_spectype) && a_is_starred)
5889 goto invalid;
3beb864c 5890
48137d59
GK
5891 if (!a_is_starred)
5892 disj_starred = false;
5893
5894 /* Don't bother testing this atom if we already have a
5895 match. */
5896 if (!disj_matched && !n_way_matched)
5897 {
de5a5fa1
MP
5898 if (atom == NULL)
5899 /* a_matched is already set by handle_spec_function. */;
5900 else if (a_is_suffix)
48137d59
GK
5901 a_matched = input_suffix_matches (atom, end_atom);
5902 else if (a_is_spectype)
5903 a_matched = input_spec_matches (atom, end_atom);
5904 else
5905 a_matched = switch_matches (atom, end_atom, a_is_starred);
3beb864c 5906
48137d59
GK
5907 if (a_matched != a_is_negated)
5908 {
5909 disj_matched = true;
5910 d_atom = atom;
5911 d_end_atom = end_atom;
5912 }
5913 }
ed1f651b 5914 }
ed1f651b 5915
4977bab6 5916 if (*p == ':')
ed1f651b 5917 {
4977bab6
ZW
5918 /* Found the body, that is, the text to substitute if the
5919 current disjunction matches. */
5920 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
5921 disj_matched && !n_way_matched);
5922 if (p == 0)
5923 return 0;
ed1f651b 5924
4977bab6
ZW
5925 /* If we have an N-way choice, reset state for the next
5926 disjunction. */
5927 if (*p == ';')
ed1f651b 5928 {
4977bab6
ZW
5929 n_way_choice = true;
5930 n_way_matched |= disj_matched;
5931 disj_matched = false;
5932 disj_starred = true;
5933 d_atom = d_end_atom = NULL;
ed1f651b
RS
5934 }
5935 }
3b5edfee
NS
5936 break;
5937
5938 default:
5939 goto invalid;
ed1f651b 5940 }
4977bab6
ZW
5941 }
5942 while (*p++ != '}');
ed1f651b 5943
4977bab6 5944 return p;
7904f95f 5945
3b5edfee 5946 invalid:
bdc6b402 5947 fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
7904f95f 5948
4977bab6
ZW
5949#undef SKIP_WHITE
5950}
5951
5952/* Subroutine of handle_braces. Scan and process a brace substitution body
5953 (X in the description of %{} syntax). P points one past the colon;
5954 ATOM and END_ATOM bracket the first atom which was found to be true
5955 (present) in the current disjunction; STARRED indicates whether all
5956 the atoms in the current disjunction were starred (for syntax validation);
5957 MATCHED indicates whether the disjunction matched or not, and therefore
5958 whether or not the body is to be processed through do_spec_1 or just
5959 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
5960 returns -1. */
5961
5962static const char *
1d088dee
AJ
5963process_brace_body (const char *p, const char *atom, const char *end_atom,
5964 int starred, int matched)
4977bab6
ZW
5965{
5966 const char *body, *end_body;
5967 unsigned int nesting_level;
5968 bool have_subst = false;
5969
5970 /* Locate the closing } or ;, honoring nested braces.
5971 Trim trailing whitespace. */
5972 body = p;
5973 nesting_level = 1;
5974 for (;;)
5975 {
5976 if (*p == '{')
5977 nesting_level++;
5978 else if (*p == '}')
ed1f651b 5979 {
4977bab6
ZW
5980 if (!--nesting_level)
5981 break;
ed1f651b 5982 }
4977bab6
ZW
5983 else if (*p == ';' && nesting_level == 1)
5984 break;
5985 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
5986 have_subst = true;
5987 else if (*p == '\0')
3b5edfee 5988 goto invalid;
4977bab6 5989 p++;
ed1f651b 5990 }
1d088dee 5991
4977bab6
ZW
5992 end_body = p;
5993 while (end_body[-1] == ' ' || end_body[-1] == '\t')
5994 end_body--;
ed1f651b 5995
4977bab6 5996 if (have_subst && !starred)
3b5edfee 5997 goto invalid;
9bf09437 5998
4977bab6 5999 if (matched)
196a37f4 6000 {
4977bab6
ZW
6001 /* Copy the substitution body to permanent storage and execute it.
6002 If have_subst is false, this is a simple matter of running the
6003 body through do_spec_1... */
6004 char *string = save_string (body, end_body - body);
6005 if (!have_subst)
6006 {
6007 if (do_spec_1 (string, 0, NULL) < 0)
6008 return 0;
6009 }
6010 else
6011 {
6012 /* ... but if have_subst is true, we have to process the
6013 body once for each matching switch, with %* set to the
6014 variant part of the switch. */
6015 unsigned int hard_match_len = end_atom - atom;
6016 int i;
196a37f4 6017
4977bab6
ZW
6018 for (i = 0; i < n_switches; i++)
6019 if (!strncmp (switches[i].part1, atom, hard_match_len)
6020 && check_live_switch (i, hard_match_len))
6021 {
6022 if (do_spec_1 (string, 0,
6023 &switches[i].part1[hard_match_len]) < 0)
6024 return 0;
6025 /* Pass any arguments this switch has. */
6026 give_switch (i, 1);
6027 suffix_subst = NULL;
6028 }
6029 }
10ebf5fe
NB
6030 }
6031
4977bab6 6032 return p;
3b5edfee
NS
6033
6034 invalid:
bdc6b402 6035 fatal_error ("braced spec body %qs is invalid", body);
ed1f651b 6036}
f5b0eb4e 6037\f
6c396fb5
RK
6038/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6039 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
6040 spec, or -1 if either exact match or %* is used.
f5b0eb4e 6041
99ea153e 6042 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
f5b0eb4e
RK
6043 whose value does not begin with "no-" is obsoleted by the same value
6044 with the "no-", similarly for a switch with the "no-" prefix. */
6045
6046static int
1d088dee 6047check_live_switch (int switchnum, int prefix_length)
f5b0eb4e 6048{
878f32c3 6049 const char *name = switches[switchnum].part1;
f5b0eb4e
RK
6050 int i;
6051
2153915d
AO
6052 /* If we already processed this switch and determined if it was
6053 live or not, return our past determination. */
6054 if (switches[switchnum].live_cond != 0)
6055 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6056 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
94b90527
JJ
6057 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6058 == 0);
2153915d 6059
6c396fb5 6060 /* In the common case of {<at-most-one-letter>*}, a negating
f5b0eb4e
RK
6061 switch would always match, so ignore that case. We will just
6062 send the conflicting switches to the compiler phase. */
6c396fb5 6063 if (prefix_length >= 0 && prefix_length <= 1)
f5b0eb4e
RK
6064 return 1;
6065
f5b0eb4e
RK
6066 /* Now search for duplicate in a manner that depends on the name. */
6067 switch (*name)
6068 {
6069 case 'O':
d25a45d4
KH
6070 for (i = switchnum + 1; i < n_switches; i++)
6071 if (switches[i].part1[0] == 'O')
6072 {
d168aaee 6073 switches[switchnum].validated = true;
d25a45d4
KH
6074 switches[switchnum].live_cond = SWITCH_FALSE;
6075 return 0;
6076 }
f5b0eb4e 6077 break;
ed1f651b 6078
99ea153e 6079 case 'W': case 'f': case 'm': case 'g':
6c396fb5 6080 if (! strncmp (name + 1, "no-", 3))
f5b0eb4e 6081 {
0f41302f 6082 /* We have Xno-YYY, search for XYYY. */
f5b0eb4e
RK
6083 for (i = switchnum + 1; i < n_switches; i++)
6084 if (switches[i].part1[0] == name[0]
6085 && ! strcmp (&switches[i].part1[1], &name[4]))
d25a45d4 6086 {
d168aaee
CB
6087 /* --specs are validated with the validate_switches mechanism. */
6088 if (switches[switchnum].known)
6089 switches[switchnum].validated = true;
d25a45d4
KH
6090 switches[switchnum].live_cond = SWITCH_FALSE;
6091 return 0;
6092 }
f5b0eb4e
RK
6093 }
6094 else
6095 {
6096 /* We have XYYY, search for Xno-YYY. */
6097 for (i = switchnum + 1; i < n_switches; i++)
6098 if (switches[i].part1[0] == name[0]
6099 && switches[i].part1[1] == 'n'
6100 && switches[i].part1[2] == 'o'
6101 && switches[i].part1[3] == '-'
6102 && !strcmp (&switches[i].part1[4], &name[1]))
d25a45d4 6103 {
d168aaee
CB
6104 /* --specs are validated with the validate_switches mechanism. */
6105 if (switches[switchnum].known)
6106 switches[switchnum].validated = true;
d25a45d4
KH
6107 switches[switchnum].live_cond = SWITCH_FALSE;
6108 return 0;
6109 }
f5b0eb4e
RK
6110 }
6111 break;
6112 }
6113
6114 /* Otherwise the switch is live. */
3371362c 6115 switches[switchnum].live_cond |= SWITCH_LIVE;
f5b0eb4e
RK
6116 return 1;
6117}
6118\f
ed1f651b
RS
6119/* Pass a switch to the current accumulating command
6120 in the same form that we received it.
6121 SWITCHNUM identifies the switch; it is an index into
6122 the vector of switches gcc received, which is `switches'.
6123 This cannot fail since it never finishes a command line.
6124
4977bab6 6125 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
ed1f651b
RS
6126
6127static void
1d088dee 6128give_switch (int switchnum, int omit_first_word)
ed1f651b 6129{
3371362c 6130 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
8097c429
TT
6131 return;
6132
ed1f651b
RS
6133 if (!omit_first_word)
6134 {
6496a589
KG
6135 do_spec_1 ("-", 0, NULL);
6136 do_spec_1 (switches[switchnum].part1, 1, NULL);
ed1f651b 6137 }
1ba9a487 6138
ed1f651b
RS
6139 if (switches[switchnum].args != 0)
6140 {
fbd40359 6141 const char **p;
ed1f651b
RS
6142 for (p = switches[switchnum].args; *p; p++)
6143 {
11972f66
NS
6144 const char *arg = *p;
6145
4977bab6 6146 do_spec_1 (" ", 0, NULL);
11972f66
NS
6147 if (suffix_subst)
6148 {
6149 unsigned length = strlen (arg);
e65677af 6150 int dot = 0;
11972f66
NS
6151
6152 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6153 if (arg[length] == '.')
6154 {
c3284718 6155 (CONST_CAST (char *, arg))[length] = 0;
e65677af 6156 dot = 1;
11972f66
NS
6157 break;
6158 }
6496a589 6159 do_spec_1 (arg, 1, NULL);
e65677af 6160 if (dot)
c3284718 6161 (CONST_CAST (char *, arg))[length] = '.';
e65677af 6162 do_spec_1 (suffix_subst, 1, NULL);
11972f66
NS
6163 }
6164 else
6496a589 6165 do_spec_1 (arg, 1, NULL);
ed1f651b
RS
6166 }
6167 }
1ba9a487 6168
6496a589 6169 do_spec_1 (" ", 0, NULL);
d168aaee 6170 switches[switchnum].validated = true;
ed1f651b
RS
6171}
6172\f
dc10fd96
JJ
6173/* Print GCC configuration (e.g. version, thread model, target,
6174 configuration_arguments) to a given FILE. */
6175
6176static void
6177print_configuration (FILE *file)
6178{
6179 int n;
6180 const char *thrmod;
6181
6182 fnotice (file, "Target: %s\n", spec_machine);
6183 fnotice (file, "Configured with: %s\n", configuration_arguments);
6184
6185#ifdef THREAD_MODEL_SPEC
6186 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6187 but there's no point in doing all this processing just to get
6188 thread_model back. */
6189 obstack_init (&obstack);
6190 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6191 obstack_1grow (&obstack, '\0');
6192 thrmod = XOBFINISH (&obstack, const char *);
6193#else
6194 thrmod = thread_model;
6195#endif
6196
6197 fnotice (file, "Thread model: %s\n", thrmod);
6198
6199 /* compiler_version is truncated at the first space when initialized
6200 from version string, so truncate version_string at the first space
6201 before comparing. */
6202 for (n = 0; version_string[n]; n++)
6203 if (version_string[n] == ' ')
6204 break;
6205
6206 if (! strncmp (version_string, compiler_version, n)
6207 && compiler_version[n] == 0)
6208 fnotice (file, "gcc version %s %s\n\n", version_string,
6209 pkgversion_string);
6210 else
6211 fnotice (file, "gcc driver version %s %sexecuting gcc version %s\n\n",
6212 version_string, pkgversion_string, compiler_version);
6213
6214}
6215
6216#define RETRY_ICE_ATTEMPTS 3
6217
6218/* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
6219
6220static bool
6221files_equal_p (char *file1, char *file2)
6222{
6223 struct stat st1, st2;
6224 off_t n, len;
6225 int fd1, fd2;
6226 const int bufsize = 8192;
6227 char *buf = XNEWVEC (char, bufsize);
6228
6229 fd1 = open (file1, O_RDONLY);
6230 fd2 = open (file2, O_RDONLY);
6231
6232 if (fd1 < 0 || fd2 < 0)
6233 goto error;
6234
6235 if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
6236 goto error;
6237
6238 if (st1.st_size != st2.st_size)
6239 goto error;
6240
6241 for (n = st1.st_size; n; n -= len)
6242 {
6243 len = n;
6244 if ((int) len > bufsize / 2)
6245 len = bufsize / 2;
6246
6247 if (read (fd1, buf, len) != (int) len
6248 || read (fd2, buf + bufsize / 2, len) != (int) len)
6249 {
6250 goto error;
6251 }
6252
6253 if (memcmp (buf, buf + bufsize / 2, len) != 0)
6254 goto error;
6255 }
6256
6257 free (buf);
6258 close (fd1);
6259 close (fd2);
6260
6261 return 1;
6262
6263error:
6264 free (buf);
6265 close (fd1);
6266 close (fd2);
6267 return 0;
6268}
6269
6270/* Check that compiler's output doesn't differ across runs.
6271 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
6272 stdout and stderr for each compiler run. Return true if all of
6273 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
6274
6275static bool
6276check_repro (char **temp_stdout_files, char **temp_stderr_files)
6277{
6278 int i;
6279 for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
6280 {
6281 if (!files_equal_p (temp_stdout_files[i], temp_stdout_files[i + 1])
6282 || !files_equal_p (temp_stderr_files[i], temp_stderr_files[i + 1]))
6283 {
6284 fnotice (stderr, "The bug is not reproducible, so it is"
6285 " likely a hardware or OS problem.\n");
6286 break;
6287 }
6288 }
6289 return i == RETRY_ICE_ATTEMPTS - 2;
6290}
6291
6292enum attempt_status {
6293 ATTEMPT_STATUS_FAIL_TO_RUN,
6294 ATTEMPT_STATUS_SUCCESS,
6295 ATTEMPT_STATUS_ICE
6296};
6297
6298
6299/* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
6300 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
6301 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
6302 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
6303 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
6304 ATTEMPT_STATUS_SUCCESS otherwise. */
6305
6306static enum attempt_status
6307run_attempt (const char **new_argv, const char *out_temp,
6308 const char *err_temp, int emit_system_info, int append)
6309{
6310
6311 if (emit_system_info)
6312 {
6313 FILE *file_out = fopen (err_temp, "a");
6314 print_configuration (file_out);
6315 fclose (file_out);
6316 }
6317
6318 int exit_status;
6319 const char *errmsg;
6320 struct pex_obj *pex;
6321 int err;
6322 int pex_flags = PEX_USE_PIPES | PEX_LAST;
6323 enum attempt_status status = ATTEMPT_STATUS_FAIL_TO_RUN;
6324
6325 if (append)
6326 pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
6327
6328 pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
6329 if (!pex)
6330 fatal_error ("pex_init failed: %m");
6331
6332 errmsg = pex_run (pex, pex_flags, new_argv[0],
6333 CONST_CAST2 (char *const *, const char **, &new_argv[1]), out_temp,
6334 err_temp, &err);
1120a850
TS
6335 if (errmsg != NULL)
6336 {
6337 if (err == 0)
6338 fatal_error (errmsg);
6339 else
6340 {
6341 errno = err;
6342 pfatal_with_name (errmsg);
6343 }
6344 }
dc10fd96
JJ
6345
6346 if (!pex_get_status (pex, 1, &exit_status))
6347 goto out;
6348
6349 switch (WEXITSTATUS (exit_status))
6350 {
6351 case ICE_EXIT_CODE:
6352 status = ATTEMPT_STATUS_ICE;
6353 break;
6354
6355 case SUCCESS_EXIT_CODE:
6356 status = ATTEMPT_STATUS_SUCCESS;
6357 break;
6358
6359 default:
6360 ;
6361 }
6362
6363out:
6364 pex_free (pex);
6365 return status;
6366}
6367
6368/* This routine adds preprocessed source code into the given ERR_FILE.
6369 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
6370 add information in report file. RUN_ATTEMPT should return
6371 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
6372
6373static void
6374do_report_bug (const char **new_argv, const int nargs,
6375 char **out_file, char **err_file)
6376{
6377 int i, status;
6378 int fd = open (*out_file, O_RDWR | O_APPEND);
6379 if (fd < 0)
6380 return;
6381 write (fd, "\n//", 3);
6382 for (i = 0; i < nargs; i++)
6383 {
6384 write (fd, " ", 1);
6385 write (fd, new_argv[i], strlen (new_argv[i]));
6386 }
6387 write (fd, "\n\n", 2);
6388 close (fd);
6389 new_argv[nargs] = "-E";
6390 new_argv[nargs + 1] = NULL;
6391
6392 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
6393
6394 if (status == ATTEMPT_STATUS_SUCCESS)
6395 {
6396 fnotice (stderr, "Preprocessed source stored into %s file,"
6397 " please attach this to your bugreport.\n", *out_file);
6398 /* Make sure it is not deleted. */
6399 free (*out_file);
6400 *out_file = NULL;
6401 }
6402}
6403
6404/* Append string STR to file FILE. */
6405
6406static void
6407append_text (char *file, const char *str)
6408{
6409 int fd = open (file, O_RDWR | O_APPEND);
6410 if (fd < 0)
6411 return;
6412
6413 write (fd, str, strlen (str));
6414 close (fd);
6415}
6416
6417/* Try to reproduce ICE. If bug is reproducible, generate report .err file
6418 containing GCC configuration, backtrace, compiler's command line options
6419 and preprocessed source code. */
6420
6421static void
1120a850 6422try_generate_repro (const char **argv)
dc10fd96
JJ
6423{
6424 int i, nargs, out_arg = -1, quiet = 0, attempt;
6425 const char **new_argv;
6426 char *temp_files[RETRY_ICE_ATTEMPTS * 2];
6427 char **temp_stdout_files = &temp_files[0];
6428 char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
6429
6430 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
6431 return;
6432
6433 for (nargs = 0; argv[nargs] != NULL; ++nargs)
6434 /* Only retry compiler ICEs, not preprocessor ones. */
6435 if (! strcmp (argv[nargs], "-E"))
6436 return;
6437 else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
6438 {
6439 if (out_arg == -1)
6440 out_arg = nargs;
6441 else
6442 return;
6443 }
6444 /* If the compiler is going to output any time information,
6445 it might varry between invocations. */
6446 else if (! strcmp (argv[nargs], "-quiet"))
6447 quiet = 1;
6448 else if (! strcmp (argv[nargs], "-ftime-report"))
6449 return;
6450
6451 if (out_arg == -1 || !quiet)
6452 return;
6453
6454 memset (temp_files, '\0', sizeof (temp_files));
6455 new_argv = XALLOCAVEC (const char *, nargs + 4);
6456 memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
6457 new_argv[nargs++] = "-frandom-seed=0";
6458 new_argv[nargs++] = "-fdump-noaddr";
6459 new_argv[nargs] = NULL;
6460 if (new_argv[out_arg][2] == '\0')
6461 new_argv[out_arg + 1] = "-";
6462 else
6463 new_argv[out_arg] = "-o-";
6464
6465 int status;
6466 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
6467 {
6468 int emit_system_info = 0;
6469 int append = 0;
6470 temp_stdout_files[attempt] = make_temp_file (".out");
6471 temp_stderr_files[attempt] = make_temp_file (".err");
6472
6473 if (attempt == RETRY_ICE_ATTEMPTS - 1)
6474 {
6475 append = 1;
6476 emit_system_info = 1;
6477 }
6478
6479 if (emit_system_info)
6480 append_text (temp_stderr_files[attempt], "/*\n");
6481
6482 status = run_attempt (new_argv, temp_stdout_files[attempt],
6483 temp_stderr_files[attempt], emit_system_info,
6484 append);
6485
6486 if (emit_system_info)
6487 append_text (temp_stderr_files[attempt], "*/\n");
6488
6489 if (status != ATTEMPT_STATUS_ICE)
6490 {
6491 fnotice (stderr, "The bug is not reproducible, so it is"
6492 " likely a hardware or OS problem.\n");
6493 goto out;
6494 }
6495 }
6496
6497 if (!check_repro (temp_stdout_files, temp_stderr_files))
6498 goto out;
6499
6500 /* In final attempt we append compiler options and preprocesssed code to last
6501 generated .err file with configuration and backtrace. */
6502 do_report_bug (new_argv, nargs,
6503 &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
6504 &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1]);
6505
6506out:
6507 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
6508 if (temp_files[i])
6509 {
6510 unlink (temp_stdout_files[i]);
6511 free (temp_stdout_files[i]);
6512 }
6513}
6514
ed1f651b
RS
6515/* Search for a file named NAME trying various prefixes including the
6516 user's -B prefix and some standard ones.
6517 Return the absolute file name found. If nothing is found, return NAME. */
6518
878f32c3 6519static const char *
1d088dee 6520find_file (const char *name)
ed1f651b 6521{
00dcee0c 6522 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
ed1f651b
RS
6523 return newname ? newname : name;
6524}
6525
0ad5835e 6526/* Determine whether a directory exists. If LINKER, return 0 for
00dcee0c 6527 certain fixed names not needed by the linker. */
ed1f651b
RS
6528
6529static int
00dcee0c 6530is_directory (const char *path1, bool linker)
ed1f651b 6531{
00dcee0c
AM
6532 int len1;
6533 char *path;
ed1f651b
RS
6534 char *cp;
6535 struct stat st;
6536
00dcee0c
AM
6537 /* Ensure the string ends with "/.". The resulting path will be a
6538 directory even if the given path is a symbolic link. */
6539 len1 = strlen (path1);
e1e4cdc4 6540 path = (char *) alloca (3 + len1);
7e2231e7 6541 memcpy (path, path1, len1);
00dcee0c 6542 cp = path + len1;
509781a4 6543 if (!IS_DIR_SEPARATOR (cp[-1]))
48ff801b 6544 *cp++ = DIR_SEPARATOR;
ed1f651b
RS
6545 *cp++ = '.';
6546 *cp = '\0';
6547
6548 /* Exclude directories that the linker is known to search. */
0ad5835e 6549 if (linker
00dcee0c 6550 && IS_DIR_SEPARATOR (path[0])
48ff801b 6551 && ((cp - path == 6
ba78087b 6552 && filename_ncmp (path + 1, "lib", 3) == 0)
48ff801b 6553 || (cp - path == 10
ba78087b 6554 && filename_ncmp (path + 1, "usr", 3) == 0
00dcee0c 6555 && IS_DIR_SEPARATOR (path[4])
ba78087b 6556 && filename_ncmp (path + 5, "lib", 3) == 0)))
ed1f651b
RS
6557 return 0;
6558
6559 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6560}
512b62fb
JM
6561
6562/* Set up the various global variables to indicate that we're processing
6563 the input file named FILENAME. */
6564
b856c15d 6565void
1d088dee 6566set_input (const char *filename)
512b62fb 6567{
b3694847 6568 const char *p;
512b62fb 6569
6afbc885
JM
6570 gcc_input_filename = filename;
6571 input_filename_length = strlen (gcc_input_filename);
6572 input_basename = lbasename (gcc_input_filename);
512b62fb
JM
6573
6574 /* Find a suffix starting with the last period,
6575 and set basename_length to exclude that suffix. */
6576 basename_length = strlen (input_basename);
ea414c97 6577 suffixed_basename_length = basename_length;
512b62fb 6578 p = input_basename + basename_length;
d25a45d4
KH
6579 while (p != input_basename && *p != '.')
6580 --p;
512b62fb
JM
6581 if (*p == '.' && p != input_basename)
6582 {
6583 basename_length = p - input_basename;
6584 input_suffix = p + 1;
6585 }
6586 else
6587 input_suffix = "";
589005ff 6588
99f78cdd 6589 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6afbc885 6590 we will need to do a stat on the gcc_input_filename. The
99f78cdd
IR
6591 INPUT_STAT_SET signals that the stat is needed. */
6592 input_stat_set = 0;
512b62fb 6593}
ed1f651b
RS
6594\f
6595/* On fatal signals, delete all the temporary files. */
6596
6597static void
2dec80c7 6598fatal_signal (int signum)
ed1f651b
RS
6599{
6600 signal (signum, SIG_DFL);
6601 delete_failure_queue ();
6602 delete_temp_files ();
6603 /* Get the same signal again, this time not handled,
6604 so its normal effect occurs. */
6605 kill (getpid (), signum);
6606}
6607
2153915d
AO
6608/* Compare the contents of the two files named CMPFILE[0] and
6609 CMPFILE[1]. Return zero if they're identical, nonzero
6610 otherwise. */
6611
6612static int
6613compare_files (char *cmpfile[])
6614{
6615 int ret = 0;
6616 FILE *temp[2] = { NULL, NULL };
6617 int i;
6618
6619#if HAVE_MMAP_FILE
6620 {
6621 size_t length[2];
6622 void *map[2] = { NULL, NULL };
6623
6624 for (i = 0; i < 2; i++)
6625 {
6626 struct stat st;
6627
6628 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6629 {
6630 error ("%s: could not determine length of compare-debug file %s",
6afbc885 6631 gcc_input_filename, cmpfile[i]);
2153915d
AO
6632 ret = 1;
6633 break;
6634 }
6635
6636 length[i] = st.st_size;
6637 }
6638
6639 if (!ret && length[0] != length[1])
6640 {
6afbc885 6641 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
2153915d
AO
6642 ret = 1;
6643 }
6644
6645 if (!ret)
6646 for (i = 0; i < 2; i++)
6647 {
6648 int fd = open (cmpfile[i], O_RDONLY);
6649 if (fd < 0)
6650 {
6651 error ("%s: could not open compare-debug file %s",
6afbc885 6652 gcc_input_filename, cmpfile[i]);
2153915d
AO
6653 ret = 1;
6654 break;
6655 }
6656
6657 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6658 close (fd);
6659
6660 if (map[i] == (void *) MAP_FAILED)
6661 {
6662 ret = -1;
6663 break;
6664 }
6665 }
6666
6667 if (!ret)
6668 {
6669 if (memcmp (map[0], map[1], length[0]) != 0)
6670 {
6afbc885 6671 error ("%s: -fcompare-debug failure", gcc_input_filename);
2153915d
AO
6672 ret = 1;
6673 }
6674 }
6675
6676 for (i = 0; i < 2; i++)
6677 if (map[i])
e7aae3e8 6678 munmap ((caddr_t) map[i], length[i]);
2153915d
AO
6679
6680 if (ret >= 0)
6681 return ret;
6682
6683 ret = 0;
6684 }
6685#endif
6686
6687 for (i = 0; i < 2; i++)
6688 {
6689 temp[i] = fopen (cmpfile[i], "r");
6690 if (!temp[i])
6691 {
6692 error ("%s: could not open compare-debug file %s",
6afbc885 6693 gcc_input_filename, cmpfile[i]);
2153915d
AO
6694 ret = 1;
6695 break;
6696 }
6697 }
6698
6699 if (!ret && temp[0] && temp[1])
6700 for (;;)
6701 {
6702 int c0, c1;
6703 c0 = fgetc (temp[0]);
6704 c1 = fgetc (temp[1]);
6705
6706 if (c0 != c1)
6707 {
6708 error ("%s: -fcompare-debug failure",
6afbc885 6709 gcc_input_filename);
2153915d
AO
6710 ret = 1;
6711 break;
6712 }
6713
6714 if (c0 == EOF)
6715 break;
6716 }
6717
6718 for (i = 1; i >= 0; i--)
6719 {
6720 if (temp[i])
6721 fclose (temp[i]);
6722 }
6723
6724 return ret;
6725}
6726
742a072a
DM
6727/* The top-level "main" within the driver would be ~1000 lines long.
6728 This class breaks it up into smaller functions and contains some
6729 state shared by them. */
a8f227e7 6730
742a072a 6731class driver
ed1f651b 6732{
742a072a
DM
6733 public:
6734 int main (int argc, char **argv);
6735
6736 private:
6737 void set_progname (const char *argv0) const;
6738 void expand_at_files (int *argc, char ***argv) const;
6739 void decode_argv (int argc, const char **argv);
acbb0489 6740 void global_initializations ();
742a072a
DM
6741 void build_multilib_strings () const;
6742 void set_up_specs () const;
6743 void putenv_COLLECT_GCC (const char *argv0) const;
6744 void maybe_putenv_COLLECT_LTO_WRAPPER () const;
6745 void handle_unrecognized_options () const;
6746 int maybe_print_and_exit () const;
6747 bool prepare_infiles ();
6748 void do_spec_on_infiles () const;
6749 void maybe_run_linker (const char *argv0) const;
6750 void final_actions () const;
6751 int get_exit_code () const;
6752
6753 private:
ed1f651b 6754 char *explicit_link_files;
60cf253a
JM
6755 struct cl_decoded_option *decoded_options;
6756 unsigned int decoded_options_count;
742a072a
DM
6757};
6758
6759/* Implement the top-level "main" within the driver in terms of
6760 driver::main. */
6761
6762extern int main (int, char **);
ed1f651b 6763
742a072a
DM
6764int
6765main (int argc, char **argv)
6766{
6767 driver d;
6768
6769 return d.main (argc, argv);
6770}
6771
6772/* driver::main is implemented as a series of driver:: method calls. */
6773
6774int
6775driver::main (int argc, char **argv)
6776{
6777 bool early_exit;
6778
6779 set_progname (argv[0]);
6780 expand_at_files (&argc, &argv);
6781 decode_argv (argc, const_cast <const char **> (argv));
6782 global_initializations ();
6783 build_multilib_strings ();
6784 set_up_specs ();
6785 putenv_COLLECT_GCC (argv[0]);
6786 maybe_putenv_COLLECT_LTO_WRAPPER ();
6787 handle_unrecognized_options ();
6788
6789 if (!maybe_print_and_exit ())
6790 return 0;
6791
6792 early_exit = prepare_infiles ();
6793 if (early_exit)
6794 return get_exit_code ();
6795
6796 do_spec_on_infiles ();
6797 maybe_run_linker (argv[0]);
6798 final_actions ();
6799 return get_exit_code ();
6800}
6801
6802/* Locate the final component of argv[0] after any leading path, and set
6803 the program name accordingly. */
6804
6805void
6806driver::set_progname (const char *argv0) const
6807{
6808 const char *p = argv0 + strlen (argv0);
6809 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
509781a4 6810 --p;
6afbc885 6811 progname = p;
ed1f651b 6812
6afbc885 6813 xmalloc_set_program_name (progname);
742a072a 6814}
e1a132c6 6815
742a072a
DM
6816/* Expand any @ files within the command-line args,
6817 setting at_file_supplied if any were expanded. */
6818
6819void
6820driver::expand_at_files (int *argc, char ***argv) const
6821{
6822 char **old_argv = *argv;
6823
6824 expandargv (argc, argv);
9d530538 6825
2091ff66 6826 /* Determine if any expansions were made. */
742a072a 6827 if (*argv != old_argv)
2091ff66 6828 at_file_supplied = true;
742a072a 6829}
2091ff66 6830
742a072a
DM
6831/* Decode the command-line arguments from argc/argv into the
6832 decoded_options array. */
6833
6834void
6835driver::decode_argv (int argc, const char **argv)
6836{
a7d0d30f
JM
6837 /* Register the language-independent parameters. */
6838 global_init_params ();
6839 finish_params ();
6840
6841 init_options_struct (&global_options, &global_options_set);
a75bfaa6 6842
742a072a 6843 decode_cmdline_options_to_array (argc, argv,
60cf253a
JM
6844 CL_DRIVER,
6845 &decoded_options, &decoded_options_count);
742a072a
DM
6846}
6847
6848/* Perform various initializations and setup. */
14c7833c 6849
742a072a 6850void
acbb0489 6851driver::global_initializations ()
742a072a 6852{
98a3dad4 6853 /* Unlock the stdio streams. */
2653bb0c 6854 unlock_std_streams ();
98a3dad4 6855
191bf464 6856 gcc_init_libintl ();
ab87f8c8 6857
6afbc885 6858 diagnostic_initialize (global_dc, 0);
ccbc132f
RM
6859
6860#ifdef GCC_DRIVER_HOST_INITIALIZATION
6861 /* Perform host dependent initialization when needed. */
6862 GCC_DRIVER_HOST_INITIALIZATION;
6863#endif
6864
6afbc885
JM
6865 if (atexit (delete_temp_files) != 0)
6866 fatal_error ("atexit failed");
6867
ed1f651b 6868 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
2dec80c7 6869 signal (SIGINT, fatal_signal);
2a353d3a 6870#ifdef SIGHUP
ed1f651b 6871 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
2dec80c7 6872 signal (SIGHUP, fatal_signal);
2a353d3a 6873#endif
ed1f651b 6874 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
2dec80c7 6875 signal (SIGTERM, fatal_signal);
ed1f651b
RS
6876#ifdef SIGPIPE
6877 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
2dec80c7 6878 signal (SIGPIPE, fatal_signal);
ed1f651b 6879#endif
798bdf70 6880#ifdef SIGCHLD
0bf679a3
BK
6881 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6882 receive the signal. A different setting is inheritable */
6883 signal (SIGCHLD, SIG_DFL);
798bdf70 6884#endif
ed1f651b 6885
d423df48
JJ
6886 /* Parsing and gimplification sometimes need quite large stack.
6887 Increase stack size limits if possible. */
6888 stack_limit_increase (64 * 1024 * 1024);
6889
f3226a90
JT
6890 /* Allocate the argument vector. */
6891 alloc_args ();
ed1f651b
RS
6892
6893 obstack_init (&obstack);
742a072a
DM
6894}
6895
6896/* Build multilib_select, et. al from the separate lines that make up each
6897 multilib selection. */
ed1f651b 6898
742a072a
DM
6899void
6900driver::build_multilib_strings () const
6901{
ffd86336 6902 {
742a072a 6903 const char *p;
3b304f5b 6904 const char *const *q = multilib_raw;
961b7009 6905 int need_space;
ffd86336
JW
6906
6907 obstack_init (&multilib_obstack);
0f41302f 6908 while ((p = *q++) != (char *) 0)
ffd86336
JW
6909 obstack_grow (&multilib_obstack, p, strlen (p));
6910
6911 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6912 multilib_select = XOBFINISH (&multilib_obstack, const char *);
961b7009
MM
6913
6914 q = multilib_matches_raw;
6915 while ((p = *q++) != (char *) 0)
6916 obstack_grow (&multilib_obstack, p, strlen (p));
6917
6918 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6919 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
961b7009 6920
0a8d6618
BC
6921 q = multilib_exclusions_raw;
6922 while ((p = *q++) != (char *) 0)
d25a45d4 6923 obstack_grow (&multilib_obstack, p, strlen (p));
0a8d6618
BC
6924
6925 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6926 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
9218435e 6927
e7f49d92
TG
6928 q = multilib_reuse_raw;
6929 while ((p = *q++) != (char *) 0)
6930 obstack_grow (&multilib_obstack, p, strlen (p));
6931
6932 obstack_1grow (&multilib_obstack, 0);
6933 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
6934
961b7009 6935 need_space = FALSE;
742a072a 6936 for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
961b7009
MM
6937 {
6938 if (need_space)
6939 obstack_1grow (&multilib_obstack, ' ');
6940 obstack_grow (&multilib_obstack,
6941 multilib_defaults_raw[i],
6942 strlen (multilib_defaults_raw[i]));
6943 need_space = TRUE;
6944 }
6945
6946 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6947 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
ffd86336 6948 }
742a072a
DM
6949}
6950
6951/* Set up the spec-handling machinery. */
6952
6953void
6954driver::set_up_specs () const
6955{
6956 char *specs_file;
6957 size_t i;
ffd86336 6958
8faf4a68
JW
6959#ifdef INIT_ENVIRONMENT
6960 /* Set up any other necessary machine specific environment variables. */
47d33318 6961 xputenv (INIT_ENVIRONMENT);
8faf4a68
JW
6962#endif
6963
ed1f651b
RS
6964 /* Make a table of what switches there are (switches, n_switches).
6965 Make a table of specified input files (infiles, n_infiles).
6966 Decode switches that are handled locally. */
6967
60cf253a 6968 process_command (decoded_options_count, decoded_options);
ed1f651b
RS
6969
6970 /* Initialize the vector of specs to just the default.
6971 This means one element containing 0s, as a terminator. */
6972
e1e4cdc4 6973 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
703ad42b 6974 memcpy (compilers, default_compilers, sizeof default_compilers);
ed1f651b
RS
6975 n_compilers = n_default_compilers;
6976
6977 /* Read specs from a file if there is one. */
6978
6aa62cff 6979 machine_suffix = concat (spec_machine, dir_separator_str,
d4f2852f
KG
6980 spec_version, dir_separator_str, NULL);
6981 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
ed1f651b 6982
00dcee0c 6983 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
ed1f651b
RS
6984 /* Read the specs file unless it is a default one. */
6985 if (specs_file != 0 && strcmp (specs_file, "specs"))
d168aaee 6986 read_specs (specs_file, true, false);
20df0482
MM
6987 else
6988 init_spec ();
841faeed 6989
5bb67e36 6990 /* We need to check standard_exec_prefix/just_machine_suffix/specs
3ac63d94 6991 for any override of as, ld and libraries. */
e1e4cdc4 6992 specs_file = (char *) alloca (strlen (standard_exec_prefix)
703ad42b 6993 + strlen (just_machine_suffix) + sizeof ("specs"));
5bb67e36
RK
6994
6995 strcpy (specs_file, standard_exec_prefix);
6996 strcat (specs_file, just_machine_suffix);
6997 strcat (specs_file, "specs");
6998 if (access (specs_file, R_OK) == 0)
d168aaee 6999 read_specs (specs_file, true, false);
9218435e 7000
7816bea0
DJ
7001 /* Process any configure-time defaults specified for the command line
7002 options, via OPTION_DEFAULT_SPECS. */
7003 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
7004 do_option_spec (option_default_specs[i].name,
7005 option_default_specs[i].spec);
7006
3bd6d4c4
AO
7007 /* Process DRIVER_SELF_SPECS, adding any new options to the end
7008 of the command line. */
7009
7010 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
7011 do_self_spec (driver_self_specs[i]);
7012
4977bab6
ZW
7013 /* If not cross-compiling, look for executables in the standard
7014 places. */
7015 if (*cross_compile == '0')
004fd4d5 7016 {
2296d164
RK
7017 if (*md_exec_prefix)
7018 {
7019 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
1a5d37a1 7020 PREFIX_PRIORITY_LAST, 0, 0);
2296d164 7021 }
4977bab6
ZW
7022 }
7023
71c0e7fc 7024 /* Process sysroot_suffix_spec. */
e7f13528 7025 if (*sysroot_suffix_spec != 0
28b4fc51 7026 && !no_sysroot_suffix
e7f13528
GP
7027 && do_spec_2 (sysroot_suffix_spec) == 0)
7028 {
9771b263 7029 if (argbuf.length () > 1)
ab532386 7030 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
9771b263
DN
7031 else if (argbuf.length () == 1)
7032 target_sysroot_suffix = xstrdup (argbuf.last ());
e7f13528
GP
7033 }
7034
380e5ca4
MM
7035#ifdef HAVE_LD_SYSROOT
7036 /* Pass the --sysroot option to the linker, if it supports that. If
7037 there is a sysroot_suffix_spec, it has already been processed by
7038 this point, so target_system_root really is the system root we
7039 should be using. */
7040 if (target_system_root)
7041 {
7042 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
7043 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
d168aaee 7044 set_spec ("link", XOBFINISH (&obstack, const char *), false);
380e5ca4
MM
7045 }
7046#endif
7047
71c0e7fc 7048 /* Process sysroot_hdrs_suffix_spec. */
e7f13528 7049 if (*sysroot_hdrs_suffix_spec != 0
28b4fc51 7050 && !no_sysroot_suffix
e7f13528
GP
7051 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
7052 {
9771b263 7053 if (argbuf.length () > 1)
ab532386 7054 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
9771b263
DN
7055 else if (argbuf.length () == 1)
7056 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
e7f13528
GP
7057 }
7058
4977bab6
ZW
7059 /* Look for startfiles in the standard places. */
7060 if (*startfile_prefix_spec != 0
7061 && do_spec_2 (startfile_prefix_spec) == 0
7062 && do_spec_1 (" ", 0, NULL) == 0)
7063 {
5b634ee0 7064 const char *arg;
4977bab6 7065 int ndx;
9771b263 7066 FOR_EACH_VEC_ELT (argbuf, ndx, arg)
5b634ee0 7067 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
1a5d37a1 7068 PREFIX_PRIORITY_LAST, 0, 1);
4977bab6
ZW
7069 }
7070 /* We should eventually get rid of all these and stick to
7071 startfile_prefix_spec exclusively. */
7072 else if (*cross_compile == '0' || target_system_root)
7073 {
2296d164 7074 if (*md_startfile_prefix)
4977bab6 7075 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
1a5d37a1 7076 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
004fd4d5 7077
2296d164 7078 if (*md_startfile_prefix_1)
4977bab6 7079 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
1a5d37a1 7080 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
607a4f7d 7081
4dbc7773
ILT
7082 /* If standard_startfile_prefix is relative, base it on
7083 standard_exec_prefix. This lets us move the installed tree
7084 as a unit. If GCC_EXEC_PREFIX is defined, base
0d037580
DJ
7085 standard_startfile_prefix on that as well.
7086
7087 If the prefix is relative, only search it for native compilers;
7088 otherwise we will search a directory containing host libraries. */
3dce1408 7089 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
4977bab6
ZW
7090 add_sysrooted_prefix (&startfile_prefixes,
7091 standard_startfile_prefix, "BINUTILS",
1a5d37a1 7092 PREFIX_PRIORITY_LAST, 0, 1);
0d037580 7093 else if (*cross_compile == '0')
4dbc7773 7094 {
48ff801b 7095 add_prefix (&startfile_prefixes,
b8698a0f
L
7096 concat (gcc_exec_prefix
7097 ? gcc_exec_prefix : standard_exec_prefix,
7098 machine_suffix,
d4f2852f 7099 standard_startfile_prefix, NULL),
1a5d37a1 7100 NULL, PREFIX_PRIORITY_LAST, 0, 1);
9218435e 7101 }
4dbc7773 7102
f4c0a303
CD
7103 /* Sysrooted prefixes are relocated because target_system_root is
7104 also relocated by gcc_exec_prefix. */
656c7a3a
AL
7105 if (*standard_startfile_prefix_1)
7106 add_sysrooted_prefix (&startfile_prefixes,
7107 standard_startfile_prefix_1, "BINUTILS",
1a5d37a1 7108 PREFIX_PRIORITY_LAST, 0, 1);
656c7a3a
AL
7109 if (*standard_startfile_prefix_2)
7110 add_sysrooted_prefix (&startfile_prefixes,
7111 standard_startfile_prefix_2, "BINUTILS",
1a5d37a1 7112 PREFIX_PRIORITY_LAST, 0, 1);
004fd4d5 7113 }
343f59d9 7114
8607048d
TT
7115 /* Process any user specified specs in the order given on the command
7116 line. */
742a072a 7117 for (struct user_specs *uptr = user_specs_head; uptr; uptr = uptr->next)
8607048d 7118 {
5bbcd587 7119 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
00dcee0c 7120 R_OK, true);
d168aaee 7121 read_specs (filename ? filename : uptr->filename, false, true);
8607048d
TT
7122 }
7123
84f405a1
JJ
7124 /* Process any user self specs. */
7125 {
7126 struct spec_list *sl;
7127 for (sl = specs; sl; sl = sl->next)
7128 if (sl->name_len == sizeof "self_spec" - 1
7129 && !strcmp (sl->name, "self_spec"))
7130 do_self_spec (*sl->ptr_spec);
7131 }
7132
7133 if (compare_debug)
7134 {
7135 enum save_temps save;
7136
7137 if (!compare_debug_second)
7138 {
7139 n_switches_debug_check[1] = n_switches;
7140 n_switches_alloc_debug_check[1] = n_switches_alloc;
7141 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
7142 n_switches_alloc);
7143
7144 do_self_spec ("%:compare-debug-self-opt()");
7145 n_switches_debug_check[0] = n_switches;
7146 n_switches_alloc_debug_check[0] = n_switches_alloc;
7147 switches_debug_check[0] = switches;
7148
7149 n_switches = n_switches_debug_check[1];
7150 n_switches_alloc = n_switches_alloc_debug_check[1];
7151 switches = switches_debug_check[1];
7152 }
7153
7154 /* Avoid crash when computing %j in this early. */
7155 save = save_temps_flag;
7156 save_temps_flag = SAVE_TEMPS_NONE;
7157
7158 compare_debug = -compare_debug;
7159 do_self_spec ("%:compare-debug-self-opt()");
7160
7161 save_temps_flag = save;
7162
7163 if (!compare_debug_second)
7164 {
7165 n_switches_debug_check[1] = n_switches;
7166 n_switches_alloc_debug_check[1] = n_switches_alloc;
7167 switches_debug_check[1] = switches;
7168 compare_debug = -compare_debug;
7169 n_switches = n_switches_debug_check[0];
7170 n_switches_alloc = n_switches_debug_check[0];
7171 switches = switches_debug_check[0];
7172 }
7173 }
7174
7175
e8601ecb
JW
7176 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
7177 if (gcc_exec_prefix)
cb6edbcb
KG
7178 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
7179 spec_version, dir_separator_str, NULL);
004fd4d5 7180
ed1f651b
RS
7181 /* Now we have the specs.
7182 Set the `valid' bits for switches that match anything in any spec. */
7183
7184 validate_all_switches ();
7185
60103a34
DE
7186 /* Now that we have the switches and the specs, set
7187 the subdirectory based on the options. */
7188 set_multilib_dir ();
742a072a
DM
7189}
7190
7191/* Set up to remember the pathname of gcc and any options
7192 needed for collect. We use argv[0] instead of progname because
7193 we need the complete pathname. */
60103a34 7194
742a072a
DM
7195void
7196driver::putenv_COLLECT_GCC (const char *argv0) const
7197{
d7f09764
DN
7198 obstack_init (&collect_obstack);
7199 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
742a072a 7200 obstack_grow (&collect_obstack, argv0, strlen (argv0) + 1);
d7f09764 7201 xputenv (XOBFINISH (&collect_obstack, char *));
742a072a 7202}
d7f09764 7203
742a072a
DM
7204/* Set up to remember the pathname of the lto wrapper. */
7205
7206void
7207driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
7208{
7209 char *lto_wrapper_file;
d7f09764 7210
117cb2bc
JJ
7211 if (have_c)
7212 lto_wrapper_file = NULL;
7213 else
7214 lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
7215 X_OK, false);
de9a793e 7216 if (lto_wrapper_file)
d7f09764 7217 {
3c27ce4c 7218 lto_wrapper_file = convert_white_space (lto_wrapper_file);
de9a793e 7219 lto_wrapper_spec = lto_wrapper_file;
d7f09764
DN
7220 obstack_init (&collect_obstack);
7221 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
7222 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
7223 obstack_grow (&collect_obstack, lto_wrapper_spec,
7224 strlen (lto_wrapper_spec) + 1);
7225 xputenv (XOBFINISH (&collect_obstack, char *));
7226 }
7227
742a072a 7228}
ed1f651b 7229
742a072a
DM
7230/* Reject switches that no pass was interested in. */
7231
7232void
7233driver::handle_unrecognized_options () const
7234{
7235 for (size_t i = 0; (int) i < n_switches; i++)
ab87f8c8 7236 if (! switches[i].validated)
d168aaee 7237 error ("unrecognized command line option %<-%s%>", switches[i].part1);
742a072a 7238}
ed1f651b 7239
742a072a
DM
7240/* Handle the various -print-* options, returning 0 if the driver
7241 should exit, or nonzero if the driver should continue. */
6a9e290e 7242
742a072a
DM
7243int
7244driver::maybe_print_and_exit () const
7245{
2628b9d3
DE
7246 if (print_search_dirs)
7247 {
f4c0a303
CD
7248 printf (_("install: %s%s\n"),
7249 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
7250 gcc_exec_prefix ? "" : machine_suffix);
00dcee0c
AM
7251 printf (_("programs: %s\n"),
7252 build_search_list (&exec_prefixes, "", false, false));
7253 printf (_("libraries: %s\n"),
7254 build_search_list (&startfile_prefixes, "", false, true));
9257393c 7255 return (0);
2628b9d3
DE
7256 }
7257
6a9e290e 7258 if (print_file_name)
2dcb563f 7259 {
6a9e290e 7260 printf ("%s\n", find_file (print_file_name));
9257393c 7261 return (0);
2dcb563f
RS
7262 }
7263
6a9e290e
RK
7264 if (print_prog_name)
7265 {
b78e932d
L
7266 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
7267 {
7268 /* Append USE_LD to to the default linker. */
7269#ifdef DEFAULT_LINKER
7270 char *ld;
7271# ifdef HAVE_HOST_EXECUTABLE_SUFFIX
7272 int len = (sizeof (DEFAULT_LINKER)
7273 - sizeof (HOST_EXECUTABLE_SUFFIX));
7274 ld = NULL;
7275 if (len > 0)
7276 {
7277 char *default_linker = xstrdup (DEFAULT_LINKER);
7278 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
7279 HOST_EXECUTABLE_SUFFIX. */
7280 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
7281 {
7282 default_linker[len] = '\0';
7283 ld = concat (default_linker, use_ld,
7284 HOST_EXECUTABLE_SUFFIX, NULL);
7285 }
7286 }
7287 if (ld == NULL)
7288# endif
7289 ld = concat (DEFAULT_LINKER, use_ld, NULL);
7290 if (access (ld, X_OK) == 0)
7291 {
7292 printf ("%s\n", ld);
7293 return (0);
7294 }
7295#endif
7296 print_prog_name = concat (print_prog_name, use_ld, NULL);
7297 }
5bbcd587 7298 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6a9e290e 7299 printf ("%s\n", (newname ? newname : print_prog_name));
9257393c 7300 return (0);
6a9e290e 7301 }
ed1f651b 7302
60103a34
DE
7303 if (print_multi_lib)
7304 {
7305 print_multilib_info ();
9257393c 7306 return (0);
60103a34
DE
7307 }
7308
7309 if (print_multi_directory)
7310 {
7311 if (multilib_dir == NULL)
7312 printf (".\n");
7313 else
7314 printf ("%s\n", multilib_dir);
9257393c 7315 return (0);
60103a34
DE
7316 }
7317
e0cdc09f
MK
7318 if (print_multiarch)
7319 {
7320 if (multiarch_dir == NULL)
7321 printf ("\n");
7322 else
7323 printf ("%s\n", multiarch_dir);
7324 return (0);
7325 }
7326
3def1397
VP
7327 if (print_sysroot)
7328 {
7329 if (target_system_root)
7330 {
7331 if (target_sysroot_suffix)
7332 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
7333 else
7334 printf ("%s\n", target_system_root);
7335 }
7336 return (0);
7337 }
7338
5bbcd587
JJ
7339 if (print_multi_os_directory)
7340 {
7341 if (multilib_os_dir == NULL)
7342 printf (".\n");
7343 else
7344 printf ("%s\n", multilib_os_dir);
7345 return (0);
7346 }
7347
14da6073
JM
7348 if (print_sysroot_headers_suffix)
7349 {
7350 if (*sysroot_hdrs_suffix_spec)
7351 {
dc5bbad3
JM
7352 printf("%s\n", (target_sysroot_hdrs_suffix
7353 ? target_sysroot_hdrs_suffix
7354 : ""));
14da6073
JM
7355 return (0);
7356 }
7357 else
7358 /* The error status indicates that only one set of fixed
7359 headers should be built. */
2dec80c7 7360 fatal_error ("not configured with sysroot headers suffix");
14da6073
JM
7361 }
7362
b8468bc7
NC
7363 if (print_help_list)
7364 {
7365 display_help ();
7366
7367 if (! verbose_flag)
7368 {
5e4adfba 7369 printf (_("\nFor bug reporting instructions, please see:\n"));
a976603e 7370 printf ("%s.\n", bug_report_url);
9218435e 7371
9257393c 7372 return (0);
b8468bc7
NC
7373 }
7374
7375 /* We do not exit here. Instead we have created a fake input file
7376 called 'help-dummy' which needs to be compiled, and we pass this
033505fc
RW
7377 on the various sub-processes, along with the --help switch.
7378 Ensure their output appears after ours. */
7379 fputc ('\n', stdout);
7380 fflush (stdout);
b8468bc7 7381 }
9218435e 7382
41fd0f9b
RAE
7383 if (print_version)
7384 {
6afbc885 7385 printf (_("%s %s%s\n"), progname, pkgversion_string,
41fd0f9b 7386 version_string);
98db73df 7387 printf ("Copyright %s 2014 Free Software Foundation, Inc.\n",
41fd0f9b
RAE
7388 _("(C)"));
7389 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
7390warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
7391 stdout);
7392 if (! verbose_flag)
7393 return 0;
7394
7395 /* We do not exit here. We use the same mechanism of --help to print
7396 the version of the sub-processes. */
7397 fputc ('\n', stdout);
7398 fflush (stdout);
7399 }
7400
ed1f651b
RS
7401 if (verbose_flag)
7402 {
dc10fd96 7403 print_configuration (stderr);
ed1f651b 7404 if (n_infiles == 0)
9257393c 7405 return (0);
ed1f651b
RS
7406 }
7407
742a072a
DM
7408 return 1;
7409}
7410
7411/* Figure out what to do with each input file.
7412 Return true if we need to exit early from "main", false otherwise. */
7413
7414bool
7415driver::prepare_infiles ()
7416{
7417 size_t i;
7418 int lang_n_infiles = 0;
7419
a2a05b0a 7420 if (n_infiles == added_libraries)
2dec80c7 7421 fatal_error ("no input files");
ed1f651b 7422
4df47bca 7423 if (seen_error ())
742a072a
DM
7424 /* Early exit needed from main. */
7425 return true;
4df47bca 7426
ed1f651b
RS
7427 /* Make a place to record the compiler output file names
7428 that correspond to the input files. */
7429
f271358e 7430 i = n_infiles;
e37cda9b 7431 i += lang_specific_extra_outfiles;
5ed6ace5 7432 outfiles = XCNEWVEC (const char *, i);
ed1f651b
RS
7433
7434 /* Record which files were specified explicitly as link input. */
7435
d900f77d 7436 explicit_link_files = XCNEWVEC (char, n_infiles);
ed1f651b 7437
56b721c5 7438 combine_inputs = have_o || flag_wpa;
0855eab7
CT
7439
7440 for (i = 0; (int) i < n_infiles; i++)
d1bd0ded 7441 {
0855eab7 7442 const char *name = infiles[i].name;
7904f95f
EC
7443 struct compiler *compiler = lookup_compiler (name,
7444 strlen (name),
0855eab7 7445 infiles[i].language);
7904f95f 7446
0855eab7
CT
7447 if (compiler && !(compiler->combinable))
7448 combine_inputs = false;
7904f95f 7449
0855eab7
CT
7450 if (lang_n_infiles > 0 && compiler != input_file_compiler
7451 && infiles[i].language && infiles[i].language[0] != '*')
7452 infiles[i].incompiler = compiler;
7453 else if (compiler)
7454 {
7455 lang_n_infiles++;
7456 input_file_compiler = compiler;
7457 infiles[i].incompiler = compiler;
7458 }
7459 else
7460 {
7461 /* Since there is no compiler for this input file, assume it is a
9cf737f8 7462 linker file. */
0855eab7
CT
7463 explicit_link_files[i] = 1;
7464 infiles[i].incompiler = NULL;
7465 }
7466 infiles[i].compiled = false;
7467 infiles[i].preprocessed = false;
d1bd0ded 7468 }
953ff289 7469
de19a50e 7470 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
c3224d6f 7471 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
0855eab7 7472
742a072a
DM
7473 /* No early exit needed from main; we can continue. */
7474 return false;
7475}
7476
7477/* Run the spec machinery on each input file. */
7478
7479void
7480driver::do_spec_on_infiles () const
7481{
7482 size_t i;
7483
0855eab7 7484 for (i = 0; (int) i < n_infiles; i++)
ed1f651b 7485 {
ed1f651b
RS
7486 int this_file_error = 0;
7487
7488 /* Tell do_spec what to substitute for %i. */
7489
ed1f651b 7490 input_file_number = i;
512b62fb 7491 set_input (infiles[i].name);
ed1f651b 7492
0855eab7
CT
7493 if (infiles[i].compiled)
7494 continue;
7495
ed1f651b
RS
7496 /* Use the same thing in %o, unless cp->spec says otherwise. */
7497
6afbc885 7498 outfiles[i] = gcc_input_filename;
ed1f651b
RS
7499
7500 /* Figure out which compiler from the file's suffix. */
7501
c3224d6f
RG
7502 input_file_compiler
7503 = lookup_compiler (infiles[i].name, input_filename_length,
7504 infiles[i].language);
589005ff 7505
a9374841 7506 if (input_file_compiler)
ed1f651b
RS
7507 {
7508 /* Ok, we found an applicable compiler. Run its spec. */
ed1f651b 7509
a9374841 7510 if (input_file_compiler->spec[0] == '#')
d644be7b
ZW
7511 {
7512 error ("%s: %s compiler not installed on this system",
6afbc885 7513 gcc_input_filename, &input_file_compiler->spec[1]);
d644be7b
ZW
7514 this_file_error = 1;
7515 }
7516 else
7517 {
742a072a
DM
7518 int value;
7519
2153915d
AO
7520 if (compare_debug)
7521 {
04695783 7522 free (debug_check_temp_file[0]);
2153915d
AO
7523 debug_check_temp_file[0] = NULL;
7524
04695783 7525 free (debug_check_temp_file[1]);
2153915d
AO
7526 debug_check_temp_file[1] = NULL;
7527 }
7528
d644be7b 7529 value = do_spec (input_file_compiler->spec);
0855eab7 7530 infiles[i].compiled = true;
d644be7b 7531 if (value < 0)
b21292d0 7532 this_file_error = 1;
2153915d
AO
7533 else if (compare_debug && debug_check_temp_file[0])
7534 {
7535 if (verbose_flag)
2dec80c7 7536 inform (0, "recompiling with -fcompare-debug");
2153915d
AO
7537
7538 compare_debug = -compare_debug;
7539 n_switches = n_switches_debug_check[1];
efe5e5a0 7540 n_switches_alloc = n_switches_alloc_debug_check[1];
2153915d
AO
7541 switches = switches_debug_check[1];
7542
7543 value = do_spec (input_file_compiler->spec);
7544
7545 compare_debug = -compare_debug;
7546 n_switches = n_switches_debug_check[0];
efe5e5a0 7547 n_switches_alloc = n_switches_alloc_debug_check[0];
2153915d
AO
7548 switches = switches_debug_check[0];
7549
7550 if (value < 0)
7551 {
7552 error ("during -fcompare-debug recompilation");
7553 this_file_error = 1;
7554 }
7555
7556 gcc_assert (debug_check_temp_file[1]
ba78087b
KT
7557 && filename_cmp (debug_check_temp_file[0],
7558 debug_check_temp_file[1]));
2153915d
AO
7559
7560 if (verbose_flag)
2dec80c7 7561 inform (0, "comparing final insns dumps");
2153915d
AO
7562
7563 if (compare_files (debug_check_temp_file))
7564 this_file_error = 1;
7565 }
7566
7567 if (compare_debug)
7568 {
04695783 7569 free (debug_check_temp_file[0]);
2153915d
AO
7570 debug_check_temp_file[0] = NULL;
7571
04695783 7572 free (debug_check_temp_file[1]);
2153915d
AO
7573 debug_check_temp_file[1] = NULL;
7574 }
d644be7b 7575 }
ed1f651b
RS
7576 }
7577
7578 /* If this file's name does not contain a recognized suffix,
7579 record it as explicit linker input. */
7580
7581 else
7582 explicit_link_files[i] = 1;
7583
7584 /* Clear the delete-on-failure queue, deleting the files in it
7585 if this compilation failed. */
7586
7587 if (this_file_error)
7588 {
7589 delete_failure_queue ();
6afbc885 7590 errorcount++;
ed1f651b
RS
7591 }
7592 /* If this compilation succeeded, don't delete those files later. */
7593 clear_failure_queue ();
7594 }
7595
817a8255
EC
7596 /* Reset the input file name to the first compile/object file name, for use
7597 with %b in LINK_SPEC. We use the first input file that we can find
7904f95f 7598 a compiler to compile it instead of using infiles.language since for
817a8255 7599 languages other than C we use aliases that we then lookup later. */
512b62fb 7600 if (n_infiles > 0)
817a8255
EC
7601 {
7602 int i;
7603
7604 for (i = 0; i < n_infiles ; i++)
42113d6b
RG
7605 if (infiles[i].incompiler
7606 || (infiles[i].language && infiles[i].language[0] != '*'))
817a8255
EC
7607 {
7608 set_input (infiles[i].name);
7609 break;
7610 }
7611 }
512b62fb 7612
6afbc885 7613 if (!seen_error ())
15c5edb9
TT
7614 {
7615 /* Make sure INPUT_FILE_NUMBER points to first available open
7616 slot. */
7617 input_file_number = n_infiles;
7618 if (lang_specific_pre_link ())
6afbc885 7619 errorcount++;
15c5edb9 7620 }
742a072a
DM
7621}
7622
7623/* If we have to run the linker, do it now. */
7624
7625void
7626driver::maybe_run_linker (const char *argv0) const
7627{
7628 size_t i;
7629 int linker_was_run = 0;
7630 int num_linker_inputs;
f271358e 7631
17211ab5
GK
7632 /* Determine if there are any linker input files. */
7633 num_linker_inputs = 0;
7634 for (i = 0; (int) i < n_infiles; i++)
7635 if (explicit_link_files[i] || outfiles[i] != NULL)
7636 num_linker_inputs++;
7637
ed1f651b
RS
7638 /* Run ld to link all the compiler output files. */
7639
6afbc885 7640 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
ed1f651b
RS
7641 {
7642 int tmp = execution_count;
117cb2bc
JJ
7643
7644 if (! have_c)
7645 {
55b46574
RO
7646#if HAVE_LTO_PLUGIN > 0
7647#if HAVE_LTO_PLUGIN == 2
117cb2bc 7648 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
96bdf9b4 7649#else
117cb2bc 7650 const char *fuse_linker_plugin = "fuse-linker-plugin";
55b46574 7651#endif
96bdf9b4 7652#endif
b3865ca9 7653
117cb2bc
JJ
7654 /* We'll use ld if we can't find collect2. */
7655 if (! strcmp (linker_name_spec, "collect2"))
7656 {
7657 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7658 if (s == NULL)
7659 linker_name_spec = "ld";
7660 }
d7f09764 7661
55b46574
RO
7662#if HAVE_LTO_PLUGIN > 0
7663#if HAVE_LTO_PLUGIN == 2
117cb2bc
JJ
7664 if (!switch_matches (fno_use_linker_plugin,
7665 fno_use_linker_plugin
7666 + strlen (fno_use_linker_plugin), 0))
96bdf9b4 7667#else
117cb2bc
JJ
7668 if (switch_matches (fuse_linker_plugin,
7669 fuse_linker_plugin
7670 + strlen (fuse_linker_plugin), 0))
96bdf9b4 7671#endif
117cb2bc 7672 {
3c27ce4c
JY
7673 char *temp_spec = find_a_file (&exec_prefixes,
7674 LTOPLUGINSONAME, R_OK,
7675 false);
7676 if (!temp_spec)
117cb2bc
JJ
7677 fatal_error ("-fuse-linker-plugin, but %s not found",
7678 LTOPLUGINSONAME);
3c27ce4c 7679 linker_plugin_file_spec = convert_white_space (temp_spec);
117cb2bc 7680 }
55b46574 7681#endif
742a072a 7682 lto_gcc_spec = argv0;
117cb2bc 7683 }
d7f09764 7684
b3865ca9
RS
7685 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7686 for collect. */
00dcee0c
AM
7687 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7688 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
b3865ca9 7689
a0f87454
RS
7690 if (print_subprocess_help == 1)
7691 {
7692 printf (_("\nLinker options\n==============\n\n"));
7693 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7694 " to the linker.\n\n"));
7695 fflush (stdout);
7696 }
742a072a 7697 int value = do_spec (link_command_spec);
ed1f651b 7698 if (value < 0)
6afbc885 7699 errorcount = 1;
ed1f651b
RS
7700 linker_was_run = (tmp != execution_count);
7701 }
7702
ed1f651b
RS
7703 /* If options said don't run linker,
7704 complain about input files to be given to the linker. */
7705
6afbc885 7706 if (! linker_was_run && !seen_error ())
d25a45d4 7707 for (i = 0; (int) i < n_infiles; i++)
01e4dd0d
KH
7708 if (explicit_link_files[i]
7709 && !(infiles[i].language && infiles[i].language[0] == '*'))
2dec80c7
JM
7710 warning (0, "%s: linker input file unused because linking not done",
7711 outfiles[i]);
742a072a
DM
7712}
7713
7714/* The end of "main". */
ed1f651b 7715
742a072a
DM
7716void
7717driver::final_actions () const
7718{
ed1f651b
RS
7719 /* Delete some or all of the temporary files we made. */
7720
6afbc885 7721 if (seen_error ())
ed1f651b
RS
7722 delete_failure_queue ();
7723 delete_temp_files ();
7724
b8468bc7
NC
7725 if (print_help_list)
7726 {
5e4adfba 7727 printf (("\nFor bug reporting instructions, please see:\n"));
a976603e 7728 printf ("%s\n", bug_report_url);
b8468bc7 7729 }
742a072a 7730}
9218435e 7731
742a072a
DM
7732/* Determine what the exit code of the driver should be. */
7733
7734int
7735driver::get_exit_code () const
7736{
14a774a9 7737 return (signal_count != 0 ? 2
6afbc885 7738 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
14a774a9 7739 : 0);
ed1f651b
RS
7740}
7741
7742/* Find the proper compilation spec for the file name NAME,
004fd4d5 7743 whose length is LENGTH. LANGUAGE is the specified language,
e5e809f4 7744 or 0 if this file is to be passed to the linker. */
ed1f651b
RS
7745
7746static struct compiler *
1d088dee 7747lookup_compiler (const char *name, size_t length, const char *language)
ed1f651b
RS
7748{
7749 struct compiler *cp;
7750
3ac63d94 7751 /* If this was specified by the user to be a linker input, indicate that. */
e5e809f4
JL
7752 if (language != 0 && language[0] == '*')
7753 return 0;
7754
7755 /* Otherwise, look for the language, if one is spec'd. */
ed1f651b
RS
7756 if (language != 0)
7757 {
7758 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
e5e809f4
JL
7759 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7760 return cp;
7761
ed1f651b 7762 error ("language %s not recognized", language);
e5e809f4 7763 return 0;
ed1f651b
RS
7764 }
7765
7766 /* Look for a suffix. */
7767 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7768 {
4cf3301c
RS
7769 if (/* The suffix `-' matches only the file name `-'. */
7770 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
e5e809f4
JL
7771 || (strlen (cp->suffix) < length
7772 /* See if the suffix matches the end of NAME. */
e5e809f4
JL
7773 && !strcmp (cp->suffix,
7774 name + length - strlen (cp->suffix))
e5e809f4 7775 ))
589005ff 7776 break;
03bf1c28 7777 }
e5e809f4 7778
03bf1c28 7779#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
a1105617 7780 /* Look again, but case-insensitively this time. */
03bf1c28
MK
7781 if (cp < compilers)
7782 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7783 {
7784 if (/* The suffix `-' matches only the file name `-'. */
7785 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7786 || (strlen (cp->suffix) < length
7787 /* See if the suffix matches the end of NAME. */
7788 && ((!strcmp (cp->suffix,
7789 name + length - strlen (cp->suffix))
7790 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7791 && !strcasecmp (cp->suffix,
7792 name + length - strlen (cp->suffix)))
7793 ))
7794 break;
7795 }
7796#endif
7797
03bf1c28
MK
7798 if (cp >= compilers)
7799 {
ea414c97
ZW
7800 if (cp->spec[0] != '@')
7801 /* A non-alias entry: return it. */
7802 return cp;
9218435e 7803
ea414c97
ZW
7804 /* An alias entry maps a suffix to a language.
7805 Search for the language; pass 0 for NAME and LENGTH
7806 to avoid infinite recursion if language not found. */
6496a589 7807 return lookup_compiler (NULL, 0, cp->spec + 1);
ed1f651b 7808 }
ed1f651b
RS
7809 return 0;
7810}
7811\f
ed1f651b 7812static char *
1d088dee 7813save_string (const char *s, int len)
ed1f651b 7814{
5ed6ace5 7815 char *result = XNEWVEC (char, len + 1);
ed1f651b 7816
da61dec9 7817 memcpy (result, s, len);
ed1f651b
RS
7818 result[len] = 0;
7819 return result;
7820}
7821
d991c721 7822void
1d088dee 7823pfatal_with_name (const char *name)
ed1f651b 7824{
ab87f8c8
JL
7825 perror_with_name (name);
7826 delete_temp_files ();
7827 exit (1);
ed1f651b
RS
7828}
7829
7830static void
1d088dee 7831perror_with_name (const char *name)
ed1f651b 7832{
bdc6b402 7833 error ("%s: %m", name);
ed1f651b 7834}
ed1f651b 7835\f
4977bab6 7836static inline void
d168aaee 7837validate_switches_from_spec (const char *spec, bool user)
4977bab6
ZW
7838{
7839 const char *p = spec;
7840 char c;
7841 while ((c = *p++))
7842 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7843 /* We have a switch spec. */
d168aaee 7844 p = validate_switches (p + 1, user);
4977bab6
ZW
7845}
7846
ed1f651b 7847static void
1d088dee 7848validate_all_switches (void)
ed1f651b
RS
7849{
7850 struct compiler *comp;
b3865ca9 7851 struct spec_list *spec;
ed1f651b 7852
ea414c97 7853 for (comp = compilers; comp->spec; comp++)
d168aaee 7854 validate_switches_from_spec (comp->spec, false);
ed1f651b 7855
3ac63d94 7856 /* Look through the linked list of specs read from the specs file. */
d25a45d4 7857 for (spec = specs; spec; spec = spec->next)
d168aaee 7858 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
b3865ca9 7859
d168aaee 7860 validate_switches_from_spec (link_command_spec, false);
ed1f651b
RS
7861}
7862
7863/* Look at the switch-name that comes after START
7864 and mark as valid all supplied switches that match it. */
7865
4977bab6 7866static const char *
d168aaee 7867validate_switches (const char *start, bool user_spec)
ed1f651b 7868{
b3694847 7869 const char *p = start;
4977bab6
ZW
7870 const char *atom;
7871 size_t len;
b3694847 7872 int i;
4977bab6
ZW
7873 bool suffix = false;
7874 bool starred = false;
1d088dee 7875
4977bab6 7876#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
1d088dee 7877
10ebf5fe 7878next_member:
4977bab6
ZW
7879 SKIP_WHITE ();
7880
ed1f651b 7881 if (*p == '!')
4977bab6 7882 p++;
ed1f651b 7883
4977bab6 7884 SKIP_WHITE ();
48137d59 7885 if (*p == '.' || *p == ',')
4977bab6 7886 suffix = true, p++;
ed1f651b 7887
4977bab6
ZW
7888 atom = p;
7889 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7a975113 7890 || *p == ',' || *p == '.' || *p == '@')
d25a45d4 7891 p++;
4977bab6 7892 len = p - atom;
ed1f651b 7893
4977bab6
ZW
7894 if (*p == '*')
7895 starred = true, p++;
7896
7897 SKIP_WHITE ();
7898
7899 if (!suffix)
ed1f651b
RS
7900 {
7901 /* Mark all matching switches as valid. */
ed1f651b 7902 for (i = 0; i < n_switches; i++)
4977bab6 7903 if (!strncmp (switches[i].part1, atom, len)
d168aaee
CB
7904 && (starred || switches[i].part1[len] == '\0')
7905 && (switches[i].known || user_spec))
7906 switches[i].validated = true;
ed1f651b 7907 }
4977bab6 7908
5a0ba8c9
LJR
7909 if (*p) p++;
7910 if (*p && (p[-1] == '|' || p[-1] == '&'))
4977bab6
ZW
7911 goto next_member;
7912
5a0ba8c9 7913 if (*p && p[-1] == ':')
ed1f651b 7914 {
4977bab6 7915 while (*p && *p != ';' && *p != '}')
ed1f651b 7916 {
4977bab6
ZW
7917 if (*p == '%')
7918 {
7919 p++;
7920 if (*p == '{' || *p == '<')
d168aaee 7921 p = validate_switches (p+1, user_spec);
4977bab6 7922 else if (p[0] == 'W' && p[1] == '{')
d168aaee 7923 p = validate_switches (p+2, user_spec);
4977bab6 7924 }
e17aafd1
GK
7925 else
7926 p++;
ed1f651b 7927 }
4977bab6 7928
5a0ba8c9
LJR
7929 if (*p) p++;
7930 if (*p && p[-1] == ';')
4977bab6 7931 goto next_member;
ed1f651b 7932 }
10ebf5fe 7933
4977bab6
ZW
7934 return p;
7935#undef SKIP_WHITE
ed1f651b 7936}
60103a34 7937\f
5bbcd587
JJ
7938struct mdswitchstr
7939{
7940 const char *str;
7941 int len;
7942};
7943
7944static struct mdswitchstr *mdswitches;
7945static int n_mdswitches;
7946
961b7009 7947/* Check whether a particular argument was used. The first time we
956d6950 7948 canonicalize the switches to keep only the ones we care about. */
60103a34
DE
7949
7950static int
1d088dee 7951used_arg (const char *p, int len)
60103a34 7952{
3ac63d94
NC
7953 struct mswitchstr
7954 {
3b304f5b
ZW
7955 const char *str;
7956 const char *replace;
961b7009
MM
7957 int len;
7958 int rep_len;
7959 };
7960
7961 static struct mswitchstr *mswitches;
7962 static int n_mswitches;
7963 int i, j;
7964
7965 if (!mswitches)
7966 {
7967 struct mswitchstr *matches;
3b304f5b 7968 const char *q;
c8c2dcdc 7969 int cnt = 0;
961b7009 7970
d25a45d4
KH
7971 /* Break multilib_matches into the component strings of string
7972 and replacement string. */
1a0bdd29
RK
7973 for (q = multilib_matches; *q != '\0'; q++)
7974 if (*q == ';')
961b7009
MM
7975 cnt++;
7976
e1e4cdc4
KG
7977 matches
7978 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
961b7009
MM
7979 i = 0;
7980 q = multilib_matches;
7981 while (*q != '\0')
7982 {
7983 matches[i].str = q;
7984 while (*q != ' ')
7985 {
7986 if (*q == '\0')
3b5edfee
NS
7987 {
7988 invalid_matches:
bdc6b402 7989 fatal_error ("multilib spec %qs is invalid",
2dec80c7 7990 multilib_matches);
3b5edfee 7991 }
961b7009
MM
7992 q++;
7993 }
961b7009 7994 matches[i].len = q - matches[i].str;
60103a34 7995
961b7009
MM
7996 matches[i].replace = ++q;
7997 while (*q != ';' && *q != '\0')
7998 {
7999 if (*q == ' ')
3b5edfee 8000 goto invalid_matches;
961b7009
MM
8001 q++;
8002 }
8003 matches[i].rep_len = q - matches[i].replace;
8004 i++;
83a0c799
ZW
8005 if (*q == ';')
8006 q++;
961b7009 8007 }
60103a34 8008
71591a1d
JW
8009 /* Now build a list of the replacement string for switches that we care
8010 about. Make sure we allocate at least one entry. This prevents
8011 xmalloc from calling fatal, and prevents us from re-executing this
8012 block of code. */
8013 mswitches
5ed6ace5 8014 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
961b7009 8015 for (i = 0; i < n_switches; i++)
3371362c 8016 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
f645e2bd
RS
8017 {
8018 int xlen = strlen (switches[i].part1);
8019 for (j = 0; j < cnt; j++)
8020 if (xlen == matches[j].len
8021 && ! strncmp (switches[i].part1, matches[j].str, xlen))
8022 {
8023 mswitches[n_mswitches].str = matches[j].replace;
8024 mswitches[n_mswitches].len = matches[j].rep_len;
8025 mswitches[n_mswitches].replace = (char *) 0;
8026 mswitches[n_mswitches].rep_len = 0;
8027 n_mswitches++;
8028 break;
8029 }
8030 }
5bbcd587
JJ
8031
8032 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
8033 on the command line nor any options mutually incompatible with
8034 them. */
8035 for (i = 0; i < n_mdswitches; i++)
8036 {
8037 const char *r;
8038
59b266b1 8039 for (q = multilib_options; *q != '\0'; *q && q++)
5bbcd587
JJ
8040 {
8041 while (*q == ' ')
8042 q++;
8043
8044 r = q;
8045 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
8046 || strchr (" /", q[mdswitches[i].len]) == NULL)
8047 {
8048 while (*q != ' ' && *q != '/' && *q != '\0')
8049 q++;
8050 if (*q != '/')
8051 break;
8052 q++;
8053 }
8054
8055 if (*q != ' ' && *q != '\0')
8056 {
8057 while (*r != ' ' && *r != '\0')
8058 {
8059 q = r;
8060 while (*q != ' ' && *q != '/' && *q != '\0')
8061 q++;
8062
8063 if (used_arg (r, q - r))
8064 break;
8065
8066 if (*q != '/')
8067 {
8068 mswitches[n_mswitches].str = mdswitches[i].str;
8069 mswitches[n_mswitches].len = mdswitches[i].len;
8070 mswitches[n_mswitches].replace = (char *) 0;
8071 mswitches[n_mswitches].rep_len = 0;
8072 n_mswitches++;
8073 break;
8074 }
8075
8076 r = q + 1;
8077 }
8078 break;
8079 }
8080 }
8081 }
961b7009 8082 }
03c42484 8083
961b7009
MM
8084 for (i = 0; i < n_mswitches; i++)
8085 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
8086 return 1;
03c42484 8087
961b7009
MM
8088 return 0;
8089}
03c42484
RK
8090
8091static int
1d088dee 8092default_arg (const char *p, int len)
03c42484 8093{
5bbcd587 8094 int i;
e29ef920 8095
5bbcd587
JJ
8096 for (i = 0; i < n_mdswitches; i++)
8097 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
8098 return 1;
03c42484
RK
8099
8100 return 0;
8101}
8102
0a8d6618
BC
8103/* Work out the subdirectory to use based on the options. The format of
8104 multilib_select is a list of elements. Each element is a subdirectory
8105 name followed by a list of options followed by a semicolon. The format
8106 of multilib_exclusions is the same, but without the preceding
8107 directory. First gcc will check the exclusions, if none of the options
8108 beginning with an exclamation point are present, and all of the other
8109 options are present, then we will ignore this completely. Passing
8110 that, gcc will consider each multilib_select in turn using the same
8111 rules for matching the options. If a match is found, that subdirectory
e0cdc09f
MK
8112 will be used.
8113 A subdirectory name is optionally followed by a colon and the corresponding
8114 multiarch name. */
60103a34
DE
8115
8116static void
1d088dee 8117set_multilib_dir (void)
60103a34 8118{
3b304f5b 8119 const char *p;
3ac63d94 8120 unsigned int this_path_len;
3b304f5b 8121 const char *this_path, *this_arg;
5bbcd587 8122 const char *start, *end;
03c42484 8123 int not_arg;
5bbcd587
JJ
8124 int ok, ndfltok, first;
8125
8126 n_mdswitches = 0;
8127 start = multilib_defaults;
8128 while (*start == ' ' || *start == '\t')
8129 start++;
8130 while (*start != '\0')
8131 {
8132 n_mdswitches++;
8133 while (*start != ' ' && *start != '\t' && *start != '\0')
8134 start++;
8135 while (*start == ' ' || *start == '\t')
8136 start++;
8137 }
8138
8139 if (n_mdswitches)
8140 {
8141 int i = 0;
8142
5ed6ace5 8143 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
5bbcd587
JJ
8144 for (start = multilib_defaults; *start != '\0'; start = end + 1)
8145 {
8146 while (*start == ' ' || *start == '\t')
8147 start++;
8148
8149 if (*start == '\0')
8150 break;
1d088dee 8151
5bbcd587
JJ
8152 for (end = start + 1;
8153 *end != ' ' && *end != '\t' && *end != '\0'; end++)
8154 ;
8155
8156 obstack_grow (&multilib_obstack, start, end - start);
8157 obstack_1grow (&multilib_obstack, 0);
7973fd2a 8158 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
5bbcd587
JJ
8159 mdswitches[i++].len = end - start;
8160
8161 if (*end == '\0')
8162 break;
8163 }
8164 }
60103a34 8165
0a8d6618
BC
8166 p = multilib_exclusions;
8167 while (*p != '\0')
8168 {
8169 /* Ignore newlines. */
8170 if (*p == '\n')
d25a45d4
KH
8171 {
8172 ++p;
8173 continue;
8174 }
0a8d6618
BC
8175
8176 /* Check the arguments. */
8177 ok = 1;
8178 while (*p != ';')
d25a45d4
KH
8179 {
8180 if (*p == '\0')
3b5edfee
NS
8181 {
8182 invalid_exclusions:
bdc6b402 8183 fatal_error ("multilib exclusions %qs is invalid",
2dec80c7 8184 multilib_exclusions);
3b5edfee 8185 }
d25a45d4
KH
8186
8187 if (! ok)
8188 {
8189 ++p;
8190 continue;
8191 }
8192
8193 this_arg = p;
8194 while (*p != ' ' && *p != ';')
8195 {
8196 if (*p == '\0')
3b5edfee 8197 goto invalid_exclusions;
d25a45d4
KH
8198 ++p;
8199 }
8200
8201 if (*this_arg != '!')
8202 not_arg = 0;
8203 else
8204 {
8205 not_arg = 1;
8206 ++this_arg;
8207 }
9218435e 8208
0a8d6618
BC
8209 ok = used_arg (this_arg, p - this_arg);
8210 if (not_arg)
8211 ok = ! ok;
8212
d25a45d4
KH
8213 if (*p == ' ')
8214 ++p;
8215 }
0a8d6618
BC
8216
8217 if (ok)
3ac63d94 8218 return;
0a8d6618
BC
8219
8220 ++p;
8221 }
8222
5bbcd587 8223 first = 1;
0a8d6618 8224 p = multilib_select;
e7f49d92
TG
8225
8226 /* Append multilib reuse rules if any. With those rules, we can reuse
8227 one multilib for certain different options sets. */
8228 if (strlen (multilib_reuse) > 0)
8229 p = concat (p, multilib_reuse, NULL);
8230
60103a34
DE
8231 while (*p != '\0')
8232 {
8233 /* Ignore newlines. */
8234 if (*p == '\n')
8235 {
8236 ++p;
8237 continue;
8238 }
8239
8240 /* Get the initial path. */
8241 this_path = p;
8242 while (*p != ' ')
8243 {
8244 if (*p == '\0')
3b5edfee
NS
8245 {
8246 invalid_select:
e7f49d92
TG
8247 fatal_error ("multilib select %qs %qs is invalid",
8248 multilib_select, multilib_reuse);
3b5edfee 8249 }
60103a34
DE
8250 ++p;
8251 }
8252 this_path_len = p - this_path;
8253
8254 /* Check the arguments. */
03c42484 8255 ok = 1;
5bbcd587 8256 ndfltok = 1;
60103a34
DE
8257 ++p;
8258 while (*p != ';')
8259 {
8260 if (*p == '\0')
3b5edfee 8261 goto invalid_select;
60103a34 8262
03c42484 8263 if (! ok)
60103a34
DE
8264 {
8265 ++p;
8266 continue;
8267 }
8268
8269 this_arg = p;
8270 while (*p != ' ' && *p != ';')
8271 {
8272 if (*p == '\0')
3b5edfee 8273 goto invalid_select;
60103a34
DE
8274 ++p;
8275 }
8276
03c42484
RK
8277 if (*this_arg != '!')
8278 not_arg = 0;
60103a34 8279 else
03c42484
RK
8280 {
8281 not_arg = 1;
8282 ++this_arg;
8283 }
8284
8285 /* If this is a default argument, we can just ignore it.
8286 This is true even if this_arg begins with '!'. Beginning
8287 with '!' does not mean that this argument is necessarily
8288 inappropriate for this library: it merely means that
8289 there is a more specific library which uses this
8290 argument. If this argument is a default, we need not
8291 consider that more specific library. */
5bbcd587
JJ
8292 ok = used_arg (this_arg, p - this_arg);
8293 if (not_arg)
8294 ok = ! ok;
8295
8296 if (! ok)
8297 ndfltok = 0;
8298
8299 if (default_arg (this_arg, p - this_arg))
8300 ok = 1;
60103a34
DE
8301
8302 if (*p == ' ')
8303 ++p;
8304 }
8305
5bbcd587 8306 if (ok && first)
60103a34
DE
8307 {
8308 if (this_path_len != 1
8309 || this_path[0] != '.')
8310 {
5ed6ace5 8311 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
5bbcd587
JJ
8312 char *q;
8313
878f32c3
KG
8314 strncpy (new_multilib_dir, this_path, this_path_len);
8315 new_multilib_dir[this_path_len] = '\0';
5bbcd587
JJ
8316 q = strchr (new_multilib_dir, ':');
8317 if (q != NULL)
8318 *q = '\0';
878f32c3 8319 multilib_dir = new_multilib_dir;
60103a34 8320 }
5bbcd587
JJ
8321 first = 0;
8322 }
8323
8324 if (ndfltok)
8325 {
8326 const char *q = this_path, *end = this_path + this_path_len;
8327
8328 while (q < end && *q != ':')
8329 q++;
c49d2df6 8330 if (q < end)
5bbcd587 8331 {
e0cdc09f
MK
8332 const char *q2 = q + 1, *ml_end = end;
8333 char *new_multilib_os_dir;
8334
8335 while (q2 < end && *q2 != ':')
8336 q2++;
8337 if (*q2 == ':')
8338 ml_end = q2;
646d1bed
PG
8339 if (ml_end - q == 1)
8340 multilib_os_dir = xstrdup (".");
8341 else
8342 {
8343 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
8344 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
8345 new_multilib_os_dir[ml_end - q - 1] = '\0';
8346 multilib_os_dir = new_multilib_os_dir;
8347 }
e0cdc09f
MK
8348
8349 if (q2 < end && *q2 == ':')
8350 {
8351 char *new_multiarch_dir = XNEWVEC (char, end - q2);
8352 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
8353 new_multiarch_dir[end - q2 - 1] = '\0';
8354 multiarch_dir = new_multiarch_dir;
8355 }
5bbcd587
JJ
8356 break;
8357 }
60103a34
DE
8358 }
8359
8360 ++p;
9218435e 8361 }
5bbcd587
JJ
8362
8363 if (multilib_dir == NULL && multilib_os_dir != NULL
3c40bd65 8364 && strcmp (multilib_os_dir, ".") == 0)
5bbcd587 8365 {
b1d5455a 8366 free (CONST_CAST (char *, multilib_os_dir));
5bbcd587
JJ
8367 multilib_os_dir = NULL;
8368 }
8369 else if (multilib_dir != NULL && multilib_os_dir == NULL)
8370 multilib_os_dir = multilib_dir;
60103a34
DE
8371}
8372
8373/* Print out the multiple library subdirectory selection
8374 information. This prints out a series of lines. Each line looks
8375 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
8376 required. Only the desired options are printed out, the negative
8377 matches. The options are print without a leading dash. There are
8378 no spaces to make it easy to use the information in the shell.
8379 Each subdirectory is printed only once. This assumes the ordering
0a8d6618
BC
8380 generated by the genmultilib script. Also, we leave out ones that match
8381 the exclusions. */
60103a34
DE
8382
8383static void
1d088dee 8384print_multilib_info (void)
60103a34 8385{
3b304f5b
ZW
8386 const char *p = multilib_select;
8387 const char *last_path = 0, *this_path;
03c42484 8388 int skip;
3ac63d94 8389 unsigned int last_path_len = 0;
60103a34
DE
8390
8391 while (*p != '\0')
8392 {
0a8d6618 8393 skip = 0;
60103a34
DE
8394 /* Ignore newlines. */
8395 if (*p == '\n')
8396 {
8397 ++p;
8398 continue;
8399 }
8400
8401 /* Get the initial path. */
8402 this_path = p;
8403 while (*p != ' ')
8404 {
8405 if (*p == '\0')
3b5edfee
NS
8406 {
8407 invalid_select:
bdc6b402 8408 fatal_error ("multilib select %qs is invalid", multilib_select);
3b5edfee 8409 }
7904f95f 8410
60103a34
DE
8411 ++p;
8412 }
8413
c49d2df6 8414 /* When --disable-multilib was used but target defines
e0cdc09f
MK
8415 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
8416 with .:: for multiarch configurations) are there just to find
8417 multilib_os_dir, so skip them from output. */
8418 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
c49d2df6
JJ
8419 skip = 1;
8420
0a8d6618
BC
8421 /* Check for matches with the multilib_exclusions. We don't bother
8422 with the '!' in either list. If any of the exclusion rules match
8423 all of its options with the select rule, we skip it. */
d25a45d4
KH
8424 {
8425 const char *e = multilib_exclusions;
8426 const char *this_arg;
0a8d6618 8427
d25a45d4
KH
8428 while (*e != '\0')
8429 {
8430 int m = 1;
8431 /* Ignore newlines. */
8432 if (*e == '\n')
8433 {
8434 ++e;
8435 continue;
8436 }
0a8d6618 8437
d25a45d4
KH
8438 /* Check the arguments. */
8439 while (*e != ';')
8440 {
8441 const char *q;
8442 int mp = 0;
0a8d6618 8443
d25a45d4 8444 if (*e == '\0')
3b5edfee
NS
8445 {
8446 invalid_exclusion:
bdc6b402 8447 fatal_error ("multilib exclusion %qs is invalid",
2dec80c7 8448 multilib_exclusions);
3b5edfee 8449 }
9218435e 8450
d25a45d4
KH
8451 if (! m)
8452 {
8453 ++e;
8454 continue;
8455 }
0a8d6618 8456
d25a45d4 8457 this_arg = e;
9218435e 8458
d25a45d4
KH
8459 while (*e != ' ' && *e != ';')
8460 {
8461 if (*e == '\0')
3b5edfee 8462 goto invalid_exclusion;
d25a45d4
KH
8463 ++e;
8464 }
0a8d6618 8465
d25a45d4
KH
8466 q = p + 1;
8467 while (*q != ';')
8468 {
8469 const char *arg;
8470 int len = e - this_arg;
0a8d6618 8471
d25a45d4 8472 if (*q == '\0')
3b5edfee 8473 goto invalid_select;
0a8d6618 8474
d25a45d4
KH
8475 arg = q;
8476
8477 while (*q != ' ' && *q != ';')
8478 {
8479 if (*q == '\0')
3b5edfee 8480 goto invalid_select;
0a8d6618 8481 ++q;
d25a45d4 8482 }
0a8d6618 8483
3b5edfee
NS
8484 if (! strncmp (arg, this_arg,
8485 (len < q - arg) ? q - arg : len)
8486 || default_arg (this_arg, e - this_arg))
d25a45d4
KH
8487 {
8488 mp = 1;
8489 break;
8490 }
0a8d6618 8491
d25a45d4
KH
8492 if (*q == ' ')
8493 ++q;
8494 }
9218435e 8495
d25a45d4
KH
8496 if (! mp)
8497 m = 0;
0a8d6618 8498
d25a45d4
KH
8499 if (*e == ' ')
8500 ++e;
8501 }
8502
8503 if (m)
8504 {
8505 skip = 1;
8506 break;
8507 }
8508
8509 if (*e != '\0')
8510 ++e;
8511 }
8512 }
0a8d6618
BC
8513
8514 if (! skip)
d25a45d4
KH
8515 {
8516 /* If this is a duplicate, skip it. */
3b5edfee
NS
8517 skip = (last_path != 0
8518 && (unsigned int) (p - this_path) == last_path_len
ba78087b 8519 && ! filename_ncmp (last_path, this_path, last_path_len));
60103a34 8520
d25a45d4
KH
8521 last_path = this_path;
8522 last_path_len = p - this_path;
0a8d6618 8523 }
60103a34 8524
03c42484
RK
8525 /* If this directory requires any default arguments, we can skip
8526 it. We will already have printed a directory identical to
8527 this one which does not require that default argument. */
8528 if (! skip)
8529 {
3b304f5b 8530 const char *q;
03c42484
RK
8531
8532 q = p + 1;
8533 while (*q != ';')
8534 {
3b304f5b 8535 const char *arg;
03c42484
RK
8536
8537 if (*q == '\0')
3b5edfee 8538 goto invalid_select;
03c42484
RK
8539
8540 if (*q == '!')
8541 arg = NULL;
8542 else
8543 arg = q;
8544
8545 while (*q != ' ' && *q != ';')
8546 {
8547 if (*q == '\0')
3b5edfee 8548 goto invalid_select;
03c42484
RK
8549 ++q;
8550 }
8551
8552 if (arg != NULL
8553 && default_arg (arg, q - arg))
8554 {
8555 skip = 1;
8556 break;
8557 }
8558
8559 if (*q == ' ')
8560 ++q;
8561 }
8562 }
8563
60103a34
DE
8564 if (! skip)
8565 {
3b304f5b 8566 const char *p1;
60103a34 8567
5bbcd587 8568 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
60103a34
DE
8569 putchar (*p1);
8570 putchar (';');
8571 }
8572
8573 ++p;
8574 while (*p != ';')
8575 {
8576 int use_arg;
8577
8578 if (*p == '\0')
3b5edfee 8579 goto invalid_select;
60103a34
DE
8580
8581 if (skip)
8582 {
8583 ++p;
8584 continue;
8585 }
8586
8587 use_arg = *p != '!';
8588
8589 if (use_arg)
8590 putchar ('@');
8591
8592 while (*p != ' ' && *p != ';')
8593 {
8594 if (*p == '\0')
3b5edfee 8595 goto invalid_select;
60103a34
DE
8596 if (use_arg)
8597 putchar (*p);
8598 ++p;
8599 }
8600
8601 if (*p == ' ')
8602 ++p;
8603 }
8604
8605 if (! skip)
961b7009 8606 {
3ac63d94 8607 /* If there are extra options, print them now. */
961b7009
MM
8608 if (multilib_extra && *multilib_extra)
8609 {
8610 int print_at = TRUE;
3b304f5b 8611 const char *q;
961b7009
MM
8612
8613 for (q = multilib_extra; *q != '\0'; q++)
8614 {
8615 if (*q == ' ')
8616 print_at = TRUE;
8617 else
8618 {
8619 if (print_at)
8620 putchar ('@');
8621 putchar (*q);
8622 print_at = FALSE;
8623 }
8624 }
8625 }
9218435e 8626
961b7009
MM
8627 putchar ('\n');
8628 }
60103a34
DE
8629
8630 ++p;
8631 }
8632}
f3226a90 8633\f
30d8946b
MM
8634/* getenv built-in spec function.
8635
8636 Returns the value of the environment variable given by its first
8637 argument, concatenated with the second argument. If the
8638 environment variable is not defined, a fatal error is issued. */
8639
8640static const char *
8641getenv_spec_function (int argc, const char **argv)
8642{
8643 char *value;
5557813a
NS
8644 char *result;
8645 char *ptr;
8646 size_t len;
30d8946b
MM
8647
8648 if (argc != 2)
8649 return NULL;
8650
8651 value = getenv (argv[0]);
8652 if (!value)
bdc6b402 8653 fatal_error ("environment variable %qs not defined", argv[0]);
30d8946b 8654
5557813a 8655 /* We have to escape every character of the environment variable so
fa10beec
RW
8656 they are not interpreted as active spec characters. A
8657 particularly painful case is when we are reading a variable
5557813a
NS
8658 holding a windows path complete with \ separators. */
8659 len = strlen (value) * 2 + strlen (argv[1]) + 1;
e1e4cdc4 8660 result = XNEWVAR (char, len);
5557813a
NS
8661 for (ptr = result; *value; ptr += 2)
8662 {
8663 ptr[0] = '\\';
8664 ptr[1] = *value++;
8665 }
b8698a0f 8666
5557813a 8667 strcpy (ptr, argv[1]);
b8698a0f 8668
5557813a 8669 return result;
30d8946b
MM
8670}
8671
f3226a90
JT
8672/* if-exists built-in spec function.
8673
8674 Checks to see if the file specified by the absolute pathname in
8675 ARGS exists. Returns that pathname if found.
8676
8677 The usual use for this function is to check for a library file
8678 (whose name has been expanded with %s). */
8679
8680static const char *
1d088dee 8681if_exists_spec_function (int argc, const char **argv)
f3226a90
JT
8682{
8683 /* Must have only one argument. */
3dce1408 8684 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
f3226a90
JT
8685 return argv[0];
8686
8687 return NULL;
8688}
152a5a9c
JT
8689
8690/* if-exists-else built-in spec function.
8691
8692 This is like if-exists, but takes an additional argument which
8693 is returned if the first argument does not exist. */
8694
8695static const char *
1d088dee 8696if_exists_else_spec_function (int argc, const char **argv)
152a5a9c
JT
8697{
8698 /* Must have exactly two arguments. */
8699 if (argc != 2)
8700 return NULL;
8701
3dce1408 8702 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
152a5a9c
JT
8703 return argv[0];
8704
8705 return argv[1];
8706}
3dd53121 8707
de5a5fa1
MP
8708/* sanitize built-in spec function.
8709
8710 This returns non-NULL, if sanitizing address, thread or
8711 any of the undefined behavior sanitizers. */
8712
8713static const char *
8714sanitize_spec_function (int argc, const char **argv)
8715{
8716 if (argc != 1)
8717 return NULL;
8718
8719 if (strcmp (argv[0], "address") == 0)
fec4842d
YG
8720 return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
8721 if (strcmp (argv[0], "kernel-address") == 0)
8722 return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
de5a5fa1
MP
8723 if (strcmp (argv[0], "thread") == 0)
8724 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
8725 if (strcmp (argv[0], "undefined") == 0)
85a16bf8 8726 return ((flag_sanitize & (SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT))
1c33c9b7 8727 && !flag_sanitize_undefined_trap_on_error) ? "" : NULL;
9065ada9
JJ
8728 if (strcmp (argv[0], "leak") == 0)
8729 return ((flag_sanitize
8730 & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
8731 == SANITIZE_LEAK) ? "" : NULL;
de5a5fa1
MP
8732 return NULL;
8733}
8734
3dd53121 8735/* replace-outfile built-in spec function.
ed5b9f96
GK
8736
8737 This looks for the first argument in the outfiles array's name and
8738 replaces it with the second argument. */
3dd53121
AP
8739
8740static const char *
8741replace_outfile_spec_function (int argc, const char **argv)
8742{
8743 int i;
8744 /* Must have exactly two arguments. */
8745 if (argc != 2)
8746 abort ();
7904f95f 8747
3dd53121
AP
8748 for (i = 0; i < n_infiles; i++)
8749 {
ba78087b 8750 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
3dd53121
AP
8751 outfiles[i] = xstrdup (argv[1]);
8752 }
8753 return NULL;
8754}
8755
2642f659
JH
8756/* remove-outfile built-in spec function.
8757 *
8758 * This looks for the first argument in the outfiles array's name and
8759 * removes it. */
8760
8761static const char *
8762remove_outfile_spec_function (int argc, const char **argv)
8763{
8764 int i;
8765 /* Must have exactly one argument. */
8766 if (argc != 1)
8767 abort ();
8768
8769 for (i = 0; i < n_infiles; i++)
8770 {
ba78087b 8771 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
2642f659
JH
8772 outfiles[i] = NULL;
8773 }
8774 return NULL;
8775}
8776
7904f95f 8777/* Given two version numbers, compares the two numbers.
ed5b9f96
GK
8778 A version number must match the regular expression
8779 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8780*/
8781static int
8782compare_version_strings (const char *v1, const char *v2)
8783{
8784 int rresult;
8785 regex_t r;
7904f95f 8786
ed5b9f96
GK
8787 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8788 REG_EXTENDED | REG_NOSUB) != 0)
8789 abort ();
8790 rresult = regexec (&r, v1, 0, NULL, 0);
8791 if (rresult == REG_NOMATCH)
bdc6b402 8792 fatal_error ("invalid version number %qs", v1);
ed5b9f96
GK
8793 else if (rresult != 0)
8794 abort ();
8795 rresult = regexec (&r, v2, 0, NULL, 0);
8796 if (rresult == REG_NOMATCH)
bdc6b402 8797 fatal_error ("invalid version number %qs", v2);
ed5b9f96
GK
8798 else if (rresult != 0)
8799 abort ();
8800
8801 return strverscmp (v1, v2);
8802}
8803
8804
8805/* version_compare built-in spec function.
8806
8807 This takes an argument of the following form:
8808
8809 <comparison-op> <arg1> [<arg2>] <switch> <result>
8810
8811 and produces "result" if the comparison evaluates to true,
8812 and nothing if it doesn't.
8813
8814 The supported <comparison-op> values are:
7904f95f 8815
ed5b9f96
GK
8816 >= true if switch is a later (or same) version than arg1
8817 !> opposite of >=
8818 < true if switch is an earlier version than arg1
8819 !< opposite of <
8820 >< true if switch is arg1 or later, and earlier than arg2
8821 <> true if switch is earlier than arg1 or is arg2 or later
8822
8823 If the switch is not present, the condition is false unless
8824 the first character of the <comparison-op> is '!'.
8825
8826 For example,
8827 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8828 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8829
8830static const char *
8831version_compare_spec_function (int argc, const char **argv)
8832{
8833 int comp1, comp2;
8834 size_t switch_len;
8835 const char *switch_value = NULL;
8836 int nargs = 1, i;
8837 bool result;
8838
8839 if (argc < 3)
2dec80c7 8840 fatal_error ("too few arguments to %%:version-compare");
ed5b9f96
GK
8841 if (argv[0][0] == '\0')
8842 abort ();
8843 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8844 nargs = 2;
8845 if (argc != nargs + 3)
2dec80c7 8846 fatal_error ("too many arguments to %%:version-compare");
ed5b9f96
GK
8847
8848 switch_len = strlen (argv[nargs + 1]);
8849 for (i = 0; i < n_switches; i++)
8850 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8851 && check_live_switch (i, switch_len))
8852 switch_value = switches[i].part1 + switch_len;
8853
8854 if (switch_value == NULL)
8855 comp1 = comp2 = -1;
8856 else
8857 {
8858 comp1 = compare_version_strings (switch_value, argv[1]);
8859 if (nargs == 2)
8860 comp2 = compare_version_strings (switch_value, argv[2]);
8861 else
8862 comp2 = -1; /* This value unused. */
8863 }
8864
8865 switch (argv[0][0] << 8 | argv[0][1])
8866 {
8867 case '>' << 8 | '=':
8868 result = comp1 >= 0;
8869 break;
8870 case '!' << 8 | '<':
8871 result = comp1 >= 0 || switch_value == NULL;
8872 break;
8873 case '<' << 8:
8874 result = comp1 < 0;
8875 break;
8876 case '!' << 8 | '>':
8877 result = comp1 < 0 || switch_value == NULL;
8878 break;
8879 case '>' << 8 | '<':
8880 result = comp1 >= 0 && comp2 < 0;
8881 break;
8882 case '<' << 8 | '>':
8883 result = comp1 < 0 || comp2 >= 0;
8884 break;
7904f95f 8885
ed5b9f96 8886 default:
bdc6b402 8887 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
ed5b9f96
GK
8888 }
8889 if (! result)
8890 return NULL;
8891
8892 return argv[nargs + 2];
8893}
953ff289
DN
8894
8895/* %:include builtin spec function. This differs from %include in that it
8896 can be nested inside a spec, and thus be conditionalized. It takes
8897 one argument, the filename, and looks for it in the startfile path.
8898 The result is always NULL, i.e. an empty expansion. */
8899
8900static const char *
8901include_spec_function (int argc, const char **argv)
8902{
8903 char *file;
8904
8905 if (argc != 1)
8906 abort ();
8907
4d2b059d 8908 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
d168aaee 8909 read_specs (file ? file : argv[0], false, false);
953ff289
DN
8910
8911 return NULL;
8912}
a0f87454 8913
c1ce46a5 8914/* %:find-file spec function. This function replaces its argument by
073a8998 8915 the file found through find_file, that is the -print-file-name gcc
4adbd5dd
MK
8916 program option. */
8917static const char *
c1ce46a5 8918find_file_spec_function (int argc, const char **argv)
4adbd5dd
MK
8919{
8920 const char *file;
8921
8922 if (argc != 1)
8923 abort ();
8924
8925 file = find_file (argv[0]);
8926 return file;
8927}
8928
8929
c1ce46a5 8930/* %:find-plugindir spec function. This function replaces its argument
073a8998 8931 by the -iplugindir=<dir> option. `dir' is found through find_file, that
c1ce46a5
MK
8932 is the -print-file-name gcc program option. */
8933static const char *
8934find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
8935{
8936 const char *option;
8937
8938 if (argc != 0)
8939 abort ();
8940
8941 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
8942 return option;
8943}
8944
8945
a0f87454
RS
8946/* %:print-asm-header spec function. Print a banner to say that the
8947 following output is from the assembler. */
8948
8949static const char *
8950print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8951 const char **argv ATTRIBUTE_UNUSED)
8952{
4dad0aca 8953 printf (_("Assembler options\n=================\n\n"));
a0f87454
RS
8954 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8955 fflush (stdout);
8956 return NULL;
8957}
2153915d 8958
44a22bdb 8959/* Get a random number for -frandom-seed */
b5b8b0ac 8960
44a22bdb
AK
8961static unsigned HOST_WIDE_INT
8962get_random_number (void)
b5b8b0ac 8963{
44a22bdb
AK
8964 unsigned HOST_WIDE_INT ret = 0;
8965 int fd;
8966
8967 fd = open ("/dev/urandom", O_RDONLY);
8968 if (fd >= 0)
8969 {
8970 read (fd, &ret, sizeof (HOST_WIDE_INT));
8971 close (fd);
8972 if (ret)
8973 return ret;
8974 }
b5b8b0ac
AO
8975
8976 /* Get some more or less random data. */
8977#ifdef HAVE_GETTIMEOFDAY
8978 {
8979 struct timeval tv;
8980
8981 gettimeofday (&tv, NULL);
8982 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8983 }
8984#else
8985 {
8986 time_t now = time (NULL);
8987
8988 if (now != (time_t)-1)
8989 ret = (unsigned) now;
8990 }
8991#endif
8992
c3284718 8993 return ret ^ getpid ();
b5b8b0ac
AO
8994}
8995
2153915d
AO
8996/* %:compare-debug-dump-opt spec function. Save the last argument,
8997 expected to be the last -fdump-final-insns option, or generate a
8998 temporary. */
8999
9000static const char *
9001compare_debug_dump_opt_spec_function (int arg,
9002 const char **argv ATTRIBUTE_UNUSED)
9003{
fc429b48 9004 char *ret;
2153915d
AO
9005 char *name;
9006 int which;
b5b8b0ac 9007 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
2153915d
AO
9008
9009 if (arg != 0)
2dec80c7 9010 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
2153915d 9011
2153915d
AO
9012 do_spec_2 ("%{fdump-final-insns=*:%*}");
9013 do_spec_1 (" ", 0, NULL);
9014
9771b263
DN
9015 if (argbuf.length () > 0
9016 && strcmp (argv[argbuf.length () - 1], "."))
2153915d 9017 {
b5b8b0ac
AO
9018 if (!compare_debug)
9019 return NULL;
9020
9771b263 9021 name = xstrdup (argv[argbuf.length () - 1]);
2153915d
AO
9022 ret = NULL;
9023 }
9024 else
9025 {
b5b8b0ac
AO
9026 const char *ext = NULL;
9027
9771b263 9028 if (argbuf.length () > 0)
b5b8b0ac
AO
9029 {
9030 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
9031 ext = ".gkd";
9032 }
9033 else if (!compare_debug)
9034 return NULL;
9035 else
9036 do_spec_2 ("%g.gkd");
2153915d 9037
2153915d 9038 do_spec_1 (" ", 0, NULL);
2153915d 9039
9771b263 9040 gcc_assert (argbuf.length () > 0);
2153915d 9041
9771b263 9042 name = concat (argbuf.last (), ext, NULL);
b5b8b0ac
AO
9043
9044 ret = concat ("-fdump-final-insns=", name, NULL);
2153915d
AO
9045 }
9046
9047 which = compare_debug < 0;
9048 debug_check_temp_file[which] = name;
9049
b5b8b0ac
AO
9050 if (!which)
9051 {
44a22bdb 9052 unsigned HOST_WIDE_INT value = get_random_number ();
b5b8b0ac
AO
9053
9054 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
9055 }
9056
9057 if (*random_seed)
fc429b48
TB
9058 {
9059 char *tmp = ret;
9060 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
9061 ret, NULL);
9062 free (tmp);
9063 }
b5b8b0ac
AO
9064
9065 if (which)
9066 *random_seed = 0;
2153915d
AO
9067
9068 return ret;
9069}
9070
9071static const char *debug_auxbase_opt;
9072
9073/* %:compare-debug-self-opt spec function. Expands to the options
9074 that are to be passed in the second compilation of
9075 compare-debug. */
9076
9077static const char *
9078compare_debug_self_opt_spec_function (int arg,
9079 const char **argv ATTRIBUTE_UNUSED)
9080{
9081 if (arg != 0)
2dec80c7 9082 fatal_error ("too many arguments to %%:compare-debug-self-opt");
2153915d
AO
9083
9084 if (compare_debug >= 0)
9085 return NULL;
9086
9087 do_spec_2 ("%{c|S:%{o*:%*}}");
9088 do_spec_1 (" ", 0, NULL);
9089
9771b263 9090 if (argbuf.length () > 0)
2153915d 9091 debug_auxbase_opt = concat ("-auxbase-strip ",
9771b263 9092 argbuf.last (),
2153915d
AO
9093 NULL);
9094 else
9095 debug_auxbase_opt = NULL;
9096
9097 return concat ("\
9098%<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
9099%<fdump-final-insns=* -w -S -o %j \
9100%{!fcompare-debug-second:-fcompare-debug-second} \
9101", compare_debug_opt, NULL);
9102}
9103
9104/* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
9105 options that are to be passed in the second compilation of
9106 compare-debug. It expects, as an argument, the basename of the
9107 current input file name, with the .gk suffix appended to it. */
9108
9109static const char *
9110compare_debug_auxbase_opt_spec_function (int arg,
9111 const char **argv)
9112{
9113 char *name;
9114 int len;
9115
9116 if (arg == 0)
2dec80c7 9117 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
2153915d
AO
9118
9119 if (arg != 1)
2dec80c7 9120 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
2153915d
AO
9121
9122 if (compare_debug >= 0)
9123 return NULL;
9124
9125 len = strlen (argv[0]);
9126 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
2dec80c7
JM
9127 fatal_error ("argument to %%:compare-debug-auxbase-opt "
9128 "does not end in .gk");
2153915d
AO
9129
9130 if (debug_auxbase_opt)
9131 return debug_auxbase_opt;
9132
9133#define OPT "-auxbase "
9134
9135 len -= 3;
9136 name = (char*) xmalloc (sizeof (OPT) + len);
9137 memcpy (name, OPT, sizeof (OPT) - 1);
9138 memcpy (name + sizeof (OPT) - 1, argv[0], len);
9139 name[sizeof (OPT) - 1 + len] = '\0';
9140
b5b8b0ac
AO
9141#undef OPT
9142
2153915d
AO
9143 return name;
9144}
9a37bc07
DK
9145
9146/* %:pass-through-libs spec function. Finds all -l options and input
9147 file names in the lib spec passed to it, and makes a list of them
9148 prepended with the plugin option to cause them to be passed through
9149 to the final link after all the new object files have been added. */
9150
9151const char *
9152pass_through_libs_spec_func (int argc, const char **argv)
9153{
9154 char *prepended = xstrdup (" ");
9155 int n;
9156 /* Shlemiel the painter's algorithm. Innately horrible, but at least
9157 we know that there will never be more than a handful of strings to
9158 concat, and it's only once per run, so it's not worth optimising. */
9159 for (n = 0; n < argc; n++)
9160 {
9161 char *old = prepended;
9162 /* Anything that isn't an option is a full path to an output
9163 file; pass it through if it ends in '.a'. Among options,
9164 pass only -l. */
9165 if (argv[n][0] == '-' && argv[n][1] == 'l')
9166 {
9167 const char *lopt = argv[n] + 2;
9168 /* Handle both joined and non-joined -l options. If for any
9169 reason there's a trailing -l with no joined or following
9170 arg just discard it. */
9171 if (!*lopt && ++n >= argc)
9172 break;
9173 else if (!*lopt)
9174 lopt = argv[n];
9175 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
9176 lopt, " ", NULL);
9177 }
9178 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
9179 {
9180 prepended = concat (prepended, "-plugin-opt=-pass-through=",
9181 argv[n], " ", NULL);
9182 }
9183 if (prepended != old)
9184 free (old);
9185 }
9186 return prepended;
9187}
99ea153e
SA
9188
9189/* %:replace-extension spec function. Replaces the extension of the
9190 first argument with the second argument. */
9191
9192const char *
9193replace_extension_spec_func (int argc, const char **argv)
9194{
9195 char *name;
9196 char *p;
9197 char *result;
9198 int i;
9199
9200 if (argc != 2)
9201 fatal_error ("too few arguments to %%:replace-extension");
9202
9203 name = xstrdup (argv[0]);
9204
c3284718 9205 for (i = strlen (name) - 1; i >= 0; i--)
99ea153e
SA
9206 if (IS_DIR_SEPARATOR (name[i]))
9207 break;
9208
9209 p = strrchr (name + i + 1, '.');
9210 if (p != NULL)
9211 *p = '\0';
9212
9213 result = concat (name, argv[1], NULL);
9214
9215 free (name);
9216 return result;
9217}
3c27ce4c
JY
9218
9219/* Insert backslash before spaces in ORIG (usually a file path), to
9220 avoid being broken by spec parser.
9221
9222 This function is needed as do_spec_1 treats white space (' ' and '\t')
9223 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
9224 the file name should be treated as a single argument rather than being
9225 broken into multiple. Solution is to insert '\\' before the space in a
9226 file name.
9227
9228 This function converts and only converts all occurrence of ' '
9229 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
9230 "a b" -> "a\\ b"
9231 "a b" -> "a\\ \\ b"
9232 "a\tb" -> "a\\\tb"
9233 "a\\ b" -> "a\\\\ b"
9234
9235 orig: input null-terminating string that was allocated by xalloc. The
9236 memory it points to might be freed in this function. Behavior undefined
9237 if ORIG wasn't xalloced or was freed already at entry.
9238
9239 Return: ORIG if no conversion needed. Otherwise a newly allocated string
9240 that was converted from ORIG. */
9241
9242static char *
9243convert_white_space (char *orig)
9244{
9245 int len, number_of_space = 0;
9246
9247 for (len = 0; orig[len]; len++)
9248 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
9249
9250 if (number_of_space)
9251 {
9252 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
9253 int j, k;
9254 for (j = 0, k = 0; j <= len; j++, k++)
9255 {
9256 if (orig[j] == ' ' || orig[j] == '\t')
9257 new_spec[k++] = '\\';
9258 new_spec[k] = orig[j];
9259 }
9260 free (orig);
9261 return new_spec;
9262 }
9263 else
9264 return orig;
9265}