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