* gcc.c (cpp_options): Add specs for __STDC_HOSTED__.
[platform/upstream/gcc.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 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
21
22 This paragraph is here to try to keep Sun CC from dying.
23 The number of chars here seems crucial!!!!  */
24
25 /* This program is the user interface to the C compiler and possibly to
26 other compilers.  It is used because compilation is a complicated procedure
27 which involves running several programs and passing temporary files between
28 them, forwarding the users switches to those programs selectively,
29 and deleting the temporary files at the end.
30
31 CC recognizes how to compile each input file by suffixes in the file names.
32 Once it knows which kind of compilation to perform, the procedure for
33 compilation is specified by a string called a "spec".  */
34
35 #include "config.h"
36 #include "system.h"
37 #include <signal.h>
38 #include "obstack.h"
39 #include "intl.h"
40 #include "prefix.h"
41 #include "gcc.h"
42
43 #ifdef VMS
44 #define exit __posix_exit
45 #endif
46
47 #ifdef HAVE_SYS_RESOURCE_H
48 #include <sys/resource.h>
49 #endif
50 #if defined (HAVE_DECL_GETRUSAGE) && !HAVE_DECL_GETRUSAGE
51 extern int getrusage PARAMS ((int, struct rusage *));
52 #endif
53
54 /* By default there is no special suffix for executables.  */
55 #ifdef EXECUTABLE_SUFFIX
56 #define HAVE_EXECUTABLE_SUFFIX
57 #else
58 #define EXECUTABLE_SUFFIX ""
59 #endif
60
61 /* By default, the suffix for object files is ".o".  */
62 #ifdef OBJECT_SUFFIX
63 #define HAVE_OBJECT_SUFFIX
64 #else
65 #define OBJECT_SUFFIX ".o"
66 #endif
67
68 #ifndef VMS
69 /* FIXME: the location independence code for VMS is hairier than this,
70    and hasn't been written.  */
71 #ifndef DIR_UP
72 #define DIR_UP ".."
73 #endif /* DIR_UP */
74 #endif /* VMS */
75
76 static char dir_separator_str[] = { DIR_SEPARATOR, 0 };
77
78 #define obstack_chunk_alloc xmalloc
79 #define obstack_chunk_free free
80
81 #ifndef GET_ENV_PATH_LIST
82 #define GET_ENV_PATH_LIST(VAR,NAME)     do { (VAR) = getenv (NAME); } while (0)
83 #endif
84
85 /* Most every one is fine with LIBRARY_PATH.  For some, it conflicts.  */
86 #ifndef LIBRARY_PATH_ENV
87 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
88 #endif
89
90 #ifndef HAVE_KILL
91 #define kill(p,s) raise(s)
92 #endif
93
94 /* If a stage of compilation returns an exit status >= 1,
95    compilation of that file ceases.  */
96
97 #define MIN_FATAL_STATUS 1
98
99 /* Flag saying to pass the greatest exit code returned by a sub-process
100    to the calling program.  */
101 static int pass_exit_codes;
102
103 /* Flag saying to print the directories gcc will search through looking for
104    programs, libraries, etc.  */
105
106 static int print_search_dirs;
107
108 /* Flag saying to print the full filename of this file
109    as found through our usual search mechanism.  */
110
111 static const char *print_file_name = NULL;
112
113 /* As print_file_name, but search for executable file.  */
114
115 static const char *print_prog_name = NULL;
116
117 /* Flag saying to print the relative path we'd use to
118    find libgcc.a given the current compiler flags.  */
119
120 static int print_multi_directory;
121
122 /* Flag saying to print the list of subdirectories and
123    compiler flags used to select them in a standard form.  */
124
125 static int print_multi_lib;
126
127 /* Flag saying to print the command line options understood by gcc and its
128    sub-processes.  */
129
130 static int print_help_list;
131
132 /* Flag indicating whether we should print the command and arguments */
133
134 static int verbose_flag;
135
136 /* Flag indicating whether we should report subprocess execution times
137    (if this is supported by the system - see pexecute.c).  */
138
139 static int report_times;
140
141 /* Nonzero means write "temp" files in source directory
142    and use the source file's name in them, and don't delete them.  */
143
144 static int save_temps_flag;
145
146 /* The compiler version.  */
147
148 static const char *compiler_version;
149
150 /* The target version specified with -V */
151
152 static const char *spec_version = DEFAULT_TARGET_VERSION;
153
154 /* The target machine specified with -b.  */
155
156 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
157
158 /* Nonzero if cross-compiling.
159    When -b is used, the value comes from the `specs' file.  */
160
161 #ifdef CROSS_COMPILE
162 static const char *cross_compile = "1";
163 #else
164 static const char *cross_compile = "0";
165 #endif
166
167 /* The number of errors that have occurred; the link phase will not be
168    run if this is non-zero.  */
169 static int error_count = 0;
170
171 /* Greatest exit code of sub-processes that has been encountered up to
172    now.  */
173 static int greatest_status = 1;
174
175 /* This is the obstack which we use to allocate many strings.  */
176
177 static struct obstack obstack;
178
179 /* This is the obstack to build an environment variable to pass to
180    collect2 that describes all of the relevant switches of what to
181    pass the compiler in building the list of pointers to constructors
182    and destructors.  */
183
184 static struct obstack collect_obstack;
185
186 /* These structs are used to collect resource usage information for
187    subprocesses.  */
188 #ifdef HAVE_GETRUSAGE
189 static struct rusage rus, prus;
190 #endif
191
192 /* Forward declaration for prototypes.  */
193 struct path_prefix;
194
195 static void init_spec           PARAMS ((void));
196 #ifndef VMS
197 static char **split_directories PARAMS ((const char *, int *));
198 static void free_split_directories PARAMS ((char **));
199 static char *make_relative_prefix PARAMS ((const char *, const char *, const char *));
200 #endif /* VMS */
201 static void store_arg           PARAMS ((const char *, int, int));
202 static char *load_specs         PARAMS ((const char *));
203 static void read_specs          PARAMS ((const char *, int));
204 static void set_spec            PARAMS ((const char *, const char *));
205 static struct compiler *lookup_compiler PARAMS ((const char *, size_t, const char *));
206 static char *build_search_list  PARAMS ((struct path_prefix *, const char *, int));
207 static void putenv_from_prefixes PARAMS ((struct path_prefix *, const char *));
208 static int access_check         PARAMS ((const char *, int));
209 static char *find_a_file        PARAMS ((struct path_prefix *, const char *, int));
210 static void add_prefix          PARAMS ((struct path_prefix *, const char *,
211                                          const char *, int, int, int *));
212 static void translate_options   PARAMS ((int *, const char *const **));
213 static char *skip_whitespace    PARAMS ((char *));
214 static void record_temp_file    PARAMS ((const char *, int, int));
215 static void delete_if_ordinary  PARAMS ((const char *));
216 static void delete_temp_files   PARAMS ((void));
217 static void delete_failure_queue PARAMS ((void));
218 static void clear_failure_queue PARAMS ((void));
219 static int check_live_switch    PARAMS ((int, int));
220 static const char *handle_braces PARAMS ((const char *));
221 static char *save_string        PARAMS ((const char *, int));
222 static int do_spec_1            PARAMS ((const char *, int, const char *));
223 static const char *find_file    PARAMS ((const char *));
224 static int is_directory         PARAMS ((const char *, const char *, int));
225 static void validate_switches   PARAMS ((const char *));
226 static void validate_all_switches PARAMS ((void));
227 static void give_switch         PARAMS ((int, int, int));
228 static int used_arg             PARAMS ((const char *, int));
229 static int default_arg          PARAMS ((const char *, int));
230 static void set_multilib_dir    PARAMS ((void));
231 static void print_multilib_info PARAMS ((void));
232 static void pfatal_with_name    PARAMS ((const char *)) ATTRIBUTE_NORETURN;
233 static void perror_with_name    PARAMS ((const char *));
234 static void pfatal_pexecute     PARAMS ((const char *, const char *))
235   ATTRIBUTE_NORETURN;
236 static void error               PARAMS ((const char *, ...))
237   ATTRIBUTE_PRINTF_1;
238 static void notice              PARAMS ((const char *, ...))
239   ATTRIBUTE_PRINTF_1;
240 static void display_help        PARAMS ((void));
241 static void add_preprocessor_option     PARAMS ((const char *, int));
242 static void add_assembler_option        PARAMS ((const char *, int));
243 static void add_linker_option           PARAMS ((const char *, int));
244 static void process_command             PARAMS ((int, const char *const *));
245 static int execute                      PARAMS ((void));
246 static void clear_args                  PARAMS ((void));
247 static void fatal_error                 PARAMS ((int));
248 static void set_input                   PARAMS ((const char *));
249 \f
250 /* Specs are strings containing lines, each of which (if not blank)
251 is made up of a program name, and arguments separated by spaces.
252 The program name must be exact and start from root, since no path
253 is searched and it is unreliable to depend on the current working directory.
254 Redirection of input or output is not supported; the subprograms must
255 accept filenames saying what files to read and write.
256
257 In addition, the specs can contain %-sequences to substitute variable text
258 or for conditional text.  Here is a table of all defined %-sequences.
259 Note that spaces are not generated automatically around the results of
260 expanding these sequences; therefore, you can concatenate them together
261 or with constant text in a single argument.
262
263  %%     substitute one % into the program name or argument.
264  %i     substitute the name of the input file being processed.
265  %b     substitute the basename of the input file being processed.
266         This is the substring up to (and not including) the last period
267         and not including the directory.
268  %B     same as %b, but include the file suffix (text after the last period).
269  %gSUFFIX
270         substitute a file name that has suffix SUFFIX and is chosen
271         once per compilation, and mark the argument a la %d.  To reduce
272         exposure to denial-of-service attacks, the file name is now
273         chosen in a way that is hard to predict even when previously
274         chosen file names are known.  For example, `%g.s ... %g.o ... %g.s'
275         might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'.  SUFFIX matches
276         the regexp "[.A-Za-z]*%O"; "%O" is treated exactly as if it
277         had been pre-processed.  Previously, %g was simply substituted
278         with a file name chosen once per compilation, without regard
279         to any appended suffix (which was therefore treated just like
280         ordinary text), making such attacks more likely to succeed.
281  %uSUFFIX
282         like %g, but generates a new temporary file name even if %uSUFFIX
283         was already seen.
284  %USUFFIX
285         substitutes the last file name generated with %uSUFFIX, generating a
286         new one if there is no such last file name.  In the absence of any
287         %uSUFFIX, this is just like %gSUFFIX, except they don't share
288         the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
289         would involve the generation of two distinct file names, one
290         for each `%g.s' and another for each `%U.s'.  Previously, %U was
291         simply substituted with a file name chosen for the previous %u,
292         without regard to any appended suffix.
293  %jSUFFIX
294         substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
295         writable, and if save-temps is off; otherwise, substitute the name
296         of a temporary file, just like %u.  This temporary file is not
297         meant for communication between processes, but rather as a junk
298         disposal mechanism.
299  %d     marks the argument containing or following the %d as a
300         temporary file name, so that that file will be deleted if CC exits
301         successfully.  Unlike %g, this contributes no text to the argument.
302  %w     marks the argument containing or following the %w as the
303         "output file" of this compilation.  This puts the argument
304         into the sequence of arguments that %o will substitute later.
305  %W{...}
306         like %{...} but mark last argument supplied within
307         as a file to be deleted on failure.
308  %o     substitutes the names of all the output files, with spaces
309         automatically placed around them.  You should write spaces
310         around the %o as well or the results are undefined.
311         %o is for use in the specs for running the linker.
312         Input files whose names have no recognized suffix are not compiled
313         at all, but they are included among the output files, so they will
314         be linked.
315  %O     substitutes the suffix for object files.  Note that this is
316         handled specially when it immediately follows %g, %u, or %U
317         (with or without a suffix argument) because of the need for
318         those to form complete file names.  The handling is such that
319         %O is treated exactly as if it had already been substituted,
320         except that %g, %u, and %U do not currently support additional
321         SUFFIX characters following %O as they would following, for
322         example, `.o'.
323  %p     substitutes the standard macro predefinitions for the
324         current target machine.  Use this when running cpp.
325  %P     like %p, but puts `__' before and after the name of each macro.
326         (Except macros that already have __.)
327         This is for ANSI C.
328  %I     Substitute a -iprefix option made from GCC_EXEC_PREFIX.
329  %s     current argument is the name of a library or startup file of some sort.
330         Search for that file in a standard list of directories
331         and substitute the full name found.
332  %eSTR  Print STR as an error message.  STR is terminated by a newline.
333         Use this when inconsistent options are detected.
334  %x{OPTION}     Accumulate an option for %X.
335  %X     Output the accumulated linker options specified by compilations.
336  %Y     Output the accumulated assembler options specified by compilations.
337  %Z     Output the accumulated preprocessor options specified by compilations.
338  %v1    Substitute the major version number of GCC.
339         (For version 2.5.3, this is 2.)
340  %v2    Substitute the minor version number of GCC.
341         (For version 2.5.3, this is 5.)
342  %v3    Substitute the patch level number of GCC.
343         (For version 2.5.3, this is 3.)
344  %a     process ASM_SPEC as a spec.
345         This allows config.h to specify part of the spec for running as.
346  %A     process ASM_FINAL_SPEC as a spec.  A capital A is actually
347         used here.  This can be used to run a post-processor after the
348         assembler has done its job.
349  %D     Dump out a -L option for each directory in startfile_prefixes.
350         If multilib_dir is set, extra entries are generated with it affixed.
351  %l     process LINK_SPEC as a spec.
352  %L     process LIB_SPEC as a spec.
353  %G     process LIBGCC_SPEC as a spec.
354  %S     process STARTFILE_SPEC as a spec.  A capital S is actually used here.
355  %E     process ENDFILE_SPEC as a spec.  A capital E is actually used here.
356  %c     process SIGNED_CHAR_SPEC as a spec.
357  %C     process CPP_SPEC as a spec.  A capital C is actually used here.
358  %1     process CC1_SPEC as a spec.
359  %2     process CC1PLUS_SPEC as a spec.
360  %|     output "-" if the input for the current command is coming from a pipe.
361  %*     substitute the variable part of a matched option.  (See below.)
362         Note that each comma in the substituted string is replaced by
363         a single space.
364  %{S}   substitutes the -S switch, if that switch was given to CC.
365         If that switch was not specified, this substitutes nothing.
366         Here S is a metasyntactic variable.
367  %{S*}  substitutes all the switches specified to CC whose names start
368         with -S.  This is used for -o, -D, -I, etc; switches that take
369         arguments.  CC considers `-o foo' as being one switch whose
370         name starts with `o'.  %{o*} would substitute this text,
371         including the space; thus, two arguments would be generated.
372  %{^S*} likewise, but don't put a blank between a switch and any args.
373  %{S*:X} substitutes X if one or more switches whose names start with -S are
374         specified to CC.  Note that the tail part of the -S option
375         (i.e. the part matched by the `*') will be substituted for each
376         occurrence of %* within X.
377  %{<S}  remove all occurences of -S from the command line.
378         Note - this option is position dependent.  % commands in the
379         spec string before this option will see -S, % commands in the
380         spec string after this option will not.
381  %{S:X} substitutes X, but only if the -S switch was given to CC.
382  %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
383  %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
384  %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
385  %{.S:X} substitutes X, but only if processing a file with suffix S.
386  %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
387  %{S|P:X} substitutes X if either -S or -P was given to CC.  This may be
388           combined with ! and . as above binding stronger than the OR.
389  %(Spec) processes a specification defined in a specs file as *Spec:
390  %[Spec] as above, but put __ around -D arguments
391
392 The conditional text X in a %{S:X} or %{!S:X} construct may contain
393 other nested % constructs or spaces, or even newlines.  They are
394 processed as usual, as described above.
395
396 The -O, -f, -m, and -W switches are handled specifically in these
397 constructs.  If another value of -O or the negated form of a -f, -m, or
398 -W switch is found later in the command line, the earlier switch
399 value is ignored, except with {S*} where S is just one letter; this
400 passes all matching options.
401
402 The character | at the beginning of the predicate text is used to indicate
403 that a command should be piped to the following command, but only if -pipe
404 is specified.
405
406 Note that it is built into CC which switches take arguments and which
407 do not.  You might think it would be useful to generalize this to
408 allow each compiler's spec to say which switches take arguments.  But
409 this cannot be done in a consistent fashion.  CC cannot even decide
410 which input files have been specified without knowing which switches
411 take arguments, and it must know which input files to compile in order
412 to tell which compilers to run.
413
414 CC also knows implicitly that arguments starting in `-l' are to be
415 treated as compiler output files, and passed to the linker in their
416 proper position among the other output files.  */
417 \f
418 /* Define the macros used for specs %a, %l, %L, %S, %c, %C, %1.  */
419
420 /* config.h can define ASM_SPEC to provide extra args to the assembler
421    or extra switch-translations.  */
422 #ifndef ASM_SPEC
423 #define ASM_SPEC ""
424 #endif
425
426 /* config.h can define ASM_FINAL_SPEC to run a post processor after
427    the assembler has run.  */
428 #ifndef ASM_FINAL_SPEC
429 #define ASM_FINAL_SPEC ""
430 #endif
431
432 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
433    or extra switch-translations.  */
434 #ifndef CPP_SPEC
435 #define CPP_SPEC ""
436 #endif
437
438 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
439    or extra switch-translations.  */
440 #ifndef CC1_SPEC
441 #define CC1_SPEC ""
442 #endif
443
444 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
445    or extra switch-translations.  */
446 #ifndef CC1PLUS_SPEC
447 #define CC1PLUS_SPEC ""
448 #endif
449
450 /* config.h can define LINK_SPEC to provide extra args to the linker
451    or extra switch-translations.  */
452 #ifndef LINK_SPEC
453 #define LINK_SPEC ""
454 #endif
455
456 /* config.h can define LIB_SPEC to override the default libraries.  */
457 #ifndef LIB_SPEC
458 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
459 #endif
460
461 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
462    included.  */
463 #ifndef LIBGCC_SPEC
464 #if defined(LINK_LIBGCC_SPECIAL) || defined(LINK_LIBGCC_SPECIAL_1)
465 /* Have gcc do the search for libgcc.a.  */
466 #define LIBGCC_SPEC "libgcc.a%s"
467 #else
468 #define LIBGCC_SPEC "-lgcc"
469 #endif
470 #endif
471
472 /* config.h can define STARTFILE_SPEC to override the default crt0 files.  */
473 #ifndef STARTFILE_SPEC
474 #define STARTFILE_SPEC  \
475   "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
476 #endif
477
478 /* config.h can define SWITCHES_NEED_SPACES to control which options
479    require spaces between the option and the argument.  */
480 #ifndef SWITCHES_NEED_SPACES
481 #define SWITCHES_NEED_SPACES ""
482 #endif
483
484 /* config.h can define ENDFILE_SPEC to override the default crtn files.  */
485 #ifndef ENDFILE_SPEC
486 #define ENDFILE_SPEC ""
487 #endif
488
489 /* This spec is used for telling cpp whether char is signed or not.  */
490 #ifndef SIGNED_CHAR_SPEC
491 /* Use #if rather than ?:
492    because MIPS C compiler rejects like ?: in initializers.  */
493 #if DEFAULT_SIGNED_CHAR
494 #define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
495 #else
496 #define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
497 #endif
498 #endif
499
500 #ifndef LINKER_NAME
501 #define LINKER_NAME "collect2"
502 #endif
503
504 /* Here is the spec for running the linker, after compiling all files.  */
505
506 /* -u* was put back because both BSD and SysV seem to support it.  */
507 /* %{static:} simply prevents an error message if the target machine
508    doesn't handle -static.  */
509 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
510    scripts which exist in user specified directories, or in standard
511    directories.  */
512 #ifndef LINK_COMMAND_SPEC
513 #define LINK_COMMAND_SPEC "\
514 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
515     %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t}\
516     %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
517     %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
518     %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
519 #endif
520
521 #ifndef LINK_LIBGCC_SPEC
522 # ifdef LINK_LIBGCC_SPECIAL
523 /* Don't generate -L options for startfile prefix list.  */
524 #  define LINK_LIBGCC_SPEC ""
525 # else
526 /* Do generate them.  */
527 #  define LINK_LIBGCC_SPEC "%D"
528 # endif
529 #endif
530
531 static const char *cpp_spec = CPP_SPEC;
532 static const char *cpp_predefines = CPP_PREDEFINES;
533 static const char *cc1_spec = CC1_SPEC;
534 static const char *cc1plus_spec = CC1PLUS_SPEC;
535 static const char *signed_char_spec = SIGNED_CHAR_SPEC;
536 static const char *asm_spec = ASM_SPEC;
537 static const char *asm_final_spec = ASM_FINAL_SPEC;
538 static const char *link_spec = LINK_SPEC;
539 static const char *lib_spec = LIB_SPEC;
540 static const char *libgcc_spec = LIBGCC_SPEC;
541 static const char *endfile_spec = ENDFILE_SPEC;
542 static const char *startfile_spec = STARTFILE_SPEC;
543 static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
544 static const char *linker_name_spec = LINKER_NAME;
545 static const char *link_command_spec = LINK_COMMAND_SPEC;
546 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
547
548 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
549    There should be no need to override these in target dependent files,
550    but we need to copy them to the specs file so that newer versions
551    of the GCC driver can correctly drive older tool chains with the
552    appropriate -B options.  */
553
554 static const char *trad_capable_cpp =
555 "%{traditional|ftraditional|traditional-cpp:trad}cpp0";
556
557 static const char *cpp_options =
558 "%{C:%{!E:%eGNU C does not support -C without using -E}}\
559  %{std*} %{nostdinc*}\
560  %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
561  %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
562  %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
563  %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
564  %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
565  %{ffast-math:-D__FAST_MATH__}\
566  %{fshort-wchar:-U__WCHAR_TYPE__ -D__WCHAR_TYPE__=short\\ unsigned\\ int}\
567  %{ffreestanding:-D__STDC_HOSTED__=0} %{fno-hosted:-D__STDC_HOSTED__=0}\
568  %{!ffreestanding:%{!fno-hosted:-D__STDC_HOSTED__=1}}\
569  %{fshow-column} %{fno-show-column}\
570  %{fleading-underscore} %{fno-leading-underscore}\
571  %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{U*} %{D*} %{i*} %Z %i\
572  %{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}}";
573
574 static const char *cc1_options =
575 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
576  %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*}\
577  %{g*} %{O*} %{W*} %{w} %{pedantic*} %{std*} %{ansi}\
578  %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
579  %{aux-info*} %{Qn:-fno-ident} %{--help:--help}\
580  %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
581  %{fsyntax-only:-o %j}";
582
583 static const char *asm_options =
584 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
585
586 /* Some compilers have limits on line lengths, and the multilib_select
587    and/or multilib_matches strings can be very long, so we build them at
588    run time.  */
589 static struct obstack multilib_obstack;
590 static const char *multilib_select;
591 static const char *multilib_matches;
592 static const char *multilib_defaults;
593 static const char *multilib_exclusions;
594 #include "multilib.h"
595
596 /* Check whether a particular argument is a default argument.  */
597
598 #ifndef MULTILIB_DEFAULTS
599 #define MULTILIB_DEFAULTS { "" }
600 #endif
601
602 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
603
604 struct user_specs
605 {
606   struct user_specs *next;
607   const char *filename;
608 };
609
610 static struct user_specs *user_specs_head, *user_specs_tail;
611
612 /* This defines which switch letters take arguments.  */
613
614 #define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
615   ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
616    || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
617    || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x' \
618    || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V' \
619    || (CHAR) == 'B' || (CHAR) == 'b')
620
621 #ifndef SWITCH_TAKES_ARG
622 #define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
623 #endif
624
625 /* This defines which multi-letter switches take arguments.  */
626
627 #define DEFAULT_WORD_SWITCH_TAKES_ARG(STR)              \
628  (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext")      \
629   || !strcmp (STR, "Tbss") || !strcmp (STR, "include")  \
630   || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
631   || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
632   || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
633   || !strcmp (STR, "isystem") || !strcmp (STR, "specs"))
634
635 #ifndef WORD_SWITCH_TAKES_ARG
636 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
637 #endif
638 \f
639 #ifdef HAVE_EXECUTABLE_SUFFIX
640 /* This defines which switches stop a full compilation.  */
641 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
642   ((CHAR) == 'c' || (CHAR) == 'S')
643
644 #ifndef SWITCH_CURTAILS_COMPILATION
645 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
646   DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
647 #endif
648 #endif
649
650 /* Record the mapping from file suffixes for compilation specs.  */
651
652 struct compiler
653 {
654   const char *suffix;           /* Use this compiler for input files
655                                    whose names end in this suffix.  */
656
657   const char *spec;             /* To use this compiler, run this spec.  */
658 };
659
660 /* Pointer to a vector of `struct compiler' that gives the spec for
661    compiling a file, based on its suffix.
662    A file that does not end in any of these suffixes will be passed
663    unchanged to the loader and nothing else will be done to it.
664
665    An entry containing two 0s is used to terminate the vector.
666
667    If multiple entries match a file, the last matching one is used.  */
668
669 static struct compiler *compilers;
670
671 /* Number of entries in `compilers', not counting the null terminator.  */
672
673 static int n_compilers;
674
675 /* The default list of file name suffixes and their compilation specs.  */
676
677 static struct compiler default_compilers[] =
678 {
679   /* Add lists of suffixes of known languages here.  If those languages
680      were not present when we built the driver, we will hit these copies
681      and be given a more meaningful error than "file not used since
682      linking is not done".  */
683   {".m",  "#Objective-C"},
684   {".cc", "#C++"}, {".cxx", "#C++"}, {".cpp", "#C++"},
685   {".c++", "#C++"}, {".C", "#C++"},
686   {".ads", "#Ada"}, {".adb", "#Ada"}, {".ada", "#Ada"},
687   {".f", "#Fortran"}, {".for", "#Fortran"}, {".F", "#Fortran"},
688   {".fpp", "#Fortran"}, {".r", "#Ratfor"},
689   {".p", "#Pascal"}, {".pas", "#Pascal"},
690   {".ch", "#Chill"}, {".chi", "#Chill"},
691   {".java", "#Java"}, {".class", "#Java"},
692   {".zip", "#Java"}, {".jar", "#Java"},
693   /* Next come the entries for C.  */
694   {".c", "@c"},
695   {"@c",
696 #if USE_CPPLIB
697      "%{E|M|MM:%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)}\
698       %{!E:%{!M:%{!MM:cc1 -lang-c %{ansi:-std=c89} %(cpp_options)\
699                           %(cc1_options) %{!fsyntax-only:%{!S:-o %{|!pipe:%g.s} |\n\
700       as %(asm_options) %{!pipe:%g.s} %A }}}}}"
701 #else /* ! USE_CPPLIB */
702      "%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options) \
703                           %{!M:%{!MM:%{!E:%{!pipe:%g.i} |\n\
704       cc1 %{!pipe:%g.i} %(cc1_options) %{!fsyntax-only:%{!S:-o %{|!pipe:%g.s} |\n\
705       as %(asm_options) %{!pipe:%g.s} %A }}}}}\n"
706 #endif /* ! USE_CPPLIB */
707   },
708   {"-",
709    "%{!E:%e-E required when input is from standard input}\
710     %(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)"},
711   {".h", "@c-header"},
712   {"@c-header",
713    "%{!E:%eCompilation of header file requested} \
714     %(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)"},
715   {".i", "@cpp-output"},
716   {"@cpp-output",
717    "%{!M:%{!MM:%{!E:\
718     cc1 %i %(cc1_options) %{!fsyntax-only:%{!S:-o %{|!pipe:%g.s} |\n\
719     as %(asm_options) %{!pipe:%g.s} %A }}}}}"},
720   {".s", "@assembler"},
721   {"@assembler",
722    "%{!M:%{!MM:%{!E:%{!S:as %(asm_options) %i %A }}}}"},
723   {".S", "@assembler-with-cpp"},
724   {"@assembler-with-cpp",
725    "%(trad_capable_cpp) -lang-asm %(cpp_options) \
726                         %{!M:%{!MM:%{!E:%{!S: %{!pipe:%g.s} |\n\
727     as %(asm_options) %{!pipe:%g.s} %A }}}}"},
728 #include "specs.h"
729   /* Mark end of table */
730   {0, 0}
731 };
732
733 /* Number of elements in default_compilers, not counting the terminator.  */
734
735 static int n_default_compilers
736   = (sizeof default_compilers / sizeof (struct compiler)) - 1;
737
738 /* A vector of options to give to the linker.
739    These options are accumulated by %x,
740    and substituted into the linker command with %X.  */
741 static int n_linker_options;
742 static char **linker_options;
743
744 /* A vector of options to give to the assembler.
745    These options are accumulated by -Wa,
746    and substituted into the assembler command with %Y.  */
747 static int n_assembler_options;
748 static char **assembler_options;
749
750 /* A vector of options to give to the preprocessor.
751    These options are accumulated by -Wp,
752    and substituted into the preprocessor command with %Z.  */
753 static int n_preprocessor_options;
754 static char **preprocessor_options;
755 \f
756 /* Define how to map long options into short ones.  */
757
758 /* This structure describes one mapping.  */
759 struct option_map
760 {
761   /* The long option's name.  */
762   const char *name;
763   /* The equivalent short option.  */
764   const char *equivalent;
765   /* Argument info.  A string of flag chars; NULL equals no options.
766      a => argument required.
767      o => argument optional.
768      j => join argument to equivalent, making one word.
769      * => require other text after NAME as an argument.  */
770   const char *arg_info;
771 };
772
773 /* This is the table of mappings.  Mappings are tried sequentially
774    for each option encountered; the first one that matches, wins.  */
775
776 struct option_map option_map[] =
777  {
778    {"--all-warnings", "-Wall", 0},
779    {"--ansi", "-ansi", 0},
780    {"--assemble", "-S", 0},
781    {"--assert", "-A", "a"},
782    {"--classpath", "-fclasspath=", "aj"},
783    {"--CLASSPATH", "-fCLASSPATH=", "aj"},
784    {"--comments", "-C", 0},
785    {"--compile", "-c", 0},
786    {"--debug", "-g", "oj"},
787    {"--define-macro", "-D", "aj"},
788    {"--dependencies", "-M", 0},
789    {"--dump", "-d", "a"},
790    {"--dumpbase", "-dumpbase", "a"},
791    {"--entry", "-e", 0},
792    {"--extra-warnings", "-W", 0},
793    {"--for-assembler", "-Wa", "a"},
794    {"--for-linker", "-Xlinker", "a"},
795    {"--force-link", "-u", "a"},
796    {"--imacros", "-imacros", "a"},
797    {"--include", "-include", "a"},
798    {"--include-barrier", "-I-", 0},
799    {"--include-directory", "-I", "aj"},
800    {"--include-directory-after", "-idirafter", "a"},
801    {"--include-prefix", "-iprefix", "a"},
802    {"--include-with-prefix", "-iwithprefix", "a"},
803    {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
804    {"--include-with-prefix-after", "-iwithprefix", "a"},
805    {"--language", "-x", "a"},
806    {"--library-directory", "-L", "a"},
807    {"--machine", "-m", "aj"},
808    {"--machine-", "-m", "*j"},
809    {"--no-line-commands", "-P", 0},
810    {"--no-precompiled-includes", "-noprecomp", 0},
811    {"--no-standard-includes", "-nostdinc", 0},
812    {"--no-standard-libraries", "-nostdlib", 0},
813    {"--no-warnings", "-w", 0},
814    {"--optimize", "-O", "oj"},
815    {"--output", "-o", "a"},
816    {"--output-class-directory", "-foutput-class-dir=", "ja"},
817    {"--pedantic", "-pedantic", 0},
818    {"--pedantic-errors", "-pedantic-errors", 0},
819    {"--pipe", "-pipe", 0},
820    {"--prefix", "-B", "a"},
821    {"--preprocess", "-E", 0},
822    {"--print-search-dirs", "-print-search-dirs", 0},
823    {"--print-file-name", "-print-file-name=", "aj"},
824    {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
825    {"--print-missing-file-dependencies", "-MG", 0},
826    {"--print-multi-lib", "-print-multi-lib", 0},
827    {"--print-multi-directory", "-print-multi-directory", 0},
828    {"--print-prog-name", "-print-prog-name=", "aj"},
829    {"--profile", "-p", 0},
830    {"--profile-blocks", "-a", 0},
831    {"--quiet", "-q", 0},
832    {"--save-temps", "-save-temps", 0},
833    {"--shared", "-shared", 0},
834    {"--silent", "-q", 0},
835    {"--specs", "-specs=", "aj"},
836    {"--static", "-static", 0},
837    {"--std", "-std=", "aj"},
838    {"--symbolic", "-symbolic", 0},
839    {"--target", "-b", "a"},
840    {"--time", "-time", 0},
841    {"--trace-includes", "-H", 0},
842    {"--traditional", "-traditional", 0},
843    {"--traditional-cpp", "-traditional-cpp", 0},
844    {"--trigraphs", "-trigraphs", 0},
845    {"--undefine-macro", "-U", "aj"},
846    {"--use-version", "-V", "a"},
847    {"--user-dependencies", "-MM", 0},
848    {"--verbose", "-v", 0},
849    {"--version", "-dumpversion", 0},
850    {"--warn-", "-W", "*j"},
851    {"--write-dependencies", "-MD", 0},
852    {"--write-user-dependencies", "-MMD", 0},
853    {"--", "-f", "*j"}
854  };
855 \f
856 /* Translate the options described by *ARGCP and *ARGVP.
857    Make a new vector and store it back in *ARGVP,
858    and store its length in *ARGVC.  */
859
860 static void
861 translate_options (argcp, argvp)
862      int *argcp;
863      const char *const **argvp;
864 {
865   int i;
866   int argc = *argcp;
867   const char *const *argv = *argvp;
868   const char **newv =
869     (const char **) xmalloc ((argc + 2) * 2 * sizeof (const char *));
870   int newindex = 0;
871
872   i = 0;
873   newv[newindex++] = argv[i++];
874
875   while (i < argc)
876     {
877       /* Translate -- options.  */
878       if (argv[i][0] == '-' && argv[i][1] == '-')
879         {
880           size_t j;
881           /* Find a mapping that applies to this option.  */
882           for (j = 0; j < ARRAY_SIZE (option_map); j++)
883             {
884               size_t optlen = strlen (option_map[j].name);
885               size_t arglen = strlen (argv[i]);
886               size_t complen = arglen > optlen ? optlen : arglen;
887               const char *arginfo = option_map[j].arg_info;
888
889               if (arginfo == 0)
890                 arginfo = "";
891
892               if (!strncmp (argv[i], option_map[j].name, complen))
893                 {
894                   const char *arg = 0;
895
896                   if (arglen < optlen)
897                     {
898                       size_t k;
899                       for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
900                         if (strlen (option_map[k].name) >= arglen
901                             && !strncmp (argv[i], option_map[k].name, arglen))
902                           {
903                             error ("Ambiguous abbreviation %s", argv[i]);
904                             break;
905                           }
906
907                       if (k != ARRAY_SIZE (option_map))
908                         break;
909                     }
910
911                   if (arglen > optlen)
912                     {
913                       /* If the option has an argument, accept that.  */
914                       if (argv[i][optlen] == '=')
915                         arg = argv[i] + optlen + 1;
916
917                       /* If this mapping requires extra text at end of name,
918                          accept that as "argument".  */
919                       else if (index (arginfo, '*') != 0)
920                         arg = argv[i] + optlen;
921
922                       /* Otherwise, extra text at end means mismatch.
923                          Try other mappings.  */
924                       else
925                         continue;
926                     }
927
928                   else if (index (arginfo, '*') != 0)
929                     {
930                       error ("Incomplete `%s' option", option_map[j].name);
931                       break;
932                     }
933
934                   /* Handle arguments.  */
935                   if (index (arginfo, 'a') != 0)
936                     {
937                       if (arg == 0)
938                         {
939                           if (i + 1 == argc)
940                             {
941                               error ("Missing argument to `%s' option",
942                                      option_map[j].name);
943                               break;
944                             }
945
946                           arg = argv[++i];
947                         }
948                     }
949                   else if (index (arginfo, '*') != 0)
950                     ;
951                   else if (index (arginfo, 'o') == 0)
952                     {
953                       if (arg != 0)
954                         error ("Extraneous argument to `%s' option",
955                                option_map[j].name);
956                       arg = 0;
957                     }
958
959                   /* Store the translation as one argv elt or as two.  */
960                   if (arg != 0 && index (arginfo, 'j') != 0)
961                     newv[newindex++] = concat (option_map[j].equivalent, arg,
962                                                NULL_PTR);
963                   else if (arg != 0)
964                     {
965                       newv[newindex++] = option_map[j].equivalent;
966                       newv[newindex++] = arg;
967                     }
968                   else
969                     newv[newindex++] = option_map[j].equivalent;
970
971                   break;
972                 }
973             }
974           i++;
975         }
976
977       /* Handle old-fashioned options--just copy them through,
978          with their arguments.  */
979       else if (argv[i][0] == '-')
980         {
981           const char *p = argv[i] + 1;
982           int c = *p;
983           int nskip = 1;
984
985           if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
986             nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
987           else if (WORD_SWITCH_TAKES_ARG (p))
988             nskip += WORD_SWITCH_TAKES_ARG (p);
989           else if ((c == 'B' || c == 'b' || c == 'V' || c == 'x')
990                    && p[1] == 0)
991             nskip += 1;
992           else if (! strcmp (p, "Xlinker"))
993             nskip += 1;
994
995           /* Watch out for an option at the end of the command line that
996              is missing arguments, and avoid skipping past the end of the
997              command line.  */
998           if (nskip + i > argc)
999             nskip = argc - i;
1000
1001           while (nskip > 0)
1002             {
1003               newv[newindex++] = argv[i++];
1004               nskip--;
1005             }
1006         }
1007       else
1008         /* Ordinary operands, or +e options.  */
1009         newv[newindex++] = argv[i++];
1010     }
1011
1012   newv[newindex] = 0;
1013
1014   *argvp = newv;
1015   *argcp = newindex;
1016 }
1017 \f
1018 static char *
1019 skip_whitespace (p)
1020      char *p;
1021 {
1022   while (1)
1023     {
1024       /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1025          be considered whitespace.  */
1026       if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1027         return p + 1;
1028       else if (*p == '\n' || *p == ' ' || *p == '\t')
1029         p++;
1030       else if (*p == '#')
1031         {
1032           while (*p != '\n')
1033             p++;
1034           p++;
1035         }
1036       else
1037         break;
1038     }
1039
1040   return p;
1041 }
1042 \f
1043 /* Structure to keep track of the specs that have been defined so far.
1044    These are accessed using %(specname) or %[specname] in a compiler
1045    or link spec.  */
1046
1047 struct spec_list
1048 {
1049                                 /* The following 2 fields must be first */
1050                                 /* to allow EXTRA_SPECS to be initialized */
1051   const char *name;             /* name of the spec.  */
1052   const char *ptr;              /* available ptr if no static pointer */
1053
1054                                 /* The following fields are not initialized */
1055                                 /* by EXTRA_SPECS */
1056   const char **ptr_spec;        /* pointer to the spec itself.  */
1057   struct spec_list *next;       /* Next spec in linked list.  */
1058   int name_len;                 /* length of the name */
1059   int alloc_p;                  /* whether string was allocated */
1060 };
1061
1062 #define INIT_STATIC_SPEC(NAME,PTR) \
1063 { NAME, NULL_PTR, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1064
1065 /* List of statically defined specs.  */
1066 static struct spec_list static_specs[] =
1067 {
1068   INIT_STATIC_SPEC ("asm",                      &asm_spec),
1069   INIT_STATIC_SPEC ("asm_final",                &asm_final_spec),
1070   INIT_STATIC_SPEC ("asm_options",              &asm_options),
1071   INIT_STATIC_SPEC ("cpp",                      &cpp_spec),
1072   INIT_STATIC_SPEC ("cpp_options",              &cpp_options),
1073   INIT_STATIC_SPEC ("trad_capable_cpp",         &trad_capable_cpp),
1074   INIT_STATIC_SPEC ("cc1",                      &cc1_spec),
1075   INIT_STATIC_SPEC ("cc1_options",              &cc1_options),
1076   INIT_STATIC_SPEC ("cc1plus",                  &cc1plus_spec),
1077   INIT_STATIC_SPEC ("endfile",                  &endfile_spec),
1078   INIT_STATIC_SPEC ("link",                     &link_spec),
1079   INIT_STATIC_SPEC ("lib",                      &lib_spec),
1080   INIT_STATIC_SPEC ("libgcc",                   &libgcc_spec),
1081   INIT_STATIC_SPEC ("startfile",                &startfile_spec),
1082   INIT_STATIC_SPEC ("switches_need_spaces",     &switches_need_spaces),
1083   INIT_STATIC_SPEC ("signed_char",              &signed_char_spec),
1084   INIT_STATIC_SPEC ("predefines",               &cpp_predefines),
1085   INIT_STATIC_SPEC ("cross_compile",            &cross_compile),
1086   INIT_STATIC_SPEC ("version",                  &compiler_version),
1087   INIT_STATIC_SPEC ("multilib",                 &multilib_select),
1088   INIT_STATIC_SPEC ("multilib_defaults",        &multilib_defaults),
1089   INIT_STATIC_SPEC ("multilib_extra",           &multilib_extra),
1090   INIT_STATIC_SPEC ("multilib_matches",         &multilib_matches),
1091   INIT_STATIC_SPEC ("multilib_exclusions",      &multilib_exclusions),
1092   INIT_STATIC_SPEC ("linker",                   &linker_name_spec),
1093   INIT_STATIC_SPEC ("link_libgcc",              &link_libgcc_spec),
1094 };
1095
1096 #ifdef EXTRA_SPECS              /* additional specs needed */
1097 /* Structure to keep track of just the first two args of a spec_list.
1098    That is all that the EXTRA_SPECS macro gives us.  */
1099 struct spec_list_1
1100 {
1101   const char *name;
1102   const char *ptr;
1103 };
1104
1105 static struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1106 static struct spec_list *extra_specs = (struct spec_list *) 0;
1107 #endif
1108
1109 /* List of dynamically allocates specs that have been defined so far.  */
1110
1111 static struct spec_list *specs = (struct spec_list *) 0;
1112 \f
1113 /* Initialize the specs lookup routines.  */
1114
1115 static void
1116 init_spec ()
1117 {
1118   struct spec_list *next = (struct spec_list *) 0;
1119   struct spec_list *sl   = (struct spec_list *) 0;
1120   int i;
1121
1122   if (specs)
1123     return;                     /* Already initialized.  */
1124
1125   if (verbose_flag)
1126     notice ("Using builtin specs.\n");
1127
1128 #ifdef EXTRA_SPECS
1129   extra_specs = (struct spec_list *)
1130     xcalloc (sizeof (struct spec_list), ARRAY_SIZE (extra_specs_1));
1131
1132   for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1133     {
1134       sl = &extra_specs[i];
1135       sl->name = extra_specs_1[i].name;
1136       sl->ptr = extra_specs_1[i].ptr;
1137       sl->next = next;
1138       sl->name_len = strlen (sl->name);
1139       sl->ptr_spec = &sl->ptr;
1140       next = sl;
1141     }
1142 #endif
1143
1144   for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1145     {
1146       sl = &static_specs[i];
1147       sl->next = next;
1148       next = sl;
1149     }
1150
1151   specs = sl;
1152 }
1153 \f
1154 /* Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
1155    removed; If the spec starts with a + then SPEC is added to the end of the
1156    current spec.  */
1157
1158 static void
1159 set_spec (name, spec)
1160      const char *name;
1161      const char *spec;
1162 {
1163   struct spec_list *sl;
1164   const char *old_spec;
1165   int name_len = strlen (name);
1166   int i;
1167
1168   /* If this is the first call, initialize the statically allocated specs.  */
1169   if (!specs)
1170     {
1171       struct spec_list *next = (struct spec_list *) 0;
1172       for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1173         {
1174           sl = &static_specs[i];
1175           sl->next = next;
1176           next = sl;
1177         }
1178       specs = sl;
1179     }
1180
1181   /* See if the spec already exists.  */
1182   for (sl = specs; sl; sl = sl->next)
1183     if (name_len == sl->name_len && !strcmp (sl->name, name))
1184       break;
1185
1186   if (!sl)
1187     {
1188       /* Not found - make it.  */
1189       sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
1190       sl->name = xstrdup (name);
1191       sl->name_len = name_len;
1192       sl->ptr_spec = &sl->ptr;
1193       sl->alloc_p = 0;
1194       *(sl->ptr_spec) = "";
1195       sl->next = specs;
1196       specs = sl;
1197     }
1198
1199   old_spec = *(sl->ptr_spec);
1200   *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1201                      ? concat (old_spec, spec + 1, NULL_PTR)
1202                      : xstrdup (spec));
1203
1204 #ifdef DEBUG_SPECS
1205   if (verbose_flag)
1206     notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1207 #endif
1208
1209   /* Free the old spec.  */
1210   if (old_spec && sl->alloc_p)
1211     free ((PTR) old_spec);
1212
1213   sl->alloc_p = 1;
1214 }
1215 \f
1216 /* Accumulate a command (program name and args), and run it.  */
1217
1218 /* Vector of pointers to arguments in the current line of specifications.  */
1219
1220 static const char **argbuf;
1221
1222 /* Number of elements allocated in argbuf.  */
1223
1224 static int argbuf_length;
1225
1226 /* Number of elements in argbuf currently in use (containing args).  */
1227
1228 static int argbuf_index;
1229
1230 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1231    temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
1232    it here.  */
1233
1234 static struct temp_name {
1235   const char *suffix;   /* suffix associated with the code.  */
1236   int length;           /* strlen (suffix).  */
1237   int unique;           /* Indicates whether %g or %u/%U was used.  */
1238   const char *filename; /* associated filename.  */
1239   int filename_length;  /* strlen (filename).  */
1240   struct temp_name *next;
1241 } *temp_names;
1242
1243 /* Number of commands executed so far.  */
1244
1245 static int execution_count;
1246
1247 /* Number of commands that exited with a signal.  */
1248
1249 static int signal_count;
1250
1251 /* Name with which this program was invoked.  */
1252
1253 static const char *programname;
1254 \f
1255 /* Structures to keep track of prefixes to try when looking for files.  */
1256
1257 struct prefix_list
1258 {
1259   char *prefix;               /* String to prepend to the path.  */
1260   struct prefix_list *next;   /* Next in linked list.  */
1261   int require_machine_suffix; /* Don't use without machine_suffix.  */
1262   /* 2 means try both machine_suffix and just_machine_suffix.  */
1263   int *used_flag_ptr;         /* 1 if a file was found with this prefix.  */
1264   int priority;               /* Sort key - priority within list */
1265 };
1266
1267 struct path_prefix
1268 {
1269   struct prefix_list *plist;  /* List of prefixes to try */
1270   int max_len;                /* Max length of a prefix in PLIST */
1271   const char *name;           /* Name of this list (used in config stuff) */
1272 };
1273
1274 /* List of prefixes to try when looking for executables.  */
1275
1276 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1277
1278 /* List of prefixes to try when looking for startup (crt0) files.  */
1279
1280 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1281
1282 /* List of prefixes to try when looking for include files.  */
1283
1284 static struct path_prefix include_prefixes = { 0, 0, "include" };
1285
1286 /* Suffix to attach to directories searched for commands.
1287    This looks like `MACHINE/VERSION/'.  */
1288
1289 static const char *machine_suffix = 0;
1290
1291 /* Suffix to attach to directories searched for commands.
1292    This is just `MACHINE/'.  */
1293
1294 static const char *just_machine_suffix = 0;
1295
1296 /* Adjusted value of GCC_EXEC_PREFIX envvar.  */
1297
1298 static const char *gcc_exec_prefix;
1299
1300 /* Default prefixes to attach to command names.  */
1301
1302 #ifdef CROSS_COMPILE  /* Don't use these prefixes for a cross compiler.  */
1303 #undef MD_EXEC_PREFIX
1304 #undef MD_STARTFILE_PREFIX
1305 #undef MD_STARTFILE_PREFIX_1
1306 #endif
1307
1308 #ifndef STANDARD_EXEC_PREFIX
1309 #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
1310 #endif /* !defined STANDARD_EXEC_PREFIX */
1311
1312 static const char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
1313 static const char *standard_exec_prefix_1 = "/usr/lib/gcc/";
1314 #ifdef MD_EXEC_PREFIX
1315 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1316 #endif
1317
1318 #ifndef STANDARD_STARTFILE_PREFIX
1319 #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
1320 #endif /* !defined STANDARD_STARTFILE_PREFIX */
1321
1322 #ifdef MD_STARTFILE_PREFIX
1323 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1324 #endif
1325 #ifdef MD_STARTFILE_PREFIX_1
1326 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1327 #endif
1328 static const char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1329 static const char *standard_startfile_prefix_1 = "/lib/";
1330 static const char *standard_startfile_prefix_2 = "/usr/lib/";
1331
1332 #ifndef TOOLDIR_BASE_PREFIX
1333 #define TOOLDIR_BASE_PREFIX "/usr/local/"
1334 #endif
1335 static const char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1336 static const char *tooldir_prefix;
1337
1338 #ifndef STANDARD_BINDIR_PREFIX
1339 #define STANDARD_BINDIR_PREFIX "/usr/local/bin"
1340 #endif
1341 static const char *standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1342
1343 /* Subdirectory to use for locating libraries.  Set by
1344    set_multilib_dir based on the compilation options.  */
1345
1346 static const char *multilib_dir;
1347
1348 /* Clear out the vector of arguments (after a command is executed).  */
1349
1350 static void
1351 clear_args ()
1352 {
1353   argbuf_index = 0;
1354 }
1355
1356 /* Add one argument to the vector at the end.
1357    This is done when a space is seen or at the end of the line.
1358    If DELETE_ALWAYS is nonzero, the arg is a filename
1359     and the file should be deleted eventually.
1360    If DELETE_FAILURE is nonzero, the arg is a filename
1361     and the file should be deleted if this compilation fails.  */
1362
1363 static void
1364 store_arg (arg, delete_always, delete_failure)
1365      const char *arg;
1366      int delete_always, delete_failure;
1367 {
1368   if (argbuf_index + 1 == argbuf_length)
1369     argbuf
1370       = (const char **) xrealloc (argbuf,
1371                                   (argbuf_length *= 2) * sizeof (const char *));
1372
1373   argbuf[argbuf_index++] = arg;
1374   argbuf[argbuf_index] = 0;
1375
1376   if (delete_always || delete_failure)
1377     record_temp_file (arg, delete_always, delete_failure);
1378 }
1379 \f
1380 /* Load specs from a file name named FILENAME, replacing occurances of
1381    various different types of line-endings, \r\n, \n\r and just \r, with
1382    a single \n.  */
1383
1384 static char *
1385 load_specs (filename)
1386      const char *filename;
1387 {
1388   int desc;
1389   int readlen;
1390   struct stat statbuf;
1391   char *buffer;
1392   char *buffer_p;
1393   char *specs;
1394   char *specs_p;
1395
1396   if (verbose_flag)
1397     notice ("Reading specs from %s\n", filename);
1398
1399   /* Open and stat the file.  */
1400   desc = open (filename, O_RDONLY, 0);
1401   if (desc < 0)
1402     pfatal_with_name (filename);
1403   if (stat (filename, &statbuf) < 0)
1404     pfatal_with_name (filename);
1405
1406   /* Read contents of file into BUFFER.  */
1407   buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1408   readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1409   if (readlen < 0)
1410     pfatal_with_name (filename);
1411   buffer[readlen] = 0;
1412   close (desc);
1413
1414   specs = xmalloc (readlen + 1);
1415   specs_p = specs;
1416   for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1417     {
1418       int skip = 0;
1419       char c = *buffer_p;
1420       if (c == '\r')
1421         {
1422           if (buffer_p > buffer && *(buffer_p - 1) == '\n')     /* \n\r */
1423             skip = 1;
1424           else if (*(buffer_p + 1) == '\n')                     /* \r\n */
1425             skip = 1;
1426           else                                                  /* \r */
1427             c = '\n';
1428         }
1429       if (! skip)
1430         *specs_p++ = c;
1431     }
1432   *specs_p = '\0';
1433
1434   free (buffer);
1435   return (specs);
1436 }
1437
1438 /* Read compilation specs from a file named FILENAME,
1439    replacing the default ones.
1440
1441    A suffix which starts with `*' is a definition for
1442    one of the machine-specific sub-specs.  The "suffix" should be
1443    *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
1444    The corresponding spec is stored in asm_spec, etc.,
1445    rather than in the `compilers' vector.
1446
1447    Anything invalid in the file is a fatal error.  */
1448
1449 static void
1450 read_specs (filename, main_p)
1451      const char *filename;
1452      int main_p;
1453 {
1454   char *buffer;
1455   register char *p;
1456
1457   buffer = load_specs (filename);
1458
1459   /* Scan BUFFER for specs, putting them in the vector.  */
1460   p = buffer;
1461   while (1)
1462     {
1463       char *suffix;
1464       char *spec;
1465       char *in, *out, *p1, *p2, *p3;
1466
1467       /* Advance P in BUFFER to the next nonblank nocomment line.  */
1468       p = skip_whitespace (p);
1469       if (*p == 0)
1470         break;
1471
1472       /* Is this a special command that starts with '%'? */
1473       /* Don't allow this for the main specs file, since it would
1474          encourage people to overwrite it.  */
1475       if (*p == '%' && !main_p)
1476         {
1477           p1 = p;
1478           while (*p && *p != '\n')
1479             p++;
1480
1481           /* Skip '\n'.  */
1482           p++;
1483
1484           if (!strncmp (p1, "%include", sizeof ("%include") - 1)
1485               && (p1[sizeof "%include" - 1] == ' '
1486                   || p1[sizeof "%include" - 1] == '\t'))
1487             {
1488               char *new_filename;
1489
1490               p1 += sizeof ("%include");
1491               while (*p1 == ' ' || *p1 == '\t')
1492                 p1++;
1493
1494               if (*p1++ != '<' || p[-2] != '>')
1495                 fatal ("specs %%include syntax malformed after %ld characters",
1496                        (long) (p1 - buffer + 1));
1497
1498               p[-2] = '\0';
1499               new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1500               read_specs (new_filename ? new_filename : p1, FALSE);
1501               continue;
1502             }
1503           else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1504                    && (p1[sizeof "%include_noerr" - 1] == ' '
1505                        || p1[sizeof "%include_noerr" - 1] == '\t'))
1506             {
1507               char *new_filename;
1508
1509               p1 += sizeof "%include_noerr";
1510               while (*p1 == ' ' || *p1 == '\t')
1511                 p1++;
1512
1513               if (*p1++ != '<' || p[-2] != '>')
1514                 fatal ("specs %%include syntax malformed after %ld characters",
1515                        (long) (p1 - buffer + 1));
1516
1517               p[-2] = '\0';
1518               new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1519               if (new_filename)
1520                 read_specs (new_filename, FALSE);
1521               else if (verbose_flag)
1522                 notice ("Could not find specs file %s\n", p1);
1523               continue;
1524             }
1525           else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1526                    && (p1[sizeof "%rename" - 1] == ' '
1527                        || p1[sizeof "%rename" - 1] == '\t'))
1528             {
1529               int name_len;
1530               struct spec_list *sl;
1531
1532               /* Get original name */
1533               p1 += sizeof "%rename";
1534               while (*p1 == ' ' || *p1 == '\t')
1535                 p1++;
1536
1537               if (! ISALPHA ((unsigned char) *p1))
1538                 fatal ("specs %%rename syntax malformed after %ld characters",
1539                        (long) (p1 - buffer));
1540
1541               p2 = p1;
1542               while (*p2 && !ISSPACE ((unsigned char) *p2))
1543                 p2++;
1544
1545               if (*p2 != ' ' && *p2 != '\t')
1546                 fatal ("specs %%rename syntax malformed after %ld characters",
1547                        (long) (p2 - buffer));
1548
1549               name_len = p2 - p1;
1550               *p2++ = '\0';
1551               while (*p2 == ' ' || *p2 == '\t')
1552                 p2++;
1553
1554               if (! ISALPHA ((unsigned char) *p2))
1555                 fatal ("specs %%rename syntax malformed after %ld characters",
1556                        (long) (p2 - buffer));
1557
1558               /* Get new spec name.  */
1559               p3 = p2;
1560               while (*p3 && !ISSPACE ((unsigned char) *p3))
1561                 p3++;
1562
1563               if (p3 != p - 1)
1564                 fatal ("specs %%rename syntax malformed after %ld characters",
1565                        (long) (p3 - buffer));
1566               *p3 = '\0';
1567
1568               for (sl = specs; sl; sl = sl->next)
1569                 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1570                   break;
1571
1572               if (!sl)
1573                 fatal ("specs %s spec was not found to be renamed", p1);
1574
1575               if (strcmp (p1, p2) == 0)
1576                 continue;
1577
1578               if (verbose_flag)
1579                 {
1580                   notice ("rename spec %s to %s\n", p1, p2);
1581 #ifdef DEBUG_SPECS
1582                   notice ("spec is '%s'\n\n", *(sl->ptr_spec));
1583 #endif
1584                 }
1585
1586               set_spec (p2, *(sl->ptr_spec));
1587               if (sl->alloc_p)
1588                 free ((PTR) *(sl->ptr_spec));
1589
1590               *(sl->ptr_spec) = "";
1591               sl->alloc_p = 0;
1592               continue;
1593             }
1594           else
1595             fatal ("specs unknown %% command after %ld characters",
1596                    (long) (p1 - buffer));
1597         }
1598
1599       /* Find the colon that should end the suffix.  */
1600       p1 = p;
1601       while (*p1 && *p1 != ':' && *p1 != '\n')
1602         p1++;
1603
1604       /* The colon shouldn't be missing.  */
1605       if (*p1 != ':')
1606         fatal ("specs file malformed after %ld characters",
1607                (long) (p1 - buffer));
1608
1609       /* Skip back over trailing whitespace.  */
1610       p2 = p1;
1611       while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1612         p2--;
1613
1614       /* Copy the suffix to a string.  */
1615       suffix = save_string (p, p2 - p);
1616       /* Find the next line.  */
1617       p = skip_whitespace (p1 + 1);
1618       if (p[1] == 0)
1619         fatal ("specs file malformed after %ld characters",
1620                (long) (p - buffer));
1621
1622       p1 = p;
1623       /* Find next blank line or end of string.  */
1624       while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
1625         p1++;
1626
1627       /* Specs end at the blank line and do not include the newline.  */
1628       spec = save_string (p, p1 - p);
1629       p = p1;
1630
1631       /* Delete backslash-newline sequences from the spec.  */
1632       in = spec;
1633       out = spec;
1634       while (*in != 0)
1635         {
1636           if (in[0] == '\\' && in[1] == '\n')
1637             in += 2;
1638           else if (in[0] == '#')
1639             while (*in && *in != '\n')
1640               in++;
1641
1642           else
1643             *out++ = *in++;
1644         }
1645       *out = 0;
1646
1647       if (suffix[0] == '*')
1648         {
1649           if (! strcmp (suffix, "*link_command"))
1650             link_command_spec = spec;
1651           else
1652             set_spec (suffix + 1, spec);
1653         }
1654       else
1655         {
1656           /* Add this pair to the vector.  */
1657           compilers
1658             = ((struct compiler *)
1659                xrealloc (compilers,
1660                          (n_compilers + 2) * sizeof (struct compiler)));
1661
1662           compilers[n_compilers].suffix = suffix;
1663           compilers[n_compilers].spec = spec;
1664           n_compilers++;
1665           memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
1666         }
1667
1668       if (*suffix == 0)
1669         link_command_spec = spec;
1670     }
1671
1672   if (link_command_spec == 0)
1673     fatal ("spec file has no spec for linking");
1674 }
1675 \f
1676 /* Record the names of temporary files we tell compilers to write,
1677    and delete them at the end of the run.  */
1678
1679 /* This is the common prefix we use to make temp file names.
1680    It is chosen once for each run of this program.
1681    It is substituted into a spec by %g or %j.
1682    Thus, all temp file names contain this prefix.
1683    In practice, all temp file names start with this prefix.
1684
1685    This prefix comes from the envvar TMPDIR if it is defined;
1686    otherwise, from the P_tmpdir macro if that is defined;
1687    otherwise, in /usr/tmp or /tmp;
1688    or finally the current directory if all else fails.  */
1689
1690 static const char *temp_filename;
1691
1692 /* Length of the prefix.  */
1693
1694 static int temp_filename_length;
1695
1696 /* Define the list of temporary files to delete.  */
1697
1698 struct temp_file
1699 {
1700   const char *name;
1701   struct temp_file *next;
1702 };
1703
1704 /* Queue of files to delete on success or failure of compilation.  */
1705 static struct temp_file *always_delete_queue;
1706 /* Queue of files to delete on failure of compilation.  */
1707 static struct temp_file *failure_delete_queue;
1708
1709 /* Record FILENAME as a file to be deleted automatically.
1710    ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
1711    otherwise delete it in any case.
1712    FAIL_DELETE nonzero means delete it if a compilation step fails;
1713    otherwise delete it in any case.  */
1714
1715 static void
1716 record_temp_file (filename, always_delete, fail_delete)
1717      const char *filename;
1718      int always_delete;
1719      int fail_delete;
1720 {
1721   register char *const name = xstrdup (filename);
1722
1723   if (always_delete)
1724     {
1725       register struct temp_file *temp;
1726       for (temp = always_delete_queue; temp; temp = temp->next)
1727         if (! strcmp (name, temp->name))
1728           goto already1;
1729
1730       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1731       temp->next = always_delete_queue;
1732       temp->name = name;
1733       always_delete_queue = temp;
1734
1735     already1:;
1736     }
1737
1738   if (fail_delete)
1739     {
1740       register struct temp_file *temp;
1741       for (temp = failure_delete_queue; temp; temp = temp->next)
1742         if (! strcmp (name, temp->name))
1743           goto already2;
1744
1745       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1746       temp->next = failure_delete_queue;
1747       temp->name = name;
1748       failure_delete_queue = temp;
1749
1750     already2:;
1751     }
1752 }
1753
1754 /* Delete all the temporary files whose names we previously recorded.  */
1755
1756 static void
1757 delete_if_ordinary (name)
1758      const char *name;
1759 {
1760   struct stat st;
1761 #ifdef DEBUG
1762   int i, c;
1763
1764   printf ("Delete %s? (y or n) ", name);
1765   fflush (stdout);
1766   i = getchar ();
1767   if (i != '\n')
1768     while ((c = getchar ()) != '\n' && c != EOF)
1769       ;
1770
1771   if (i == 'y' || i == 'Y')
1772 #endif /* DEBUG */
1773     if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
1774       if (unlink (name) < 0)
1775         if (verbose_flag)
1776           perror_with_name (name);
1777 }
1778
1779 static void
1780 delete_temp_files ()
1781 {
1782   register struct temp_file *temp;
1783
1784   for (temp = always_delete_queue; temp; temp = temp->next)
1785     delete_if_ordinary (temp->name);
1786   always_delete_queue = 0;
1787 }
1788
1789 /* Delete all the files to be deleted on error.  */
1790
1791 static void
1792 delete_failure_queue ()
1793 {
1794   register struct temp_file *temp;
1795
1796   for (temp = failure_delete_queue; temp; temp = temp->next)
1797     delete_if_ordinary (temp->name);
1798 }
1799
1800 static void
1801 clear_failure_queue ()
1802 {
1803   failure_delete_queue = 0;
1804 }
1805 \f
1806 /* Routine to add variables to the environment.  We do this to pass
1807    the pathname of the gcc driver, and the directories search to the
1808    collect2 program, which is being run as ld.  This way, we can be
1809    sure of executing the right compiler when collect2 wants to build
1810    constructors and destructors.  Since the environment variables we
1811    use come from an obstack, we don't have to worry about allocating
1812    space for them.  */
1813
1814 #ifndef HAVE_PUTENV
1815
1816 void
1817 putenv (str)
1818      char *str;
1819 {
1820 #ifndef VMS                     /* nor about VMS */
1821
1822   extern char **environ;
1823   char **old_environ = environ;
1824   char **envp;
1825   int num_envs = 0;
1826   int name_len = 1;
1827   int str_len = strlen (str);
1828   char *p = str;
1829   int ch;
1830
1831   while ((ch = *p++) != '\0' && ch != '=')
1832     name_len++;
1833
1834   if (!ch)
1835     abort ();
1836
1837   /* Search for replacing an existing environment variable, and
1838      count the number of total environment variables.  */
1839   for (envp = old_environ; *envp; envp++)
1840     {
1841       num_envs++;
1842       if (!strncmp (str, *envp, name_len))
1843         {
1844           *envp = str;
1845           return;
1846         }
1847     }
1848
1849   /* Add a new environment variable */
1850   environ = (char **) xmalloc (sizeof (char *) * (num_envs + 2));
1851   *environ = str;
1852   memcpy ((char *) (environ + 1), (char *) old_environ,
1853           sizeof (char *) * (num_envs + 1));
1854
1855 #endif  /* VMS */
1856 }
1857
1858 #endif /* HAVE_PUTENV */
1859 \f
1860 /* Build a list of search directories from PATHS.
1861    PREFIX is a string to prepend to the list.
1862    If CHECK_DIR_P is non-zero we ensure the directory exists.
1863    This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
1864    It is also used by the --print-search-dirs flag.  */
1865
1866 static char *
1867 build_search_list (paths, prefix, check_dir_p)
1868      struct path_prefix *paths;
1869      const char *prefix;
1870      int check_dir_p;
1871 {
1872   int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
1873   int just_suffix_len
1874     = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
1875   int first_time = TRUE;
1876   struct prefix_list *pprefix;
1877
1878   obstack_grow (&collect_obstack, prefix, strlen (prefix));
1879   obstack_1grow (&collect_obstack, '=');
1880
1881   for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
1882     {
1883       int len = strlen (pprefix->prefix);
1884
1885       if (machine_suffix
1886           && (! check_dir_p
1887               || is_directory (pprefix->prefix, machine_suffix, 0)))
1888         {
1889           if (!first_time)
1890             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1891
1892           first_time = FALSE;
1893           obstack_grow (&collect_obstack, pprefix->prefix, len);
1894           obstack_grow (&collect_obstack, machine_suffix, suffix_len);
1895         }
1896
1897       if (just_machine_suffix
1898           && pprefix->require_machine_suffix == 2
1899           && (! check_dir_p
1900               || is_directory (pprefix->prefix, just_machine_suffix, 0)))
1901         {
1902           if (! first_time)
1903             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1904
1905           first_time = FALSE;
1906           obstack_grow (&collect_obstack, pprefix->prefix, len);
1907           obstack_grow (&collect_obstack, just_machine_suffix,
1908                         just_suffix_len);
1909         }
1910
1911       if (! pprefix->require_machine_suffix)
1912         {
1913           if (! first_time)
1914             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1915
1916           first_time = FALSE;
1917           obstack_grow (&collect_obstack, pprefix->prefix, len);
1918         }
1919     }
1920
1921   obstack_1grow (&collect_obstack, '\0');
1922   return obstack_finish (&collect_obstack);
1923 }
1924
1925 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
1926    for collect.  */
1927
1928 static void
1929 putenv_from_prefixes (paths, env_var)
1930      struct path_prefix *paths;
1931      const char *env_var;
1932 {
1933   putenv (build_search_list (paths, env_var, 1));
1934 }
1935 \f
1936 #ifndef VMS
1937
1938 /* FIXME: the location independence code for VMS is hairier than this,
1939    and hasn't been written.  */
1940
1941 /* Split a filename into component directories.  */
1942
1943 static char **
1944 split_directories (name, ptr_num_dirs)
1945      const char *name;
1946      int *ptr_num_dirs;
1947 {
1948   int num_dirs = 0;
1949   char **dirs;
1950   const char *p, *q;
1951   int ch;
1952
1953   /* Count the number of directories.  Special case MSDOS disk names as part
1954      of the initial directory.  */
1955   p = name;
1956 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1957   if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
1958     {
1959       p += 3;
1960       num_dirs++;
1961     }
1962 #endif /* HAVE_DOS_BASED_FILE_SYSTEM */
1963
1964   while ((ch = *p++) != '\0')
1965     {
1966       if (IS_DIR_SEPARATOR (ch))
1967         {
1968           num_dirs++;
1969           while (IS_DIR_SEPARATOR (*p))
1970             p++;
1971         }
1972     }
1973
1974   dirs = (char **) xmalloc (sizeof (char *) * (num_dirs + 2));
1975
1976   /* Now copy the directory parts.  */
1977   num_dirs = 0;
1978   p = name;
1979 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1980   if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
1981     {
1982       dirs[num_dirs++] = save_string (p, 3);
1983       p += 3;
1984     }
1985 #endif /* HAVE_DOS_BASED_FILE_SYSTEM */
1986
1987   q = p;
1988   while ((ch = *p++) != '\0')
1989     {
1990       if (IS_DIR_SEPARATOR (ch))
1991         {
1992           while (IS_DIR_SEPARATOR (*p))
1993             p++;
1994
1995           dirs[num_dirs++] = save_string (q, p - q);
1996           q = p;
1997         }
1998     }
1999
2000   if (p - 1 - q > 0)
2001     dirs[num_dirs++] = save_string (q, p - 1 - q);
2002
2003   dirs[num_dirs] = NULL_PTR;
2004   if (ptr_num_dirs)
2005     *ptr_num_dirs = num_dirs;
2006
2007   return dirs;
2008 }
2009
2010 /* Release storage held by split directories.  */
2011
2012 static void
2013 free_split_directories (dirs)
2014      char **dirs;
2015 {
2016   int i = 0;
2017
2018   while (dirs[i] != NULL_PTR)
2019     free (dirs[i++]);
2020
2021   free ((char *) dirs);
2022 }
2023
2024 /* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets
2025    to PREFIX starting with the directory portion of PROGNAME and a relative
2026    pathname of the difference between BIN_PREFIX and PREFIX.
2027
2028    For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is
2029    /alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this
2030    function will return /red/green/blue/../omega.
2031
2032    If no relative prefix can be found, return NULL.  */
2033
2034 static char *
2035 make_relative_prefix (progname, bin_prefix, prefix)
2036      const char *progname;
2037      const char *bin_prefix;
2038      const char *prefix;
2039 {
2040   char **prog_dirs, **bin_dirs, **prefix_dirs;
2041   int prog_num, bin_num, prefix_num, std_loc_p;
2042   int i, n, common;
2043
2044   prog_dirs = split_directories (progname, &prog_num);
2045   bin_dirs = split_directories (bin_prefix, &bin_num);
2046
2047   /* If there is no full pathname, try to find the program by checking in each
2048      of the directories specified in the PATH environment variable.  */
2049   if (prog_num == 1)
2050     {
2051       char *temp;
2052
2053       GET_ENV_PATH_LIST (temp, "PATH");
2054       if (temp)
2055         {
2056           char *startp, *endp;
2057           char *nstore = (char *) alloca (strlen (temp) + strlen (progname) + 1);
2058
2059           startp = endp = temp;
2060           while (1)
2061             {
2062               if (*endp == PATH_SEPARATOR || *endp == 0)
2063                 {
2064                   if (endp == startp)
2065                     {
2066                       nstore[0] = '.';
2067                       nstore[1] = DIR_SEPARATOR;
2068                       nstore[2] = '\0';
2069                     }
2070                   else
2071                     {
2072                       strncpy (nstore, startp, endp - startp);
2073                       if (! IS_DIR_SEPARATOR (endp[-1]))
2074                         {
2075                           nstore[endp - startp] = DIR_SEPARATOR;
2076                           nstore[endp - startp + 1] = 0;
2077                         }
2078                       else
2079                         nstore[endp - startp] = 0;
2080                     }
2081                   strcat (nstore, progname);
2082                   if (! access (nstore, X_OK)
2083 #ifdef HAVE_EXECUTABLE_SUFFIX
2084                       || ! access (strcat (nstore, EXECUTABLE_SUFFIX), X_OK)
2085 #endif
2086                       )
2087                     {
2088                       free_split_directories (prog_dirs);
2089                       progname = nstore;
2090                       prog_dirs = split_directories (progname, &prog_num);
2091                       break;
2092                     }
2093
2094                   if (*endp == 0)
2095                     break;
2096                   endp = startp = endp + 1;
2097                 }
2098               else
2099                 endp++;
2100             }
2101         }
2102     }
2103
2104   /* Remove the program name from comparison of directory names.  */
2105   prog_num--;
2106
2107   /* Determine if the compiler is installed in the standard location, and if
2108      so, we don't need to specify relative directories.  Also, if argv[0]
2109      doesn't contain any directory specifiers, there is not much we can do.  */
2110   std_loc_p = 0;
2111   if (prog_num == bin_num)
2112     {
2113       for (i = 0; i < bin_num; i++)
2114         {
2115           if (strcmp (prog_dirs[i], bin_dirs[i]) != 0)
2116             break;
2117         }
2118
2119       if (prog_num <= 0 || i == bin_num)
2120         {
2121           std_loc_p = 1;
2122           free_split_directories (prog_dirs);
2123           free_split_directories (bin_dirs);
2124           prog_dirs = bin_dirs = (char **) 0;
2125           return NULL_PTR;
2126         }
2127     }
2128
2129   prefix_dirs = split_directories (prefix, &prefix_num);
2130
2131   /* Find how many directories are in common between bin_prefix & prefix.  */
2132   n = (prefix_num < bin_num) ? prefix_num : bin_num;
2133   for (common = 0; common < n; common++)
2134     {
2135       if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0)
2136         break;
2137     }
2138
2139   /* If there are no common directories, there can be no relative prefix.  */
2140   if (common == 0)
2141     {
2142       free_split_directories (prog_dirs);
2143       free_split_directories (bin_dirs);
2144       free_split_directories (prefix_dirs);
2145       return NULL_PTR;
2146     }
2147
2148   /* Build up the pathnames in argv[0].  */
2149   for (i = 0; i < prog_num; i++)
2150     obstack_grow (&obstack, prog_dirs[i], strlen (prog_dirs[i]));
2151
2152   /* Now build up the ..'s.  */
2153   for (i = common; i < n; i++)
2154     {
2155       obstack_grow (&obstack, DIR_UP, sizeof (DIR_UP) - 1);
2156       obstack_1grow (&obstack, DIR_SEPARATOR);
2157     }
2158
2159   /* Put in directories to move over to prefix.  */
2160   for (i = common; i < prefix_num; i++)
2161     obstack_grow (&obstack, prefix_dirs[i], strlen (prefix_dirs[i]));
2162
2163   free_split_directories (prog_dirs);
2164   free_split_directories (bin_dirs);
2165   free_split_directories (prefix_dirs);
2166
2167   obstack_1grow (&obstack, '\0');
2168   return obstack_finish (&obstack);
2169 }
2170 #endif /* VMS */
2171 \f
2172 /* Check whether NAME can be accessed in MODE.  This is like access,
2173    except that it never considers directories to be executable.  */
2174
2175 static int
2176 access_check (name, mode)
2177      const char *name;
2178      int mode;
2179 {
2180   if (mode == X_OK)
2181     {
2182       struct stat st;
2183
2184       if (stat (name, &st) < 0
2185           || S_ISDIR (st.st_mode))
2186         return -1;
2187     }
2188
2189   return access (name, mode);
2190 }
2191
2192 /* Search for NAME using the prefix list PREFIXES.  MODE is passed to
2193    access to check permissions.
2194    Return 0 if not found, otherwise return its name, allocated with malloc.  */
2195
2196 static char *
2197 find_a_file (pprefix, name, mode)
2198      struct path_prefix *pprefix;
2199      const char *name;
2200      int mode;
2201 {
2202   char *temp;
2203   const char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
2204   struct prefix_list *pl;
2205   int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
2206
2207 #ifdef DEFAULT_ASSEMBLER
2208   if (! strcmp(name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2209     return xstrdup (DEFAULT_ASSEMBLER);
2210 #endif
2211
2212 #ifdef DEFAULT_LINKER
2213   if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2214     return xstrdup (DEFAULT_LINKER);
2215 #endif
2216
2217   if (machine_suffix)
2218     len += strlen (machine_suffix);
2219
2220   temp = xmalloc (len);
2221
2222   /* Determine the filename to execute (special case for absolute paths).  */
2223
2224   if (IS_DIR_SEPARATOR (*name)
2225 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2226       /* Check for disk name on MS-DOS-based systems.  */
2227       || (name[0] && name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2228 #endif
2229       )
2230     {
2231       if (access (name, mode) == 0)
2232         {
2233           strcpy (temp, name);
2234           return temp;
2235         }
2236     }
2237   else
2238     for (pl = pprefix->plist; pl; pl = pl->next)
2239       {
2240         if (machine_suffix)
2241           {
2242             /* Some systems have a suffix for executable files.
2243                So try appending that first.  */
2244             if (file_suffix[0] != 0)
2245               {
2246                 strcpy (temp, pl->prefix);
2247                 strcat (temp, machine_suffix);
2248                 strcat (temp, name);
2249                 strcat (temp, file_suffix);
2250                 if (access_check (temp, mode) == 0)
2251                   {
2252                     if (pl->used_flag_ptr != 0)
2253                       *pl->used_flag_ptr = 1;
2254                     return temp;
2255                   }
2256               }
2257
2258             /* Now try just the name.  */
2259             strcpy (temp, pl->prefix);
2260             strcat (temp, machine_suffix);
2261             strcat (temp, name);
2262             if (access_check (temp, mode) == 0)
2263               {
2264                 if (pl->used_flag_ptr != 0)
2265                   *pl->used_flag_ptr = 1;
2266                 return temp;
2267               }
2268           }
2269
2270         /* Certain prefixes are tried with just the machine type,
2271            not the version.  This is used for finding as, ld, etc.  */
2272         if (just_machine_suffix && pl->require_machine_suffix == 2)
2273           {
2274             /* Some systems have a suffix for executable files.
2275                So try appending that first.  */
2276             if (file_suffix[0] != 0)
2277               {
2278                 strcpy (temp, pl->prefix);
2279                 strcat (temp, just_machine_suffix);
2280                 strcat (temp, name);
2281                 strcat (temp, file_suffix);
2282                 if (access_check (temp, mode) == 0)
2283                   {
2284                     if (pl->used_flag_ptr != 0)
2285                       *pl->used_flag_ptr = 1;
2286                     return temp;
2287                   }
2288               }
2289
2290             strcpy (temp, pl->prefix);
2291             strcat (temp, just_machine_suffix);
2292             strcat (temp, name);
2293             if (access_check (temp, mode) == 0)
2294               {
2295                 if (pl->used_flag_ptr != 0)
2296                   *pl->used_flag_ptr = 1;
2297                 return temp;
2298               }
2299           }
2300
2301         /* Certain prefixes can't be used without the machine suffix
2302            when the machine or version is explicitly specified.  */
2303         if (! pl->require_machine_suffix)
2304           {
2305             /* Some systems have a suffix for executable files.
2306                So try appending that first.  */
2307             if (file_suffix[0] != 0)
2308               {
2309                 strcpy (temp, pl->prefix);
2310                 strcat (temp, name);
2311                 strcat (temp, file_suffix);
2312                 if (access_check (temp, mode) == 0)
2313                   {
2314                     if (pl->used_flag_ptr != 0)
2315                       *pl->used_flag_ptr = 1;
2316                     return temp;
2317                   }
2318               }
2319
2320             strcpy (temp, pl->prefix);
2321             strcat (temp, name);
2322             if (access_check (temp, mode) == 0)
2323               {
2324                 if (pl->used_flag_ptr != 0)
2325                   *pl->used_flag_ptr = 1;
2326                 return temp;
2327               }
2328           }
2329       }
2330
2331   free (temp);
2332   return 0;
2333 }
2334
2335 /* Ranking of prefixes in the sort list. -B prefixes are put before
2336    all others.  */
2337
2338 enum path_prefix_priority
2339 {
2340   PREFIX_PRIORITY_B_OPT,
2341   PREFIX_PRIORITY_LAST
2342 };
2343
2344 /* Add an entry for PREFIX in PLIST.  The PLIST is kept in assending
2345    order according to PRIORITY.  Within each PRIORITY, new entries are
2346    appended.
2347
2348    If WARN is nonzero, we will warn if no file is found
2349    through this prefix.  WARN should point to an int
2350    which will be set to 1 if this entry is used.
2351
2352    COMPONENT is the value to be passed to update_path.
2353
2354    REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2355    the complete value of machine_suffix.
2356    2 means try both machine_suffix and just_machine_suffix.  */
2357
2358 static void
2359 add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn)
2360      struct path_prefix *pprefix;
2361      const char *prefix;
2362      const char *component;
2363      /* enum prefix_priority */ int priority;
2364      int require_machine_suffix;
2365      int *warn;
2366 {
2367   struct prefix_list *pl, **prev;
2368   int len;
2369
2370   for (prev = &pprefix->plist;
2371        (*prev) != NULL && (*prev)->priority <= priority;
2372        prev = &(*prev)->next)
2373     ;
2374
2375   /* Keep track of the longest prefix */
2376
2377   prefix = update_path (prefix, component);
2378   len = strlen (prefix);
2379   if (len > pprefix->max_len)
2380     pprefix->max_len = len;
2381
2382   pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
2383   pl->prefix = save_string (prefix, len);
2384   pl->require_machine_suffix = require_machine_suffix;
2385   pl->used_flag_ptr = warn;
2386   pl->priority = priority;
2387   if (warn)
2388     *warn = 0;
2389
2390   /* Insert after PREV */
2391   pl->next = (*prev);
2392   (*prev) = pl;
2393 }
2394 \f
2395 /* Execute the command specified by the arguments on the current line of spec.
2396    When using pipes, this includes several piped-together commands
2397    with `|' between them.
2398
2399    Return 0 if successful, -1 if failed.  */
2400
2401 static int
2402 execute ()
2403 {
2404   int i;
2405   int n_commands;               /* # of command.  */
2406   char *string;
2407   struct command
2408   {
2409     const char *prog;           /* program name.  */
2410     const char **argv;          /* vector of args.  */
2411     int pid;                    /* pid of process for this command.  */
2412   };
2413
2414   struct command *commands;     /* each command buffer with above info.  */
2415
2416   /* Count # of piped commands.  */
2417   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2418     if (strcmp (argbuf[i], "|") == 0)
2419       n_commands++;
2420
2421   /* Get storage for each command.  */
2422   commands = (struct command *) alloca (n_commands * sizeof (struct command));
2423
2424   /* Split argbuf into its separate piped processes,
2425      and record info about each one.
2426      Also search for the programs that are to be run.  */
2427
2428   commands[0].prog = argbuf[0]; /* first command.  */
2429   commands[0].argv = &argbuf[0];
2430   string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
2431
2432   if (string)
2433     commands[0].argv[0] = string;
2434
2435   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2436     if (strcmp (argbuf[i], "|") == 0)
2437       {                         /* each command.  */
2438 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2439         fatal ("-pipe not supported");
2440 #endif
2441         argbuf[i] = 0;  /* termination of command args.  */
2442         commands[n_commands].prog = argbuf[i + 1];
2443         commands[n_commands].argv = &argbuf[i + 1];
2444         string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
2445         if (string)
2446           commands[n_commands].argv[0] = string;
2447         n_commands++;
2448       }
2449
2450   argbuf[argbuf_index] = 0;
2451
2452   /* If -v, print what we are about to do, and maybe query.  */
2453
2454   if (verbose_flag)
2455     {
2456       /* For help listings, put a blank line between sub-processes.  */
2457       if (print_help_list)
2458         fputc ('\n', stderr);
2459
2460       /* Print each piped command as a separate line.  */
2461       for (i = 0; i < n_commands; i++)
2462         {
2463           const char *const *j;
2464
2465           for (j = commands[i].argv; *j; j++)
2466             fprintf (stderr, " %s", *j);
2467
2468           /* Print a pipe symbol after all but the last command.  */
2469           if (i + 1 != n_commands)
2470             fprintf (stderr, " |");
2471           fprintf (stderr, "\n");
2472         }
2473       fflush (stderr);
2474 #ifdef DEBUG
2475       notice ("\nGo ahead? (y or n) ");
2476       fflush (stderr);
2477       i = getchar ();
2478       if (i != '\n')
2479         while (getchar () != '\n')
2480           ;
2481
2482       if (i != 'y' && i != 'Y')
2483         return 0;
2484 #endif /* DEBUG */
2485     }
2486
2487   /* Run each piped subprocess.  */
2488
2489   for (i = 0; i < n_commands; i++)
2490     {
2491       char *errmsg_fmt, *errmsg_arg;
2492       const char *string = commands[i].argv[0];
2493
2494       /* For some bizarre reason, the second argument of execvp() is
2495          char *const *, not const char *const *.  */
2496       commands[i].pid = pexecute (string, (char *const *) commands[i].argv,
2497                                   programname, temp_filename,
2498                                   &errmsg_fmt, &errmsg_arg,
2499                                   ((i == 0 ? PEXECUTE_FIRST : 0)
2500                                    | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2501                                    | (string == commands[i].prog
2502                                       ? PEXECUTE_SEARCH : 0)
2503                                    | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2504
2505       if (commands[i].pid == -1)
2506         pfatal_pexecute (errmsg_fmt, errmsg_arg);
2507
2508       if (string != commands[i].prog)
2509         free ((PTR) string);
2510     }
2511
2512   execution_count++;
2513
2514   /* Wait for all the subprocesses to finish.
2515      We don't care what order they finish in;
2516      we know that N_COMMANDS waits will get them all.
2517      Ignore subprocesses that we don't know about,
2518      since they can be spawned by the process that exec'ed us.  */
2519
2520   {
2521     int ret_code = 0;
2522 #ifdef HAVE_GETRUSAGE
2523     struct timeval d;
2524     double ut = 0.0, st = 0.0;
2525 #endif
2526
2527     for (i = 0; i < n_commands;)
2528       {
2529         int j;
2530         int status;
2531         int pid;
2532
2533         pid = pwait (commands[i].pid, &status, 0);
2534         if (pid < 0)
2535           abort ();
2536
2537 #ifdef HAVE_GETRUSAGE
2538         if (report_times)
2539           {
2540             /* getrusage returns the total resource usage of all children
2541                up to now.  Copy the previous values into prus, get the
2542                current statistics, then take the difference.  */
2543
2544             prus = rus;
2545             getrusage (RUSAGE_CHILDREN, &rus);
2546             d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
2547             d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
2548             ut = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2549
2550             d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
2551             d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
2552             st = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2553           }
2554 #endif
2555
2556         for (j = 0; j < n_commands; j++)
2557           if (commands[j].pid == pid)
2558             {
2559               i++;
2560               if (WIFSIGNALED (status))
2561                 {
2562 #ifdef SIGPIPE
2563                   /* SIGPIPE is a special case.  It happens in -pipe mode
2564                      when the compiler dies before the preprocessor is
2565                      done, or the assembler dies before the compiler is
2566                      done.  There's generally been an error already, and
2567                      this is just fallout.  So don't generate another error
2568                      unless we would otherwise have succeeded.  */
2569                   if (WTERMSIG (status) == SIGPIPE
2570                       && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2571                     ;
2572                   else
2573 #endif
2574                     fatal ("\
2575 Internal error: %s (program %s)\n\
2576 Please submit a full bug report.\n\
2577 See %s for instructions.",
2578                            strsignal (WTERMSIG (status)), commands[j].prog,
2579                            GCCBUGURL);
2580                   signal_count++;
2581                   ret_code = -1;
2582                 }
2583               else if (WIFEXITED (status)
2584                        && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2585                 {
2586                   if (WEXITSTATUS (status) > greatest_status)
2587                     greatest_status = WEXITSTATUS (status);
2588                   ret_code = -1;
2589                 }
2590 #ifdef HAVE_GETRUSAGE
2591               if (report_times && ut + st != 0)
2592                 notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
2593 #endif
2594               break;
2595             }
2596       }
2597     return ret_code;
2598   }
2599 }
2600 \f
2601 /* Find all the switches given to us
2602    and make a vector describing them.
2603    The elements of the vector are strings, one per switch given.
2604    If a switch uses following arguments, then the `part1' field
2605    is the switch itself and the `args' field
2606    is a null-terminated vector containing the following arguments.
2607    The `live_cond' field is:
2608    0 when initialized
2609    1 if the switch is true in a conditional spec,
2610    -1 if false (overridden by a later switch)
2611    -2 if this switch should be ignored (used in %{<S})
2612    The `validated' field is nonzero if any spec has looked at this switch;
2613    if it remains zero at the end of the run, it must be meaningless.  */
2614
2615 #define SWITCH_OK       0
2616 #define SWITCH_FALSE   -1
2617 #define SWITCH_IGNORE  -2
2618 #define SWITCH_LIVE     1
2619
2620 struct switchstr
2621 {
2622   const char *part1;
2623   const char **args;
2624   int live_cond;
2625   int validated;
2626 };
2627
2628 static struct switchstr *switches;
2629
2630 static int n_switches;
2631
2632 struct infile
2633 {
2634   const char *name;
2635   const char *language;
2636 };
2637
2638 /* Also a vector of input files specified.  */
2639
2640 static struct infile *infiles;
2641
2642 static int n_infiles;
2643
2644 /* This counts the number of libraries added by lang_specific_driver, so that
2645    we can tell if there were any user supplied any files or libraries.  */
2646
2647 static int added_libraries;
2648
2649 /* And a vector of corresponding output files is made up later.  */
2650
2651 static const char **outfiles;
2652
2653 /* Used to track if none of the -B paths are used.  */
2654 static int warn_B;
2655
2656 /* Used to track if standard path isn't used and -b or -V is specified.  */
2657 static int warn_std;
2658
2659 /* Gives value to pass as "warn" to add_prefix for standard prefixes.  */
2660 static int *warn_std_ptr = 0;
2661 \f
2662 #if defined(HAVE_OBJECT_SUFFIX) || defined(HAVE_EXECUTABLE_SUFFIX)
2663
2664 /* Convert NAME to a new name if it is the standard suffix.  DO_EXE
2665    is true if we should look for an executable suffix as well.  */
2666
2667 static char *
2668 convert_filename (name, do_exe)
2669      char *name;
2670      int do_exe;
2671 {
2672   int i;
2673   int len;
2674
2675   if (name == NULL)
2676     return NULL;
2677
2678   len = strlen (name);
2679
2680 #ifdef HAVE_OBJECT_SUFFIX
2681   /* Convert x.o to x.obj if OBJECT_SUFFIX is ".obj".  */
2682   if (len > 2
2683       && name[len - 2] == '.'
2684       && name[len - 1] == 'o')
2685     {
2686       obstack_grow (&obstack, name, len - 2);
2687       obstack_grow0 (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
2688       name = obstack_finish (&obstack);
2689     }
2690 #endif
2691
2692 #ifdef HAVE_EXECUTABLE_SUFFIX
2693   /* If there is no filetype, make it the executable suffix (which includes
2694      the ".").  But don't get confused if we have just "-o".  */
2695   if (! do_exe || EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2696     return name;
2697
2698   for (i = len - 1; i >= 0; i--)
2699     if (IS_DIR_SEPARATOR (name[i]))
2700       break;
2701
2702   for (i++; i < len; i++)
2703     if (name[i] == '.')
2704       return name;
2705
2706   obstack_grow (&obstack, name, len);
2707   obstack_grow0 (&obstack, EXECUTABLE_SUFFIX, strlen (EXECUTABLE_SUFFIX));
2708   name = obstack_finish (&obstack);
2709 #endif
2710
2711   return name;
2712 }
2713 #endif
2714 \f
2715 /* Display the command line switches accepted by gcc.  */
2716 static void
2717 display_help ()
2718 {
2719   printf (_("Usage: %s [options] file...\n"), programname);
2720   fputs (_("Options:\n"), stdout);
2721
2722   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
2723   fputs (_("  --help                   Display this information\n"), stdout);
2724   if (! verbose_flag)
2725     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2726   fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
2727   fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
2728   fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
2729   fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
2730   fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
2731   fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
2732   fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
2733   fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
2734   fputs (_("\
2735   -print-multi-lib         Display the mapping between command line options and\n\
2736                            multiple library search directories\n"), stdout);
2737   fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
2738   fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
2739   fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
2740   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
2741   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
2742   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
2743   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
2744   fputs (_("  -specs=<file>            Override builtin specs with the contents of <file>\n"), stdout);
2745   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
2746   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
2747   fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
2748   fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
2749   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
2750   fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
2751   fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
2752   fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
2753   fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
2754   fputs (_("\
2755   -x <language>            Specify the language of the following input files\n\
2756                            Permissable languages include: c c++ assembler none\n\
2757                            'none' means revert to the default behaviour of\n\
2758                            guessing the language based on the file's extension\n\
2759 "), stdout);
2760
2761   printf (_("\
2762 \nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n\
2763 the various sub-processes invoked by %s.  In order to pass other options\n\
2764 on to these processes the -W<letter> options must be used.\n\
2765 "), programname);
2766
2767   /* The rest of the options are displayed by invocations of the various
2768      sub-processes.  */
2769 }
2770
2771 static void
2772 add_preprocessor_option (option, len)
2773      const char *option;
2774      int len;
2775 {
2776   n_preprocessor_options++;
2777
2778   if (! preprocessor_options)
2779     preprocessor_options
2780       = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
2781   else
2782     preprocessor_options
2783       = (char **) xrealloc (preprocessor_options,
2784                             n_preprocessor_options * sizeof (char *));
2785
2786   preprocessor_options [n_preprocessor_options - 1] =
2787     save_string (option, len);
2788 }
2789
2790 static void
2791 add_assembler_option (option, len)
2792      const char *option;
2793      int len;
2794 {
2795   n_assembler_options++;
2796
2797   if (! assembler_options)
2798     assembler_options
2799       = (char **) xmalloc (n_assembler_options * sizeof (char *));
2800   else
2801     assembler_options
2802       = (char **) xrealloc (assembler_options,
2803                             n_assembler_options * sizeof (char *));
2804
2805   assembler_options [n_assembler_options - 1] = save_string (option, len);
2806 }
2807
2808 static void
2809 add_linker_option (option, len)
2810      const char *option;
2811      int len;
2812 {
2813   n_linker_options++;
2814
2815   if (! linker_options)
2816     linker_options
2817       = (char **) xmalloc (n_linker_options * sizeof (char *));
2818   else
2819     linker_options
2820       = (char **) xrealloc (linker_options,
2821                             n_linker_options * sizeof (char *));
2822
2823   linker_options [n_linker_options - 1] = save_string (option, len);
2824 }
2825 \f
2826 /* Create the vector `switches' and its contents.
2827    Store its length in `n_switches'.  */
2828
2829 static void
2830 process_command (argc, argv)
2831      int argc;
2832      const char *const *argv;
2833 {
2834   register int i;
2835   const char *temp;
2836   char *temp1;
2837   const char *spec_lang = 0;
2838   int last_language_n_infiles;
2839   int have_c = 0;
2840   int have_o = 0;
2841   int lang_n_infiles = 0;
2842
2843   GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
2844
2845   n_switches = 0;
2846   n_infiles = 0;
2847   added_libraries = 0;
2848
2849   /* Figure compiler version from version string.  */
2850
2851   compiler_version = temp1 = xstrdup (version_string);
2852
2853   for (; *temp1; ++temp1)
2854     {
2855       if (*temp1 == ' ')
2856         {
2857           *temp1 = '\0';
2858           break;
2859         }
2860     }
2861
2862   /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
2863      see if we can create it from the pathname specified in argv[0].  */
2864
2865 #ifndef VMS
2866   /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
2867   if (!gcc_exec_prefix)
2868     {
2869       gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
2870                                               standard_exec_prefix);
2871       if (gcc_exec_prefix)
2872         putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL_PTR));
2873     }
2874 #endif
2875
2876   if (gcc_exec_prefix)
2877     {
2878       int len = strlen (gcc_exec_prefix);
2879       if (len > (int) sizeof ("/lib/gcc-lib/") - 1
2880           && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
2881         {
2882           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
2883           if (IS_DIR_SEPARATOR (*temp)
2884               && strncmp (temp + 1, "lib", 3) == 0
2885               && IS_DIR_SEPARATOR (temp[4])
2886               && strncmp (temp + 5, "gcc-lib", 7) == 0)
2887             len -= sizeof ("/lib/gcc-lib/") - 1;
2888         }
2889
2890       set_std_prefix (gcc_exec_prefix, len);
2891       add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC",
2892                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2893       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
2894                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2895     }
2896
2897   /* COMPILER_PATH and LIBRARY_PATH have values
2898      that are lists of directory names with colons.  */
2899
2900   GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
2901   if (temp)
2902     {
2903       const char *startp, *endp;
2904       char *nstore = (char *) alloca (strlen (temp) + 3);
2905
2906       startp = endp = temp;
2907       while (1)
2908         {
2909           if (*endp == PATH_SEPARATOR || *endp == 0)
2910             {
2911               strncpy (nstore, startp, endp - startp);
2912               if (endp == startp)
2913                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2914               else if (!IS_DIR_SEPARATOR (endp[-1]))
2915                 {
2916                   nstore[endp - startp] = DIR_SEPARATOR;
2917                   nstore[endp - startp + 1] = 0;
2918                 }
2919               else
2920                 nstore[endp - startp] = 0;
2921               add_prefix (&exec_prefixes, nstore, 0,
2922                           PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2923               add_prefix (&include_prefixes,
2924                           concat (nstore, "include", NULL_PTR),
2925                           0, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2926               if (*endp == 0)
2927                 break;
2928               endp = startp = endp + 1;
2929             }
2930           else
2931             endp++;
2932         }
2933     }
2934
2935   GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
2936   if (temp && *cross_compile == '0')
2937     {
2938       const char *startp, *endp;
2939       char *nstore = (char *) alloca (strlen (temp) + 3);
2940
2941       startp = endp = temp;
2942       while (1)
2943         {
2944           if (*endp == PATH_SEPARATOR || *endp == 0)
2945             {
2946               strncpy (nstore, startp, endp - startp);
2947               if (endp == startp)
2948                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2949               else if (!IS_DIR_SEPARATOR (endp[-1]))
2950                 {
2951                   nstore[endp - startp] = DIR_SEPARATOR;
2952                   nstore[endp - startp + 1] = 0;
2953                 }
2954               else
2955                 nstore[endp - startp] = 0;
2956               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
2957                           PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2958               if (*endp == 0)
2959                 break;
2960               endp = startp = endp + 1;
2961             }
2962           else
2963             endp++;
2964         }
2965     }
2966
2967   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
2968   GET_ENV_PATH_LIST (temp, "LPATH");
2969   if (temp && *cross_compile == '0')
2970     {
2971       const char *startp, *endp;
2972       char *nstore = (char *) alloca (strlen (temp) + 3);
2973
2974       startp = endp = temp;
2975       while (1)
2976         {
2977           if (*endp == PATH_SEPARATOR || *endp == 0)
2978             {
2979               strncpy (nstore, startp, endp - startp);
2980               if (endp == startp)
2981                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2982               else if (!IS_DIR_SEPARATOR (endp[-1]))
2983                 {
2984                   nstore[endp - startp] = DIR_SEPARATOR;
2985                   nstore[endp - startp + 1] = 0;
2986                 }
2987               else
2988                 nstore[endp - startp] = 0;
2989               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
2990                           PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2991               if (*endp == 0)
2992                 break;
2993               endp = startp = endp + 1;
2994             }
2995           else
2996             endp++;
2997         }
2998     }
2999
3000   /* Convert new-style -- options to old-style.  */
3001   translate_options (&argc, &argv);
3002
3003   /* Do language-specific adjustment/addition of flags.  */
3004   lang_specific_driver (&argc, &argv, &added_libraries);
3005
3006   /* Scan argv twice.  Here, the first time, just count how many switches
3007      there will be in their vector, and how many input files in theirs.
3008      Here we also parse the switches that cc itself uses (e.g. -v).  */
3009
3010   for (i = 1; i < argc; i++)
3011     {
3012       if (! strcmp (argv[i], "-dumpspecs"))
3013         {
3014           struct spec_list *sl;
3015           init_spec ();
3016           for (sl = specs; sl; sl = sl->next)
3017             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3018           if (link_command_spec)
3019             printf ("*link_command:\n%s\n\n", link_command_spec);
3020           exit (0);
3021         }
3022       else if (! strcmp (argv[i], "-dumpversion"))
3023         {
3024           printf ("%s\n", spec_version);
3025           exit (0);
3026         }
3027       else if (! strcmp (argv[i], "-dumpmachine"))
3028         {
3029           printf ("%s\n", spec_machine);
3030           exit (0);
3031         }
3032       else if (strcmp (argv[i], "-fhelp") == 0)
3033         {
3034           /* translate_options () has turned --help into -fhelp.  */
3035           print_help_list = 1;
3036
3037           /* We will be passing a dummy file on to the sub-processes.  */
3038           n_infiles++;
3039           n_switches++;
3040
3041           add_preprocessor_option ("--help", 6);
3042           add_assembler_option ("--help", 6);
3043           add_linker_option ("--help", 6);
3044         }
3045       else if (! strcmp (argv[i], "-pass-exit-codes"))
3046         {
3047           pass_exit_codes = 1;
3048           n_switches++;
3049         }
3050       else if (! strcmp (argv[i], "-print-search-dirs"))
3051         print_search_dirs = 1;
3052       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3053         print_file_name = "libgcc.a";
3054       else if (! strncmp (argv[i], "-print-file-name=", 17))
3055         print_file_name = argv[i] + 17;
3056       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3057         print_prog_name = argv[i] + 17;
3058       else if (! strcmp (argv[i], "-print-multi-lib"))
3059         print_multi_lib = 1;
3060       else if (! strcmp (argv[i], "-print-multi-directory"))
3061         print_multi_directory = 1;
3062       else if (! strncmp (argv[i], "-Wa,", 4))
3063         {
3064           int prev, j;
3065           /* Pass the rest of this option to the assembler.  */
3066
3067           /* Split the argument at commas.  */
3068           prev = 4;
3069           for (j = 4; argv[i][j]; j++)
3070             if (argv[i][j] == ',')
3071               {
3072                 add_assembler_option (argv[i] + prev, j - prev);
3073                 prev = j + 1;
3074               }
3075
3076           /* Record the part after the last comma.  */
3077           add_assembler_option (argv[i] + prev, j - prev);
3078         }
3079       else if (! strncmp (argv[i], "-Wp,", 4))
3080         {
3081           int prev, j;
3082           /* Pass the rest of this option to the preprocessor.  */
3083
3084           /* Split the argument at commas.  */
3085           prev = 4;
3086           for (j = 4; argv[i][j]; j++)
3087             if (argv[i][j] == ',')
3088               {
3089                 add_preprocessor_option (argv[i] + prev, j - prev);
3090                 prev = j + 1;
3091               }
3092
3093           /* Record the part after the last comma.  */
3094           add_preprocessor_option (argv[i] + prev, j - prev);
3095         }
3096       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3097         /* The +e options to the C++ front-end.  */
3098         n_switches++;
3099       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3100         {
3101           int j;
3102           /* Split the argument at commas.  */
3103           for (j = 3; argv[i][j]; j++)
3104             n_infiles += (argv[i][j] == ',');
3105         }
3106       else if (strcmp (argv[i], "-Xlinker") == 0)
3107         {
3108           if (i + 1 == argc)
3109             fatal ("argument to `-Xlinker' is missing");
3110
3111           n_infiles++;
3112           i++;
3113         }
3114       else if (strncmp (argv[i], "-l", 2) == 0)
3115         n_infiles++;
3116       else if (strcmp (argv[i], "-save-temps") == 0)
3117         {
3118           save_temps_flag = 1;
3119           n_switches++;
3120         }
3121       else if (strcmp (argv[i], "-specs") == 0)
3122         {
3123           struct user_specs *user = (struct user_specs *)
3124             xmalloc (sizeof (struct user_specs));
3125           if (++i >= argc)
3126             fatal ("argument to `-specs' is missing");
3127
3128           user->next = (struct user_specs *) 0;
3129           user->filename = argv[i];
3130           if (user_specs_tail)
3131             user_specs_tail->next = user;
3132           else
3133             user_specs_head = user;
3134           user_specs_tail = user;
3135         }
3136       else if (strncmp (argv[i], "-specs=", 7) == 0)
3137         {
3138           struct user_specs *user = (struct user_specs *)
3139             xmalloc (sizeof (struct user_specs));
3140           if (strlen (argv[i]) == 7)
3141             fatal ("argument to `-specs=' is missing");
3142
3143           user->next = (struct user_specs *) 0;
3144           user->filename = argv[i] + 7;
3145           if (user_specs_tail)
3146             user_specs_tail->next = user;
3147           else
3148             user_specs_head = user;
3149           user_specs_tail = user;
3150         }
3151       else if (strcmp (argv[i], "-time") == 0)
3152         report_times = 1;
3153       else if (argv[i][0] == '-' && argv[i][1] != 0)
3154         {
3155           register const char *p = &argv[i][1];
3156           register int c = *p;
3157
3158           switch (c)
3159             {
3160             case 'b':
3161               n_switches++;
3162               if (p[1] == 0 && i + 1 == argc)
3163                 fatal ("argument to `-b' is missing");
3164               if (p[1] == 0)
3165                 spec_machine = argv[++i];
3166               else
3167                 spec_machine = p + 1;
3168
3169               warn_std_ptr = &warn_std;
3170               break;
3171
3172             case 'B':
3173               {
3174                 const char *value;
3175                 if (p[1] == 0 && i + 1 == argc)
3176                   fatal ("argument to `-B' is missing");
3177                 if (p[1] == 0)
3178                   value = argv[++i];
3179                 else
3180                   value = p + 1;
3181                 {
3182                   /* As a kludge, if the arg is "[foo/]stageN/", just
3183                      add "[foo/]include" to the include prefix.  */
3184                   int len = strlen (value);
3185                   if ((len == 7
3186                        || (len > 7
3187                            && (IS_DIR_SEPARATOR (value[len - 8]))))
3188                       && strncmp (value + len - 7, "stage", 5) == 0
3189                       && ISDIGIT (value[len - 2])
3190                       && (IS_DIR_SEPARATOR (value[len - 1])))
3191                     {
3192                       if (len == 7)
3193                         add_prefix (&include_prefixes, "include", NULL_PTR,
3194                                     PREFIX_PRIORITY_B_OPT, 0, NULL_PTR);
3195                       else
3196                         {
3197                           char *string = xmalloc (len + 1);
3198                           strncpy (string, value, len-7);
3199                           strcpy (string+len-7, "include");
3200                           add_prefix (&include_prefixes, string, NULL_PTR,
3201                                       PREFIX_PRIORITY_B_OPT, 0, NULL_PTR);
3202                         }
3203                     }
3204                 }
3205                 add_prefix (&exec_prefixes, value, NULL_PTR,
3206                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3207                 add_prefix (&startfile_prefixes, value, NULL_PTR,
3208                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3209                 add_prefix (&include_prefixes, concat (value, "include",
3210                                                        NULL_PTR),
3211                             NULL_PTR,
3212                             PREFIX_PRIORITY_B_OPT, 0, NULL_PTR);
3213                 n_switches++;
3214               }
3215               break;
3216
3217             case 'v':   /* Print our subcommands and print versions.  */
3218               n_switches++;
3219               /* If they do anything other than exactly `-v', don't set
3220                  verbose_flag; rather, continue on to give the error.  */
3221               if (p[1] != 0)
3222                 break;
3223               verbose_flag++;
3224               break;
3225
3226             case 'V':
3227               n_switches++;
3228               if (p[1] == 0 && i + 1 == argc)
3229                 fatal ("argument to `-V' is missing");
3230               if (p[1] == 0)
3231                 spec_version = argv[++i];
3232               else
3233                 spec_version = p + 1;
3234               compiler_version = spec_version;
3235               warn_std_ptr = &warn_std;
3236
3237               /* Validate the version number.  Use the same checks
3238                  done when inserting it into a spec.
3239
3240                  The format of the version string is
3241                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
3242               {
3243                 const char *v = compiler_version;
3244
3245                 /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
3246                 while (! ISDIGIT (*v))
3247                   v++;
3248
3249                 if (v > compiler_version && v[-1] != '-')
3250                   fatal ("invalid version number format");
3251
3252                 /* Set V after the first period.  */
3253                 while (ISDIGIT (*v))
3254                   v++;
3255
3256                 if (*v != '.')
3257                   fatal ("invalid version number format");
3258
3259                 v++;
3260                 while (ISDIGIT (*v))
3261                   v++;
3262
3263                 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3264                   fatal ("invalid version number format");
3265               }
3266               break;
3267
3268             case 'S':
3269             case 'c':
3270               if (p[1] == 0)
3271                 {
3272                   have_c = 1;
3273                   n_switches++;
3274                   break;
3275                 }
3276               goto normal_switch;
3277
3278             case 'o':
3279               have_o = 1;
3280 #if defined(HAVE_EXECUTABLE_SUFFIX)
3281               if (! have_c)
3282                 {
3283                   int skip;
3284
3285                   /* Forward scan, just in case -S or -c is specified
3286                      after -o.  */
3287                   int j = i + 1;
3288                   if (p[1] == 0)
3289                     ++j;
3290                   while (j < argc)
3291                     {
3292                       if (argv[j][0] == '-')
3293                         {
3294                           if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3295                               && argv[j][2] == 0)
3296                             {
3297                               have_c = 1;
3298                               break;
3299                             }
3300                           else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3301                             j += skip - (argv[j][2] != 0);
3302                           else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3303                             j += skip;
3304                         }
3305                       j++;
3306                     }
3307                 }
3308 #endif
3309 #if defined(HAVE_EXECUTABLE_SUFFIX) || defined(HAVE_OBJECT_SUFFIX)
3310               if (p[1] == 0)
3311                 argv[i + 1] = convert_filename (argv[i + 1], ! have_c);
3312               else
3313                 argv[i] = convert_filename (argv[i], ! have_c);
3314 #endif
3315               goto normal_switch;
3316
3317             default:
3318             normal_switch:
3319               n_switches++;
3320
3321               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3322                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3323               else if (WORD_SWITCH_TAKES_ARG (p))
3324                 i += WORD_SWITCH_TAKES_ARG (p);
3325             }
3326         }
3327       else
3328         {
3329           n_infiles++;
3330           lang_n_infiles++;
3331         }
3332     }
3333
3334   if (have_c && have_o && lang_n_infiles > 1)
3335     fatal ("cannot specify -o with -c or -S and multiple compilations");
3336
3337   /* Set up the search paths before we go looking for config files.  */
3338
3339   /* These come before the md prefixes so that we will find gcc's subcommands
3340      (such as cpp) rather than those of the host system.  */
3341   /* Use 2 as fourth arg meaning try just the machine as a suffix,
3342      as well as trying the machine and the version.  */
3343 #ifndef OS2
3344   add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3345               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3346   add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3347               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3348   add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3349               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3350 #endif
3351
3352   add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3353               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3354   add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3355               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3356
3357   tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3358                            dir_separator_str, NULL_PTR);
3359
3360   /* If tooldir is relative, base it on exec_prefixes.  A relative
3361      tooldir lets us move the installed tree as a unit.
3362
3363      If GCC_EXEC_PREFIX is defined, then we want to add two relative
3364      directories, so that we can search both the user specified directory
3365      and the standard place.  */
3366
3367   if (!IS_DIR_SEPARATOR (*tooldir_prefix))
3368     {
3369       if (gcc_exec_prefix)
3370         {
3371           char *gcc_exec_tooldir_prefix
3372             = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3373                       spec_version, dir_separator_str, tooldir_prefix, NULL_PTR);
3374
3375           add_prefix (&exec_prefixes,
3376                       concat (gcc_exec_tooldir_prefix, "bin",
3377                               dir_separator_str, NULL_PTR),
3378                       NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3379           add_prefix (&startfile_prefixes,
3380                       concat (gcc_exec_tooldir_prefix, "lib",
3381                               dir_separator_str, NULL_PTR),
3382                       NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3383         }
3384
3385       tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3386                                dir_separator_str, spec_version,
3387                                dir_separator_str, tooldir_prefix, NULL_PTR);
3388     }
3389
3390   add_prefix (&exec_prefixes,
3391               concat (tooldir_prefix, "bin", dir_separator_str, NULL_PTR),
3392               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3393   add_prefix (&startfile_prefixes,
3394               concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
3395               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3396
3397   /* More prefixes are enabled in main, after we read the specs file
3398      and determine whether this is cross-compilation or not.  */
3399
3400   /* Then create the space for the vectors and scan again.  */
3401
3402   switches = ((struct switchstr *)
3403               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3404   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3405   n_switches = 0;
3406   n_infiles = 0;
3407   last_language_n_infiles = -1;
3408
3409   /* This, time, copy the text of each switch and store a pointer
3410      to the copy in the vector of switches.
3411      Store all the infiles in their vector.  */
3412
3413   for (i = 1; i < argc; i++)
3414     {
3415       /* Just skip the switches that were handled by the preceding loop.  */
3416       if (! strncmp (argv[i], "-Wa,", 4))
3417         ;
3418       else if (! strncmp (argv[i], "-Wp,", 4))
3419         ;
3420       else if (! strcmp (argv[i], "-pass-exit-codes"))
3421         ;
3422       else if (! strcmp (argv[i], "-print-search-dirs"))
3423         ;
3424       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3425         ;
3426       else if (! strncmp (argv[i], "-print-file-name=", 17))
3427         ;
3428       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3429         ;
3430       else if (! strcmp (argv[i], "-print-multi-lib"))
3431         ;
3432       else if (! strcmp (argv[i], "-print-multi-directory"))
3433         ;
3434       else if (strcmp (argv[i], "-fhelp") == 0)
3435         {
3436           if (verbose_flag)
3437             {
3438               /* Create a dummy input file, so that we can pass --help on to
3439                  the various sub-processes.  */
3440               infiles[n_infiles].language = "c";
3441               infiles[n_infiles++].name   = "help-dummy";
3442
3443               /* Preserve the --help switch so that it can be caught by the
3444                  cc1 spec string.  */
3445               switches[n_switches].part1     = "--help";
3446               switches[n_switches].args      = 0;
3447               switches[n_switches].live_cond = SWITCH_OK;
3448               switches[n_switches].validated     = 0;
3449
3450               n_switches++;
3451             }
3452         }
3453       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3454         {
3455           /* Compensate for the +e options to the C++ front-end;
3456              they're there simply for cfront call-compatibility.  We do
3457              some magic in default_compilers to pass them down properly.
3458              Note we deliberately start at the `+' here, to avoid passing
3459              -e0 or -e1 down into the linker.  */
3460           switches[n_switches].part1 = &argv[i][0];
3461           switches[n_switches].args = 0;
3462           switches[n_switches].live_cond = SWITCH_OK;
3463           switches[n_switches].validated = 0;
3464           n_switches++;
3465         }
3466       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3467         {
3468           int prev, j;
3469           /* Split the argument at commas.  */
3470           prev = 4;
3471           for (j = 4; argv[i][j]; j++)
3472             if (argv[i][j] == ',')
3473               {
3474                 infiles[n_infiles].language = "*";
3475                 infiles[n_infiles++].name
3476                   = save_string (argv[i] + prev, j - prev);
3477                 prev = j + 1;
3478               }
3479           /* Record the part after the last comma.  */
3480           infiles[n_infiles].language = "*";
3481           infiles[n_infiles++].name = argv[i] + prev;
3482         }
3483       else if (strcmp (argv[i], "-Xlinker") == 0)
3484         {
3485           infiles[n_infiles].language = "*";
3486           infiles[n_infiles++].name = argv[++i];
3487         }
3488       else if (strncmp (argv[i], "-l", 2) == 0)
3489         {
3490           infiles[n_infiles].language = "*";
3491           infiles[n_infiles++].name = argv[i];
3492         }
3493       else if (strcmp (argv[i], "-specs") == 0)
3494         i++;
3495       else if (strncmp (argv[i], "-specs=", 7) == 0)
3496         ;
3497       else if (strcmp (argv[i], "-time") == 0)
3498         ;
3499       else if ((save_temps_flag || report_times)
3500                && strcmp (argv[i], "-pipe") == 0)
3501         {
3502           /* -save-temps overrides -pipe, so that temp files are produced */
3503           if (save_temps_flag)
3504             error ("Warning: -pipe ignored since -save-temps specified");
3505           /* -time overrides -pipe because we can't get correct stats when
3506              multiple children are running at once.  */
3507           else if (report_times)
3508             error ("Warning: -pipe ignored since -time specified");
3509         }
3510       else if (argv[i][0] == '-' && argv[i][1] != 0)
3511         {
3512           const char *p = &argv[i][1];
3513           int c = *p;
3514
3515           if (c == 'x')
3516             {
3517               if (p[1] == 0 && i + 1 == argc)
3518                 fatal ("argument to `-x' is missing");
3519               if (p[1] == 0)
3520                 spec_lang = argv[++i];
3521               else
3522                 spec_lang = p + 1;
3523               if (! strcmp (spec_lang, "none"))
3524                 /* Suppress the warning if -xnone comes after the last input
3525                    file, because alternate command interfaces like g++ might
3526                    find it useful to place -xnone after each input file.  */
3527                 spec_lang = 0;
3528               else
3529                 last_language_n_infiles = n_infiles;
3530               continue;
3531             }
3532           switches[n_switches].part1 = p;
3533           /* Deal with option arguments in separate argv elements.  */
3534           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
3535               || WORD_SWITCH_TAKES_ARG (p))
3536             {
3537               int j = 0;
3538               int n_args = WORD_SWITCH_TAKES_ARG (p);
3539
3540               if (n_args == 0)
3541                 {
3542                   /* Count only the option arguments in separate argv elements.  */
3543                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3544                 }
3545               if (i + n_args >= argc)
3546                 fatal ("argument to `-%s' is missing", p);
3547               switches[n_switches].args
3548                 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
3549               while (j < n_args)
3550                 switches[n_switches].args[j++] = argv[++i];
3551               /* Null-terminate the vector.  */
3552               switches[n_switches].args[j] = 0;
3553             }
3554           else if (index (switches_need_spaces, c))
3555             {
3556               /* On some systems, ld cannot handle some options without
3557                  a space.  So split the option from its argument.  */
3558               char *part1 = (char *) xmalloc (2);
3559               char *tmp;
3560               part1[0] = c;
3561               part1[1] = '\0';
3562
3563               switches[n_switches].part1 = part1;
3564               switches[n_switches].args
3565                 = (const char **) xmalloc (2 * sizeof (const char *));
3566               switches[n_switches].args[0] = tmp = xmalloc (strlen (p));
3567               strcpy (tmp, &p[1]);
3568               switches[n_switches].args[1] = 0;
3569             }
3570           else
3571             switches[n_switches].args = 0;
3572
3573           switches[n_switches].live_cond = SWITCH_OK;
3574           switches[n_switches].validated = 0;
3575           /* This is always valid, since gcc.c itself understands it.  */
3576           if (!strcmp (p, "save-temps"))
3577             switches[n_switches].validated = 1;
3578           else
3579             {
3580               char ch = switches[n_switches].part1[0];
3581               if (ch == 'V' || ch == 'b' || ch == 'B')
3582                 switches[n_switches].validated = 1;
3583             }
3584           n_switches++;
3585         }
3586       else
3587         {
3588 #ifdef HAVE_OBJECT_SUFFIX
3589           argv[i] = convert_filename (argv[i], 0);
3590 #endif
3591
3592           if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
3593             {
3594               perror_with_name (argv[i]);
3595               error_count++;
3596             }
3597           else
3598             {
3599               infiles[n_infiles].language = spec_lang;
3600               infiles[n_infiles++].name = argv[i];
3601             }
3602         }
3603     }
3604
3605   if (n_infiles == last_language_n_infiles && spec_lang != 0)
3606     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3607
3608   switches[n_switches].part1 = 0;
3609   infiles[n_infiles].name = 0;
3610 }
3611 \f
3612 /* Process a spec string, accumulating and running commands.  */
3613
3614 /* These variables describe the input file name.
3615    input_file_number is the index on outfiles of this file,
3616    so that the output file name can be stored for later use by %o.
3617    input_basename is the start of the part of the input file
3618    sans all directory names, and basename_length is the number
3619    of characters starting there excluding the suffix .c or whatever.  */
3620
3621 const char *input_filename;
3622 static int input_file_number;
3623 size_t input_filename_length;
3624 static int basename_length;
3625 static int suffixed_basename_length;
3626 static const char *input_basename;
3627 static const char *input_suffix;
3628
3629 /* These are variables used within do_spec and do_spec_1.  */
3630
3631 /* Nonzero if an arg has been started and not yet terminated
3632    (with space, tab or newline).  */
3633 static int arg_going;
3634
3635 /* Nonzero means %d or %g has been seen; the next arg to be terminated
3636    is a temporary file name.  */
3637 static int delete_this_arg;
3638
3639 /* Nonzero means %w has been seen; the next arg to be terminated
3640    is the output file name of this compilation.  */
3641 static int this_is_output_file;
3642
3643 /* Nonzero means %s has been seen; the next arg to be terminated
3644    is the name of a library file and we should try the standard
3645    search dirs for it.  */
3646 static int this_is_library_file;
3647
3648 /* Nonzero means that the input of this command is coming from a pipe.  */
3649 static int input_from_pipe;
3650
3651 /* Process the spec SPEC and run the commands specified therein.
3652    Returns 0 if the spec is successfully processed; -1 if failed.  */
3653
3654 int
3655 do_spec (spec)
3656      const char *spec;
3657 {
3658   int value;
3659
3660   clear_args ();
3661   arg_going = 0;
3662   delete_this_arg = 0;
3663   this_is_output_file = 0;
3664   this_is_library_file = 0;
3665   input_from_pipe = 0;
3666
3667   value = do_spec_1 (spec, 0, NULL_PTR);
3668
3669   /* Force out any unfinished command.
3670      If -pipe, this forces out the last command if it ended in `|'.  */
3671   if (value == 0)
3672     {
3673       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3674         argbuf_index--;
3675
3676       if (argbuf_index > 0)
3677         value = execute ();
3678     }
3679
3680   return value;
3681 }
3682
3683 /* Process the sub-spec SPEC as a portion of a larger spec.
3684    This is like processing a whole spec except that we do
3685    not initialize at the beginning and we do not supply a
3686    newline by default at the end.
3687    INSWITCH nonzero means don't process %-sequences in SPEC;
3688    in this case, % is treated as an ordinary character.
3689    This is used while substituting switches.
3690    INSWITCH nonzero also causes SPC not to terminate an argument.
3691
3692    Value is zero unless a line was finished
3693    and the command on that line reported an error.  */
3694
3695 static int
3696 do_spec_1 (spec, inswitch, soft_matched_part)
3697      const char *spec;
3698      int inswitch;
3699      const char *soft_matched_part;
3700 {
3701   register const char *p = spec;
3702   register int c;
3703   int i;
3704   const char *string;
3705   int value;
3706
3707   while ((c = *p++))
3708     /* If substituting a switch, treat all chars like letters.
3709        Otherwise, NL, SPC, TAB and % are special.  */
3710     switch (inswitch ? 'a' : c)
3711       {
3712       case '\n':
3713         /* End of line: finish any pending argument,
3714            then run the pending command if one has been started.  */
3715         if (arg_going)
3716           {
3717             obstack_1grow (&obstack, 0);
3718             string = obstack_finish (&obstack);
3719             if (this_is_library_file)
3720               string = find_file (string);
3721             store_arg (string, delete_this_arg, this_is_output_file);
3722             if (this_is_output_file)
3723               outfiles[input_file_number] = string;
3724           }
3725         arg_going = 0;
3726
3727         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3728           {
3729             for (i = 0; i < n_switches; i++)
3730               if (!strcmp (switches[i].part1, "pipe"))
3731                 break;
3732
3733             /* A `|' before the newline means use a pipe here,
3734                but only if -pipe was specified.
3735                Otherwise, execute now and don't pass the `|' as an arg.  */
3736             if (i < n_switches)
3737               {
3738                 input_from_pipe = 1;
3739                 switches[i].validated = 1;
3740                 break;
3741               }
3742             else
3743               argbuf_index--;
3744           }
3745
3746         if (argbuf_index > 0)
3747           {
3748             value = execute ();
3749             if (value)
3750               return value;
3751           }
3752         /* Reinitialize for a new command, and for a new argument.  */
3753         clear_args ();
3754         arg_going = 0;
3755         delete_this_arg = 0;
3756         this_is_output_file = 0;
3757         this_is_library_file = 0;
3758         input_from_pipe = 0;
3759         break;
3760
3761       case '|':
3762         /* End any pending argument.  */
3763         if (arg_going)
3764           {
3765             obstack_1grow (&obstack, 0);
3766             string = obstack_finish (&obstack);
3767             if (this_is_library_file)
3768               string = find_file (string);
3769             store_arg (string, delete_this_arg, this_is_output_file);
3770             if (this_is_output_file)
3771               outfiles[input_file_number] = string;
3772           }
3773
3774         /* Use pipe */
3775         obstack_1grow (&obstack, c);
3776         arg_going = 1;
3777         break;
3778
3779       case '\t':
3780       case ' ':
3781         /* Space or tab ends an argument if one is pending.  */
3782         if (arg_going)
3783           {
3784             obstack_1grow (&obstack, 0);
3785             string = obstack_finish (&obstack);
3786             if (this_is_library_file)
3787               string = find_file (string);
3788             store_arg (string, delete_this_arg, this_is_output_file);
3789             if (this_is_output_file)
3790               outfiles[input_file_number] = string;
3791           }
3792         /* Reinitialize for a new argument.  */
3793         arg_going = 0;
3794         delete_this_arg = 0;
3795         this_is_output_file = 0;
3796         this_is_library_file = 0;
3797         break;
3798
3799       case '%':
3800         switch (c = *p++)
3801           {
3802           case 0:
3803             fatal ("Invalid specification!  Bug in cc.");
3804
3805           case 'b':
3806             obstack_grow (&obstack, input_basename, basename_length);
3807             arg_going = 1;
3808             break;
3809
3810           case 'B':
3811             obstack_grow (&obstack, input_basename, suffixed_basename_length);
3812             arg_going = 1;
3813             break;
3814
3815           case 'd':
3816             delete_this_arg = 2;
3817             break;
3818
3819           /* Dump out the directories specified with LIBRARY_PATH,
3820              followed by the absolute directories
3821              that we search for startfiles.  */
3822           case 'D':
3823             {
3824               struct prefix_list *pl = startfile_prefixes.plist;
3825               size_t bufsize = 100;
3826               char *buffer = (char *) xmalloc (bufsize);
3827               int idx;
3828
3829               for (; pl; pl = pl->next)
3830                 {
3831 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
3832                   /* Used on systems which record the specified -L dirs
3833                      and use them to search for dynamic linking.  */
3834                   /* Relative directories always come from -B,
3835                      and it is better not to use them for searching
3836                      at run time.  In particular, stage1 loses.  */
3837                   if (!IS_DIR_SEPARATOR (pl->prefix[0]))
3838                     continue;
3839 #endif
3840                   /* Try subdirectory if there is one.  */
3841                   if (multilib_dir != NULL)
3842                     {
3843                       if (machine_suffix)
3844                         {
3845                           if (strlen (pl->prefix) + strlen (machine_suffix)
3846                               >= bufsize)
3847                             bufsize = (strlen (pl->prefix)
3848                                        + strlen (machine_suffix)) * 2 + 1;
3849                           buffer = (char *) xrealloc (buffer, bufsize);
3850                           strcpy (buffer, pl->prefix);
3851                           strcat (buffer, machine_suffix);
3852                           if (is_directory (buffer, multilib_dir, 1))
3853                             {
3854                               do_spec_1 ("-L", 0, NULL_PTR);
3855 #ifdef SPACE_AFTER_L_OPTION
3856                               do_spec_1 (" ", 0, NULL_PTR);
3857 #endif
3858                               do_spec_1 (buffer, 1, NULL_PTR);
3859                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3860                               /* Make this a separate argument.  */
3861                               do_spec_1 (" ", 0, NULL_PTR);
3862                             }
3863                         }
3864                       if (!pl->require_machine_suffix)
3865                         {
3866                           if (is_directory (pl->prefix, multilib_dir, 1))
3867                             {
3868                               do_spec_1 ("-L", 0, NULL_PTR);
3869 #ifdef SPACE_AFTER_L_OPTION
3870                               do_spec_1 (" ", 0, NULL_PTR);
3871 #endif
3872                               do_spec_1 (pl->prefix, 1, NULL_PTR);
3873                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3874                               /* Make this a separate argument.  */
3875                               do_spec_1 (" ", 0, NULL_PTR);
3876                             }
3877                         }
3878                     }
3879                   if (machine_suffix)
3880                     {
3881                       if (is_directory (pl->prefix, machine_suffix, 1))
3882                         {
3883                           do_spec_1 ("-L", 0, NULL_PTR);
3884 #ifdef SPACE_AFTER_L_OPTION
3885                           do_spec_1 (" ", 0, NULL_PTR);
3886 #endif
3887                           do_spec_1 (pl->prefix, 1, NULL_PTR);
3888                           /* Remove slash from machine_suffix.  */
3889                           if (strlen (machine_suffix) >= bufsize)
3890                             bufsize = strlen (machine_suffix) * 2 + 1;
3891                           buffer = (char *) xrealloc (buffer, bufsize);
3892                           strcpy (buffer, machine_suffix);
3893                           idx = strlen (buffer);
3894                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
3895                             buffer[idx - 1] = 0;
3896                           do_spec_1 (buffer, 1, NULL_PTR);
3897                           /* Make this a separate argument.  */
3898                           do_spec_1 (" ", 0, NULL_PTR);
3899                         }
3900                     }
3901                   if (!pl->require_machine_suffix)
3902                     {
3903                       if (is_directory (pl->prefix, "", 1))
3904                         {
3905                           do_spec_1 ("-L", 0, NULL_PTR);
3906 #ifdef SPACE_AFTER_L_OPTION
3907                           do_spec_1 (" ", 0, NULL_PTR);
3908 #endif
3909                           /* Remove slash from pl->prefix.  */
3910                           if (strlen (pl->prefix) >= bufsize)
3911                             bufsize = strlen (pl->prefix) * 2 + 1;
3912                           buffer = (char *) xrealloc (buffer, bufsize);
3913                           strcpy (buffer, pl->prefix);
3914                           idx = strlen (buffer);
3915                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
3916                             buffer[idx - 1] = 0;
3917                           do_spec_1 (buffer, 1, NULL_PTR);
3918                           /* Make this a separate argument.  */
3919                           do_spec_1 (" ", 0, NULL_PTR);
3920                         }
3921                     }
3922                 }
3923               free (buffer);
3924             }
3925             break;
3926
3927           case 'e':
3928             /* %efoo means report an error with `foo' as error message
3929                and don't execute any more commands for this file.  */
3930             {
3931               const char *q = p;
3932               char *buf;
3933               while (*p != 0 && *p != '\n')
3934                 p++;
3935               buf = (char *) alloca (p - q + 1);
3936               strncpy (buf, q, p - q);
3937               buf[p - q] = 0;
3938               error ("%s", buf);
3939               return -1;
3940             }
3941             break;
3942
3943           case 'j':
3944             {
3945               struct stat st;
3946
3947               /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined,
3948                  and it is not a directory, and it is writable, use it.
3949                  Otherwise, fall through and treat this like any other
3950                  temporary file.  */
3951
3952               if ((!save_temps_flag)
3953                   && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
3954                   && (access (HOST_BIT_BUCKET, W_OK) == 0))
3955                 {
3956                   obstack_grow (&obstack, HOST_BIT_BUCKET,
3957                                 strlen (HOST_BIT_BUCKET));
3958                   delete_this_arg = 0;
3959                   arg_going = 1;
3960                   break;
3961                 }
3962             }
3963           case 'g':
3964           case 'u':
3965           case 'U':
3966             if (save_temps_flag)
3967               {
3968                 obstack_grow (&obstack, input_basename, basename_length);
3969                 delete_this_arg = 0;
3970               }
3971             else
3972               {
3973                 struct temp_name *t;
3974                 int suffix_length;
3975                 const char *suffix = p;
3976                 char *saved_suffix = NULL;
3977
3978                 while (*p == '.' || ISALPHA ((unsigned char) *p))
3979                   p++;
3980                 suffix_length = p - suffix;
3981                 if (p[0] == '%' && p[1] == 'O')
3982                   {
3983                     p += 2;
3984                     /* We don't support extra suffix characters after %O.  */
3985                     if (*p == '.' || ISALPHA ((unsigned char) *p))
3986                       abort ();
3987                     if (suffix_length == 0)
3988                       suffix = OBJECT_SUFFIX;
3989                     else
3990                       {
3991                         saved_suffix
3992                           = (char *) xmalloc (suffix_length
3993                                               + strlen (OBJECT_SUFFIX));
3994                         strncpy (saved_suffix, suffix, suffix_length);
3995                         strcpy (saved_suffix + suffix_length,
3996                                 OBJECT_SUFFIX);
3997                       }
3998                     suffix_length += strlen (OBJECT_SUFFIX);
3999                   }
4000
4001                 /* See if we already have an association of %g/%u/%U and
4002                    suffix.  */
4003                 for (t = temp_names; t; t = t->next)
4004                   if (t->length == suffix_length
4005                       && strncmp (t->suffix, suffix, suffix_length) == 0
4006                       && t->unique == (c != 'g'))
4007                     break;
4008
4009                 /* Make a new association if needed.  %u and %j require one.  */
4010                 if (t == 0 || c == 'u' || c == 'j')
4011                   {
4012                     if (t == 0)
4013                       {
4014                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4015                         t->next = temp_names;
4016                         temp_names = t;
4017                       }
4018                     t->length = suffix_length;
4019                     t->suffix = save_string (suffix, suffix_length);
4020                     t->unique = (c != 'g');
4021                     temp_filename = make_temp_file (t->suffix);
4022                     temp_filename_length = strlen (temp_filename);
4023                     t->filename = temp_filename;
4024                     t->filename_length = temp_filename_length;
4025                   }
4026
4027                 if (saved_suffix)
4028                   free (saved_suffix);
4029
4030                 obstack_grow (&obstack, t->filename, t->filename_length);
4031                 delete_this_arg = 1;
4032               }
4033             arg_going = 1;
4034             break;
4035
4036           case 'i':
4037             obstack_grow (&obstack, input_filename, input_filename_length);
4038             arg_going = 1;
4039             break;
4040
4041           case 'I':
4042             {
4043               struct prefix_list *pl = include_prefixes.plist;
4044
4045               if (gcc_exec_prefix)
4046                 {
4047                   do_spec_1 ("-iprefix", 1, NULL_PTR);
4048                   /* Make this a separate argument.  */
4049                   do_spec_1 (" ", 0, NULL_PTR);
4050                   do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
4051                   do_spec_1 (" ", 0, NULL_PTR);
4052                 }
4053
4054               for (; pl; pl = pl->next)
4055                 {
4056                   do_spec_1 ("-isystem", 1, NULL_PTR);
4057                   /* Make this a separate argument.  */
4058                   do_spec_1 (" ", 0, NULL_PTR);
4059                   do_spec_1 (pl->prefix, 1, NULL_PTR);
4060                   do_spec_1 (" ", 0, NULL_PTR);
4061                 }
4062             }
4063             break;
4064
4065           case 'o':
4066             {
4067               int max = n_infiles;
4068               max += lang_specific_extra_outfiles;
4069
4070               for (i = 0; i < max; i++)
4071                 if (outfiles[i])
4072                   store_arg (outfiles[i], 0, 0);
4073               break;
4074             }
4075
4076           case 'O':
4077             obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
4078             arg_going = 1;
4079             break;
4080
4081           case 's':
4082             this_is_library_file = 1;
4083             break;
4084
4085           case 'w':
4086             this_is_output_file = 1;
4087             break;
4088
4089           case 'W':
4090             {
4091               int cur_index = argbuf_index;
4092               /* Handle the {...} following the %W.  */
4093               if (*p != '{')
4094                 abort ();
4095               p = handle_braces (p + 1);
4096               if (p == 0)
4097                 return -1;
4098               /* If any args were output, mark the last one for deletion
4099                  on failure.  */
4100               if (argbuf_index != cur_index)
4101                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4102               break;
4103             }
4104
4105           /* %x{OPTION} records OPTION for %X to output.  */
4106           case 'x':
4107             {
4108               const char *p1 = p;
4109               char *string;
4110
4111               /* Skip past the option value and make a copy.  */
4112               if (*p != '{')
4113                 abort ();
4114               while (*p++ != '}')
4115                 ;
4116               string = save_string (p1 + 1, p - p1 - 2);
4117
4118               /* See if we already recorded this option.  */
4119               for (i = 0; i < n_linker_options; i++)
4120                 if (! strcmp (string, linker_options[i]))
4121                   {
4122                     free (string);
4123                     return 0;
4124                   }
4125
4126               /* This option is new; add it.  */
4127               add_linker_option (string, strlen (string));
4128             }
4129             break;
4130
4131           /* Dump out the options accumulated previously using %x.  */
4132           case 'X':
4133             for (i = 0; i < n_linker_options; i++)
4134               {
4135                 do_spec_1 (linker_options[i], 1, NULL_PTR);
4136                 /* Make each accumulated option a separate argument.  */
4137                 do_spec_1 (" ", 0, NULL_PTR);
4138               }
4139             break;
4140
4141           /* Dump out the options accumulated previously using -Wa,.  */
4142           case 'Y':
4143             for (i = 0; i < n_assembler_options; i++)
4144               {
4145                 do_spec_1 (assembler_options[i], 1, NULL_PTR);
4146                 /* Make each accumulated option a separate argument.  */
4147                 do_spec_1 (" ", 0, NULL_PTR);
4148               }
4149             break;
4150
4151           /* Dump out the options accumulated previously using -Wp,.  */
4152           case 'Z':
4153             for (i = 0; i < n_preprocessor_options; i++)
4154               {
4155                 do_spec_1 (preprocessor_options[i], 1, NULL_PTR);
4156                 /* Make each accumulated option a separate argument.  */
4157                 do_spec_1 (" ", 0, NULL_PTR);
4158               }
4159             break;
4160
4161             /* Here are digits and numbers that just process
4162                a certain constant string as a spec.  */
4163
4164           case '1':
4165             value = do_spec_1 (cc1_spec, 0, NULL_PTR);
4166             if (value != 0)
4167               return value;
4168             break;
4169
4170           case '2':
4171             value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
4172             if (value != 0)
4173               return value;
4174             break;
4175
4176           case 'a':
4177             value = do_spec_1 (asm_spec, 0, NULL_PTR);
4178             if (value != 0)
4179               return value;
4180             break;
4181
4182           case 'A':
4183             value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
4184             if (value != 0)
4185               return value;
4186             break;
4187
4188           case 'c':
4189             value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
4190             if (value != 0)
4191               return value;
4192             break;
4193
4194           case 'C':
4195             value = do_spec_1 (cpp_spec, 0, NULL_PTR);
4196             if (value != 0)
4197               return value;
4198             break;
4199
4200           case 'E':
4201             value = do_spec_1 (endfile_spec, 0, NULL_PTR);
4202             if (value != 0)
4203               return value;
4204             break;
4205
4206           case 'l':
4207             value = do_spec_1 (link_spec, 0, NULL_PTR);
4208             if (value != 0)
4209               return value;
4210             break;
4211
4212           case 'L':
4213             value = do_spec_1 (lib_spec, 0, NULL_PTR);
4214             if (value != 0)
4215               return value;
4216             break;
4217
4218           case 'G':
4219             value = do_spec_1 (libgcc_spec, 0, NULL_PTR);
4220             if (value != 0)
4221               return value;
4222             break;
4223
4224           case 'p':
4225             {
4226               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4227               char *buf = x;
4228               const char *y;
4229
4230               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
4231               y = cpp_predefines;
4232               while (*y != 0)
4233                 {
4234                   if (! strncmp (y, "-D", 2))
4235                     /* Copy the whole option.  */
4236                     while (*y && *y != ' ' && *y != '\t')
4237                       *x++ = *y++;
4238                   else if (*y == ' ' || *y == '\t')
4239                     /* Copy whitespace to the result.  */
4240                     *x++ = *y++;
4241                   /* Don't copy other options.  */
4242                   else
4243                     y++;
4244                 }
4245
4246               *x = 0;
4247
4248               value = do_spec_1 (buf, 0, NULL_PTR);
4249               if (value != 0)
4250                 return value;
4251             }
4252             break;
4253
4254           case 'P':
4255             {
4256               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4257               char *buf = x;
4258               const char *y;
4259
4260               /* Copy all of CPP_PREDEFINES into BUF,
4261                  but force them all into the reserved name space if they
4262                  aren't already there.  The reserved name space is all
4263                  identifiers beginning with two underscores or with one
4264                  underscore and a capital letter.  We do the forcing by
4265                  adding up to two underscores to the beginning and end
4266                  of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4267                  become __mips__.  */
4268               y = cpp_predefines;
4269               while (*y != 0)
4270                 {
4271                   if (! strncmp (y, "-D", 2))
4272                     {
4273                       int flag = 0;
4274
4275                       *x++ = *y++;
4276                       *x++ = *y++;
4277
4278                       if (*y != '_'
4279                           || (*(y + 1) != '_'
4280                               && ! ISUPPER ((unsigned char) *(y + 1))))
4281                         {
4282                           /* Stick __ at front of macro name.  */
4283                           if (*y != '_')
4284                             *x++ = '_';
4285                           *x++ = '_';
4286                           /* Arrange to stick __ at the end as well.  */
4287                           flag = 1;
4288                         }
4289
4290                       /* Copy the macro name.  */
4291                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
4292                         *x++ = *y++;
4293
4294                       if (flag)
4295                         {
4296                           if (x[-1] != '_')
4297                             {
4298                               if (x[-2] != '_')
4299                                 *x++ = '_';
4300                               *x++ = '_';
4301                             }
4302                         }
4303
4304                       /* Copy the value given, if any.  */
4305                       while (*y && *y != ' ' && *y != '\t')
4306                         *x++ = *y++;
4307                     }
4308                   else if (*y == ' ' || *y == '\t')
4309                     /* Copy whitespace to the result.  */
4310                     *x++ = *y++;
4311                   /* Don't copy -A options  */
4312                   else
4313                     y++;
4314                 }
4315               *x++ = ' ';
4316
4317               /* Copy all of CPP_PREDEFINES into BUF,
4318                  but put __ after every -D.  */
4319               y = cpp_predefines;
4320               while (*y != 0)
4321                 {
4322                   if (! strncmp (y, "-D", 2))
4323                     {
4324                       y += 2;
4325
4326                       if (*y != '_'
4327                           || (*(y + 1) != '_'
4328                               && ! ISUPPER ((unsigned char) *(y + 1))))
4329                         {
4330                           /* Stick -D__ at front of macro name.  */
4331                           *x++ = '-';
4332                           *x++ = 'D';
4333                           if (*y != '_')
4334                             *x++ = '_';
4335                           *x++ = '_';
4336
4337                           /* Copy the macro name.  */
4338                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
4339                             *x++ = *y++;
4340
4341                           /* Copy the value given, if any.  */
4342                           while (*y && *y != ' ' && *y != '\t')
4343                             *x++ = *y++;
4344                         }
4345                       else
4346                         {
4347                           /* Do not copy this macro - we have just done it before */
4348                           while (*y && *y != ' ' && *y != '\t')
4349                             y++;
4350                         }
4351                     }
4352                   else if (*y == ' ' || *y == '\t')
4353                     /* Copy whitespace to the result.  */
4354                     *x++ = *y++;
4355                   /* Don't copy -A options.  */
4356                   else
4357                     y++;
4358                 }
4359               *x++ = ' ';
4360
4361               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4362               y = cpp_predefines;
4363               while (*y != 0)
4364                 {
4365                   if (! strncmp (y, "-A", 2))
4366                     /* Copy the whole option.  */
4367                     while (*y && *y != ' ' && *y != '\t')
4368                       *x++ = *y++;
4369                   else if (*y == ' ' || *y == '\t')
4370                     /* Copy whitespace to the result.  */
4371                     *x++ = *y++;
4372                   /* Don't copy other options.  */
4373                   else
4374                     y++;
4375                 }
4376
4377               *x = 0;
4378
4379               value = do_spec_1 (buf, 0, NULL_PTR);
4380               if (value != 0)
4381                 return value;
4382             }
4383             break;
4384
4385           case 'S':
4386             value = do_spec_1 (startfile_spec, 0, NULL_PTR);
4387             if (value != 0)
4388               return value;
4389             break;
4390
4391             /* Here we define characters other than letters and digits.  */
4392
4393           case '{':
4394             p = handle_braces (p);
4395             if (p == 0)
4396               return -1;
4397             break;
4398
4399           case '%':
4400             obstack_1grow (&obstack, '%');
4401             break;
4402
4403           case '*':
4404             if (soft_matched_part)
4405               {
4406                 do_spec_1 (soft_matched_part, 1, NULL_PTR);
4407                 do_spec_1 (" ", 0, NULL_PTR);
4408               }
4409             else
4410               /* Catch the case where a spec string contains something like
4411                  '%{foo:%*}'.  ie there is no * in the pattern on the left
4412                  hand side of the :.  */
4413               error ("Spec failure: '%%*' has not been initialised by pattern match");
4414             break;
4415
4416             /* Process a string found as the value of a spec given by name.
4417                This feature allows individual machine descriptions
4418                to add and use their own specs.
4419                %[...] modifies -D options the way %P does;
4420                %(...) uses the spec unmodified.  */
4421           case '[':
4422             error ("Warning: use of obsolete %%[ operator in specs");
4423           case '(':
4424             {
4425               const char *name = p;
4426               struct spec_list *sl;
4427               int len;
4428
4429               /* The string after the S/P is the name of a spec that is to be
4430                  processed.  */
4431               while (*p && *p != ')' && *p != ']')
4432                 p++;
4433
4434               /* See if it's in the list.  */
4435               for (len = p - name, sl = specs; sl; sl = sl->next)
4436                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4437                   {
4438                     name = *(sl->ptr_spec);
4439 #ifdef DEBUG_SPECS
4440                     notice ("Processing spec %c%s%c, which is '%s'\n",
4441                             c, sl->name, (c == '(') ? ')' : ']', name);
4442 #endif
4443                     break;
4444                   }
4445
4446               if (sl)
4447                 {
4448                   if (c == '(')
4449                     {
4450                       value = do_spec_1 (name, 0, NULL_PTR);
4451                       if (value != 0)
4452                         return value;
4453                     }
4454                   else
4455                     {
4456                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4457                       char *buf = x;
4458                       const char *y = name;
4459                       int flag = 0;
4460
4461                       /* Copy all of NAME into BUF, but put __ after
4462                          every -D and at the end of each arg.  */
4463                       while (1)
4464                         {
4465                           if (! strncmp (y, "-D", 2))
4466                             {
4467                               *x++ = '-';
4468                               *x++ = 'D';
4469                               *x++ = '_';
4470                               *x++ = '_';
4471                               y += 2;
4472                               flag = 1;
4473                               continue;
4474                             }
4475                           else if (flag
4476                                    && (*y == ' ' || *y == '\t' || *y == '='
4477                                        || *y == '}' || *y == 0))
4478                             {
4479                               *x++ = '_';
4480                               *x++ = '_';
4481                               flag = 0;
4482                             }
4483                           if (*y == 0)
4484                             break;
4485                           else
4486                             *x++ = *y++;
4487                         }
4488                       *x = 0;
4489
4490                       value = do_spec_1 (buf, 0, NULL_PTR);
4491                       if (value != 0)
4492                         return value;
4493                     }
4494                 }
4495
4496               /* Discard the closing paren or bracket.  */
4497               if (*p)
4498                 p++;
4499             }
4500             break;
4501
4502           case 'v':
4503             {
4504               int c1 = *p++;  /* Select first or second version number.  */
4505               const char *v = compiler_version;
4506               const char *q;
4507               static const char zeroc = '0';
4508
4509               /* The format of the version string is
4510                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
4511
4512               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
4513               while (! ISDIGIT (*v))
4514                 v++;
4515               if (v > compiler_version && v[-1] != '-')
4516                 abort ();
4517
4518               /* If desired, advance to second version number.  */
4519               if (c1 >= '2')
4520                 {
4521                   /* Set V after the first period.  */
4522                   while (ISDIGIT (*v))
4523                     v++;
4524                   if (*v != '.')
4525                     abort ();
4526                   v++;
4527                 }
4528
4529               /* If desired, advance to third version number.
4530                  But don't complain if it's not present */
4531               if (c1 == '3')
4532                 {
4533                   /* Set V after the second period.  */
4534                   while (ISDIGIT (*v))
4535                     v++;
4536                   if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
4537                     abort ();
4538                   if (*v != 0)
4539                     v++;
4540                 }
4541
4542               /* Set Q at the next period or at the end.  */
4543               q = v;
4544               while (ISDIGIT (*q))
4545                 q++;
4546               if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
4547                 abort ();
4548
4549               if (q > v)
4550                 /* Put that part into the command.  */
4551                 obstack_grow (&obstack, v, q - v);
4552               else
4553                 /* Default to "0" */
4554                 obstack_grow (&obstack, &zeroc, 1);
4555               arg_going = 1;
4556             }
4557             break;
4558
4559           case '|':
4560             if (input_from_pipe)
4561               do_spec_1 ("-", 0, NULL_PTR);
4562             break;
4563
4564           default:
4565             error ("Spec failure: Unrecognised spec option '%c'", c);
4566             break;
4567           }
4568         break;
4569
4570       case '\\':
4571         /* Backslash: treat next character as ordinary.  */
4572         c = *p++;
4573
4574         /* fall through */
4575       default:
4576         /* Ordinary character: put it into the current argument.  */
4577         obstack_1grow (&obstack, c);
4578         arg_going = 1;
4579       }
4580
4581   /* End of string.  */
4582   return 0;
4583 }
4584
4585 /* Return 0 if we call do_spec_1 and that returns -1.  */
4586
4587 static const char *
4588 handle_braces (p)
4589      register const char *p;
4590 {
4591   const char *filter, *body = NULL, *endbody = NULL;
4592   int pipe_p = 0;
4593   int negate;
4594   int suffix;
4595   int include_blanks = 1;
4596   int elide_switch = 0;
4597
4598   if (*p == '^')
4599     {
4600       /* A '^' after the open-brace means to not give blanks before args.  */
4601       include_blanks = 0;
4602       ++p;
4603     }
4604
4605   if (*p == '|')
4606     {
4607       /* A `|' after the open-brace means,
4608          if the test fails, output a single minus sign rather than nothing.
4609          This is used in %{|!pipe:...}.  */
4610       pipe_p = 1;
4611       ++p;
4612     }
4613
4614   if (*p == '<')
4615     {
4616       /* A `<' after the open-brace means that the switch should be
4617          removed from the command-line.  */
4618       elide_switch = 1;
4619       ++p;
4620     }
4621
4622 next_member:
4623   negate = suffix = 0;
4624
4625   if (*p == '!')
4626     /* A `!' after the open-brace negates the condition:
4627        succeed if the specified switch is not present.  */
4628     negate = 1, ++p;
4629
4630   if (*p == '.')
4631     /* A `.' after the open-brace means test against the current suffix.  */
4632     {
4633       if (pipe_p)
4634         abort ();
4635
4636       suffix = 1;
4637       ++p;
4638     }
4639
4640   if (elide_switch && (negate || pipe_p || suffix))
4641     {
4642       /* It doesn't make sense to mix elision with other flags.  We
4643          could fatal() here, but the standard seems to be to abort.  */
4644       abort ();
4645     }
4646
4647   filter = p;
4648   while (*p != ':' && *p != '}' && *p != '|')
4649     p++;
4650
4651   if (*p == '|' && pipe_p)
4652     abort ();
4653
4654   if (!body)
4655     {
4656       if (*p != '}')
4657         {
4658           register int count = 1;
4659           register const char *q = p;
4660
4661           while (*q++ != ':')
4662             continue;
4663           body = q;
4664
4665           while (count > 0)
4666             {
4667               if (*q == '{')
4668                 count++;
4669               else if (*q == '}')
4670                 count--;
4671               else if (*q == 0)
4672                 abort ();
4673               q++;
4674             }
4675           endbody = q;
4676         }
4677       else
4678         body = p, endbody = p + 1;
4679     }
4680
4681   if (suffix)
4682     {
4683       int found = (input_suffix != 0
4684                    && (long) strlen (input_suffix) == (long) (p - filter)
4685                    && strncmp (input_suffix, filter, p - filter) == 0);
4686
4687       if (body[0] == '}')
4688         abort ();
4689
4690       if (negate != found
4691           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL_PTR) < 0)
4692         return 0;
4693     }
4694   else if (p[-1] == '*' && p[0] == '}')
4695     {
4696       /* Substitute all matching switches as separate args.  */
4697       register int i;
4698       --p;
4699       for (i = 0; i < n_switches; i++)
4700         if (!strncmp (switches[i].part1, filter, p - filter)
4701             && check_live_switch (i, p - filter))
4702           give_switch (i, 0, include_blanks);
4703     }
4704   else
4705     {
4706       /* Test for presence of the specified switch.  */
4707       register int i;
4708       int present = 0;
4709
4710       /* If name specified ends in *, as in {x*:...},
4711          check for %* and handle that case.  */
4712       if (p[-1] == '*' && !negate)
4713         {
4714           int substitution;
4715           const char *r = body;
4716
4717           /* First see whether we have %*.  */
4718           substitution = 0;
4719           while (r < endbody)
4720             {
4721               if (*r == '%' && r[1] == '*')
4722                 substitution = 1;
4723               r++;
4724             }
4725           /* If we do, handle that case.  */
4726           if (substitution)
4727             {
4728               /* Substitute all matching switches as separate args.
4729                  But do this by substituting for %*
4730                  in the text that follows the colon.  */
4731
4732               unsigned hard_match_len = p - filter - 1;
4733               char *string = save_string (body, endbody - body - 1);
4734
4735               for (i = 0; i < n_switches; i++)
4736                 if (!strncmp (switches[i].part1, filter, hard_match_len)
4737                     && check_live_switch (i, -1))
4738                   {
4739                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4740                     /* Pass any arguments this switch has.  */
4741                     give_switch (i, 1, 1);
4742                   }
4743
4744               /* We didn't match.  Try again.  */
4745               if (*p++ == '|')
4746                 goto next_member;
4747               return endbody;
4748             }
4749         }
4750
4751       /* If name specified ends in *, as in {x*:...},
4752          check for presence of any switch name starting with x.  */
4753       if (p[-1] == '*')
4754         {
4755           for (i = 0; i < n_switches; i++)
4756             {
4757               unsigned hard_match_len = p - filter - 1;
4758
4759               if (!strncmp (switches[i].part1, filter, hard_match_len)
4760                   && check_live_switch (i, hard_match_len))
4761                 {
4762                   present = 1;
4763                   break;
4764                 }
4765             }
4766         }
4767       /* Otherwise, check for presence of exact name specified.  */
4768       else
4769         {
4770           for (i = 0; i < n_switches; i++)
4771             {
4772               if (!strncmp (switches[i].part1, filter, p - filter)
4773                   && switches[i].part1[p - filter] == 0
4774                   && check_live_switch (i, -1))
4775                 {
4776                   present = 1;
4777                   break;
4778                 }
4779             }
4780         }
4781
4782       /* If it is as desired (present for %{s...}, absent for %{!s...})
4783          then substitute either the switch or the specified
4784          conditional text.  */
4785       if (present != negate)
4786         {
4787           if (elide_switch)
4788             {
4789               switches[i].live_cond = SWITCH_IGNORE;
4790               switches[i].validated = 1;
4791             }
4792           else if (*p == '}')
4793             {
4794               give_switch (i, 0, include_blanks);
4795             }
4796           else
4797             {
4798               if (do_spec_1 (save_string (body, endbody - body - 1),
4799                              0, NULL_PTR) < 0)
4800                 return 0;
4801             }
4802         }
4803       else if (pipe_p)
4804         {
4805           /* Here if a %{|...} conditional fails: output a minus sign,
4806              which means "standard output" or "standard input".  */
4807           do_spec_1 ("-", 0, NULL_PTR);
4808           return endbody;
4809         }
4810     }
4811
4812   /* We didn't match; try again.  */
4813   if (*p++ == '|')
4814     goto next_member;
4815
4816   return endbody;
4817 }
4818 \f
4819 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4820    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
4821    spec, or -1 if either exact match or %* is used.
4822
4823    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
4824    whose value does not begin with "no-" is obsoleted by the same value
4825    with the "no-", similarly for a switch with the "no-" prefix.  */
4826
4827 static int
4828 check_live_switch (switchnum, prefix_length)
4829      int switchnum;
4830      int prefix_length;
4831 {
4832   const char *name = switches[switchnum].part1;
4833   int i;
4834
4835   /* In the common case of {<at-most-one-letter>*}, a negating
4836      switch would always match, so ignore that case.  We will just
4837      send the conflicting switches to the compiler phase.  */
4838   if (prefix_length >= 0 && prefix_length <= 1)
4839     return 1;
4840
4841   /* If we already processed this switch and determined if it was
4842      live or not, return our past determination.  */
4843   if (switches[switchnum].live_cond != 0)
4844     return switches[switchnum].live_cond > 0;
4845
4846   /* Now search for duplicate in a manner that depends on the name.  */
4847   switch (*name)
4848     {
4849     case 'O':
4850       for (i = switchnum + 1; i < n_switches; i++)
4851         if (switches[i].part1[0] == 'O')
4852           {
4853             switches[switchnum].validated = 1;
4854             switches[switchnum].live_cond = SWITCH_FALSE;
4855             return 0;
4856           }
4857       break;
4858
4859     case 'W':  case 'f':  case 'm':
4860       if (! strncmp (name + 1, "no-", 3))
4861         {
4862           /* We have Xno-YYY, search for XYYY.  */
4863           for (i = switchnum + 1; i < n_switches; i++)
4864             if (switches[i].part1[0] == name[0]
4865                 && ! strcmp (&switches[i].part1[1], &name[4]))
4866               {
4867                 switches[switchnum].validated = 1;
4868                 switches[switchnum].live_cond = SWITCH_FALSE;
4869                 return 0;
4870               }
4871         }
4872       else
4873         {
4874           /* We have XYYY, search for Xno-YYY.  */
4875           for (i = switchnum + 1; i < n_switches; i++)
4876             if (switches[i].part1[0] == name[0]
4877                 && switches[i].part1[1] == 'n'
4878                 && switches[i].part1[2] == 'o'
4879                 && switches[i].part1[3] == '-'
4880                 && !strcmp (&switches[i].part1[4], &name[1]))
4881               {
4882                 switches[switchnum].validated = 1;
4883                 switches[switchnum].live_cond = SWITCH_FALSE;
4884                 return 0;
4885               }
4886         }
4887       break;
4888     }
4889
4890   /* Otherwise the switch is live.  */
4891   switches[switchnum].live_cond = SWITCH_LIVE;
4892   return 1;
4893 }
4894 \f
4895 /* Pass a switch to the current accumulating command
4896    in the same form that we received it.
4897    SWITCHNUM identifies the switch; it is an index into
4898    the vector of switches gcc received, which is `switches'.
4899    This cannot fail since it never finishes a command line.
4900
4901    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
4902
4903    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
4904    of the switch.  */
4905
4906 static void
4907 give_switch (switchnum, omit_first_word, include_blanks)
4908      int switchnum;
4909      int omit_first_word;
4910      int include_blanks;
4911 {
4912   if (switches[switchnum].live_cond == SWITCH_IGNORE)
4913     return;
4914
4915   if (!omit_first_word)
4916     {
4917       do_spec_1 ("-", 0, NULL_PTR);
4918       do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
4919     }
4920
4921   if (switches[switchnum].args != 0)
4922     {
4923       const char **p;
4924       for (p = switches[switchnum].args; *p; p++)
4925         {
4926           if (include_blanks)
4927             do_spec_1 (" ", 0, NULL_PTR);
4928           do_spec_1 (*p, 1, NULL_PTR);
4929         }
4930     }
4931
4932   do_spec_1 (" ", 0, NULL_PTR);
4933   switches[switchnum].validated = 1;
4934 }
4935 \f
4936 /* Search for a file named NAME trying various prefixes including the
4937    user's -B prefix and some standard ones.
4938    Return the absolute file name found.  If nothing is found, return NAME.  */
4939
4940 static const char *
4941 find_file (name)
4942      const char *name;
4943 {
4944   char *newname;
4945
4946   /* Try multilib_dir if it is defined.  */
4947   if (multilib_dir != NULL)
4948     {
4949       char *try;
4950
4951       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
4952       strcpy (try, multilib_dir);
4953       strcat (try, dir_separator_str);
4954       strcat (try, name);
4955
4956       newname = find_a_file (&startfile_prefixes, try, R_OK);
4957
4958       /* If we don't find it in the multi library dir, then fall
4959          through and look for it in the normal places.  */
4960       if (newname != NULL)
4961         return newname;
4962     }
4963
4964   newname = find_a_file (&startfile_prefixes, name, R_OK);
4965   return newname ? newname : name;
4966 }
4967
4968 /* Determine whether a directory exists.  If LINKER, return 0 for
4969    certain fixed names not needed by the linker.  If not LINKER, it is
4970    only important to return 0 if the host machine has a small ARG_MAX
4971    limit.  */
4972
4973 static int
4974 is_directory (path1, path2, linker)
4975      const char *path1;
4976      const char *path2;
4977      int linker;
4978 {
4979   int len1 = strlen (path1);
4980   int len2 = strlen (path2);
4981   char *path = (char *) alloca (3 + len1 + len2);
4982   char *cp;
4983   struct stat st;
4984
4985 #ifndef SMALL_ARG_MAX
4986   if (! linker)
4987     return 1;
4988 #endif
4989
4990   /* Construct the path from the two parts.  Ensure the string ends with "/.".
4991      The resulting path will be a directory even if the given path is a
4992      symbolic link.  */
4993   memcpy (path, path1, len1);
4994   memcpy (path + len1, path2, len2);
4995   cp = path + len1 + len2;
4996   if (!IS_DIR_SEPARATOR (cp[-1]))
4997     *cp++ = DIR_SEPARATOR;
4998   *cp++ = '.';
4999   *cp = '\0';
5000
5001   /* Exclude directories that the linker is known to search.  */
5002   if (linker
5003       && ((cp - path == 6
5004            && strcmp (path, concat (dir_separator_str, "lib",
5005                                     dir_separator_str, ".", NULL_PTR)) == 0)
5006           || (cp - path == 10
5007               && strcmp (path, concat (dir_separator_str, "usr",
5008                                        dir_separator_str, "lib",
5009                                        dir_separator_str, ".", NULL_PTR)) == 0)))
5010     return 0;
5011
5012   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5013 }
5014
5015 /* Set up the various global variables to indicate that we're processing
5016    the input file named FILENAME.  */
5017
5018 static void
5019 set_input (filename)
5020      const char *filename;
5021 {
5022   register const char *p;
5023
5024   input_filename = filename;
5025   input_filename_length = strlen (input_filename);
5026
5027   input_basename = input_filename;
5028 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5029   /* Skip drive name so 'x:foo' is handled properly.  */
5030   if (input_basename[1] == ':')
5031     input_basename += 2;
5032 #endif
5033   for (p = input_basename; *p; p++)
5034     if (IS_DIR_SEPARATOR (*p))
5035       input_basename = p + 1;
5036
5037   /* Find a suffix starting with the last period,
5038      and set basename_length to exclude that suffix.  */
5039   basename_length = strlen (input_basename);
5040   suffixed_basename_length = basename_length;
5041   p = input_basename + basename_length;
5042   while (p != input_basename && *p != '.')
5043     --p;
5044   if (*p == '.' && p != input_basename)
5045     {
5046       basename_length = p - input_basename;
5047       input_suffix = p + 1;
5048     }
5049   else
5050     input_suffix = "";
5051 }
5052 \f
5053 /* On fatal signals, delete all the temporary files.  */
5054
5055 static void
5056 fatal_error (signum)
5057      int signum;
5058 {
5059   signal (signum, SIG_DFL);
5060   delete_failure_queue ();
5061   delete_temp_files ();
5062   /* Get the same signal again, this time not handled,
5063      so its normal effect occurs.  */
5064   kill (getpid (), signum);
5065 }
5066
5067 extern int main PARAMS ((int, const char *const *));
5068
5069 int
5070 main (argc, argv)
5071      int argc;
5072      const char *const *argv;
5073 {
5074   size_t i;
5075   int value;
5076   int linker_was_run = 0;
5077   char *explicit_link_files;
5078   char *specs_file;
5079   const char *p;
5080   struct user_specs *uptr;
5081
5082   p = argv[0] + strlen (argv[0]);
5083   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5084     --p;
5085   programname = p;
5086
5087 #ifdef GCC_DRIVER_HOST_INITIALIZATION
5088   /* Perform host dependant initialization when needed.  */
5089   GCC_DRIVER_HOST_INITIALIZATION;
5090 #endif
5091
5092 #ifdef HAVE_LC_MESSAGES
5093   setlocale (LC_MESSAGES, "");
5094 #endif
5095   (void) bindtextdomain (PACKAGE, localedir);
5096   (void) textdomain (PACKAGE);
5097
5098   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5099     signal (SIGINT, fatal_error);
5100 #ifdef SIGHUP
5101   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5102     signal (SIGHUP, fatal_error);
5103 #endif
5104   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5105     signal (SIGTERM, fatal_error);
5106 #ifdef SIGPIPE
5107   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5108     signal (SIGPIPE, fatal_error);
5109 #endif
5110
5111   argbuf_length = 10;
5112   argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
5113
5114   obstack_init (&obstack);
5115
5116   /* Build multilib_select, et. al from the separate lines that make up each
5117      multilib selection.  */
5118   {
5119     const char *const *q = multilib_raw;
5120     int need_space;
5121
5122     obstack_init (&multilib_obstack);
5123     while ((p = *q++) != (char *) 0)
5124       obstack_grow (&multilib_obstack, p, strlen (p));
5125
5126     obstack_1grow (&multilib_obstack, 0);
5127     multilib_select = obstack_finish (&multilib_obstack);
5128
5129     q = multilib_matches_raw;
5130     while ((p = *q++) != (char *) 0)
5131       obstack_grow (&multilib_obstack, p, strlen (p));
5132
5133     obstack_1grow (&multilib_obstack, 0);
5134     multilib_matches = obstack_finish (&multilib_obstack);
5135
5136     q = multilib_exclusions_raw;
5137     while ((p = *q++) != (char *) 0)
5138       obstack_grow (&multilib_obstack, p, strlen (p));
5139
5140     obstack_1grow (&multilib_obstack, 0);
5141     multilib_exclusions = obstack_finish (&multilib_obstack);
5142
5143     need_space = FALSE;
5144     for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
5145       {
5146         if (need_space)
5147           obstack_1grow (&multilib_obstack, ' ');
5148         obstack_grow (&multilib_obstack,
5149                       multilib_defaults_raw[i],
5150                       strlen (multilib_defaults_raw[i]));
5151         need_space = TRUE;
5152       }
5153
5154     obstack_1grow (&multilib_obstack, 0);
5155     multilib_defaults = obstack_finish (&multilib_obstack);
5156   }
5157
5158   /* Set up to remember the pathname of gcc and any options
5159      needed for collect.  We use argv[0] instead of programname because
5160      we need the complete pathname.  */
5161   obstack_init (&collect_obstack);
5162   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
5163   obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
5164   putenv (obstack_finish (&collect_obstack));
5165
5166 #ifdef INIT_ENVIRONMENT
5167   /* Set up any other necessary machine specific environment variables.  */
5168   putenv (INIT_ENVIRONMENT);
5169 #endif
5170
5171   /* Make a table of what switches there are (switches, n_switches).
5172      Make a table of specified input files (infiles, n_infiles).
5173      Decode switches that are handled locally.  */
5174
5175   process_command (argc, argv);
5176
5177   {
5178     int first_time;
5179
5180     /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5181        the compiler.  */
5182     obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5183                   sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5184
5185     first_time = TRUE;
5186     for (i = 0; (int) i < n_switches; i++)
5187       {
5188         const char *const *args;
5189         const char *p, *q;
5190         if (!first_time)
5191           obstack_grow (&collect_obstack, " ", 1);
5192
5193         first_time = FALSE;
5194         obstack_grow (&collect_obstack, "'-", 2);
5195         q = switches[i].part1;
5196         while ((p = index (q, '\'')))
5197           {
5198             obstack_grow (&collect_obstack, q, p - q);
5199             obstack_grow (&collect_obstack, "'\\''", 4);
5200             q = ++p;
5201           }
5202         obstack_grow (&collect_obstack, q, strlen (q));
5203         obstack_grow (&collect_obstack, "'", 1);
5204
5205         for (args = switches[i].args; args && *args; args++)
5206           {
5207             obstack_grow (&collect_obstack, " '", 2);
5208             q = *args;
5209             while ((p = index (q, '\'')))
5210               {
5211                 obstack_grow (&collect_obstack, q, p - q);
5212                 obstack_grow (&collect_obstack, "'\\''", 4);
5213                 q = ++p;
5214               }
5215             obstack_grow (&collect_obstack, q, strlen (q));
5216             obstack_grow (&collect_obstack, "'", 1);
5217           }
5218       }
5219     obstack_grow (&collect_obstack, "\0", 1);
5220     putenv (obstack_finish (&collect_obstack));
5221   }
5222
5223   /* Initialize the vector of specs to just the default.
5224      This means one element containing 0s, as a terminator.  */
5225
5226   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
5227   bcopy ((char *) default_compilers, (char *) compilers,
5228          sizeof default_compilers);
5229   n_compilers = n_default_compilers;
5230
5231   /* Read specs from a file if there is one.  */
5232
5233   machine_suffix = concat (spec_machine, dir_separator_str,
5234                            spec_version, dir_separator_str, NULL_PTR);
5235   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
5236
5237   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
5238   /* Read the specs file unless it is a default one.  */
5239   if (specs_file != 0 && strcmp (specs_file, "specs"))
5240     read_specs (specs_file, TRUE);
5241   else
5242     init_spec ();
5243
5244   /* We need to check standard_exec_prefix/just_machine_suffix/specs
5245      for any override of as, ld and libraries.  */
5246   specs_file = (char *) alloca (strlen (standard_exec_prefix)
5247                                 + strlen (just_machine_suffix)
5248                                 + sizeof ("specs"));
5249
5250   strcpy (specs_file, standard_exec_prefix);
5251   strcat (specs_file, just_machine_suffix);
5252   strcat (specs_file, "specs");
5253   if (access (specs_file, R_OK) == 0)
5254     read_specs (specs_file, TRUE);
5255
5256   /* If not cross-compiling, look for startfiles in the standard places.  */
5257   if (*cross_compile == '0')
5258     {
5259 #ifdef MD_EXEC_PREFIX
5260       add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
5261                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5262       add_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
5263                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5264 #endif
5265
5266 #ifdef MD_STARTFILE_PREFIX
5267       add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5268                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5269 #endif
5270
5271 #ifdef MD_STARTFILE_PREFIX_1
5272       add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5273                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5274 #endif
5275
5276       /* If standard_startfile_prefix is relative, base it on
5277          standard_exec_prefix.  This lets us move the installed tree
5278          as a unit.  If GCC_EXEC_PREFIX is defined, base
5279          standard_startfile_prefix on that as well.  */
5280       if (IS_DIR_SEPARATOR (*standard_startfile_prefix)
5281             || *standard_startfile_prefix == '$'
5282 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5283             /* Check for disk name on MS-DOS-based systems.  */
5284           || (standard_startfile_prefix[1] == ':'
5285               && (IS_DIR_SEPARATOR (standard_startfile_prefix[2])))
5286 #endif
5287           )
5288         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5289                     PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5290       else
5291         {
5292           if (gcc_exec_prefix)
5293             add_prefix (&startfile_prefixes,
5294                         concat (gcc_exec_prefix, machine_suffix,
5295                                 standard_startfile_prefix, NULL_PTR),
5296                         NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5297           add_prefix (&startfile_prefixes,
5298                       concat (standard_exec_prefix,
5299                               machine_suffix,
5300                               standard_startfile_prefix, NULL_PTR),
5301                       NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5302         }
5303
5304       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5305                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5306       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5307                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5308 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
5309       add_prefix (&startfile_prefixes, "./", NULL_PTR,
5310                   PREFIX_PRIORITY_LAST, 1, NULL_PTR);
5311 #endif
5312     }
5313   else
5314     {
5315       if (!IS_DIR_SEPARATOR (*standard_startfile_prefix) && gcc_exec_prefix)
5316         add_prefix (&startfile_prefixes,
5317                     concat (gcc_exec_prefix, machine_suffix,
5318                             standard_startfile_prefix, NULL_PTR),
5319                     "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5320     }
5321
5322   /* Process any user specified specs in the order given on the command
5323      line.  */
5324   for (uptr = user_specs_head; uptr; uptr = uptr->next)
5325     {
5326       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5327       read_specs (filename ? filename : uptr->filename, FALSE);
5328     }
5329
5330   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
5331   if (gcc_exec_prefix)
5332     {
5333       char *temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5334                                      + strlen (spec_version)
5335                                      + strlen (spec_machine) + 3);
5336       strcpy (temp, gcc_exec_prefix);
5337       strcat (temp, spec_machine);
5338       strcat (temp, dir_separator_str);
5339       strcat (temp, spec_version);
5340       strcat (temp, dir_separator_str);
5341       gcc_exec_prefix = temp;
5342     }
5343
5344   /* Now we have the specs.
5345      Set the `valid' bits for switches that match anything in any spec.  */
5346
5347   validate_all_switches ();
5348
5349   /* Now that we have the switches and the specs, set
5350      the subdirectory based on the options.  */
5351   set_multilib_dir ();
5352
5353   /* Warn about any switches that no pass was interested in.  */
5354
5355   for (i = 0; (int) i < n_switches; i++)
5356     if (! switches[i].validated)
5357       error ("unrecognized option `-%s'", switches[i].part1);
5358
5359   /* Obey some of the options.  */
5360
5361   if (print_search_dirs)
5362     {
5363       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5364       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5365       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
5366       return (0);
5367     }
5368
5369   if (print_file_name)
5370     {
5371       printf ("%s\n", find_file (print_file_name));
5372       return (0);
5373     }
5374
5375   if (print_prog_name)
5376     {
5377       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
5378       printf ("%s\n", (newname ? newname : print_prog_name));
5379       return (0);
5380     }
5381
5382   if (print_multi_lib)
5383     {
5384       print_multilib_info ();
5385       return (0);
5386     }
5387
5388   if (print_multi_directory)
5389     {
5390       if (multilib_dir == NULL)
5391         printf (".\n");
5392       else
5393         printf ("%s\n", multilib_dir);
5394       return (0);
5395     }
5396
5397   if (print_help_list)
5398     {
5399       display_help ();
5400
5401       if (! verbose_flag)
5402         {
5403           printf (_("\nFor bug reporting instructions, please see:\n"));
5404           printf ("%s.\n", GCCBUGURL);
5405
5406           return (0);
5407         }
5408
5409       /* We do not exit here.  Instead we have created a fake input file
5410          called 'help-dummy' which needs to be compiled, and we pass this
5411          on the the various sub-processes, along with the --help switch.  */
5412     }
5413
5414   if (verbose_flag)
5415     {
5416       int n;
5417
5418       /* compiler_version is truncated at the first space when initialized
5419          from version string, so truncate version_string at the first space
5420          before comparing.  */
5421       for (n = 0; version_string[n]; n++)
5422         if (version_string[n] == ' ')
5423           break;
5424
5425       if (! strncmp (version_string, compiler_version, n)
5426           && compiler_version[n] == 0)
5427         notice ("gcc version %s\n", version_string);
5428       else
5429         notice ("gcc driver version %s executing gcc version %s\n",
5430                 version_string, compiler_version);
5431
5432       if (n_infiles == 0)
5433         return (0);
5434     }
5435
5436   if (n_infiles == added_libraries)
5437     fatal ("No input files");
5438
5439   /* Make a place to record the compiler output file names
5440      that correspond to the input files.  */
5441
5442   i = n_infiles;
5443   i += lang_specific_extra_outfiles;
5444   outfiles = (const char **) xcalloc (i, sizeof (char *));
5445
5446   /* Record which files were specified explicitly as link input.  */
5447
5448   explicit_link_files = xcalloc (1, n_infiles);
5449
5450   for (i = 0; (int) i < n_infiles; i++)
5451     {
5452       register struct compiler *cp = 0;
5453       int this_file_error = 0;
5454
5455       /* Tell do_spec what to substitute for %i.  */
5456
5457       input_file_number = i;
5458       set_input (infiles[i].name);
5459
5460       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5461
5462       outfiles[i] = input_filename;
5463
5464       /* Figure out which compiler from the file's suffix.  */
5465
5466       cp = lookup_compiler (infiles[i].name, input_filename_length,
5467                             infiles[i].language);
5468
5469       if (cp)
5470         {
5471           /* Ok, we found an applicable compiler.  Run its spec.  */
5472
5473           if (cp->spec[0] == '#')
5474             error ("%s: %s compiler not installed on this system",
5475                    input_filename, &cp->spec[1]);
5476           value = do_spec (cp->spec);
5477           if (value < 0)
5478             this_file_error = 1;
5479         }
5480
5481       /* If this file's name does not contain a recognized suffix,
5482          record it as explicit linker input.  */
5483
5484       else
5485         explicit_link_files[i] = 1;
5486
5487       /* Clear the delete-on-failure queue, deleting the files in it
5488          if this compilation failed.  */
5489
5490       if (this_file_error)
5491         {
5492           delete_failure_queue ();
5493           error_count++;
5494         }
5495       /* If this compilation succeeded, don't delete those files later.  */
5496       clear_failure_queue ();
5497     }
5498
5499   /* Reset the output file name to the first input file name, for use
5500      with %b in LINK_SPEC on a target that prefers not to emit a.out
5501      by default.  */
5502   if (n_infiles > 0)
5503     set_input (infiles[0].name);
5504
5505   if (error_count == 0)
5506     {
5507       /* Make sure INPUT_FILE_NUMBER points to first available open
5508          slot.  */
5509       input_file_number = n_infiles;
5510       if (lang_specific_pre_link ())
5511         error_count++;
5512     }
5513
5514   /* Run ld to link all the compiler output files.  */
5515
5516   if (error_count == 0)
5517     {
5518       int tmp = execution_count;
5519
5520       /* We'll use ld if we can't find collect2.  */
5521       if (! strcmp (linker_name_spec, "collect2"))
5522         {
5523           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
5524           if (s == NULL)
5525             linker_name_spec = "ld";
5526         }
5527       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
5528          for collect.  */
5529       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
5530       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
5531
5532       value = do_spec (link_command_spec);
5533       if (value < 0)
5534         error_count = 1;
5535       linker_was_run = (tmp != execution_count);
5536     }
5537
5538   /* If options said don't run linker,
5539      complain about input files to be given to the linker.  */
5540
5541   if (! linker_was_run && error_count == 0)
5542     for (i = 0; (int) i < n_infiles; i++)
5543       if (explicit_link_files[i])
5544         error ("%s: linker input file unused since linking not done",
5545                outfiles[i]);
5546
5547   /* Delete some or all of the temporary files we made.  */
5548
5549   if (error_count)
5550     delete_failure_queue ();
5551   delete_temp_files ();
5552
5553   if (print_help_list)
5554     {
5555       printf (("\nFor bug reporting instructions, please see:\n"));
5556       printf ("%s\n", GCCBUGURL);
5557     }
5558
5559   return (signal_count != 0 ? 2
5560           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
5561           : 0);
5562 }
5563
5564 /* Find the proper compilation spec for the file name NAME,
5565    whose length is LENGTH.  LANGUAGE is the specified language,
5566    or 0 if this file is to be passed to the linker.  */
5567
5568 static struct compiler *
5569 lookup_compiler (name, length, language)
5570      const char *name;
5571      size_t length;
5572      const char *language;
5573 {
5574   struct compiler *cp;
5575
5576   /* If this was specified by the user to be a linker input, indicate that.  */
5577   if (language != 0 && language[0] == '*')
5578     return 0;
5579
5580   /* Otherwise, look for the language, if one is spec'd.  */
5581   if (language != 0)
5582     {
5583       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5584         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
5585           return cp;
5586
5587       error ("language %s not recognized", language);
5588       return 0;
5589     }
5590
5591   /* Look for a suffix.  */
5592   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5593     {
5594       if (/* The suffix `-' matches only the file name `-'.  */
5595           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5596           || (strlen (cp->suffix) < length
5597               /* See if the suffix matches the end of NAME.  */
5598               && !strcmp (cp->suffix,
5599                           name + length - strlen (cp->suffix))
5600          ))
5601         break;
5602     }
5603
5604 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
5605   /* look again, but case-insensitively this time.  */
5606   if (cp < compilers)
5607     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5608       {
5609         if (/* The suffix `-' matches only the file name `-'.  */
5610             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5611             || (strlen (cp->suffix) < length
5612                 /* See if the suffix matches the end of NAME.  */
5613                 && ((!strcmp (cp->suffix,
5614                              name + length - strlen (cp->suffix))
5615                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
5616                     && !strcasecmp (cp->suffix,
5617                                     name + length - strlen (cp->suffix)))
5618            ))
5619           break;
5620       }
5621 #endif
5622
5623   if (cp >= compilers)
5624     {
5625       if (cp->spec[0] != '@')
5626         /* A non-alias entry: return it.  */
5627         return cp;
5628
5629       /* An alias entry maps a suffix to a language.
5630          Search for the language; pass 0 for NAME and LENGTH
5631          to avoid infinite recursion if language not found.  */
5632       return lookup_compiler (NULL_PTR, 0, cp->spec + 1);
5633     }
5634   return 0;
5635 }
5636 \f
5637 static char *
5638 save_string (s, len)
5639      const char *s;
5640      int len;
5641 {
5642   register char *result = xmalloc (len + 1);
5643
5644   bcopy (s, result, len);
5645   result[len] = 0;
5646   return result;
5647 }
5648
5649 static void
5650 pfatal_with_name (name)
5651      const char *name;
5652 {
5653   perror_with_name (name);
5654   delete_temp_files ();
5655   exit (1);
5656 }
5657
5658 static void
5659 perror_with_name (name)
5660      const char *name;
5661 {
5662   error ("%s: %s", name, xstrerror (errno));
5663 }
5664
5665 static void
5666 pfatal_pexecute (errmsg_fmt, errmsg_arg)
5667      const char *errmsg_fmt;
5668      const char *errmsg_arg;
5669 {
5670   if (errmsg_arg)
5671     {
5672       int save_errno = errno;
5673
5674       /* Space for trailing '\0' is in %s.  */
5675       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
5676       sprintf (msg, errmsg_fmt, errmsg_arg);
5677       errmsg_fmt = msg;
5678
5679       errno = save_errno;
5680     }
5681
5682   pfatal_with_name (errmsg_fmt);
5683 }
5684
5685 /* Output an error message and exit */
5686
5687 void
5688 fancy_abort ()
5689 {
5690   fatal ("Internal gcc abort.");
5691 }
5692 \f
5693 /* Output an error message and exit */
5694
5695 void
5696 fatal VPARAMS ((const char *msgid, ...))
5697 {
5698 #ifndef ANSI_PROTOTYPES
5699   const char *msgid;
5700 #endif
5701   va_list ap;
5702
5703   VA_START (ap, msgid);
5704
5705 #ifndef ANSI_PROTOTYPES
5706   msgid = va_arg (ap, const char *);
5707 #endif
5708
5709   fprintf (stderr, "%s: ", programname);
5710   vfprintf (stderr, _(msgid), ap);
5711   va_end (ap);
5712   fprintf (stderr, "\n");
5713   delete_temp_files ();
5714   exit (1);
5715 }
5716
5717 static void
5718 error VPARAMS ((const char *msgid, ...))
5719 {
5720 #ifndef ANSI_PROTOTYPES
5721   const char *msgid;
5722 #endif
5723   va_list ap;
5724
5725   VA_START (ap, msgid);
5726
5727 #ifndef ANSI_PROTOTYPES
5728   msgid = va_arg (ap, const char *);
5729 #endif
5730
5731   fprintf (stderr, "%s: ", programname);
5732   vfprintf (stderr, _(msgid), ap);
5733   va_end (ap);
5734
5735   fprintf (stderr, "\n");
5736 }
5737
5738 static void
5739 notice VPARAMS ((const char *msgid, ...))
5740 {
5741 #ifndef ANSI_PROTOTYPES
5742   const char *msgid;
5743 #endif
5744   va_list ap;
5745
5746   VA_START (ap, msgid);
5747
5748 #ifndef ANSI_PROTOTYPES
5749   msgid = va_arg (ap, const char *);
5750 #endif
5751
5752   vfprintf (stderr, _(msgid), ap);
5753   va_end (ap);
5754 }
5755 \f
5756 static void
5757 validate_all_switches ()
5758 {
5759   struct compiler *comp;
5760   register const char *p;
5761   register char c;
5762   struct spec_list *spec;
5763
5764   for (comp = compilers; comp->spec; comp++)
5765     {
5766       p = comp->spec;
5767       while ((c = *p++))
5768         if (c == '%' && *p == '{')
5769           /* We have a switch spec.  */
5770           validate_switches (p + 1);
5771     }
5772
5773   /* Look through the linked list of specs read from the specs file.  */
5774   for (spec = specs; spec; spec = spec->next)
5775     {
5776       p = *(spec->ptr_spec);
5777       while ((c = *p++))
5778         if (c == '%' && *p == '{')
5779           /* We have a switch spec.  */
5780           validate_switches (p + 1);
5781     }
5782
5783   p = link_command_spec;
5784   while ((c = *p++))
5785     if (c == '%' && *p == '{')
5786       /* We have a switch spec.  */
5787       validate_switches (p + 1);
5788 }
5789
5790 /* Look at the switch-name that comes after START
5791    and mark as valid all supplied switches that match it.  */
5792
5793 static void
5794 validate_switches (start)
5795      const char *start;
5796 {
5797   register const char *p = start;
5798   const char *filter;
5799   register int i;
5800   int suffix = 0;
5801
5802   if (*p == '|')
5803     ++p;
5804
5805   if (*p == '!')
5806     ++p;
5807
5808   if (*p == '.')
5809     suffix = 1, ++p;
5810
5811   filter = p;
5812   while (*p != ':' && *p != '}')
5813     p++;
5814
5815   if (suffix)
5816     ;
5817   else if (p[-1] == '*')
5818     {
5819       /* Mark all matching switches as valid.  */
5820       --p;
5821       for (i = 0; i < n_switches; i++)
5822         if (!strncmp (switches[i].part1, filter, p - filter))
5823           switches[i].validated = 1;
5824     }
5825   else
5826     {
5827       /* Mark an exact matching switch as valid.  */
5828       for (i = 0; i < n_switches; i++)
5829         {
5830           if (!strncmp (switches[i].part1, filter, p - filter)
5831               && switches[i].part1[p - filter] == 0)
5832             switches[i].validated = 1;
5833         }
5834     }
5835 }
5836 \f
5837 /* Check whether a particular argument was used.  The first time we
5838    canonicalize the switches to keep only the ones we care about.  */
5839
5840 static int
5841 used_arg (p, len)
5842      const char *p;
5843      int len;
5844 {
5845   struct mswitchstr
5846   {
5847     const char *str;
5848     const char *replace;
5849     int len;
5850     int rep_len;
5851   };
5852
5853   static struct mswitchstr *mswitches;
5854   static int n_mswitches;
5855   int i, j;
5856
5857   if (!mswitches)
5858     {
5859       struct mswitchstr *matches;
5860       const char *q;
5861       int cnt = 0;
5862
5863       /* Break multilib_matches into the component strings of string
5864          and replacement string.  */
5865       for (q = multilib_matches; *q != '\0'; q++)
5866         if (*q == ';')
5867           cnt++;
5868
5869       matches =
5870         (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
5871       i = 0;
5872       q = multilib_matches;
5873       while (*q != '\0')
5874         {
5875           matches[i].str = q;
5876           while (*q != ' ')
5877             {
5878               if (*q == '\0')
5879                 abort ();
5880               q++;
5881             }
5882           matches[i].len = q - matches[i].str;
5883
5884           matches[i].replace = ++q;
5885           while (*q != ';' && *q != '\0')
5886             {
5887               if (*q == ' ')
5888                 abort ();
5889               q++;
5890             }
5891           matches[i].rep_len = q - matches[i].replace;
5892           i++;
5893           if (*q == ';')
5894             q++;
5895         }
5896
5897       /* Now build a list of the replacement string for switches that we care
5898          about.  Make sure we allocate at least one entry.  This prevents
5899          xmalloc from calling fatal, and prevents us from re-executing this
5900          block of code.  */
5901       mswitches
5902         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
5903                                          * (n_switches ? n_switches : 1));
5904       for (i = 0; i < n_switches; i++)
5905         {
5906           int xlen = strlen (switches[i].part1);
5907           for (j = 0; j < cnt; j++)
5908             if (xlen == matches[j].len
5909                 && ! strncmp (switches[i].part1, matches[j].str, xlen))
5910               {
5911                 mswitches[n_mswitches].str = matches[j].replace;
5912                 mswitches[n_mswitches].len = matches[j].rep_len;
5913                 mswitches[n_mswitches].replace = (char *) 0;
5914                 mswitches[n_mswitches].rep_len = 0;
5915                 n_mswitches++;
5916                 break;
5917               }
5918         }
5919     }
5920
5921   for (i = 0; i < n_mswitches; i++)
5922     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
5923       return 1;
5924
5925   return 0;
5926 }
5927
5928 static int
5929 default_arg (p, len)
5930      const char *p;
5931      int len;
5932 {
5933   const char *start, *end;
5934
5935   for (start = multilib_defaults; *start != '\0'; start = end + 1)
5936     {
5937       while (*start == ' ' || *start == '\t')
5938         start++;
5939
5940       if (*start == '\0')
5941         break;
5942
5943       for (end = start + 1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
5944         ;
5945
5946       if ((end - start) == len && strncmp (p, start, len) == 0)
5947         return 1;
5948
5949       if (*end == '\0')
5950         break;
5951     }
5952
5953   return 0;
5954 }
5955
5956 /* Work out the subdirectory to use based on the options. The format of
5957    multilib_select is a list of elements. Each element is a subdirectory
5958    name followed by a list of options followed by a semicolon. The format
5959    of multilib_exclusions is the same, but without the preceding
5960    directory. First gcc will check the exclusions, if none of the options
5961    beginning with an exclamation point are present, and all of the other
5962    options are present, then we will ignore this completely. Passing
5963    that, gcc will consider each multilib_select in turn using the same
5964    rules for matching the options. If a match is found, that subdirectory
5965    will be used.  */
5966
5967 static void
5968 set_multilib_dir ()
5969 {
5970   const char *p;
5971   unsigned int this_path_len;
5972   const char *this_path, *this_arg;
5973   int not_arg;
5974   int ok;
5975
5976   p = multilib_exclusions;
5977   while (*p != '\0')
5978     {
5979       /* Ignore newlines.  */
5980       if (*p == '\n')
5981         {
5982           ++p;
5983           continue;
5984         }
5985
5986       /* Check the arguments.  */
5987       ok = 1;
5988       while (*p != ';')
5989         {
5990           if (*p == '\0')
5991             abort ();
5992
5993           if (! ok)
5994             {
5995               ++p;
5996               continue;
5997             }
5998
5999           this_arg = p;
6000           while (*p != ' ' && *p != ';')
6001             {
6002               if (*p == '\0')
6003                 abort ();
6004               ++p;
6005             }
6006
6007           if (*this_arg != '!')
6008             not_arg = 0;
6009           else
6010             {
6011               not_arg = 1;
6012               ++this_arg;
6013             }
6014
6015           ok = used_arg (this_arg, p - this_arg);
6016           if (not_arg)
6017             ok = ! ok;
6018
6019           if (*p == ' ')
6020             ++p;
6021         }
6022
6023       if (ok)
6024         return;
6025
6026       ++p;
6027     }
6028
6029   p = multilib_select;
6030   while (*p != '\0')
6031     {
6032       /* Ignore newlines.  */
6033       if (*p == '\n')
6034         {
6035           ++p;
6036           continue;
6037         }
6038
6039       /* Get the initial path.  */
6040       this_path = p;
6041       while (*p != ' ')
6042         {
6043           if (*p == '\0')
6044             abort ();
6045           ++p;
6046         }
6047       this_path_len = p - this_path;
6048
6049       /* Check the arguments.  */
6050       ok = 1;
6051       ++p;
6052       while (*p != ';')
6053         {
6054           if (*p == '\0')
6055             abort ();
6056
6057           if (! ok)
6058             {
6059               ++p;
6060               continue;
6061             }
6062
6063           this_arg = p;
6064           while (*p != ' ' && *p != ';')
6065             {
6066               if (*p == '\0')
6067                 abort ();
6068               ++p;
6069             }
6070
6071           if (*this_arg != '!')
6072             not_arg = 0;
6073           else
6074             {
6075               not_arg = 1;
6076               ++this_arg;
6077             }
6078
6079           /* If this is a default argument, we can just ignore it.
6080              This is true even if this_arg begins with '!'.  Beginning
6081              with '!' does not mean that this argument is necessarily
6082              inappropriate for this library: it merely means that
6083              there is a more specific library which uses this
6084              argument.  If this argument is a default, we need not
6085              consider that more specific library.  */
6086           if (! default_arg (this_arg, p - this_arg))
6087             {
6088               ok = used_arg (this_arg, p - this_arg);
6089               if (not_arg)
6090                 ok = ! ok;
6091             }
6092
6093           if (*p == ' ')
6094             ++p;
6095         }
6096
6097       if (ok)
6098         {
6099           if (this_path_len != 1
6100               || this_path[0] != '.')
6101             {
6102               char *new_multilib_dir = xmalloc (this_path_len + 1);
6103               strncpy (new_multilib_dir, this_path, this_path_len);
6104               new_multilib_dir[this_path_len] = '\0';
6105               multilib_dir = new_multilib_dir;
6106             }
6107           break;
6108         }
6109
6110       ++p;
6111     }
6112 }
6113
6114 /* Print out the multiple library subdirectory selection
6115    information.  This prints out a series of lines.  Each line looks
6116    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6117    required.  Only the desired options are printed out, the negative
6118    matches.  The options are print without a leading dash.  There are
6119    no spaces to make it easy to use the information in the shell.
6120    Each subdirectory is printed only once.  This assumes the ordering
6121    generated by the genmultilib script. Also, we leave out ones that match
6122    the exclusions.  */
6123
6124 static void
6125 print_multilib_info ()
6126 {
6127   const char *p = multilib_select;
6128   const char *last_path = 0, *this_path;
6129   int skip;
6130   unsigned int last_path_len = 0;
6131
6132   while (*p != '\0')
6133     {
6134       skip = 0;
6135       /* Ignore newlines.  */
6136       if (*p == '\n')
6137         {
6138           ++p;
6139           continue;
6140         }
6141
6142       /* Get the initial path.  */
6143       this_path = p;
6144       while (*p != ' ')
6145         {
6146           if (*p == '\0')
6147             abort ();
6148           ++p;
6149         }
6150
6151       /* Check for matches with the multilib_exclusions. We don't bother
6152          with the '!' in either list. If any of the exclusion rules match
6153          all of its options with the select rule, we skip it.  */
6154       {
6155         const char *e = multilib_exclusions;
6156         const char *this_arg;
6157
6158         while (*e != '\0')
6159           {
6160             int m = 1;
6161             /* Ignore newlines.  */
6162             if (*e == '\n')
6163               {
6164                 ++e;
6165                 continue;
6166               }
6167
6168             /* Check the arguments.  */
6169             while (*e != ';')
6170               {
6171                 const char *q;
6172                 int mp = 0;
6173
6174                 if (*e == '\0')
6175                   abort ();
6176
6177                 if (! m)
6178                   {
6179                     ++e;
6180                     continue;
6181                   }
6182
6183                 this_arg = e;
6184
6185                 while (*e != ' ' && *e != ';')
6186                   {
6187                     if (*e == '\0')
6188                       abort ();
6189                     ++e;
6190                   }
6191
6192                 q = p + 1;
6193                 while (*q != ';')
6194                   {
6195                     const char *arg;
6196                     int len = e - this_arg;
6197
6198                     if (*q == '\0')
6199                       abort ();
6200
6201                     arg = q;
6202
6203                     while (*q != ' ' && *q != ';')
6204                       {
6205                         if (*q == '\0')
6206                           abort ();
6207                         ++q;
6208                       }
6209
6210                     if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6211                         default_arg (this_arg, e - this_arg))
6212                       {
6213                         mp = 1;
6214                         break;
6215                       }
6216
6217                     if (*q == ' ')
6218                       ++q;
6219                   }
6220
6221                 if (! mp)
6222                   m = 0;
6223
6224                 if (*e == ' ')
6225                   ++e;
6226               }
6227
6228             if (m)
6229               {
6230                 skip = 1;
6231                 break;
6232               }
6233
6234             if (*e != '\0')
6235               ++e;
6236           }
6237       }
6238
6239       if (! skip)
6240         {
6241           /* If this is a duplicate, skip it.  */
6242           skip = (last_path != 0 && (unsigned int) (p - this_path) == last_path_len
6243                   && ! strncmp (last_path, this_path, last_path_len));
6244
6245           last_path = this_path;
6246           last_path_len = p - this_path;
6247         }
6248
6249       /* If this directory requires any default arguments, we can skip
6250          it.  We will already have printed a directory identical to
6251          this one which does not require that default argument.  */
6252       if (! skip)
6253         {
6254           const char *q;
6255
6256           q = p + 1;
6257           while (*q != ';')
6258             {
6259               const char *arg;
6260
6261               if (*q == '\0')
6262                 abort ();
6263
6264               if (*q == '!')
6265                 arg = NULL;
6266               else
6267                 arg = q;
6268
6269               while (*q != ' ' && *q != ';')
6270                 {
6271                   if (*q == '\0')
6272                     abort ();
6273                   ++q;
6274                 }
6275
6276               if (arg != NULL
6277                   && default_arg (arg, q - arg))
6278                 {
6279                   skip = 1;
6280                   break;
6281                 }
6282
6283               if (*q == ' ')
6284                 ++q;
6285             }
6286         }
6287
6288       if (! skip)
6289         {
6290           const char *p1;
6291
6292           for (p1 = last_path; p1 < p; p1++)
6293             putchar (*p1);
6294           putchar (';');
6295         }
6296
6297       ++p;
6298       while (*p != ';')
6299         {
6300           int use_arg;
6301
6302           if (*p == '\0')
6303             abort ();
6304
6305           if (skip)
6306             {
6307               ++p;
6308               continue;
6309             }
6310
6311           use_arg = *p != '!';
6312
6313           if (use_arg)
6314             putchar ('@');
6315
6316           while (*p != ' ' && *p != ';')
6317             {
6318               if (*p == '\0')
6319                 abort ();
6320               if (use_arg)
6321                 putchar (*p);
6322               ++p;
6323             }
6324
6325           if (*p == ' ')
6326             ++p;
6327         }
6328
6329       if (! skip)
6330         {
6331           /* If there are extra options, print them now.  */
6332           if (multilib_extra && *multilib_extra)
6333             {
6334               int print_at = TRUE;
6335               const char *q;
6336
6337               for (q = multilib_extra; *q != '\0'; q++)
6338                 {
6339                   if (*q == ' ')
6340                     print_at = TRUE;
6341                   else
6342                     {
6343                       if (print_at)
6344                         putchar ('@');
6345                       putchar (*q);
6346                       print_at = FALSE;
6347                     }
6348                 }
6349             }
6350
6351           putchar ('\n');
6352         }
6353
6354       ++p;
6355     }
6356 }