OSDN Git Service

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