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