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