OSDN Git Service

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