OSDN Git Service

* gcc.h (lang_specific_driver): Constify second argument.
[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 *const **));
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 *const *));
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}cpp0";
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:cpp0 -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:-o %{|!pipe:%g.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 *const **argvp;
858 {
859   int i;
860   int argc = *argcp;
861   const char *const *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 *const *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       /* For some bizarre reason, the second argument of execvp() is
2527          char *const *, not const char *const *.  */
2528       commands[i].pid = pexecute (string, (char *const *) commands[i].argv,
2529                                   programname, temp_filename,
2530                                   &errmsg_fmt, &errmsg_arg,
2531                                   ((i == 0 ? PEXECUTE_FIRST : 0)
2532                                    | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2533                                    | (string == commands[i].prog
2534                                       ? PEXECUTE_SEARCH : 0)
2535                                    | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2536
2537       if (commands[i].pid == -1)
2538         pfatal_pexecute (errmsg_fmt, errmsg_arg);
2539
2540       if (string != commands[i].prog)
2541         free ((PTR) string);
2542     }
2543
2544   execution_count++;
2545
2546   /* Wait for all the subprocesses to finish.
2547      We don't care what order they finish in;
2548      we know that N_COMMANDS waits will get them all.
2549      Ignore subprocesses that we don't know about,
2550      since they can be spawned by the process that exec'ed us.  */
2551
2552   {
2553     int ret_code = 0;
2554 #ifdef HAVE_GETRUSAGE
2555     struct timeval d;
2556     double ut = 0.0, st = 0.0;
2557 #endif
2558
2559     for (i = 0; i < n_commands; )
2560       {
2561         int j;
2562         int status;
2563         int pid;
2564
2565         pid = pwait (commands[i].pid, &status, 0);
2566         if (pid < 0)
2567           abort ();
2568
2569 #ifdef HAVE_GETRUSAGE
2570         if (report_times)
2571           {
2572             /* getrusage returns the total resource usage of all children
2573                up to now.  Copy the previous values into prus, get the
2574                current statistics, then take the difference.  */
2575
2576             prus = rus;
2577             getrusage (RUSAGE_CHILDREN, &rus);
2578             d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
2579             d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
2580             ut = (double)d.tv_sec + (double)d.tv_usec / 1.0e6;
2581             
2582             d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
2583             d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
2584             st = (double)d.tv_sec + (double)d.tv_usec / 1.0e6;
2585           }
2586 #endif
2587
2588         for (j = 0; j < n_commands; j++)
2589           if (commands[j].pid == pid)
2590             {
2591               i++;
2592               if (WIFSIGNALED (status))
2593                 {
2594 #ifdef SIGPIPE
2595                   /* SIGPIPE is a special case.  It happens in -pipe mode
2596                      when the compiler dies before the preprocessor is
2597                      done, or the assembler dies before the compiler is
2598                      done.  There's generally been an error already, and
2599                      this is just fallout.  So don't generate another error
2600                      unless we would otherwise have succeeded.  */
2601                   if (WTERMSIG (status) == SIGPIPE
2602                       && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2603                     ;
2604                   else
2605 #endif
2606                     fatal ("\
2607 Internal error: %s (program %s)\n\
2608 Please submit a full bug report.\n\
2609 See %s for instructions.",
2610                            strsignal (WTERMSIG (status)), commands[j].prog,
2611                            GCCBUGURL);
2612                   signal_count++;
2613                   ret_code = -1;
2614                 }
2615               else if (WIFEXITED (status)
2616                        && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2617                 {
2618                   if (WEXITSTATUS (status) > greatest_status)
2619                     greatest_status = WEXITSTATUS (status);
2620                   ret_code = -1;
2621                 }
2622 #ifdef HAVE_GETRUSAGE
2623               if (report_times && ut + st != 0)
2624                 notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
2625 #endif
2626               break;
2627             }
2628       }
2629     return ret_code;
2630   }
2631 }
2632 \f
2633 /* Find all the switches given to us
2634    and make a vector describing them.
2635    The elements of the vector are strings, one per switch given.
2636    If a switch uses following arguments, then the `part1' field
2637    is the switch itself and the `args' field
2638    is a null-terminated vector containing the following arguments.
2639    The `live_cond' field is:
2640    0 when initialized
2641    1 if the switch is true in a conditional spec,
2642    -1 if false (overridden by a later switch)
2643    -2 if this switch should be ignored (used in %{<S})
2644    The `validated' field is nonzero if any spec has looked at this switch;
2645    if it remains zero at the end of the run, it must be meaningless.  */
2646
2647 #define SWITCH_OK       0
2648 #define SWITCH_FALSE   -1
2649 #define SWITCH_IGNORE  -2
2650 #define SWITCH_LIVE     1
2651
2652 struct switchstr
2653 {
2654   const char *part1;
2655   const char **args;
2656   int live_cond;
2657   int validated;
2658 };
2659
2660 static struct switchstr *switches;
2661
2662 static int n_switches;
2663
2664 struct infile
2665 {
2666   const char *name;
2667   const char *language;
2668 };
2669
2670 /* Also a vector of input files specified.  */
2671
2672 static struct infile *infiles;
2673
2674 static int n_infiles;
2675
2676 /* This counts the number of libraries added by lang_specific_driver, so that
2677    we can tell if there were any user supplied any files or libraries.  */
2678
2679 static int added_libraries;
2680
2681 /* And a vector of corresponding output files is made up later.  */
2682
2683 static const char **outfiles;
2684
2685 /* Used to track if none of the -B paths are used.  */
2686 static int warn_B;
2687
2688 /* Used to track if standard path isn't used and -b or -V is specified.  */
2689 static int warn_std;
2690
2691 /* Gives value to pass as "warn" to add_prefix for standard prefixes.  */
2692 static int *warn_std_ptr = 0;
2693
2694 \f
2695 #if defined(HAVE_OBJECT_SUFFIX) || defined(HAVE_EXECUTABLE_SUFFIX)
2696
2697 /* Convert NAME to a new name if it is the standard suffix.  DO_EXE
2698    is true if we should look for an executable suffix as well.  */
2699
2700 static char *
2701 convert_filename (name, do_exe)
2702      char *name;
2703      int do_exe;
2704 {
2705   int i;
2706   int len;
2707
2708   if (name == NULL)
2709     return NULL;
2710   
2711   len = strlen (name);
2712
2713 #ifdef HAVE_OBJECT_SUFFIX
2714   /* Convert x.o to x.obj if OBJECT_SUFFIX is ".obj".  */
2715   if (len > 2
2716       && name[len - 2] == '.'
2717       && name[len - 1] == 'o')
2718     {
2719       obstack_grow (&obstack, name, len - 2);
2720       obstack_grow0 (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
2721       name = obstack_finish (&obstack);
2722     }
2723 #endif
2724
2725 #ifdef HAVE_EXECUTABLE_SUFFIX
2726   /* If there is no filetype, make it the executable suffix (which includes
2727      the ".").  But don't get confused if we have just "-o".  */
2728   if (! do_exe || EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2729     return name;
2730
2731   for (i = len - 1; i >= 0; i--)
2732     if (IS_DIR_SEPARATOR (name[i]))
2733       break;
2734
2735   for (i++; i < len; i++)
2736     if (name[i] == '.')
2737       return name;
2738
2739   obstack_grow (&obstack, name, len);
2740   obstack_grow0 (&obstack, EXECUTABLE_SUFFIX, strlen (EXECUTABLE_SUFFIX));
2741   name = obstack_finish (&obstack);
2742 #endif
2743
2744   return name;
2745 }
2746 #endif
2747 \f
2748 /* Display the command line switches accepted by gcc.  */
2749 static void
2750 display_help ()
2751 {
2752   printf (_("Usage: %s [options] file...\n"), programname);
2753   fputs (_("Options:\n"), stdout);
2754
2755   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
2756   fputs (_("  --help                   Display this information\n"), stdout);
2757   if (! verbose_flag)
2758     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2759   fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
2760   fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
2761   fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
2762   fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
2763   fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
2764   fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
2765   fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
2766   fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
2767   fputs (_("\
2768   -print-multi-lib         Display the mapping between command line options and\n\
2769                            multiple library search directories\n"), stdout);
2770   fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
2771   fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
2772   fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
2773   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
2774   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
2775   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
2776   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
2777   fputs (_("  -specs=<file>            Override builtin specs with the contents of <file>\n"), stdout);
2778   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
2779   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
2780   fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
2781   fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
2782   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
2783   fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
2784   fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
2785   fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
2786   fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
2787   fputs (_("\
2788   -x <language>            Specify the language of the following input files\n\
2789                            Permissable languages include: c c++ assembler none\n\
2790                            'none' means revert to the default behaviour of\n\
2791                            guessing the language based on the file's extension\n\
2792 "), stdout);
2793
2794   printf (_("\
2795 \nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n\
2796 the various sub-processes invoked by %s.  In order to pass other options\n\
2797 on to these processes the -W<letter> options must be used.\n\
2798 "), programname);
2799
2800   /* The rest of the options are displayed by invocations of the various
2801      sub-processes.  */
2802 }
2803
2804 static void                                                             
2805 add_preprocessor_option (option, len)                                   
2806      const char * option;
2807      int len;
2808 {                                                                       
2809   n_preprocessor_options++;
2810                                                                         
2811   if (! preprocessor_options)
2812     preprocessor_options
2813       = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
2814   else
2815     preprocessor_options
2816       = (char **) xrealloc (preprocessor_options,
2817                             n_preprocessor_options * sizeof (char *));
2818                                                                         
2819   preprocessor_options [n_preprocessor_options - 1] =
2820     save_string (option, len);
2821 }
2822      
2823 static void                                                             
2824 add_assembler_option (option, len)                                      
2825      const char * option;
2826      int len;
2827 {
2828   n_assembler_options++;
2829
2830   if (! assembler_options)
2831     assembler_options
2832       = (char **) xmalloc (n_assembler_options * sizeof (char *));
2833   else
2834     assembler_options
2835       = (char **) xrealloc (assembler_options,
2836                             n_assembler_options * sizeof (char *));
2837
2838   assembler_options [n_assembler_options - 1] = save_string (option, len);
2839 }
2840      
2841 static void                                                             
2842 add_linker_option (option, len)                                 
2843      const char * option;
2844      int    len;
2845 {
2846   n_linker_options++;
2847
2848   if (! linker_options)
2849     linker_options
2850       = (char **) xmalloc (n_linker_options * sizeof (char *));
2851   else
2852     linker_options
2853       = (char **) xrealloc (linker_options,
2854                             n_linker_options * sizeof (char *));
2855
2856   linker_options [n_linker_options - 1] = save_string (option, len);
2857 }
2858 \f
2859 /* Create the vector `switches' and its contents.
2860    Store its length in `n_switches'.  */
2861
2862 static void
2863 process_command (argc, argv)
2864      int argc;
2865      const char *const *argv;
2866 {
2867   register int i;
2868   const char *temp;
2869   char *temp1;
2870   const char *spec_lang = 0;
2871   int last_language_n_infiles;
2872   int have_c = 0;
2873   int have_o = 0;
2874   int lang_n_infiles = 0;
2875
2876   GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
2877
2878   n_switches = 0;
2879   n_infiles = 0;
2880   added_libraries = 0;
2881
2882   /* Figure compiler version from version string.  */
2883
2884   compiler_version = temp1 = xstrdup (version_string); 
2885
2886   for (; *temp1; ++temp1)
2887     {
2888       if (*temp1 == ' ')
2889         {
2890           *temp1 = '\0';
2891           break;
2892         }
2893     }
2894
2895   /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
2896      see if we can create it from the pathname specified in argv[0].  */
2897
2898 #ifndef VMS
2899   /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
2900   if (!gcc_exec_prefix)
2901     {
2902       gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
2903                                               standard_exec_prefix);
2904       if (gcc_exec_prefix)
2905         putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL_PTR));
2906     }
2907 #endif
2908
2909   if (gcc_exec_prefix)
2910     {
2911       int len = strlen (gcc_exec_prefix);
2912       if (len > (int) sizeof ("/lib/gcc-lib/")-1
2913           && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
2914         {
2915           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
2916           if (IS_DIR_SEPARATOR (*temp)
2917               && strncmp (temp+1, "lib", 3) == 0
2918               && IS_DIR_SEPARATOR (temp[4])
2919               && strncmp (temp+5, "gcc-lib", 7) == 0)
2920             len -= sizeof ("/lib/gcc-lib/") - 1;
2921         }
2922
2923       set_std_prefix (gcc_exec_prefix, len);
2924       add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC",
2925                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2926       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
2927                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2928     }
2929
2930   /* COMPILER_PATH and LIBRARY_PATH have values
2931      that are lists of directory names with colons.  */
2932
2933   GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
2934   if (temp)
2935     {
2936       const char *startp, *endp;
2937       char *nstore = (char *) alloca (strlen (temp) + 3);
2938
2939       startp = endp = temp;
2940       while (1)
2941         {
2942           if (*endp == PATH_SEPARATOR || *endp == 0)
2943             {
2944               strncpy (nstore, startp, endp-startp);
2945               if (endp == startp)
2946                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2947               else if (!IS_DIR_SEPARATOR (endp[-1]))
2948                 {
2949                   nstore[endp-startp] = DIR_SEPARATOR;
2950                   nstore[endp-startp+1] = 0;
2951                 }
2952               else
2953                 nstore[endp-startp] = 0;
2954               add_prefix (&exec_prefixes, nstore, 0,
2955                           PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2956               add_prefix (&include_prefixes,
2957                           concat (nstore, "include", NULL_PTR),
2958                           0, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2959               if (*endp == 0)
2960                 break;
2961               endp = startp = endp + 1;
2962             }
2963           else
2964             endp++;
2965         }
2966     }
2967
2968   GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
2969   if (temp && *cross_compile == '0')
2970     {
2971       const char *startp, *endp;
2972       char *nstore = (char *) alloca (strlen (temp) + 3);
2973
2974       startp = endp = temp;
2975       while (1)
2976         {
2977           if (*endp == PATH_SEPARATOR || *endp == 0)
2978             {
2979               strncpy (nstore, startp, endp-startp);
2980               if (endp == startp)
2981                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2982               else if (!IS_DIR_SEPARATOR (endp[-1]))
2983                 {
2984                   nstore[endp-startp] = DIR_SEPARATOR;
2985                   nstore[endp-startp+1] = 0;
2986                 }
2987               else
2988                 nstore[endp-startp] = 0;
2989               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
2990                           PREFIX_PRIORITY_LAST, 0, NULL_PTR);
2991               if (*endp == 0)
2992                 break;
2993               endp = startp = endp + 1;
2994             }
2995           else
2996             endp++;
2997         }
2998     }
2999
3000   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
3001   GET_ENV_PATH_LIST (temp, "LPATH");
3002   if (temp && *cross_compile == '0')
3003     {
3004       const char *startp, *endp;
3005       char *nstore = (char *) alloca (strlen (temp) + 3);
3006
3007       startp = endp = temp;
3008       while (1)
3009         {
3010           if (*endp == PATH_SEPARATOR || *endp == 0)
3011             {
3012               strncpy (nstore, startp, endp-startp);
3013               if (endp == startp)
3014                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
3015               else if (!IS_DIR_SEPARATOR (endp[-1]))
3016                 {
3017                   nstore[endp-startp] = DIR_SEPARATOR;
3018                   nstore[endp-startp+1] = 0;
3019                 }
3020               else
3021                 nstore[endp-startp] = 0;
3022               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
3023                           PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3024               if (*endp == 0)
3025                 break;
3026               endp = startp = endp + 1;
3027             }
3028           else
3029             endp++;
3030         }
3031     }
3032
3033   /* Convert new-style -- options to old-style.  */
3034   translate_options (&argc, &argv);
3035
3036   /* Do language-specific adjustment/addition of flags.  */
3037   lang_specific_driver (&argc, &argv, &added_libraries);
3038
3039   /* Scan argv twice.  Here, the first time, just count how many switches
3040      there will be in their vector, and how many input files in theirs.
3041      Here we also parse the switches that cc itself uses (e.g. -v).  */
3042
3043   for (i = 1; i < argc; i++)
3044     {
3045       if (! strcmp (argv[i], "-dumpspecs"))
3046         {
3047           struct spec_list *sl;
3048           init_spec ();
3049           for (sl = specs; sl; sl = sl->next)
3050             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3051           if (link_command_spec)
3052             printf ("*link_command:\n%s\n\n", link_command_spec);
3053           exit (0);
3054         }
3055       else if (! strcmp (argv[i], "-dumpversion"))
3056         {
3057           printf ("%s\n", spec_version);
3058           exit (0);
3059         }
3060       else if (! strcmp (argv[i], "-dumpmachine"))
3061         {
3062           printf ("%s\n", spec_machine);
3063           exit  (0);
3064         }
3065       else if (strcmp (argv[i], "-fhelp") == 0)
3066         {
3067           /* translate_options () has turned --help into -fhelp.  */
3068           print_help_list = 1;
3069
3070           /* We will be passing a dummy file on to the sub-processes.  */
3071           n_infiles++;
3072           n_switches++;
3073           
3074           add_preprocessor_option ("--help", 6);
3075           add_assembler_option ("--help", 6);
3076           add_linker_option ("--help", 6);
3077         }
3078       else if (! strcmp (argv[i], "-pass-exit-codes"))
3079         {
3080           pass_exit_codes = 1;
3081           n_switches++;
3082         }
3083       else if (! strcmp (argv[i], "-print-search-dirs"))
3084         print_search_dirs = 1;
3085       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3086         print_file_name = "libgcc.a";
3087       else if (! strncmp (argv[i], "-print-file-name=", 17))
3088         print_file_name = argv[i] + 17;
3089       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3090         print_prog_name = argv[i] + 17;
3091       else if (! strcmp (argv[i], "-print-multi-lib"))
3092         print_multi_lib = 1;
3093       else if (! strcmp (argv[i], "-print-multi-directory"))
3094         print_multi_directory = 1;
3095       else if (! strncmp (argv[i], "-Wa,", 4))
3096         {
3097           int prev, j;
3098           /* Pass the rest of this option to the assembler.  */
3099
3100           /* Split the argument at commas.  */
3101           prev = 4;
3102           for (j = 4; argv[i][j]; j++)
3103             if (argv[i][j] == ',')
3104               {
3105                 add_assembler_option (argv[i] + prev, j - prev);
3106                 prev = j + 1;
3107               }
3108           
3109           /* Record the part after the last comma.  */
3110           add_assembler_option (argv[i] + prev, j - prev);
3111         }
3112       else if (! strncmp (argv[i], "-Wp,", 4))
3113         {
3114           int prev, j;
3115           /* Pass the rest of this option to the preprocessor.  */
3116
3117           /* Split the argument at commas.  */
3118           prev = 4;
3119           for (j = 4; argv[i][j]; j++)
3120             if (argv[i][j] == ',')
3121               {
3122                 add_preprocessor_option (argv[i] + prev, j - prev);
3123                 prev = j + 1;
3124               }
3125           
3126           /* Record the part after the last comma.  */
3127           add_preprocessor_option (argv[i] + prev, j - prev);
3128         }
3129       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3130         /* The +e options to the C++ front-end.  */
3131         n_switches++;
3132       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3133         {
3134           int j;
3135           /* Split the argument at commas.  */
3136           for (j = 3; argv[i][j]; j++)
3137             n_infiles += (argv[i][j] == ',');
3138         }
3139       else if (strcmp (argv[i], "-Xlinker") == 0)
3140         {
3141           if (i + 1 == argc)
3142             fatal ("argument to `-Xlinker' is missing");
3143
3144           n_infiles++;
3145           i++;
3146         }
3147       else if (strncmp (argv[i], "-l", 2) == 0)
3148         n_infiles++;
3149       else if (strcmp (argv[i], "-save-temps") == 0)
3150         {
3151           save_temps_flag = 1;
3152           n_switches++;
3153         }
3154       else if (strcmp (argv[i], "-specs") == 0)
3155         {
3156           struct user_specs *user = (struct user_specs *)
3157             xmalloc (sizeof (struct user_specs));
3158           if (++i >= argc)
3159             fatal ("argument to `-specs' is missing");
3160
3161           user->next = (struct user_specs *)0;
3162           user->filename = argv[i];
3163           if (user_specs_tail)
3164             user_specs_tail->next = user;
3165           else
3166             user_specs_head = user;
3167           user_specs_tail = user;
3168         }
3169       else if (strncmp (argv[i], "-specs=", 7) == 0)
3170         {
3171           struct user_specs *user = (struct user_specs *)
3172             xmalloc (sizeof (struct user_specs));
3173           if (strlen (argv[i]) == 7)
3174             fatal ("argument to `-specs=' is missing");
3175
3176           user->next = (struct user_specs *)0;
3177           user->filename = argv[i]+7;
3178           if (user_specs_tail)
3179             user_specs_tail->next = user;
3180           else
3181             user_specs_head = user;
3182           user_specs_tail = user;
3183         }
3184       else if (strcmp (argv[i], "-time") == 0)
3185         report_times = 1;
3186       else if (argv[i][0] == '-' && argv[i][1] != 0)
3187         {
3188           register const char *p = &argv[i][1];
3189           register int c = *p;
3190
3191           switch (c)
3192             {
3193             case 'b':
3194               n_switches++;
3195               if (p[1] == 0 && i + 1 == argc)
3196                 fatal ("argument to `-b' is missing");
3197               if (p[1] == 0)
3198                 spec_machine = argv[++i];
3199               else
3200                 spec_machine = p + 1;
3201
3202               warn_std_ptr = &warn_std;
3203               break;
3204
3205             case 'B':
3206               {
3207                 const char *value;
3208                 if (p[1] == 0 && i + 1 == argc)
3209                   fatal ("argument to `-B' is missing");
3210                 if (p[1] == 0)
3211                   value = argv[++i];
3212                 else
3213                   value = p + 1;
3214                 {
3215                   /* As a kludge, if the arg is "[foo/]stageN/", just
3216                      add "[foo/]include" to the include prefix.  */
3217                   int len = strlen (value);
3218                   if ((len == 7
3219                        || (len > 7
3220                            && (IS_DIR_SEPARATOR (value[len - 8]))))
3221                       && strncmp (value + len - 7, "stage", 5) == 0
3222                       && ISDIGIT (value[len - 2])
3223                       && (IS_DIR_SEPARATOR (value[len - 1])))
3224                     {
3225                       if (len == 7)
3226                         add_prefix (&include_prefixes, "include", NULL_PTR,
3227                                     PREFIX_PRIORITY_B_OPT, 0, NULL_PTR);
3228                       else
3229                         {
3230                           char *string = xmalloc (len + 1);
3231                           strncpy (string, value, len-7);
3232                           strcpy (string+len-7, "include");
3233                           add_prefix (&include_prefixes, string, NULL_PTR,
3234                                       PREFIX_PRIORITY_B_OPT, 0, NULL_PTR);
3235                         }
3236                     }
3237                 }
3238                 add_prefix (&exec_prefixes, value, NULL_PTR,
3239                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3240                 add_prefix (&startfile_prefixes, value, NULL_PTR,
3241                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3242                 add_prefix (&include_prefixes, concat (value, "include",
3243                                                        NULL_PTR),
3244                             NULL_PTR,
3245                             PREFIX_PRIORITY_B_OPT, 0, NULL_PTR);
3246                 n_switches++;
3247               }
3248               break;
3249
3250             case 'v':   /* Print our subcommands and print versions.  */
3251               n_switches++;
3252               /* If they do anything other than exactly `-v', don't set
3253                  verbose_flag; rather, continue on to give the error.  */
3254               if (p[1] != 0)
3255                 break;
3256               verbose_flag++;
3257               break;
3258
3259             case 'V':
3260               n_switches++;
3261               if (p[1] == 0 && i + 1 == argc)
3262                 fatal ("argument to `-V' is missing");
3263               if (p[1] == 0)
3264                 spec_version = argv[++i];
3265               else
3266                 spec_version = p + 1;
3267               compiler_version = spec_version;
3268               warn_std_ptr = &warn_std;
3269
3270               /* Validate the version number.  Use the same checks
3271                  done when inserting it into a spec.
3272
3273                  The format of the version string is
3274                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
3275               {
3276                 const char *v = compiler_version;
3277
3278                 /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
3279                 while (! ISDIGIT (*v))
3280                   v++;
3281
3282                 if (v > compiler_version && v[-1] != '-')
3283                   fatal ("invalid version number format");
3284
3285                 /* Set V after the first period.  */
3286                 while (ISDIGIT (*v))
3287                   v++;
3288
3289                 if (*v != '.')
3290                   fatal ("invalid version number format");
3291
3292                 v++;
3293                 while (ISDIGIT (*v))
3294                   v++;
3295
3296                 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3297                   fatal ("invalid version number format");
3298               }
3299               break;
3300
3301             case 'S':
3302             case 'c':
3303               if (p[1] == 0)
3304                 {
3305                   have_c = 1;
3306                   n_switches++;
3307                   break;
3308                 }
3309               goto normal_switch;
3310
3311             case 'o':
3312               have_o = 1;
3313 #if defined(HAVE_EXECUTABLE_SUFFIX)
3314               if (! have_c)
3315                 {
3316                   int skip;
3317                   
3318                   /* Forward scan, just in case -S or -c is specified
3319                      after -o.  */
3320                   int j = i + 1;
3321                   if (p[1] == 0)
3322                     ++j;
3323                   while (j < argc)
3324                     {
3325                       if (argv[j][0] == '-')
3326                         {
3327                           if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3328                               && argv[j][2] == 0)
3329                             {
3330                               have_c = 1;
3331                               break;
3332                             }
3333                           else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3334                             j += skip - (argv[j][2] != 0);
3335                           else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3336                             j += skip;
3337                         }
3338                       j++;
3339                     }
3340                 }
3341 #endif
3342 #if defined(HAVE_EXECUTABLE_SUFFIX) || defined(HAVE_OBJECT_SUFFIX)
3343               if (p[1] == 0)
3344                 argv[i+1] = convert_filename (argv[i+1], ! have_c);
3345               else
3346                 argv[i] = convert_filename (argv[i], ! have_c);
3347 #endif
3348               goto normal_switch;
3349
3350             default:
3351             normal_switch:
3352               n_switches++;
3353
3354               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3355                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3356               else if (WORD_SWITCH_TAKES_ARG (p))
3357                 i += WORD_SWITCH_TAKES_ARG (p);
3358             }
3359         }
3360       else
3361         {
3362           n_infiles++;
3363           lang_n_infiles++;
3364         }
3365     }
3366
3367   if (have_c && have_o && lang_n_infiles > 1)
3368     fatal ("cannot specify -o with -c or -S and multiple compilations");
3369
3370   /* Set up the search paths before we go looking for config files.  */
3371
3372   /* These come before the md prefixes so that we will find gcc's subcommands
3373      (such as cpp) rather than those of the host system.  */
3374   /* Use 2 as fourth arg meaning try just the machine as a suffix,
3375      as well as trying the machine and the version.  */
3376 #ifndef OS2
3377   add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3378               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3379   add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3380               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3381   add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3382               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3383 #endif
3384
3385   add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3386               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3387   add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3388               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3389
3390   tooldir_prefix = concat (tooldir_base_prefix, spec_machine, 
3391                            dir_separator_str, NULL_PTR);
3392
3393   /* If tooldir is relative, base it on exec_prefixes.  A relative
3394      tooldir lets us move the installed tree as a unit.
3395
3396      If GCC_EXEC_PREFIX is defined, then we want to add two relative
3397      directories, so that we can search both the user specified directory
3398      and the standard place.  */
3399
3400   if (!IS_DIR_SEPARATOR (*tooldir_prefix))
3401     {
3402       if (gcc_exec_prefix)
3403         {
3404           char *gcc_exec_tooldir_prefix
3405             = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3406                       spec_version, dir_separator_str, tooldir_prefix, NULL_PTR);
3407
3408           add_prefix (&exec_prefixes,
3409                       concat (gcc_exec_tooldir_prefix, "bin", 
3410                               dir_separator_str, NULL_PTR),
3411                       NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3412           add_prefix (&startfile_prefixes,
3413                       concat (gcc_exec_tooldir_prefix, "lib", 
3414                               dir_separator_str, NULL_PTR),
3415                       NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3416         }
3417
3418       tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3419                                dir_separator_str, spec_version, 
3420                                dir_separator_str, tooldir_prefix, NULL_PTR);
3421     }
3422
3423   add_prefix (&exec_prefixes, 
3424               concat (tooldir_prefix, "bin", dir_separator_str, NULL_PTR),
3425               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3426   add_prefix (&startfile_prefixes,
3427               concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
3428               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
3429
3430   /* More prefixes are enabled in main, after we read the specs file
3431      and determine whether this is cross-compilation or not.  */
3432
3433
3434   /* Then create the space for the vectors and scan again.  */
3435
3436   switches = ((struct switchstr *)
3437               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3438   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3439   n_switches = 0;
3440   n_infiles = 0;
3441   last_language_n_infiles = -1;
3442
3443   /* This, time, copy the text of each switch and store a pointer
3444      to the copy in the vector of switches.
3445      Store all the infiles in their vector.  */
3446
3447   for (i = 1; i < argc; i++)
3448     {
3449       /* Just skip the switches that were handled by the preceding loop.  */
3450       if (! strncmp (argv[i], "-Wa,", 4))
3451         ;
3452       else if (! strncmp (argv[i], "-Wp,", 4))
3453         ;
3454       else if (! strcmp (argv[i], "-pass-exit-codes"))
3455         ;
3456       else if (! strcmp (argv[i], "-print-search-dirs"))
3457         ;
3458       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3459         ;
3460       else if (! strncmp (argv[i], "-print-file-name=", 17))
3461         ;
3462       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3463         ;
3464       else if (! strcmp (argv[i], "-print-multi-lib"))
3465         ;
3466       else if (! strcmp (argv[i], "-print-multi-directory"))
3467         ;
3468       else if (strcmp (argv[i], "-fhelp") == 0)
3469         {
3470           if (verbose_flag)
3471             {
3472               /* Create a dummy input file, so that we can pass --help on to
3473                  the various sub-processes.  */
3474               infiles[n_infiles].language = "c";
3475               infiles[n_infiles++].name   = "help-dummy";
3476               
3477               /* Preserve the --help switch so that it can be caught by the
3478                  cc1 spec string.  */
3479               switches[n_switches].part1     = "--help";
3480               switches[n_switches].args      = 0;
3481               switches[n_switches].live_cond = SWITCH_OK;
3482               switches[n_switches].validated     = 0;
3483               
3484               n_switches++;
3485             }
3486         }
3487       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3488         {
3489           /* Compensate for the +e options to the C++ front-end;
3490              they're there simply for cfront call-compatibility.  We do
3491              some magic in default_compilers to pass them down properly.
3492              Note we deliberately start at the `+' here, to avoid passing
3493              -e0 or -e1 down into the linker.  */
3494           switches[n_switches].part1 = &argv[i][0];
3495           switches[n_switches].args = 0;
3496           switches[n_switches].live_cond = SWITCH_OK;
3497           switches[n_switches].validated = 0;
3498           n_switches++;
3499         }
3500       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3501         {
3502           int prev, j;
3503           /* Split the argument at commas.  */
3504           prev = 4;
3505           for (j = 4; argv[i][j]; j++)
3506             if (argv[i][j] == ',')
3507               {
3508                 infiles[n_infiles].language = "*";
3509                 infiles[n_infiles++].name
3510                   = save_string (argv[i] + prev, j - prev);
3511                 prev = j + 1;
3512               }
3513           /* Record the part after the last comma.  */
3514           infiles[n_infiles].language = "*";
3515           infiles[n_infiles++].name = argv[i] + prev;
3516         }
3517       else if (strcmp (argv[i], "-Xlinker") == 0)
3518         {
3519           infiles[n_infiles].language = "*";
3520           infiles[n_infiles++].name = argv[++i];
3521         }
3522       else if (strncmp (argv[i], "-l", 2) == 0)
3523         {
3524           infiles[n_infiles].language = "*";
3525           infiles[n_infiles++].name = argv[i];
3526         }
3527       else if (strcmp (argv[i], "-specs") == 0)
3528         i++;
3529       else if (strncmp (argv[i], "-specs=", 7) == 0)
3530         ;
3531       else if (strcmp (argv[i], "-time") == 0)
3532         ;
3533       else if ((save_temps_flag || report_times)
3534                && strcmp (argv[i], "-pipe") == 0)
3535         {
3536           /* -save-temps overrides -pipe, so that temp files are produced */
3537           if (save_temps_flag)
3538             error ("Warning: -pipe ignored since -save-temps specified");
3539           /* -time overrides -pipe because we can't get correct stats when
3540              multiple children are running at once.  */
3541           else if (report_times)
3542             error ("Warning: -pipe ignored since -time specified");
3543         }
3544       else if (argv[i][0] == '-' && argv[i][1] != 0)
3545         {
3546           const char *p = &argv[i][1];
3547           int c = *p;
3548
3549           if (c == 'x')
3550             {
3551               if (p[1] == 0 && i + 1 == argc)
3552                 fatal ("argument to `-x' is missing");
3553               if (p[1] == 0)
3554                 spec_lang = argv[++i];
3555               else
3556                 spec_lang = p + 1;
3557               if (! strcmp (spec_lang, "none"))
3558                 /* Suppress the warning if -xnone comes after the last input
3559                    file, because alternate command interfaces like g++ might
3560                    find it useful to place -xnone after each input file.  */
3561                 spec_lang = 0;
3562               else
3563                 last_language_n_infiles = n_infiles;
3564               continue;
3565             }
3566           switches[n_switches].part1 = p;
3567           /* Deal with option arguments in separate argv elements.  */
3568           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
3569               || WORD_SWITCH_TAKES_ARG (p))
3570             {
3571               int j = 0;
3572               int n_args = WORD_SWITCH_TAKES_ARG (p);
3573
3574               if (n_args == 0)
3575                 {
3576                   /* Count only the option arguments in separate argv elements.  */
3577                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3578                 }
3579               if (i + n_args >= argc)
3580                 fatal ("argument to `-%s' is missing", p);
3581               switches[n_switches].args
3582                 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
3583               while (j < n_args)
3584                 switches[n_switches].args[j++] = argv[++i];
3585               /* Null-terminate the vector.  */
3586               switches[n_switches].args[j] = 0;
3587             }
3588           else if (index (switches_need_spaces, c))
3589             {
3590               /* On some systems, ld cannot handle some options without
3591                  a space.  So split the option from its argument.  */
3592               char *part1 = (char *) xmalloc (2);
3593               char *tmp;
3594               part1[0] = c;
3595               part1[1] = '\0';
3596               
3597               switches[n_switches].part1 = part1;
3598               switches[n_switches].args
3599                 = (const char **) xmalloc (2 * sizeof (const char *));
3600               switches[n_switches].args[0] = tmp = xmalloc (strlen (p));
3601               strcpy (tmp, &p[1]);
3602               switches[n_switches].args[1] = 0;
3603             }
3604           else
3605             switches[n_switches].args = 0;
3606
3607           switches[n_switches].live_cond = SWITCH_OK;
3608           switches[n_switches].validated = 0;
3609           /* This is always valid, since gcc.c itself understands it.  */
3610           if (!strcmp (p, "save-temps"))
3611             switches[n_switches].validated = 1;
3612           else
3613             {
3614               char ch = switches[n_switches].part1[0];
3615               if (ch == 'V' || ch == 'b' || ch == 'B')
3616                 switches[n_switches].validated = 1;
3617             }
3618           n_switches++;
3619         }
3620       else
3621         {
3622 #ifdef HAVE_OBJECT_SUFFIX
3623           argv[i] = convert_filename (argv[i], 0);
3624 #endif
3625
3626           if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
3627             {
3628               perror_with_name (argv[i]);
3629               error_count++;
3630             }
3631           else
3632             {
3633               infiles[n_infiles].language = spec_lang;
3634               infiles[n_infiles++].name = argv[i];
3635             }
3636         }
3637     }
3638
3639   if (n_infiles == last_language_n_infiles && spec_lang != 0)
3640     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3641
3642   switches[n_switches].part1 = 0;
3643   infiles[n_infiles].name = 0;
3644 }
3645 \f
3646 /* Process a spec string, accumulating and running commands.  */
3647
3648 /* These variables describe the input file name.
3649    input_file_number is the index on outfiles of this file,
3650    so that the output file name can be stored for later use by %o.
3651    input_basename is the start of the part of the input file
3652    sans all directory names, and basename_length is the number
3653    of characters starting there excluding the suffix .c or whatever.  */
3654
3655 const char *input_filename;
3656 static int input_file_number;
3657 size_t input_filename_length;
3658 static int basename_length;
3659 static int suffixed_basename_length;
3660 static const char *input_basename;
3661 static const char *input_suffix;
3662
3663 /* These are variables used within do_spec and do_spec_1.  */
3664
3665 /* Nonzero if an arg has been started and not yet terminated
3666    (with space, tab or newline).  */
3667 static int arg_going;
3668
3669 /* Nonzero means %d or %g has been seen; the next arg to be terminated
3670    is a temporary file name.  */
3671 static int delete_this_arg;
3672
3673 /* Nonzero means %w has been seen; the next arg to be terminated
3674    is the output file name of this compilation.  */
3675 static int this_is_output_file;
3676
3677 /* Nonzero means %s has been seen; the next arg to be terminated
3678    is the name of a library file and we should try the standard
3679    search dirs for it.  */
3680 static int this_is_library_file;
3681
3682 /* Nonzero means that the input of this command is coming from a pipe.  */
3683 static int input_from_pipe;
3684
3685 /* Process the spec SPEC and run the commands specified therein.
3686    Returns 0 if the spec is successfully processed; -1 if failed.  */
3687
3688 int
3689 do_spec (spec)
3690      const char *spec;
3691 {
3692   int value;
3693
3694   clear_args ();
3695   arg_going = 0;
3696   delete_this_arg = 0;
3697   this_is_output_file = 0;
3698   this_is_library_file = 0;
3699   input_from_pipe = 0;
3700
3701   value = do_spec_1 (spec, 0, NULL_PTR);
3702
3703   /* Force out any unfinished command.
3704      If -pipe, this forces out the last command if it ended in `|'.  */
3705   if (value == 0)
3706     {
3707       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3708         argbuf_index--;
3709
3710       if (argbuf_index > 0)
3711         value = execute ();
3712     }
3713
3714   return value;
3715 }
3716
3717 /* Process the sub-spec SPEC as a portion of a larger spec.
3718    This is like processing a whole spec except that we do
3719    not initialize at the beginning and we do not supply a
3720    newline by default at the end.
3721    INSWITCH nonzero means don't process %-sequences in SPEC;
3722    in this case, % is treated as an ordinary character.
3723    This is used while substituting switches.
3724    INSWITCH nonzero also causes SPC not to terminate an argument.
3725
3726    Value is zero unless a line was finished
3727    and the command on that line reported an error.  */
3728
3729 static int
3730 do_spec_1 (spec, inswitch, soft_matched_part)
3731      const char *spec;
3732      int inswitch;
3733      const char *soft_matched_part;
3734 {
3735   register const char *p = spec;
3736   register int c;
3737   int i;
3738   const char *string;
3739   int value;
3740
3741   while ((c = *p++))
3742     /* If substituting a switch, treat all chars like letters.
3743        Otherwise, NL, SPC, TAB and % are special.  */
3744     switch (inswitch ? 'a' : c)
3745       {
3746       case '\n':
3747         /* End of line: finish any pending argument,
3748            then run the pending command if one has been started.  */
3749         if (arg_going)
3750           {
3751             obstack_1grow (&obstack, 0);
3752             string = obstack_finish (&obstack);
3753             if (this_is_library_file)
3754               string = find_file (string);
3755             store_arg (string, delete_this_arg, this_is_output_file);
3756             if (this_is_output_file)
3757               outfiles[input_file_number] = string;
3758           }
3759         arg_going = 0;
3760
3761         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3762           {
3763             for (i = 0; i < n_switches; i++)
3764               if (!strcmp (switches[i].part1, "pipe"))
3765                 break;
3766
3767             /* A `|' before the newline means use a pipe here,
3768                but only if -pipe was specified.
3769                Otherwise, execute now and don't pass the `|' as an arg.  */
3770             if (i < n_switches)
3771               {
3772                 input_from_pipe = 1;
3773                 switches[i].validated = 1;
3774                 break;
3775               }
3776             else
3777               argbuf_index--;
3778           }
3779
3780         if (argbuf_index > 0)
3781           {
3782             value = execute ();
3783             if (value)
3784               return value;
3785           }
3786         /* Reinitialize for a new command, and for a new argument.  */
3787         clear_args ();
3788         arg_going = 0;
3789         delete_this_arg = 0;
3790         this_is_output_file = 0;
3791         this_is_library_file = 0;
3792         input_from_pipe = 0;
3793         break;
3794
3795       case '|':
3796         /* End any pending argument.  */
3797         if (arg_going)
3798           {
3799             obstack_1grow (&obstack, 0);
3800             string = obstack_finish (&obstack);
3801             if (this_is_library_file)
3802               string = find_file (string);
3803             store_arg (string, delete_this_arg, this_is_output_file);
3804             if (this_is_output_file)
3805               outfiles[input_file_number] = string;
3806           }
3807
3808         /* Use pipe */
3809         obstack_1grow (&obstack, c);
3810         arg_going = 1;
3811         break;
3812
3813       case '\t':
3814       case ' ':
3815         /* Space or tab ends an argument if one is pending.  */
3816         if (arg_going)
3817           {
3818             obstack_1grow (&obstack, 0);
3819             string = obstack_finish (&obstack);
3820             if (this_is_library_file)
3821               string = find_file (string);
3822             store_arg (string, delete_this_arg, this_is_output_file);
3823             if (this_is_output_file)
3824               outfiles[input_file_number] = string;
3825           }
3826         /* Reinitialize for a new argument.  */
3827         arg_going = 0;
3828         delete_this_arg = 0;
3829         this_is_output_file = 0;
3830         this_is_library_file = 0;
3831         break;
3832
3833       case '%':
3834         switch (c = *p++)
3835           {
3836           case 0:
3837             fatal ("Invalid specification!  Bug in cc.");
3838
3839           case 'b':
3840             obstack_grow (&obstack, input_basename, basename_length);
3841             arg_going = 1;
3842             break;
3843
3844           case 'B':
3845             obstack_grow (&obstack, input_basename, suffixed_basename_length);
3846             arg_going = 1;
3847             break;
3848
3849           case 'd':
3850             delete_this_arg = 2;
3851             break;
3852
3853           /* Dump out the directories specified with LIBRARY_PATH,
3854              followed by the absolute directories
3855              that we search for startfiles.  */
3856           case 'D':
3857             {
3858               struct prefix_list *pl = startfile_prefixes.plist;
3859               size_t bufsize = 100;
3860               char *buffer = (char *) xmalloc (bufsize);
3861               int idx;
3862
3863               for (; pl; pl = pl->next)
3864                 {
3865 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
3866                   /* Used on systems which record the specified -L dirs
3867                      and use them to search for dynamic linking.  */
3868                   /* Relative directories always come from -B,
3869                      and it is better not to use them for searching
3870                      at run time.  In particular, stage1 loses.  */
3871                   if (!IS_DIR_SEPARATOR (pl->prefix[0]))
3872                     continue;
3873 #endif
3874                   /* Try subdirectory if there is one.  */
3875                   if (multilib_dir != NULL)
3876                     {
3877                       if (machine_suffix)
3878                         {
3879                           if (strlen (pl->prefix) + strlen (machine_suffix)
3880                               >= bufsize)
3881                             bufsize = (strlen (pl->prefix)
3882                                        + strlen (machine_suffix)) * 2 + 1;
3883                           buffer = (char *) xrealloc (buffer, bufsize);
3884                           strcpy (buffer, pl->prefix);
3885                           strcat (buffer, machine_suffix);
3886                           if (is_directory (buffer, multilib_dir, 1))
3887                             {
3888                               do_spec_1 ("-L", 0, NULL_PTR);
3889 #ifdef SPACE_AFTER_L_OPTION
3890                               do_spec_1 (" ", 0, NULL_PTR);
3891 #endif
3892                               do_spec_1 (buffer, 1, NULL_PTR);
3893                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3894                               /* Make this a separate argument.  */
3895                               do_spec_1 (" ", 0, NULL_PTR);
3896                             }
3897                         }
3898                       if (!pl->require_machine_suffix)
3899                         {
3900                           if (is_directory (pl->prefix, multilib_dir, 1))
3901                             {
3902                               do_spec_1 ("-L", 0, NULL_PTR);
3903 #ifdef SPACE_AFTER_L_OPTION
3904                               do_spec_1 (" ", 0, NULL_PTR);
3905 #endif
3906                               do_spec_1 (pl->prefix, 1, NULL_PTR);
3907                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3908                               /* Make this a separate argument.  */
3909                               do_spec_1 (" ", 0, NULL_PTR);
3910                             }
3911                         }
3912                     }
3913                   if (machine_suffix)
3914                     {
3915                       if (is_directory (pl->prefix, machine_suffix, 1))
3916                         {
3917                           do_spec_1 ("-L", 0, NULL_PTR);
3918 #ifdef SPACE_AFTER_L_OPTION
3919                           do_spec_1 (" ", 0, NULL_PTR);
3920 #endif
3921                           do_spec_1 (pl->prefix, 1, NULL_PTR);
3922                           /* Remove slash from machine_suffix.  */
3923                           if (strlen (machine_suffix) >= bufsize)
3924                             bufsize = strlen (machine_suffix) * 2 + 1;
3925                           buffer = (char *) xrealloc (buffer, bufsize);
3926                           strcpy (buffer, machine_suffix);
3927                           idx = strlen (buffer);
3928                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
3929                             buffer[idx - 1] = 0;
3930                           do_spec_1 (buffer, 1, NULL_PTR);
3931                           /* Make this a separate argument.  */
3932                           do_spec_1 (" ", 0, NULL_PTR);
3933                         }
3934                     }
3935                   if (!pl->require_machine_suffix)
3936                     {
3937                       if (is_directory (pl->prefix, "", 1))
3938                         {
3939                           do_spec_1 ("-L", 0, NULL_PTR);
3940 #ifdef SPACE_AFTER_L_OPTION
3941                           do_spec_1 (" ", 0, NULL_PTR);
3942 #endif
3943                           /* Remove slash from pl->prefix.  */
3944                           if (strlen (pl->prefix) >= bufsize)
3945                             bufsize = strlen (pl->prefix) * 2 + 1;
3946                           buffer = (char *) xrealloc (buffer, bufsize);
3947                           strcpy (buffer, pl->prefix);
3948                           idx = strlen (buffer);
3949                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
3950                             buffer[idx - 1] = 0;
3951                           do_spec_1 (buffer, 1, NULL_PTR);
3952                           /* Make this a separate argument.  */
3953                           do_spec_1 (" ", 0, NULL_PTR);
3954                         }
3955                     }
3956                 }
3957               free (buffer);
3958             }
3959             break;
3960
3961           case 'e':
3962             /* %efoo means report an error with `foo' as error message
3963                and don't execute any more commands for this file.  */
3964             {
3965               const char *q = p;
3966               char *buf;
3967               while (*p != 0 && *p != '\n') p++;
3968               buf = (char *) alloca (p - q + 1);
3969               strncpy (buf, q, p - q);
3970               buf[p - q] = 0;
3971               error ("%s", buf);
3972               return -1;
3973             }
3974             break;
3975
3976           case 'g':
3977           case 'u':
3978           case 'U':
3979             if (save_temps_flag)
3980               {
3981                 obstack_grow (&obstack, input_basename, basename_length);
3982                 delete_this_arg = 0;
3983               }
3984             else
3985               {
3986 #ifdef MKTEMP_EACH_FILE
3987                 /* ??? This has a problem: the total number of
3988                    values mktemp can return is limited.
3989                    That matters for the names of object files.
3990                    In 2.4, do something about that.  */
3991                 struct temp_name *t;
3992                 int suffix_length;
3993                 const char *suffix = p;
3994                 char *saved_suffix = NULL;
3995
3996                 while (*p == '.' || ISALPHA ((unsigned char)*p))
3997                   p++;
3998                 suffix_length = p - suffix;
3999                 if (p[0] == '%' && p[1] == 'O')
4000                   {
4001                     p += 2;
4002                     /* We don't support extra suffix characters after %O.  */
4003                     if (*p == '.' || ISALPHA ((unsigned char)*p))
4004                       abort ();
4005                     if (suffix_length == 0)
4006                       suffix = OBJECT_SUFFIX;
4007                     else
4008                       {
4009                         saved_suffix
4010                           = (char *) xmalloc (suffix_length
4011                                               + strlen (OBJECT_SUFFIX));
4012                         strncpy (saved_suffix, suffix, suffix_length);
4013                         strcpy (saved_suffix + suffix_length,
4014                                 OBJECT_SUFFIX);
4015                       }
4016                     suffix_length += strlen (OBJECT_SUFFIX);
4017                   }
4018
4019                 /* See if we already have an association of %g/%u/%U and
4020                    suffix.  */
4021                 for (t = temp_names; t; t = t->next)
4022                   if (t->length == suffix_length
4023                       && strncmp (t->suffix, suffix, suffix_length) == 0
4024                       && t->unique == (c != 'g'))
4025                     break;
4026
4027                 /* Make a new association if needed.  %u requires one.  */
4028                 if (t == 0 || c == 'u')
4029                   {
4030                     if (t == 0)
4031                       {
4032                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4033                         t->next = temp_names;
4034                         temp_names = t;
4035                       }
4036                     t->length = suffix_length;
4037                     t->suffix = save_string (suffix, suffix_length);
4038                     t->unique = (c != 'g');
4039                     temp_filename = make_temp_file (t->suffix);
4040                     temp_filename_length = strlen (temp_filename);
4041                     t->filename = temp_filename;
4042                     t->filename_length = temp_filename_length;
4043                   }
4044
4045                 if (saved_suffix)
4046                   free (saved_suffix);
4047
4048                 obstack_grow (&obstack, t->filename, t->filename_length);
4049                 delete_this_arg = 1;
4050 #else
4051                 obstack_grow (&obstack, temp_filename, temp_filename_length);
4052                 if (c == 'u' || c == 'U')
4053                   {
4054                     static int unique;
4055                     char buff[9];
4056                     if (c == 'u')
4057                       unique++;
4058                     sprintf (buff, "%d", unique);
4059                     obstack_grow (&obstack, buff, strlen (buff));
4060                   }
4061 #endif
4062                 delete_this_arg = 1;
4063               }
4064             arg_going = 1;
4065             break;
4066
4067           case 'i':
4068             obstack_grow (&obstack, input_filename, input_filename_length);
4069             arg_going = 1;
4070             break;
4071
4072           case 'I':
4073             {
4074               struct prefix_list *pl = include_prefixes.plist;
4075
4076               if (gcc_exec_prefix)
4077                 {
4078                   do_spec_1 ("-iprefix", 1, NULL_PTR);
4079                   /* Make this a separate argument.  */
4080                   do_spec_1 (" ", 0, NULL_PTR);
4081                   do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
4082                   do_spec_1 (" ", 0, NULL_PTR);
4083                 }
4084
4085               for (; pl; pl = pl->next)
4086                 {
4087                   do_spec_1 ("-isystem", 1, NULL_PTR);
4088                   /* Make this a separate argument.  */
4089                   do_spec_1 (" ", 0, NULL_PTR);
4090                   do_spec_1 (pl->prefix, 1, NULL_PTR);
4091                   do_spec_1 (" ", 0, NULL_PTR);
4092                 }
4093             }
4094             break;
4095
4096           case 'o':
4097             {
4098               int max = n_infiles;
4099               max += lang_specific_extra_outfiles;
4100
4101               for (i = 0; i < max; i++)
4102                 if (outfiles[i])
4103                   store_arg (outfiles[i], 0, 0);
4104               break;
4105             }
4106
4107           case 'O':
4108             obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
4109             arg_going = 1;
4110             break;
4111
4112           case 's':
4113             this_is_library_file = 1;
4114             break;
4115
4116           case 'w':
4117             this_is_output_file = 1;
4118             break;
4119
4120           case 'W':
4121             {
4122               int cur_index = argbuf_index;
4123               /* Handle the {...} following the %W.  */
4124               if (*p != '{')
4125                 abort ();
4126               p = handle_braces (p + 1);
4127               if (p == 0)
4128                 return -1;
4129               /* If any args were output, mark the last one for deletion
4130                  on failure.  */
4131               if (argbuf_index != cur_index)
4132                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4133               break;
4134             }
4135
4136           /* %x{OPTION} records OPTION for %X to output.  */
4137           case 'x':
4138             {
4139               const char *p1 = p;
4140               char *string;
4141
4142               /* Skip past the option value and make a copy.  */
4143               if (*p != '{')
4144                 abort ();
4145               while (*p++ != '}')
4146                 ;
4147               string = save_string (p1 + 1, p - p1 - 2);
4148
4149               /* See if we already recorded this option.  */
4150               for (i = 0; i < n_linker_options; i++)
4151                 if (! strcmp (string, linker_options[i]))
4152                   {
4153                     free (string);
4154                     return 0;
4155                   }
4156
4157               /* This option is new; add it.  */
4158               add_linker_option (string, strlen (string));
4159             }
4160             break;
4161
4162           /* Dump out the options accumulated previously using %x.  */
4163           case 'X':
4164             for (i = 0; i < n_linker_options; i++)
4165               {
4166                 do_spec_1 (linker_options[i], 1, NULL_PTR);
4167                 /* Make each accumulated option a separate argument.  */
4168                 do_spec_1 (" ", 0, NULL_PTR);
4169               }
4170             break;
4171
4172           /* Dump out the options accumulated previously using -Wa,.  */
4173           case 'Y':
4174             for (i = 0; i < n_assembler_options; i++)
4175               {
4176                 do_spec_1 (assembler_options[i], 1, NULL_PTR);
4177                 /* Make each accumulated option a separate argument.  */
4178                 do_spec_1 (" ", 0, NULL_PTR);
4179               }
4180             break;
4181
4182           /* Dump out the options accumulated previously using -Wp,.  */
4183           case 'Z':
4184             for (i = 0; i < n_preprocessor_options; i++)
4185               {
4186                 do_spec_1 (preprocessor_options[i], 1, NULL_PTR);
4187                 /* Make each accumulated option a separate argument.  */
4188                 do_spec_1 (" ", 0, NULL_PTR);
4189               }
4190             break;
4191
4192             /* Here are digits and numbers that just process
4193                a certain constant string as a spec.  */
4194
4195           case '1':
4196             value = do_spec_1 (cc1_spec, 0, NULL_PTR);
4197             if (value != 0)
4198               return value;
4199             break;
4200
4201           case '2':
4202             value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
4203             if (value != 0)
4204               return value;
4205             break;
4206
4207           case 'a':
4208             value = do_spec_1 (asm_spec, 0, NULL_PTR);
4209             if (value != 0)
4210               return value;
4211             break;
4212
4213           case 'A':
4214             value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
4215             if (value != 0)
4216               return value;
4217             break;
4218
4219           case 'c':
4220             value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
4221             if (value != 0)
4222               return value;
4223             break;
4224
4225           case 'C':
4226             value = do_spec_1 (cpp_spec, 0, NULL_PTR);
4227             if (value != 0)
4228               return value;
4229             break;
4230
4231           case 'E':
4232             value = do_spec_1 (endfile_spec, 0, NULL_PTR);
4233             if (value != 0)
4234               return value;
4235             break;
4236
4237           case 'l':
4238             value = do_spec_1 (link_spec, 0, NULL_PTR);
4239             if (value != 0)
4240               return value;
4241             break;
4242
4243           case 'L':
4244             value = do_spec_1 (lib_spec, 0, NULL_PTR);
4245             if (value != 0)
4246               return value;
4247             break;
4248
4249           case 'G':
4250             value = do_spec_1 (libgcc_spec, 0, NULL_PTR);
4251             if (value != 0)
4252               return value;
4253             break;
4254
4255           case 'p':
4256             {
4257               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4258               char *buf = x;
4259               const char *y;
4260
4261               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
4262               y = cpp_predefines;
4263               while (*y != 0)
4264                 {
4265                   if (! strncmp (y, "-D", 2))
4266                     /* Copy the whole option.  */
4267                     while (*y && *y != ' ' && *y != '\t')
4268                       *x++ = *y++;
4269                   else if (*y == ' ' || *y == '\t')
4270                     /* Copy whitespace to the result.  */
4271                     *x++ = *y++;
4272                   /* Don't copy other options.  */
4273                   else
4274                     y++;
4275                 }
4276
4277               *x = 0;
4278
4279               value = do_spec_1 (buf, 0, NULL_PTR);
4280               if (value != 0)
4281                 return value;
4282             }
4283             break;
4284
4285           case 'P':
4286             {
4287               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4288               char *buf = x;
4289               const char *y;
4290
4291               /* Copy all of CPP_PREDEFINES into BUF,
4292                  but force them all into the reserved name space if they
4293                  aren't already there.  The reserved name space is all
4294                  identifiers beginning with two underscores or with one
4295                  underscore and a capital letter.  We do the forcing by
4296                  adding up to two underscores to the beginning and end
4297                  of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4298                  become __mips__.  */
4299               y = cpp_predefines;
4300               while (*y != 0)
4301                 {
4302                   if (! strncmp (y, "-D", 2))
4303                     {
4304                       int flag = 0;
4305
4306                       *x++ = *y++;
4307                       *x++ = *y++;
4308
4309                       if (*y != '_'
4310                           || (*(y+1) != '_'
4311                               && ! ISUPPER ((unsigned char)*(y+1))))
4312                         {
4313                           /* Stick __ at front of macro name.  */
4314                           if (*y != '_')
4315                             *x++ = '_';
4316                           *x++ = '_';
4317                           /* Arrange to stick __ at the end as well.  */
4318                           flag = 1;
4319                         }
4320
4321                       /* Copy the macro name.  */
4322                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
4323                         *x++ = *y++;
4324
4325                       if (flag)
4326                         {
4327                           if (x[-1] != '_')
4328                             {
4329                               if (x[-2] != '_')
4330                                 *x++ = '_';
4331                               *x++ = '_';
4332                             }
4333                         }
4334
4335                       /* Copy the value given, if any.  */
4336                       while (*y && *y != ' ' && *y != '\t')
4337                         *x++ = *y++;
4338                     }
4339                   else if (*y == ' ' || *y == '\t')
4340                     /* Copy whitespace to the result.  */
4341                     *x++ = *y++;
4342                   /* Don't copy -A options  */
4343                   else
4344                     y++;
4345                 }
4346               *x++ = ' ';
4347
4348               /* Copy all of CPP_PREDEFINES into BUF,
4349                  but put __ after every -D.  */
4350               y = cpp_predefines;
4351               while (*y != 0)
4352                 {
4353                   if (! strncmp (y, "-D", 2))
4354                     {
4355                       y += 2;
4356
4357                       if (*y != '_'
4358                           || (*(y+1) != '_'
4359                               && ! ISUPPER ((unsigned char)*(y+1))))
4360                         {
4361                           /* Stick -D__ at front of macro name.  */
4362                           *x++ = '-';
4363                           *x++ = 'D';
4364                           if (*y != '_')
4365                             *x++ = '_';
4366                           *x++ = '_';
4367
4368                           /* Copy the macro name.  */
4369                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
4370                             *x++ = *y++;
4371
4372                           /* Copy the value given, if any.  */
4373                           while (*y && *y != ' ' && *y != '\t')
4374                             *x++ = *y++;
4375                         }
4376                       else
4377                         {
4378                           /* Do not copy this macro - we have just done it before */
4379                           while (*y && *y != ' ' && *y != '\t')
4380                             y++;
4381                         }
4382                     }
4383                   else if (*y == ' ' || *y == '\t')
4384                     /* Copy whitespace to the result.  */
4385                     *x++ = *y++;
4386                   /* Don't copy -A options.  */
4387                   else
4388                     y++;
4389                 }
4390               *x++ = ' ';
4391
4392               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4393               y = cpp_predefines;
4394               while (*y != 0)
4395                 {
4396                   if (! strncmp (y, "-A", 2))
4397                     /* Copy the whole option.  */
4398                     while (*y && *y != ' ' && *y != '\t')
4399                       *x++ = *y++;
4400                   else if (*y == ' ' || *y == '\t')
4401                     /* Copy whitespace to the result.  */
4402                     *x++ = *y++;
4403                   /* Don't copy other options.  */
4404                   else
4405                     y++;
4406                 }
4407
4408               *x = 0;
4409
4410               value = do_spec_1 (buf, 0, NULL_PTR);
4411               if (value != 0)
4412                 return value;
4413             }
4414             break;
4415
4416           case 'S':
4417             value = do_spec_1 (startfile_spec, 0, NULL_PTR);
4418             if (value != 0)
4419               return value;
4420             break;
4421
4422             /* Here we define characters other than letters and digits.  */
4423
4424           case '{':
4425             p = handle_braces (p);
4426             if (p == 0)
4427               return -1;
4428             break;
4429
4430           case '%':
4431             obstack_1grow (&obstack, '%');
4432             break;
4433
4434           case '*':
4435             if (soft_matched_part)
4436               {
4437                 do_spec_1 (soft_matched_part, 1, NULL_PTR);
4438                 do_spec_1 (" ", 0, NULL_PTR);
4439               }
4440             else
4441               /* Catch the case where a spec string contains something like
4442                  '%{foo:%*}'.  ie there is no * in the pattern on the left
4443                  hand side of the :.  */
4444               error ("Spec failure: '%%*' has not been initialised by pattern match");
4445             break;
4446
4447             /* Process a string found as the value of a spec given by name.
4448                This feature allows individual machine descriptions
4449                to add and use their own specs.
4450                %[...] modifies -D options the way %P does;
4451                %(...) uses the spec unmodified.  */
4452           case '[':
4453             error ("Warning: use of obsolete %%[ operator in specs");
4454           case '(':
4455             {
4456               const char *name = p;
4457               struct spec_list *sl;
4458               int len;
4459
4460               /* The string after the S/P is the name of a spec that is to be
4461                  processed.  */
4462               while (*p && *p != ')' && *p != ']')
4463                 p++;
4464
4465               /* See if it's in the list.  */
4466               for (len = p - name, sl = specs; sl; sl = sl->next)
4467                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4468                   {
4469                     name = *(sl->ptr_spec);
4470 #ifdef DEBUG_SPECS
4471                     notice ("Processing spec %c%s%c, which is '%s'\n",
4472                             c, sl->name, (c == '(') ? ')' : ']', name);
4473 #endif
4474                     break;
4475                   }
4476
4477               if (sl)
4478                 {
4479                   if (c == '(')
4480                     {
4481                       value = do_spec_1 (name, 0, NULL_PTR);
4482                       if (value != 0)
4483                         return value;
4484                     }
4485                   else
4486                     {
4487                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4488                       char *buf = x;
4489                       const char *y = name;
4490                       int flag = 0;
4491
4492                       /* Copy all of NAME into BUF, but put __ after
4493                          every -D and at the end of each arg.  */
4494                       while (1)
4495                         {
4496                           if (! strncmp (y, "-D", 2))
4497                             {
4498                               *x++ = '-';
4499                               *x++ = 'D';
4500                               *x++ = '_';
4501                               *x++ = '_';
4502                               y += 2;
4503                               flag = 1;
4504                               continue;
4505                             }
4506                           else if (flag && (*y == ' ' || *y == '\t' || *y == '='
4507                                             || *y == '}' || *y == 0))
4508                             {
4509                               *x++ = '_';
4510                               *x++ = '_';
4511                               flag = 0;
4512                             }
4513                           if (*y == 0)
4514                             break;
4515                           else
4516                             *x++ = *y++;
4517                         }
4518                       *x = 0;
4519
4520                       value = do_spec_1 (buf, 0, NULL_PTR);
4521                       if (value != 0)
4522                         return value;
4523                     }
4524                 }
4525
4526               /* Discard the closing paren or bracket.  */
4527               if (*p)
4528                 p++;
4529             }
4530             break;
4531
4532           case 'v':
4533             {
4534               int c1 = *p++;  /* Select first or second version number.  */
4535               const char *v = compiler_version;
4536               const char *q;
4537               static const char zeroc = '0';
4538
4539               /* The format of the version string is
4540                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
4541
4542               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
4543               while (! ISDIGIT (*v))
4544                 v++;
4545               if (v > compiler_version && v[-1] != '-')
4546                 abort ();
4547
4548               /* If desired, advance to second version number.  */
4549               if (c1 >= '2')
4550                 {
4551                   /* Set V after the first period.  */
4552                   while (ISDIGIT (*v))
4553                     v++;
4554                   if (*v != '.')
4555                     abort ();
4556                   v++;
4557                 }
4558
4559               /* If desired, advance to third version number.
4560                  But don't complain if it's not present */
4561               if (c1 == '3')
4562                 {
4563                   /* Set V after the second period.  */
4564                   while (ISDIGIT (*v))
4565                     v++;
4566                   if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
4567                     abort ();
4568                   if (*v != 0)
4569                       v++;
4570                 }
4571
4572               /* Set Q at the next period or at the end.  */
4573               q = v;
4574               while (ISDIGIT (*q))
4575                 q++;
4576               if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
4577                 abort ();
4578
4579               if (q > v)
4580                 /* Put that part into the command.  */
4581                 obstack_grow (&obstack, v, q - v);
4582               else
4583                 /* Default to "0" */
4584                 obstack_grow (&obstack, &zeroc, 1);
4585               arg_going = 1;
4586             }
4587             break;
4588
4589           case '|':
4590             if (input_from_pipe)
4591               do_spec_1 ("-", 0, NULL_PTR);
4592             break;
4593
4594           default:
4595             error ("Spec failure: Unrecognised spec option '%c'", c);
4596             break;
4597           }
4598         break;
4599
4600       case '\\':
4601         /* Backslash: treat next character as ordinary.  */
4602         c = *p++;
4603
4604         /* fall through */
4605       default:
4606         /* Ordinary character: put it into the current argument.  */
4607         obstack_1grow (&obstack, c);
4608         arg_going = 1;
4609       }
4610
4611   return 0;             /* End of string */
4612 }
4613
4614 /* Return 0 if we call do_spec_1 and that returns -1.  */
4615
4616 static const char *
4617 handle_braces (p)
4618      register const char *p;
4619 {
4620   const char *filter, *body = NULL, *endbody = NULL;
4621   int pipe_p = 0;
4622   int negate;
4623   int suffix;
4624   int include_blanks = 1;
4625   int elide_switch = 0;
4626
4627   if (*p == '^')
4628     {
4629       /* A '^' after the open-brace means to not give blanks before args.  */
4630       include_blanks = 0;
4631       ++p;
4632     }
4633
4634   if (*p == '|')
4635     {
4636       /* A `|' after the open-brace means,
4637          if the test fails, output a single minus sign rather than nothing.
4638          This is used in %{|!pipe:...}.  */
4639       pipe_p = 1;
4640       ++p;
4641     }
4642
4643   if (*p == '<')
4644     {
4645       /* A `<' after the open-brace means that the switch should be
4646          removed from the command-line.  */
4647       elide_switch = 1;
4648       ++p;
4649     }
4650
4651 next_member:
4652   negate = suffix = 0;
4653
4654   if (*p == '!')
4655     /* A `!' after the open-brace negates the condition:
4656        succeed if the specified switch is not present.  */
4657     negate = 1, ++p;
4658
4659   if (*p == '.')
4660     /* A `.' after the open-brace means test against the current suffix.  */
4661     {
4662       if (pipe_p)
4663         abort ();
4664
4665       suffix = 1;
4666       ++p;
4667     }
4668
4669   if (elide_switch && (negate || pipe_p || suffix))
4670     {
4671       /* It doesn't make sense to mix elision with other flags.  We
4672          could fatal() here, but the standard seems to be to abort.  */
4673       abort ();
4674     }
4675
4676   filter = p;
4677   while (*p != ':' && *p != '}' && *p != '|') p++;
4678
4679   if (*p == '|' && pipe_p)
4680     abort ();
4681
4682   if (!body)
4683     {
4684       if (*p != '}')
4685         {
4686           register int count = 1;
4687           register const char *q = p;
4688
4689           while (*q++ != ':') continue;
4690           body = q;
4691           
4692           while (count > 0)
4693             {
4694               if (*q == '{')
4695                 count++;
4696               else if (*q == '}')
4697                 count--;
4698               else if (*q == 0)
4699                 abort ();
4700               q++;
4701             }
4702           endbody = q;
4703         }
4704       else
4705         body = p, endbody = p+1;
4706     }
4707
4708   if (suffix)
4709     {
4710       int found = (input_suffix != 0
4711                    && (long) strlen (input_suffix) == (long)(p - filter)
4712                    && strncmp (input_suffix, filter, p - filter) == 0);
4713
4714       if (body[0] == '}')
4715         abort ();
4716
4717       if (negate != found
4718           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL_PTR) < 0)
4719         return 0;
4720     }
4721   else if (p[-1] == '*' && p[0] == '}')
4722     {
4723       /* Substitute all matching switches as separate args.  */
4724       register int i;
4725       --p;
4726       for (i = 0; i < n_switches; i++)
4727         if (!strncmp (switches[i].part1, filter, p - filter)
4728             && check_live_switch (i, p - filter))
4729           give_switch (i, 0, include_blanks);
4730     }
4731   else
4732     {
4733       /* Test for presence of the specified switch.  */
4734       register int i;
4735       int present = 0;
4736
4737       /* If name specified ends in *, as in {x*:...},
4738          check for %* and handle that case.  */
4739       if (p[-1] == '*' && !negate)
4740         {
4741           int substitution;
4742           const char *r = body;
4743
4744           /* First see whether we have %*.  */
4745           substitution = 0;
4746           while (r < endbody)
4747             {
4748               if (*r == '%' && r[1] == '*')
4749                 substitution = 1;
4750               r++;
4751             }
4752           /* If we do, handle that case.  */
4753           if (substitution)
4754             {
4755               /* Substitute all matching switches as separate args.
4756                  But do this by substituting for %*
4757                  in the text that follows the colon.  */
4758
4759               unsigned hard_match_len = p - filter - 1;
4760               char *string = save_string (body, endbody - body - 1);
4761
4762               for (i = 0; i < n_switches; i++)
4763                 if (!strncmp (switches[i].part1, filter, hard_match_len)
4764                     && check_live_switch (i, -1))
4765                   {
4766                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4767                     /* Pass any arguments this switch has.  */
4768                     give_switch (i, 1, 1);
4769                   }
4770
4771               /* We didn't match.  Try again.  */
4772               if (*p++ == '|')
4773                 goto next_member;
4774               return endbody;
4775             }
4776         }
4777
4778       /* If name specified ends in *, as in {x*:...},
4779          check for presence of any switch name starting with x.  */
4780       if (p[-1] == '*')
4781         {
4782           for (i = 0; i < n_switches; i++)
4783             {
4784               unsigned hard_match_len = p - filter - 1;
4785
4786               if (!strncmp (switches[i].part1, filter, hard_match_len)
4787                   && check_live_switch (i, hard_match_len))
4788                 {
4789                   present = 1;
4790                   break;
4791                 }
4792             }
4793         }
4794       /* Otherwise, check for presence of exact name specified.  */
4795       else
4796         {
4797           for (i = 0; i < n_switches; i++)
4798             {
4799               if (!strncmp (switches[i].part1, filter, p - filter)
4800                   && switches[i].part1[p - filter] == 0
4801                   && check_live_switch (i, -1))
4802                 {
4803                   present = 1;
4804                   break;
4805                 }
4806             }
4807         }
4808
4809       /* If it is as desired (present for %{s...}, absent for %{!s...})
4810          then substitute either the switch or the specified
4811          conditional text.  */
4812       if (present != negate)
4813         {
4814           if (elide_switch)
4815             {
4816               switches[i].live_cond = SWITCH_IGNORE;
4817               switches[i].validated = 1;
4818             }
4819           else if (*p == '}')
4820             {
4821               give_switch (i, 0, include_blanks);
4822             }
4823           else
4824             {
4825               if (do_spec_1 (save_string (body, endbody - body - 1),
4826                              0, NULL_PTR) < 0)
4827                 return 0;
4828             }
4829         }
4830       else if (pipe_p)
4831         {
4832           /* Here if a %{|...} conditional fails: output a minus sign,
4833              which means "standard output" or "standard input".  */
4834           do_spec_1 ("-", 0, NULL_PTR);
4835           return endbody;
4836         }
4837     }
4838
4839   /* We didn't match; try again.  */
4840   if (*p++ == '|')
4841     goto next_member;
4842
4843   return endbody;
4844 }
4845 \f
4846 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4847    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
4848    spec, or -1 if either exact match or %* is used.
4849
4850    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
4851    whose value does not begin with "no-" is obsoleted by the same value
4852    with the "no-", similarly for a switch with the "no-" prefix.  */
4853
4854 static int
4855 check_live_switch (switchnum, prefix_length)
4856      int switchnum;
4857      int prefix_length;
4858 {
4859   const char *name = switches[switchnum].part1;
4860   int i;
4861
4862   /* In the common case of {<at-most-one-letter>*}, a negating
4863      switch would always match, so ignore that case.  We will just
4864      send the conflicting switches to the compiler phase.  */
4865   if (prefix_length >= 0 && prefix_length <= 1)
4866     return 1;
4867
4868   /* If we already processed this switch and determined if it was
4869      live or not, return our past determination.  */
4870   if (switches[switchnum].live_cond != 0)
4871     return switches[switchnum].live_cond > 0;
4872
4873   /* Now search for duplicate in a manner that depends on the name.  */
4874   switch (*name)
4875     {
4876     case 'O':
4877         for (i = switchnum + 1; i < n_switches; i++)
4878           if (switches[i].part1[0] == 'O')
4879             {
4880               switches[switchnum].validated = 1;
4881               switches[switchnum].live_cond = SWITCH_FALSE;
4882               return 0;
4883             }
4884       break;
4885
4886     case 'W':  case 'f':  case 'm':
4887       if (! strncmp (name + 1, "no-", 3))
4888         {
4889           /* We have Xno-YYY, search for XYYY.  */
4890           for (i = switchnum + 1; i < n_switches; i++)
4891             if (switches[i].part1[0] == name[0]
4892                 && ! strcmp (&switches[i].part1[1], &name[4]))
4893             {
4894               switches[switchnum].validated = 1;
4895               switches[switchnum].live_cond = SWITCH_FALSE;
4896               return 0;
4897             }
4898         }
4899       else
4900         {
4901           /* We have XYYY, search for Xno-YYY.  */
4902           for (i = switchnum + 1; i < n_switches; i++)
4903             if (switches[i].part1[0] == name[0]
4904                 && switches[i].part1[1] == 'n'
4905                 && switches[i].part1[2] == 'o'
4906                 && switches[i].part1[3] == '-'
4907                 && !strcmp (&switches[i].part1[4], &name[1]))
4908             {
4909               switches[switchnum].validated = 1;
4910               switches[switchnum].live_cond = SWITCH_FALSE;
4911               return 0;
4912             }
4913         }
4914       break;
4915     }
4916
4917   /* Otherwise the switch is live.  */
4918   switches[switchnum].live_cond = SWITCH_LIVE;
4919   return 1;
4920 }
4921 \f
4922 /* Pass a switch to the current accumulating command
4923    in the same form that we received it.
4924    SWITCHNUM identifies the switch; it is an index into
4925    the vector of switches gcc received, which is `switches'.
4926    This cannot fail since it never finishes a command line.
4927
4928    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
4929
4930    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
4931    of the switch.  */
4932
4933 static void
4934 give_switch (switchnum, omit_first_word, include_blanks)
4935      int switchnum;
4936      int omit_first_word;
4937      int include_blanks;
4938 {
4939   if (switches[switchnum].live_cond == SWITCH_IGNORE)
4940     return;
4941
4942   if (!omit_first_word)
4943     {
4944       do_spec_1 ("-", 0, NULL_PTR);
4945       do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
4946     }
4947
4948   if (switches[switchnum].args != 0)
4949     {
4950       const char **p;
4951       for (p = switches[switchnum].args; *p; p++)
4952         {
4953           if (include_blanks)
4954             do_spec_1 (" ", 0, NULL_PTR);
4955           do_spec_1 (*p, 1, NULL_PTR);
4956         }
4957     }
4958
4959   do_spec_1 (" ", 0, NULL_PTR);
4960   switches[switchnum].validated = 1;
4961 }
4962 \f
4963 /* Search for a file named NAME trying various prefixes including the
4964    user's -B prefix and some standard ones.
4965    Return the absolute file name found.  If nothing is found, return NAME.  */
4966
4967 static const char *
4968 find_file (name)
4969      const char *name;
4970 {
4971   char *newname;
4972
4973   /* Try multilib_dir if it is defined.  */
4974   if (multilib_dir != NULL)
4975     {
4976       char *try;
4977
4978       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
4979       strcpy (try, multilib_dir);
4980       strcat (try, dir_separator_str);
4981       strcat (try, name);
4982
4983       newname = find_a_file (&startfile_prefixes, try, R_OK);
4984
4985       /* If we don't find it in the multi library dir, then fall
4986          through and look for it in the normal places.  */
4987       if (newname != NULL)
4988         return newname;
4989     }
4990
4991   newname = find_a_file (&startfile_prefixes, name, R_OK);
4992   return newname ? newname : name;
4993 }
4994
4995 /* Determine whether a directory exists.  If LINKER, return 0 for
4996    certain fixed names not needed by the linker.  If not LINKER, it is
4997    only important to return 0 if the host machine has a small ARG_MAX
4998    limit.  */
4999
5000 static int
5001 is_directory (path1, path2, linker)
5002      const char *path1;
5003      const char *path2;
5004      int linker;
5005 {
5006   int len1 = strlen (path1);
5007   int len2 = strlen (path2);
5008   char *path = (char *) alloca (3 + len1 + len2);
5009   char *cp;
5010   struct stat st;
5011
5012 #ifndef SMALL_ARG_MAX
5013   if (! linker)
5014     return 1;
5015 #endif
5016
5017   /* Construct the path from the two parts.  Ensure the string ends with "/.".
5018      The resulting path will be a directory even if the given path is a
5019      symbolic link.  */
5020   memcpy (path, path1, len1);
5021   memcpy (path + len1, path2, len2);
5022   cp = path + len1 + len2;
5023   if (!IS_DIR_SEPARATOR (cp[-1]))
5024     *cp++ = DIR_SEPARATOR;
5025   *cp++ = '.';
5026   *cp = '\0';
5027
5028   /* Exclude directories that the linker is known to search.  */
5029   if (linker
5030       && ((cp - path == 6
5031            && strcmp (path, concat (dir_separator_str, "lib", 
5032                                     dir_separator_str, ".", NULL_PTR)) == 0)
5033           || (cp - path == 10
5034               && strcmp (path, concat (dir_separator_str, "usr", 
5035                                        dir_separator_str, "lib", 
5036                                        dir_separator_str, ".", NULL_PTR)) == 0)))
5037     return 0;
5038
5039   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5040 }
5041
5042 /* Set up the various global variables to indicate that we're processing
5043    the input file named FILENAME.  */
5044
5045 static void
5046 set_input (filename)
5047      const char *filename;
5048 {
5049   register const char *p;
5050
5051   input_filename = filename;
5052   input_filename_length = strlen (input_filename);
5053   
5054   input_basename = input_filename;
5055 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5056   /* Skip drive name so 'x:foo' is handled properly.  */
5057   if (input_basename[1] == ':')
5058     input_basename += 2;
5059 #endif
5060   for (p = input_basename; *p; p++)
5061     if (IS_DIR_SEPARATOR (*p))
5062       input_basename = p + 1;
5063
5064   /* Find a suffix starting with the last period,
5065      and set basename_length to exclude that suffix.  */
5066   basename_length = strlen (input_basename);
5067   suffixed_basename_length = basename_length;
5068   p = input_basename + basename_length;
5069   while (p != input_basename && *p != '.') --p;
5070   if (*p == '.' && p != input_basename)
5071     {
5072       basename_length = p - input_basename;
5073       input_suffix = p + 1;
5074     }
5075   else
5076     input_suffix = "";
5077 }
5078 \f
5079 /* On fatal signals, delete all the temporary files.  */
5080
5081 static void
5082 fatal_error (signum)
5083      int signum;
5084 {
5085   signal (signum, SIG_DFL);
5086   delete_failure_queue ();
5087   delete_temp_files ();
5088   /* Get the same signal again, this time not handled,
5089      so its normal effect occurs.  */
5090   kill (getpid (), signum);
5091 }
5092
5093 extern int main PARAMS ((int, const char *const *));
5094
5095 int
5096 main (argc, argv)
5097      int argc;
5098      const char *const *argv;
5099 {
5100   size_t i;
5101   int value;
5102   int linker_was_run = 0;
5103   char *explicit_link_files;
5104   char *specs_file;
5105   const char *p;
5106   struct user_specs *uptr;
5107
5108   p = argv[0] + strlen (argv[0]);
5109   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5110     --p;
5111   programname = p;
5112
5113 #ifdef HAVE_LC_MESSAGES
5114   setlocale (LC_MESSAGES, "");
5115 #endif
5116   (void) bindtextdomain (PACKAGE, localedir);
5117   (void) textdomain (PACKAGE);
5118
5119   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5120     signal (SIGINT, fatal_error);
5121 #ifdef SIGHUP
5122   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5123     signal (SIGHUP, fatal_error);
5124 #endif
5125   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5126     signal (SIGTERM, fatal_error);
5127 #ifdef SIGPIPE
5128   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5129     signal (SIGPIPE, fatal_error);
5130 #endif
5131
5132   argbuf_length = 10;
5133   argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
5134
5135   obstack_init (&obstack);
5136
5137   /* Build multilib_select, et. al from the separate lines that make up each
5138      multilib selection.  */
5139   {
5140     const char *const *q = multilib_raw;
5141     int need_space;
5142
5143     obstack_init (&multilib_obstack);
5144     while ((p = *q++) != (char *) 0)
5145       obstack_grow (&multilib_obstack, p, strlen (p));
5146
5147     obstack_1grow (&multilib_obstack, 0);
5148     multilib_select = obstack_finish (&multilib_obstack);
5149
5150     q = multilib_matches_raw;
5151     while ((p = *q++) != (char *) 0)
5152       obstack_grow (&multilib_obstack, p, strlen (p));
5153
5154     obstack_1grow (&multilib_obstack, 0);
5155     multilib_matches = obstack_finish (&multilib_obstack);
5156
5157     q = multilib_exclusions_raw;
5158     while ((p = *q++) != (char *) 0)
5159         obstack_grow (&multilib_obstack, p, strlen (p));
5160
5161     obstack_1grow (&multilib_obstack, 0);
5162     multilib_exclusions = obstack_finish (&multilib_obstack);
5163     
5164     need_space = FALSE;
5165     for (i = 0;
5166          i < sizeof (multilib_defaults_raw) / sizeof (multilib_defaults_raw[0]);
5167          i++)
5168       {
5169         if (need_space)
5170           obstack_1grow (&multilib_obstack, ' ');
5171         obstack_grow (&multilib_obstack,
5172                       multilib_defaults_raw[i],
5173                       strlen (multilib_defaults_raw[i]));
5174         need_space = TRUE;
5175       }
5176
5177     obstack_1grow (&multilib_obstack, 0);
5178     multilib_defaults = obstack_finish (&multilib_obstack);
5179   }
5180
5181   /* Set up to remember the pathname of gcc and any options
5182      needed for collect.  We use argv[0] instead of programname because
5183      we need the complete pathname.  */
5184   obstack_init (&collect_obstack);
5185   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
5186   obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
5187   putenv (obstack_finish (&collect_obstack));
5188
5189 #ifdef INIT_ENVIRONMENT
5190   /* Set up any other necessary machine specific environment variables.  */
5191   putenv (INIT_ENVIRONMENT);
5192 #endif
5193
5194   /* Choose directory for temp files.  */
5195
5196 #ifndef MKTEMP_EACH_FILE
5197   temp_filename = choose_temp_base ();
5198   temp_filename_length = strlen (temp_filename);
5199 #endif
5200
5201   /* Make a table of what switches there are (switches, n_switches).
5202      Make a table of specified input files (infiles, n_infiles).
5203      Decode switches that are handled locally.  */
5204
5205   process_command (argc, argv);
5206
5207   {
5208     int first_time;
5209
5210     /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5211        the compiler.  */
5212     obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5213                   sizeof ("COLLECT_GCC_OPTIONS=")-1);
5214
5215     first_time = TRUE;
5216     for (i = 0; (int)i < n_switches; i++)
5217       {
5218         const char *const *args;
5219         const char *p, *q;
5220         if (!first_time)
5221           obstack_grow (&collect_obstack, " ", 1);
5222
5223         first_time = FALSE;
5224         obstack_grow (&collect_obstack, "'-", 2);
5225         q = switches[i].part1;
5226         while ((p = index (q,'\'')))
5227           {
5228             obstack_grow (&collect_obstack, q, p-q);
5229             obstack_grow (&collect_obstack, "'\\''", 4);
5230             q = ++p;
5231           }
5232         obstack_grow (&collect_obstack, q, strlen (q));
5233         obstack_grow (&collect_obstack, "'", 1);
5234
5235         for (args = switches[i].args; args && *args; args++)
5236           {
5237             obstack_grow (&collect_obstack, " '", 2);
5238             q = *args;
5239             while ((p = index (q,'\'')))
5240               {
5241                 obstack_grow (&collect_obstack, q, p-q);
5242                 obstack_grow (&collect_obstack, "'\\''", 4);
5243                 q = ++p;
5244               }
5245             obstack_grow (&collect_obstack, q, strlen (q));
5246             obstack_grow (&collect_obstack, "'", 1);
5247           }
5248       }
5249     obstack_grow (&collect_obstack, "\0", 1);
5250     putenv (obstack_finish (&collect_obstack));
5251   }
5252
5253   /* Initialize the vector of specs to just the default.
5254      This means one element containing 0s, as a terminator.  */
5255
5256   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
5257   bcopy ((char *) default_compilers, (char *) compilers,
5258          sizeof default_compilers);
5259   n_compilers = n_default_compilers;
5260
5261   /* Read specs from a file if there is one.  */
5262
5263   machine_suffix = concat (spec_machine, dir_separator_str,
5264                            spec_version, dir_separator_str, NULL_PTR);
5265   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
5266
5267   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
5268   /* Read the specs file unless it is a default one.  */
5269   if (specs_file != 0 && strcmp (specs_file, "specs"))
5270     read_specs (specs_file, TRUE);
5271   else
5272     init_spec ();
5273
5274   /* We need to check standard_exec_prefix/just_machine_suffix/specs
5275      for any override of as, ld and libraries.  */
5276   specs_file = (char *) alloca (strlen (standard_exec_prefix)
5277                                 + strlen (just_machine_suffix)
5278                                 + sizeof ("specs"));
5279
5280   strcpy (specs_file, standard_exec_prefix);
5281   strcat (specs_file, just_machine_suffix);
5282   strcat (specs_file, "specs");
5283   if (access (specs_file, R_OK) == 0)
5284     read_specs (specs_file, TRUE);
5285  
5286   /* If not cross-compiling, look for startfiles in the standard places.  */
5287   if (*cross_compile == '0')
5288     {
5289 #ifdef MD_EXEC_PREFIX
5290       add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
5291                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5292       add_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
5293                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5294 #endif
5295
5296 #ifdef MD_STARTFILE_PREFIX
5297       add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5298                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5299 #endif
5300
5301 #ifdef MD_STARTFILE_PREFIX_1
5302       add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5303                   PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5304 #endif
5305
5306       /* If standard_startfile_prefix is relative, base it on
5307          standard_exec_prefix.  This lets us move the installed tree
5308          as a unit.  If GCC_EXEC_PREFIX is defined, base
5309          standard_startfile_prefix on that as well.  */
5310       if (IS_DIR_SEPARATOR (*standard_startfile_prefix)
5311             || *standard_startfile_prefix == '$'
5312 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5313             /* Check for disk name on MS-DOS-based systems.  */
5314           || (standard_startfile_prefix[1] == ':'
5315               && (IS_DIR_SEPARATOR (standard_startfile_prefix[2])))
5316 #endif
5317           )
5318         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5319                     PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5320       else
5321         {
5322           if (gcc_exec_prefix)
5323             add_prefix (&startfile_prefixes,
5324                         concat (gcc_exec_prefix, machine_suffix,
5325                                 standard_startfile_prefix, NULL_PTR),
5326                         NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5327           add_prefix (&startfile_prefixes,
5328                       concat (standard_exec_prefix,
5329                               machine_suffix,
5330                               standard_startfile_prefix, NULL_PTR),
5331                       NULL_PTR, PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5332         }                      
5333
5334       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5335                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5336       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5337                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5338 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
5339       add_prefix (&startfile_prefixes, "./", NULL_PTR,
5340                   PREFIX_PRIORITY_LAST, 1, NULL_PTR);
5341 #endif
5342     }
5343   else
5344     {
5345       if (!IS_DIR_SEPARATOR (*standard_startfile_prefix) && gcc_exec_prefix)
5346         add_prefix (&startfile_prefixes,
5347                     concat (gcc_exec_prefix, machine_suffix,
5348                             standard_startfile_prefix, NULL_PTR),
5349                     "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL_PTR);
5350     }
5351
5352   /* Process any user specified specs in the order given on the command
5353      line.  */
5354   for (uptr = user_specs_head; uptr; uptr = uptr->next)
5355     {
5356       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5357       read_specs (filename ? filename : uptr->filename, FALSE);
5358     }
5359
5360   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
5361   if (gcc_exec_prefix)
5362     {
5363       char * temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5364                                       + strlen (spec_version)
5365                                       + strlen (spec_machine) + 3);
5366       strcpy (temp, gcc_exec_prefix);
5367       strcat (temp, spec_machine);
5368       strcat (temp, dir_separator_str);
5369       strcat (temp, spec_version);
5370       strcat (temp, dir_separator_str);
5371       gcc_exec_prefix = temp;
5372     }
5373
5374   /* Now we have the specs.
5375      Set the `valid' bits for switches that match anything in any spec.  */
5376
5377   validate_all_switches ();
5378
5379   /* Now that we have the switches and the specs, set
5380      the subdirectory based on the options.  */
5381   set_multilib_dir ();
5382
5383   /* Warn about any switches that no pass was interested in.  */
5384
5385   for (i = 0; (int)i < n_switches; i++)
5386     if (! switches[i].validated)
5387       error ("unrecognized option `-%s'", switches[i].part1);
5388
5389   /* Obey some of the options.  */
5390
5391   if (print_search_dirs)
5392     {
5393       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5394       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5395       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
5396       return (0);
5397     }
5398
5399   if (print_file_name)
5400     {
5401       printf ("%s\n", find_file (print_file_name));
5402       return (0);
5403     }
5404
5405   if (print_prog_name)
5406     {
5407       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
5408       printf ("%s\n", (newname ? newname : print_prog_name));
5409       return (0);
5410     }
5411
5412   if (print_multi_lib)
5413     {
5414       print_multilib_info ();
5415       return (0);
5416     }
5417
5418   if (print_multi_directory)
5419     {
5420       if (multilib_dir == NULL)
5421         printf (".\n");
5422       else
5423         printf ("%s\n", multilib_dir);
5424       return (0);
5425     }
5426
5427   if (print_help_list)
5428     {
5429       display_help ();
5430
5431       if (! verbose_flag)
5432         {
5433           printf (_("\nFor bug reporting instructions, please see:\n"));
5434           printf ("%s.\n", GCCBUGURL);
5435           
5436           return (0);
5437         }
5438
5439       /* We do not exit here.  Instead we have created a fake input file
5440          called 'help-dummy' which needs to be compiled, and we pass this
5441          on the the various sub-processes, along with the --help switch.  */
5442     }
5443   
5444   if (verbose_flag)
5445     {
5446       int n;
5447
5448       /* compiler_version is truncated at the first space when initialized
5449          from version string, so truncate version_string at the first space
5450          before comparing.  */
5451       for (n = 0; version_string[n]; n++)
5452         if (version_string[n] == ' ')
5453           break;
5454
5455       if (! strncmp (version_string, compiler_version, n)
5456           && compiler_version[n] == 0)
5457         notice ("gcc version %s\n", version_string);
5458       else
5459         notice ("gcc driver version %s executing gcc version %s\n",
5460                 version_string, compiler_version);
5461
5462       if (n_infiles == 0)
5463         return (0);
5464     }
5465
5466   if (n_infiles == added_libraries)
5467     fatal ("No input files");
5468
5469   /* Make a place to record the compiler output file names
5470      that correspond to the input files.  */
5471
5472   i = n_infiles;
5473   i += lang_specific_extra_outfiles;
5474   outfiles = (const char **) xcalloc (i, sizeof (char *));
5475
5476   /* Record which files were specified explicitly as link input.  */
5477
5478   explicit_link_files = xcalloc (1, n_infiles);
5479
5480   for (i = 0; (int)i < n_infiles; i++)
5481     {
5482       register struct compiler *cp = 0;
5483       int this_file_error = 0;
5484
5485       /* Tell do_spec what to substitute for %i.  */
5486
5487       input_file_number = i;
5488       set_input (infiles[i].name);
5489
5490       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5491
5492       outfiles[i] = input_filename;
5493
5494       /* Figure out which compiler from the file's suffix.  */
5495
5496       cp = lookup_compiler (infiles[i].name, input_filename_length,
5497                             infiles[i].language);
5498
5499       if (cp)
5500         {
5501           /* Ok, we found an applicable compiler.  Run its spec.  */
5502
5503           if (cp->spec[0] == '#')
5504             error ("%s: %s compiler not installed on this system",
5505                    input_filename, &cp->spec[1]);
5506           value = do_spec (cp->spec);
5507           if (value < 0)
5508             this_file_error = 1;
5509         }
5510
5511       /* If this file's name does not contain a recognized suffix,
5512          record it as explicit linker input.  */
5513
5514       else
5515         explicit_link_files[i] = 1;
5516
5517       /* Clear the delete-on-failure queue, deleting the files in it
5518          if this compilation failed.  */
5519
5520       if (this_file_error)
5521         {
5522           delete_failure_queue ();
5523           error_count++;
5524         }
5525       /* If this compilation succeeded, don't delete those files later.  */
5526       clear_failure_queue ();
5527     }
5528
5529   /* Reset the output file name to the first input file name, for use
5530      with %b in LINK_SPEC on a target that prefers not to emit a.out
5531      by default.  */
5532   if (n_infiles > 0)
5533     set_input (infiles[0].name);
5534
5535   if (error_count == 0)
5536     {
5537       /* Make sure INPUT_FILE_NUMBER points to first available open
5538          slot.  */
5539       input_file_number = n_infiles;
5540       if (lang_specific_pre_link ())
5541         error_count++;
5542     }
5543
5544   /* Run ld to link all the compiler output files.  */
5545
5546   if (error_count == 0)
5547     {
5548       int tmp = execution_count;
5549
5550       /* We'll use ld if we can't find collect2. */
5551       if (! strcmp (linker_name_spec, "collect2"))
5552         {
5553           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
5554           if (s == NULL)
5555             linker_name_spec = "ld";
5556         }
5557       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
5558          for collect.  */
5559       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
5560       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
5561
5562       value = do_spec (link_command_spec);
5563       if (value < 0)
5564         error_count = 1;
5565       linker_was_run = (tmp != execution_count);
5566     }
5567
5568   /* Warn if a -B option was specified but the prefix was never used.  */
5569   unused_prefix_warnings (&exec_prefixes);
5570   unused_prefix_warnings (&startfile_prefixes);
5571
5572   /* If options said don't run linker,
5573      complain about input files to be given to the linker.  */
5574
5575   if (! linker_was_run && error_count == 0)
5576     for (i = 0; (int)i < n_infiles; i++)
5577       if (explicit_link_files[i])
5578         error ("%s: linker input file unused since linking not done",
5579                outfiles[i]);
5580
5581   /* Delete some or all of the temporary files we made.  */
5582
5583   if (error_count)
5584     delete_failure_queue ();
5585   delete_temp_files ();
5586
5587   if (print_help_list)
5588     {
5589       printf (("\nFor bug reporting instructions, please see:\n"));
5590       printf ("%s\n", GCCBUGURL);
5591     }
5592   
5593   return (signal_count != 0 ? 2
5594           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
5595           : 0);
5596 }
5597
5598 /* Find the proper compilation spec for the file name NAME,
5599    whose length is LENGTH.  LANGUAGE is the specified language,
5600    or 0 if this file is to be passed to the linker.  */
5601
5602 static struct compiler *
5603 lookup_compiler (name, length, language)
5604      const char *name;
5605      size_t length;
5606      const char *language;
5607 {
5608   struct compiler *cp;
5609
5610   /* If this was specified by the user to be a linker input, indicate that.  */
5611   if (language != 0 && language[0] == '*')
5612     return 0;
5613
5614   /* Otherwise, look for the language, if one is spec'd.  */
5615   if (language != 0)
5616     {
5617       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5618         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
5619           return cp;
5620
5621       error ("language %s not recognized", language);
5622       return 0;
5623     }
5624
5625   /* Look for a suffix.  */
5626   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5627     {
5628       if (/* The suffix `-' matches only the file name `-'.  */
5629           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5630           || (strlen (cp->suffix) < length
5631               /* See if the suffix matches the end of NAME.  */
5632               && !strcmp (cp->suffix,
5633                           name + length - strlen (cp->suffix))
5634          ))
5635         break;
5636     }
5637
5638 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
5639   /* look again, but case-insensitively this time.  */
5640   if (cp < compilers)
5641     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5642       {
5643         if (/* The suffix `-' matches only the file name `-'.  */
5644             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5645             || (strlen (cp->suffix) < length
5646                 /* See if the suffix matches the end of NAME.  */
5647                 && ((!strcmp (cp->suffix,
5648                              name + length - strlen (cp->suffix))
5649                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
5650                     && !strcasecmp (cp->suffix,
5651                                     name + length - strlen (cp->suffix)))
5652            ))
5653           break;
5654       }
5655 #endif
5656
5657   if (cp >= compilers)
5658     {
5659       if (cp->spec[0] != '@')
5660         /* A non-alias entry: return it.  */
5661         return cp;
5662       
5663       /* An alias entry maps a suffix to a language.
5664          Search for the language; pass 0 for NAME and LENGTH
5665          to avoid infinite recursion if language not found.  */
5666       return lookup_compiler (NULL_PTR, 0, cp->spec + 1);
5667     }
5668   return 0;
5669 }
5670 \f
5671 static char *
5672 save_string (s, len)
5673   const char *s;
5674   int len;
5675 {
5676   register char *result = xmalloc (len + 1);
5677
5678   bcopy (s, result, len);
5679   result[len] = 0;
5680   return result;
5681 }
5682
5683 static void
5684 pfatal_with_name (name)
5685      const char *name;
5686 {
5687   perror_with_name (name);
5688   delete_temp_files ();
5689   exit (1);
5690 }
5691
5692 static void
5693 perror_with_name (name)
5694      const char *name;
5695 {
5696   error ("%s: %s", name, xstrerror (errno));
5697 }
5698
5699 static void
5700 pfatal_pexecute (errmsg_fmt, errmsg_arg)
5701      const char *errmsg_fmt;
5702      const char *errmsg_arg;
5703 {
5704   if (errmsg_arg)
5705     {
5706       int save_errno = errno;
5707
5708       /* Space for trailing '\0' is in %s.  */
5709       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
5710       sprintf (msg, errmsg_fmt, errmsg_arg);
5711       errmsg_fmt = msg;
5712
5713       errno = save_errno;
5714     }
5715
5716   pfatal_with_name (errmsg_fmt);
5717 }
5718
5719 /* Output an error message and exit */
5720
5721 void
5722 fancy_abort ()
5723 {
5724   fatal ("Internal gcc abort.");
5725 }
5726 \f
5727 /* Output an error message and exit */
5728
5729 void
5730 fatal VPARAMS ((const char *msgid, ...))
5731 {
5732 #ifndef ANSI_PROTOTYPES
5733   const char *msgid;
5734 #endif
5735   va_list ap;
5736
5737   VA_START (ap, msgid);
5738
5739 #ifndef ANSI_PROTOTYPES
5740   msgid = va_arg (ap, const char *);
5741 #endif
5742
5743   fprintf (stderr, "%s: ", programname);
5744   vfprintf (stderr, _(msgid), ap);
5745   va_end (ap);
5746   fprintf (stderr, "\n");
5747   delete_temp_files ();
5748   exit (1);
5749 }
5750
5751 static void
5752 error VPARAMS ((const char *msgid, ...))
5753 {
5754 #ifndef ANSI_PROTOTYPES
5755   const char *msgid;
5756 #endif
5757   va_list ap;
5758
5759   VA_START (ap, msgid);
5760
5761 #ifndef ANSI_PROTOTYPES
5762   msgid = va_arg (ap, const char *);
5763 #endif
5764
5765   fprintf (stderr, "%s: ", programname);
5766   vfprintf (stderr, _(msgid), ap);
5767   va_end (ap);
5768
5769   fprintf (stderr, "\n");
5770 }
5771
5772 static void
5773 notice VPARAMS ((const char *msgid, ...))
5774 {
5775 #ifndef ANSI_PROTOTYPES
5776   const char *msgid;
5777 #endif
5778   va_list ap;
5779
5780   VA_START (ap, msgid);
5781
5782 #ifndef ANSI_PROTOTYPES
5783   msgid = va_arg (ap, const char *);
5784 #endif
5785
5786   vfprintf (stderr, _(msgid), ap);
5787   va_end (ap);
5788 }
5789
5790 \f
5791 static void
5792 validate_all_switches ()
5793 {
5794   struct compiler *comp;
5795   register const char *p;
5796   register char c;
5797   struct spec_list *spec;
5798
5799   for (comp = compilers; comp->spec; comp++)
5800     {
5801       p = comp->spec;
5802       while ((c = *p++))
5803         if (c == '%' && *p == '{')
5804           /* We have a switch spec.  */
5805           validate_switches (p + 1);
5806     }
5807
5808   /* Look through the linked list of specs read from the specs file.  */
5809   for (spec = specs; spec ; spec = spec->next)
5810     {
5811       p = *(spec->ptr_spec);
5812       while ((c = *p++))
5813         if (c == '%' && *p == '{')
5814           /* We have a switch spec.  */
5815           validate_switches (p + 1);
5816     }
5817
5818   p = link_command_spec;
5819   while ((c = *p++))
5820     if (c == '%' && *p == '{')
5821       /* We have a switch spec.  */
5822       validate_switches (p + 1);
5823 }
5824
5825 /* Look at the switch-name that comes after START
5826    and mark as valid all supplied switches that match it.  */
5827
5828 static void
5829 validate_switches (start)
5830      const char *start;
5831 {
5832   register const char *p = start;
5833   const char *filter;
5834   register int i;
5835   int suffix = 0;
5836
5837   if (*p == '|')
5838     ++p;
5839
5840   if (*p == '!')
5841     ++p;
5842
5843   if (*p == '.')
5844     suffix = 1, ++p;
5845
5846   filter = p;
5847   while (*p != ':' && *p != '}') p++;
5848
5849   if (suffix)
5850     ;
5851   else if (p[-1] == '*')
5852     {
5853       /* Mark all matching switches as valid.  */
5854       --p;
5855       for (i = 0; i < n_switches; i++)
5856         if (!strncmp (switches[i].part1, filter, p - filter))
5857           switches[i].validated = 1;
5858     }
5859   else
5860     {
5861       /* Mark an exact matching switch as valid.  */
5862       for (i = 0; i < n_switches; i++)
5863         {
5864           if (!strncmp (switches[i].part1, filter, p - filter)
5865               && switches[i].part1[p - filter] == 0)
5866             switches[i].validated = 1;
5867         }
5868     }
5869 }
5870 \f
5871 /* Check whether a particular argument was used.  The first time we
5872    canonicalize the switches to keep only the ones we care about.  */
5873
5874 static int
5875 used_arg (p, len)
5876      const char *p;
5877      int len;
5878 {
5879   struct mswitchstr
5880   {
5881     const char *str;
5882     const char *replace;
5883     int len;
5884     int rep_len;
5885   };
5886
5887   static struct mswitchstr *mswitches;
5888   static int n_mswitches;
5889   int i, j;
5890
5891   if (!mswitches)
5892     {
5893       struct mswitchstr *matches;
5894       const char *q;
5895       int cnt = 0;
5896
5897       /* Break multilib_matches into the component strings of string and replacement
5898          string.  */
5899       for (q = multilib_matches; *q != '\0'; q++)
5900         if (*q == ';')
5901           cnt++;
5902
5903       matches = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
5904       i = 0;
5905       q = multilib_matches;
5906       while (*q != '\0')
5907         {
5908           matches[i].str = q;
5909           while (*q != ' ')
5910             {
5911               if (*q == '\0')
5912                 abort ();
5913               q++;
5914             }
5915           matches[i].len = q - matches[i].str;
5916
5917           matches[i].replace = ++q;
5918           while (*q != ';' && *q != '\0')
5919             {
5920               if (*q == ' ')
5921                 abort ();
5922               q++;
5923             }
5924           matches[i].rep_len = q - matches[i].replace;
5925           i++;
5926           if (*q == ';')
5927             q++;
5928         }
5929
5930       /* Now build a list of the replacement string for switches that we care
5931          about.  Make sure we allocate at least one entry.  This prevents
5932          xmalloc from calling fatal, and prevents us from re-executing this
5933          block of code.  */
5934       mswitches
5935         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
5936                                          * (n_switches ? n_switches : 1));
5937       for (i = 0; i < n_switches; i++)
5938         {
5939           int xlen = strlen (switches[i].part1);
5940           for (j = 0; j < cnt; j++)
5941             if (xlen == matches[j].len
5942                 && ! strncmp (switches[i].part1, matches[j].str, xlen))
5943               {
5944                 mswitches[n_mswitches].str = matches[j].replace;
5945                 mswitches[n_mswitches].len = matches[j].rep_len;
5946                 mswitches[n_mswitches].replace = (char *)0;
5947                 mswitches[n_mswitches].rep_len = 0;
5948                 n_mswitches++;
5949                 break;
5950               }
5951         }
5952     }
5953
5954   for (i = 0; i < n_mswitches; i++)
5955     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
5956       return 1;
5957
5958   return 0;
5959 }
5960
5961 static int
5962 default_arg (p, len)
5963      const char *p;
5964      int len;
5965 {
5966   const char *start, *end;
5967
5968   for (start = multilib_defaults; *start != '\0'; start = end+1)
5969     {
5970       while (*start == ' ' || *start == '\t')
5971         start++;
5972
5973       if (*start == '\0')
5974         break;
5975
5976       for (end = start+1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
5977         ;
5978
5979       if ((end - start) == len && strncmp (p, start, len) == 0)
5980         return 1;
5981
5982       if (*end == '\0')
5983         break;
5984     }
5985
5986   return 0;
5987 }
5988
5989 /* Work out the subdirectory to use based on the options. The format of
5990    multilib_select is a list of elements. Each element is a subdirectory
5991    name followed by a list of options followed by a semicolon. The format
5992    of multilib_exclusions is the same, but without the preceding
5993    directory. First gcc will check the exclusions, if none of the options
5994    beginning with an exclamation point are present, and all of the other
5995    options are present, then we will ignore this completely. Passing
5996    that, gcc will consider each multilib_select in turn using the same
5997    rules for matching the options. If a match is found, that subdirectory
5998    will be used.  */
5999
6000 static void
6001 set_multilib_dir ()
6002 {
6003   const char *p;
6004   unsigned int this_path_len;
6005   const char *this_path, *this_arg;
6006   int not_arg;
6007   int ok;
6008
6009   p = multilib_exclusions;
6010   while (*p != '\0')
6011     {
6012       /* Ignore newlines.  */
6013       if (*p == '\n')
6014         {
6015           ++p;
6016           continue;
6017         }
6018
6019       /* Check the arguments.  */
6020       ok = 1;
6021       while (*p != ';')
6022         {
6023           if (*p == '\0')
6024             abort ();
6025
6026           if (! ok)
6027             {
6028               ++p;
6029               continue;
6030             }
6031
6032           this_arg = p;
6033           while (*p != ' ' && *p != ';')
6034             {
6035               if (*p == '\0')
6036                 abort ();
6037               ++p;
6038             }
6039
6040           if (*this_arg != '!')
6041             not_arg = 0;
6042           else
6043             {
6044               not_arg = 1;
6045               ++this_arg;
6046             }
6047   
6048           ok = used_arg (this_arg, p - this_arg);
6049           if (not_arg)
6050             ok = ! ok;
6051
6052           if (*p == ' ')
6053             ++p;
6054         }
6055
6056       if (ok)
6057         return;
6058
6059       ++p;
6060     }
6061
6062   p = multilib_select;
6063   while (*p != '\0')
6064     {
6065       /* Ignore newlines.  */
6066       if (*p == '\n')
6067         {
6068           ++p;
6069           continue;
6070         }
6071
6072       /* Get the initial path.  */
6073       this_path = p;
6074       while (*p != ' ')
6075         {
6076           if (*p == '\0')
6077             abort ();
6078           ++p;
6079         }
6080       this_path_len = p - this_path;
6081
6082       /* Check the arguments.  */
6083       ok = 1;
6084       ++p;
6085       while (*p != ';')
6086         {
6087           if (*p == '\0')
6088             abort ();
6089
6090           if (! ok)
6091             {
6092               ++p;
6093               continue;
6094             }
6095
6096           this_arg = p;
6097           while (*p != ' ' && *p != ';')
6098             {
6099               if (*p == '\0')
6100                 abort ();
6101               ++p;
6102             }
6103
6104           if (*this_arg != '!')
6105             not_arg = 0;
6106           else
6107             {
6108               not_arg = 1;
6109               ++this_arg;
6110             }
6111
6112           /* If this is a default argument, we can just ignore it.
6113              This is true even if this_arg begins with '!'.  Beginning
6114              with '!' does not mean that this argument is necessarily
6115              inappropriate for this library: it merely means that
6116              there is a more specific library which uses this
6117              argument.  If this argument is a default, we need not
6118              consider that more specific library.  */
6119           if (! default_arg (this_arg, p - this_arg))
6120             {
6121               ok = used_arg (this_arg, p - this_arg);
6122               if (not_arg)
6123                 ok = ! ok;
6124             }
6125
6126           if (*p == ' ')
6127             ++p;
6128         }
6129
6130       if (ok)
6131         {
6132           if (this_path_len != 1
6133               || this_path[0] != '.')
6134             {
6135               char * new_multilib_dir = xmalloc (this_path_len + 1);
6136               strncpy (new_multilib_dir, this_path, this_path_len);
6137               new_multilib_dir[this_path_len] = '\0';
6138               multilib_dir = new_multilib_dir;
6139             }
6140           break;
6141         }
6142
6143       ++p;
6144     }      
6145 }
6146
6147 /* Print out the multiple library subdirectory selection
6148    information.  This prints out a series of lines.  Each line looks
6149    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6150    required.  Only the desired options are printed out, the negative
6151    matches.  The options are print without a leading dash.  There are
6152    no spaces to make it easy to use the information in the shell.
6153    Each subdirectory is printed only once.  This assumes the ordering
6154    generated by the genmultilib script. Also, we leave out ones that match
6155    the exclusions.  */
6156
6157 static void
6158 print_multilib_info ()
6159 {
6160   const char *p = multilib_select;
6161   const char *last_path = 0, *this_path;
6162   int skip;
6163   unsigned int last_path_len = 0;
6164
6165   while (*p != '\0')
6166     {
6167       skip = 0;
6168       /* Ignore newlines.  */
6169       if (*p == '\n')
6170         {
6171           ++p;
6172           continue;
6173         }
6174
6175       /* Get the initial path.  */
6176       this_path = p;
6177       while (*p != ' ')
6178         {
6179           if (*p == '\0')
6180             abort ();
6181           ++p;
6182         }
6183
6184       /* Check for matches with the multilib_exclusions. We don't bother
6185          with the '!' in either list. If any of the exclusion rules match
6186          all of its options with the select rule, we skip it.  */
6187         {
6188           const char *e = multilib_exclusions;
6189           const char *this_arg;
6190
6191           while (*e != '\0')
6192             {
6193               int m = 1;        
6194               /* Ignore newlines.  */
6195               if (*e == '\n')
6196                 {
6197                   ++e;
6198                   continue;
6199                 }
6200               
6201               /* Check the arguments.  */
6202               while (*e != ';')
6203                 {
6204                   const char *q;
6205                   int mp = 0;
6206
6207                   if (*e == '\0')
6208                     abort ();
6209
6210                   if (! m)
6211                     {
6212                       ++e;
6213                       continue;
6214                     }
6215
6216                   this_arg = e;
6217
6218                   while (*e != ' ' && *e != ';')
6219                     {
6220                       if (*e == '\0')
6221                         abort ();
6222                       ++e;
6223                     }
6224                   
6225                   q = p + 1;
6226                   while (*q != ';')
6227                     {
6228                       const char *arg;
6229                       int len = e - this_arg;
6230
6231                       if (*q == '\0')
6232                         abort ();
6233         
6234                       arg = q;
6235
6236                       while (*q != ' ' && *q != ';')
6237                         {
6238                           if (*q == '\0')
6239                             abort ();
6240                             ++q;
6241                         }
6242
6243                       if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6244                           default_arg (this_arg, e - this_arg))
6245                         {
6246                           mp = 1;
6247                           break;
6248                         }
6249
6250                       if (*q == ' ')
6251                         ++q;
6252                     }
6253
6254                   if (! mp)
6255                     m = 0;
6256
6257                   if (*e == ' ')
6258                     ++e;
6259                 }
6260               
6261               if (m)
6262                 {
6263                   skip = 1;
6264                   break;
6265                 }
6266
6267               if (*e != '\0')
6268                 ++e;
6269             }
6270         }
6271
6272       if (! skip)
6273         {
6274           /* If this is a duplicate, skip it.  */
6275           skip = (last_path != 0 && (unsigned int)(p - this_path) == last_path_len
6276                   && ! strncmp (last_path, this_path, last_path_len));
6277
6278           last_path = this_path;
6279           last_path_len = p - this_path;
6280         }
6281
6282       /* If this directory requires any default arguments, we can skip
6283          it.  We will already have printed a directory identical to
6284          this one which does not require that default argument.  */
6285       if (! skip)
6286         {
6287           const char *q;
6288
6289           q = p + 1;
6290           while (*q != ';')
6291             {
6292               const char *arg;
6293
6294               if (*q == '\0')
6295                 abort ();
6296
6297               if (*q == '!')
6298                 arg = NULL;
6299               else
6300                 arg = q;
6301
6302               while (*q != ' ' && *q != ';')
6303                 {
6304                   if (*q == '\0')
6305                     abort ();
6306                   ++q;
6307                 }
6308
6309               if (arg != NULL
6310                   && default_arg (arg, q - arg))
6311                 {
6312                   skip = 1;
6313                   break;
6314                 }
6315
6316               if (*q == ' ')
6317                 ++q;
6318             }
6319         }
6320
6321       if (! skip)
6322         {
6323           const char *p1;
6324
6325           for (p1 = last_path; p1 < p; p1++)
6326             putchar (*p1);
6327           putchar (';');
6328         }
6329
6330       ++p;
6331       while (*p != ';')
6332         {
6333           int use_arg;
6334
6335           if (*p == '\0')
6336             abort ();
6337
6338           if (skip)
6339             {
6340               ++p;
6341               continue;
6342             }
6343
6344           use_arg = *p != '!';
6345
6346           if (use_arg)
6347             putchar ('@');
6348
6349           while (*p != ' ' && *p != ';')
6350             {
6351               if (*p == '\0')
6352                 abort ();
6353               if (use_arg)
6354                 putchar (*p);
6355               ++p;
6356             }
6357
6358           if (*p == ' ')
6359             ++p;
6360         }
6361
6362       if (! skip)
6363         {
6364           /* If there are extra options, print them now.  */
6365           if (multilib_extra && *multilib_extra)
6366             {
6367               int print_at = TRUE;
6368               const char *q;
6369
6370               for (q = multilib_extra; *q != '\0'; q++)
6371                 {
6372                   if (*q == ' ')
6373                     print_at = TRUE;
6374                   else
6375                     {
6376                       if (print_at)
6377                         putchar ('@');
6378                       putchar (*q);
6379                       print_at = FALSE;
6380                     }
6381                 }
6382             }
6383           
6384           putchar ('\n');
6385         }
6386
6387       ++p;
6388     }
6389 }