OSDN Git Service

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