OSDN Git Service

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