OSDN Git Service

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