OSDN Git Service

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