]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gcc.c
[AArch64] Enable Address Sanitizer.
[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
dc10fd96 256static void try_generate_repro (const char *prog, 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*} \
56e22cab 822 %{flto} %{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
5b634ee0 1705/* Position in the argbuf vector containing the name of the output file
0855eab7
CT
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
0855eab7 1765 if (strcmp (arg, "-o") == 0)
9771b263 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))
2921 try_generate_repro (commands[0].prog, 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);
6335
6336 if (!pex_get_status (pex, 1, &exit_status))
6337 goto out;
6338
6339 switch (WEXITSTATUS (exit_status))
6340 {
6341 case ICE_EXIT_CODE:
6342 status = ATTEMPT_STATUS_ICE;
6343 break;
6344
6345 case SUCCESS_EXIT_CODE:
6346 status = ATTEMPT_STATUS_SUCCESS;
6347 break;
6348
6349 default:
6350 ;
6351 }
6352
6353out:
6354 pex_free (pex);
6355 return status;
6356}
6357
6358/* This routine adds preprocessed source code into the given ERR_FILE.
6359 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
6360 add information in report file. RUN_ATTEMPT should return
6361 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
6362
6363static void
6364do_report_bug (const char **new_argv, const int nargs,
6365 char **out_file, char **err_file)
6366{
6367 int i, status;
6368 int fd = open (*out_file, O_RDWR | O_APPEND);
6369 if (fd < 0)
6370 return;
6371 write (fd, "\n//", 3);
6372 for (i = 0; i < nargs; i++)
6373 {
6374 write (fd, " ", 1);
6375 write (fd, new_argv[i], strlen (new_argv[i]));
6376 }
6377 write (fd, "\n\n", 2);
6378 close (fd);
6379 new_argv[nargs] = "-E";
6380 new_argv[nargs + 1] = NULL;
6381
6382 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
6383
6384 if (status == ATTEMPT_STATUS_SUCCESS)
6385 {
6386 fnotice (stderr, "Preprocessed source stored into %s file,"
6387 " please attach this to your bugreport.\n", *out_file);
6388 /* Make sure it is not deleted. */
6389 free (*out_file);
6390 *out_file = NULL;
6391 }
6392}
6393
6394/* Append string STR to file FILE. */
6395
6396static void
6397append_text (char *file, const char *str)
6398{
6399 int fd = open (file, O_RDWR | O_APPEND);
6400 if (fd < 0)
6401 return;
6402
6403 write (fd, str, strlen (str));
6404 close (fd);
6405}
6406
6407/* Try to reproduce ICE. If bug is reproducible, generate report .err file
6408 containing GCC configuration, backtrace, compiler's command line options
6409 and preprocessed source code. */
6410
6411static void
6412try_generate_repro (const char *prog, const char **argv)
6413{
6414 int i, nargs, out_arg = -1, quiet = 0, attempt;
6415 const char **new_argv;
6416 char *temp_files[RETRY_ICE_ATTEMPTS * 2];
6417 char **temp_stdout_files = &temp_files[0];
6418 char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
6419
6420 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
6421 return;
6422
6423 for (nargs = 0; argv[nargs] != NULL; ++nargs)
6424 /* Only retry compiler ICEs, not preprocessor ones. */
6425 if (! strcmp (argv[nargs], "-E"))
6426 return;
6427 else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
6428 {
6429 if (out_arg == -1)
6430 out_arg = nargs;
6431 else
6432 return;
6433 }
6434 /* If the compiler is going to output any time information,
6435 it might varry between invocations. */
6436 else if (! strcmp (argv[nargs], "-quiet"))
6437 quiet = 1;
6438 else if (! strcmp (argv[nargs], "-ftime-report"))
6439 return;
6440
6441 if (out_arg == -1 || !quiet)
6442 return;
6443
6444 memset (temp_files, '\0', sizeof (temp_files));
6445 new_argv = XALLOCAVEC (const char *, nargs + 4);
6446 memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
6447 new_argv[nargs++] = "-frandom-seed=0";
6448 new_argv[nargs++] = "-fdump-noaddr";
6449 new_argv[nargs] = NULL;
6450 if (new_argv[out_arg][2] == '\0')
6451 new_argv[out_arg + 1] = "-";
6452 else
6453 new_argv[out_arg] = "-o-";
6454
6455 int status;
6456 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
6457 {
6458 int emit_system_info = 0;
6459 int append = 0;
6460 temp_stdout_files[attempt] = make_temp_file (".out");
6461 temp_stderr_files[attempt] = make_temp_file (".err");
6462
6463 if (attempt == RETRY_ICE_ATTEMPTS - 1)
6464 {
6465 append = 1;
6466 emit_system_info = 1;
6467 }
6468
6469 if (emit_system_info)
6470 append_text (temp_stderr_files[attempt], "/*\n");
6471
6472 status = run_attempt (new_argv, temp_stdout_files[attempt],
6473 temp_stderr_files[attempt], emit_system_info,
6474 append);
6475
6476 if (emit_system_info)
6477 append_text (temp_stderr_files[attempt], "*/\n");
6478
6479 if (status != ATTEMPT_STATUS_ICE)
6480 {
6481 fnotice (stderr, "The bug is not reproducible, so it is"
6482 " likely a hardware or OS problem.\n");
6483 goto out;
6484 }
6485 }
6486
6487 if (!check_repro (temp_stdout_files, temp_stderr_files))
6488 goto out;
6489
6490 /* In final attempt we append compiler options and preprocesssed code to last
6491 generated .err file with configuration and backtrace. */
6492 do_report_bug (new_argv, nargs,
6493 &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
6494 &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1]);
6495
6496out:
6497 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
6498 if (temp_files[i])
6499 {
6500 unlink (temp_stdout_files[i]);
6501 free (temp_stdout_files[i]);
6502 }
6503}
6504
ed1f651b
RS
6505/* Search for a file named NAME trying various prefixes including the
6506 user's -B prefix and some standard ones.
6507 Return the absolute file name found. If nothing is found, return NAME. */
6508
878f32c3 6509static const char *
1d088dee 6510find_file (const char *name)
ed1f651b 6511{
00dcee0c 6512 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
ed1f651b
RS
6513 return newname ? newname : name;
6514}
6515
0ad5835e 6516/* Determine whether a directory exists. If LINKER, return 0 for
00dcee0c 6517 certain fixed names not needed by the linker. */
ed1f651b
RS
6518
6519static int
00dcee0c 6520is_directory (const char *path1, bool linker)
ed1f651b 6521{
00dcee0c
AM
6522 int len1;
6523 char *path;
ed1f651b
RS
6524 char *cp;
6525 struct stat st;
6526
00dcee0c
AM
6527 /* Ensure the string ends with "/.". The resulting path will be a
6528 directory even if the given path is a symbolic link. */
6529 len1 = strlen (path1);
e1e4cdc4 6530 path = (char *) alloca (3 + len1);
7e2231e7 6531 memcpy (path, path1, len1);
00dcee0c 6532 cp = path + len1;
509781a4 6533 if (!IS_DIR_SEPARATOR (cp[-1]))
48ff801b 6534 *cp++ = DIR_SEPARATOR;
ed1f651b
RS
6535 *cp++ = '.';
6536 *cp = '\0';
6537
6538 /* Exclude directories that the linker is known to search. */
0ad5835e 6539 if (linker
00dcee0c 6540 && IS_DIR_SEPARATOR (path[0])
48ff801b 6541 && ((cp - path == 6
ba78087b 6542 && filename_ncmp (path + 1, "lib", 3) == 0)
48ff801b 6543 || (cp - path == 10
ba78087b 6544 && filename_ncmp (path + 1, "usr", 3) == 0
00dcee0c 6545 && IS_DIR_SEPARATOR (path[4])
ba78087b 6546 && filename_ncmp (path + 5, "lib", 3) == 0)))
ed1f651b
RS
6547 return 0;
6548
6549 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6550}
512b62fb
JM
6551
6552/* Set up the various global variables to indicate that we're processing
6553 the input file named FILENAME. */
6554
b856c15d 6555void
1d088dee 6556set_input (const char *filename)
512b62fb 6557{
b3694847 6558 const char *p;
512b62fb 6559
6afbc885
JM
6560 gcc_input_filename = filename;
6561 input_filename_length = strlen (gcc_input_filename);
6562 input_basename = lbasename (gcc_input_filename);
512b62fb
JM
6563
6564 /* Find a suffix starting with the last period,
6565 and set basename_length to exclude that suffix. */
6566 basename_length = strlen (input_basename);
ea414c97 6567 suffixed_basename_length = basename_length;
512b62fb 6568 p = input_basename + basename_length;
d25a45d4
KH
6569 while (p != input_basename && *p != '.')
6570 --p;
512b62fb
JM
6571 if (*p == '.' && p != input_basename)
6572 {
6573 basename_length = p - input_basename;
6574 input_suffix = p + 1;
6575 }
6576 else
6577 input_suffix = "";
589005ff 6578
99f78cdd 6579 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6afbc885 6580 we will need to do a stat on the gcc_input_filename. The
99f78cdd
IR
6581 INPUT_STAT_SET signals that the stat is needed. */
6582 input_stat_set = 0;
512b62fb 6583}
ed1f651b
RS
6584\f
6585/* On fatal signals, delete all the temporary files. */
6586
6587static void
2dec80c7 6588fatal_signal (int signum)
ed1f651b
RS
6589{
6590 signal (signum, SIG_DFL);
6591 delete_failure_queue ();
6592 delete_temp_files ();
6593 /* Get the same signal again, this time not handled,
6594 so its normal effect occurs. */
6595 kill (getpid (), signum);
6596}
6597
2153915d
AO
6598/* Compare the contents of the two files named CMPFILE[0] and
6599 CMPFILE[1]. Return zero if they're identical, nonzero
6600 otherwise. */
6601
6602static int
6603compare_files (char *cmpfile[])
6604{
6605 int ret = 0;
6606 FILE *temp[2] = { NULL, NULL };
6607 int i;
6608
6609#if HAVE_MMAP_FILE
6610 {
6611 size_t length[2];
6612 void *map[2] = { NULL, NULL };
6613
6614 for (i = 0; i < 2; i++)
6615 {
6616 struct stat st;
6617
6618 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6619 {
6620 error ("%s: could not determine length of compare-debug file %s",
6afbc885 6621 gcc_input_filename, cmpfile[i]);
2153915d
AO
6622 ret = 1;
6623 break;
6624 }
6625
6626 length[i] = st.st_size;
6627 }
6628
6629 if (!ret && length[0] != length[1])
6630 {
6afbc885 6631 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
2153915d
AO
6632 ret = 1;
6633 }
6634
6635 if (!ret)
6636 for (i = 0; i < 2; i++)
6637 {
6638 int fd = open (cmpfile[i], O_RDONLY);
6639 if (fd < 0)
6640 {
6641 error ("%s: could not open compare-debug file %s",
6afbc885 6642 gcc_input_filename, cmpfile[i]);
2153915d
AO
6643 ret = 1;
6644 break;
6645 }
6646
6647 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6648 close (fd);
6649
6650 if (map[i] == (void *) MAP_FAILED)
6651 {
6652 ret = -1;
6653 break;
6654 }
6655 }
6656
6657 if (!ret)
6658 {
6659 if (memcmp (map[0], map[1], length[0]) != 0)
6660 {
6afbc885 6661 error ("%s: -fcompare-debug failure", gcc_input_filename);
2153915d
AO
6662 ret = 1;
6663 }
6664 }
6665
6666 for (i = 0; i < 2; i++)
6667 if (map[i])
e7aae3e8 6668 munmap ((caddr_t) map[i], length[i]);
2153915d
AO
6669
6670 if (ret >= 0)
6671 return ret;
6672
6673 ret = 0;
6674 }
6675#endif
6676
6677 for (i = 0; i < 2; i++)
6678 {
6679 temp[i] = fopen (cmpfile[i], "r");
6680 if (!temp[i])
6681 {
6682 error ("%s: could not open compare-debug file %s",
6afbc885 6683 gcc_input_filename, cmpfile[i]);
2153915d
AO
6684 ret = 1;
6685 break;
6686 }
6687 }
6688
6689 if (!ret && temp[0] && temp[1])
6690 for (;;)
6691 {
6692 int c0, c1;
6693 c0 = fgetc (temp[0]);
6694 c1 = fgetc (temp[1]);
6695
6696 if (c0 != c1)
6697 {
6698 error ("%s: -fcompare-debug failure",
6afbc885 6699 gcc_input_filename);
2153915d
AO
6700 ret = 1;
6701 break;
6702 }
6703
6704 if (c0 == EOF)
6705 break;
6706 }
6707
6708 for (i = 1; i >= 0; i--)
6709 {
6710 if (temp[i])
6711 fclose (temp[i]);
6712 }
6713
6714 return ret;
6715}
6716
07a3df01 6717extern int main (int, char **);
a8f227e7 6718
ed1f651b 6719int
07a3df01 6720main (int argc, char **argv)
ed1f651b 6721{
ea414c97 6722 size_t i;
ed1f651b 6723 int value;
ed1f651b 6724 int linker_was_run = 0;
0855eab7 6725 int lang_n_infiles = 0;
17211ab5 6726 int num_linker_inputs = 0;
ed1f651b
RS
6727 char *explicit_link_files;
6728 char *specs_file;
de9a793e 6729 char *lto_wrapper_file;
878f32c3 6730 const char *p;
d9ac3a07 6731 struct user_specs *uptr;
2091ff66 6732 char **old_argv = argv;
60cf253a
JM
6733 struct cl_decoded_option *decoded_options;
6734 unsigned int decoded_options_count;
ed1f651b 6735
afcd8a02 6736 p = argv[0] + strlen (argv[0]);
509781a4
ME
6737 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6738 --p;
6afbc885 6739 progname = p;
ed1f651b 6740
6afbc885 6741 xmalloc_set_program_name (progname);
e1a132c6 6742
9d530538
MM
6743 expandargv (&argc, &argv);
6744
2091ff66
NF
6745 /* Determine if any expansions were made. */
6746 if (argv != old_argv)
6747 at_file_supplied = true;
6748
a7d0d30f
JM
6749 /* Register the language-independent parameters. */
6750 global_init_params ();
6751 finish_params ();
6752
6753 init_options_struct (&global_options, &global_options_set);
a75bfaa6 6754
60cf253a
JM
6755 decode_cmdline_options_to_array (argc, CONST_CAST2 (const char **, char **,
6756 argv),
6757 CL_DRIVER,
6758 &decoded_options, &decoded_options_count);
14c7833c 6759
98a3dad4 6760 /* Unlock the stdio streams. */
2653bb0c 6761 unlock_std_streams ();
98a3dad4 6762
191bf464 6763 gcc_init_libintl ();
ab87f8c8 6764
6afbc885 6765 diagnostic_initialize (global_dc, 0);
ccbc132f
RM
6766
6767#ifdef GCC_DRIVER_HOST_INITIALIZATION
6768 /* Perform host dependent initialization when needed. */
6769 GCC_DRIVER_HOST_INITIALIZATION;
6770#endif
6771
6afbc885
JM
6772 if (atexit (delete_temp_files) != 0)
6773 fatal_error ("atexit failed");
6774
ed1f651b 6775 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
2dec80c7 6776 signal (SIGINT, fatal_signal);
2a353d3a 6777#ifdef SIGHUP
ed1f651b 6778 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
2dec80c7 6779 signal (SIGHUP, fatal_signal);
2a353d3a 6780#endif
ed1f651b 6781 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
2dec80c7 6782 signal (SIGTERM, fatal_signal);
ed1f651b
RS
6783#ifdef SIGPIPE
6784 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
2dec80c7 6785 signal (SIGPIPE, fatal_signal);
ed1f651b 6786#endif
798bdf70 6787#ifdef SIGCHLD
0bf679a3
BK
6788 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6789 receive the signal. A different setting is inheritable */
6790 signal (SIGCHLD, SIG_DFL);
798bdf70 6791#endif
ed1f651b 6792
d423df48
JJ
6793 /* Parsing and gimplification sometimes need quite large stack.
6794 Increase stack size limits if possible. */
6795 stack_limit_increase (64 * 1024 * 1024);
6796
f3226a90
JT
6797 /* Allocate the argument vector. */
6798 alloc_args ();
ed1f651b
RS
6799
6800 obstack_init (&obstack);
6801
961b7009
MM
6802 /* Build multilib_select, et. al from the separate lines that make up each
6803 multilib selection. */
ffd86336 6804 {
3b304f5b 6805 const char *const *q = multilib_raw;
961b7009 6806 int need_space;
ffd86336
JW
6807
6808 obstack_init (&multilib_obstack);
0f41302f 6809 while ((p = *q++) != (char *) 0)
ffd86336
JW
6810 obstack_grow (&multilib_obstack, p, strlen (p));
6811
6812 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6813 multilib_select = XOBFINISH (&multilib_obstack, const char *);
961b7009
MM
6814
6815 q = multilib_matches_raw;
6816 while ((p = *q++) != (char *) 0)
6817 obstack_grow (&multilib_obstack, p, strlen (p));
6818
6819 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6820 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
961b7009 6821
0a8d6618
BC
6822 q = multilib_exclusions_raw;
6823 while ((p = *q++) != (char *) 0)
d25a45d4 6824 obstack_grow (&multilib_obstack, p, strlen (p));
0a8d6618
BC
6825
6826 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6827 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
9218435e 6828
e7f49d92
TG
6829 q = multilib_reuse_raw;
6830 while ((p = *q++) != (char *) 0)
6831 obstack_grow (&multilib_obstack, p, strlen (p));
6832
6833 obstack_1grow (&multilib_obstack, 0);
6834 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
6835
961b7009 6836 need_space = FALSE;
b6a1cbae 6837 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
961b7009
MM
6838 {
6839 if (need_space)
6840 obstack_1grow (&multilib_obstack, ' ');
6841 obstack_grow (&multilib_obstack,
6842 multilib_defaults_raw[i],
6843 strlen (multilib_defaults_raw[i]));
6844 need_space = TRUE;
6845 }
6846
6847 obstack_1grow (&multilib_obstack, 0);
7973fd2a 6848 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
ffd86336
JW
6849 }
6850
8faf4a68
JW
6851#ifdef INIT_ENVIRONMENT
6852 /* Set up any other necessary machine specific environment variables. */
47d33318 6853 xputenv (INIT_ENVIRONMENT);
8faf4a68
JW
6854#endif
6855
ed1f651b
RS
6856 /* Make a table of what switches there are (switches, n_switches).
6857 Make a table of specified input files (infiles, n_infiles).
6858 Decode switches that are handled locally. */
6859
60cf253a 6860 process_command (decoded_options_count, decoded_options);
ed1f651b
RS
6861
6862 /* Initialize the vector of specs to just the default.
6863 This means one element containing 0s, as a terminator. */
6864
e1e4cdc4 6865 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
703ad42b 6866 memcpy (compilers, default_compilers, sizeof default_compilers);
ed1f651b
RS
6867 n_compilers = n_default_compilers;
6868
6869 /* Read specs from a file if there is one. */
6870
6aa62cff 6871 machine_suffix = concat (spec_machine, dir_separator_str,
d4f2852f
KG
6872 spec_version, dir_separator_str, NULL);
6873 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
ed1f651b 6874
00dcee0c 6875 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
ed1f651b
RS
6876 /* Read the specs file unless it is a default one. */
6877 if (specs_file != 0 && strcmp (specs_file, "specs"))
d168aaee 6878 read_specs (specs_file, true, false);
20df0482
MM
6879 else
6880 init_spec ();
841faeed 6881
5bb67e36 6882 /* We need to check standard_exec_prefix/just_machine_suffix/specs
3ac63d94 6883 for any override of as, ld and libraries. */
e1e4cdc4 6884 specs_file = (char *) alloca (strlen (standard_exec_prefix)
703ad42b 6885 + strlen (just_machine_suffix) + sizeof ("specs"));
5bb67e36
RK
6886
6887 strcpy (specs_file, standard_exec_prefix);
6888 strcat (specs_file, just_machine_suffix);
6889 strcat (specs_file, "specs");
6890 if (access (specs_file, R_OK) == 0)
d168aaee 6891 read_specs (specs_file, true, false);
9218435e 6892
7816bea0
DJ
6893 /* Process any configure-time defaults specified for the command line
6894 options, via OPTION_DEFAULT_SPECS. */
6895 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6896 do_option_spec (option_default_specs[i].name,
6897 option_default_specs[i].spec);
6898
3bd6d4c4
AO
6899 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6900 of the command line. */
6901
6902 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6903 do_self_spec (driver_self_specs[i]);
6904
4977bab6
ZW
6905 /* If not cross-compiling, look for executables in the standard
6906 places. */
6907 if (*cross_compile == '0')
004fd4d5 6908 {
2296d164
RK
6909 if (*md_exec_prefix)
6910 {
6911 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
1a5d37a1 6912 PREFIX_PRIORITY_LAST, 0, 0);
2296d164 6913 }
4977bab6
ZW
6914 }
6915
71c0e7fc 6916 /* Process sysroot_suffix_spec. */
e7f13528 6917 if (*sysroot_suffix_spec != 0
28b4fc51 6918 && !no_sysroot_suffix
e7f13528
GP
6919 && do_spec_2 (sysroot_suffix_spec) == 0)
6920 {
9771b263 6921 if (argbuf.length () > 1)
ab532386 6922 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
9771b263
DN
6923 else if (argbuf.length () == 1)
6924 target_sysroot_suffix = xstrdup (argbuf.last ());
e7f13528
GP
6925 }
6926
380e5ca4
MM
6927#ifdef HAVE_LD_SYSROOT
6928 /* Pass the --sysroot option to the linker, if it supports that. If
6929 there is a sysroot_suffix_spec, it has already been processed by
6930 this point, so target_system_root really is the system root we
6931 should be using. */
6932 if (target_system_root)
6933 {
6934 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6935 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
d168aaee 6936 set_spec ("link", XOBFINISH (&obstack, const char *), false);
380e5ca4
MM
6937 }
6938#endif
6939
71c0e7fc 6940 /* Process sysroot_hdrs_suffix_spec. */
e7f13528 6941 if (*sysroot_hdrs_suffix_spec != 0
28b4fc51 6942 && !no_sysroot_suffix
e7f13528
GP
6943 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6944 {
9771b263 6945 if (argbuf.length () > 1)
ab532386 6946 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
9771b263
DN
6947 else if (argbuf.length () == 1)
6948 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
e7f13528
GP
6949 }
6950
4977bab6
ZW
6951 /* Look for startfiles in the standard places. */
6952 if (*startfile_prefix_spec != 0
6953 && do_spec_2 (startfile_prefix_spec) == 0
6954 && do_spec_1 (" ", 0, NULL) == 0)
6955 {
5b634ee0 6956 const char *arg;
4977bab6 6957 int ndx;
9771b263 6958 FOR_EACH_VEC_ELT (argbuf, ndx, arg)
5b634ee0 6959 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
1a5d37a1 6960 PREFIX_PRIORITY_LAST, 0, 1);
4977bab6
ZW
6961 }
6962 /* We should eventually get rid of all these and stick to
6963 startfile_prefix_spec exclusively. */
6964 else if (*cross_compile == '0' || target_system_root)
6965 {
2296d164 6966 if (*md_startfile_prefix)
4977bab6 6967 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
1a5d37a1 6968 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
004fd4d5 6969
2296d164 6970 if (*md_startfile_prefix_1)
4977bab6 6971 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
1a5d37a1 6972 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
607a4f7d 6973
4dbc7773
ILT
6974 /* If standard_startfile_prefix is relative, base it on
6975 standard_exec_prefix. This lets us move the installed tree
6976 as a unit. If GCC_EXEC_PREFIX is defined, base
0d037580
DJ
6977 standard_startfile_prefix on that as well.
6978
6979 If the prefix is relative, only search it for native compilers;
6980 otherwise we will search a directory containing host libraries. */
3dce1408 6981 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
4977bab6
ZW
6982 add_sysrooted_prefix (&startfile_prefixes,
6983 standard_startfile_prefix, "BINUTILS",
1a5d37a1 6984 PREFIX_PRIORITY_LAST, 0, 1);
0d037580 6985 else if (*cross_compile == '0')
4dbc7773 6986 {
48ff801b 6987 add_prefix (&startfile_prefixes,
b8698a0f
L
6988 concat (gcc_exec_prefix
6989 ? gcc_exec_prefix : standard_exec_prefix,
6990 machine_suffix,
d4f2852f 6991 standard_startfile_prefix, NULL),
1a5d37a1 6992 NULL, PREFIX_PRIORITY_LAST, 0, 1);
9218435e 6993 }
4dbc7773 6994
f4c0a303
CD
6995 /* Sysrooted prefixes are relocated because target_system_root is
6996 also relocated by gcc_exec_prefix. */
656c7a3a
AL
6997 if (*standard_startfile_prefix_1)
6998 add_sysrooted_prefix (&startfile_prefixes,
6999 standard_startfile_prefix_1, "BINUTILS",
1a5d37a1 7000 PREFIX_PRIORITY_LAST, 0, 1);
656c7a3a
AL
7001 if (*standard_startfile_prefix_2)
7002 add_sysrooted_prefix (&startfile_prefixes,
7003 standard_startfile_prefix_2, "BINUTILS",
1a5d37a1 7004 PREFIX_PRIORITY_LAST, 0, 1);
004fd4d5 7005 }
343f59d9 7006
8607048d
TT
7007 /* Process any user specified specs in the order given on the command
7008 line. */
7009 for (uptr = user_specs_head; uptr; uptr = uptr->next)
7010 {
5bbcd587 7011 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
00dcee0c 7012 R_OK, true);
d168aaee 7013 read_specs (filename ? filename : uptr->filename, false, true);
8607048d
TT
7014 }
7015
84f405a1
JJ
7016 /* Process any user self specs. */
7017 {
7018 struct spec_list *sl;
7019 for (sl = specs; sl; sl = sl->next)
7020 if (sl->name_len == sizeof "self_spec" - 1
7021 && !strcmp (sl->name, "self_spec"))
7022 do_self_spec (*sl->ptr_spec);
7023 }
7024
7025 if (compare_debug)
7026 {
7027 enum save_temps save;
7028
7029 if (!compare_debug_second)
7030 {
7031 n_switches_debug_check[1] = n_switches;
7032 n_switches_alloc_debug_check[1] = n_switches_alloc;
7033 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
7034 n_switches_alloc);
7035
7036 do_self_spec ("%:compare-debug-self-opt()");
7037 n_switches_debug_check[0] = n_switches;
7038 n_switches_alloc_debug_check[0] = n_switches_alloc;
7039 switches_debug_check[0] = switches;
7040
7041 n_switches = n_switches_debug_check[1];
7042 n_switches_alloc = n_switches_alloc_debug_check[1];
7043 switches = switches_debug_check[1];
7044 }
7045
7046 /* Avoid crash when computing %j in this early. */
7047 save = save_temps_flag;
7048 save_temps_flag = SAVE_TEMPS_NONE;
7049
7050 compare_debug = -compare_debug;
7051 do_self_spec ("%:compare-debug-self-opt()");
7052
7053 save_temps_flag = save;
7054
7055 if (!compare_debug_second)
7056 {
7057 n_switches_debug_check[1] = n_switches;
7058 n_switches_alloc_debug_check[1] = n_switches_alloc;
7059 switches_debug_check[1] = switches;
7060 compare_debug = -compare_debug;
7061 n_switches = n_switches_debug_check[0];
7062 n_switches_alloc = n_switches_debug_check[0];
7063 switches = switches_debug_check[0];
7064 }
7065 }
7066
7067
e8601ecb
JW
7068 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
7069 if (gcc_exec_prefix)
cb6edbcb
KG
7070 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
7071 spec_version, dir_separator_str, NULL);
004fd4d5 7072
ed1f651b
RS
7073 /* Now we have the specs.
7074 Set the `valid' bits for switches that match anything in any spec. */
7075
7076 validate_all_switches ();
7077
60103a34
DE
7078 /* Now that we have the switches and the specs, set
7079 the subdirectory based on the options. */
7080 set_multilib_dir ();
7081
d7f09764 7082 /* Set up to remember the pathname of gcc and any options
6afbc885 7083 needed for collect. We use argv[0] instead of progname because
d7f09764
DN
7084 we need the complete pathname. */
7085 obstack_init (&collect_obstack);
7086 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
7087 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
7088 xputenv (XOBFINISH (&collect_obstack, char *));
7089
7090 /* Set up to remember the pathname of the lto wrapper. */
7091
117cb2bc
JJ
7092 if (have_c)
7093 lto_wrapper_file = NULL;
7094 else
7095 lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
7096 X_OK, false);
de9a793e 7097 if (lto_wrapper_file)
d7f09764 7098 {
3c27ce4c 7099 lto_wrapper_file = convert_white_space (lto_wrapper_file);
de9a793e 7100 lto_wrapper_spec = lto_wrapper_file;
d7f09764
DN
7101 obstack_init (&collect_obstack);
7102 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
7103 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
7104 obstack_grow (&collect_obstack, lto_wrapper_spec,
7105 strlen (lto_wrapper_spec) + 1);
7106 xputenv (XOBFINISH (&collect_obstack, char *));
7107 }
7108
d168aaee 7109 /* Reject switches that no pass was interested in. */
ed1f651b 7110
d25a45d4 7111 for (i = 0; (int) i < n_switches; i++)
ab87f8c8 7112 if (! switches[i].validated)
d168aaee 7113 error ("unrecognized command line option %<-%s%>", switches[i].part1);
ed1f651b 7114
6a9e290e
RK
7115 /* Obey some of the options. */
7116
2628b9d3
DE
7117 if (print_search_dirs)
7118 {
f4c0a303
CD
7119 printf (_("install: %s%s\n"),
7120 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
7121 gcc_exec_prefix ? "" : machine_suffix);
00dcee0c
AM
7122 printf (_("programs: %s\n"),
7123 build_search_list (&exec_prefixes, "", false, false));
7124 printf (_("libraries: %s\n"),
7125 build_search_list (&startfile_prefixes, "", false, true));
9257393c 7126 return (0);
2628b9d3
DE
7127 }
7128
6a9e290e 7129 if (print_file_name)
2dcb563f 7130 {
6a9e290e 7131 printf ("%s\n", find_file (print_file_name));
9257393c 7132 return (0);
2dcb563f
RS
7133 }
7134
6a9e290e
RK
7135 if (print_prog_name)
7136 {
b78e932d
L
7137 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
7138 {
7139 /* Append USE_LD to to the default linker. */
7140#ifdef DEFAULT_LINKER
7141 char *ld;
7142# ifdef HAVE_HOST_EXECUTABLE_SUFFIX
7143 int len = (sizeof (DEFAULT_LINKER)
7144 - sizeof (HOST_EXECUTABLE_SUFFIX));
7145 ld = NULL;
7146 if (len > 0)
7147 {
7148 char *default_linker = xstrdup (DEFAULT_LINKER);
7149 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
7150 HOST_EXECUTABLE_SUFFIX. */
7151 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
7152 {
7153 default_linker[len] = '\0';
7154 ld = concat (default_linker, use_ld,
7155 HOST_EXECUTABLE_SUFFIX, NULL);
7156 }
7157 }
7158 if (ld == NULL)
7159# endif
7160 ld = concat (DEFAULT_LINKER, use_ld, NULL);
7161 if (access (ld, X_OK) == 0)
7162 {
7163 printf ("%s\n", ld);
7164 return (0);
7165 }
7166#endif
7167 print_prog_name = concat (print_prog_name, use_ld, NULL);
7168 }
5bbcd587 7169 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6a9e290e 7170 printf ("%s\n", (newname ? newname : print_prog_name));
9257393c 7171 return (0);
6a9e290e 7172 }
ed1f651b 7173
60103a34
DE
7174 if (print_multi_lib)
7175 {
7176 print_multilib_info ();
9257393c 7177 return (0);
60103a34
DE
7178 }
7179
7180 if (print_multi_directory)
7181 {
7182 if (multilib_dir == NULL)
7183 printf (".\n");
7184 else
7185 printf ("%s\n", multilib_dir);
9257393c 7186 return (0);
60103a34
DE
7187 }
7188
e0cdc09f
MK
7189 if (print_multiarch)
7190 {
7191 if (multiarch_dir == NULL)
7192 printf ("\n");
7193 else
7194 printf ("%s\n", multiarch_dir);
7195 return (0);
7196 }
7197
3def1397
VP
7198 if (print_sysroot)
7199 {
7200 if (target_system_root)
7201 {
7202 if (target_sysroot_suffix)
7203 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
7204 else
7205 printf ("%s\n", target_system_root);
7206 }
7207 return (0);
7208 }
7209
5bbcd587
JJ
7210 if (print_multi_os_directory)
7211 {
7212 if (multilib_os_dir == NULL)
7213 printf (".\n");
7214 else
7215 printf ("%s\n", multilib_os_dir);
7216 return (0);
7217 }
7218
14da6073
JM
7219 if (print_sysroot_headers_suffix)
7220 {
7221 if (*sysroot_hdrs_suffix_spec)
7222 {
dc5bbad3
JM
7223 printf("%s\n", (target_sysroot_hdrs_suffix
7224 ? target_sysroot_hdrs_suffix
7225 : ""));
14da6073
JM
7226 return (0);
7227 }
7228 else
7229 /* The error status indicates that only one set of fixed
7230 headers should be built. */
2dec80c7 7231 fatal_error ("not configured with sysroot headers suffix");
14da6073
JM
7232 }
7233
b8468bc7
NC
7234 if (print_help_list)
7235 {
7236 display_help ();
7237
7238 if (! verbose_flag)
7239 {
5e4adfba 7240 printf (_("\nFor bug reporting instructions, please see:\n"));
a976603e 7241 printf ("%s.\n", bug_report_url);
9218435e 7242
9257393c 7243 return (0);
b8468bc7
NC
7244 }
7245
7246 /* We do not exit here. Instead we have created a fake input file
7247 called 'help-dummy' which needs to be compiled, and we pass this
033505fc
RW
7248 on the various sub-processes, along with the --help switch.
7249 Ensure their output appears after ours. */
7250 fputc ('\n', stdout);
7251 fflush (stdout);
b8468bc7 7252 }
9218435e 7253
41fd0f9b
RAE
7254 if (print_version)
7255 {
6afbc885 7256 printf (_("%s %s%s\n"), progname, pkgversion_string,
41fd0f9b 7257 version_string);
98db73df 7258 printf ("Copyright %s 2014 Free Software Foundation, Inc.\n",
41fd0f9b
RAE
7259 _("(C)"));
7260 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
7261warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
7262 stdout);
7263 if (! verbose_flag)
7264 return 0;
7265
7266 /* We do not exit here. We use the same mechanism of --help to print
7267 the version of the sub-processes. */
7268 fputc ('\n', stdout);
7269 fflush (stdout);
7270 }
7271
ed1f651b
RS
7272 if (verbose_flag)
7273 {
dc10fd96 7274 print_configuration (stderr);
ed1f651b 7275 if (n_infiles == 0)
9257393c 7276 return (0);
ed1f651b
RS
7277 }
7278
a2a05b0a 7279 if (n_infiles == added_libraries)
2dec80c7 7280 fatal_error ("no input files");
ed1f651b 7281
4df47bca
JM
7282 if (seen_error ())
7283 goto out;
7284
ed1f651b
RS
7285 /* Make a place to record the compiler output file names
7286 that correspond to the input files. */
7287
f271358e 7288 i = n_infiles;
e37cda9b 7289 i += lang_specific_extra_outfiles;
5ed6ace5 7290 outfiles = XCNEWVEC (const char *, i);
ed1f651b
RS
7291
7292 /* Record which files were specified explicitly as link input. */
7293
d900f77d 7294 explicit_link_files = XCNEWVEC (char, n_infiles);
ed1f651b 7295
56b721c5 7296 combine_inputs = have_o || flag_wpa;
0855eab7
CT
7297
7298 for (i = 0; (int) i < n_infiles; i++)
d1bd0ded 7299 {
0855eab7 7300 const char *name = infiles[i].name;
7904f95f
EC
7301 struct compiler *compiler = lookup_compiler (name,
7302 strlen (name),
0855eab7 7303 infiles[i].language);
7904f95f 7304
0855eab7
CT
7305 if (compiler && !(compiler->combinable))
7306 combine_inputs = false;
7904f95f 7307
0855eab7
CT
7308 if (lang_n_infiles > 0 && compiler != input_file_compiler
7309 && infiles[i].language && infiles[i].language[0] != '*')
7310 infiles[i].incompiler = compiler;
7311 else if (compiler)
7312 {
7313 lang_n_infiles++;
7314 input_file_compiler = compiler;
7315 infiles[i].incompiler = compiler;
7316 }
7317 else
7318 {
7319 /* Since there is no compiler for this input file, assume it is a
9cf737f8 7320 linker file. */
0855eab7
CT
7321 explicit_link_files[i] = 1;
7322 infiles[i].incompiler = NULL;
7323 }
7324 infiles[i].compiled = false;
7325 infiles[i].preprocessed = false;
d1bd0ded 7326 }
953ff289 7327
de19a50e 7328 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
c3224d6f 7329 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
0855eab7
CT
7330
7331 for (i = 0; (int) i < n_infiles; i++)
ed1f651b 7332 {
ed1f651b
RS
7333 int this_file_error = 0;
7334
7335 /* Tell do_spec what to substitute for %i. */
7336
ed1f651b 7337 input_file_number = i;
512b62fb 7338 set_input (infiles[i].name);
ed1f651b 7339
0855eab7
CT
7340 if (infiles[i].compiled)
7341 continue;
7342
ed1f651b
RS
7343 /* Use the same thing in %o, unless cp->spec says otherwise. */
7344
6afbc885 7345 outfiles[i] = gcc_input_filename;
ed1f651b
RS
7346
7347 /* Figure out which compiler from the file's suffix. */
7348
c3224d6f
RG
7349 input_file_compiler
7350 = lookup_compiler (infiles[i].name, input_filename_length,
7351 infiles[i].language);
589005ff 7352
a9374841 7353 if (input_file_compiler)
ed1f651b
RS
7354 {
7355 /* Ok, we found an applicable compiler. Run its spec. */
ed1f651b 7356
a9374841 7357 if (input_file_compiler->spec[0] == '#')
d644be7b
ZW
7358 {
7359 error ("%s: %s compiler not installed on this system",
6afbc885 7360 gcc_input_filename, &input_file_compiler->spec[1]);
d644be7b
ZW
7361 this_file_error = 1;
7362 }
7363 else
7364 {
2153915d
AO
7365 if (compare_debug)
7366 {
04695783 7367 free (debug_check_temp_file[0]);
2153915d
AO
7368 debug_check_temp_file[0] = NULL;
7369
04695783 7370 free (debug_check_temp_file[1]);
2153915d
AO
7371 debug_check_temp_file[1] = NULL;
7372 }
7373
d644be7b 7374 value = do_spec (input_file_compiler->spec);
0855eab7 7375 infiles[i].compiled = true;
d644be7b 7376 if (value < 0)
b21292d0 7377 this_file_error = 1;
2153915d
AO
7378 else if (compare_debug && debug_check_temp_file[0])
7379 {
7380 if (verbose_flag)
2dec80c7 7381 inform (0, "recompiling with -fcompare-debug");
2153915d
AO
7382
7383 compare_debug = -compare_debug;
7384 n_switches = n_switches_debug_check[1];
efe5e5a0 7385 n_switches_alloc = n_switches_alloc_debug_check[1];
2153915d
AO
7386 switches = switches_debug_check[1];
7387
7388 value = do_spec (input_file_compiler->spec);
7389
7390 compare_debug = -compare_debug;
7391 n_switches = n_switches_debug_check[0];
efe5e5a0 7392 n_switches_alloc = n_switches_alloc_debug_check[0];
2153915d
AO
7393 switches = switches_debug_check[0];
7394
7395 if (value < 0)
7396 {
7397 error ("during -fcompare-debug recompilation");
7398 this_file_error = 1;
7399 }
7400
7401 gcc_assert (debug_check_temp_file[1]
ba78087b
KT
7402 && filename_cmp (debug_check_temp_file[0],
7403 debug_check_temp_file[1]));
2153915d
AO
7404
7405 if (verbose_flag)
2dec80c7 7406 inform (0, "comparing final insns dumps");
2153915d
AO
7407
7408 if (compare_files (debug_check_temp_file))
7409 this_file_error = 1;
7410 }
7411
7412 if (compare_debug)
7413 {
04695783 7414 free (debug_check_temp_file[0]);
2153915d
AO
7415 debug_check_temp_file[0] = NULL;
7416
04695783 7417 free (debug_check_temp_file[1]);
2153915d
AO
7418 debug_check_temp_file[1] = NULL;
7419 }
d644be7b 7420 }
ed1f651b
RS
7421 }
7422
7423 /* If this file's name does not contain a recognized suffix,
7424 record it as explicit linker input. */
7425
7426 else
7427 explicit_link_files[i] = 1;
7428
7429 /* Clear the delete-on-failure queue, deleting the files in it
7430 if this compilation failed. */
7431
7432 if (this_file_error)
7433 {
7434 delete_failure_queue ();
6afbc885 7435 errorcount++;
ed1f651b
RS
7436 }
7437 /* If this compilation succeeded, don't delete those files later. */
7438 clear_failure_queue ();
7439 }
7440
817a8255
EC
7441 /* Reset the input file name to the first compile/object file name, for use
7442 with %b in LINK_SPEC. We use the first input file that we can find
7904f95f 7443 a compiler to compile it instead of using infiles.language since for
817a8255 7444 languages other than C we use aliases that we then lookup later. */
512b62fb 7445 if (n_infiles > 0)
817a8255
EC
7446 {
7447 int i;
7448
7449 for (i = 0; i < n_infiles ; i++)
42113d6b
RG
7450 if (infiles[i].incompiler
7451 || (infiles[i].language && infiles[i].language[0] != '*'))
817a8255
EC
7452 {
7453 set_input (infiles[i].name);
7454 break;
7455 }
7456 }
512b62fb 7457
6afbc885 7458 if (!seen_error ())
15c5edb9
TT
7459 {
7460 /* Make sure INPUT_FILE_NUMBER points to first available open
7461 slot. */
7462 input_file_number = n_infiles;
7463 if (lang_specific_pre_link ())
6afbc885 7464 errorcount++;
15c5edb9 7465 }
f271358e 7466
17211ab5
GK
7467 /* Determine if there are any linker input files. */
7468 num_linker_inputs = 0;
7469 for (i = 0; (int) i < n_infiles; i++)
7470 if (explicit_link_files[i] || outfiles[i] != NULL)
7471 num_linker_inputs++;
7472
ed1f651b
RS
7473 /* Run ld to link all the compiler output files. */
7474
6afbc885 7475 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
ed1f651b
RS
7476 {
7477 int tmp = execution_count;
117cb2bc
JJ
7478
7479 if (! have_c)
7480 {
55b46574
RO
7481#if HAVE_LTO_PLUGIN > 0
7482#if HAVE_LTO_PLUGIN == 2
117cb2bc 7483 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
96bdf9b4 7484#else
117cb2bc 7485 const char *fuse_linker_plugin = "fuse-linker-plugin";
55b46574 7486#endif
96bdf9b4 7487#endif
b3865ca9 7488
117cb2bc
JJ
7489 /* We'll use ld if we can't find collect2. */
7490 if (! strcmp (linker_name_spec, "collect2"))
7491 {
7492 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7493 if (s == NULL)
7494 linker_name_spec = "ld";
7495 }
d7f09764 7496
55b46574
RO
7497#if HAVE_LTO_PLUGIN > 0
7498#if HAVE_LTO_PLUGIN == 2
117cb2bc
JJ
7499 if (!switch_matches (fno_use_linker_plugin,
7500 fno_use_linker_plugin
7501 + strlen (fno_use_linker_plugin), 0))
96bdf9b4 7502#else
117cb2bc
JJ
7503 if (switch_matches (fuse_linker_plugin,
7504 fuse_linker_plugin
7505 + strlen (fuse_linker_plugin), 0))
96bdf9b4 7506#endif
117cb2bc 7507 {
3c27ce4c
JY
7508 char *temp_spec = find_a_file (&exec_prefixes,
7509 LTOPLUGINSONAME, R_OK,
7510 false);
7511 if (!temp_spec)
117cb2bc
JJ
7512 fatal_error ("-fuse-linker-plugin, but %s not found",
7513 LTOPLUGINSONAME);
3c27ce4c 7514 linker_plugin_file_spec = convert_white_space (temp_spec);
117cb2bc 7515 }
55b46574 7516#endif
117cb2bc
JJ
7517 lto_gcc_spec = argv[0];
7518 }
d7f09764 7519
b3865ca9
RS
7520 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7521 for collect. */
00dcee0c
AM
7522 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7523 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
b3865ca9 7524
a0f87454
RS
7525 if (print_subprocess_help == 1)
7526 {
7527 printf (_("\nLinker options\n==============\n\n"));
7528 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7529 " to the linker.\n\n"));
7530 fflush (stdout);
7531 }
ed1f651b
RS
7532 value = do_spec (link_command_spec);
7533 if (value < 0)
6afbc885 7534 errorcount = 1;
ed1f651b
RS
7535 linker_was_run = (tmp != execution_count);
7536 }
7537
ed1f651b
RS
7538 /* If options said don't run linker,
7539 complain about input files to be given to the linker. */
7540
6afbc885 7541 if (! linker_was_run && !seen_error ())
d25a45d4 7542 for (i = 0; (int) i < n_infiles; i++)
01e4dd0d
KH
7543 if (explicit_link_files[i]
7544 && !(infiles[i].language && infiles[i].language[0] == '*'))
2dec80c7
JM
7545 warning (0, "%s: linker input file unused because linking not done",
7546 outfiles[i]);
ed1f651b
RS
7547
7548 /* Delete some or all of the temporary files we made. */
7549
6afbc885 7550 if (seen_error ())
ed1f651b
RS
7551 delete_failure_queue ();
7552 delete_temp_files ();
7553
b8468bc7
NC
7554 if (print_help_list)
7555 {
5e4adfba 7556 printf (("\nFor bug reporting instructions, please see:\n"));
a976603e 7557 printf ("%s\n", bug_report_url);
b8468bc7 7558 }
9218435e 7559
4df47bca 7560 out:
14a774a9 7561 return (signal_count != 0 ? 2
6afbc885 7562 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
14a774a9 7563 : 0);
ed1f651b
RS
7564}
7565
7566/* Find the proper compilation spec for the file name NAME,
004fd4d5 7567 whose length is LENGTH. LANGUAGE is the specified language,
e5e809f4 7568 or 0 if this file is to be passed to the linker. */
ed1f651b
RS
7569
7570static struct compiler *
1d088dee 7571lookup_compiler (const char *name, size_t length, const char *language)
ed1f651b
RS
7572{
7573 struct compiler *cp;
7574
3ac63d94 7575 /* If this was specified by the user to be a linker input, indicate that. */
e5e809f4
JL
7576 if (language != 0 && language[0] == '*')
7577 return 0;
7578
7579 /* Otherwise, look for the language, if one is spec'd. */
ed1f651b
RS
7580 if (language != 0)
7581 {
7582 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
e5e809f4
JL
7583 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7584 return cp;
7585
ed1f651b 7586 error ("language %s not recognized", language);
e5e809f4 7587 return 0;
ed1f651b
RS
7588 }
7589
7590 /* Look for a suffix. */
7591 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7592 {
4cf3301c
RS
7593 if (/* The suffix `-' matches only the file name `-'. */
7594 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
e5e809f4
JL
7595 || (strlen (cp->suffix) < length
7596 /* See if the suffix matches the end of NAME. */
e5e809f4
JL
7597 && !strcmp (cp->suffix,
7598 name + length - strlen (cp->suffix))
e5e809f4 7599 ))
589005ff 7600 break;
03bf1c28 7601 }
e5e809f4 7602
03bf1c28 7603#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
a1105617 7604 /* Look again, but case-insensitively this time. */
03bf1c28
MK
7605 if (cp < compilers)
7606 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7607 {
7608 if (/* The suffix `-' matches only the file name `-'. */
7609 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7610 || (strlen (cp->suffix) < length
7611 /* See if the suffix matches the end of NAME. */
7612 && ((!strcmp (cp->suffix,
7613 name + length - strlen (cp->suffix))
7614 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7615 && !strcasecmp (cp->suffix,
7616 name + length - strlen (cp->suffix)))
7617 ))
7618 break;
7619 }
7620#endif
7621
03bf1c28
MK
7622 if (cp >= compilers)
7623 {
ea414c97
ZW
7624 if (cp->spec[0] != '@')
7625 /* A non-alias entry: return it. */
7626 return cp;
9218435e 7627
ea414c97
ZW
7628 /* An alias entry maps a suffix to a language.
7629 Search for the language; pass 0 for NAME and LENGTH
7630 to avoid infinite recursion if language not found. */
6496a589 7631 return lookup_compiler (NULL, 0, cp->spec + 1);
ed1f651b 7632 }
ed1f651b
RS
7633 return 0;
7634}
7635\f
ed1f651b 7636static char *
1d088dee 7637save_string (const char *s, int len)
ed1f651b 7638{
5ed6ace5 7639 char *result = XNEWVEC (char, len + 1);
ed1f651b 7640
da61dec9 7641 memcpy (result, s, len);
ed1f651b
RS
7642 result[len] = 0;
7643 return result;
7644}
7645
d991c721 7646void
1d088dee 7647pfatal_with_name (const char *name)
ed1f651b 7648{
ab87f8c8
JL
7649 perror_with_name (name);
7650 delete_temp_files ();
7651 exit (1);
ed1f651b
RS
7652}
7653
7654static void
1d088dee 7655perror_with_name (const char *name)
ed1f651b 7656{
bdc6b402 7657 error ("%s: %m", name);
ed1f651b 7658}
ed1f651b 7659\f
4977bab6 7660static inline void
d168aaee 7661validate_switches_from_spec (const char *spec, bool user)
4977bab6
ZW
7662{
7663 const char *p = spec;
7664 char c;
7665 while ((c = *p++))
7666 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7667 /* We have a switch spec. */
d168aaee 7668 p = validate_switches (p + 1, user);
4977bab6
ZW
7669}
7670
ed1f651b 7671static void
1d088dee 7672validate_all_switches (void)
ed1f651b
RS
7673{
7674 struct compiler *comp;
b3865ca9 7675 struct spec_list *spec;
ed1f651b 7676
ea414c97 7677 for (comp = compilers; comp->spec; comp++)
d168aaee 7678 validate_switches_from_spec (comp->spec, false);
ed1f651b 7679
3ac63d94 7680 /* Look through the linked list of specs read from the specs file. */
d25a45d4 7681 for (spec = specs; spec; spec = spec->next)
d168aaee 7682 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
b3865ca9 7683
d168aaee 7684 validate_switches_from_spec (link_command_spec, false);
ed1f651b
RS
7685}
7686
7687/* Look at the switch-name that comes after START
7688 and mark as valid all supplied switches that match it. */
7689
4977bab6 7690static const char *
d168aaee 7691validate_switches (const char *start, bool user_spec)
ed1f651b 7692{
b3694847 7693 const char *p = start;
4977bab6
ZW
7694 const char *atom;
7695 size_t len;
b3694847 7696 int i;
4977bab6
ZW
7697 bool suffix = false;
7698 bool starred = false;
1d088dee 7699
4977bab6 7700#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
1d088dee 7701
10ebf5fe 7702next_member:
4977bab6
ZW
7703 SKIP_WHITE ();
7704
ed1f651b 7705 if (*p == '!')
4977bab6 7706 p++;
ed1f651b 7707
4977bab6 7708 SKIP_WHITE ();
48137d59 7709 if (*p == '.' || *p == ',')
4977bab6 7710 suffix = true, p++;
ed1f651b 7711
4977bab6
ZW
7712 atom = p;
7713 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7a975113 7714 || *p == ',' || *p == '.' || *p == '@')
d25a45d4 7715 p++;
4977bab6 7716 len = p - atom;
ed1f651b 7717
4977bab6
ZW
7718 if (*p == '*')
7719 starred = true, p++;
7720
7721 SKIP_WHITE ();
7722
7723 if (!suffix)
ed1f651b
RS
7724 {
7725 /* Mark all matching switches as valid. */
ed1f651b 7726 for (i = 0; i < n_switches; i++)
4977bab6 7727 if (!strncmp (switches[i].part1, atom, len)
d168aaee
CB
7728 && (starred || switches[i].part1[len] == '\0')
7729 && (switches[i].known || user_spec))
7730 switches[i].validated = true;
ed1f651b 7731 }
4977bab6 7732
5a0ba8c9
LJR
7733 if (*p) p++;
7734 if (*p && (p[-1] == '|' || p[-1] == '&'))
4977bab6
ZW
7735 goto next_member;
7736
5a0ba8c9 7737 if (*p && p[-1] == ':')
ed1f651b 7738 {
4977bab6 7739 while (*p && *p != ';' && *p != '}')
ed1f651b 7740 {
4977bab6
ZW
7741 if (*p == '%')
7742 {
7743 p++;
7744 if (*p == '{' || *p == '<')
d168aaee 7745 p = validate_switches (p+1, user_spec);
4977bab6 7746 else if (p[0] == 'W' && p[1] == '{')
d168aaee 7747 p = validate_switches (p+2, user_spec);
4977bab6 7748 }
e17aafd1
GK
7749 else
7750 p++;
ed1f651b 7751 }
4977bab6 7752
5a0ba8c9
LJR
7753 if (*p) p++;
7754 if (*p && p[-1] == ';')
4977bab6 7755 goto next_member;
ed1f651b 7756 }
10ebf5fe 7757
4977bab6
ZW
7758 return p;
7759#undef SKIP_WHITE
ed1f651b 7760}
60103a34 7761\f
5bbcd587
JJ
7762struct mdswitchstr
7763{
7764 const char *str;
7765 int len;
7766};
7767
7768static struct mdswitchstr *mdswitches;
7769static int n_mdswitches;
7770
961b7009 7771/* Check whether a particular argument was used. The first time we
956d6950 7772 canonicalize the switches to keep only the ones we care about. */
60103a34
DE
7773
7774static int
1d088dee 7775used_arg (const char *p, int len)
60103a34 7776{
3ac63d94
NC
7777 struct mswitchstr
7778 {
3b304f5b
ZW
7779 const char *str;
7780 const char *replace;
961b7009
MM
7781 int len;
7782 int rep_len;
7783 };
7784
7785 static struct mswitchstr *mswitches;
7786 static int n_mswitches;
7787 int i, j;
7788
7789 if (!mswitches)
7790 {
7791 struct mswitchstr *matches;
3b304f5b 7792 const char *q;
c8c2dcdc 7793 int cnt = 0;
961b7009 7794
d25a45d4
KH
7795 /* Break multilib_matches into the component strings of string
7796 and replacement string. */
1a0bdd29
RK
7797 for (q = multilib_matches; *q != '\0'; q++)
7798 if (*q == ';')
961b7009
MM
7799 cnt++;
7800
e1e4cdc4
KG
7801 matches
7802 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
961b7009
MM
7803 i = 0;
7804 q = multilib_matches;
7805 while (*q != '\0')
7806 {
7807 matches[i].str = q;
7808 while (*q != ' ')
7809 {
7810 if (*q == '\0')
3b5edfee
NS
7811 {
7812 invalid_matches:
bdc6b402 7813 fatal_error ("multilib spec %qs is invalid",
2dec80c7 7814 multilib_matches);
3b5edfee 7815 }
961b7009
MM
7816 q++;
7817 }
961b7009 7818 matches[i].len = q - matches[i].str;
60103a34 7819
961b7009
MM
7820 matches[i].replace = ++q;
7821 while (*q != ';' && *q != '\0')
7822 {
7823 if (*q == ' ')
3b5edfee 7824 goto invalid_matches;
961b7009
MM
7825 q++;
7826 }
7827 matches[i].rep_len = q - matches[i].replace;
7828 i++;
83a0c799
ZW
7829 if (*q == ';')
7830 q++;
961b7009 7831 }
60103a34 7832
71591a1d
JW
7833 /* Now build a list of the replacement string for switches that we care
7834 about. Make sure we allocate at least one entry. This prevents
7835 xmalloc from calling fatal, and prevents us from re-executing this
7836 block of code. */
7837 mswitches
5ed6ace5 7838 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
961b7009 7839 for (i = 0; i < n_switches; i++)
3371362c 7840 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
f645e2bd
RS
7841 {
7842 int xlen = strlen (switches[i].part1);
7843 for (j = 0; j < cnt; j++)
7844 if (xlen == matches[j].len
7845 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7846 {
7847 mswitches[n_mswitches].str = matches[j].replace;
7848 mswitches[n_mswitches].len = matches[j].rep_len;
7849 mswitches[n_mswitches].replace = (char *) 0;
7850 mswitches[n_mswitches].rep_len = 0;
7851 n_mswitches++;
7852 break;
7853 }
7854 }
5bbcd587
JJ
7855
7856 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7857 on the command line nor any options mutually incompatible with
7858 them. */
7859 for (i = 0; i < n_mdswitches; i++)
7860 {
7861 const char *r;
7862
59b266b1 7863 for (q = multilib_options; *q != '\0'; *q && q++)
5bbcd587
JJ
7864 {
7865 while (*q == ' ')
7866 q++;
7867
7868 r = q;
7869 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7870 || strchr (" /", q[mdswitches[i].len]) == NULL)
7871 {
7872 while (*q != ' ' && *q != '/' && *q != '\0')
7873 q++;
7874 if (*q != '/')
7875 break;
7876 q++;
7877 }
7878
7879 if (*q != ' ' && *q != '\0')
7880 {
7881 while (*r != ' ' && *r != '\0')
7882 {
7883 q = r;
7884 while (*q != ' ' && *q != '/' && *q != '\0')
7885 q++;
7886
7887 if (used_arg (r, q - r))
7888 break;
7889
7890 if (*q != '/')
7891 {
7892 mswitches[n_mswitches].str = mdswitches[i].str;
7893 mswitches[n_mswitches].len = mdswitches[i].len;
7894 mswitches[n_mswitches].replace = (char *) 0;
7895 mswitches[n_mswitches].rep_len = 0;
7896 n_mswitches++;
7897 break;
7898 }
7899
7900 r = q + 1;
7901 }
7902 break;
7903 }
7904 }
7905 }
961b7009 7906 }
03c42484 7907
961b7009
MM
7908 for (i = 0; i < n_mswitches; i++)
7909 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7910 return 1;
03c42484 7911
961b7009
MM
7912 return 0;
7913}
03c42484
RK
7914
7915static int
1d088dee 7916default_arg (const char *p, int len)
03c42484 7917{
5bbcd587 7918 int i;
e29ef920 7919
5bbcd587
JJ
7920 for (i = 0; i < n_mdswitches; i++)
7921 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7922 return 1;
03c42484
RK
7923
7924 return 0;
7925}
7926
0a8d6618
BC
7927/* Work out the subdirectory to use based on the options. The format of
7928 multilib_select is a list of elements. Each element is a subdirectory
7929 name followed by a list of options followed by a semicolon. The format
7930 of multilib_exclusions is the same, but without the preceding
7931 directory. First gcc will check the exclusions, if none of the options
7932 beginning with an exclamation point are present, and all of the other
7933 options are present, then we will ignore this completely. Passing
7934 that, gcc will consider each multilib_select in turn using the same
7935 rules for matching the options. If a match is found, that subdirectory
e0cdc09f
MK
7936 will be used.
7937 A subdirectory name is optionally followed by a colon and the corresponding
7938 multiarch name. */
60103a34
DE
7939
7940static void
1d088dee 7941set_multilib_dir (void)
60103a34 7942{
3b304f5b 7943 const char *p;
3ac63d94 7944 unsigned int this_path_len;
3b304f5b 7945 const char *this_path, *this_arg;
5bbcd587 7946 const char *start, *end;
03c42484 7947 int not_arg;
5bbcd587
JJ
7948 int ok, ndfltok, first;
7949
7950 n_mdswitches = 0;
7951 start = multilib_defaults;
7952 while (*start == ' ' || *start == '\t')
7953 start++;
7954 while (*start != '\0')
7955 {
7956 n_mdswitches++;
7957 while (*start != ' ' && *start != '\t' && *start != '\0')
7958 start++;
7959 while (*start == ' ' || *start == '\t')
7960 start++;
7961 }
7962
7963 if (n_mdswitches)
7964 {
7965 int i = 0;
7966
5ed6ace5 7967 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
5bbcd587
JJ
7968 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7969 {
7970 while (*start == ' ' || *start == '\t')
7971 start++;
7972
7973 if (*start == '\0')
7974 break;
1d088dee 7975
5bbcd587
JJ
7976 for (end = start + 1;
7977 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7978 ;
7979
7980 obstack_grow (&multilib_obstack, start, end - start);
7981 obstack_1grow (&multilib_obstack, 0);
7973fd2a 7982 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
5bbcd587
JJ
7983 mdswitches[i++].len = end - start;
7984
7985 if (*end == '\0')
7986 break;
7987 }
7988 }
60103a34 7989
0a8d6618
BC
7990 p = multilib_exclusions;
7991 while (*p != '\0')
7992 {
7993 /* Ignore newlines. */
7994 if (*p == '\n')
d25a45d4
KH
7995 {
7996 ++p;
7997 continue;
7998 }
0a8d6618
BC
7999
8000 /* Check the arguments. */
8001 ok = 1;
8002 while (*p != ';')
d25a45d4
KH
8003 {
8004 if (*p == '\0')
3b5edfee
NS
8005 {
8006 invalid_exclusions:
bdc6b402 8007 fatal_error ("multilib exclusions %qs is invalid",
2dec80c7 8008 multilib_exclusions);
3b5edfee 8009 }
d25a45d4
KH
8010
8011 if (! ok)
8012 {
8013 ++p;
8014 continue;
8015 }
8016
8017 this_arg = p;
8018 while (*p != ' ' && *p != ';')
8019 {
8020 if (*p == '\0')
3b5edfee 8021 goto invalid_exclusions;
d25a45d4
KH
8022 ++p;
8023 }
8024
8025 if (*this_arg != '!')
8026 not_arg = 0;
8027 else
8028 {
8029 not_arg = 1;
8030 ++this_arg;
8031 }
9218435e 8032
0a8d6618
BC
8033 ok = used_arg (this_arg, p - this_arg);
8034 if (not_arg)
8035 ok = ! ok;
8036
d25a45d4
KH
8037 if (*p == ' ')
8038 ++p;
8039 }
0a8d6618
BC
8040
8041 if (ok)
3ac63d94 8042 return;
0a8d6618
BC
8043
8044 ++p;
8045 }
8046
5bbcd587 8047 first = 1;
0a8d6618 8048 p = multilib_select;
e7f49d92
TG
8049
8050 /* Append multilib reuse rules if any. With those rules, we can reuse
8051 one multilib for certain different options sets. */
8052 if (strlen (multilib_reuse) > 0)
8053 p = concat (p, multilib_reuse, NULL);
8054
60103a34
DE
8055 while (*p != '\0')
8056 {
8057 /* Ignore newlines. */
8058 if (*p == '\n')
8059 {
8060 ++p;
8061 continue;
8062 }
8063
8064 /* Get the initial path. */
8065 this_path = p;
8066 while (*p != ' ')
8067 {
8068 if (*p == '\0')
3b5edfee
NS
8069 {
8070 invalid_select:
e7f49d92
TG
8071 fatal_error ("multilib select %qs %qs is invalid",
8072 multilib_select, multilib_reuse);
3b5edfee 8073 }
60103a34
DE
8074 ++p;
8075 }
8076 this_path_len = p - this_path;
8077
8078 /* Check the arguments. */
03c42484 8079 ok = 1;
5bbcd587 8080 ndfltok = 1;
60103a34
DE
8081 ++p;
8082 while (*p != ';')
8083 {
8084 if (*p == '\0')
3b5edfee 8085 goto invalid_select;
60103a34 8086
03c42484 8087 if (! ok)
60103a34
DE
8088 {
8089 ++p;
8090 continue;
8091 }
8092
8093 this_arg = p;
8094 while (*p != ' ' && *p != ';')
8095 {
8096 if (*p == '\0')
3b5edfee 8097 goto invalid_select;
60103a34
DE
8098 ++p;
8099 }
8100
03c42484
RK
8101 if (*this_arg != '!')
8102 not_arg = 0;
60103a34 8103 else
03c42484
RK
8104 {
8105 not_arg = 1;
8106 ++this_arg;
8107 }
8108
8109 /* If this is a default argument, we can just ignore it.
8110 This is true even if this_arg begins with '!'. Beginning
8111 with '!' does not mean that this argument is necessarily
8112 inappropriate for this library: it merely means that
8113 there is a more specific library which uses this
8114 argument. If this argument is a default, we need not
8115 consider that more specific library. */
5bbcd587
JJ
8116 ok = used_arg (this_arg, p - this_arg);
8117 if (not_arg)
8118 ok = ! ok;
8119
8120 if (! ok)
8121 ndfltok = 0;
8122
8123 if (default_arg (this_arg, p - this_arg))
8124 ok = 1;
60103a34
DE
8125
8126 if (*p == ' ')
8127 ++p;
8128 }
8129
5bbcd587 8130 if (ok && first)
60103a34
DE
8131 {
8132 if (this_path_len != 1
8133 || this_path[0] != '.')
8134 {
5ed6ace5 8135 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
5bbcd587
JJ
8136 char *q;
8137
878f32c3
KG
8138 strncpy (new_multilib_dir, this_path, this_path_len);
8139 new_multilib_dir[this_path_len] = '\0';
5bbcd587
JJ
8140 q = strchr (new_multilib_dir, ':');
8141 if (q != NULL)
8142 *q = '\0';
878f32c3 8143 multilib_dir = new_multilib_dir;
60103a34 8144 }
5bbcd587
JJ
8145 first = 0;
8146 }
8147
8148 if (ndfltok)
8149 {
8150 const char *q = this_path, *end = this_path + this_path_len;
8151
8152 while (q < end && *q != ':')
8153 q++;
c49d2df6 8154 if (q < end)
5bbcd587 8155 {
e0cdc09f
MK
8156 const char *q2 = q + 1, *ml_end = end;
8157 char *new_multilib_os_dir;
8158
8159 while (q2 < end && *q2 != ':')
8160 q2++;
8161 if (*q2 == ':')
8162 ml_end = q2;
646d1bed
PG
8163 if (ml_end - q == 1)
8164 multilib_os_dir = xstrdup (".");
8165 else
8166 {
8167 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
8168 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
8169 new_multilib_os_dir[ml_end - q - 1] = '\0';
8170 multilib_os_dir = new_multilib_os_dir;
8171 }
e0cdc09f
MK
8172
8173 if (q2 < end && *q2 == ':')
8174 {
8175 char *new_multiarch_dir = XNEWVEC (char, end - q2);
8176 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
8177 new_multiarch_dir[end - q2 - 1] = '\0';
8178 multiarch_dir = new_multiarch_dir;
8179 }
5bbcd587
JJ
8180 break;
8181 }
60103a34
DE
8182 }
8183
8184 ++p;
9218435e 8185 }
5bbcd587
JJ
8186
8187 if (multilib_dir == NULL && multilib_os_dir != NULL
3c40bd65 8188 && strcmp (multilib_os_dir, ".") == 0)
5bbcd587 8189 {
b1d5455a 8190 free (CONST_CAST (char *, multilib_os_dir));
5bbcd587
JJ
8191 multilib_os_dir = NULL;
8192 }
8193 else if (multilib_dir != NULL && multilib_os_dir == NULL)
8194 multilib_os_dir = multilib_dir;
60103a34
DE
8195}
8196
8197/* Print out the multiple library subdirectory selection
8198 information. This prints out a series of lines. Each line looks
8199 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
8200 required. Only the desired options are printed out, the negative
8201 matches. The options are print without a leading dash. There are
8202 no spaces to make it easy to use the information in the shell.
8203 Each subdirectory is printed only once. This assumes the ordering
0a8d6618
BC
8204 generated by the genmultilib script. Also, we leave out ones that match
8205 the exclusions. */
60103a34
DE
8206
8207static void
1d088dee 8208print_multilib_info (void)
60103a34 8209{
3b304f5b
ZW
8210 const char *p = multilib_select;
8211 const char *last_path = 0, *this_path;
03c42484 8212 int skip;
3ac63d94 8213 unsigned int last_path_len = 0;
60103a34
DE
8214
8215 while (*p != '\0')
8216 {
0a8d6618 8217 skip = 0;
60103a34
DE
8218 /* Ignore newlines. */
8219 if (*p == '\n')
8220 {
8221 ++p;
8222 continue;
8223 }
8224
8225 /* Get the initial path. */
8226 this_path = p;
8227 while (*p != ' ')
8228 {
8229 if (*p == '\0')
3b5edfee
NS
8230 {
8231 invalid_select:
bdc6b402 8232 fatal_error ("multilib select %qs is invalid", multilib_select);
3b5edfee 8233 }
7904f95f 8234
60103a34
DE
8235 ++p;
8236 }
8237
c49d2df6 8238 /* When --disable-multilib was used but target defines
e0cdc09f
MK
8239 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
8240 with .:: for multiarch configurations) are there just to find
8241 multilib_os_dir, so skip them from output. */
8242 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
c49d2df6
JJ
8243 skip = 1;
8244
0a8d6618
BC
8245 /* Check for matches with the multilib_exclusions. We don't bother
8246 with the '!' in either list. If any of the exclusion rules match
8247 all of its options with the select rule, we skip it. */
d25a45d4
KH
8248 {
8249 const char *e = multilib_exclusions;
8250 const char *this_arg;
0a8d6618 8251
d25a45d4
KH
8252 while (*e != '\0')
8253 {
8254 int m = 1;
8255 /* Ignore newlines. */
8256 if (*e == '\n')
8257 {
8258 ++e;
8259 continue;
8260 }
0a8d6618 8261
d25a45d4
KH
8262 /* Check the arguments. */
8263 while (*e != ';')
8264 {
8265 const char *q;
8266 int mp = 0;
0a8d6618 8267
d25a45d4 8268 if (*e == '\0')
3b5edfee
NS
8269 {
8270 invalid_exclusion:
bdc6b402 8271 fatal_error ("multilib exclusion %qs is invalid",
2dec80c7 8272 multilib_exclusions);
3b5edfee 8273 }
9218435e 8274
d25a45d4
KH
8275 if (! m)
8276 {
8277 ++e;
8278 continue;
8279 }
0a8d6618 8280
d25a45d4 8281 this_arg = e;
9218435e 8282
d25a45d4
KH
8283 while (*e != ' ' && *e != ';')
8284 {
8285 if (*e == '\0')
3b5edfee 8286 goto invalid_exclusion;
d25a45d4
KH
8287 ++e;
8288 }
0a8d6618 8289
d25a45d4
KH
8290 q = p + 1;
8291 while (*q != ';')
8292 {
8293 const char *arg;
8294 int len = e - this_arg;
0a8d6618 8295
d25a45d4 8296 if (*q == '\0')
3b5edfee 8297 goto invalid_select;
0a8d6618 8298
d25a45d4
KH
8299 arg = q;
8300
8301 while (*q != ' ' && *q != ';')
8302 {
8303 if (*q == '\0')
3b5edfee 8304 goto invalid_select;
0a8d6618 8305 ++q;
d25a45d4 8306 }
0a8d6618 8307
3b5edfee
NS
8308 if (! strncmp (arg, this_arg,
8309 (len < q - arg) ? q - arg : len)
8310 || default_arg (this_arg, e - this_arg))
d25a45d4
KH
8311 {
8312 mp = 1;
8313 break;
8314 }
0a8d6618 8315
d25a45d4
KH
8316 if (*q == ' ')
8317 ++q;
8318 }
9218435e 8319
d25a45d4
KH
8320 if (! mp)
8321 m = 0;
0a8d6618 8322
d25a45d4
KH
8323 if (*e == ' ')
8324 ++e;
8325 }
8326
8327 if (m)
8328 {
8329 skip = 1;
8330 break;
8331 }
8332
8333 if (*e != '\0')
8334 ++e;
8335 }
8336 }
0a8d6618
BC
8337
8338 if (! skip)
d25a45d4
KH
8339 {
8340 /* If this is a duplicate, skip it. */
3b5edfee
NS
8341 skip = (last_path != 0
8342 && (unsigned int) (p - this_path) == last_path_len
ba78087b 8343 && ! filename_ncmp (last_path, this_path, last_path_len));
60103a34 8344
d25a45d4
KH
8345 last_path = this_path;
8346 last_path_len = p - this_path;
0a8d6618 8347 }
60103a34 8348
03c42484
RK
8349 /* If this directory requires any default arguments, we can skip
8350 it. We will already have printed a directory identical to
8351 this one which does not require that default argument. */
8352 if (! skip)
8353 {
3b304f5b 8354 const char *q;
03c42484
RK
8355
8356 q = p + 1;
8357 while (*q != ';')
8358 {
3b304f5b 8359 const char *arg;
03c42484
RK
8360
8361 if (*q == '\0')
3b5edfee 8362 goto invalid_select;
03c42484
RK
8363
8364 if (*q == '!')
8365 arg = NULL;
8366 else
8367 arg = q;
8368
8369 while (*q != ' ' && *q != ';')
8370 {
8371 if (*q == '\0')
3b5edfee 8372 goto invalid_select;
03c42484
RK
8373 ++q;
8374 }
8375
8376 if (arg != NULL
8377 && default_arg (arg, q - arg))
8378 {
8379 skip = 1;
8380 break;
8381 }
8382
8383 if (*q == ' ')
8384 ++q;
8385 }
8386 }
8387
60103a34
DE
8388 if (! skip)
8389 {
3b304f5b 8390 const char *p1;
60103a34 8391
5bbcd587 8392 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
60103a34
DE
8393 putchar (*p1);
8394 putchar (';');
8395 }
8396
8397 ++p;
8398 while (*p != ';')
8399 {
8400 int use_arg;
8401
8402 if (*p == '\0')
3b5edfee 8403 goto invalid_select;
60103a34
DE
8404
8405 if (skip)
8406 {
8407 ++p;
8408 continue;
8409 }
8410
8411 use_arg = *p != '!';
8412
8413 if (use_arg)
8414 putchar ('@');
8415
8416 while (*p != ' ' && *p != ';')
8417 {
8418 if (*p == '\0')
3b5edfee 8419 goto invalid_select;
60103a34
DE
8420 if (use_arg)
8421 putchar (*p);
8422 ++p;
8423 }
8424
8425 if (*p == ' ')
8426 ++p;
8427 }
8428
8429 if (! skip)
961b7009 8430 {
3ac63d94 8431 /* If there are extra options, print them now. */
961b7009
MM
8432 if (multilib_extra && *multilib_extra)
8433 {
8434 int print_at = TRUE;
3b304f5b 8435 const char *q;
961b7009
MM
8436
8437 for (q = multilib_extra; *q != '\0'; q++)
8438 {
8439 if (*q == ' ')
8440 print_at = TRUE;
8441 else
8442 {
8443 if (print_at)
8444 putchar ('@');
8445 putchar (*q);
8446 print_at = FALSE;
8447 }
8448 }
8449 }
9218435e 8450
961b7009
MM
8451 putchar ('\n');
8452 }
60103a34
DE
8453
8454 ++p;
8455 }
8456}
f3226a90 8457\f
30d8946b
MM
8458/* getenv built-in spec function.
8459
8460 Returns the value of the environment variable given by its first
8461 argument, concatenated with the second argument. If the
8462 environment variable is not defined, a fatal error is issued. */
8463
8464static const char *
8465getenv_spec_function (int argc, const char **argv)
8466{
8467 char *value;
5557813a
NS
8468 char *result;
8469 char *ptr;
8470 size_t len;
30d8946b
MM
8471
8472 if (argc != 2)
8473 return NULL;
8474
8475 value = getenv (argv[0]);
8476 if (!value)
bdc6b402 8477 fatal_error ("environment variable %qs not defined", argv[0]);
30d8946b 8478
5557813a 8479 /* We have to escape every character of the environment variable so
fa10beec
RW
8480 they are not interpreted as active spec characters. A
8481 particularly painful case is when we are reading a variable
5557813a
NS
8482 holding a windows path complete with \ separators. */
8483 len = strlen (value) * 2 + strlen (argv[1]) + 1;
e1e4cdc4 8484 result = XNEWVAR (char, len);
5557813a
NS
8485 for (ptr = result; *value; ptr += 2)
8486 {
8487 ptr[0] = '\\';
8488 ptr[1] = *value++;
8489 }
b8698a0f 8490
5557813a 8491 strcpy (ptr, argv[1]);
b8698a0f 8492
5557813a 8493 return result;
30d8946b
MM
8494}
8495
f3226a90
JT
8496/* if-exists built-in spec function.
8497
8498 Checks to see if the file specified by the absolute pathname in
8499 ARGS exists. Returns that pathname if found.
8500
8501 The usual use for this function is to check for a library file
8502 (whose name has been expanded with %s). */
8503
8504static const char *
1d088dee 8505if_exists_spec_function (int argc, const char **argv)
f3226a90
JT
8506{
8507 /* Must have only one argument. */
3dce1408 8508 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
f3226a90
JT
8509 return argv[0];
8510
8511 return NULL;
8512}
152a5a9c
JT
8513
8514/* if-exists-else built-in spec function.
8515
8516 This is like if-exists, but takes an additional argument which
8517 is returned if the first argument does not exist. */
8518
8519static const char *
1d088dee 8520if_exists_else_spec_function (int argc, const char **argv)
152a5a9c
JT
8521{
8522 /* Must have exactly two arguments. */
8523 if (argc != 2)
8524 return NULL;
8525
3dce1408 8526 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
152a5a9c
JT
8527 return argv[0];
8528
8529 return argv[1];
8530}
3dd53121 8531
de5a5fa1
MP
8532/* sanitize built-in spec function.
8533
8534 This returns non-NULL, if sanitizing address, thread or
8535 any of the undefined behavior sanitizers. */
8536
8537static const char *
8538sanitize_spec_function (int argc, const char **argv)
8539{
8540 if (argc != 1)
8541 return NULL;
8542
8543 if (strcmp (argv[0], "address") == 0)
fec4842d
YG
8544 return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
8545 if (strcmp (argv[0], "kernel-address") == 0)
8546 return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
de5a5fa1
MP
8547 if (strcmp (argv[0], "thread") == 0)
8548 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
8549 if (strcmp (argv[0], "undefined") == 0)
85a16bf8 8550 return ((flag_sanitize & (SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT))
1c33c9b7 8551 && !flag_sanitize_undefined_trap_on_error) ? "" : NULL;
9065ada9
JJ
8552 if (strcmp (argv[0], "leak") == 0)
8553 return ((flag_sanitize
8554 & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
8555 == SANITIZE_LEAK) ? "" : NULL;
de5a5fa1
MP
8556 return NULL;
8557}
8558
3dd53121 8559/* replace-outfile built-in spec function.
ed5b9f96
GK
8560
8561 This looks for the first argument in the outfiles array's name and
8562 replaces it with the second argument. */
3dd53121
AP
8563
8564static const char *
8565replace_outfile_spec_function (int argc, const char **argv)
8566{
8567 int i;
8568 /* Must have exactly two arguments. */
8569 if (argc != 2)
8570 abort ();
7904f95f 8571
3dd53121
AP
8572 for (i = 0; i < n_infiles; i++)
8573 {
ba78087b 8574 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
3dd53121
AP
8575 outfiles[i] = xstrdup (argv[1]);
8576 }
8577 return NULL;
8578}
8579
2642f659
JH
8580/* remove-outfile built-in spec function.
8581 *
8582 * This looks for the first argument in the outfiles array's name and
8583 * removes it. */
8584
8585static const char *
8586remove_outfile_spec_function (int argc, const char **argv)
8587{
8588 int i;
8589 /* Must have exactly one argument. */
8590 if (argc != 1)
8591 abort ();
8592
8593 for (i = 0; i < n_infiles; i++)
8594 {
ba78087b 8595 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
2642f659
JH
8596 outfiles[i] = NULL;
8597 }
8598 return NULL;
8599}
8600
7904f95f 8601/* Given two version numbers, compares the two numbers.
ed5b9f96
GK
8602 A version number must match the regular expression
8603 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8604*/
8605static int
8606compare_version_strings (const char *v1, const char *v2)
8607{
8608 int rresult;
8609 regex_t r;
7904f95f 8610
ed5b9f96
GK
8611 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8612 REG_EXTENDED | REG_NOSUB) != 0)
8613 abort ();
8614 rresult = regexec (&r, v1, 0, NULL, 0);
8615 if (rresult == REG_NOMATCH)
bdc6b402 8616 fatal_error ("invalid version number %qs", v1);
ed5b9f96
GK
8617 else if (rresult != 0)
8618 abort ();
8619 rresult = regexec (&r, v2, 0, NULL, 0);
8620 if (rresult == REG_NOMATCH)
bdc6b402 8621 fatal_error ("invalid version number %qs", v2);
ed5b9f96
GK
8622 else if (rresult != 0)
8623 abort ();
8624
8625 return strverscmp (v1, v2);
8626}
8627
8628
8629/* version_compare built-in spec function.
8630
8631 This takes an argument of the following form:
8632
8633 <comparison-op> <arg1> [<arg2>] <switch> <result>
8634
8635 and produces "result" if the comparison evaluates to true,
8636 and nothing if it doesn't.
8637
8638 The supported <comparison-op> values are:
7904f95f 8639
ed5b9f96
GK
8640 >= true if switch is a later (or same) version than arg1
8641 !> opposite of >=
8642 < true if switch is an earlier version than arg1
8643 !< opposite of <
8644 >< true if switch is arg1 or later, and earlier than arg2
8645 <> true if switch is earlier than arg1 or is arg2 or later
8646
8647 If the switch is not present, the condition is false unless
8648 the first character of the <comparison-op> is '!'.
8649
8650 For example,
8651 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8652 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8653
8654static const char *
8655version_compare_spec_function (int argc, const char **argv)
8656{
8657 int comp1, comp2;
8658 size_t switch_len;
8659 const char *switch_value = NULL;
8660 int nargs = 1, i;
8661 bool result;
8662
8663 if (argc < 3)
2dec80c7 8664 fatal_error ("too few arguments to %%:version-compare");
ed5b9f96
GK
8665 if (argv[0][0] == '\0')
8666 abort ();
8667 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8668 nargs = 2;
8669 if (argc != nargs + 3)
2dec80c7 8670 fatal_error ("too many arguments to %%:version-compare");
ed5b9f96
GK
8671
8672 switch_len = strlen (argv[nargs + 1]);
8673 for (i = 0; i < n_switches; i++)
8674 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8675 && check_live_switch (i, switch_len))
8676 switch_value = switches[i].part1 + switch_len;
8677
8678 if (switch_value == NULL)
8679 comp1 = comp2 = -1;
8680 else
8681 {
8682 comp1 = compare_version_strings (switch_value, argv[1]);
8683 if (nargs == 2)
8684 comp2 = compare_version_strings (switch_value, argv[2]);
8685 else
8686 comp2 = -1; /* This value unused. */
8687 }
8688
8689 switch (argv[0][0] << 8 | argv[0][1])
8690 {
8691 case '>' << 8 | '=':
8692 result = comp1 >= 0;
8693 break;
8694 case '!' << 8 | '<':
8695 result = comp1 >= 0 || switch_value == NULL;
8696 break;
8697 case '<' << 8:
8698 result = comp1 < 0;
8699 break;
8700 case '!' << 8 | '>':
8701 result = comp1 < 0 || switch_value == NULL;
8702 break;
8703 case '>' << 8 | '<':
8704 result = comp1 >= 0 && comp2 < 0;
8705 break;
8706 case '<' << 8 | '>':
8707 result = comp1 < 0 || comp2 >= 0;
8708 break;
7904f95f 8709
ed5b9f96 8710 default:
bdc6b402 8711 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
ed5b9f96
GK
8712 }
8713 if (! result)
8714 return NULL;
8715
8716 return argv[nargs + 2];
8717}
953ff289
DN
8718
8719/* %:include builtin spec function. This differs from %include in that it
8720 can be nested inside a spec, and thus be conditionalized. It takes
8721 one argument, the filename, and looks for it in the startfile path.
8722 The result is always NULL, i.e. an empty expansion. */
8723
8724static const char *
8725include_spec_function (int argc, const char **argv)
8726{
8727 char *file;
8728
8729 if (argc != 1)
8730 abort ();
8731
4d2b059d 8732 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
d168aaee 8733 read_specs (file ? file : argv[0], false, false);
953ff289
DN
8734
8735 return NULL;
8736}
a0f87454 8737
c1ce46a5 8738/* %:find-file spec function. This function replaces its argument by
073a8998 8739 the file found through find_file, that is the -print-file-name gcc
4adbd5dd
MK
8740 program option. */
8741static const char *
c1ce46a5 8742find_file_spec_function (int argc, const char **argv)
4adbd5dd
MK
8743{
8744 const char *file;
8745
8746 if (argc != 1)
8747 abort ();
8748
8749 file = find_file (argv[0]);
8750 return file;
8751}
8752
8753
c1ce46a5 8754/* %:find-plugindir spec function. This function replaces its argument
073a8998 8755 by the -iplugindir=<dir> option. `dir' is found through find_file, that
c1ce46a5
MK
8756 is the -print-file-name gcc program option. */
8757static const char *
8758find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
8759{
8760 const char *option;
8761
8762 if (argc != 0)
8763 abort ();
8764
8765 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
8766 return option;
8767}
8768
8769
a0f87454
RS
8770/* %:print-asm-header spec function. Print a banner to say that the
8771 following output is from the assembler. */
8772
8773static const char *
8774print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8775 const char **argv ATTRIBUTE_UNUSED)
8776{
4dad0aca 8777 printf (_("Assembler options\n=================\n\n"));
a0f87454
RS
8778 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8779 fflush (stdout);
8780 return NULL;
8781}
2153915d 8782
44a22bdb 8783/* Get a random number for -frandom-seed */
b5b8b0ac 8784
44a22bdb
AK
8785static unsigned HOST_WIDE_INT
8786get_random_number (void)
b5b8b0ac 8787{
44a22bdb
AK
8788 unsigned HOST_WIDE_INT ret = 0;
8789 int fd;
8790
8791 fd = open ("/dev/urandom", O_RDONLY);
8792 if (fd >= 0)
8793 {
8794 read (fd, &ret, sizeof (HOST_WIDE_INT));
8795 close (fd);
8796 if (ret)
8797 return ret;
8798 }
b5b8b0ac
AO
8799
8800 /* Get some more or less random data. */
8801#ifdef HAVE_GETTIMEOFDAY
8802 {
8803 struct timeval tv;
8804
8805 gettimeofday (&tv, NULL);
8806 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8807 }
8808#else
8809 {
8810 time_t now = time (NULL);
8811
8812 if (now != (time_t)-1)
8813 ret = (unsigned) now;
8814 }
8815#endif
8816
c3284718 8817 return ret ^ getpid ();
b5b8b0ac
AO
8818}
8819
2153915d
AO
8820/* %:compare-debug-dump-opt spec function. Save the last argument,
8821 expected to be the last -fdump-final-insns option, or generate a
8822 temporary. */
8823
8824static const char *
8825compare_debug_dump_opt_spec_function (int arg,
8826 const char **argv ATTRIBUTE_UNUSED)
8827{
fc429b48 8828 char *ret;
2153915d
AO
8829 char *name;
8830 int which;
b5b8b0ac 8831 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
2153915d
AO
8832
8833 if (arg != 0)
2dec80c7 8834 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
2153915d 8835
2153915d
AO
8836 do_spec_2 ("%{fdump-final-insns=*:%*}");
8837 do_spec_1 (" ", 0, NULL);
8838
9771b263
DN
8839 if (argbuf.length () > 0
8840 && strcmp (argv[argbuf.length () - 1], "."))
2153915d 8841 {
b5b8b0ac
AO
8842 if (!compare_debug)
8843 return NULL;
8844
9771b263 8845 name = xstrdup (argv[argbuf.length () - 1]);
2153915d
AO
8846 ret = NULL;
8847 }
8848 else
8849 {
b5b8b0ac
AO
8850 const char *ext = NULL;
8851
9771b263 8852 if (argbuf.length () > 0)
b5b8b0ac
AO
8853 {
8854 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8855 ext = ".gkd";
8856 }
8857 else if (!compare_debug)
8858 return NULL;
8859 else
8860 do_spec_2 ("%g.gkd");
2153915d 8861
2153915d 8862 do_spec_1 (" ", 0, NULL);
2153915d 8863
9771b263 8864 gcc_assert (argbuf.length () > 0);
2153915d 8865
9771b263 8866 name = concat (argbuf.last (), ext, NULL);
b5b8b0ac
AO
8867
8868 ret = concat ("-fdump-final-insns=", name, NULL);
2153915d
AO
8869 }
8870
8871 which = compare_debug < 0;
8872 debug_check_temp_file[which] = name;
8873
b5b8b0ac
AO
8874 if (!which)
8875 {
44a22bdb 8876 unsigned HOST_WIDE_INT value = get_random_number ();
b5b8b0ac
AO
8877
8878 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8879 }
8880
8881 if (*random_seed)
fc429b48
TB
8882 {
8883 char *tmp = ret;
8884 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8885 ret, NULL);
8886 free (tmp);
8887 }
b5b8b0ac
AO
8888
8889 if (which)
8890 *random_seed = 0;
2153915d
AO
8891
8892 return ret;
8893}
8894
8895static const char *debug_auxbase_opt;
8896
8897/* %:compare-debug-self-opt spec function. Expands to the options
8898 that are to be passed in the second compilation of
8899 compare-debug. */
8900
8901static const char *
8902compare_debug_self_opt_spec_function (int arg,
8903 const char **argv ATTRIBUTE_UNUSED)
8904{
8905 if (arg != 0)
2dec80c7 8906 fatal_error ("too many arguments to %%:compare-debug-self-opt");
2153915d
AO
8907
8908 if (compare_debug >= 0)
8909 return NULL;
8910
8911 do_spec_2 ("%{c|S:%{o*:%*}}");
8912 do_spec_1 (" ", 0, NULL);
8913
9771b263 8914 if (argbuf.length () > 0)
2153915d 8915 debug_auxbase_opt = concat ("-auxbase-strip ",
9771b263 8916 argbuf.last (),
2153915d
AO
8917 NULL);
8918 else
8919 debug_auxbase_opt = NULL;
8920
8921 return concat ("\
8922%<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8923%<fdump-final-insns=* -w -S -o %j \
8924%{!fcompare-debug-second:-fcompare-debug-second} \
8925", compare_debug_opt, NULL);
8926}
8927
8928/* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8929 options that are to be passed in the second compilation of
8930 compare-debug. It expects, as an argument, the basename of the
8931 current input file name, with the .gk suffix appended to it. */
8932
8933static const char *
8934compare_debug_auxbase_opt_spec_function (int arg,
8935 const char **argv)
8936{
8937 char *name;
8938 int len;
8939
8940 if (arg == 0)
2dec80c7 8941 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
2153915d
AO
8942
8943 if (arg != 1)
2dec80c7 8944 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
2153915d
AO
8945
8946 if (compare_debug >= 0)
8947 return NULL;
8948
8949 len = strlen (argv[0]);
8950 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
2dec80c7
JM
8951 fatal_error ("argument to %%:compare-debug-auxbase-opt "
8952 "does not end in .gk");
2153915d
AO
8953
8954 if (debug_auxbase_opt)
8955 return debug_auxbase_opt;
8956
8957#define OPT "-auxbase "
8958
8959 len -= 3;
8960 name = (char*) xmalloc (sizeof (OPT) + len);
8961 memcpy (name, OPT, sizeof (OPT) - 1);
8962 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8963 name[sizeof (OPT) - 1 + len] = '\0';
8964
b5b8b0ac
AO
8965#undef OPT
8966
2153915d
AO
8967 return name;
8968}
9a37bc07
DK
8969
8970/* %:pass-through-libs spec function. Finds all -l options and input
8971 file names in the lib spec passed to it, and makes a list of them
8972 prepended with the plugin option to cause them to be passed through
8973 to the final link after all the new object files have been added. */
8974
8975const char *
8976pass_through_libs_spec_func (int argc, const char **argv)
8977{
8978 char *prepended = xstrdup (" ");
8979 int n;
8980 /* Shlemiel the painter's algorithm. Innately horrible, but at least
8981 we know that there will never be more than a handful of strings to
8982 concat, and it's only once per run, so it's not worth optimising. */
8983 for (n = 0; n < argc; n++)
8984 {
8985 char *old = prepended;
8986 /* Anything that isn't an option is a full path to an output
8987 file; pass it through if it ends in '.a'. Among options,
8988 pass only -l. */
8989 if (argv[n][0] == '-' && argv[n][1] == 'l')
8990 {
8991 const char *lopt = argv[n] + 2;
8992 /* Handle both joined and non-joined -l options. If for any
8993 reason there's a trailing -l with no joined or following
8994 arg just discard it. */
8995 if (!*lopt && ++n >= argc)
8996 break;
8997 else if (!*lopt)
8998 lopt = argv[n];
8999 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
9000 lopt, " ", NULL);
9001 }
9002 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
9003 {
9004 prepended = concat (prepended, "-plugin-opt=-pass-through=",
9005 argv[n], " ", NULL);
9006 }
9007 if (prepended != old)
9008 free (old);
9009 }
9010 return prepended;
9011}
99ea153e
SA
9012
9013/* %:replace-extension spec function. Replaces the extension of the
9014 first argument with the second argument. */
9015
9016const char *
9017replace_extension_spec_func (int argc, const char **argv)
9018{
9019 char *name;
9020 char *p;
9021 char *result;
9022 int i;
9023
9024 if (argc != 2)
9025 fatal_error ("too few arguments to %%:replace-extension");
9026
9027 name = xstrdup (argv[0]);
9028
c3284718 9029 for (i = strlen (name) - 1; i >= 0; i--)
99ea153e
SA
9030 if (IS_DIR_SEPARATOR (name[i]))
9031 break;
9032
9033 p = strrchr (name + i + 1, '.');
9034 if (p != NULL)
9035 *p = '\0';
9036
9037 result = concat (name, argv[1], NULL);
9038
9039 free (name);
9040 return result;
9041}
3c27ce4c
JY
9042
9043/* Insert backslash before spaces in ORIG (usually a file path), to
9044 avoid being broken by spec parser.
9045
9046 This function is needed as do_spec_1 treats white space (' ' and '\t')
9047 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
9048 the file name should be treated as a single argument rather than being
9049 broken into multiple. Solution is to insert '\\' before the space in a
9050 file name.
9051
9052 This function converts and only converts all occurrence of ' '
9053 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
9054 "a b" -> "a\\ b"
9055 "a b" -> "a\\ \\ b"
9056 "a\tb" -> "a\\\tb"
9057 "a\\ b" -> "a\\\\ b"
9058
9059 orig: input null-terminating string that was allocated by xalloc. The
9060 memory it points to might be freed in this function. Behavior undefined
9061 if ORIG wasn't xalloced or was freed already at entry.
9062
9063 Return: ORIG if no conversion needed. Otherwise a newly allocated string
9064 that was converted from ORIG. */
9065
9066static char *
9067convert_white_space (char *orig)
9068{
9069 int len, number_of_space = 0;
9070
9071 for (len = 0; orig[len]; len++)
9072 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
9073
9074 if (number_of_space)
9075 {
9076 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
9077 int j, k;
9078 for (j = 0, k = 0; j <= len; j++, k++)
9079 {
9080 if (orig[j] == ' ' || orig[j] == '\t')
9081 new_spec[k++] = '\\';
9082 new_spec[k] = orig[j];
9083 }
9084 free (orig);
9085 return new_spec;
9086 }
9087 else
9088 return orig;
9089}