OSDN Git Service

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