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