OSDN Git Service

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