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