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