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