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