OSDN Git Service

8aef83b82ef7afdedd2264e34911cabd9e007af7
[pf3gnuchains/gcc-fork.git] / gcc / gcc.c
1 /* Compiler driver program that can handle many languages.
2    Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4    2010
5    Free Software Foundation, Inc.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 /* This program is the user interface to the C compiler and possibly to
24 other compilers.  It is used because compilation is a complicated procedure
25 which involves running several programs and passing temporary files between
26 them, forwarding the users switches to those programs selectively,
27 and deleting the temporary files at the end.
28
29 CC recognizes how to compile each input file by suffixes in the file names.
30 Once it knows which kind of compilation to perform, the procedure for
31 compilation is specified by a string called a "spec".  */
32
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
59    DEFAULT_WORD_SWITCH_TAKES_ARG in gcc.h.  Omit the first `-'
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
71 #include "config.h"
72 #include "system.h"
73 #include "coretypes.h"
74 #include "multilib.h" /* before tm.h */
75 #include "tm.h"
76 #include <signal.h>
77 #if ! defined( SIGCHLD ) && defined( SIGCLD )
78 #  define SIGCHLD SIGCLD
79 #endif
80 #include "xregex.h"
81 #include "obstack.h"
82 #include "intl.h"
83 #include "prefix.h"
84 #include "gcc.h"
85 #include "diagnostic.h"
86 #include "flags.h"
87 #include "opts.h"
88
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
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
105 #endif
106
107 /* By default there is no special suffix for host executables.  */
108 #ifdef HOST_EXECUTABLE_SUFFIX
109 #define HAVE_HOST_EXECUTABLE_SUFFIX
110 #else
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"
119 #endif
120
121 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
122
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
128 #ifndef HAVE_KILL
129 #define kill(p,s) raise(s)
130 #endif
131
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
137 /* Flag set by cppspec.c to 1.  */
138 int is_cpp_driver;
139
140 /* Flag set to nonzero if an @file argument has been supplied to gcc.  */
141 static bool at_file_supplied;
142
143 /* Flag saying to pass the greatest exit code returned by a sub-process
144    to the calling program.  */
145 static int pass_exit_codes;
146
147 /* Definition of string containing the arguments given to configure.  */
148 #include "configargs.h"
149
150 /* Flag saying to print the directories gcc will search through looking for
151    programs, libraries, etc.  */
152
153 static int print_search_dirs;
154
155 /* Flag saying to print the full filename of this file
156    as found through our usual search mechanism.  */
157
158 static const char *print_file_name = NULL;
159
160 /* As print_file_name, but search for executable file.  */
161
162 static const char *print_prog_name = NULL;
163
164 /* Flag saying to print the relative path we'd use to
165    find libgcc.a given the current compiler flags.  */
166
167 static int print_multi_directory;
168
169 static int print_sysroot;
170
171 /* Flag saying to print the relative path we'd use to
172    find OS libraries given the current compiler flags.  */
173
174 static int print_multi_os_directory;
175
176 /* Flag saying to print the list of subdirectories and
177    compiler flags used to select them in a standard form.  */
178
179 static int print_multi_lib;
180
181 /* Flag saying to print the command line options understood by gcc and its
182    sub-processes.  */
183
184 static int print_help_list;
185
186 /* Flag saying to print the version of gcc and its sub-processes.  */
187
188 static int print_version;
189
190 /* Flag saying to print the sysroot suffix used for searching for
191    headers.  */
192
193 static int print_sysroot_headers_suffix;
194
195 /* Flag indicating whether we should print the command and arguments */
196
197 static int verbose_flag;
198
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.  */
204 static int verbose_only_flag;
205
206 /* Flag indicating how to print command line options of sub-processes.  */
207
208 static int print_subprocess_help;
209
210 /* Flag indicating whether we should report subprocess execution times
211    (if this is supported by the system - see pexecute.c).  */
212
213 static int report_times;
214
215 /* Whether we should report subprocess execution times to a file.  */
216
217 FILE *report_times_to_file = NULL;
218
219 /* Nonzero means place this string before uses of /, so that include
220    and library files can be found in an alternate location.  */
221
222 #ifdef TARGET_SYSTEM_ROOT
223 static const char *target_system_root = TARGET_SYSTEM_ROOT;
224 #else
225 static const char *target_system_root = 0;
226 #endif
227
228 /* Nonzero means pass the updated target_system_root to the compiler.  */
229
230 static int target_system_root_changed;
231
232 /* Nonzero means append this string to target_system_root.  */
233
234 static const char *target_sysroot_suffix = 0;
235
236 /* Nonzero means append this string to target_system_root for headers.  */
237
238 static const char *target_sysroot_hdrs_suffix = 0;
239
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
243 static 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  */
250 static char *save_temps_prefix = 0;
251 static size_t save_temps_length = 0;
252
253 /* Nonzero means pass multiple source files to the compiler at one time.  */
254
255 static int combine_flag = 0;
256
257 /* Nonzero means use pipes to communicate between subprocesses.
258    Overridden by either of the above two flags.  */
259
260 static int use_pipes;
261
262 /* The compiler version.  */
263
264 static const char *compiler_version;
265
266 /* The target version.  */
267
268 static const char *const spec_version = DEFAULT_TARGET_VERSION;
269
270 /* The target machine.  */
271
272 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
273
274 /* Nonzero if cross-compiling.
275    When -b is used, the value comes from the `specs' file.  */
276
277 #ifdef CROSS_DIRECTORY_STRUCTURE
278 static const char *cross_compile = "1";
279 #else
280 static const char *cross_compile = "0";
281 #endif
282
283 /* Greatest exit code of sub-processes that has been encountered up to
284    now.  */
285 static int greatest_status = 1;
286
287 /* This is the obstack which we use to allocate many strings.  */
288
289 static struct obstack obstack;
290
291 /* This is the obstack to build an environment variable to pass to
292    collect2 that describes all of the relevant switches of what to
293    pass the compiler in building the list of pointers to constructors
294    and destructors.  */
295
296 static struct obstack collect_obstack;
297
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 */
304 static const char  *wrapper_string;
305
306 /* Forward declaration for prototypes.  */
307 struct path_prefix;
308 struct prefix_list;
309
310 static void init_spec (void);
311 static void store_arg (const char *, int, int);
312 static void insert_wrapper (const char *);
313 static char *load_specs (const char *);
314 static void read_specs (const char *, int);
315 static void set_spec (const char *, const char *);
316 static struct compiler *lookup_compiler (const char *, size_t, const char *);
317 static char *build_search_list (const struct path_prefix *, const char *,
318                                 bool, bool);
319 static void xputenv (const char *);
320 static void putenv_from_prefixes (const struct path_prefix *, const char *,
321                                   bool);
322 static int access_check (const char *, int);
323 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
324 static void add_prefix (struct path_prefix *, const char *, const char *,
325                         int, int, int);
326 static void add_sysrooted_prefix (struct path_prefix *, const char *,
327                                   const char *, int, int, int);
328 static void translate_options (int *, const char *const **);
329 static char *skip_whitespace (char *);
330 static void delete_if_ordinary (const char *);
331 static void delete_temp_files (void);
332 static void delete_failure_queue (void);
333 static void clear_failure_queue (void);
334 static int check_live_switch (int, int);
335 static const char *handle_braces (const char *);
336 static inline bool input_suffix_matches (const char *, const char *);
337 static inline bool switch_matches (const char *, const char *, int);
338 static inline void mark_matching_switches (const char *, const char *, int);
339 static inline void process_marked_switches (void);
340 static const char *process_brace_body (const char *, const char *, const char *, int, int);
341 static const struct spec_function *lookup_spec_function (const char *);
342 static const char *eval_spec_function (const char *, const char *);
343 static const char *handle_spec_function (const char *);
344 static char *save_string (const char *, int);
345 static void set_collect_gcc_options (void);
346 static int do_spec_1 (const char *, int, const char *);
347 static int do_spec_2 (const char *);
348 static void do_option_spec (const char *, const char *);
349 static void do_self_spec (const char *);
350 static const char *find_file (const char *);
351 static int is_directory (const char *, bool);
352 static const char *validate_switches (const char *);
353 static void validate_all_switches (void);
354 static inline void validate_switches_from_spec (const char *);
355 static void give_switch (int, int);
356 static int used_arg (const char *, int);
357 static int default_arg (const char *, int);
358 static void set_multilib_dir (void);
359 static void print_multilib_info (void);
360 static void perror_with_name (const char *);
361 static void display_help (void);
362 static void add_preprocessor_option (const char *, int);
363 static void add_assembler_option (const char *, int);
364 static void add_linker_option (const char *, int);
365 static void process_command (int, const char **);
366 static int execute (void);
367 static void alloc_args (void);
368 static void clear_args (void);
369 static void fatal_signal (int);
370 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
371 static void init_gcc_specs (struct obstack *, const char *, const char *,
372                             const char *);
373 #endif
374 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
375 static const char *convert_filename (const char *, int, int);
376 #endif
377
378 static const char *getenv_spec_function (int, const char **);
379 static const char *if_exists_spec_function (int, const char **);
380 static const char *if_exists_else_spec_function (int, const char **);
381 static const char *replace_outfile_spec_function (int, const char **);
382 static const char *version_compare_spec_function (int, const char **);
383 static const char *include_spec_function (int, const char **);
384 static const char *find_file_spec_function (int, const char **);
385 static const char *find_plugindir_spec_function (int, const char **);
386 static const char *print_asm_header_spec_function (int, const char **);
387 static const char *compare_debug_dump_opt_spec_function (int, const char **);
388 static const char *compare_debug_self_opt_spec_function (int, const char **);
389 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
390 \f
391 /* The Specs Language
392
393 Specs are strings containing lines, each of which (if not blank)
394 is made up of a program name, and arguments separated by spaces.
395 The program name must be exact and start from root, since no path
396 is searched and it is unreliable to depend on the current working directory.
397 Redirection of input or output is not supported; the subprograms must
398 accept filenames saying what files to read and write.
399
400 In addition, the specs can contain %-sequences to substitute variable text
401 or for conditional text.  Here is a table of all defined %-sequences.
402 Note that spaces are not generated automatically around the results of
403 expanding these sequences; therefore, you can concatenate them together
404 or 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
410         and not including the directory unless -save-temps was specified
411         to put temporaries in a different location.
412  %B     same as %b, but include the file suffix (text after the last period).
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
420         the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
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.
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.)
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.
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.
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 %.
453  %d     marks the argument containing or following the %d as a
454         temporary file name, so that that file will be deleted if GCC exits
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.
459  %V     indicates that this compilation produces no "output file".
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.
470  %O     substitutes the suffix for object files.  Note that this is
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'.
478  %I     Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
479         (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
480         and -B options) and -imultilib as necessary.
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.
486  %nSTR  Print STR as a notice.  STR is terminated by a newline.
487  %x{OPTION}     Accumulate an option for %X.
488  %X     Output the accumulated linker options specified by compilations.
489  %Y     Output the accumulated assembler options specified by compilations.
490  %Z     Output the accumulated preprocessor options specified by compilations.
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
495         assembler has done its job.
496  %D     Dump out a -L option for each directory in startfile_prefixes.
497         If multilib_dir is set, extra entries are generated with it affixed.
498  %l     process LINK_SPEC as a spec.
499  %L     process LIB_SPEC as a spec.
500  %G     process LIBGCC_SPEC as a spec.
501  %R     Output the concatenation of target_system_root and
502         target_sysroot_suffix.
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.
505  %C     process CPP_SPEC as a spec.
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.
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.
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.
523  %{S}   substitutes the -S switch, if that switch was given to GCC.
524         If that switch was not specified, this substitutes nothing.
525         Here S is a metasyntactic variable.
526  %{S*}  substitutes all the switches specified to GCC whose names start
527         with -S.  This is used for -o, -I, etc; switches that take
528         arguments.  GCC considers `-o foo' as being one switch whose
529         name starts with `o'.  %{o*} would substitute this text,
530         including the space; thus, two arguments would be generated.
531  %{S*&T*} likewise, but preserve order of S and T options (the order
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*}.
535
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.
538  %{S*:X}  substitutes X if one or more switches whose names start
539           with -S was given to GCC.  Normally X is substituted only
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.
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.
548
549  %{S|T:X} substitutes X if either -S or -T was given to GCC.  This may be
550           combined with '!', '.', ',', and '*' as above binding stronger
551           than the OR.
552           If %* appears in X, all of the alternatives must be starred, and
553           only the first matching alternative is substituted.
554  %{S:X;   if S was given to GCC, substitutes X;
555    T:Y;   else if T was given to GCC, substitutes Y;
556     :D}   else substitutes D.  There can be as many clauses as you need.
557           This may be combined with '.', '!', ',', '|', and '*' as above.
558
559  %(Spec) processes a specification defined in a specs file as *Spec:
560  %[Spec] as above, but put __ around -D arguments
561
562 The conditional text X in a %{S:X} or similar construct may contain
563 other nested % constructs or spaces, or even newlines.  They are
564 processed as usual, as described above.  Trailing white space in X is
565 ignored.  White space may also appear anywhere on the left side of the
566 colon in these constructs, except between . or * and the corresponding
567 word.
568
569 The -O, -f, -m, and -W switches are handled specifically in these
570 constructs.  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
572 value is ignored, except with {S*} where S is just one letter; this
573 passes all matching options.
574
575 The character | at the beginning of the predicate text is used to indicate
576 that a command should be piped to the following command, but only if -pipe
577 is specified.
578
579 Note that it is built into GCC which switches take arguments and which
580 do not.  You might think it would be useful to generalize this to
581 allow each compiler's spec to say which switches take arguments.  But
582 this cannot be done in a consistent fashion.  GCC cannot even decide
583 which input files have been specified without knowing which switches
584 take arguments, and it must know which input files to compile in order
585 to tell which compilers to run.
586
587 GCC also knows implicitly that arguments starting in `-l' are to be
588 treated as compiler output files, and passed to the linker in their
589 proper position among the other output files.  */
590 \f
591 /* Define the macros used for specs %a, %l, %L, %S, %C, %1.  */
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
631 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
632 #endif
633
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\
641 } %{fmudflapth: --wrap=pthread_create\
642 }} %{fmudflap|fmudflapth: --wrap=main}"
643 #endif
644 #ifndef MFLIB_SPEC
645 #define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
646 #endif
647
648 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
649    included.  */
650 #ifndef LIBGCC_SPEC
651 #if defined(REAL_LIBGCC_SPEC)
652 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
653 #elif defined(LINK_LIBGCC_SPECIAL_1)
654 /* Have gcc do the search for libgcc.a.  */
655 #define LIBGCC_SPEC "libgcc.a%s"
656 #else
657 #define LIBGCC_SPEC "-lgcc"
658 #endif
659 #endif
660
661 /* config.h can define STARTFILE_SPEC to override the default crt0 files.  */
662 #ifndef STARTFILE_SPEC
663 #define STARTFILE_SPEC  \
664   "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
665 #endif
666
667 /* config.h can define ENDFILE_SPEC to override the default crtn files.  */
668 #ifndef ENDFILE_SPEC
669 #define ENDFILE_SPEC ""
670 #endif
671
672 #ifndef LINKER_NAME
673 #define LINKER_NAME "collect2"
674 #endif
675
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
682 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
683    to the assembler.  */
684 #ifndef ASM_DEBUG_SPEC
685 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
686      && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
687 #  define ASM_DEBUG_SPEC                                                \
688       (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG                            \
689        ? "%{!g0:%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}}" ASM_MAP    \
690        : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
691 # else
692 #  if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
693 #   define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
694 #  endif
695 #  if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
696 #   define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
697 #  endif
698 # endif
699 #endif
700 #ifndef ASM_DEBUG_SPEC
701 # define ASM_DEBUG_SPEC ""
702 #endif
703
704 /* Here is the spec for running the linker, after compiling all files.  */
705
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
713 #ifndef LINK_SSP_SPEC
714 #ifdef TARGET_LIBC_PROVIDES_SSP
715 #define LINK_SSP_SPEC "%{fstack-protector:}"
716 #else
717 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
718 #endif
719 #endif
720
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
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
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.  */
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.  */
744 #ifndef LINK_COMMAND_SPEC
745 #define LINK_COMMAND_SPEC "\
746 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
747     %(linker) \
748     %{fuse-linker-plugin: \
749     -plugin %(linker_plugin_file) \
750     -plugin-opt=%(lto_wrapper) \
751     -plugin-opt=-fresolution=%u.res \
752     %{static|static-libgcc:-plugin-opt=-pass-through=%(lto_libgcc)}     \
753     %{static:-plugin-opt=-pass-through=-lc}     \
754     } \
755     %{flto:%<fcompare-debug*} %{fwhopr*:%<fcompare-debug*} \
756     %{flto} %{fwhopr*} %l " LINK_PIE_SPEC \
757    "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
758     %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
759     %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
760     %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
761     %{fprofile-arcs|fprofile-generate*|coverage:-lgcov}\
762     %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
763     %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
764 #endif
765
766 #ifndef LINK_LIBGCC_SPEC
767 /* Generate -L options for startfile prefix list.  */
768 # define LINK_LIBGCC_SPEC "%D"
769 #endif
770
771 #ifndef STARTFILE_PREFIX_SPEC
772 # define STARTFILE_PREFIX_SPEC ""
773 #endif
774
775 #ifndef SYSROOT_SPEC
776 # define SYSROOT_SPEC "--sysroot=%R"
777 #endif
778
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
787 static const char *asm_debug;
788 static const char *cpp_spec = CPP_SPEC;
789 static const char *cc1_spec = CC1_SPEC;
790 static const char *cc1plus_spec = CC1PLUS_SPEC;
791 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
792 static const char *link_ssp_spec = LINK_SSP_SPEC;
793 static const char *asm_spec = ASM_SPEC;
794 static const char *asm_final_spec = ASM_FINAL_SPEC;
795 static const char *link_spec = LINK_SPEC;
796 static const char *lib_spec = LIB_SPEC;
797 static const char *mfwrap_spec = MFWRAP_SPEC;
798 static const char *mflib_spec = MFLIB_SPEC;
799 static const char *link_gomp_spec = "";
800 static const char *libgcc_spec = LIBGCC_SPEC;
801 static const char *endfile_spec = ENDFILE_SPEC;
802 static const char *startfile_spec = STARTFILE_SPEC;
803 static const char *linker_name_spec = LINKER_NAME;
804 static const char *linker_plugin_file_spec = "";
805 static const char *lto_wrapper_spec = "";
806 static const char *lto_gcc_spec = "";
807 static const char *lto_libgcc_spec = "";
808 static const char *link_command_spec = LINK_COMMAND_SPEC;
809 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
810 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
811 static const char *sysroot_spec = SYSROOT_SPEC;
812 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
813 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
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
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.  */
824 static const char *trad_capable_cpp =
825 "cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
826
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.  */
830 static const char *cpp_unique_options =
831 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
832  %{MD:-MDX %{!o:%b.d}%{o*:%.d%*}}\
833  %{MMD:-MMDX %{!o:%b.d}%{o*:%.d%*}}\
834  %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
835  %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
836  %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
837  %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
838  %{H} %C %{D*&U*&A*} %{i*} %Z %i\
839  %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
840  %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
841  %{E|M|MM:%W{o*}}";
842
843 /* This contains cpp options which are common with cc1_options and are passed
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.  */
848 static const char *cpp_options =
849 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
850  %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
851  %{undef} %{save-temps*:-fpch-preprocess}";
852
853 /* This contains cpp options which are not passed when the preprocessor
854    output will be used by another program.  */
855 static const char *cpp_debug_options = "%{d*}";
856
857 /* NB: This is shared amongst all front-ends, except for Ada.  */
858 static const char *cc1_options =
859 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
860  %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
861  %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
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}} \
864  %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
865  %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
866  %{Qn:-fno-ident} %{--help:--help}\
867  %{--target-help:--target-help}\
868  %{--help=*:--help=%(VALUE)}\
869  %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
870  %{fsyntax-only:-o %j} %{-param*}\
871  %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
872  %{coverage:-fprofile-arcs -ftest-coverage}";
873
874 static const char *asm_options =
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}";
882
883 static const char *invoke_as =
884 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
885 "%{!fwpa:\
886    %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
887    %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
888   }";
889 #else
890 "%{!fwpa:\
891    %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
892    %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
893   }";
894 #endif
895
896 /* Some compilers have limits on line lengths, and the multilib_select
897    and/or multilib_matches strings can be very long, so we build them at
898    run time.  */
899 static struct obstack multilib_obstack;
900 static const char *multilib_select;
901 static const char *multilib_matches;
902 static const char *multilib_defaults;
903 static const char *multilib_exclusions;
904
905 /* Check whether a particular argument is a default argument.  */
906
907 #ifndef MULTILIB_DEFAULTS
908 #define MULTILIB_DEFAULTS { "" }
909 #endif
910
911 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
912
913 #ifndef DRIVER_SELF_SPECS
914 #define DRIVER_SELF_SPECS ""
915 #endif
916
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
920 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
921 #endif
922
923 static const char *const driver_self_specs[] = {
924   "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
925   DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS
926 };
927
928 #ifndef OPTION_DEFAULT_SPECS
929 #define OPTION_DEFAULT_SPECS { "", "" }
930 #endif
931
932 struct default_spec
933 {
934   const char *name;
935   const char *spec;
936 };
937
938 static const struct default_spec
939   option_default_specs[] = { OPTION_DEFAULT_SPECS };
940
941 struct user_specs
942 {
943   struct user_specs *next;
944   const char *filename;
945 };
946
947 static struct user_specs *user_specs_head, *user_specs_tail;
948
949 \f
950 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
951 /* This defines which switches stop a full compilation.  */
952 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
953   ((CHAR) == 'c' || (CHAR) == 'S' || (CHAR) == 'E')
954
955 #ifndef SWITCH_CURTAILS_COMPILATION
956 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
957   DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
958 #endif
959 #endif
960
961 /* Record the mapping from file suffixes for compilation specs.  */
962
963 struct compiler
964 {
965   const char *suffix;           /* Use this compiler for input files
966                                    whose names end in this suffix.  */
967
968   const char *spec;             /* To use this compiler, run this spec.  */
969
970   const char *cpp_spec;         /* If non-NULL, substitute this spec
971                                    for `%C', rather than the usual
972                                    cpp_spec.  */
973   const int combinable;          /* If nonzero, compiler can deal with
974                                     multiple source files at once (IMA).  */
975   const int needs_preprocessing; /* If nonzero, source files need to
976                                     be run through a preprocessor.  */
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
988 static struct compiler *compilers;
989
990 /* Number of entries in `compilers', not counting the null terminator.  */
991
992 static int n_compilers;
993
994 /* The default list of file name suffixes and their compilation specs.  */
995
996 static const struct compiler default_compilers[] =
997 {
998   /* Add lists of suffixes of known languages here.  If those languages
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
1001      linking is not done".  */
1002   {".m",  "#Objective-C", 0, 0, 0}, {".mi",  "#Objective-C", 0, 0, 0},
1003   {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1004   {".mii", "#Objective-C++", 0, 0, 0},
1005   {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1006   {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
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},
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},
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},
1022   /* Next come the entries for C.  */
1023   {".c", "@c", 0, 1, 1},
1024   {"@c",
1025    /* cc1 has an integrated ISO C preprocessor.  We should invoke the
1026       external preprocessor if -save-temps is given.  */
1027      "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1028       %{!E:%{!M:%{!MM:\
1029           %{traditional|ftraditional:\
1030 %eGNU C no longer supports -traditional without -E}\
1031        %{!combine:\
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} \
1035                         %(cc1_options)}\
1036           %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1037                 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1038           %{!fsyntax-only:%(invoke_as)}} \
1039       %{combine:\
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:\
1043                 cc1 %(cpp_unique_options) %(cc1_options)}}\
1044                 %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
1045   {"-",
1046    "%{!E:%e-E or -x required when input is from standard input}\
1047     %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1048   {".h", "@c-header", 0, 0, 0},
1049   {"@c-header",
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:\
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} \
1057                         %(cc1_options)\
1058                         %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1059                         %W{o*:--output-pch=%*}}%V}\
1060           %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1061                 cc1 %(cpp_unique_options) %(cc1_options)\
1062                     %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1063                     %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
1064   {".i", "@cpp-output", 0, 1, 0},
1065   {"@cpp-output",
1066    "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
1067   {".s", "@assembler", 0, 1, 0},
1068   {"@assembler",
1069    "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
1070   {".sx", "@assembler-with-cpp", 0, 1, 0},
1071   {".S", "@assembler-with-cpp", 0, 1, 0},
1072   {"@assembler-with-cpp",
1073 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1074    "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1075       %{E|M|MM:%(cpp_debug_options)}\
1076       %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1077        as %(asm_debug) %(asm_options) %|.s %A }}}}"
1078 #else
1079    "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
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
1084    , 0, 1, 0},
1085
1086 #include "specs.h"
1087   /* Mark end of table.  */
1088   {0, 0, 0, 0, 0}
1089 };
1090
1091 /* Number of elements in default_compilers, not counting the terminator.  */
1092
1093 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1094
1095 /* A vector of options to give to the linker.
1096    These options are accumulated by %x,
1097    and substituted into the linker command with %X.  */
1098 static int n_linker_options;
1099 static char **linker_options;
1100
1101 /* A vector of options to give to the assembler.
1102    These options are accumulated by -Wa,
1103    and substituted into the assembler command with %Y.  */
1104 static int n_assembler_options;
1105 static char **assembler_options;
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.  */
1110 static int n_preprocessor_options;
1111 static char **preprocessor_options;
1112 \f
1113 /* Define how to map long options into short ones.  */
1114
1115 /* This structure describes one mapping.  */
1116 struct option_map
1117 {
1118   /* The long option's name.  */
1119   const char *const name;
1120   /* The equivalent short option.  */
1121   const char *const equivalent;
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.
1126      * => require other text after NAME as an argument.  */
1127   const char *const arg_info;
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
1133 static const struct option_map option_map[] =
1134  {
1135    {"--all-warnings", "-Wall", 0},
1136    {"--ansi", "-ansi", 0},
1137    {"--assemble", "-S", 0},
1138    {"--assert", "-A", "a"},
1139    {"--classpath", "-fclasspath=", "aj"},
1140    {"--bootclasspath", "-fbootclasspath=", "aj"},
1141    {"--CLASSPATH", "-fclasspath=", "aj"},
1142    {"--combine", "-combine", 0},
1143    {"--comments", "-C", 0},
1144    {"--comments-in-macros", "-CC", 0},
1145    {"--compile", "-c", 0},
1146    {"--debug", "-g", "oj"},
1147    {"--define-macro", "-D", "aj"},
1148    {"--dependencies", "-M", 0},
1149    {"--dump", "-d", "a"},
1150    {"--dumpbase", "-dumpbase", "a"},
1151    {"--dumpdir", "-dumpdir", "a"},
1152    {"--encoding", "-fencoding=", "aj"},
1153    {"--entry", "-e", 0},
1154    {"--extra-warnings", "-W", 0},
1155    {"--extdirs", "-fextdirs=", "aj"},
1156    {"--for-assembler", "-Wa", "a"},
1157    {"--for-linker", "-Xlinker", "a"},
1158    {"--force-link", "-u", "a"},
1159    {"--coverage", "-coverage", 0},
1160    {"--imacros", "-imacros", "a"},
1161    {"--include", "-include", "a"},
1162    {"--include-barrier", "-I-", 0},
1163    {"--include-directory", "-I", "aj"},
1164    {"--include-directory-after", "-idirafter", "a"},
1165    {"--include-prefix", "-iprefix", "a"},
1166    {"--include-with-prefix", "-iwithprefix", "a"},
1167    {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
1168    {"--include-with-prefix-after", "-iwithprefix", "a"},
1169    {"--language", "-x", "a"},
1170    {"--library-directory", "-L", "a"},
1171    {"--machine", "-m", "aj"},
1172    {"--machine-", "-m", "*j"},
1173    {"--no-canonical-prefixes", "-no-canonical-prefixes", 0},
1174    {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1175    {"--no-line-commands", "-P", 0},
1176    {"--no-precompiled-includes", "-noprecomp", 0},
1177    {"--no-standard-includes", "-nostdinc", 0},
1178    {"--no-standard-libraries", "-nostdlib", 0},
1179    {"--no-warnings", "-w", 0},
1180    {"--optimize", "-O", "oj"},
1181    {"--output", "-o", "a"},
1182    {"--output-class-directory", "-foutput-class-dir=", "ja"},
1183    {"--param", "--param", "a"},
1184    {"--pass-exit-codes", "-pass-exit-codes", 0},
1185    {"--pedantic", "-pedantic", 0},
1186    {"--pedantic-errors", "-pedantic-errors", 0},
1187    {"--pie", "-pie", 0},
1188    {"--pipe", "-pipe", 0},
1189    {"--prefix", "-B", "a"},
1190    {"--preprocess", "-E", 0},
1191    {"--print-search-dirs", "-print-search-dirs", 0},
1192    {"--print-file-name", "-print-file-name=", "aj"},
1193    {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
1194    {"--print-missing-file-dependencies", "-MG", 0},
1195    {"--print-multi-lib", "-print-multi-lib", 0},
1196    {"--print-multi-directory", "-print-multi-directory", 0},
1197    {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1198    {"--print-prog-name", "-print-prog-name=", "aj"},
1199    {"--print-sysroot", "-print-sysroot", 0},
1200    {"--print-sysroot-headers-suffix", "-print-sysroot-headers-suffix", 0},
1201    {"--profile", "-p", 0},
1202    {"--resource", "-fcompile-resource=", "aj"},
1203    {"--save-temps", "-save-temps", 0},
1204    {"--shared", "-shared", 0},
1205    {"--specs", "-specs=", "aj"},
1206    {"--static", "-static", 0},
1207    {"--std", "-std=", "aj"},
1208    {"--symbolic", "-symbolic", 0},
1209    {"--sysroot", "--sysroot=", "aj"},
1210    {"--time", "-time", 0},
1211    {"--trace-includes", "-H", 0},
1212    {"--traditional", "-traditional", 0},
1213    {"--traditional-cpp", "-traditional-cpp", 0},
1214    {"--trigraphs", "-trigraphs", 0},
1215    {"--undefine-macro", "-U", "aj"},
1216    {"--user-dependencies", "-MM", 0},
1217    {"--verbose", "-v", 0},
1218    {"--warn-", "-W", "*j"},
1219    {"--write-dependencies", "-MD", 0},
1220    {"--write-user-dependencies", "-MMD", 0},
1221    {"--", "-f", "*j"}
1222  };
1223 \f
1224
1225 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1226 static const struct {
1227   const char *const option_found;
1228   const char *const replacements;
1229 } target_option_translations[] =
1230 {
1231   TARGET_OPTION_TRANSLATE_TABLE,
1232   { 0, 0 }
1233 };
1234 #endif
1235
1236 /* Translate the options described by *ARGCP and *ARGVP.
1237    Make a new vector and store it back in *ARGVP,
1238    and store its length in *ARGCP.  */
1239
1240 static void
1241 translate_options (int *argcp, const char *const **argvp)
1242 {
1243   int i;
1244   int argc = *argcp;
1245   const char *const *argv = *argvp;
1246   int newvsize = (argc + 2) * 2 * sizeof (const char *);
1247   const char **newv = XNEWVAR (const char *, newvsize);
1248   int newindex = 0;
1249
1250   i = 0;
1251   newv[newindex++] = argv[i++];
1252
1253   while (i < argc)
1254     {
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 *);
1277               newv =  XRESIZEVAR (const char *, newv, newvsize);
1278
1279               sp = target_option_translations[tott_idx].replacements;
1280               np = xstrdup (sp);
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
1304       /* Translate -- options.  */
1305       if (argv[i][0] == '-' && argv[i][1] == '-')
1306         {
1307           size_t j;
1308           /* Find a mapping that applies to this option.  */
1309           for (j = 0; j < ARRAY_SIZE (option_map); j++)
1310             {
1311               size_t optlen = strlen (option_map[j].name);
1312               size_t arglen = strlen (argv[i]);
1313               size_t complen = arglen > optlen ? optlen : arglen;
1314               const char *arginfo = option_map[j].arg_info;
1315
1316               if (arginfo == 0)
1317                 arginfo = "";
1318
1319               if (!strncmp (argv[i], option_map[j].name, complen))
1320                 {
1321                   const char *arg = 0;
1322
1323                   if (arglen < optlen)
1324                     {
1325                       size_t k;
1326                       for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1327                         if (strlen (option_map[k].name) >= arglen
1328                             && !strncmp (argv[i], option_map[k].name, arglen))
1329                           {
1330                             error ("ambiguous abbreviation %s", argv[i]);
1331                             break;
1332                           }
1333
1334                       if (k != ARRAY_SIZE (option_map))
1335                         break;
1336                     }
1337
1338                   if (arglen > optlen)
1339                     {
1340                       /* If the option has an argument, accept that.  */
1341                       if (argv[i][optlen] == '=')
1342                         arg = argv[i] + optlen + 1;
1343
1344                       /* If this mapping requires extra text at end of name,
1345                          accept that as "argument".  */
1346                       else if (strchr (arginfo, '*') != 0)
1347                         arg = argv[i] + optlen;
1348
1349                       /* Otherwise, extra text at end means mismatch.
1350                          Try other mappings.  */
1351                       else
1352                         continue;
1353                     }
1354
1355                   else if (strchr (arginfo, '*') != 0)
1356                     {
1357                       error ("incomplete %qs option", option_map[j].name);
1358                       break;
1359                     }
1360
1361                   /* Handle arguments.  */
1362                   if (strchr (arginfo, 'a') != 0)
1363                     {
1364                       if (arg == 0)
1365                         {
1366                           if (i + 1 == argc)
1367                             {
1368                               error ("missing argument to %qs option",
1369                                      option_map[j].name);
1370                               break;
1371                             }
1372
1373                           arg = argv[++i];
1374                         }
1375                     }
1376                   else if (strchr (arginfo, '*') != 0)
1377                     ;
1378                   else if (strchr (arginfo, 'o') == 0)
1379                     {
1380                       if (arg != 0)
1381                         error ("extraneous argument to %qs option",
1382                                option_map[j].name);
1383                       arg = 0;
1384                     }
1385
1386                   /* Store the translation as one argv elt or as two.  */
1387                   if (arg != 0 && strchr (arginfo, 'j') != 0)
1388                     newv[newindex++] = concat (option_map[j].equivalent, arg,
1389                                                NULL);
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         }
1403
1404       /* Handle old-fashioned options--just copy them through,
1405          with their arguments.  */
1406       else if (argv[i][0] == '-')
1407         {
1408           const char *p = argv[i] + 1;
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);
1416           else if ((c == 'B' || c == 'b' || c == 'x')
1417                    && p[1] == 0)
1418             nskip += 1;
1419           else if (! strcmp (p, "Xlinker"))
1420             nskip += 1;
1421           else if (! strcmp (p, "Xpreprocessor"))
1422             nskip += 1;
1423           else if (! strcmp (p, "Xassembler"))
1424             nskip += 1;
1425
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
1432           while (nskip > 0)
1433             {
1434               newv[newindex++] = argv[i++];
1435               nskip--;
1436             }
1437         }
1438       else
1439         /* Ordinary operands.  */
1440         newv[newindex++] = argv[i++];
1441     }
1442
1443   newv[newindex] = 0;
1444
1445   *argvp = newv;
1446   *argcp = newindex;
1447 }
1448 \f
1449 static char *
1450 skip_whitespace (char *p)
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         {
1462           while (*p != '\n')
1463             p++;
1464           p++;
1465         }
1466       else
1467         break;
1468     }
1469
1470   return p;
1471 }
1472 /* Structures to keep track of prefixes to try when looking for files.  */
1473
1474 struct prefix_list
1475 {
1476   const char *prefix;         /* String to prepend to the path.  */
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.  */
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.  */
1483 };
1484
1485 struct 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
1494 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1495
1496 /* List of prefixes to try when looking for startup (crt0) files.  */
1497
1498 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1499
1500 /* List of prefixes to try when looking for include files.  */
1501
1502 static 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
1507 static const char *machine_suffix = 0;
1508
1509 /* Suffix to attach to directories searched for commands.
1510    This is just `MACHINE/'.  */
1511
1512 static const char *just_machine_suffix = 0;
1513
1514 /* Adjusted value of GCC_EXEC_PREFIX envvar.  */
1515
1516 static const char *gcc_exec_prefix;
1517
1518 /* Adjusted value of standard_libexec_prefix.  */
1519
1520 static const char *gcc_libexec_prefix;
1521
1522 /* Default prefixes to attach to command names.  */
1523
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
1530
1531 #ifdef CROSS_DIRECTORY_STRUCTURE  /* Don't use these prefixes for a cross compiler.  */
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
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.  */
1554 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1555 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1556 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1557 static 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.  */
1562 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1563 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1564 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1565 static const char *const standard_startfile_prefix_1
1566   = STANDARD_STARTFILE_PREFIX_1;
1567 static const char *const standard_startfile_prefix_2
1568   = STANDARD_STARTFILE_PREFIX_2;
1569
1570 /* A relative path to be used in finding the location of tools
1571    relative to the driver.  */
1572 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1573
1574 /* Subdirectory to use for locating libraries.  Set by
1575    set_multilib_dir based on the compilation options.  */
1576
1577 static const char *multilib_dir;
1578
1579 /* Subdirectory to use for locating libraries in OS conventions.  Set by
1580    set_multilib_dir based on the compilation options.  */
1581
1582 static const char *multilib_os_dir;
1583 \f
1584 /* Structure to keep track of the specs that have been defined so far.
1585    These are accessed using %(specname) or %[specname] in a compiler
1586    or link spec.  */
1587
1588 struct spec_list
1589 {
1590                                 /* The following 2 fields must be first */
1591                                 /* to allow EXTRA_SPECS to be initialized */
1592   const char *name;             /* name of the spec.  */
1593   const char *ptr;              /* available ptr if no static pointer */
1594
1595                                 /* The following fields are not initialized */
1596                                 /* by EXTRA_SPECS */
1597   const char **ptr_spec;        /* pointer to the spec itself.  */
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 */
1601 };
1602
1603 #define INIT_STATIC_SPEC(NAME,PTR) \
1604 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1605
1606 /* List of statically defined specs.  */
1607 static struct spec_list static_specs[] =
1608 {
1609   INIT_STATIC_SPEC ("asm",                      &asm_spec),
1610   INIT_STATIC_SPEC ("asm_debug",                &asm_debug),
1611   INIT_STATIC_SPEC ("asm_final",                &asm_final_spec),
1612   INIT_STATIC_SPEC ("asm_options",              &asm_options),
1613   INIT_STATIC_SPEC ("invoke_as",                &invoke_as),
1614   INIT_STATIC_SPEC ("cpp",                      &cpp_spec),
1615   INIT_STATIC_SPEC ("cpp_options",              &cpp_options),
1616   INIT_STATIC_SPEC ("cpp_debug_options",        &cpp_debug_options),
1617   INIT_STATIC_SPEC ("cpp_unique_options",       &cpp_unique_options),
1618   INIT_STATIC_SPEC ("trad_capable_cpp",         &trad_capable_cpp),
1619   INIT_STATIC_SPEC ("cc1",                      &cc1_spec),
1620   INIT_STATIC_SPEC ("cc1_options",              &cc1_options),
1621   INIT_STATIC_SPEC ("cc1plus",                  &cc1plus_spec),
1622   INIT_STATIC_SPEC ("link_gcc_c_sequence",      &link_gcc_c_sequence_spec),
1623   INIT_STATIC_SPEC ("link_ssp",                 &link_ssp_spec),
1624   INIT_STATIC_SPEC ("endfile",                  &endfile_spec),
1625   INIT_STATIC_SPEC ("link",                     &link_spec),
1626   INIT_STATIC_SPEC ("lib",                      &lib_spec),
1627   INIT_STATIC_SPEC ("mfwrap",                   &mfwrap_spec),
1628   INIT_STATIC_SPEC ("mflib",                    &mflib_spec),
1629   INIT_STATIC_SPEC ("link_gomp",                &link_gomp_spec),
1630   INIT_STATIC_SPEC ("libgcc",                   &libgcc_spec),
1631   INIT_STATIC_SPEC ("startfile",                &startfile_spec),
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),
1638   INIT_STATIC_SPEC ("multilib_exclusions",      &multilib_exclusions),
1639   INIT_STATIC_SPEC ("multilib_options",         &multilib_options),
1640   INIT_STATIC_SPEC ("linker",                   &linker_name_spec),
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),
1645   INIT_STATIC_SPEC ("link_libgcc",              &link_libgcc_spec),
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),
1649   INIT_STATIC_SPEC ("startfile_prefix_spec",    &startfile_prefix_spec),
1650   INIT_STATIC_SPEC ("sysroot_spec",             &sysroot_spec),
1651   INIT_STATIC_SPEC ("sysroot_suffix_spec",      &sysroot_suffix_spec),
1652   INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1653 };
1654
1655 #ifdef EXTRA_SPECS              /* additional specs needed */
1656 /* Structure to keep track of just the first two args of a spec_list.
1657    That is all that the EXTRA_SPECS macro gives us.  */
1658 struct spec_list_1
1659 {
1660   const char *const name;
1661   const char *const ptr;
1662 };
1663
1664 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1665 static struct spec_list *extra_specs = (struct spec_list *) 0;
1666 #endif
1667
1668 /* List of dynamically allocates specs that have been defined so far.  */
1669
1670 static struct spec_list *specs = (struct spec_list *) 0;
1671 \f
1672 /* List of static spec functions.  */
1673
1674 static const struct spec_function static_spec_functions[] =
1675 {
1676   { "getenv",                   getenv_spec_function },
1677   { "if-exists",                if_exists_spec_function },
1678   { "if-exists-else",           if_exists_else_spec_function },
1679   { "replace-outfile",          replace_outfile_spec_function },
1680   { "version-compare",          version_compare_spec_function },
1681   { "include",                  include_spec_function },
1682   { "find-file",                find_file_spec_function },
1683   { "find-plugindir",           find_plugindir_spec_function },
1684   { "print-asm-header",         print_asm_header_spec_function },
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 },
1688 #ifdef EXTRA_SPEC_FUNCTIONS
1689   EXTRA_SPEC_FUNCTIONS
1690 #endif
1691   { 0, 0 }
1692 };
1693
1694 static int processing_spec_function;
1695 \f
1696 /* Add appropriate libgcc specs to OBSTACK, taking into account
1697    various permutations of -shared-libgcc, -shared, and such.  */
1698
1699 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1700
1701 #ifndef USE_LD_AS_NEEDED
1702 #define USE_LD_AS_NEEDED 0
1703 #endif
1704
1705 static void
1706 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1707                 const char *static_name, const char *eh_name)
1708 {
1709   char *buf;
1710
1711   buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1712                 "%{!static:%{!static-libgcc:"
1713 #if USE_LD_AS_NEEDED
1714                 "%{!shared-libgcc:",
1715                 static_name, " --as-needed ", shared_name, " --no-as-needed"
1716                 "}"
1717                 "%{shared-libgcc:",
1718                 shared_name, "%{!shared: ", static_name, "}"
1719                 "}"
1720 #else
1721                 "%{!shared:"
1722                 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1723                 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1724                 "}"
1725 #ifdef LINK_EH_SPEC
1726                 "%{shared:"
1727                 "%{shared-libgcc:", shared_name, "}"
1728                 "%{!shared-libgcc:", static_name, "}"
1729                 "}"
1730 #else
1731                 "%{shared:", shared_name, "}"
1732 #endif
1733 #endif
1734                 "}}", NULL);
1735
1736   obstack_grow (obstack, buf, strlen (buf));
1737   free (buf);
1738 }
1739 #endif /* ENABLE_SHARED_LIBGCC */
1740
1741 /* Initialize the specs lookup routines.  */
1742
1743 static void
1744 init_spec (void)
1745 {
1746   struct spec_list *next = (struct spec_list *) 0;
1747   struct spec_list *sl   = (struct spec_list *) 0;
1748   int i;
1749
1750   if (specs)
1751     return;                     /* Already initialized.  */
1752
1753   if (verbose_flag)
1754     fnotice (stderr, "Using built-in specs.\n");
1755
1756 #ifdef EXTRA_SPECS
1757   extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1758
1759   for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1760     {
1761       sl = &extra_specs[i];
1762       sl->name = extra_specs_1[i].name;
1763       sl->ptr = extra_specs_1[i].ptr;
1764       sl->next = next;
1765       sl->name_len = strlen (sl->name);
1766       sl->ptr_spec = &sl->ptr;
1767       next = sl;
1768     }
1769 #endif
1770
1771   for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1772     {
1773       sl = &static_specs[i];
1774       sl->next = next;
1775       next = sl;
1776     }
1777
1778 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
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
1792             its dependencies depends on a shared libgcc.
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;
1809
1810     /* Transform the extant libgcc_spec into one that uses the shared libgcc
1811        when given the proper command line arguments.  */
1812     while (*p)
1813       {
1814         if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1815           {
1816             init_gcc_specs (&obstack,
1817                             "-lgcc_s"
1818 #ifdef USE_LIBUNWIND_EXCEPTIONS
1819                             " -lunwind"
1820 #endif
1821                             ,
1822                             "-lgcc",
1823                             "-lgcc_eh"
1824 #ifdef USE_LIBUNWIND_EXCEPTIONS
1825 # ifdef HAVE_LD_STATIC_DYNAMIC
1826                             " %{!static:-Bstatic} -lunwind %{!static:-Bdynamic}"
1827 # else
1828                             " -lunwind"
1829 # endif
1830 #endif
1831                             );
1832
1833             p += 5;
1834             in_sep = 0;
1835           }
1836         else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1837           {
1838             /* Ug.  We don't know shared library extensions.  Hope that
1839                systems that use this form don't do shared libraries.  */
1840             init_gcc_specs (&obstack,
1841                             "-lgcc_s",
1842                             "libgcc.a%s",
1843                             "libgcc_eh.a%s"
1844 #ifdef USE_LIBUNWIND_EXCEPTIONS
1845                             " -lunwind"
1846 #endif
1847                             );
1848             p += 10;
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');
1860     libgcc_spec = XOBFINISH (&obstack, const char *);
1861   }
1862 #endif
1863 #ifdef USE_AS_TRADITIONAL_FORMAT
1864   /* Prepend "--traditional-format" to whatever asm_spec we had before.  */
1865   {
1866     static const char tf[] = "--traditional-format ";
1867     obstack_grow (&obstack, tf, sizeof(tf) - 1);
1868     obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1869     asm_spec = XOBFINISH (&obstack, const char *);
1870   }
1871 #endif
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
1879   /* Prepend LINK_EH_SPEC to whatever link_spec we had before.  */
1880   obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1881 # endif
1882   obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1883   link_spec = XOBFINISH (&obstack, const char *);
1884 #endif
1885
1886   specs = sl;
1887 }
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
1891    current spec.  */
1892
1893 static void
1894 set_spec (const char *name, const char *spec)
1895 {
1896   struct spec_list *sl;
1897   const char *old_spec;
1898   int name_len = strlen (name);
1899   int i;
1900
1901   /* If this is the first call, initialize the statically allocated specs.  */
1902   if (!specs)
1903     {
1904       struct spec_list *next = (struct spec_list *) 0;
1905       for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1906         {
1907           sl = &static_specs[i];
1908           sl->next = next;
1909           next = sl;
1910         }
1911       specs = sl;
1912     }
1913
1914   /* See if the spec already exists.  */
1915   for (sl = specs; sl; sl = sl->next)
1916     if (name_len == sl->name_len && !strcmp (sl->name, name))
1917       break;
1918
1919   if (!sl)
1920     {
1921       /* Not found - make it.  */
1922       sl = XNEW (struct spec_list);
1923       sl->name = xstrdup (name);
1924       sl->name_len = name_len;
1925       sl->ptr_spec = &sl->ptr;
1926       sl->alloc_p = 0;
1927       *(sl->ptr_spec) = "";
1928       sl->next = specs;
1929       specs = sl;
1930     }
1931
1932   old_spec = *(sl->ptr_spec);
1933   *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1934                      ? concat (old_spec, spec + 1, NULL)
1935                      : xstrdup (spec));
1936
1937 #ifdef DEBUG_SPECS
1938   if (verbose_flag)
1939     fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1940 #endif
1941
1942   /* Free the old spec.  */
1943   if (old_spec && sl->alloc_p)
1944     free (CONST_CAST(char *, old_spec));
1945
1946   sl->alloc_p = 1;
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
1953 static const char **argbuf;
1954
1955 /* Number of elements allocated in argbuf.  */
1956
1957 static int argbuf_length;
1958
1959 /* Number of elements in argbuf currently in use (containing args).  */
1960
1961 static int argbuf_index;
1962
1963 /* Position in the argbuf array containing the name of the output file
1964    (the value associated with the "-o" flag).  */
1965
1966 static int have_o_argbuf_index = 0;
1967
1968 /* Were the options -c, -S or -E passed.  */
1969 static int have_c = 0;
1970
1971 /* Was the option -o passed.  */
1972 static int have_o = 0;
1973
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.  */
1977
1978 static struct temp_name {
1979   const char *suffix;   /* suffix associated with the code.  */
1980   int length;           /* strlen (suffix).  */
1981   int unique;           /* Indicates whether %g or %u/%U was used.  */
1982   const char *filename; /* associated filename.  */
1983   int filename_length;  /* strlen (filename).  */
1984   struct temp_name *next;
1985 } *temp_names;
1986
1987 /* Number of commands executed so far.  */
1988
1989 static int execution_count;
1990
1991 /* Number of commands that exited with a signal.  */
1992
1993 static int signal_count;
1994 \f
1995 /* Allocate the argument vector.  */
1996
1997 static void
1998 alloc_args (void)
1999 {
2000   argbuf_length = 10;
2001   argbuf = XNEWVEC (const char *, argbuf_length);
2002 }
2003
2004 /* Clear out the vector of arguments (after a command is executed).  */
2005
2006 static void
2007 clear_args (void)
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
2019 static void
2020 store_arg (const char *arg, int delete_always, int delete_failure)
2021 {
2022   if (argbuf_index + 1 == argbuf_length)
2023     argbuf = XRESIZEVEC (const char *, argbuf, (argbuf_length *= 2));
2024
2025   argbuf[argbuf_index++] = arg;
2026   argbuf[argbuf_index] = 0;
2027
2028   if (strcmp (arg, "-o") == 0)
2029     have_o_argbuf_index = argbuf_index;
2030   if (delete_always || delete_failure)
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     }
2040 }
2041 \f
2042 /* Load specs from a file name named FILENAME, replacing occurrences of
2043    various different types of line-endings, \r\n, \n\r and just \r, with
2044    a single \n.  */
2045
2046 static char *
2047 load_specs (const char *filename)
2048 {
2049   int desc;
2050   int readlen;
2051   struct stat statbuf;
2052   char *buffer;
2053   char *buffer_p;
2054   char *specs;
2055   char *specs_p;
2056
2057   if (verbose_flag)
2058     fnotice (stderr, "Reading specs from %s\n", filename);
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.  */
2068   buffer = XNEWVEC (char, statbuf.st_size + 1);
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
2075   specs = XNEWVEC (char, readlen + 1);
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')
2082         {
2083           if (buffer_p > buffer && *(buffer_p - 1) == '\n')     /* \n\r */
2084             skip = 1;
2085           else if (*(buffer_p + 1) == '\n')                     /* \r\n */
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
2104    *asm, *cc1, *cpp, *link, *startfile, etc.
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
2110 static void
2111 read_specs (const char *filename, int main_p)
2112 {
2113   char *buffer;
2114   char *p;
2115
2116   buffer = load_specs (filename);
2117
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;
2137           while (*p && *p != '\n')
2138             p++;
2139
2140           /* Skip '\n'.  */
2141           p++;
2142
2143           if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2144               && (p1[sizeof "%include" - 1] == ' '
2145                   || p1[sizeof "%include" - 1] == '\t'))
2146             {
2147               char *new_filename;
2148
2149               p1 += sizeof ("%include");
2150               while (*p1 == ' ' || *p1 == '\t')
2151                 p1++;
2152
2153               if (*p1++ != '<' || p[-2] != '>')
2154                 fatal_error ("specs %%include syntax malformed after "
2155                              "%ld characters",
2156                              (long) (p1 - buffer + 1));
2157
2158               p[-2] = '\0';
2159               new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2160               read_specs (new_filename ? new_filename : p1, FALSE);
2161               continue;
2162             }
2163           else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2164                    && (p1[sizeof "%include_noerr" - 1] == ' '
2165                        || p1[sizeof "%include_noerr" - 1] == '\t'))
2166             {
2167               char *new_filename;
2168
2169               p1 += sizeof "%include_noerr";
2170               while (*p1 == ' ' || *p1 == '\t')
2171                 p1++;
2172
2173               if (*p1++ != '<' || p[-2] != '>')
2174                 fatal_error ("specs %%include syntax malformed after "
2175                              "%ld characters",
2176                              (long) (p1 - buffer + 1));
2177
2178               p[-2] = '\0';
2179               new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2180               if (new_filename)
2181                 read_specs (new_filename, FALSE);
2182               else if (verbose_flag)
2183                 fnotice (stderr, "could not find specs file %s\n", p1);
2184               continue;
2185             }
2186           else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2187                    && (p1[sizeof "%rename" - 1] == ' '
2188                        || p1[sizeof "%rename" - 1] == '\t'))
2189             {
2190               int name_len;
2191               struct spec_list *sl;
2192               struct spec_list *newsl;
2193
2194               /* Get original name.  */
2195               p1 += sizeof "%rename";
2196               while (*p1 == ' ' || *p1 == '\t')
2197                 p1++;
2198
2199               if (! ISALPHA ((unsigned char) *p1))
2200                 fatal_error ("specs %%rename syntax malformed after "
2201                              "%ld characters",
2202                              (long) (p1 - buffer));
2203
2204               p2 = p1;
2205               while (*p2 && !ISSPACE ((unsigned char) *p2))
2206                 p2++;
2207
2208               if (*p2 != ' ' && *p2 != '\t')
2209                 fatal_error ("specs %%rename syntax malformed after "
2210                              "%ld characters",
2211                              (long) (p2 - buffer));
2212
2213               name_len = p2 - p1;
2214               *p2++ = '\0';
2215               while (*p2 == ' ' || *p2 == '\t')
2216                 p2++;
2217
2218               if (! ISALPHA ((unsigned char) *p2))
2219                 fatal_error ("specs %%rename syntax malformed after "
2220                              "%ld characters",
2221                              (long) (p2 - buffer));
2222
2223               /* Get new spec name.  */
2224               p3 = p2;
2225               while (*p3 && !ISSPACE ((unsigned char) *p3))
2226                 p3++;
2227
2228               if (p3 != p - 1)
2229                 fatal_error ("specs %%rename syntax malformed after "
2230                              "%ld characters",
2231                              (long) (p3 - buffer));
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)
2239                 fatal_error ("specs %s spec was not found to be renamed", p1);
2240
2241               if (strcmp (p1, p2) == 0)
2242                 continue;
2243
2244               for (newsl = specs; newsl; newsl = newsl->next)
2245                 if (strcmp (newsl->name, p2) == 0)
2246                   fatal_error ("%s: attempt to rename spec %qs to "
2247                                "already defined spec %qs",
2248                     filename, p1, p2);
2249
2250               if (verbose_flag)
2251                 {
2252                   fnotice (stderr, "rename spec %s to %s\n", p1, p2);
2253 #ifdef DEBUG_SPECS
2254                   fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2255 #endif
2256                 }
2257
2258               set_spec (p2, *(sl->ptr_spec));
2259               if (sl->alloc_p)
2260                 free (CONST_CAST (char *, *(sl->ptr_spec)));
2261
2262               *(sl->ptr_spec) = "";
2263               sl->alloc_p = 0;
2264               continue;
2265             }
2266           else
2267             fatal_error ("specs unknown %% command after %ld characters",
2268                          (long) (p1 - buffer));
2269         }
2270
2271       /* Find the colon that should end the suffix.  */
2272       p1 = p;
2273       while (*p1 && *p1 != ':' && *p1 != '\n')
2274         p1++;
2275
2276       /* The colon shouldn't be missing.  */
2277       if (*p1 != ':')
2278         fatal_error ("specs file malformed after %ld characters",
2279                      (long) (p1 - buffer));
2280
2281       /* Skip back over trailing whitespace.  */
2282       p2 = p1;
2283       while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2284         p2--;
2285
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)
2291         fatal_error ("specs file malformed after %ld characters",
2292                      (long) (p - buffer));
2293
2294       p1 = p;
2295       /* Find next blank line or end of string.  */
2296       while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2297         p1++;
2298
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] == '#')
2311             while (*in && *in != '\n')
2312               in++;
2313
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
2330             = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2331
2332           compilers[n_compilers].suffix = suffix;
2333           compilers[n_compilers].spec = spec;
2334           n_compilers++;
2335           memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2336         }
2337
2338       if (*suffix == 0)
2339         link_command_spec = spec;
2340     }
2341
2342   if (link_command_spec == 0)
2343     fatal_error ("spec file has no spec for linking");
2344 }
2345 \f
2346 /* Record the names of temporary files we tell compilers to write,
2347    and delete them at the end of the run.  */
2348
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
2360 static const char *temp_filename;
2361
2362 /* Length of the prefix.  */
2363
2364 static int temp_filename_length;
2365
2366 /* Define the list of temporary files to delete.  */
2367
2368 struct temp_file
2369 {
2370   const char *name;
2371   struct temp_file *next;
2372 };
2373
2374 /* Queue of files to delete on success or failure of compilation.  */
2375 static struct temp_file *always_delete_queue;
2376 /* Queue of files to delete on failure of compilation.  */
2377 static 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
2385 void
2386 record_temp_file (const char *filename, int always_delete, int fail_delete)
2387 {
2388   char *const name = xstrdup (filename);
2389
2390   if (always_delete)
2391     {
2392       struct temp_file *temp;
2393       for (temp = always_delete_queue; temp; temp = temp->next)
2394         if (! strcmp (name, temp->name))
2395           goto already1;
2396
2397       temp = XNEW (struct temp_file);
2398       temp->next = always_delete_queue;
2399       temp->name = name;
2400       always_delete_queue = temp;
2401
2402     already1:;
2403     }
2404
2405   if (fail_delete)
2406     {
2407       struct temp_file *temp;
2408       for (temp = failure_delete_queue; temp; temp = temp->next)
2409         if (! strcmp (name, temp->name))
2410           goto already2;
2411
2412       temp = XNEW (struct temp_file);
2413       temp->next = failure_delete_queue;
2414       temp->name = name;
2415       failure_delete_queue = temp;
2416
2417     already2:;
2418     }
2419 }
2420
2421 /* Delete all the temporary files whose names we previously recorded.  */
2422
2423 #ifndef DELETE_IF_ORDINARY
2424 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG)        \
2425 do                                                      \
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
2434 static void
2435 delete_if_ordinary (const char *name)
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')
2445     while ((c = getchar ()) != '\n' && c != EOF)
2446       ;
2447
2448   if (i == 'y' || i == 'Y')
2449 #endif /* DEBUG */
2450   DELETE_IF_ORDINARY (name, st, verbose_flag);
2451 }
2452
2453 static void
2454 delete_temp_files (void)
2455 {
2456   struct temp_file *temp;
2457
2458   for (temp = always_delete_queue; temp; temp = temp->next)
2459     delete_if_ordinary (temp->name);
2460   always_delete_queue = 0;
2461 }
2462
2463 /* Delete all the files to be deleted on error.  */
2464
2465 static void
2466 delete_failure_queue (void)
2467 {
2468   struct temp_file *temp;
2469
2470   for (temp = failure_delete_queue; temp; temp = temp->next)
2471     delete_if_ordinary (temp->name);
2472 }
2473
2474 static void
2475 clear_failure_queue (void)
2476 {
2477   failure_delete_queue = 0;
2478 }
2479 \f
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
2493 static void *
2494 for_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)
2499 {
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)
2513     {
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);
2520
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)
2537         {
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;
2543           path = XNEWVEC (char, len);
2544         }
2545
2546       for (pl = paths->plist; pl != 0; pl = pl->next)
2547         {
2548           len = strlen (pl->prefix);
2549           memcpy (path, pl->prefix, len);
2550
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             }
2598         }
2599       if (pl)
2600         break;
2601
2602       if (multi_dir == NULL && multi_os_dir == NULL)
2603         break;
2604
2605       /* Run through the paths again, this time without multilibs.
2606          Don't repeat any we have already seen.  */
2607       if (multi_dir)
2608         {
2609           free (CONST_CAST (char *, multi_dir));
2610           multi_dir = NULL;
2611           free (CONST_CAST (char *, multi_suffix));
2612           multi_suffix = machine_suffix;
2613           free (CONST_CAST (char *, just_multi_suffix));
2614           just_multi_suffix = just_machine_suffix;
2615         }
2616       else
2617         skip_multi_dir = true;
2618       if (multi_os_dir)
2619         {
2620           free (CONST_CAST (char *, multi_os_dir));
2621           multi_os_dir = NULL;
2622         }
2623       else
2624         skip_multi_os_dir = true;
2625     }
2626
2627   if (multi_dir)
2628     {
2629       free (CONST_CAST (char *, multi_dir));
2630       free (CONST_CAST (char *, multi_suffix));
2631       free (CONST_CAST (char *, just_multi_suffix));
2632     }
2633   if (multi_os_dir)
2634     free (CONST_CAST (char *, multi_os_dir));
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
2642 struct add_to_obstack_info {
2643   struct obstack *ob;
2644   bool check_dir;
2645   bool first_time;
2646 };
2647
2648 static void *
2649 add_to_obstack (char *path, void *data)
2650 {
2651   struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
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
2665 /* Add or change the value of an environment variable, outputting the
2666    change to standard error if in verbose mode.  */
2667 static void
2668 xputenv (const char *string)
2669 {
2670   if (verbose_flag)
2671     fnotice (stderr, "%s\n", string);
2672   putenv (CONST_CAST (char *, string));
2673 }
2674
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
2683 static char *
2684 build_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);
2697
2698   obstack_1grow (&collect_obstack, '\0');
2699   return XOBFINISH (&collect_obstack, char *);
2700 }
2701
2702 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2703    for collect.  */
2704
2705 static void
2706 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2707                       bool do_multi)
2708 {
2709   xputenv (build_search_list (paths, env_var, true, do_multi));
2710 }
2711 \f
2712 /* Check whether NAME can be accessed in MODE.  This is like access,
2713    except that it never considers directories to be executable.  */
2714
2715 static int
2716 access_check (const char *name, int mode)
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
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
2734 struct 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
2742 static void *
2743 file_at_path (char *path, void *data)
2744 {
2745   struct file_at_path_info *info = (struct file_at_path_info *) data;
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
2767 /* Search for NAME using the prefix list PREFIXES.  MODE is passed to
2768    access to check permissions.  If DO_MULTI is true, search multilib
2769    paths then non-multilib paths, otherwise do not search multilib paths.
2770    Return 0 if not found, otherwise return its name, allocated with malloc.  */
2771
2772 static char *
2773 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2774              bool do_multi)
2775 {
2776   struct file_at_path_info info;
2777
2778 #ifdef DEFAULT_ASSEMBLER
2779   if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2780     return xstrdup (DEFAULT_ASSEMBLER);
2781 #endif
2782
2783 #ifdef DEFAULT_LINKER
2784   if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2785     return xstrdup (DEFAULT_LINKER);
2786 #endif
2787
2788   /* Determine the filename to execute (special case for absolute paths).  */
2789
2790   if (IS_ABSOLUTE_PATH (name))
2791     {
2792       if (access (name, mode) == 0)
2793         return xstrdup (name);
2794
2795       return NULL;
2796     }
2797
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;
2803
2804   return (char*) for_each_path (pprefix, do_multi,
2805                                 info.name_len + info.suffix_len,
2806                                 file_at_path, &info);
2807 }
2808
2809 /* Ranking of prefixes in the sort list. -B prefixes are put before
2810    all others.  */
2811
2812 enum path_prefix_priority
2813 {
2814   PREFIX_PRIORITY_B_OPT,
2815   PREFIX_PRIORITY_LAST
2816 };
2817
2818 /* Add an entry for PREFIX in PLIST.  The PLIST is kept in ascending
2819    order according to PRIORITY.  Within each PRIORITY, new entries are
2820    appended.
2821
2822    If WARN is nonzero, we will warn if no file is found
2823    through this prefix.  WARN should point to an int
2824    which will be set to 1 if this entry is used.
2825
2826    COMPONENT is the value to be passed to update_path.
2827
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.  */
2831
2832 static void
2833 add_prefix (struct path_prefix *pprefix, const char *prefix,
2834             const char *component, /* enum prefix_priority */ int priority,
2835             int require_machine_suffix, int os_multilib)
2836 {
2837   struct prefix_list *pl, **prev;
2838   int len;
2839
2840   for (prev = &pprefix->plist;
2841        (*prev) != NULL && (*prev)->priority <= priority;
2842        prev = &(*prev)->next)
2843     ;
2844
2845   /* Keep track of the longest prefix.  */
2846
2847   prefix = update_path (prefix, component);
2848   len = strlen (prefix);
2849   if (len > pprefix->max_len)
2850     pprefix->max_len = len;
2851
2852   pl = XNEW (struct prefix_list);
2853   pl->prefix = prefix;
2854   pl->require_machine_suffix = require_machine_suffix;
2855   pl->priority = priority;
2856   pl->os_multilib = os_multilib;
2857
2858   /* Insert after PREV.  */
2859   pl->next = (*prev);
2860   (*prev) = pl;
2861 }
2862
2863 /* Same as add_prefix, but prepending target_system_root to prefix.  */
2864 /* The target_system_root prefix has been relocated by gcc_exec_prefix.  */
2865 static void
2866 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2867                       const char *component,
2868                       /* enum prefix_priority */ int priority,
2869                       int require_machine_suffix, int os_multilib)
2870 {
2871   if (!IS_ABSOLUTE_PATH (prefix))
2872     fatal_error ("system path %qs is not absolute", prefix);
2873
2874   if (target_system_root)
2875     {
2876       if (target_sysroot_suffix)
2877           prefix = concat (target_sysroot_suffix, prefix, NULL);
2878       prefix = concat (target_system_root, prefix, NULL);
2879
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,
2886               require_machine_suffix, os_multilib);
2887 }
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
2895 static int
2896 execute (void)
2897 {
2898   int i;
2899   int n_commands;               /* # of command.  */
2900   char *string;
2901   struct pex_obj *pex;
2902   struct command
2903   {
2904     const char *prog;           /* program name.  */
2905     const char **argv;          /* vector of args.  */
2906   };
2907
2908   struct command *commands;     /* each command buffer with above info.  */
2909
2910   gcc_assert (!processing_spec_function);
2911
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
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.  */
2925   commands = (struct command *) alloca (n_commands * sizeof (struct command));
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];
2933
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     }
2939
2940   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2941     if (strcmp (argbuf[i], "|") == 0)
2942       {                         /* each command.  */
2943 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2944         fatal_error ("-pipe not supported");
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];
2949         string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2950                               X_OK, false);
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
2960   if (verbose_flag)
2961     {
2962       /* For help listings, put a blank line between sub-processes.  */
2963       if (print_help_list)
2964         fputc ('\n', stderr);
2965
2966       /* Print each piped command as a separate line.  */
2967       for (i = 0; i < n_commands; i++)
2968         {
2969           const char *const *j;
2970
2971           if (verbose_only_flag)
2972             {
2973               for (j = commands[i].argv; *j; j++)
2974                 {
2975                   const char *p;
2976                   for (p = *j; *p; ++p)
2977                     if (!ISALNUM ((unsigned char) *p)
2978                         && *p != '_' && *p != '/' && *p != '-' && *p != '.')
2979                       break;
2980                   if (*p || !*j)
2981                     {
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);
2990                     }
2991                   else
2992                     fprintf (stderr, " %s", *j);
2993                 }
2994             }
2995           else
2996             for (j = commands[i].argv; *j; j++)
2997               fprintf (stderr, " %s", *j);
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);
3005       if (verbose_only_flag != 0)
3006         {
3007           /* verbose_only_flag should act as if the spec was
3008              executed, so increment execution_count before
3009              returning.  This prevents spurious warnings about
3010              unused linker input files, etc.  */
3011           execution_count++;
3012           return 0;
3013         }
3014 #ifdef DEBUG
3015       fnotice (stderr, "\nGo ahead? (y or n) ");
3016       fflush (stderr);
3017       i = getchar ();
3018       if (i != '\n')
3019         while (getchar () != '\n')
3020           ;
3021
3022       if (i != 'y' && i != 'Y')
3023         return 0;
3024 #endif /* DEBUG */
3025     }
3026
3027 #ifdef ENABLE_VALGRIND_CHECKING
3028   /* Run the each command through valgrind.  To simplify prepending the
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
3041       argv = XALLOCAVEC (const char *, argc + 3);
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
3054   /* Run each piped subprocess.  */
3055
3056   pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3057                                    ? PEX_RECORD_TIMES : 0),
3058                   progname, temp_filename);
3059   if (pex == NULL)
3060     fatal_error ("pex_init failed: %m");
3061
3062   for (i = 0; i < n_commands; i++)
3063     {
3064       const char *errmsg;
3065       int err;
3066       const char *string = commands[i].argv[0];
3067
3068       errmsg = pex_run (pex,
3069                         ((i + 1 == n_commands ? PEX_LAST : 0)
3070                          | (string == commands[i].prog ? PEX_SEARCH : 0)),
3071                         string, CONST_CAST (char **, commands[i].argv),
3072                         NULL, NULL, &err);
3073       if (errmsg != NULL)
3074         {
3075           if (err == 0)
3076             fatal_error (errmsg);
3077           else
3078             {
3079               errno = err;
3080               pfatal_with_name (errmsg);
3081             }
3082         }
3083
3084       if (string != commands[i].prog)
3085         free (CONST_CAST (char *, string));
3086     }
3087
3088   execution_count++;
3089
3090   /* Wait for all the subprocesses to finish.  */
3091
3092   {
3093     int *statuses;
3094     struct pex_time *times = NULL;
3095     int ret_code = 0;
3096
3097     statuses = (int *) alloca (n_commands * sizeof (int));
3098     if (!pex_get_status (pex, n_commands, statuses))
3099       fatal_error ("failed to get exit status: %m");
3100
3101     if (report_times || report_times_to_file)
3102       {
3103         times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
3104         if (!pex_get_times (pex, n_commands, times))
3105           fatal_error ("failed to get process times: %m");
3106       }
3107
3108     pex_free (pex);
3109
3110     for (i = 0; i < n_commands; ++i)
3111       {
3112         int status = statuses[i];
3113
3114         if (WIFSIGNALED (status))
3115           {
3116 #ifdef SIGPIPE
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))
3125               {
3126                 signal_count++;
3127                 ret_code = -1;
3128               }
3129             else
3130 #endif
3131               internal_error ("%s (program %s)",
3132                               strsignal (WTERMSIG (status)), commands[i].prog);
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
3142         if (report_times || report_times_to_file)
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)
3153               {
3154                 if (report_times)
3155                   fnotice (stderr, "# %s %.2f %.2f\n",
3156                            commands[i].prog, ut, st);
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               }
3191           }
3192       }
3193
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.
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).
3208    SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
3209    in all do_spec calls afterwards.  Used for %<S from self specs.
3210    The `validated' field is nonzero if any spec has looked at this switch;
3211    if it remains zero at the end of the run, it must be meaningless.  */
3212
3213 #define SWITCH_LIVE                     0x1
3214 #define SWITCH_FALSE                    0x2
3215 #define SWITCH_IGNORE                   0x4
3216 #define SWITCH_IGNORE_PERMANENTLY       0x8
3217
3218 struct switchstr
3219 {
3220   const char *part1;
3221   const char **args;
3222   unsigned int live_cond;
3223   unsigned char validated;
3224   unsigned char ordering;
3225 };
3226
3227 static struct switchstr *switches;
3228
3229 static int n_switches;
3230
3231 static int n_switches_alloc;
3232
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.  */
3241 int compare_debug;
3242
3243 /* Set to nonzero if we've seen the -fcompare-debug-second flag.  */
3244 int compare_debug_second;
3245
3246 /* Set to the flags that should be passed to the second compilation in
3247    a -fcompare-debug compilation.  */
3248 const char *compare_debug_opt;
3249
3250 static struct switchstr *switches_debug_check[2];
3251
3252 static int n_switches_debug_check[2];
3253
3254 static char *debug_check_temp_file[2];
3255
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.  */
3263 struct infile
3264 {
3265   const char *name;
3266   const char *language;
3267   struct compiler *incompiler;
3268   bool compiled;
3269   bool preprocessed;
3270 };
3271
3272 /* Also a vector of input files specified.  */
3273
3274 static struct infile *infiles;
3275
3276 int n_infiles;
3277
3278 static int n_infiles_alloc;
3279
3280 /* True if multiple input files are being compiled to a single
3281    assembly file.  */
3282
3283 static bool combine_inputs;
3284
3285 /* This counts the number of libraries added by lang_specific_driver, so that
3286    we can tell if there were any user supplied any files or libraries.  */
3287
3288 static int added_libraries;
3289
3290 /* And a vector of corresponding output files is made up later.  */
3291
3292 const char **outfiles;
3293 \f
3294 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3295
3296 /* Convert NAME to a new name if it is the standard suffix.  DO_EXE
3297    is true if we should look for an executable suffix.  DO_OBJ
3298    is true if we should look for an object suffix.  */
3299
3300 static const char *
3301 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3302                   int do_obj ATTRIBUTE_UNUSED)
3303 {
3304 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3305   int i;
3306 #endif
3307   int len;
3308
3309   if (name == NULL)
3310     return NULL;
3311
3312   len = strlen (name);
3313
3314 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3315   /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj".  */
3316   if (do_obj && len > 2
3317       && name[len - 2] == '.'
3318       && name[len - 1] == 'o')
3319     {
3320       obstack_grow (&obstack, name, len - 2);
3321       obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3322       name = XOBFINISH (&obstack, const char *);
3323     }
3324 #endif
3325
3326 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
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".  */
3329   if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3330     return name;
3331
3332   for (i = len - 1; i >= 0; i--)
3333     if (IS_DIR_SEPARATOR (name[i]))
3334       break;
3335
3336   for (i++; i < len; i++)
3337     if (name[i] == '.')
3338       return name;
3339
3340   obstack_grow (&obstack, name, len);
3341   obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3342                  strlen (TARGET_EXECUTABLE_SUFFIX));
3343   name = XOBFINISH (&obstack, const char *);
3344 #endif
3345
3346   return name;
3347 }
3348 #endif
3349 \f
3350 /* Display the command line switches accepted by gcc.  */
3351 static void
3352 display_help (void)
3353 {
3354   printf (_("Usage: %s [options] file...\n"), progname);
3355   fputs (_("Options:\n"), stdout);
3356
3357   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
3358   fputs (_("  --help                   Display this information\n"), stdout);
3359   fputs (_("  --target-help            Display target specific command line options\n"), stdout);
3360   fputs (_("  --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3361   fputs (_("                           Display specific types of command line options\n"), stdout);
3362   if (! verbose_flag)
3363     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3364   fputs (_("  --version                Display compiler version information\n"), stdout);
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);
3376   fputs (_("  -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3377   fputs (_("  -print-sysroot           Display the target libraries directory\n"), stdout);
3378   fputs (_("  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
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);
3382   fputs (_("  -Xassembler <arg>        Pass <arg> on to the assembler\n"), stdout);
3383   fputs (_("  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor\n"), stdout);
3384   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
3385   fputs (_("  -combine                 Pass multiple source files to compiler at once\n"), stdout);
3386   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
3387   fputs (_("  -save-temps=<arg>        Do not delete intermediate files\n"), stdout);
3388   fputs (_("\
3389   -no-canonical-prefixes   Do not canonicalize paths when building relative\n\
3390                            prefixes to other gcc components\n"), stdout);
3391   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
3392   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
3393   fputs (_("  -specs=<file>            Override built-in specs with the contents of <file>\n"), stdout);
3394   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
3395   fputs (_("\
3396   --sysroot=<directory>    Use <directory> as the root directory for headers\n\
3397                            and libraries\n"), stdout);
3398   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
3399   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
3400   fputs (_("  -###                     Like -v but options quoted and commands not executed\n"), stdout);
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\
3407                            Permissible languages include: c c++ assembler none\n\
3408                            'none' means revert to the default behavior of\n\
3409                            guessing the language based on the file's extension\n\
3410 "), stdout);
3411
3412   printf (_("\
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\
3416 "), progname);
3417
3418   /* The rest of the options are displayed by invocations of the various
3419      sub-processes.  */
3420 }
3421
3422 static void
3423 add_preprocessor_option (const char *option, int len)
3424 {
3425   n_preprocessor_options++;
3426
3427   if (! preprocessor_options)
3428     preprocessor_options = XNEWVEC (char *, n_preprocessor_options);
3429   else
3430     preprocessor_options = XRESIZEVEC (char *, preprocessor_options,
3431                                        n_preprocessor_options);
3432
3433   preprocessor_options [n_preprocessor_options - 1] =
3434     save_string (option, len);
3435 }
3436
3437 static void
3438 add_assembler_option (const char *option, int len)
3439 {
3440   n_assembler_options++;
3441
3442   if (! assembler_options)
3443     assembler_options = XNEWVEC (char *, n_assembler_options);
3444   else
3445     assembler_options = XRESIZEVEC (char *, assembler_options,
3446                                     n_assembler_options);
3447
3448   assembler_options [n_assembler_options - 1] = save_string (option, len);
3449 }
3450
3451 static void
3452 add_linker_option (const char *option, int len)
3453 {
3454   n_linker_options++;
3455
3456   if (! linker_options)
3457     linker_options = XNEWVEC (char *, n_linker_options);
3458   else
3459     linker_options = XRESIZEVEC (char *, linker_options, n_linker_options);
3460
3461   linker_options [n_linker_options - 1] = save_string (option, len);
3462 }
3463 \f
3464 /* Allocate space for an input file in infiles.  */
3465
3466 static void
3467 alloc_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
3484 static void
3485 add_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
3494 static void
3495 alloc_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
3509 /* Create the vector `switches' and its contents.
3510    Store its length in `n_switches'.  */
3511
3512 static void
3513 process_command (int argc, const char **argv)
3514 {
3515   int i;
3516   const char *temp;
3517   char *temp1;
3518   const char *spec_lang = 0;
3519   int last_language_n_infiles;
3520   const char *tooldir_prefix;
3521   char *(*get_relative_prefix) (const char *, const char *,
3522                                 const char *) = NULL;
3523
3524   GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3525
3526   n_switches = 0;
3527   n_infiles = 0;
3528   added_libraries = 0;
3529
3530   /* Figure compiler version from version string.  */
3531
3532   compiler_version = temp1 = xstrdup (version_string);
3533
3534   for (; *temp1; ++temp1)
3535     {
3536       if (*temp1 == ' ')
3537         {
3538           *temp1 = '\0';
3539           break;
3540         }
3541     }
3542
3543   /* Convert new-style -- options to old-style.  */
3544   translate_options (&argc,
3545                      CONST_CAST2 (const char *const **, const char ***,
3546                                   &argv));
3547
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
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
3566   gcc_libexec_prefix = standard_libexec_prefix;
3567 #ifndef VMS
3568   /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
3569   if (!gcc_exec_prefix)
3570     {
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);
3577       if (gcc_exec_prefix)
3578         xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3579     }
3580   else
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);
3587       gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3588                                                 standard_exec_prefix,
3589                                                 standard_libexec_prefix);
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
3595       free (tmp_prefix);
3596     }
3597 #else
3598 #endif
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].  */
3602
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
3609   if (gcc_exec_prefix)
3610     {
3611       int len = strlen (gcc_exec_prefix);
3612
3613       if (len > (int) sizeof ("/lib/gcc/") - 1
3614           && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3615         {
3616           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3617           if (IS_DIR_SEPARATOR (*temp)
3618               && strncmp (temp + 1, "lib", 3) == 0
3619               && IS_DIR_SEPARATOR (temp[4])
3620               && strncmp (temp + 5, "gcc", 3) == 0)
3621             len -= sizeof ("/lib/gcc/") - 1;
3622         }
3623
3624       set_std_prefix (gcc_exec_prefix, len);
3625       add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3626                   PREFIX_PRIORITY_LAST, 0, 0);
3627       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3628                   PREFIX_PRIORITY_LAST, 0, 0);
3629     }
3630
3631   /* COMPILER_PATH and LIBRARY_PATH have values
3632      that are lists of directory names with colons.  */
3633
3634   GET_ENVIRONMENT (temp, "COMPILER_PATH");
3635   if (temp)
3636     {
3637       const char *startp, *endp;
3638       char *nstore = (char *) alloca (strlen (temp) + 3);
3639
3640       startp = endp = temp;
3641       while (1)
3642         {
3643           if (*endp == PATH_SEPARATOR || *endp == 0)
3644             {
3645               strncpy (nstore, startp, endp - startp);
3646               if (endp == startp)
3647                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3648               else if (!IS_DIR_SEPARATOR (endp[-1]))
3649                 {
3650                   nstore[endp - startp] = DIR_SEPARATOR;
3651                   nstore[endp - startp + 1] = 0;
3652                 }
3653               else
3654                 nstore[endp - startp] = 0;
3655               add_prefix (&exec_prefixes, nstore, 0,
3656                           PREFIX_PRIORITY_LAST, 0, 0);
3657               add_prefix (&include_prefixes, nstore, 0,
3658                           PREFIX_PRIORITY_LAST, 0, 0);
3659               if (*endp == 0)
3660                 break;
3661               endp = startp = endp + 1;
3662             }
3663           else
3664             endp++;
3665         }
3666     }
3667
3668   GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
3669   if (temp && *cross_compile == '0')
3670     {
3671       const char *startp, *endp;
3672       char *nstore = (char *) alloca (strlen (temp) + 3);
3673
3674       startp = endp = temp;
3675       while (1)
3676         {
3677           if (*endp == PATH_SEPARATOR || *endp == 0)
3678             {
3679               strncpy (nstore, startp, endp - startp);
3680               if (endp == startp)
3681                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3682               else if (!IS_DIR_SEPARATOR (endp[-1]))
3683                 {
3684                   nstore[endp - startp] = DIR_SEPARATOR;
3685                   nstore[endp - startp + 1] = 0;
3686                 }
3687               else
3688                 nstore[endp - startp] = 0;
3689               add_prefix (&startfile_prefixes, nstore, NULL,
3690                           PREFIX_PRIORITY_LAST, 0, 1);
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).  */
3701   GET_ENVIRONMENT (temp, "LPATH");
3702   if (temp && *cross_compile == '0')
3703     {
3704       const char *startp, *endp;
3705       char *nstore = (char *) alloca (strlen (temp) + 3);
3706
3707       startp = endp = temp;
3708       while (1)
3709         {
3710           if (*endp == PATH_SEPARATOR || *endp == 0)
3711             {
3712               strncpy (nstore, startp, endp - startp);
3713               if (endp == startp)
3714                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3715               else if (!IS_DIR_SEPARATOR (endp[-1]))
3716                 {
3717                   nstore[endp - startp] = DIR_SEPARATOR;
3718                   nstore[endp - startp + 1] = 0;
3719                 }
3720               else
3721                 nstore[endp - startp] = 0;
3722               add_prefix (&startfile_prefixes, nstore, NULL,
3723                           PREFIX_PRIORITY_LAST, 0, 1);
3724               if (*endp == 0)
3725                 break;
3726               endp = startp = endp + 1;
3727             }
3728           else
3729             endp++;
3730         }
3731     }
3732
3733   /* Process the options and store input files and switches in their
3734      vectors.  */
3735
3736   last_language_n_infiles = -1;
3737
3738   for (i = 1; i < argc; i++)
3739     {
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
3749       if (! strcmp (argv[i], "-dumpspecs"))
3750         {
3751           struct spec_list *sl;
3752           init_spec ();
3753           for (sl = specs; sl; sl = sl->next)
3754             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3755           if (link_command_spec)
3756             printf ("*link_command:\n%s\n\n", link_command_spec);
3757           exit (0);
3758         }
3759       else if (! strcmp (argv[i], "-dumpversion"))
3760         {
3761           printf ("%s\n", spec_version);
3762           exit (0);
3763         }
3764       else if (! strcmp (argv[i], "-dumpmachine"))
3765         {
3766           printf ("%s\n", spec_machine);
3767           exit (0);
3768         }
3769       else if (strcmp (argv[i], "-fversion") == 0)
3770         {
3771           /* translate_options () has turned --version into -fversion.  */
3772           print_version = 1;
3773
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"));
3779
3780           goto normal_switch;
3781         }
3782       else if (strcmp (argv[i], "-fhelp") == 0)
3783         {
3784           /* translate_options () has turned --help into -fhelp.  */
3785           print_help_list = 1;
3786
3787           /* CPP driver cannot obtain switch from cc1_options.  */
3788           if (is_cpp_driver)
3789             add_preprocessor_option ("--help", 6);
3790           add_assembler_option ("--help", 6);
3791           add_linker_option ("--help", 6);
3792
3793           goto normal_switch;
3794         }
3795       else if (strncmp (argv[i], "-fhelp=", 7) == 0)
3796         {
3797           /* translate_options () has turned --help into -fhelp.  */
3798           print_subprocess_help = 2;
3799
3800           goto normal_switch;
3801         }
3802       else if (strcmp (argv[i], "-ftarget-help") == 0)
3803         {
3804           /* translate_options() has turned --target-help into -ftarget-help.  */
3805           print_subprocess_help = 1;
3806
3807           /* CPP driver cannot obtain switch from cc1_options.  */
3808           if (is_cpp_driver)
3809             add_preprocessor_option ("--target-help", 13);
3810           add_assembler_option ("--target-help", 13);
3811           add_linker_option ("--target-help", 13);
3812
3813           goto normal_switch;
3814         }
3815       else if (! strcmp (argv[i], "-pass-exit-codes"))
3816         {
3817           pass_exit_codes = 1;
3818         }
3819       else if (! strcmp (argv[i], "-print-search-dirs"))
3820         print_search_dirs = 1;
3821       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3822         print_file_name = "libgcc.a";
3823       else if (! strncmp (argv[i], "-print-file-name=", 17))
3824         print_file_name = argv[i] + 17;
3825       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3826         print_prog_name = argv[i] + 17;
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;
3831       else if (! strcmp (argv[i], "-print-sysroot"))
3832         print_sysroot = 1;
3833       else if (! strcmp (argv[i], "-print-multi-os-directory"))
3834         print_multi_os_directory = 1;
3835       else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
3836         print_sysroot_headers_suffix = 1;
3837       else if (! strcmp (argv[i], "-fcompare-debug-second"))
3838         {
3839           compare_debug_second = 1;
3840           goto normal_switch;
3841         }
3842       else if (! strcmp (argv[i], "-fno-compare-debug"))
3843         {
3844           argv[i] = "-fcompare-debug=";
3845           p = &argv[i][1];
3846           goto compare_debug_with_arg;
3847         }
3848       else if (! strcmp (argv[i], "-fcompare-debug"))
3849         {
3850           argv[i] = "-fcompare-debug=-gtoggle";
3851           p = &argv[i][1];
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;
3869           goto normal_switch;
3870         }
3871       else if (! strncmp (argv[i], "-Wa,", 4))
3872         {
3873           int prev, j;
3874           /* Pass the rest of this option to the assembler.  */
3875
3876           /* Split the argument at commas.  */
3877           prev = 4;
3878           for (j = 4; argv[i][j]; j++)
3879             if (argv[i][j] == ',')
3880               {
3881                 add_assembler_option (argv[i] + prev, j - prev);
3882                 prev = j + 1;
3883               }
3884
3885           /* Record the part after the last comma.  */
3886           add_assembler_option (argv[i] + prev, j - prev);
3887         }
3888       else if (! strncmp (argv[i], "-Wp,", 4))
3889         {
3890           int prev, j;
3891           /* Pass the rest of this option to the preprocessor.  */
3892
3893           /* Split the argument at commas.  */
3894           prev = 4;
3895           for (j = 4; argv[i][j]; j++)
3896             if (argv[i][j] == ',')
3897               {
3898                 add_preprocessor_option (argv[i] + prev, j - prev);
3899                 prev = j + 1;
3900               }
3901
3902           /* Record the part after the last comma.  */
3903           add_preprocessor_option (argv[i] + prev, j - prev);
3904         }
3905       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3906         {
3907           int prev, j;
3908           /* Split the argument at commas.  */
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, "*");
3918         }
3919       else if (strcmp (argv[i], "-Xlinker") == 0)
3920         {
3921           if (i + 1 == argc)
3922             fatal_error ("argument to %<-Xlinker%> is missing");
3923
3924           add_infile (argv[i+1], "*");
3925           i++;
3926         }
3927       else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3928         {
3929           if (i + 1 == argc)
3930             fatal_error ("argument to %<-Xpreprocessor%> is missing");
3931
3932           add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
3933           i++;
3934         }
3935       else if (strcmp (argv[i], "-Xassembler") == 0)
3936         {
3937           if (i + 1 == argc)
3938             fatal_error ("argument to %<-Xassembler%> is missing");
3939
3940           add_assembler_option (argv[i+1], strlen (argv[i+1]));
3941           i++;
3942         }
3943       else if (strcmp (argv[i], "-l") == 0)
3944         {
3945           if (i + 1 == argc)
3946             fatal_error ("argument to %<-l%> is missing");
3947
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), "*");
3951           i++;
3952         }
3953       else if (strncmp (argv[i], "-l", 2) == 0)
3954         {
3955           add_infile (argv[i], "*");
3956         }
3957       else if (strcmp (argv[i], "-save-temps") == 0)
3958         {
3959           save_temps_flag = SAVE_TEMPS_CWD;
3960           goto normal_switch;
3961         }
3962       else if (strncmp (argv[i], "-save-temps=", 12) == 0)
3963         {
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
3970             fatal_error ("%qs is an unknown -save-temps option", argv[i]);
3971           goto normal_switch;
3972         }
3973       else if (strcmp (argv[i], "-no-canonical-prefixes") == 0)
3974         /* Already handled as a special case, so ignored here.  */
3975         ;
3976       else if (strcmp (argv[i], "-combine") == 0)
3977         {
3978           combine_flag = 1;
3979           goto normal_switch;
3980         }
3981       else if (strcmp (argv[i], "-specs") == 0)
3982         {
3983           struct user_specs *user = XNEW (struct user_specs);
3984           if (++i >= argc)
3985             fatal_error ("argument to %<-specs%> is missing");
3986
3987           user->next = (struct user_specs *) 0;
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         {
3997           struct user_specs *user = XNEW (struct user_specs);
3998           if (strlen (argv[i]) == 7)
3999             fatal_error ("argument to %<-specs=%> is missing");
4000
4001           user->next = (struct user_specs *) 0;
4002           user->filename = argv[i] + 7;
4003           if (user_specs_tail)
4004             user_specs_tail->next = user;
4005           else
4006             user_specs_head = user;
4007           user_specs_tail = user;
4008         }
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         }
4014       else if (strcmp (argv[i], "-time") == 0)
4015         report_times = 1;
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         }
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;
4027           goto normal_switch;
4028         }
4029       else if (strcmp (argv[i], "-wrapper") == 0)
4030         {
4031           if (++i >= argc)
4032             fatal_error ("argument to %<-wrapper%> is missing");
4033
4034           wrapper_string = argv[i];
4035         }
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         }
4045       else if (argv[i][0] == '-' && argv[i][1] != 0)
4046         {
4047           switch (c)
4048             {
4049             case 'B':
4050               {
4051                 const char *value;
4052                 int len;
4053
4054                 if (p[1] == 0 && i + 1 == argc)
4055                   fatal_error ("argument to %<-B%> is missing");
4056                 if (p[1] == 0)
4057                   value = argv[i + 1];
4058                 else
4059                   value = p + 1;
4060
4061                 len = strlen (value);
4062
4063                 /* Catch the case where the user has forgotten to append a
4064                    directory separator to the path.  Note, they may be using
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])
4071                     && is_directory (value, false))
4072                   {
4073                     char *tmp = XNEWVEC (char, len + 2);
4074                     strcpy (tmp, value);
4075                     tmp[len] = DIR_SEPARATOR;
4076                     tmp[++ len] = 0;
4077                     value = tmp;
4078                   }
4079
4080                 add_prefix (&exec_prefixes, value, NULL,
4081                             PREFIX_PRIORITY_B_OPT, 0, 0);
4082                 add_prefix (&startfile_prefixes, value, NULL,
4083                             PREFIX_PRIORITY_B_OPT, 0, 0);
4084                 add_prefix (&include_prefixes, value, NULL,
4085                             PREFIX_PRIORITY_B_OPT, 0, 0);
4086               }
4087               goto normal_switch;
4088
4089             case 'v':   /* Print our subcommands and print versions.  */
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++;
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;
4111               break;
4112
4113             case 'S':
4114             case 'c':
4115             case 'E':
4116               if (p[1] == 0)
4117                 have_c = 1;
4118               goto normal_switch;
4119
4120             case 'o':
4121               have_o = 1;
4122 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
4123               if (! have_c)
4124                 {
4125                   int skip;
4126
4127                   /* Forward scan, just in case -S, -E or -c is specified
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                             }
4142                           else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
4143                             j += skip - (argv[j][2] != 0);
4144                           else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
4145                             j += skip;
4146                         }
4147                       j++;
4148                     }
4149                 }
4150 #endif
4151 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4152               if (p[1] == 0)
4153                 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
4154               else
4155                 {
4156                   argv[i] = convert_filename (argv[i], ! have_c, 0);
4157                   p = &argv[i][1];
4158                 }
4159 #endif
4160               /* Save the output name in case -save-temps=obj was used.  */
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);
4165               goto normal_switch;
4166
4167             default:
4168             normal_switch:
4169
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);
4178
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                 }
4194               else if (c == 'o')
4195                 {
4196                   /* On some systems, ld cannot handle "-o" without
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++;
4230             }
4231         }
4232       else
4233         {
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);
4269         }
4270     }
4271
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
4291   if (save_temps_flag && use_pipes)
4292     {
4293       /* -save-temps overrides -pipe, so that temp files are produced */
4294       if (save_temps_flag)
4295         warning (0, "-pipe ignored because -save-temps specified");
4296       use_pipes = 0;
4297     }
4298
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;
4307         }
4308       else if (gcd && *gcd && strcmp (gcd, "0"))
4309         {
4310           compare_debug = 3;
4311           compare_debug_opt = "-gtoggle";
4312         }
4313     }
4314   else if (compare_debug < 0)
4315     {
4316       compare_debug = 0;
4317       gcc_assert (!compare_debug_opt);
4318     }
4319
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
4323      the GNU assembler) before those of the host system.  */
4324
4325   /* If we don't know where the toolchain has been installed, use the
4326      configured-in locations.  */
4327   if (!gcc_exec_prefix)
4328     {
4329 #ifndef OS2
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);
4336 #endif
4337       add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4338                   PREFIX_PRIORITY_LAST, 1, 0);
4339     }
4340
4341   gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4342   tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
4343                            dir_separator_str, NULL);
4344
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);
4351
4352   add_prefix (&exec_prefixes,
4353               concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4354               "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4355   add_prefix (&startfile_prefixes,
4356               concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4357               "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4358
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.  */
4364   if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4365     {
4366       char *tmp_prefix = get_relative_prefix (argv[0],
4367                                               standard_bindir_prefix,
4368                                               target_system_root);
4369       if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4370         {
4371           target_system_root = tmp_prefix;
4372           target_system_root_changed = 1;
4373         }
4374     }
4375 #endif
4376
4377   /* More prefixes are enabled in main, after we read the specs file
4378      and determine whether this is cross-compilation or not.  */
4379
4380   if (n_infiles == last_language_n_infiles && spec_lang != 0)
4381     warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4382
4383   if (compare_debug == 2 || compare_debug == 3)
4384     {
4385       alloc_switch ();
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
4397   /* Ensure we only invoke each subprocess once.  */
4398   if (print_subprocess_help || print_help_list || print_version)
4399     {
4400       n_infiles = 0;
4401
4402       /* Create a dummy input file, so that we can pass
4403          the help option on to the various sub-processes.  */
4404       add_infile ("help-dummy", "c");
4405     }
4406
4407   alloc_switch ();
4408   switches[n_switches].part1 = 0;
4409   alloc_infile ();
4410   infiles[n_infiles].name = 0;
4411 }
4412
4413 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4414    and place that in the environment.  */
4415
4416 static void
4417 set_collect_gcc_options (void)
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.  */
4438       if ((switches[i].live_cond & SWITCH_IGNORE) != 0)
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);
4467   xputenv (XOBFINISH (&collect_obstack, char *));
4468 }
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
4479 static const char *gcc_input_filename;
4480 static int input_file_number;
4481 size_t input_filename_length;
4482 static int basename_length;
4483 static int suffixed_basename_length;
4484 static const char *input_basename;
4485 static const char *input_suffix;
4486 #ifndef HOST_LACKS_INODE_NUMBERS
4487 static struct stat input_stat;
4488 #endif
4489 static int input_stat_set;
4490
4491 /* The compiler used to process the current input file.  */
4492 static struct compiler *input_file_compiler;
4493
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).  */
4498 static 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.  */
4502 static 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.  */
4506 static 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.  */
4511 static int this_is_library_file;
4512
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.  */
4518 static int this_is_linker_script;
4519
4520 /* Nonzero means that the input of this command is coming from a pipe.  */
4521 static int input_from_pipe;
4522
4523 /* Nonnull means substitute this for any suffix when outputting a switches
4524    arguments.  */
4525 static const char *suffix_subst;
4526
4527 /* If there is an argument being accumulated, terminate it and store it.  */
4528
4529 static void
4530 end_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);
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             {
4546               error ("unable to locate default linker script %qs in the library search paths", string);
4547               /* Script was not found on search path.  */
4548               return;
4549             }
4550           store_arg ("--script", false, false);
4551           string = full_script_path;
4552         }
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
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
4564 static void
4565 insert_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;
4585       argbuf = XRESIZEVEC (const char *, argbuf, argbuf_length);
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
4606 /* Process the spec SPEC and run the commands specified therein.
4607    Returns 0 if the spec is successfully processed; -1 if failed.  */
4608
4609 int
4610 do_spec (const char *spec)
4611 {
4612   int value;
4613
4614   value = do_spec_2 (spec);
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
4623       set_collect_gcc_options ();
4624
4625       if (argbuf_index > 0)
4626         value = execute ();
4627     }
4628
4629   return value;
4630 }
4631
4632 static int
4633 do_spec_2 (const char *spec)
4634 {
4635   int result;
4636
4637   clear_args ();
4638   arg_going = 0;
4639   delete_this_arg = 0;
4640   this_is_output_file = 0;
4641   this_is_library_file = 0;
4642   this_is_linker_script = 0;
4643   input_from_pipe = 0;
4644   suffix_subst = NULL;
4645
4646   result = do_spec_1 (spec, 0, NULL);
4647
4648   end_going_arg ();
4649
4650   return result;
4651 }
4652
4653
4654 /* Process the given spec string and add any new options to the end
4655    of the switches/n_switches array.  */
4656
4657 static void
4658 do_option_spec (const char *name, const char *spec)
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.  */
4686   tmp_spec = (char *) alloca (strlen (spec) + 1
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
4703 /* Process the given spec string and add any new options to the end
4704    of the switches/n_switches array.  */
4705
4706 static void
4707 do_self_spec (const char *spec)
4708 {
4709   int i;
4710
4711   do_spec_2 (spec);
4712   do_spec_1 (" ", 0, NULL);
4713
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
4721   if (argbuf_index > 0)
4722     {
4723       switches = XRESIZEVEC (struct switchstr, switches,
4724                              n_switches + argbuf_index + 1);
4725
4726       for (i = 0; i < argbuf_index; i++)
4727         {
4728           struct switchstr *sw;
4729           const char *p = argbuf[i];
4730           int c = *p;
4731
4732           /* Each switch should start with '-'.  */
4733           if (c != '-')
4734             fatal_error ("switch %qs does not start with %<-%>", argbuf[i]);
4735
4736           p++;
4737           c = *p;
4738
4739           sw = &switches[n_switches++];
4740           sw->part1 = p;
4741           sw->live_cond = 0;
4742           sw->validated = 0;
4743           sw->ordering = 0;
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)
4758                 fatal_error ("argument to %<-%s%> is missing", p);
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             }
4766           else if (c == 'o')
4767             {
4768               /* On some systems, ld cannot handle "-o" without
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;
4781         }
4782
4783       switches[n_switches].part1 = 0;
4784     }
4785 }
4786
4787 /* Callback for processing %D and %I specs.  */
4788
4789 struct 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
4797 static void *
4798 spec_path (char *path, void *data)
4799 {
4800   struct spec_path_info *info = (struct spec_path_info *) data;
4801   size_t len = 0;
4802   char save = 0;
4803
4804   if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4805     return NULL;
4806
4807   if (info->append_len != 0)
4808     {
4809       len = strlen (path);
4810       memcpy (path + len, info->append, info->append_len + 1);
4811     }
4812
4813   if (!is_directory (path, true))
4814     return NULL;
4815
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)
4821     {
4822       len = strlen (path);
4823       save = path[len - 1];
4824       if (IS_DIR_SEPARATOR (path[len - 1]))
4825         path[len - 1] = '\0';
4826     }
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;
4836 }
4837
4838 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4839    argument list. */
4840
4841 static void
4842 create_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)
4850     fatal_error ("could not open temporary response file %s",
4851                  temp_file);
4852
4853   status = writeargv (argv, f);
4854
4855   if (status)
4856     fatal_error ("could not write to temporary response file %s",
4857                  temp_file);
4858
4859   status = fclose (f);
4860
4861   if (EOF == status)
4862     fatal_error ("could not close temporary response file %s",
4863                  temp_file);
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
4872 static bool
4873 compile_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
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
4893 static int
4894 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4895 {
4896   const char *p = spec;
4897   int c;
4898   int i;
4899   int value;
4900
4901   while ((c = *p++))
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':
4907         end_going_arg ();
4908
4909         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4910           {
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.  */
4914             if (use_pipes)
4915               {
4916                 input_from_pipe = 1;
4917                 break;
4918               }
4919             else
4920               argbuf_index--;
4921           }
4922
4923         set_collect_gcc_options ();
4924
4925         if (argbuf_index > 0)
4926           {
4927             value = execute ();
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;
4937         this_is_linker_script = 0;
4938         input_from_pipe = 0;
4939         break;
4940
4941       case '|':
4942         end_going_arg ();
4943
4944         /* Use pipe */
4945         obstack_1grow (&obstack, c);
4946         arg_going = 1;
4947         break;
4948
4949       case '\t':
4950       case ' ':
4951         end_going_arg ();
4952
4953         /* Reinitialize for a new argument.  */
4954         delete_this_arg = 0;
4955         this_is_output_file = 0;
4956         this_is_library_file = 0;
4957         this_is_linker_script = 0;
4958         break;
4959
4960       case '%':
4961         switch (c = *p++)
4962           {
4963           case 0:
4964             fatal_error ("spec %qs invalid", spec);
4965
4966           case 'b':
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);
4971             if (compare_debug < 0)
4972               obstack_grow (&obstack, ".gk", 3);
4973             arg_going = 1;
4974             break;
4975
4976           case 'B':
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);
4981             if (compare_debug < 0)
4982               obstack_grow (&obstack, ".gk", 3);
4983             arg_going = 1;
4984             break;
4985
4986           case 'd':
4987             delete_this_arg = 2;
4988             break;
4989
4990           /* Dump out the directories specified with LIBRARY_PATH,
4991              followed by the absolute directories
4992              that we search for startfiles.  */
4993           case 'D':
4994             {
4995               struct spec_path_info info;
4996
4997               info.option = "-L";
4998               info.append_len = 0;
4999 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
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;
5006 #else
5007               info.omit_relative = false;
5008 #endif
5009               info.separate_options = false;
5010
5011               for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5012             }
5013             break;
5014
5015           case 'e':
5016             /* %efoo means report an error with `foo' as error message
5017                and don't execute any more commands for this file.  */
5018             {
5019               const char *q = p;
5020               char *buf;
5021               while (*p != 0 && *p != '\n')
5022                 p++;
5023               buf = (char *) alloca (p - q + 1);
5024               strncpy (buf, q, p - q);
5025               buf[p - q] = 0;
5026               error ("%s", _(buf));
5027               return -1;
5028             }
5029             break;
5030           case 'n':
5031             /* %nfoo means report a notice with `foo' on stderr.  */
5032             {
5033               const char *q = p;
5034               char *buf;
5035               while (*p != 0 && *p != '\n')
5036                 p++;
5037               buf = (char *) alloca (p - q + 1);
5038               strncpy (buf, q, p - q);
5039               buf[p - q] = 0;
5040               inform (0, "%s", _(buf));
5041               if (*p)
5042                 p++;
5043             }
5044             break;
5045
5046           case 'j':
5047             {
5048               struct stat st;
5049
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.  */
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             }
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 */
5075                 while (*p == '.' || ISALNUM ((unsigned char) *p))
5076                   p++;
5077                 if (p[0] == '%' && p[1] == 'O')
5078                   p += 2;
5079
5080                 break;
5081               }
5082             goto create_temp_file;
5083           case 'm':
5084             if (use_pipes)
5085               {
5086                 /* consume suffix */
5087                 while (*p == '.' || ISALNUM ((unsigned char) *p))
5088                   p++;
5089                 if (p[0] == '%' && p[1] == 'O')
5090                   p += 2;
5091
5092                 break;
5093               }
5094             goto create_temp_file;
5095           case 'g':
5096           case 'u':
5097           case 'U':
5098           create_temp_file:
5099               {
5100                 struct temp_name *t;
5101                 int suffix_length;
5102                 const char *suffix = p;
5103                 char *saved_suffix = NULL;
5104
5105                 while (*p == '.' || ISALNUM ((unsigned char) *p))
5106                   p++;
5107                 suffix_length = p - suffix;
5108                 if (p[0] == '%' && p[1] == 'O')
5109                   {
5110                     p += 2;
5111                     /* We don't support extra suffix characters after %O.  */
5112                     if (*p == '.' || ISALNUM ((unsigned char) *p))
5113                       fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
5114                     if (suffix_length == 0)
5115                       suffix = TARGET_OBJECT_SUFFIX;
5116                     else
5117                       {
5118                         saved_suffix
5119                           = XNEWVEC (char, suffix_length
5120                                      + strlen (TARGET_OBJECT_SUFFIX));
5121                         strncpy (saved_suffix, suffix, suffix_length);
5122                         strcpy (saved_suffix + suffix_length,
5123                                 TARGET_OBJECT_SUFFIX);
5124                       }
5125                     suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5126                   }
5127
5128                 if (compare_debug < 0)
5129                   {
5130                     suffix = concat (".gk", suffix, NULL);
5131                     suffix_length += 3;
5132                   }
5133
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
5154                 /* If the gcc_input_filename has the same suffix specified
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.  */
5161
5162                 if (save_temps_flag)
5163                   {
5164                     char *tmp;
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';
5170                     temp_filename = tmp;
5171
5172                     if (strcmp (temp_filename, gcc_input_filename) != 0)
5173                       {
5174 #ifndef HOST_LACKS_INODE_NUMBERS
5175                         struct stat st_temp;
5176
5177                         /* Note, set_input() resets input_stat_set to 0.  */
5178                         if (input_stat_set == 0)
5179                           {
5180                             input_stat_set = stat (gcc_input_filename,
5181                                                    &input_stat);
5182                             if (input_stat_set >= 0)
5183                               input_stat_set = 1;
5184                           }
5185
5186                         /* If we have the stat for the gcc_input_filename
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.  */
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)
5194 #else
5195                         /* Just compare canonical pathnames.  */
5196                         char* input_realname = lrealpath (gcc_input_filename);
5197                         char* temp_realname = lrealpath (temp_filename);
5198                         bool files_differ = strcmp (input_realname, temp_realname);
5199                         free (input_realname);
5200                         free (temp_realname);
5201                         if (files_differ)
5202 #endif
5203                           {
5204                             temp_filename = save_string (temp_filename,
5205                                                          temp_filename_length + 1);
5206                             obstack_grow (&obstack, temp_filename,
5207                                                     temp_filename_length);
5208                             arg_going = 1;
5209                             delete_this_arg = 0;
5210                             break;
5211                           }
5212                       }
5213                   }
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)
5218                   if (t->length == suffix_length
5219                       && strncmp (t->suffix, suffix, suffix_length) == 0
5220                       && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5221                     break;
5222
5223                 /* Make a new association if needed.  %u and %j
5224                    require one.  */
5225                 if (t == 0 || c == 'u' || c == 'j')
5226                   {
5227                     if (t == 0)
5228                       {
5229                         t = XNEW (struct temp_name);
5230                         t->next = temp_names;
5231                         temp_names = t;
5232                       }
5233                     t->length = suffix_length;
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);
5241                     t->unique = (c == 'u' || c == 'U' || c == 'j');
5242                     temp_filename = make_temp_file (t->suffix);
5243                     temp_filename_length = strlen (temp_filename);
5244                     t->filename = temp_filename;
5245                     t->filename_length = temp_filename_length;
5246                   }
5247
5248                 if (saved_suffix)
5249                   free (saved_suffix);
5250
5251                 obstack_grow (&obstack, t->filename, t->filename_length);
5252                 delete_this_arg = 1;
5253               }
5254             arg_going = 1;
5255             break;
5256
5257           case 'i':
5258             if (combine_inputs)
5259               {
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]))
5291                       {
5292                         store_arg (infiles[i].name, 0, 0);
5293                         infiles[i].compiled = true;
5294                       }
5295               }
5296             else
5297               {
5298                 obstack_grow (&obstack, gcc_input_filename,
5299                               input_filename_length);
5300                 arg_going = 1;
5301               }
5302             break;
5303
5304           case 'I':
5305             {
5306               struct spec_path_info info;
5307
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
5317               if (gcc_exec_prefix)
5318                 {
5319                   do_spec_1 ("-iprefix", 1, NULL);
5320                   /* Make this a separate argument.  */
5321                   do_spec_1 (" ", 0, NULL);
5322                   do_spec_1 (gcc_exec_prefix, 1, NULL);
5323                   do_spec_1 (" ", 0, NULL);
5324                 }
5325
5326               if (target_system_root_changed ||
5327                   (target_system_root && target_sysroot_hdrs_suffix))
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);
5333                   if (target_sysroot_hdrs_suffix)
5334                     do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5335                   do_spec_1 (" ", 0, NULL);
5336                 }
5337
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);
5346
5347               info.append = "include-fixed";
5348               if (*sysroot_hdrs_suffix_spec)
5349                 info.append = concat (info.append, dir_separator_str,
5350                                       multilib_dir, NULL);
5351               info.append_len = strlen (info.append);
5352               for_each_path (&include_prefixes, false, info.append_len,
5353                              spec_path, &info);
5354             }
5355             break;
5356
5357           case 'o':
5358             {
5359               int max = n_infiles;
5360               max += lang_specific_extra_outfiles;
5361
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
5369                   char **argv;
5370                   int n_files, j;
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
5378                   argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5379
5380                   /* Copy the strings over.  */
5381                   for (i = 0, j = 0; i < max; i++)
5382                     if (outfiles[i])
5383                       {
5384                         argv[j] = CONST_CAST (char *, outfiles[i]);
5385                         j++;
5386                       }
5387                   argv[j] = NULL;
5388
5389                   create_at_file (argv);
5390                 }
5391               else
5392                 for (i = 0; i < max; i++)
5393                   if (outfiles[i])
5394                     store_arg (outfiles[i], 0, 0);
5395               break;
5396             }
5397
5398           case 'O':
5399             obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5400             arg_going = 1;
5401             break;
5402
5403           case 's':
5404             this_is_library_file = 1;
5405             break;
5406
5407           case 'T':
5408             this_is_linker_script = 1;
5409             break;
5410
5411           case 'V':
5412             outfiles[input_file_number] = NULL;
5413             break;
5414
5415           case 'w':
5416             this_is_output_file = 1;
5417             break;
5418
5419           case 'W':
5420             {
5421               int cur_index = argbuf_index;
5422               /* Handle the {...} following the %W.  */
5423               if (*p != '{')
5424                 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
5425               p = handle_braces (p + 1);
5426               if (p == 0)
5427                 return -1;
5428               end_going_arg ();
5429               /* If any args were output, mark the last one for deletion
5430                  on failure.  */
5431               if (argbuf_index != cur_index)
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             {
5439               const char *p1 = p;
5440               char *string;
5441
5442               /* Skip past the option value and make a copy.  */
5443               if (*p != '{')
5444                 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
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.  */
5458               add_linker_option (string, strlen (string));
5459             }
5460             break;
5461
5462           /* Dump out the options accumulated previously using %x.  */
5463           case 'X':
5464             for (i = 0; i < n_linker_options; i++)
5465               {
5466                 do_spec_1 (linker_options[i], 1, NULL);
5467                 /* Make each accumulated option a separate argument.  */
5468                 do_spec_1 (" ", 0, NULL);
5469               }
5470             break;
5471
5472           /* Dump out the options accumulated previously using -Wa,.  */
5473           case 'Y':
5474             for (i = 0; i < n_assembler_options; i++)
5475               {
5476                 do_spec_1 (assembler_options[i], 1, NULL);
5477                 /* Make each accumulated option a separate argument.  */
5478                 do_spec_1 (" ", 0, NULL);
5479               }
5480             break;
5481
5482           /* Dump out the options accumulated previously using -Wp,.  */
5483           case 'Z':
5484             for (i = 0; i < n_preprocessor_options; i++)
5485               {
5486                 do_spec_1 (preprocessor_options[i], 1, NULL);
5487                 /* Make each accumulated option a separate argument.  */
5488                 do_spec_1 (" ", 0, NULL);
5489               }
5490             break;
5491
5492             /* Here are digits and numbers that just process
5493                a certain constant string as a spec.  */
5494
5495           case '1':
5496             value = do_spec_1 (cc1_spec, 0, NULL);
5497             if (value != 0)
5498               return value;
5499             break;
5500
5501           case '2':
5502             value = do_spec_1 (cc1plus_spec, 0, NULL);
5503             if (value != 0)
5504               return value;
5505             break;
5506
5507           case 'a':
5508             value = do_spec_1 (asm_spec, 0, NULL);
5509             if (value != 0)
5510               return value;
5511             break;
5512
5513           case 'A':
5514             value = do_spec_1 (asm_final_spec, 0, NULL);
5515             if (value != 0)
5516               return value;
5517             break;
5518
5519           case 'C':
5520             {
5521               const char *const spec
5522                 = (input_file_compiler->cpp_spec
5523                    ? input_file_compiler->cpp_spec
5524                    : cpp_spec);
5525               value = do_spec_1 (spec, 0, NULL);
5526               if (value != 0)
5527                 return value;
5528             }
5529             break;
5530
5531           case 'E':
5532             value = do_spec_1 (endfile_spec, 0, NULL);
5533             if (value != 0)
5534               return value;
5535             break;
5536
5537           case 'l':
5538             value = do_spec_1 (link_spec, 0, NULL);
5539             if (value != 0)
5540               return value;
5541             break;
5542
5543           case 'L':
5544             value = do_spec_1 (lib_spec, 0, NULL);
5545             if (value != 0)
5546               return value;
5547             break;
5548
5549           case 'G':
5550             value = do_spec_1 (libgcc_spec, 0, NULL);
5551             if (value != 0)
5552               return value;
5553             break;
5554
5555           case 'R':
5556             /* We assume there is a directory
5557                separator at the end of this string.  */
5558             if (target_system_root)
5559               {
5560                 obstack_grow (&obstack, target_system_root,
5561                               strlen (target_system_root));
5562                 if (target_sysroot_suffix)
5563                   obstack_grow (&obstack, target_sysroot_suffix,
5564                                 strlen (target_sysroot_suffix));
5565               }
5566             break;
5567
5568           case 'S':
5569             value = do_spec_1 (startfile_spec, 0, NULL);
5570             if (value != 0)
5571               return value;
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
5582           case ':':
5583             p = handle_spec_function (p);
5584             if (p == 0)
5585               return -1;
5586             break;
5587
5588           case '%':
5589             obstack_1grow (&obstack, '%');
5590             break;
5591
5592           case '.':
5593             {
5594               unsigned len = 0;
5595
5596               while (p[len] && p[len] != ' ' && p[len] != '%')
5597                 len++;
5598               suffix_subst = save_string (p - 1, len + 1);
5599               p += len;
5600             }
5601            break;
5602
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                   {
5621                     switches[i].live_cond |= SWITCH_IGNORE;
5622                     switches[i].validated = 1;
5623                   }
5624
5625               p += len;
5626             }
5627             break;
5628
5629           case '*':
5630             if (soft_matched_part)
5631               {
5632                 do_spec_1 (soft_matched_part, 1, NULL);
5633                 do_spec_1 (" ", 0, NULL);
5634               }
5635             else
5636               /* Catch the case where a spec string contains something like
5637                  '%{foo:%*}'.  i.e. there is no * in the pattern on the left
5638                  hand side of the :.  */
5639               error ("spec failure: %<%%*%> has not been initialized by pattern match");
5640             break;
5641
5642             /* Process a string found as the value of a spec given by name.
5643                This feature allows individual machine descriptions
5644                to add and use their own specs.
5645                %[...] modifies -D options the way %P does;
5646                %(...) uses the spec unmodified.  */
5647           case '[':
5648             warning (0, "use of obsolete %%[ operator in specs");
5649           case '(':
5650             {
5651               const char *name = p;
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
5656                  processed.  */
5657               while (*p && *p != ')' && *p != ']')
5658                 p++;
5659
5660               /* See if it's in the list.  */
5661               for (len = p - name, sl = specs; sl; sl = sl->next)
5662                 if (sl->name_len == len && !strncmp (sl->name, name, len))
5663                   {
5664                     name = *(sl->ptr_spec);
5665 #ifdef DEBUG_SPECS
5666                     fnotice (stderr, "Processing spec %c%s%c, which is '%s'\n",
5667                             c, sl->name, (c == '(') ? ')' : ']', name);
5668 #endif
5669                     break;
5670                   }
5671
5672               if (sl)
5673                 {
5674                   if (c == '(')
5675                     {
5676                       value = do_spec_1 (name, 0, NULL);
5677                       if (value != 0)
5678                         return value;
5679                     }
5680                   else
5681                     {
5682                       char *x = (char *) alloca (strlen (name) * 2 + 1);
5683                       char *buf = x;
5684                       const char *y = name;
5685                       int flag = 0;
5686
5687                       /* Copy all of NAME into BUF, but put __ after
5688                          every -D and at the end of each arg.  */
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                             }
5701                           else if (flag
5702                                    && (*y == ' ' || *y == '\t' || *y == '='
5703                                        || *y == '}' || *y == 0))
5704                             {
5705                               *x++ = '_';
5706                               *x++ = '_';
5707                               flag = 0;
5708                             }
5709                           if (*y == 0)
5710                             break;
5711                           else
5712                             *x++ = *y++;
5713                         }
5714                       *x = 0;
5715
5716                       value = do_spec_1 (buf, 0, NULL);
5717                       if (value != 0)
5718                         return value;
5719                     }
5720                 }
5721
5722               /* Discard the closing paren or bracket.  */
5723               if (*p)
5724                 p++;
5725             }
5726             break;
5727
5728           default:
5729             error ("spec failure: unrecognized spec option %qc", c);
5730             break;
5731           }
5732         break;
5733
5734       case '\\':
5735         /* Backslash: treat next character as ordinary.  */
5736         c = *p++;
5737
5738         /* Fall through.  */
5739       default:
5740         /* Ordinary character: put it into the current argument.  */
5741         obstack_1grow (&obstack, c);
5742         arg_going = 1;
5743       }
5744
5745   /* End of string.  If we are processing a spec function, we need to
5746      end any pending argument.  */
5747   if (processing_spec_function)
5748     end_going_arg ();
5749
5750   return 0;
5751 }
5752
5753 /* Look up a spec function.  */
5754
5755 static const struct spec_function *
5756 lookup_spec_function (const char *name)
5757 {
5758   const struct spec_function *sf;
5759
5760   for (sf = static_spec_functions; sf->name != NULL; sf++)
5761     if (strcmp (sf->name, name) == 0)
5762       return sf;
5763
5764   return NULL;
5765 }
5766
5767 /* Evaluate a spec function.  */
5768
5769 static const char *
5770 eval_spec_function (const char *func, const char *args)
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;
5785   int save_this_is_linker_script;
5786   const char *save_suffix_subst;
5787
5788
5789   sf = lookup_spec_function (func);
5790   if (sf == NULL)
5791     fatal_error ("unknown spec function %qs", func);
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;
5802   save_this_is_linker_script = this_is_linker_script;
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)
5811     fatal_error ("error in args to spec function %qs", func);
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;
5828   this_is_linker_script = save_this_is_linker_script;
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
5844 static const char *
5845 handle_spec_function (const char *p)
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 == '_'))
5860         fatal_error ("malformed spec function name");
5861     }
5862   if (*endp != '(')             /* ) */
5863     fatal_error ("no arguments for spec function");
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 != ')')
5882     fatal_error ("malformed spec function arguments");
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
5900 /* Inline subroutine of handle_braces.  Returns true if the current
5901    input suffix matches the atom bracketed by ATOM and END_ATOM.  */
5902 static inline bool
5903 input_suffix_matches (const char *atom, const char *end_atom)
5904 {
5905   return (input_suffix
5906           && !strncmp (input_suffix, atom, end_atom - atom)
5907           && input_suffix[end_atom - atom] == '\0');
5908 }
5909
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.  */
5912 static bool
5913 input_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
5923 /* Subroutine of handle_braces.  Returns true if a switch
5924    matching the atom bracketed by ATOM and END_ATOM appeared on the
5925    command line.  */
5926 static bool
5927 switch_matches (const char *atom, const char *end_atom, int starred)
5928 {
5929   int i;
5930   int len = end_atom - atom;
5931   int plen = starred ? len : -1;
5932
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;
5938
5939   return false;
5940 }
5941
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.  */
5945 static inline void
5946 mark_matching_switches (const char *atom, const char *end_atom, int starred)
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 }
5958
5959 /* Inline subroutine of handle_braces.  Process all the currently
5960    marked switches through give_switch, and clear the marks.  */
5961 static inline void
5962 process_marked_switches (void)
5963 {
5964   int i;
5965
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 }
5973
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.  */
5977
5978 static const char *
5979 handle_braces (const char *p)
5980 {
5981   const char *atom, *end_atom;
5982   const char *d_atom = NULL, *d_end_atom = NULL;
5983   const char *orig = p;
5984
5985   bool a_is_suffix;
5986   bool a_is_spectype;
5987   bool a_is_starred;
5988   bool a_is_negated;
5989   bool a_matched;
5990
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)
6000
6001   do
6002     {
6003       if (a_must_be_last)
6004         goto invalid;
6005
6006       /* Scan one "atom" (S in the description above of %{}, possibly
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;
6013
6014       SKIP_WHITE();
6015       if (*p == '!')
6016         p++, a_is_negated = true;
6017
6018       SKIP_WHITE();
6019       if (*p == '.')
6020         p++, a_is_suffix = true;
6021       else if (*p == ',')
6022         p++, a_is_spectype = true;
6023
6024       atom = p;
6025       while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
6026              || *p == ',' || *p == '.' || *p == '@')
6027         p++;
6028       end_atom = p;
6029
6030       if (*p == '*')
6031         p++, a_is_starred = 1;
6032
6033       SKIP_WHITE();
6034       switch (*p)
6035         {
6036         case '&': case '}':
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
6040               || a_is_spectype || atom == end_atom)
6041             goto invalid;
6042
6043           mark_matching_switches (atom, end_atom, a_is_starred);
6044
6045           if (*p == '}')
6046             process_marked_switches ();
6047           break;
6048
6049         case '|': case ':':
6050           /* Substitute some text if the current atom appears as a switch
6051              or suffix.  */
6052           disjunct_set = true;
6053           if (ordered_set)
6054             goto invalid;
6055
6056           if (atom == end_atom)
6057             {
6058               if (!n_way_choice || disj_matched || *p == '|'
6059                   || a_is_negated || a_is_suffix || a_is_spectype
6060                   || a_is_starred)
6061                 goto invalid;
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;
6068             }
6069           else
6070             {
6071               if ((a_is_suffix || a_is_spectype) && a_is_starred)
6072                 goto invalid;
6073
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);
6087
6088                   if (a_matched != a_is_negated)
6089                     {
6090                       disj_matched = true;
6091                       d_atom = atom;
6092                       d_end_atom = end_atom;
6093                     }
6094                 }
6095             }
6096
6097           if (*p == ':')
6098             {
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;
6105
6106               /* If we have an N-way choice, reset state for the next
6107                  disjunction.  */
6108               if (*p == ';')
6109                 {
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;
6115                 }
6116             }
6117           break;
6118
6119         default:
6120           goto invalid;
6121         }
6122     }
6123   while (*p++ != '}');
6124
6125   return p;
6126
6127  invalid:
6128   fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
6129
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
6143 static const char *
6144 process_brace_body (const char *p, const char *atom, const char *end_atom,
6145                     int starred, int matched)
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 == '}')
6160         {
6161           if (!--nesting_level)
6162             break;
6163         }
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')
6169         goto invalid;
6170       p++;
6171     }
6172
6173   end_body = p;
6174   while (end_body[-1] == ' ' || end_body[-1] == '\t')
6175     end_body--;
6176
6177   if (have_subst && !starred)
6178     goto invalid;
6179
6180   if (matched)
6181     {
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;
6198
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         }
6211     }
6212
6213   return p;
6214
6215  invalid:
6216   fatal_error ("braced spec body %qs is invalid", body);
6217 }
6218 \f
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.
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
6227 static int
6228 check_live_switch (int switchnum, int prefix_length)
6229 {
6230   const char *name = switches[switchnum].part1;
6231   int i;
6232
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
6238             && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6239                == 0);
6240
6241   /* In the common case of {<at-most-one-letter>*}, a negating
6242      switch would always match, so ignore that case.  We will just
6243      send the conflicting switches to the compiler phase.  */
6244   if (prefix_length >= 0 && prefix_length <= 1)
6245     return 1;
6246
6247   /* Now search for duplicate in a manner that depends on the name.  */
6248   switch (*name)
6249     {
6250     case 'O':
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           }
6258       break;
6259
6260     case 'W':  case 'f':  case 'm':
6261       if (! strncmp (name + 1, "no-", 3))
6262         {
6263           /* We have Xno-YYY, search for XYYY.  */
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]))
6267               {
6268                 switches[switchnum].validated = 1;
6269                 switches[switchnum].live_cond = SWITCH_FALSE;
6270                 return 0;
6271               }
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]))
6282               {
6283                 switches[switchnum].validated = 1;
6284                 switches[switchnum].live_cond = SWITCH_FALSE;
6285                 return 0;
6286               }
6287         }
6288       break;
6289     }
6290
6291   /* Otherwise the switch is live.  */
6292   switches[switchnum].live_cond |= SWITCH_LIVE;
6293   return 1;
6294 }
6295 \f
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
6302    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
6303
6304 static void
6305 give_switch (int switchnum, int omit_first_word)
6306 {
6307   if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6308     return;
6309
6310   if (!omit_first_word)
6311     {
6312       do_spec_1 ("-", 0, NULL);
6313       do_spec_1 (switches[switchnum].part1, 1, NULL);
6314     }
6315
6316   if (switches[switchnum].args != 0)
6317     {
6318       const char **p;
6319       for (p = switches[switchnum].args; *p; p++)
6320         {
6321           const char *arg = *p;
6322
6323           do_spec_1 (" ", 0, NULL);
6324           if (suffix_subst)
6325             {
6326               unsigned length = strlen (arg);
6327               int dot = 0;
6328
6329               while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6330                 if (arg[length] == '.')
6331                   {
6332                     (CONST_CAST(char *, arg))[length] = 0;
6333                     dot = 1;
6334                     break;
6335                   }
6336               do_spec_1 (arg, 1, NULL);
6337               if (dot)
6338                 (CONST_CAST(char *, arg))[length] = '.';
6339               do_spec_1 (suffix_subst, 1, NULL);
6340             }
6341           else
6342             do_spec_1 (arg, 1, NULL);
6343         }
6344     }
6345
6346   do_spec_1 (" ", 0, NULL);
6347   switches[switchnum].validated = 1;
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
6354 static const char *
6355 find_file (const char *name)
6356 {
6357   char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6358   return newname ? newname : name;
6359 }
6360
6361 /* Determine whether a directory exists.  If LINKER, return 0 for
6362    certain fixed names not needed by the linker.  */
6363
6364 static int
6365 is_directory (const char *path1, bool linker)
6366 {
6367   int len1;
6368   char *path;
6369   char *cp;
6370   struct stat st;
6371
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);
6375   path = (char *) alloca (3 + len1);
6376   memcpy (path, path1, len1);
6377   cp = path + len1;
6378   if (!IS_DIR_SEPARATOR (cp[-1]))
6379     *cp++ = DIR_SEPARATOR;
6380   *cp++ = '.';
6381   *cp = '\0';
6382
6383   /* Exclude directories that the linker is known to search.  */
6384   if (linker
6385       && IS_DIR_SEPARATOR (path[0])
6386       && ((cp - path == 6
6387            && strncmp (path + 1, "lib", 3) == 0)
6388           || (cp - path == 10
6389               && strncmp (path + 1, "usr", 3) == 0
6390               && IS_DIR_SEPARATOR (path[4])
6391               && strncmp (path + 5, "lib", 3) == 0)))
6392     return 0;
6393
6394   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6395 }
6396
6397 /* Set up the various global variables to indicate that we're processing
6398    the input file named FILENAME.  */
6399
6400 void
6401 set_input (const char *filename)
6402 {
6403   const char *p;
6404
6405   gcc_input_filename = filename;
6406   input_filename_length = strlen (gcc_input_filename);
6407   input_basename = lbasename (gcc_input_filename);
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);
6412   suffixed_basename_length = basename_length;
6413   p = input_basename + basename_length;
6414   while (p != input_basename && *p != '.')
6415     --p;
6416   if (*p == '.' && p != input_basename)
6417     {
6418       basename_length = p - input_basename;
6419       input_suffix = p + 1;
6420     }
6421   else
6422     input_suffix = "";
6423
6424   /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6425      we will need to do a stat on the gcc_input_filename.  The
6426      INPUT_STAT_SET signals that the stat is needed.  */
6427   input_stat_set = 0;
6428 }
6429 \f
6430 /* On fatal signals, delete all the temporary files.  */
6431
6432 static void
6433 fatal_signal (int signum)
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
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
6447 static int
6448 compare_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",
6466                    gcc_input_filename, cmpfile[i]);
6467             ret = 1;
6468             break;
6469           }
6470
6471         length[i] = st.st_size;
6472       }
6473
6474     if (!ret && length[0] != length[1])
6475       {
6476         error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
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",
6487                      gcc_input_filename, cmpfile[i]);
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           {
6506             error ("%s: -fcompare-debug failure", gcc_input_filename);
6507             ret = 1;
6508           }
6509       }
6510
6511     for (i = 0; i < 2; i++)
6512       if (map[i])
6513         munmap ((caddr_t) map[i], length[i]);
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",
6528                  gcc_input_filename, cmpfile[i]);
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",
6544                    gcc_input_filename);
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
6562 extern int main (int, char **);
6563
6564 int
6565 main (int argc, char **argv)
6566 {
6567   size_t i;
6568   int value;
6569   int linker_was_run = 0;
6570   int lang_n_infiles = 0;
6571   int num_linker_inputs = 0;
6572   char *explicit_link_files;
6573   char *specs_file;
6574   const char *p;
6575   struct user_specs *uptr;
6576   char **old_argv = argv;
6577
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
6582   p = argv[0] + strlen (argv[0]);
6583   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6584     --p;
6585   progname = p;
6586
6587   xmalloc_set_program_name (progname);
6588
6589   expandargv (&argc, &argv);
6590
6591   /* Determine if any expansions were made.  */
6592   if (argv != old_argv)
6593     at_file_supplied = true;
6594
6595   prune_options (&argc, &argv);
6596
6597 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6598   /* Perform host dependent initialization when needed.  */
6599   GCC_DRIVER_HOST_INITIALIZATION;
6600 #endif
6601
6602   /* Unlock the stdio streams.  */
6603   unlock_std_streams ();
6604
6605   gcc_init_libintl ();
6606
6607   diagnostic_initialize (global_dc, 0);
6608   if (atexit (delete_temp_files) != 0)
6609     fatal_error ("atexit failed");
6610
6611   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6612     signal (SIGINT, fatal_signal);
6613 #ifdef SIGHUP
6614   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6615     signal (SIGHUP, fatal_signal);
6616 #endif
6617   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6618     signal (SIGTERM, fatal_signal);
6619 #ifdef SIGPIPE
6620   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6621     signal (SIGPIPE, fatal_signal);
6622 #endif
6623 #ifdef SIGCHLD
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);
6627 #endif
6628
6629   /* Allocate the argument vector.  */
6630   alloc_args ();
6631
6632   obstack_init (&obstack);
6633
6634   /* Build multilib_select, et. al from the separate lines that make up each
6635      multilib selection.  */
6636   {
6637     const char *const *q = multilib_raw;
6638     int need_space;
6639
6640     obstack_init (&multilib_obstack);
6641     while ((p = *q++) != (char *) 0)
6642       obstack_grow (&multilib_obstack, p, strlen (p));
6643
6644     obstack_1grow (&multilib_obstack, 0);
6645     multilib_select = XOBFINISH (&multilib_obstack, const char *);
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);
6652     multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6653
6654     q = multilib_exclusions_raw;
6655     while ((p = *q++) != (char *) 0)
6656       obstack_grow (&multilib_obstack, p, strlen (p));
6657
6658     obstack_1grow (&multilib_obstack, 0);
6659     multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6660
6661     need_space = FALSE;
6662     for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
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);
6673     multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6674   }
6675
6676 #ifdef INIT_ENVIRONMENT
6677   /* Set up any other necessary machine specific environment variables.  */
6678   xputenv (INIT_ENVIRONMENT);
6679 #endif
6680
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
6685   process_command (argc, CONST_CAST2 (const char **, char **, argv));
6686
6687   /* Initialize the vector of specs to just the default.
6688      This means one element containing 0s, as a terminator.  */
6689
6690   compilers = XNEWVAR (struct compiler, sizeof default_compilers);
6691   memcpy (compilers, default_compilers, sizeof default_compilers);
6692   n_compilers = n_default_compilers;
6693
6694   /* Read specs from a file if there is one.  */
6695
6696   machine_suffix = concat (spec_machine, dir_separator_str,
6697                            spec_version, dir_separator_str, NULL);
6698   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6699
6700   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
6701   /* Read the specs file unless it is a default one.  */
6702   if (specs_file != 0 && strcmp (specs_file, "specs"))
6703     read_specs (specs_file, TRUE);
6704   else
6705     init_spec ();
6706
6707   /* We need to check standard_exec_prefix/just_machine_suffix/specs
6708      for any override of as, ld and libraries.  */
6709   specs_file = (char *) alloca (strlen (standard_exec_prefix)
6710                        + strlen (just_machine_suffix) + sizeof ("specs"));
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);
6717
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
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
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
6767   /* If not cross-compiling, look for executables in the standard
6768      places.  */
6769   if (*cross_compile == '0')
6770     {
6771       if (*md_exec_prefix)
6772         {
6773           add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6774                       PREFIX_PRIORITY_LAST, 0, 0);
6775         }
6776     }
6777
6778   /* Process sysroot_suffix_spec.  */
6779   if (*sysroot_suffix_spec != 0
6780       && do_spec_2 (sysroot_suffix_spec) == 0)
6781     {
6782       if (argbuf_index > 1)
6783         error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6784       else if (argbuf_index == 1)
6785         target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6786     }
6787
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));
6797       set_spec ("link", XOBFINISH (&obstack, const char *));
6798     }
6799 #endif
6800
6801   /* Process sysroot_hdrs_suffix_spec.  */
6802   if (*sysroot_hdrs_suffix_spec != 0
6803       && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6804     {
6805       if (argbuf_index > 1)
6806         error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6807       else if (argbuf_index == 1)
6808         target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6809     }
6810
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",
6819                               PREFIX_PRIORITY_LAST, 0, 1);
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     {
6825       if (*md_startfile_prefix)
6826         add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6827                               "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6828
6829       if (*md_startfile_prefix_1)
6830         add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6831                               "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6832
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
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.  */
6840       if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6841         add_sysrooted_prefix (&startfile_prefixes,
6842                               standard_startfile_prefix, "BINUTILS",
6843                               PREFIX_PRIORITY_LAST, 0, 1);
6844       else if (*cross_compile == '0')
6845         {
6846           add_prefix (&startfile_prefixes,
6847                       concat (gcc_exec_prefix
6848                               ? gcc_exec_prefix : standard_exec_prefix,
6849                               machine_suffix,
6850                               standard_startfile_prefix, NULL),
6851                       NULL, PREFIX_PRIORITY_LAST, 0, 1);
6852         }
6853
6854       /* Sysrooted prefixes are relocated because target_system_root is
6855          also relocated by gcc_exec_prefix.  */
6856       if (*standard_startfile_prefix_1)
6857         add_sysrooted_prefix (&startfile_prefixes,
6858                               standard_startfile_prefix_1, "BINUTILS",
6859                               PREFIX_PRIORITY_LAST, 0, 1);
6860       if (*standard_startfile_prefix_2)
6861         add_sysrooted_prefix (&startfile_prefixes,
6862                               standard_startfile_prefix_2, "BINUTILS",
6863                               PREFIX_PRIORITY_LAST, 0, 1);
6864     }
6865
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     {
6870       char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6871                                     R_OK, true);
6872       read_specs (filename ? filename : uptr->filename, FALSE);
6873     }
6874
6875   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
6876   if (gcc_exec_prefix)
6877     gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6878                               spec_version, dir_separator_str, NULL);
6879
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
6885   /* Now that we have the switches and the specs, set
6886      the subdirectory based on the options.  */
6887   set_multilib_dir ();
6888
6889   /* Set up to remember the pathname of gcc and any options
6890      needed for collect.  We use argv[0] instead of progname because
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
6910   /* Warn about any switches that no pass was interested in.  */
6911
6912   for (i = 0; (int) i < n_switches; i++)
6913     if (! switches[i].validated)
6914       error ("unrecognized option %<-%s%>", switches[i].part1);
6915
6916   /* Obey some of the options.  */
6917
6918   if (print_search_dirs)
6919     {
6920       printf (_("install: %s%s\n"),
6921               gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
6922               gcc_exec_prefix ? "" : machine_suffix);
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));
6927       return (0);
6928     }
6929
6930   if (print_file_name)
6931     {
6932       printf ("%s\n", find_file (print_file_name));
6933       return (0);
6934     }
6935
6936   if (print_prog_name)
6937     {
6938       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6939       printf ("%s\n", (newname ? newname : print_prog_name));
6940       return (0);
6941     }
6942
6943   if (print_multi_lib)
6944     {
6945       print_multilib_info ();
6946       return (0);
6947     }
6948
6949   if (print_multi_directory)
6950     {
6951       if (multilib_dir == NULL)
6952         printf (".\n");
6953       else
6954         printf ("%s\n", multilib_dir);
6955       return (0);
6956     }
6957
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
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
6979   if (print_sysroot_headers_suffix)
6980     {
6981       if (*sysroot_hdrs_suffix_spec)
6982         {
6983           printf("%s\n", (target_sysroot_hdrs_suffix
6984                           ? target_sysroot_hdrs_suffix
6985                           : ""));
6986           return (0);
6987         }
6988       else
6989         /* The error status indicates that only one set of fixed
6990            headers should be built.  */
6991         fatal_error ("not configured with sysroot headers suffix");
6992     }
6993
6994   if (print_help_list)
6995     {
6996       display_help ();
6997
6998       if (! verbose_flag)
6999         {
7000           printf (_("\nFor bug reporting instructions, please see:\n"));
7001           printf ("%s.\n", bug_report_url);
7002
7003           return (0);
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
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);
7012     }
7013
7014   if (print_version)
7015     {
7016       printf (_("%s %s%s\n"), progname, pkgversion_string,
7017               version_string);
7018       printf ("Copyright %s 2010 Free Software Foundation, Inc.\n",
7019               _("(C)"));
7020       fputs (_("This is free software; see the source for copying conditions.  There is NO\n\
7021 warranty; 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
7032   if (verbose_flag)
7033     {
7034       int n;
7035       const char *thrmod;
7036
7037       fnotice (stderr, "Target: %s\n", spec_machine);
7038       fnotice (stderr, "Configured with: %s\n", configuration_arguments);
7039
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');
7047       thrmod = XOBFINISH (&obstack, const char *);
7048 #else
7049       thrmod = thread_model;
7050 #endif
7051
7052       fnotice (stderr, "Thread model: %s\n", thrmod);
7053
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)
7063         fnotice (stderr, "gcc version %s %s\n", version_string,
7064                  pkgversion_string);
7065       else
7066         fnotice (stderr, "gcc driver version %s %sexecuting gcc version %s\n",
7067                  version_string, pkgversion_string, compiler_version);
7068
7069       if (n_infiles == 0)
7070         return (0);
7071     }
7072
7073   if (n_infiles == added_libraries)
7074     fatal_error ("no input files");
7075
7076   /* Make a place to record the compiler output file names
7077      that correspond to the input files.  */
7078
7079   i = n_infiles;
7080   i += lang_specific_extra_outfiles;
7081   outfiles = XCNEWVEC (const char *, i);
7082
7083   /* Record which files were specified explicitly as link input.  */
7084
7085   explicit_link_files = XCNEWVEC (char, n_infiles);
7086
7087   if (combine_flag)
7088     combine_inputs = true;
7089   else
7090     combine_inputs = false;
7091
7092   for (i = 0; (int) i < n_infiles; i++)
7093     {
7094       const char *name = infiles[i].name;
7095       struct compiler *compiler = lookup_compiler (name,
7096                                                    strlen (name),
7097                                                    infiles[i].language);
7098
7099       if (compiler && !(compiler->combinable))
7100         combine_inputs = false;
7101
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
7114              linker file.  */
7115           explicit_link_files[i] = 1;
7116           infiles[i].incompiler = NULL;
7117         }
7118       infiles[i].compiled = false;
7119       infiles[i].preprocessed = false;
7120     }
7121
7122   if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
7123    fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
7124
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;
7135
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",
7149                          gcc_input_filename, &input_file_compiler->spec[1]);
7150                   this_file_error = 1;
7151                 }
7152               else
7153                 {
7154                   value = do_spec (input_file_compiler->spec);
7155                   infiles[i].preprocessed = true;
7156                   if (!have_o_argbuf_index)
7157                     fatal_error ("spec %qs is invalid",
7158                                  input_file_compiler->spec);
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);
7164
7165                   if (value < 0)
7166                     this_file_error = 1;
7167                 }
7168             }
7169
7170           if (this_file_error)
7171             {
7172               delete_failure_queue ();
7173               errorcount++;
7174               break;
7175             }
7176           clear_failure_queue ();
7177         }
7178       combine_inputs = save_combine_inputs;
7179     }
7180
7181   for (i = 0; (int) i < n_infiles; i++)
7182     {
7183       int this_file_error = 0;
7184
7185       /* Tell do_spec what to substitute for %i.  */
7186
7187       input_file_number = i;
7188       set_input (infiles[i].name);
7189
7190       if (infiles[i].compiled)
7191         continue;
7192
7193       /* Use the same thing in %o, unless cp->spec says otherwise.  */
7194
7195       outfiles[i] = gcc_input_filename;
7196
7197       /* Figure out which compiler from the file's suffix.  */
7198
7199       if (! combine_inputs)
7200         input_file_compiler
7201           = lookup_compiler (infiles[i].name, input_filename_length,
7202                              infiles[i].language);
7203       else
7204         input_file_compiler = infiles[i].incompiler;
7205
7206       if (input_file_compiler)
7207         {
7208           /* Ok, we found an applicable compiler.  Run its spec.  */
7209
7210           if (input_file_compiler->spec[0] == '#')
7211             {
7212               error ("%s: %s compiler not installed on this system",
7213                      gcc_input_filename, &input_file_compiler->spec[1]);
7214               this_file_error = 1;
7215             }
7216           else
7217             {
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
7229               value = do_spec (input_file_compiler->spec);
7230               infiles[i].compiled = true;
7231               if (value < 0)
7232                 this_file_error = 1;
7233               else if (compare_debug && debug_check_temp_file[0])
7234                 {
7235                   if (verbose_flag)
7236                     inform (0, "recompiling with -fcompare-debug");
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)
7259                     inform (0, "comparing final insns dumps");
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                 }
7275             }
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 ();
7290           errorcount++;
7291         }
7292       /* If this compilation succeeded, don't delete those files later.  */
7293       clear_failure_queue ();
7294     }
7295
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
7298      a compiler to compile it instead of using infiles.language since for
7299      languages other than C we use aliases that we then lookup later.  */
7300   if (n_infiles > 0)
7301     {
7302       int i;
7303
7304       for (i = 0; i < n_infiles ; i++)
7305         if (infiles[i].language && infiles[i].language[0] != '*')
7306           {
7307             set_input (infiles[i].name);
7308             break;
7309           }
7310     }
7311
7312   if (!seen_error ())
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 ())
7318         errorcount++;
7319     }
7320
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
7327   /* Run ld to link all the compiler output files.  */
7328
7329   if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
7330     {
7331       int tmp = execution_count;
7332       const char *fuse_linker_plugin = "fuse-linker-plugin";
7333
7334       /* We'll use ld if we can't find collect2.  */
7335       if (! strcmp (linker_name_spec, "collect2"))
7336         {
7337           char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7338           if (s == NULL)
7339             linker_name_spec = "ld";
7340         }
7341
7342       if (switch_matches (fuse_linker_plugin,
7343                           fuse_linker_plugin + strlen (fuse_linker_plugin), 0))
7344         {
7345           linker_plugin_file_spec = find_a_file (&exec_prefixes,
7346                                                  "liblto_plugin.so", R_OK,
7347                                                  false);
7348           if (!linker_plugin_file_spec)
7349             fatal_error ("-fuse-linker-plugin, but liblto_plugin.so not found");
7350
7351           lto_libgcc_spec = find_a_file (&startfile_prefixes, "libgcc.a",
7352                                          R_OK, true);
7353           if (!lto_libgcc_spec)
7354             fatal_error ("could not find libgcc.a");
7355         }
7356       lto_gcc_spec = argv[0];
7357
7358       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7359          for collect.  */
7360       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7361       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7362
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         }
7370       value = do_spec (link_command_spec);
7371       if (value < 0)
7372         errorcount = 1;
7373       linker_was_run = (tmp != execution_count);
7374     }
7375
7376   /* If options said don't run linker,
7377      complain about input files to be given to the linker.  */
7378
7379   if (! linker_was_run && !seen_error ())
7380     for (i = 0; (int) i < n_infiles; i++)
7381       if (explicit_link_files[i]
7382           && !(infiles[i].language && infiles[i].language[0] == '*'))
7383         warning (0, "%s: linker input file unused because linking not done",
7384                  outfiles[i]);
7385
7386   /* Delete some or all of the temporary files we made.  */
7387
7388   if (seen_error ())
7389     delete_failure_queue ();
7390   delete_temp_files ();
7391
7392   if (print_help_list)
7393     {
7394       printf (("\nFor bug reporting instructions, please see:\n"));
7395       printf ("%s\n", bug_report_url);
7396     }
7397
7398   return (signal_count != 0 ? 2
7399           : seen_error () ? (pass_exit_codes ? greatest_status : 1)
7400           : 0);
7401 }
7402
7403 /* Find the proper compilation spec for the file name NAME,
7404    whose length is LENGTH.  LANGUAGE is the specified language,
7405    or 0 if this file is to be passed to the linker.  */
7406
7407 static struct compiler *
7408 lookup_compiler (const char *name, size_t length, const char *language)
7409 {
7410   struct compiler *cp;
7411
7412   /* If this was specified by the user to be a linker input, indicate that.  */
7413   if (language != 0 && language[0] == '*')
7414     return 0;
7415
7416   /* Otherwise, look for the language, if one is spec'd.  */
7417   if (language != 0)
7418     {
7419       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7420         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7421           return cp;
7422
7423       error ("language %s not recognized", language);
7424       return 0;
7425     }
7426
7427   /* Look for a suffix.  */
7428   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7429     {
7430       if (/* The suffix `-' matches only the file name `-'.  */
7431           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7432           || (strlen (cp->suffix) < length
7433               /* See if the suffix matches the end of NAME.  */
7434               && !strcmp (cp->suffix,
7435                           name + length - strlen (cp->suffix))
7436          ))
7437         break;
7438     }
7439
7440 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7441   /* Look again, but case-insensitively this time.  */
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
7459   if (cp >= compilers)
7460     {
7461       if (cp->spec[0] != '@')
7462         /* A non-alias entry: return it.  */
7463         return cp;
7464
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.  */
7468       return lookup_compiler (NULL, 0, cp->spec + 1);
7469     }
7470   return 0;
7471 }
7472 \f
7473 static char *
7474 save_string (const char *s, int len)
7475 {
7476   char *result = XNEWVEC (char, len + 1);
7477
7478   memcpy (result, s, len);
7479   result[len] = 0;
7480   return result;
7481 }
7482
7483 void
7484 pfatal_with_name (const char *name)
7485 {
7486   perror_with_name (name);
7487   delete_temp_files ();
7488   exit (1);
7489 }
7490
7491 static void
7492 perror_with_name (const char *name)
7493 {
7494   error ("%s: %m", name);
7495 }
7496 \f
7497 static inline void
7498 validate_switches_from_spec (const char *spec)
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
7508 static void
7509 validate_all_switches (void)
7510 {
7511   struct compiler *comp;
7512   struct spec_list *spec;
7513
7514   for (comp = compilers; comp->spec; comp++)
7515     validate_switches_from_spec (comp->spec);
7516
7517   /* Look through the linked list of specs read from the specs file.  */
7518   for (spec = specs; spec; spec = spec->next)
7519     validate_switches_from_spec (*spec->ptr_spec);
7520
7521   validate_switches_from_spec (link_command_spec);
7522 }
7523
7524 /* Look at the switch-name that comes after START
7525    and mark as valid all supplied switches that match it.  */
7526
7527 static const char *
7528 validate_switches (const char *start)
7529 {
7530   const char *p = start;
7531   const char *atom;
7532   size_t len;
7533   int i;
7534   bool suffix = false;
7535   bool starred = false;
7536
7537 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7538
7539 next_member:
7540   SKIP_WHITE ();
7541
7542   if (*p == '!')
7543     p++;
7544
7545   SKIP_WHITE ();
7546   if (*p == '.' || *p == ',')
7547     suffix = true, p++;
7548
7549   atom = p;
7550   while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7551          || *p == ',' || *p == '.' || *p == '@')
7552     p++;
7553   len = p - atom;
7554
7555   if (*p == '*')
7556     starred = true, p++;
7557
7558   SKIP_WHITE ();
7559
7560   if (!suffix)
7561     {
7562       /* Mark all matching switches as valid.  */
7563       for (i = 0; i < n_switches; i++)
7564         if (!strncmp (switches[i].part1, atom, len)
7565             && (starred || switches[i].part1[len] == 0))
7566           switches[i].validated = 1;
7567     }
7568
7569   if (*p) p++;
7570   if (*p && (p[-1] == '|' || p[-1] == '&'))
7571     goto next_member;
7572
7573   if (*p && p[-1] == ':')
7574     {
7575       while (*p && *p != ';' && *p != '}')
7576         {
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             }
7585           else
7586             p++;
7587         }
7588
7589       if (*p) p++;
7590       if (*p && p[-1] == ';')
7591         goto next_member;
7592     }
7593
7594   return p;
7595 #undef SKIP_WHITE
7596 }
7597 \f
7598 struct mdswitchstr
7599 {
7600   const char *str;
7601   int len;
7602 };
7603
7604 static struct mdswitchstr *mdswitches;
7605 static int n_mdswitches;
7606
7607 /* Check whether a particular argument was used.  The first time we
7608    canonicalize the switches to keep only the ones we care about.  */
7609
7610 static int
7611 used_arg (const char *p, int len)
7612 {
7613   struct mswitchstr
7614   {
7615     const char *str;
7616     const char *replace;
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;
7628       const char *q;
7629       int cnt = 0;
7630
7631       /* Break multilib_matches into the component strings of string
7632          and replacement string.  */
7633       for (q = multilib_matches; *q != '\0'; q++)
7634         if (*q == ';')
7635           cnt++;
7636
7637       matches
7638         = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
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')
7647                 {
7648                 invalid_matches:
7649                   fatal_error ("multilib spec %qs is invalid",
7650                                multilib_matches);
7651                 }
7652               q++;
7653             }
7654           matches[i].len = q - matches[i].str;
7655
7656           matches[i].replace = ++q;
7657           while (*q != ';' && *q != '\0')
7658             {
7659               if (*q == ' ')
7660                 goto invalid_matches;
7661               q++;
7662             }
7663           matches[i].rep_len = q - matches[i].replace;
7664           i++;
7665           if (*q == ';')
7666             q++;
7667         }
7668
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
7674         = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7675       for (i = 0; i < n_switches; i++)
7676         if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
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           }
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         }
7742     }
7743
7744   for (i = 0; i < n_mswitches; i++)
7745     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7746       return 1;
7747
7748   return 0;
7749 }
7750
7751 static int
7752 default_arg (const char *p, int len)
7753 {
7754   int i;
7755
7756   for (i = 0; i < n_mdswitches; i++)
7757     if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7758       return 1;
7759
7760   return 0;
7761 }
7762
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.  */
7773
7774 static void
7775 set_multilib_dir (void)
7776 {
7777   const char *p;
7778   unsigned int this_path_len;
7779   const char *this_path, *this_arg;
7780   const char *start, *end;
7781   int not_arg;
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
7801       mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
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;
7809
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);
7816           mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
7817           mdswitches[i++].len = end - start;
7818
7819           if (*end == '\0')
7820             break;
7821         }
7822     }
7823
7824   p = multilib_exclusions;
7825   while (*p != '\0')
7826     {
7827       /* Ignore newlines.  */
7828       if (*p == '\n')
7829         {
7830           ++p;
7831           continue;
7832         }
7833
7834       /* Check the arguments.  */
7835       ok = 1;
7836       while (*p != ';')
7837         {
7838           if (*p == '\0')
7839             {
7840             invalid_exclusions:
7841               fatal_error ("multilib exclusions %qs is invalid",
7842                            multilib_exclusions);
7843             }
7844
7845           if (! ok)
7846             {
7847               ++p;
7848               continue;
7849             }
7850
7851           this_arg = p;
7852           while (*p != ' ' && *p != ';')
7853             {
7854               if (*p == '\0')
7855                 goto invalid_exclusions;
7856               ++p;
7857             }
7858
7859           if (*this_arg != '!')
7860             not_arg = 0;
7861           else
7862             {
7863               not_arg = 1;
7864               ++this_arg;
7865             }
7866
7867           ok = used_arg (this_arg, p - this_arg);
7868           if (not_arg)
7869             ok = ! ok;
7870
7871           if (*p == ' ')
7872             ++p;
7873         }
7874
7875       if (ok)
7876         return;
7877
7878       ++p;
7879     }
7880
7881   first = 1;
7882   p = multilib_select;
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')
7897             {
7898             invalid_select:
7899               fatal_error ("multilib select %qs is invalid",
7900                            multilib_select);
7901             }
7902           ++p;
7903         }
7904       this_path_len = p - this_path;
7905
7906       /* Check the arguments.  */
7907       ok = 1;
7908       ndfltok = 1;
7909       ++p;
7910       while (*p != ';')
7911         {
7912           if (*p == '\0')
7913             goto invalid_select;
7914
7915           if (! ok)
7916             {
7917               ++p;
7918               continue;
7919             }
7920
7921           this_arg = p;
7922           while (*p != ' ' && *p != ';')
7923             {
7924               if (*p == '\0')
7925                 goto invalid_select;
7926               ++p;
7927             }
7928
7929           if (*this_arg != '!')
7930             not_arg = 0;
7931           else
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.  */
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;
7953
7954           if (*p == ' ')
7955             ++p;
7956         }
7957
7958       if (ok && first)
7959         {
7960           if (this_path_len != 1
7961               || this_path[0] != '.')
7962             {
7963               char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
7964               char *q;
7965
7966               strncpy (new_multilib_dir, this_path, this_path_len);
7967               new_multilib_dir[this_path_len] = '\0';
7968               q = strchr (new_multilib_dir, ':');
7969               if (q != NULL)
7970                 *q = '\0';
7971               multilib_dir = new_multilib_dir;
7972             }
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++;
7982           if (q < end)
7983             {
7984               char *new_multilib_os_dir = XNEWVEC (char, end - q);
7985               memcpy (new_multilib_os_dir, q + 1, end - q - 1);
7986               new_multilib_os_dir[end - q - 1] = '\0';
7987               multilib_os_dir = new_multilib_os_dir;
7988               break;
7989             }
7990         }
7991
7992       ++p;
7993     }
7994
7995   if (multilib_dir == NULL && multilib_os_dir != NULL
7996       && strcmp (multilib_os_dir, ".") == 0)
7997     {
7998       free (CONST_CAST (char *, multilib_os_dir));
7999       multilib_os_dir = NULL;
8000     }
8001   else if (multilib_dir != NULL && multilib_os_dir == NULL)
8002     multilib_os_dir = multilib_dir;
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
8012    generated by the genmultilib script. Also, we leave out ones that match
8013    the exclusions.  */
8014
8015 static void
8016 print_multilib_info (void)
8017 {
8018   const char *p = multilib_select;
8019   const char *last_path = 0, *this_path;
8020   int skip;
8021   unsigned int last_path_len = 0;
8022
8023   while (*p != '\0')
8024     {
8025       skip = 0;
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')
8038             {
8039             invalid_select:
8040               fatal_error ("multilib select %qs is invalid", multilib_select);
8041             }
8042
8043           ++p;
8044         }
8045
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
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.  */
8055       {
8056         const char *e = multilib_exclusions;
8057         const char *this_arg;
8058
8059         while (*e != '\0')
8060           {
8061             int m = 1;
8062             /* Ignore newlines.  */
8063             if (*e == '\n')
8064               {
8065                 ++e;
8066                 continue;
8067               }
8068
8069             /* Check the arguments.  */
8070             while (*e != ';')
8071               {
8072                 const char *q;
8073                 int mp = 0;
8074
8075                 if (*e == '\0')
8076                   {
8077                   invalid_exclusion:
8078                     fatal_error ("multilib exclusion %qs is invalid",
8079                                  multilib_exclusions);
8080                   }
8081
8082                 if (! m)
8083                   {
8084                     ++e;
8085                     continue;
8086                   }
8087
8088                 this_arg = e;
8089
8090                 while (*e != ' ' && *e != ';')
8091                   {
8092                     if (*e == '\0')
8093                       goto invalid_exclusion;
8094                     ++e;
8095                   }
8096
8097                 q = p + 1;
8098                 while (*q != ';')
8099                   {
8100                     const char *arg;
8101                     int len = e - this_arg;
8102
8103                     if (*q == '\0')
8104                       goto invalid_select;
8105
8106                     arg = q;
8107
8108                     while (*q != ' ' && *q != ';')
8109                       {
8110                         if (*q == '\0')
8111                           goto invalid_select;
8112                         ++q;
8113                       }
8114
8115                     if (! strncmp (arg, this_arg,
8116                                    (len < q - arg) ? q - arg : len)
8117                         || default_arg (this_arg, e - this_arg))
8118                       {
8119                         mp = 1;
8120                         break;
8121                       }
8122
8123                     if (*q == ' ')
8124                       ++q;
8125                   }
8126
8127                 if (! mp)
8128                   m = 0;
8129
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       }
8144
8145       if (! skip)
8146         {
8147           /* If this is a duplicate, skip it.  */
8148           skip = (last_path != 0
8149                   && (unsigned int) (p - this_path) == last_path_len
8150                   && ! strncmp (last_path, this_path, last_path_len));
8151
8152           last_path = this_path;
8153           last_path_len = p - this_path;
8154         }
8155
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         {
8161           const char *q;
8162
8163           q = p + 1;
8164           while (*q != ';')
8165             {
8166               const char *arg;
8167
8168               if (*q == '\0')
8169                 goto invalid_select;
8170
8171               if (*q == '!')
8172                 arg = NULL;
8173               else
8174                 arg = q;
8175
8176               while (*q != ' ' && *q != ';')
8177                 {
8178                   if (*q == '\0')
8179                     goto invalid_select;
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
8195       if (! skip)
8196         {
8197           const char *p1;
8198
8199           for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
8200             putchar (*p1);
8201           putchar (';');
8202         }
8203
8204       ++p;
8205       while (*p != ';')
8206         {
8207           int use_arg;
8208
8209           if (*p == '\0')
8210             goto invalid_select;
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')
8226                 goto invalid_select;
8227               if (use_arg)
8228                 putchar (*p);
8229               ++p;
8230             }
8231
8232           if (*p == ' ')
8233             ++p;
8234         }
8235
8236       if (! skip)
8237         {
8238           /* If there are extra options, print them now.  */
8239           if (multilib_extra && *multilib_extra)
8240             {
8241               int print_at = TRUE;
8242               const char *q;
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             }
8257
8258           putchar ('\n');
8259         }
8260
8261       ++p;
8262     }
8263 }
8264 \f
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
8271 static const char *
8272 getenv_spec_function (int argc, const char **argv)
8273 {
8274   char *value;
8275   char *result;
8276   char *ptr;
8277   size_t len;
8278
8279   if (argc != 2)
8280     return NULL;
8281
8282   value = getenv (argv[0]);
8283   if (!value)
8284     fatal_error ("environment variable %qs not defined", argv[0]);
8285
8286   /* We have to escape every character of the environment variable so
8287      they are not interpreted as active spec characters.  A
8288      particularly painful case is when we are reading a variable
8289      holding a windows path complete with \ separators.  */
8290   len = strlen (value) * 2 + strlen (argv[1]) + 1;
8291   result = XNEWVAR (char, len);
8292   for (ptr = result; *value; ptr += 2)
8293     {
8294       ptr[0] = '\\';
8295       ptr[1] = *value++;
8296     }
8297
8298   strcpy (ptr, argv[1]);
8299
8300   return result;
8301 }
8302
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
8311 static const char *
8312 if_exists_spec_function (int argc, const char **argv)
8313 {
8314   /* Must have only one argument.  */
8315   if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8316     return argv[0];
8317
8318   return NULL;
8319 }
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
8326 static const char *
8327 if_exists_else_spec_function (int argc, const char **argv)
8328 {
8329   /* Must have exactly two arguments.  */
8330   if (argc != 2)
8331     return NULL;
8332
8333   if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8334     return argv[0];
8335
8336   return argv[1];
8337 }
8338
8339 /* replace-outfile built-in spec function.
8340
8341    This looks for the first argument in the outfiles array's name and
8342    replaces it with the second argument.  */
8343
8344 static const char *
8345 replace_outfile_spec_function (int argc, const char **argv)
8346 {
8347   int i;
8348   /* Must have exactly two arguments.  */
8349   if (argc != 2)
8350     abort ();
8351
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
8360 /* Given two version numbers, compares the two numbers.
8361    A version number must match the regular expression
8362    ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8363 */
8364 static int
8365 compare_version_strings (const char *v1, const char *v2)
8366 {
8367   int rresult;
8368   regex_t r;
8369
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)
8375     fatal_error ("invalid version number %qs", v1);
8376   else if (rresult != 0)
8377     abort ();
8378   rresult = regexec (&r, v2, 0, NULL, 0);
8379   if (rresult == REG_NOMATCH)
8380     fatal_error ("invalid version number %qs", v2);
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:
8398
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
8413 static const char *
8414 version_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)
8423     fatal_error ("too few arguments to %%:version-compare");
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)
8429     fatal_error ("too many arguments to %%:version-compare");
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;
8468
8469     default:
8470       fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
8471     }
8472   if (! result)
8473     return NULL;
8474
8475   return argv[nargs + 2];
8476 }
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
8483 static const char *
8484 include_spec_function (int argc, const char **argv)
8485 {
8486   char *file;
8487
8488   if (argc != 1)
8489     abort ();
8490
8491   file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
8492   read_specs (file ? file : argv[0], FALSE);
8493
8494   return NULL;
8495 }
8496
8497 /* %:find-file spec function.  This function replaces its argument by
8498     the file found thru find_file, that is the -print-file-name gcc
8499     program option. */
8500 static const char *
8501 find_file_spec_function (int argc, const char **argv)
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
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. */
8516 static const char *
8517 find_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
8529 /* %:print-asm-header spec function.  Print a banner to say that the
8530    following output is from the assembler.  */
8531
8532 static const char *
8533 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8534                                 const char **argv ATTRIBUTE_UNUSED)
8535 {
8536   printf (_("Assembler options\n=================\n\n"));
8537   printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8538   fflush (stdout);
8539   return NULL;
8540 }
8541
8542 /* Compute a timestamp to initialize flag_random_seed.  */
8543
8544 static unsigned
8545 get_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
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
8573 static const char *
8574 compare_debug_dump_opt_spec_function (int arg,
8575                                       const char **argv ATTRIBUTE_UNUSED)
8576 {
8577   const char *ret;
8578   char *name;
8579   int which;
8580   static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
8581
8582   if (arg != 0)
8583     fatal_error ("too many arguments to %%:compare-debug-dump-opt");
8584
8585   do_spec_2 ("%{fdump-final-insns=*:%*}");
8586   do_spec_1 (" ", 0, NULL);
8587
8588   if (argbuf_index > 0 && strcmp (argv[argbuf_index - 1], "."))
8589     {
8590       if (!compare_debug)
8591         return NULL;
8592
8593       name = xstrdup (argv[argbuf_index - 1]);
8594       ret = NULL;
8595     }
8596   else
8597     {
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");
8609
8610       do_spec_1 (" ", 0, NULL);
8611
8612       gcc_assert (argbuf_index > 0);
8613
8614       name = concat (argbuf[argbuf_index - 1], ext, NULL);
8615
8616       ret = concat ("-fdump-final-insns=", name, NULL);
8617     }
8618
8619   which = compare_debug < 0;
8620   debug_check_temp_file[which] = name;
8621
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;
8635
8636   return ret;
8637 }
8638
8639 static 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
8645 static const char *
8646 compare_debug_self_opt_spec_function (int arg,
8647                                       const char **argv ATTRIBUTE_UNUSED)
8648 {
8649   if (arg != 0)
8650     fatal_error ("too many arguments to %%:compare-debug-self-opt");
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
8677 static const char *
8678 compare_debug_auxbase_opt_spec_function (int arg,
8679                                          const char **argv)
8680 {
8681   char *name;
8682   int len;
8683
8684   if (arg == 0)
8685     fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
8686
8687   if (arg != 1)
8688     fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
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)
8695     fatal_error ("argument to %%:compare-debug-auxbase-opt "
8696                  "does not end in .gk");
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
8709 #undef OPT
8710
8711   return name;
8712 }