OSDN Git Service

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