OSDN Git Service

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