* gcc.c (default_compilers) [@cpp-output]: Add -fpreprocessed.
[platform/upstream/gcc.git] / gcc / gcc.c
1 /* Compiler driver program that can handle many languages.
2    Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
21
22 This paragraph is here to try to keep Sun CC from dying.
23 The number of chars here seems crucial!!!!  */
24
25 /* This program is the user interface to the C compiler and possibly to
26 other compilers.  It is used because compilation is a complicated procedure
27 which involves running several programs and passing temporary files between
28 them, forwarding the users switches to those programs selectively,
29 and deleting the temporary files at the end.
30
31 CC recognizes how to compile each input file by suffixes in the file names.
32 Once it knows which kind of compilation to perform, the procedure for
33 compilation is specified by a string called a "spec".  */
34
35 #include "config.h"
36 #include "system.h"
37 #include <signal.h>
38 #include "obstack.h"
39 #include "intl.h"
40 #include "prefix.h"
41 #include "gcc.h"
42
43 #ifdef VMS
44 #define exit __posix_exit
45 #endif
46
47 #ifdef HAVE_SYS_RESOURCE_H
48 #include <sys/resource.h>
49 #endif
50 #if defined (HAVE_DECL_GETRUSAGE) && !HAVE_DECL_GETRUSAGE
51 extern int getrusage PARAMS ((int, struct rusage *));
52 #endif
53
54 /* By default there is no special suffix for executables.  */
55 #ifdef EXECUTABLE_SUFFIX
56 #define HAVE_EXECUTABLE_SUFFIX
57 #else
58 #define EXECUTABLE_SUFFIX ""
59 #endif
60
61 /* By default, the suffix for object files is ".o".  */
62 #ifdef OBJECT_SUFFIX
63 #define HAVE_OBJECT_SUFFIX
64 #else
65 #define OBJECT_SUFFIX ".o"
66 #endif
67
68 #ifndef VMS
69 /* FIXME: the location independence code for VMS is hairier than this,
70    and hasn't been written.  */
71 #ifndef DIR_UP
72 #define DIR_UP ".."
73 #endif /* DIR_UP */
74 #endif /* VMS */
75
76 static char dir_separator_str[] = { DIR_SEPARATOR, 0 };
77
78 #define obstack_chunk_alloc xmalloc
79 #define obstack_chunk_free free
80
81 #ifndef GET_ENV_PATH_LIST
82 #define GET_ENV_PATH_LIST(VAR,NAME)     do { (VAR) = getenv (NAME); } while (0)
83 #endif
84
85 /* Most every one is fine with LIBRARY_PATH.  For some, it conflicts.  */
86 #ifndef LIBRARY_PATH_ENV
87 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
88 #endif
89
90 #ifndef HAVE_KILL
91 #define kill(p,s) raise(s)
92 #endif
93
94 /* If a stage of compilation returns an exit status >= 1,
95    compilation of that file ceases.  */
96
97 #define MIN_FATAL_STATUS 1
98
99 /* Flag saying to pass the greatest exit code returned by a sub-process
100    to the calling program.  */
101 static int pass_exit_codes;
102
103 /* 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   || !strcmp (STR, "MF") || !strcmp (STR, "MT"))
658
659 #ifndef WORD_SWITCH_TAKES_ARG
660 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
661 #endif
662 \f
663 #ifdef HAVE_EXECUTABLE_SUFFIX
664 /* This defines which switches stop a full compilation.  */
665 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
666   ((CHAR) == 'c' || (CHAR) == 'S')
667
668 #ifndef SWITCH_CURTAILS_COMPILATION
669 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
670   DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
671 #endif
672 #endif
673
674 /* Record the mapping from file suffixes for compilation specs.  */
675
676 struct compiler
677 {
678   const char *suffix;           /* Use this compiler for input files
679                                    whose names end in this suffix.  */
680
681   const char *spec;             /* To use this compiler, run this spec.  */
682 };
683
684 /* Pointer to a vector of `struct compiler' that gives the spec for
685    compiling a file, based on its suffix.
686    A file that does not end in any of these suffixes will be passed
687    unchanged to the loader and nothing else will be done to it.
688
689    An entry containing two 0s is used to terminate the vector.
690
691    If multiple entries match a file, the last matching one is used.  */
692
693 static struct compiler *compilers;
694
695 /* Number of entries in `compilers', not counting the null terminator.  */
696
697 static int n_compilers;
698
699 /* The default list of file name suffixes and their compilation specs.  */
700
701 static struct compiler default_compilers[] =
702 {
703   /* Add lists of suffixes of known languages here.  If those languages
704      were not present when we built the driver, we will hit these copies
705      and be given a more meaningful error than "file not used since
706      linking is not done".  */
707   {".m",  "#Objective-C"},
708   {".cc", "#C++"}, {".cxx", "#C++"}, {".cpp", "#C++"},
709   {".c++", "#C++"}, {".C", "#C++"},
710   {".ads", "#Ada"}, {".adb", "#Ada"}, {".ada", "#Ada"},
711   {".f", "#Fortran"}, {".for", "#Fortran"}, {".F", "#Fortran"},
712   {".fpp", "#Fortran"}, {".r", "#Ratfor"},
713   {".p", "#Pascal"}, {".pas", "#Pascal"},
714   {".ch", "#Chill"}, {".chi", "#Chill"},
715   {".java", "#Java"}, {".class", "#Java"},
716   {".zip", "#Java"}, {".jar", "#Java"},
717   /* Next come the entries for C.  */
718   {".c", "@c"},
719   {"@c",
720 #if USE_CPPLIB
721    /* cc1 has an integrated ISO C preprocessor.  We should invoke the
722       external preprocessor if -save-temps or -traditional is given.  */
723      "%{E|M|MM:%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)}\
724       %{!E:%{!M:%{!MM:\
725           %{save-temps:%(trad_capable_cpp) -lang-c %{ansi:-std=c89}\
726                 %(cpp_options) %b.i \n\
727                     cc1 -fpreprocessed %b.i %(cc1_options)}\
728           %{!save-temps:\
729             %{traditional|ftraditional|traditional-cpp:\
730                 tradcpp0 -lang-c %{ansi:-std=c89} %(cpp_options) %{!pipe:%g.i} |\n\
731                     cc1 -fpreprocessed %{!pipe:%g.i} %(cc1_options)}\
732             %{!traditional:%{!ftraditional:%{!traditional-cpp:\
733                 cc1 -lang-c %{ansi:-std=c89} %(cpp_options) %(cc1_options)}}}}\
734         %{!fsyntax-only:%(invoke_as)}}}}"
735 #else /* ! USE_CPPLIB */
736      "%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options) \
737                           %{!M:%{!MM:%{!E:%{!pipe:%g.i} |\n\
738       cc1 %{!pipe:%g.i} %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}"
739 #endif /* ! USE_CPPLIB */
740   },
741   {"-",
742    "%{!E:%e-E required when input is from standard input}\
743     %(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)"},
744   {".h", "@c-header"},
745   {"@c-header",
746    "%{!E:%eCompilation of header file requested} \
747     %(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)"},
748   {".i", "@cpp-output"},
749   {"@cpp-output",
750    "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}"},
751   {".s", "@assembler"},
752   {"@assembler",
753    "%{!M:%{!MM:%{!E:%{!S:as %(asm_options) %i %A }}}}"},
754   {".S", "@assembler-with-cpp"},
755   {"@assembler-with-cpp",
756    "%(trad_capable_cpp) -lang-asm %(cpp_options)\
757         %{!M:%{!MM:%{!E:%(invoke_as)}}}"},
758 #include "specs.h"
759   /* Mark end of table */
760   {0, 0}
761 };
762
763 /* Number of elements in default_compilers, not counting the terminator.  */
764
765 static int n_default_compilers
766   = (sizeof default_compilers / sizeof (struct compiler)) - 1;
767
768 /* A vector of options to give to the linker.
769    These options are accumulated by %x,
770    and substituted into the linker command with %X.  */
771 static int n_linker_options;
772 static char **linker_options;
773
774 /* A vector of options to give to the assembler.
775    These options are accumulated by -Wa,
776    and substituted into the assembler command with %Y.  */
777 static int n_assembler_options;
778 static char **assembler_options;
779
780 /* A vector of options to give to the preprocessor.
781    These options are accumulated by -Wp,
782    and substituted into the preprocessor command with %Z.  */
783 static int n_preprocessor_options;
784 static char **preprocessor_options;
785 \f
786 /* Define how to map long options into short ones.  */
787
788 /* This structure describes one mapping.  */
789 struct option_map
790 {
791   /* The long option's name.  */
792   const char *name;
793   /* The equivalent short option.  */
794   const char *equivalent;
795   /* Argument info.  A string of flag chars; NULL equals no options.
796      a => argument required.
797      o => argument optional.
798      j => join argument to equivalent, making one word.
799      * => require other text after NAME as an argument.  */
800   const char *arg_info;
801 };
802
803 /* This is the table of mappings.  Mappings are tried sequentially
804    for each option encountered; the first one that matches, wins.  */
805
806 struct option_map option_map[] =
807  {
808    {"--all-warnings", "-Wall", 0},
809    {"--ansi", "-ansi", 0},
810    {"--assemble", "-S", 0},
811    {"--assert", "-A", "a"},
812    {"--classpath", "-fclasspath=", "aj"},
813    {"--CLASSPATH", "-fCLASSPATH=", "aj"},
814    {"--comments", "-C", 0},
815    {"--compile", "-c", 0},
816    {"--debug", "-g", "oj"},
817    {"--define-macro", "-D", "aj"},
818    {"--dependencies", "-M", 0},
819    {"--dump", "-d", "a"},
820    {"--dumpbase", "-dumpbase", "a"},
821    {"--entry", "-e", 0},
822    {"--extra-warnings", "-W", 0},
823    {"--for-assembler", "-Wa", "a"},
824    {"--for-linker", "-Xlinker", "a"},
825    {"--force-link", "-u", "a"},
826    {"--imacros", "-imacros", "a"},
827    {"--include", "-include", "a"},
828    {"--include-barrier", "-I-", 0},
829    {"--include-directory", "-I", "aj"},
830    {"--include-directory-after", "-idirafter", "a"},
831    {"--include-prefix", "-iprefix", "a"},
832    {"--include-with-prefix", "-iwithprefix", "a"},
833    {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
834    {"--include-with-prefix-after", "-iwithprefix", "a"},
835    {"--language", "-x", "a"},
836    {"--library-directory", "-L", "a"},
837    {"--machine", "-m", "aj"},
838    {"--machine-", "-m", "*j"},
839    {"--no-line-commands", "-P", 0},
840    {"--no-precompiled-includes", "-noprecomp", 0},
841    {"--no-standard-includes", "-nostdinc", 0},
842    {"--no-standard-libraries", "-nostdlib", 0},
843    {"--no-warnings", "-w", 0},
844    {"--optimize", "-O", "oj"},
845    {"--output", "-o", "a"},
846    {"--output-class-directory", "-foutput-class-dir=", "ja"},
847    {"--pedantic", "-pedantic", 0},
848    {"--pedantic-errors", "-pedantic-errors", 0},
849    {"--pipe", "-pipe", 0},
850    {"--prefix", "-B", "a"},
851    {"--preprocess", "-E", 0},
852    {"--print-search-dirs", "-print-search-dirs", 0},
853    {"--print-file-name", "-print-file-name=", "aj"},
854    {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
855    {"--print-missing-file-dependencies", "-MG", 0},
856    {"--print-multi-lib", "-print-multi-lib", 0},
857    {"--print-multi-directory", "-print-multi-directory", 0},
858    {"--print-prog-name", "-print-prog-name=", "aj"},
859    {"--profile", "-p", 0},
860    {"--profile-blocks", "-a", 0},
861    {"--quiet", "-q", 0},
862    {"--save-temps", "-save-temps", 0},
863    {"--shared", "-shared", 0},
864    {"--silent", "-q", 0},
865    {"--specs", "-specs=", "aj"},
866    {"--static", "-static", 0},
867    {"--std", "-std=", "aj"},
868    {"--symbolic", "-symbolic", 0},
869    {"--target", "-b", "a"},
870    {"--time", "-time", 0},
871    {"--trace-includes", "-H", 0},
872    {"--traditional", "-traditional", 0},
873    {"--traditional-cpp", "-traditional-cpp", 0},
874    {"--trigraphs", "-trigraphs", 0},
875    {"--undefine-macro", "-U", "aj"},
876    {"--use-version", "-V", "a"},
877    {"--user-dependencies", "-MM", 0},
878    {"--verbose", "-v", 0},
879    {"--version", "-dumpversion", 0},
880    {"--warn-", "-W", "*j"},
881    {"--write-dependencies", "-MD", 0},
882    {"--write-user-dependencies", "-MMD", 0},
883    {"--", "-f", "*j"}
884  };
885 \f
886 /* Translate the options described by *ARGCP and *ARGVP.
887    Make a new vector and store it back in *ARGVP,
888    and store its length in *ARGVC.  */
889
890 static void
891 translate_options (argcp, argvp)
892      int *argcp;
893      const char *const **argvp;
894 {
895   int i;
896   int argc = *argcp;
897   const char *const *argv = *argvp;
898   const char **newv =
899     (const char **) xmalloc ((argc + 2) * 2 * sizeof (const char *));
900   int newindex = 0;
901
902   i = 0;
903   newv[newindex++] = argv[i++];
904
905   while (i < argc)
906     {
907       /* Translate -- options.  */
908       if (argv[i][0] == '-' && argv[i][1] == '-')
909         {
910           size_t j;
911           /* Find a mapping that applies to this option.  */
912           for (j = 0; j < ARRAY_SIZE (option_map); j++)
913             {
914               size_t optlen = strlen (option_map[j].name);
915               size_t arglen = strlen (argv[i]);
916               size_t complen = arglen > optlen ? optlen : arglen;
917               const char *arginfo = option_map[j].arg_info;
918
919               if (arginfo == 0)
920                 arginfo = "";
921
922               if (!strncmp (argv[i], option_map[j].name, complen))
923                 {
924                   const char *arg = 0;
925
926                   if (arglen < optlen)
927                     {
928                       size_t k;
929                       for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
930                         if (strlen (option_map[k].name) >= arglen
931                             && !strncmp (argv[i], option_map[k].name, arglen))
932                           {
933                             error ("Ambiguous abbreviation %s", argv[i]);
934                             break;
935                           }
936
937                       if (k != ARRAY_SIZE (option_map))
938                         break;
939                     }
940
941                   if (arglen > optlen)
942                     {
943                       /* If the option has an argument, accept that.  */
944                       if (argv[i][optlen] == '=')
945                         arg = argv[i] + optlen + 1;
946
947                       /* If this mapping requires extra text at end of name,
948                          accept that as "argument".  */
949                       else if (strchr (arginfo, '*') != 0)
950                         arg = argv[i] + optlen;
951
952                       /* Otherwise, extra text at end means mismatch.
953                          Try other mappings.  */
954                       else
955                         continue;
956                     }
957
958                   else if (strchr (arginfo, '*') != 0)
959                     {
960                       error ("Incomplete `%s' option", option_map[j].name);
961                       break;
962                     }
963
964                   /* Handle arguments.  */
965                   if (strchr (arginfo, 'a') != 0)
966                     {
967                       if (arg == 0)
968                         {
969                           if (i + 1 == argc)
970                             {
971                               error ("Missing argument to `%s' option",
972                                      option_map[j].name);
973                               break;
974                             }
975
976                           arg = argv[++i];
977                         }
978                     }
979                   else if (strchr (arginfo, '*') != 0)
980                     ;
981                   else if (strchr (arginfo, 'o') == 0)
982                     {
983                       if (arg != 0)
984                         error ("Extraneous argument to `%s' option",
985                                option_map[j].name);
986                       arg = 0;
987                     }
988
989                   /* Store the translation as one argv elt or as two.  */
990                   if (arg != 0 && strchr (arginfo, 'j') != 0)
991                     newv[newindex++] = concat (option_map[j].equivalent, arg,
992                                                NULL_PTR);
993                   else if (arg != 0)
994                     {
995                       newv[newindex++] = option_map[j].equivalent;
996                       newv[newindex++] = arg;
997                     }
998                   else
999                     newv[newindex++] = option_map[j].equivalent;
1000
1001                   break;
1002                 }
1003             }
1004           i++;
1005         }
1006
1007       /* Handle old-fashioned options--just copy them through,
1008          with their arguments.  */
1009       else if (argv[i][0] == '-')
1010         {
1011           const char *p = argv[i] + 1;
1012           int c = *p;
1013           int nskip = 1;
1014
1015           if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1016             nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1017           else if (WORD_SWITCH_TAKES_ARG (p))
1018             nskip += WORD_SWITCH_TAKES_ARG (p);
1019           else if ((c == 'B' || c == 'b' || c == 'V' || c == 'x')
1020                    && p[1] == 0)
1021             nskip += 1;
1022           else if (! strcmp (p, "Xlinker"))
1023             nskip += 1;
1024
1025           /* Watch out for an option at the end of the command line that
1026              is missing arguments, and avoid skipping past the end of the
1027              command line.  */
1028           if (nskip + i > argc)
1029             nskip = argc - i;
1030
1031           while (nskip > 0)
1032             {
1033               newv[newindex++] = argv[i++];
1034               nskip--;
1035             }
1036         }
1037       else
1038         /* Ordinary operands, or +e options.  */
1039         newv[newindex++] = argv[i++];
1040     }
1041
1042   newv[newindex] = 0;
1043
1044   *argvp = newv;
1045   *argcp = newindex;
1046 }
1047 \f
1048 static char *
1049 skip_whitespace (p)
1050      char *p;
1051 {
1052   while (1)
1053     {
1054       /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1055          be considered whitespace.  */
1056       if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1057         return p + 1;
1058       else if (*p == '\n' || *p == ' ' || *p == '\t')
1059         p++;
1060       else if (*p == '#')
1061         {
1062           while (*p != '\n')
1063             p++;
1064           p++;
1065         }
1066       else
1067         break;
1068     }
1069
1070   return p;
1071 }
1072 /* Structures to keep track of prefixes to try when looking for files.  */
1073
1074 struct prefix_list
1075 {
1076   char *prefix;               /* String to prepend to the path.  */
1077   struct prefix_list *next;   /* Next in linked list.  */
1078   int require_machine_suffix; /* Don't use without machine_suffix.  */
1079   /* 2 means try both machine_suffix and just_machine_suffix.  */
1080   int *used_flag_ptr;         /* 1 if a file was found with this prefix.  */
1081   int priority;               /* Sort key - priority within list */
1082 };
1083
1084 struct path_prefix
1085 {
1086   struct prefix_list *plist;  /* List of prefixes to try */
1087   int max_len;                /* Max length of a prefix in PLIST */
1088   const char *name;           /* Name of this list (used in config stuff) */
1089 };
1090
1091 /* List of prefixes to try when looking for executables.  */
1092
1093 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1094
1095 /* List of prefixes to try when looking for startup (crt0) files.  */
1096
1097 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1098
1099 /* List of prefixes to try when looking for include files.  */
1100
1101 static struct path_prefix include_prefixes = { 0, 0, "include" };
1102
1103 /* Suffix to attach to directories searched for commands.
1104    This looks like `MACHINE/VERSION/'.  */
1105
1106 static const char *machine_suffix = 0;
1107
1108 /* Suffix to attach to directories searched for commands.
1109    This is just `MACHINE/'.  */
1110
1111 static const char *just_machine_suffix = 0;
1112
1113 /* Adjusted value of GCC_EXEC_PREFIX envvar.  */
1114
1115 static const char *gcc_exec_prefix;
1116
1117 /* Default prefixes to attach to command names.  */
1118
1119 #ifdef CROSS_COMPILE  /* Don't use these prefixes for a cross compiler.  */
1120 #undef MD_EXEC_PREFIX
1121 #undef MD_STARTFILE_PREFIX
1122 #undef MD_STARTFILE_PREFIX_1
1123 #endif
1124
1125 /* If no prefixes defined, use the null string, which will disable them.  */
1126 #ifndef MD_EXEC_PREFIX
1127 #define MD_EXEC_PREFIX ""
1128 #endif
1129 #ifndef MD_STARTFILE_PREFIX
1130 #define MD_STARTFILE_PREFIX ""
1131 #endif
1132 #ifndef MD_STARTFILE_PREFIX_1
1133 #define MD_STARTFILE_PREFIX_1 ""
1134 #endif
1135
1136 /* Supply defaults for the standard prefixes.  */
1137
1138 #ifndef STANDARD_EXEC_PREFIX
1139 #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
1140 #endif
1141 #ifndef STANDARD_STARTFILE_PREFIX
1142 #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
1143 #endif
1144 #ifndef TOOLDIR_BASE_PREFIX
1145 #define TOOLDIR_BASE_PREFIX "/usr/local/"
1146 #endif
1147 #ifndef STANDARD_BINDIR_PREFIX
1148 #define STANDARD_BINDIR_PREFIX "/usr/local/bin"
1149 #endif
1150
1151 static const char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
1152 static const char *standard_exec_prefix_1 = "/usr/lib/gcc/";
1153 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1154
1155 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1156 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1157 static const char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1158 static const char *standard_startfile_prefix_1 = "/lib/";
1159 static const char *standard_startfile_prefix_2 = "/usr/lib/";
1160
1161 static const char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1162 static const char *tooldir_prefix;
1163
1164 static const char *standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1165
1166 /* Subdirectory to use for locating libraries.  Set by
1167    set_multilib_dir based on the compilation options.  */
1168
1169 static const char *multilib_dir;
1170 \f
1171 /* Structure to keep track of the specs that have been defined so far.
1172    These are accessed using %(specname) or %[specname] in a compiler
1173    or link spec.  */
1174
1175 struct spec_list
1176 {
1177                                 /* The following 2 fields must be first */
1178                                 /* to allow EXTRA_SPECS to be initialized */
1179   const char *name;             /* name of the spec.  */
1180   const char *ptr;              /* available ptr if no static pointer */
1181
1182                                 /* The following fields are not initialized */
1183                                 /* by EXTRA_SPECS */
1184   const char **ptr_spec;        /* pointer to the spec itself.  */
1185   struct spec_list *next;       /* Next spec in linked list.  */
1186   int name_len;                 /* length of the name */
1187   int alloc_p;                  /* whether string was allocated */
1188 };
1189
1190 #define INIT_STATIC_SPEC(NAME,PTR) \
1191 { NAME, NULL_PTR, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1192
1193 /* List of statically defined specs.  */
1194 static struct spec_list static_specs[] =
1195 {
1196   INIT_STATIC_SPEC ("asm",                      &asm_spec),
1197   INIT_STATIC_SPEC ("asm_final",                &asm_final_spec),
1198   INIT_STATIC_SPEC ("asm_options",              &asm_options),
1199   INIT_STATIC_SPEC ("invoke_as",                &invoke_as),
1200   INIT_STATIC_SPEC ("cpp",                      &cpp_spec),
1201   INIT_STATIC_SPEC ("cpp_options",              &cpp_options),
1202   INIT_STATIC_SPEC ("trad_capable_cpp",         &trad_capable_cpp),
1203   INIT_STATIC_SPEC ("cc1",                      &cc1_spec),
1204   INIT_STATIC_SPEC ("cc1_options",              &cc1_options),
1205   INIT_STATIC_SPEC ("cc1plus",                  &cc1plus_spec),
1206   INIT_STATIC_SPEC ("endfile",                  &endfile_spec),
1207   INIT_STATIC_SPEC ("link",                     &link_spec),
1208   INIT_STATIC_SPEC ("lib",                      &lib_spec),
1209   INIT_STATIC_SPEC ("libgcc",                   &libgcc_spec),
1210   INIT_STATIC_SPEC ("startfile",                &startfile_spec),
1211   INIT_STATIC_SPEC ("switches_need_spaces",     &switches_need_spaces),
1212   INIT_STATIC_SPEC ("signed_char",              &signed_char_spec),
1213   INIT_STATIC_SPEC ("predefines",               &cpp_predefines),
1214   INIT_STATIC_SPEC ("cross_compile",            &cross_compile),
1215   INIT_STATIC_SPEC ("version",                  &compiler_version),
1216   INIT_STATIC_SPEC ("multilib",                 &multilib_select),
1217   INIT_STATIC_SPEC ("multilib_defaults",        &multilib_defaults),
1218   INIT_STATIC_SPEC ("multilib_extra",           &multilib_extra),
1219   INIT_STATIC_SPEC ("multilib_matches",         &multilib_matches),
1220   INIT_STATIC_SPEC ("multilib_exclusions",      &multilib_exclusions),
1221   INIT_STATIC_SPEC ("linker",                   &linker_name_spec),
1222   INIT_STATIC_SPEC ("link_libgcc",              &link_libgcc_spec),
1223   INIT_STATIC_SPEC ("md_exec_prefix",           &md_exec_prefix),
1224   INIT_STATIC_SPEC ("md_startfile_prefix",      &md_startfile_prefix),
1225   INIT_STATIC_SPEC ("md_startfile_prefix_1",    &md_startfile_prefix_1),
1226 };
1227
1228 #ifdef EXTRA_SPECS              /* additional specs needed */
1229 /* Structure to keep track of just the first two args of a spec_list.
1230    That is all that the EXTRA_SPECS macro gives us.  */
1231 struct spec_list_1
1232 {
1233   const char *name;
1234   const char *ptr;
1235 };
1236
1237 static struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1238 static struct spec_list *extra_specs = (struct spec_list *) 0;
1239 #endif
1240
1241 /* List of dynamically allocates specs that have been defined so far.  */
1242
1243 static struct spec_list *specs = (struct spec_list *) 0;
1244 \f
1245 /* Initialize the specs lookup routines.  */
1246
1247 static void
1248 init_spec ()
1249 {
1250   struct spec_list *next = (struct spec_list *) 0;
1251   struct spec_list *sl   = (struct spec_list *) 0;
1252   int i;
1253
1254   if (specs)
1255     return;                     /* Already initialized.  */
1256
1257   if (verbose_flag)
1258     notice ("Using builtin specs.\n");
1259
1260 #ifdef EXTRA_SPECS
1261   extra_specs = (struct spec_list *)
1262     xcalloc (sizeof (struct spec_list), ARRAY_SIZE (extra_specs_1));
1263
1264   for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1265     {
1266       sl = &extra_specs[i];
1267       sl->name = extra_specs_1[i].name;
1268       sl->ptr = extra_specs_1[i].ptr;
1269       sl->next = next;
1270       sl->name_len = strlen (sl->name);
1271       sl->ptr_spec = &sl->ptr;
1272       next = sl;
1273     }
1274 #endif
1275
1276   for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1277     {
1278       sl = &static_specs[i];
1279       sl->next = next;
1280       next = sl;
1281     }
1282
1283   specs = sl;
1284 }
1285 \f
1286 /* Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
1287    removed; If the spec starts with a + then SPEC is added to the end of the
1288    current spec.  */
1289
1290 static void
1291 set_spec (name, spec)
1292      const char *name;
1293      const char *spec;
1294 {
1295   struct spec_list *sl;
1296   const char *old_spec;
1297   int name_len = strlen (name);
1298   int i;
1299
1300   /* If this is the first call, initialize the statically allocated specs.  */
1301   if (!specs)
1302     {
1303       struct spec_list *next = (struct spec_list *) 0;
1304       for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1305         {
1306           sl = &static_specs[i];
1307           sl->next = next;
1308           next = sl;
1309         }
1310       specs = sl;
1311     }
1312
1313   /* See if the spec already exists.  */
1314   for (sl = specs; sl; sl = sl->next)
1315     if (name_len == sl->name_len && !strcmp (sl->name, name))
1316       break;
1317
1318   if (!sl)
1319     {
1320       /* Not found - make it.  */
1321       sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
1322       sl->name = xstrdup (name);
1323       sl->name_len = name_len;
1324       sl->ptr_spec = &sl->ptr;
1325       sl->alloc_p = 0;
1326       *(sl->ptr_spec) = "";
1327       sl->next = specs;
1328       specs = sl;
1329     }
1330
1331   old_spec = *(sl->ptr_spec);
1332   *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1333                      ? concat (old_spec, spec + 1, NULL_PTR)
1334                      : xstrdup (spec));
1335
1336 #ifdef DEBUG_SPECS
1337   if (verbose_flag)
1338     notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1339 #endif
1340
1341   /* Free the old spec.  */
1342   if (old_spec && sl->alloc_p)
1343     free ((PTR) old_spec);
1344
1345   sl->alloc_p = 1;
1346 }
1347 \f
1348 /* Accumulate a command (program name and args), and run it.  */
1349
1350 /* Vector of pointers to arguments in the current line of specifications.  */
1351
1352 static const char **argbuf;
1353
1354 /* Number of elements allocated in argbuf.  */
1355
1356 static int argbuf_length;
1357
1358 /* Number of elements in argbuf currently in use (containing args).  */
1359
1360 static int argbuf_index;
1361
1362 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1363    temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
1364    it here.  */
1365
1366 static struct temp_name {
1367   const char *suffix;   /* suffix associated with the code.  */
1368   int length;           /* strlen (suffix).  */
1369   int unique;           /* Indicates whether %g or %u/%U was used.  */
1370   const char *filename; /* associated filename.  */
1371   int filename_length;  /* strlen (filename).  */
1372   struct temp_name *next;
1373 } *temp_names;
1374
1375 /* Number of commands executed so far.  */
1376
1377 static int execution_count;
1378
1379 /* Number of commands that exited with a signal.  */
1380
1381 static int signal_count;
1382
1383 /* Name with which this program was invoked.  */
1384
1385 static const char *programname;
1386 \f
1387 /* Clear out the vector of arguments (after a command is executed).  */
1388
1389 static void
1390 clear_args ()
1391 {
1392   argbuf_index = 0;
1393 }
1394
1395 /* Add one argument to the vector at the end.
1396    This is done when a space is seen or at the end of the line.
1397    If DELETE_ALWAYS is nonzero, the arg is a filename
1398     and the file should be deleted eventually.
1399    If DELETE_FAILURE is nonzero, the arg is a filename
1400     and the file should be deleted if this compilation fails.  */
1401
1402 static void
1403 store_arg (arg, delete_always, delete_failure)
1404      const char *arg;
1405      int delete_always, delete_failure;
1406 {
1407   if (argbuf_index + 1 == argbuf_length)
1408     argbuf
1409       = (const char **) xrealloc (argbuf,
1410                                   (argbuf_length *= 2) * sizeof (const char *));
1411
1412   argbuf[argbuf_index++] = arg;
1413   argbuf[argbuf_index] = 0;
1414
1415   if (delete_always || delete_failure)
1416     record_temp_file (arg, delete_always, delete_failure);
1417 }
1418 \f
1419 /* Load specs from a file name named FILENAME, replacing occurances of
1420    various different types of line-endings, \r\n, \n\r and just \r, with
1421    a single \n.  */
1422
1423 static char *
1424 load_specs (filename)
1425      const char *filename;
1426 {
1427   int desc;
1428   int readlen;
1429   struct stat statbuf;
1430   char *buffer;
1431   char *buffer_p;
1432   char *specs;
1433   char *specs_p;
1434
1435   if (verbose_flag)
1436     notice ("Reading specs from %s\n", filename);
1437
1438   /* Open and stat the file.  */
1439   desc = open (filename, O_RDONLY, 0);
1440   if (desc < 0)
1441     pfatal_with_name (filename);
1442   if (stat (filename, &statbuf) < 0)
1443     pfatal_with_name (filename);
1444
1445   /* Read contents of file into BUFFER.  */
1446   buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1447   readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1448   if (readlen < 0)
1449     pfatal_with_name (filename);
1450   buffer[readlen] = 0;
1451   close (desc);
1452
1453   specs = xmalloc (readlen + 1);
1454   specs_p = specs;
1455   for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1456     {
1457       int skip = 0;
1458       char c = *buffer_p;
1459       if (c == '\r')
1460         {
1461           if (buffer_p > buffer && *(buffer_p - 1) == '\n')     /* \n\r */
1462             skip = 1;
1463           else if (*(buffer_p + 1) == '\n')                     /* \r\n */
1464             skip = 1;
1465           else                                                  /* \r */
1466             c = '\n';
1467         }
1468       if (! skip)
1469         *specs_p++ = c;
1470     }
1471   *specs_p = '\0';
1472
1473   free (buffer);
1474   return (specs);
1475 }
1476
1477 /* Read compilation specs from a file named FILENAME,
1478    replacing the default ones.
1479
1480    A suffix which starts with `*' is a definition for
1481    one of the machine-specific sub-specs.  The "suffix" should be
1482    *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
1483    The corresponding spec is stored in asm_spec, etc.,
1484    rather than in the `compilers' vector.
1485
1486    Anything invalid in the file is a fatal error.  */
1487
1488 static void
1489 read_specs (filename, main_p)
1490      const char *filename;
1491      int main_p;
1492 {
1493   char *buffer;
1494   register char *p;
1495
1496   buffer = load_specs (filename);
1497
1498   /* Scan BUFFER for specs, putting them in the vector.  */
1499   p = buffer;
1500   while (1)
1501     {
1502       char *suffix;
1503       char *spec;
1504       char *in, *out, *p1, *p2, *p3;
1505
1506       /* Advance P in BUFFER to the next nonblank nocomment line.  */
1507       p = skip_whitespace (p);
1508       if (*p == 0)
1509         break;
1510
1511       /* Is this a special command that starts with '%'? */
1512       /* Don't allow this for the main specs file, since it would
1513          encourage people to overwrite it.  */
1514       if (*p == '%' && !main_p)
1515         {
1516           p1 = p;
1517           while (*p && *p != '\n')
1518             p++;
1519
1520           /* Skip '\n'.  */
1521           p++;
1522
1523           if (!strncmp (p1, "%include", sizeof ("%include") - 1)
1524               && (p1[sizeof "%include" - 1] == ' '
1525                   || p1[sizeof "%include" - 1] == '\t'))
1526             {
1527               char *new_filename;
1528
1529               p1 += sizeof ("%include");
1530               while (*p1 == ' ' || *p1 == '\t')
1531                 p1++;
1532
1533               if (*p1++ != '<' || p[-2] != '>')
1534                 fatal ("specs %%include syntax malformed after %ld characters",
1535                        (long) (p1 - buffer + 1));
1536
1537               p[-2] = '\0';
1538               new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1539               read_specs (new_filename ? new_filename : p1, FALSE);
1540               continue;
1541             }
1542           else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1543                    && (p1[sizeof "%include_noerr" - 1] == ' '
1544                        || p1[sizeof "%include_noerr" - 1] == '\t'))
1545             {
1546               char *new_filename;
1547
1548               p1 += sizeof "%include_noerr";
1549               while (*p1 == ' ' || *p1 == '\t')
1550                 p1++;
1551
1552               if (*p1++ != '<' || p[-2] != '>')
1553                 fatal ("specs %%include syntax malformed after %ld characters",
1554                        (long) (p1 - buffer + 1));
1555
1556               p[-2] = '\0';
1557               new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1558               if (new_filename)
1559                 read_specs (new_filename, FALSE);
1560               else if (verbose_flag)
1561                 notice ("Could not find specs file %s\n", p1);
1562               continue;
1563             }
1564           else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1565                    && (p1[sizeof "%rename" - 1] == ' '
1566                        || p1[sizeof "%rename" - 1] == '\t'))
1567             {
1568               int name_len;
1569               struct spec_list *sl;
1570
1571               /* Get original name */
1572               p1 += sizeof "%rename";
1573               while (*p1 == ' ' || *p1 == '\t')
1574                 p1++;
1575
1576               if (! ISALPHA ((unsigned char) *p1))
1577                 fatal ("specs %%rename syntax malformed after %ld characters",
1578                        (long) (p1 - buffer));
1579
1580               p2 = p1;
1581               while (*p2 && !ISSPACE ((unsigned char) *p2))
1582                 p2++;
1583
1584               if (*p2 != ' ' && *p2 != '\t')
1585                 fatal ("specs %%rename syntax malformed after %ld characters",
1586                        (long) (p2 - buffer));
1587
1588               name_len = p2 - p1;
1589               *p2++ = '\0';
1590               while (*p2 == ' ' || *p2 == '\t')
1591                 p2++;
1592
1593               if (! ISALPHA ((unsigned char) *p2))
1594                 fatal ("specs %%rename syntax malformed after %ld characters",
1595                        (long) (p2 - buffer));
1596
1597               /* Get new spec name.  */
1598               p3 = p2;
1599               while (*p3 && !ISSPACE ((unsigned char) *p3))
1600                 p3++;
1601
1602               if (p3 != p - 1)
1603                 fatal ("specs %%rename syntax malformed after %ld characters",
1604                        (long) (p3 - buffer));
1605               *p3 = '\0';
1606
1607               for (sl = specs; sl; sl = sl->next)
1608                 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1609                   break;
1610
1611               if (!sl)
1612                 fatal ("specs %s spec was not found to be renamed", p1);
1613
1614               if (strcmp (p1, p2) == 0)
1615                 continue;
1616
1617               if (verbose_flag)
1618                 {
1619                   notice ("rename spec %s to %s\n", p1, p2);
1620 #ifdef DEBUG_SPECS
1621                   notice ("spec is '%s'\n\n", *(sl->ptr_spec));
1622 #endif
1623                 }
1624
1625               set_spec (p2, *(sl->ptr_spec));
1626               if (sl->alloc_p)
1627                 free ((PTR) *(sl->ptr_spec));
1628
1629               *(sl->ptr_spec) = "";
1630               sl->alloc_p = 0;
1631               continue;
1632             }
1633           else
1634             fatal ("specs unknown %% command after %ld characters",
1635                    (long) (p1 - buffer));
1636         }
1637
1638       /* Find the colon that should end the suffix.  */
1639       p1 = p;
1640       while (*p1 && *p1 != ':' && *p1 != '\n')
1641         p1++;
1642
1643       /* The colon shouldn't be missing.  */
1644       if (*p1 != ':')
1645         fatal ("specs file malformed after %ld characters",
1646                (long) (p1 - buffer));
1647
1648       /* Skip back over trailing whitespace.  */
1649       p2 = p1;
1650       while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1651         p2--;
1652
1653       /* Copy the suffix to a string.  */
1654       suffix = save_string (p, p2 - p);
1655       /* Find the next line.  */
1656       p = skip_whitespace (p1 + 1);
1657       if (p[1] == 0)
1658         fatal ("specs file malformed after %ld characters",
1659                (long) (p - buffer));
1660
1661       p1 = p;
1662       /* Find next blank line or end of string.  */
1663       while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
1664         p1++;
1665
1666       /* Specs end at the blank line and do not include the newline.  */
1667       spec = save_string (p, p1 - p);
1668       p = p1;
1669
1670       /* Delete backslash-newline sequences from the spec.  */
1671       in = spec;
1672       out = spec;
1673       while (*in != 0)
1674         {
1675           if (in[0] == '\\' && in[1] == '\n')
1676             in += 2;
1677           else if (in[0] == '#')
1678             while (*in && *in != '\n')
1679               in++;
1680
1681           else
1682             *out++ = *in++;
1683         }
1684       *out = 0;
1685
1686       if (suffix[0] == '*')
1687         {
1688           if (! strcmp (suffix, "*link_command"))
1689             link_command_spec = spec;
1690           else
1691             set_spec (suffix + 1, spec);
1692         }
1693       else
1694         {
1695           /* Add this pair to the vector.  */
1696           compilers
1697             = ((struct compiler *)
1698                xrealloc (compilers,
1699                          (n_compilers + 2) * sizeof (struct compiler)));
1700
1701           compilers[n_compilers].suffix = suffix;
1702           compilers[n_compilers].spec = spec;
1703           n_compilers++;
1704           memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
1705         }
1706
1707       if (*suffix == 0)
1708         link_command_spec = spec;
1709     }
1710
1711   if (link_command_spec == 0)
1712     fatal ("spec file has no spec for linking");
1713 }
1714 \f
1715 /* Record the names of temporary files we tell compilers to write,
1716    and delete them at the end of the run.  */
1717
1718 /* This is the common prefix we use to make temp file names.
1719    It is chosen once for each run of this program.
1720    It is substituted into a spec by %g or %j.
1721    Thus, all temp file names contain this prefix.
1722    In practice, all temp file names start with this prefix.
1723
1724    This prefix comes from the envvar TMPDIR if it is defined;
1725    otherwise, from the P_tmpdir macro if that is defined;
1726    otherwise, in /usr/tmp or /tmp;
1727    or finally the current directory if all else fails.  */
1728
1729 static const char *temp_filename;
1730
1731 /* Length of the prefix.  */
1732
1733 static int temp_filename_length;
1734
1735 /* Define the list of temporary files to delete.  */
1736
1737 struct temp_file
1738 {
1739   const char *name;
1740   struct temp_file *next;
1741 };
1742
1743 /* Queue of files to delete on success or failure of compilation.  */
1744 static struct temp_file *always_delete_queue;
1745 /* Queue of files to delete on failure of compilation.  */
1746 static struct temp_file *failure_delete_queue;
1747
1748 /* Record FILENAME as a file to be deleted automatically.
1749    ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
1750    otherwise delete it in any case.
1751    FAIL_DELETE nonzero means delete it if a compilation step fails;
1752    otherwise delete it in any case.  */
1753
1754 static void
1755 record_temp_file (filename, always_delete, fail_delete)
1756      const char *filename;
1757      int always_delete;
1758      int fail_delete;
1759 {
1760   register char *const name = xstrdup (filename);
1761
1762   if (always_delete)
1763     {
1764       register struct temp_file *temp;
1765       for (temp = always_delete_queue; temp; temp = temp->next)
1766         if (! strcmp (name, temp->name))
1767           goto already1;
1768
1769       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1770       temp->next = always_delete_queue;
1771       temp->name = name;
1772       always_delete_queue = temp;
1773
1774     already1:;
1775     }
1776
1777   if (fail_delete)
1778     {
1779       register struct temp_file *temp;
1780       for (temp = failure_delete_queue; temp; temp = temp->next)
1781         if (! strcmp (name, temp->name))
1782           goto already2;
1783
1784       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1785       temp->next = failure_delete_queue;
1786       temp->name = name;
1787       failure_delete_queue = temp;
1788
1789     already2:;
1790     }
1791 }
1792
1793 /* Delete all the temporary files whose names we previously recorded.  */
1794
1795 static void
1796 delete_if_ordinary (name)
1797      const char *name;
1798 {
1799   struct stat st;
1800 #ifdef DEBUG
1801   int i, c;
1802
1803   printf ("Delete %s? (y or n) ", name);
1804   fflush (stdout);
1805   i = getchar ();
1806   if (i != '\n')
1807     while ((c = getchar ()) != '\n' && c != EOF)
1808       ;
1809
1810   if (i == 'y' || i == 'Y')
1811 #endif /* DEBUG */
1812     if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
1813       if (unlink (name) < 0)
1814         if (verbose_flag)
1815           perror_with_name (name);
1816 }
1817
1818 static void
1819 delete_temp_files ()
1820 {
1821   register struct temp_file *temp;
1822
1823   for (temp = always_delete_queue; temp; temp = temp->next)
1824     delete_if_ordinary (temp->name);
1825   always_delete_queue = 0;
1826 }
1827
1828 /* Delete all the files to be deleted on error.  */
1829
1830 static void
1831 delete_failure_queue ()
1832 {
1833   register struct temp_file *temp;
1834
1835   for (temp = failure_delete_queue; temp; temp = temp->next)
1836     delete_if_ordinary (temp->name);
1837 }
1838
1839 static void
1840 clear_failure_queue ()
1841 {
1842   failure_delete_queue = 0;
1843 }
1844 \f
1845 /* Routine to add variables to the environment.  We do this to pass
1846    the pathname of the gcc driver, and the directories search to the
1847    collect2 program, which is being run as ld.  This way, we can be
1848    sure of executing the right compiler when collect2 wants to build
1849    constructors and destructors.  Since the environment variables we
1850    use come from an obstack, we don't have to worry about allocating
1851    space for them.  */
1852
1853 #ifndef HAVE_PUTENV
1854
1855 void
1856 putenv (str)
1857      char *str;
1858 {
1859 #ifndef VMS                     /* nor about VMS */
1860
1861   extern char **environ;
1862   char **old_environ = environ;
1863   char **envp;
1864   int num_envs = 0;
1865   int name_len = 1;
1866   int str_len = strlen (str);
1867   char *p = str;
1868   int ch;
1869
1870   while ((ch = *p++) != '\0' && ch != '=')
1871     name_len++;
1872
1873   if (!ch)
1874     abort ();
1875
1876   /* Search for replacing an existing environment variable, and
1877      count the number of total environment variables.  */
1878   for (envp = old_environ; *envp; envp++)
1879     {
1880       num_envs++;
1881       if (!strncmp (str, *envp, name_len))
1882         {
1883           *envp = str;
1884           return;
1885         }
1886     }
1887
1888   /* Add a new environment variable */
1889   environ = (char **) xmalloc (sizeof (char *) * (num_envs + 2));
1890   *environ = str;
1891   memcpy ((char *) (environ + 1), (char *) old_environ,
1892           sizeof (char *) * (num_envs + 1));
1893
1894 #endif  /* VMS */
1895 }
1896
1897 #endif /* HAVE_PUTENV */
1898 \f
1899 /* Build a list of search directories from PATHS.
1900    PREFIX is a string to prepend to the list.
1901    If CHECK_DIR_P is non-zero we ensure the directory exists.
1902    This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
1903    It is also used by the --print-search-dirs flag.  */
1904
1905 static char *
1906 build_search_list (paths, prefix, check_dir_p)
1907      struct path_prefix *paths;
1908      const char *prefix;
1909      int check_dir_p;
1910 {
1911   int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
1912   int just_suffix_len
1913     = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
1914   int first_time = TRUE;
1915   struct prefix_list *pprefix;
1916
1917   obstack_grow (&collect_obstack, prefix, strlen (prefix));
1918   obstack_1grow (&collect_obstack, '=');
1919
1920   for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
1921     {
1922       int len = strlen (pprefix->prefix);
1923
1924       if (machine_suffix
1925           && (! check_dir_p
1926               || is_directory (pprefix->prefix, machine_suffix, 0)))
1927         {
1928           if (!first_time)
1929             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1930
1931           first_time = FALSE;
1932           obstack_grow (&collect_obstack, pprefix->prefix, len);
1933           obstack_grow (&collect_obstack, machine_suffix, suffix_len);
1934         }
1935
1936       if (just_machine_suffix
1937           && pprefix->require_machine_suffix == 2
1938           && (! check_dir_p
1939               || is_directory (pprefix->prefix, just_machine_suffix, 0)))
1940         {
1941           if (! first_time)
1942             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1943
1944           first_time = FALSE;
1945           obstack_grow (&collect_obstack, pprefix->prefix, len);
1946           obstack_grow (&collect_obstack, just_machine_suffix,
1947                         just_suffix_len);
1948         }
1949
1950       if (! pprefix->require_machine_suffix)
1951         {
1952           if (! first_time)
1953             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1954
1955           first_time = FALSE;
1956           obstack_grow (&collect_obstack, pprefix->prefix, len);
1957         }
1958     }
1959
1960   obstack_1grow (&collect_obstack, '\0');
1961   return obstack_finish (&collect_obstack);
1962 }
1963
1964 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
1965    for collect.  */
1966
1967 static void
1968 putenv_from_prefixes (paths, env_var)
1969      struct path_prefix *paths;
1970      const char *env_var;
1971 {
1972   putenv (build_search_list (paths, env_var, 1));
1973 }
1974 \f
1975 #ifndef VMS
1976
1977 /* FIXME: the location independence code for VMS is hairier than this,
1978    and hasn't been written.  */
1979
1980 /* Split a filename into component directories.  */
1981
1982 static char **
1983 split_directories (name, ptr_num_dirs)
1984      const char *name;
1985      int *ptr_num_dirs;
1986 {
1987   int num_dirs = 0;
1988   char **dirs;
1989   const char *p, *q;
1990   int ch;
1991
1992   /* Count the number of directories.  Special case MSDOS disk names as part
1993      of the initial directory.  */
1994   p = name;
1995 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1996   if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
1997     {
1998       p += 3;
1999       num_dirs++;
2000     }
2001 #endif /* HAVE_DOS_BASED_FILE_SYSTEM */
2002
2003   while ((ch = *p++) != '\0')
2004     {
2005       if (IS_DIR_SEPARATOR (ch))
2006         {
2007           num_dirs++;
2008           while (IS_DIR_SEPARATOR (*p))
2009             p++;
2010         }
2011     }
2012
2013   dirs = (char **) xmalloc (sizeof (char *) * (num_dirs + 2));
2014
2015   /* Now copy the directory parts.  */
2016   num_dirs = 0;
2017   p = name;
2018 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2019   if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2020     {
2021       dirs[num_dirs++] = save_string (p, 3);
2022       p += 3;
2023     }
2024 #endif /* HAVE_DOS_BASED_FILE_SYSTEM */
2025
2026   q = p;
2027   while ((ch = *p++) != '\0')
2028     {
2029       if (IS_DIR_SEPARATOR (ch))
2030         {
2031           while (IS_DIR_SEPARATOR (*p))
2032             p++;
2033
2034           dirs[num_dirs++] = save_string (q, p - q);
2035           q = p;
2036         }
2037     }
2038
2039   if (p - 1 - q > 0)
2040     dirs[num_dirs++] = save_string (q, p - 1 - q);
2041
2042   dirs[num_dirs] = NULL_PTR;
2043   if (ptr_num_dirs)
2044     *ptr_num_dirs = num_dirs;
2045
2046   return dirs;
2047 }
2048
2049 /* Release storage held by split directories.  */
2050
2051 static void
2052 free_split_directories (dirs)
2053      char **dirs;
2054 {
2055   int i = 0;
2056
2057   while (dirs[i] != NULL_PTR)
2058     free (dirs[i++]);
2059
2060   free ((char *) dirs);
2061 }
2062
2063 /* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets
2064    to PREFIX starting with the directory portion of PROGNAME and a relative
2065    pathname of the difference between BIN_PREFIX and PREFIX.
2066
2067    For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is
2068    /alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this
2069    function will return /red/green/blue/../omega.
2070
2071    If no relative prefix can be found, return NULL.  */
2072
2073 static char *
2074 make_relative_prefix (progname, bin_prefix, prefix)
2075      const char *progname;
2076      const char *bin_prefix;
2077      const char *prefix;
2078 {
2079   char **prog_dirs, **bin_dirs, **prefix_dirs;
2080   int prog_num, bin_num, prefix_num, std_loc_p;
2081   int i, n, common;
2082
2083   prog_dirs = split_directories (progname, &prog_num);
2084   bin_dirs = split_directories (bin_prefix, &bin_num);
2085
2086   /* If there is no full pathname, try to find the program by checking in each
2087      of the directories specified in the PATH environment variable.  */
2088   if (prog_num == 1)
2089     {
2090       char *temp;
2091
2092       GET_ENV_PATH_LIST (temp, "PATH");
2093       if (temp)
2094         {
2095           char *startp, *endp;
2096           char *nstore = (char *) alloca (strlen (temp) + strlen (progname) + 1);
2097
2098           startp = endp = temp;
2099           while (1)
2100             {
2101               if (*endp == PATH_SEPARATOR || *endp == 0)
2102                 {
2103                   if (endp == startp)
2104                     {
2105                       nstore[0] = '.';
2106                       nstore[1] = DIR_SEPARATOR;
2107                       nstore[2] = '\0';
2108                     }
2109                   else
2110                     {
2111                       strncpy (nstore, startp, endp - startp);
2112                       if (! IS_DIR_SEPARATOR (endp[-1]))
2113                         {
2114                           nstore[endp - startp] = DIR_SEPARATOR;
2115                           nstore[endp - startp + 1] = 0;
2116                         }
2117                       else
2118                         nstore[endp - startp] = 0;
2119                     }
2120                   strcat (nstore, progname);
2121                   if (! access (nstore, X_OK)
2122 #ifdef HAVE_EXECUTABLE_SUFFIX
2123                       || ! access (strcat (nstore, EXECUTABLE_SUFFIX), X_OK)
2124 #endif
2125                       )
2126                     {
2127                       free_split_directories (prog_dirs);
2128                       progname = nstore;
2129                       prog_dirs = split_directories (progname, &prog_num);
2130                       break;
2131                     }
2132
2133                   if (*endp == 0)
2134                     break;
2135                   endp = startp = endp + 1;
2136                 }
2137               else
2138                 endp++;
2139             }
2140         }
2141     }
2142
2143   /* Remove the program name from comparison of directory names.  */
2144   prog_num--;
2145
2146   /* Determine if the compiler is installed in the standard location, and if
2147      so, we don't need to specify relative directories.  Also, if argv[0]
2148      doesn't contain any directory specifiers, there is not much we can do.  */
2149   std_loc_p = 0;
2150   if (prog_num == bin_num)
2151     {
2152       for (i = 0; i < bin_num; i++)
2153         {
2154           if (strcmp (prog_dirs[i], bin_dirs[i]) != 0)
2155             break;
2156         }
2157
2158       if (prog_num <= 0 || i == bin_num)
2159         {
2160           std_loc_p = 1;
2161           free_split_directories (prog_dirs);
2162           free_split_directories (bin_dirs);
2163           prog_dirs = bin_dirs = (char **) 0;
2164           return NULL_PTR;
2165         }
2166     }
2167
2168   prefix_dirs = split_directories (prefix, &prefix_num);
2169
2170   /* Find how many directories are in common between bin_prefix & prefix.  */
2171   n = (prefix_num < bin_num) ? prefix_num : bin_num;
2172   for (common = 0; common < n; common++)
2173     {
2174       if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0)
2175         break;
2176     }
2177
2178   /* If there are no common directories, there can be no relative prefix.  */
2179   if (common == 0)
2180     {
2181       free_split_directories (prog_dirs);
2182       free_split_directories (bin_dirs);
2183       free_split_directories (prefix_dirs);
2184       return NULL_PTR;
2185     }
2186
2187   /* Build up the pathnames in argv[0].  */
2188   for (i = 0; i < prog_num; i++)
2189     obstack_grow (&obstack, prog_dirs[i], strlen (prog_dirs[i]));
2190
2191   /* Now build up the ..'s.  */
2192   for (i = common; i < n; i++)
2193     {
2194       obstack_grow (&obstack, DIR_UP, sizeof (DIR_UP) - 1);
2195       obstack_1grow (&obstack, DIR_SEPARATOR);
2196     }
2197
2198   /* Put in directories to move over to prefix.  */
2199   for (i = common; i < prefix_num; i++)
2200     obstack_grow (&obstack, prefix_dirs[i], strlen (prefix_dirs[i]));
2201
2202   free_split_directories (prog_dirs);
2203   free_split_directories (bin_dirs);
2204   free_split_directories (prefix_dirs);
2205
2206   obstack_1grow (&obstack, '\0');
2207   return obstack_finish (&obstack);
2208 }
2209 #endif /* VMS */
2210 \f
2211 /* Check whether NAME can be accessed in MODE.  This is like access,
2212    except that it never considers directories to be executable.  */
2213
2214 static int
2215 access_check (name, mode)
2216      const char *name;
2217      int mode;
2218 {
2219   if (mode == X_OK)
2220     {
2221       struct stat st;
2222
2223       if (stat (name, &st) < 0
2224           || S_ISDIR (st.st_mode))
2225         return -1;
2226     }
2227
2228   return access (name, mode);
2229 }
2230
2231 /* Search for NAME using the prefix list PREFIXES.  MODE is passed to
2232    access to check permissions.
2233    Return 0 if not found, otherwise return its name, allocated with malloc.  */
2234
2235 static char *
2236 find_a_file (pprefix, name, mode)
2237      struct path_prefix *pprefix;
2238      const char *name;
2239      int mode;
2240 {
2241   char *temp;
2242   const char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
2243   struct prefix_list *pl;
2244   int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
2245
2246 #ifdef DEFAULT_ASSEMBLER
2247   if (! strcmp(name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2248     return xstrdup (DEFAULT_ASSEMBLER);
2249 #endif
2250
2251 #ifdef DEFAULT_LINKER
2252   if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2253     return xstrdup (DEFAULT_LINKER);
2254 #endif
2255
2256   if (machine_suffix)
2257     len += strlen (machine_suffix);
2258
2259   temp = xmalloc (len);
2260
2261   /* Determine the filename to execute (special case for absolute paths).  */
2262
2263   if (IS_DIR_SEPARATOR (*name)
2264 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2265       /* Check for disk name on MS-DOS-based systems.  */
2266       || (name[0] && name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2267 #endif
2268       )
2269     {
2270       if (access (name, mode) == 0)
2271         {
2272           strcpy (temp, name);
2273           return temp;
2274         }
2275     }
2276   else
2277     for (pl = pprefix->plist; pl; pl = pl->next)
2278       {
2279         if (machine_suffix)
2280           {
2281             /* Some systems have a suffix for executable files.
2282                So try appending that first.  */
2283             if (file_suffix[0] != 0)
2284               {
2285                 strcpy (temp, pl->prefix);
2286                 strcat (temp, machine_suffix);
2287                 strcat (temp, name);
2288                 strcat (temp, file_suffix);
2289                 if (access_check (temp, mode) == 0)
2290                   {
2291                     if (pl->used_flag_ptr != 0)
2292                       *pl->used_flag_ptr = 1;
2293                     return temp;
2294                   }
2295               }
2296
2297             /* Now try just the name.  */
2298             strcpy (temp, pl->prefix);
2299             strcat (temp, machine_suffix);
2300             strcat (temp, name);
2301             if (access_check (temp, mode) == 0)
2302               {
2303                 if (pl->used_flag_ptr != 0)
2304                   *pl->used_flag_ptr = 1;
2305                 return temp;
2306               }
2307           }
2308
2309         /* Certain prefixes are tried with just the machine type,
2310            not the version.  This is used for finding as, ld, etc.  */
2311         if (just_machine_suffix && pl->require_machine_suffix == 2)
2312           {
2313             /* Some systems have a suffix for executable files.
2314                So try appending that first.  */
2315             if (file_suffix[0] != 0)
2316               {
2317                 strcpy (temp, pl->prefix);
2318                 strcat (temp, just_machine_suffix);
2319                 strcat (temp, name);
2320                 strcat (temp, file_suffix);
2321                 if (access_check (temp, mode) == 0)
2322                   {
2323                     if (pl->used_flag_ptr != 0)
2324                       *pl->used_flag_ptr = 1;
2325                     return temp;
2326                   }
2327               }
2328
2329             strcpy (temp, pl->prefix);
2330             strcat (temp, just_machine_suffix);
2331             strcat (temp, name);
2332             if (access_check (temp, mode) == 0)
2333               {
2334                 if (pl->used_flag_ptr != 0)
2335                   *pl->used_flag_ptr = 1;
2336                 return temp;
2337               }
2338           }
2339
2340         /* Certain prefixes can't be used without the machine suffix
2341            when the machine or version is explicitly specified.  */
2342         if (! pl->require_machine_suffix)
2343           {
2344             /* Some systems have a suffix for executable files.
2345                So try appending that first.  */
2346             if (file_suffix[0] != 0)
2347               {
2348                 strcpy (temp, pl->prefix);
2349                 strcat (temp, name);
2350                 strcat (temp, file_suffix);
2351                 if (access_check (temp, mode) == 0)
2352                   {
2353                     if (pl->used_flag_ptr != 0)
2354                       *pl->used_flag_ptr = 1;
2355                     return temp;
2356                   }
2357               }
2358
2359             strcpy (temp, pl->prefix);
2360             strcat (temp, name);
2361             if (access_check (temp, mode) == 0)
2362               {
2363                 if (pl->used_flag_ptr != 0)
2364                   *pl->used_flag_ptr = 1;
2365                 return temp;
2366               }
2367           }
2368       }
2369
2370   free (temp);
2371   return 0;
2372 }
2373
2374 /* Ranking of prefixes in the sort list. -B prefixes are put before
2375    all others.  */
2376
2377 enum path_prefix_priority
2378 {
2379   PREFIX_PRIORITY_B_OPT,
2380   PREFIX_PRIORITY_LAST
2381 };
2382
2383 /* Add an entry for PREFIX in PLIST.  The PLIST is kept in assending
2384    order according to PRIORITY.  Within each PRIORITY, new entries are
2385    appended.
2386
2387    If WARN is nonzero, we will warn if no file is found
2388    through this prefix.  WARN should point to an int
2389    which will be set to 1 if this entry is used.
2390
2391    COMPONENT is the value to be passed to update_path.
2392
2393    REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2394    the complete value of machine_suffix.
2395    2 means try both machine_suffix and just_machine_suffix.  */
2396
2397 static void
2398 add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn)
2399      struct path_prefix *pprefix;
2400      const char *prefix;
2401      const char *component;
2402      /* enum prefix_priority */ int priority;
2403      int require_machine_suffix;
2404      int *warn;
2405 {
2406   struct prefix_list *pl, **prev;
2407   int len;
2408
2409   for (prev = &pprefix->plist;
2410        (*prev) != NULL && (*prev)->priority <= priority;
2411        prev = &(*prev)->next)
2412     ;
2413
2414   /* Keep track of the longest prefix */
2415
2416   prefix = update_path (prefix, component);
2417   len = strlen (prefix);
2418   if (len > pprefix->max_len)
2419     pprefix->max_len = len;
2420
2421   pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
2422   pl->prefix = save_string (prefix, len);
2423   pl->require_machine_suffix = require_machine_suffix;
2424   pl->used_flag_ptr = warn;
2425   pl->priority = priority;
2426   if (warn)
2427     *warn = 0;
2428
2429   /* Insert after PREV */
2430   pl->next = (*prev);
2431   (*prev) = pl;
2432 }
2433 \f
2434 /* Execute the command specified by the arguments on the current line of spec.
2435    When using pipes, this includes several piped-together commands
2436    with `|' between them.
2437
2438    Return 0 if successful, -1 if failed.  */
2439
2440 static int
2441 execute ()
2442 {
2443   int i;
2444   int n_commands;               /* # of command.  */
2445   char *string;
2446   struct command
2447   {
2448     const char *prog;           /* program name.  */
2449     const char **argv;          /* vector of args.  */
2450     int pid;                    /* pid of process for this command.  */
2451   };
2452
2453   struct command *commands;     /* each command buffer with above info.  */
2454
2455   /* Count # of piped commands.  */
2456   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2457     if (strcmp (argbuf[i], "|") == 0)
2458       n_commands++;
2459
2460   /* Get storage for each command.  */
2461   commands = (struct command *) alloca (n_commands * sizeof (struct command));
2462
2463   /* Split argbuf into its separate piped processes,
2464      and record info about each one.
2465      Also search for the programs that are to be run.  */
2466
2467   commands[0].prog = argbuf[0]; /* first command.  */
2468   commands[0].argv = &argbuf[0];
2469   string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
2470
2471   if (string)
2472     commands[0].argv[0] = string;
2473
2474   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2475     if (strcmp (argbuf[i], "|") == 0)
2476       {                         /* each command.  */
2477 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2478         fatal ("-pipe not supported");
2479 #endif
2480         argbuf[i] = 0;  /* termination of command args.  */
2481         commands[n_commands].prog = argbuf[i + 1];
2482         commands[n_commands].argv = &argbuf[i + 1];
2483         string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
2484         if (string)
2485           commands[n_commands].argv[0] = string;
2486         n_commands++;
2487       }
2488
2489   argbuf[argbuf_index] = 0;
2490
2491   /* If -v, print what we are about to do, and maybe query.  */
2492
2493   if (verbose_flag)
2494     {
2495       /* For help listings, put a blank line between sub-processes.  */
2496       if (print_help_list)
2497         fputc ('\n', stderr);
2498
2499       /* Print each piped command as a separate line.  */
2500       for (i = 0; i < n_commands; i++)
2501         {
2502           const char *const *j;
2503
2504           for (j = commands[i].argv; *j; j++)
2505             fprintf (stderr, " %s", *j);
2506
2507           /* Print a pipe symbol after all but the last command.  */
2508           if (i + 1 != n_commands)
2509             fprintf (stderr, " |");
2510           fprintf (stderr, "\n");
2511         }
2512       fflush (stderr);
2513 #ifdef DEBUG
2514       notice ("\nGo ahead? (y or n) ");
2515       fflush (stderr);
2516       i = getchar ();
2517       if (i != '\n')
2518         while (getchar () != '\n')
2519           ;
2520
2521       if (i != 'y' && i != 'Y')
2522         return 0;
2523 #endif /* DEBUG */
2524     }
2525
2526   /* Run each piped subprocess.  */
2527
2528   for (i = 0; i < n_commands; i++)
2529     {
2530       char *errmsg_fmt, *errmsg_arg;
2531       const char *string = commands[i].argv[0];
2532
2533       /* For some bizarre reason, the second argument of execvp() is
2534          char *const *, not const char *const *.  */
2535       commands[i].pid = pexecute (string, (char *const *) commands[i].argv,
2536                                   programname, temp_filename,
2537                                   &errmsg_fmt, &errmsg_arg,
2538                                   ((i == 0 ? PEXECUTE_FIRST : 0)
2539                                    | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2540                                    | (string == commands[i].prog
2541                                       ? PEXECUTE_SEARCH : 0)
2542                                    | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2543
2544       if (commands[i].pid == -1)
2545         pfatal_pexecute (errmsg_fmt, errmsg_arg);
2546
2547       if (string != commands[i].prog)
2548         free ((PTR) string);
2549     }
2550
2551   execution_count++;
2552
2553   /* Wait for all the subprocesses to finish.
2554      We don't care what order they finish in;
2555      we know that N_COMMANDS waits will get them all.
2556      Ignore subprocesses that we don't know about,
2557      since they can be spawned by the process that exec'ed us.  */
2558
2559   {
2560     int ret_code = 0;
2561 #ifdef HAVE_GETRUSAGE
2562     struct timeval d;
2563     double ut = 0.0, st = 0.0;
2564 #endif
2565
2566     for (i = 0; i < n_commands;)
2567       {
2568         int j;
2569         int status;
2570         int pid;
2571
2572         pid = pwait (commands[i].pid, &status, 0);
2573         if (pid < 0)
2574           abort ();
2575
2576 #ifdef HAVE_GETRUSAGE
2577         if (report_times)
2578           {
2579             /* getrusage returns the total resource usage of all children
2580                up to now.  Copy the previous values into prus, get the
2581                current statistics, then take the difference.  */
2582
2583             prus = rus;
2584             getrusage (RUSAGE_CHILDREN, &rus);
2585             d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
2586             d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
2587             ut = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2588
2589             d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
2590             d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
2591             st = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2592           }
2593 #endif
2594
2595         for (j = 0; j < n_commands; j++)
2596           if (commands[j].pid == pid)
2597             {
2598               i++;
2599               if (WIFSIGNALED (status))
2600                 {
2601 #ifdef SIGPIPE
2602                   /* SIGPIPE is a special case.  It happens in -pipe mode
2603                      when the compiler dies before the preprocessor is
2604                      done, or the assembler dies before the compiler is
2605                      done.  There's generally been an error already, and
2606                      this is just fallout.  So don't generate another error
2607                      unless we would otherwise have succeeded.  */
2608                   if (WTERMSIG (status) == SIGPIPE
2609                       && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2610                     ;
2611                   else
2612 #endif
2613                     fatal ("\
2614 Internal error: %s (program %s)\n\
2615 Please submit a full bug report.\n\
2616 See %s for instructions.",
2617                            strsignal (WTERMSIG (status)), commands[j].prog,
2618                            GCCBUGURL);
2619                   signal_count++;
2620                   ret_code = -1;
2621                 }
2622               else if (WIFEXITED (status)
2623                        && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2624                 {
2625                   if (WEXITSTATUS (status) > greatest_status)
2626                     greatest_status = WEXITSTATUS (status);
2627                   ret_code = -1;
2628                 }
2629 #ifdef HAVE_GETRUSAGE
2630               if (report_times && ut + st != 0)
2631                 notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
2632 #endif
2633               break;
2634             }
2635       }
2636     return ret_code;
2637   }
2638 }
2639 \f
2640 /* Find all the switches given to us
2641    and make a vector describing them.
2642    The elements of the vector are strings, one per switch given.
2643    If a switch uses following arguments, then the `part1' field
2644    is the switch itself and the `args' field
2645    is a null-terminated vector containing the following arguments.
2646    The `live_cond' field is:
2647    0 when initialized
2648    1 if the switch is true in a conditional spec,
2649    -1 if false (overridden by a later switch)
2650    -2 if this switch should be ignored (used in %{<S})
2651    The `validated' field is nonzero if any spec has looked at this switch;
2652    if it remains zero at the end of the run, it must be meaningless.  */
2653
2654 #define SWITCH_OK       0
2655 #define SWITCH_FALSE   -1
2656 #define SWITCH_IGNORE  -2
2657 #define SWITCH_LIVE     1
2658
2659 struct switchstr
2660 {
2661   const char *part1;
2662   const char **args;
2663   int live_cond;
2664   int validated;
2665 };
2666
2667 static struct switchstr *switches;
2668
2669 static int n_switches;
2670
2671 struct infile
2672 {
2673   const char *name;
2674   const char *language;
2675 };
2676
2677 /* Also a vector of input files specified.  */
2678
2679 static struct infile *infiles;
2680
2681 static int n_infiles;
2682
2683 /* This counts the number of libraries added by lang_specific_driver, so that
2684    we can tell if there were any user supplied any files or libraries.  */
2685
2686 static int added_libraries;
2687
2688 /* And a vector of corresponding output files is made up later.  */
2689
2690 static const char **outfiles;
2691
2692 /* Used to track if none of the -B paths are used.  */
2693 static int warn_B;
2694
2695 /* Used to track if standard path isn't used and -b or -V is specified.  */
2696 static int warn_std;
2697
2698 /* Gives value to pass as "warn" to add_prefix for standard prefixes.  */
2699 static int *warn_std_ptr = 0;
2700 \f
2701 #if defined(HAVE_OBJECT_SUFFIX) || defined(HAVE_EXECUTABLE_SUFFIX)
2702
2703 /* Convert NAME to a new name if it is the standard suffix.  DO_EXE
2704    is true if we should look for an executable suffix as well.  */
2705
2706 static char *
2707 convert_filename (name, do_exe)
2708      char *name;
2709      int do_exe;
2710 {
2711   int i;
2712   int len;
2713
2714   if (name == NULL)
2715     return NULL;
2716
2717   len = strlen (name);
2718
2719 #ifdef HAVE_OBJECT_SUFFIX
2720   /* Convert x.o to x.obj if OBJECT_SUFFIX is ".obj".  */
2721   if (len > 2
2722       && name[len - 2] == '.'
2723       && name[len - 1] == 'o')
2724     {
2725       obstack_grow (&obstack, name, len - 2);
2726       obstack_grow0 (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
2727       name = obstack_finish (&obstack);
2728     }
2729 #endif
2730
2731 #ifdef HAVE_EXECUTABLE_SUFFIX
2732   /* If there is no filetype, make it the executable suffix (which includes
2733      the ".").  But don't get confused if we have just "-o".  */
2734   if (! do_exe || EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2735     return name;
2736
2737   for (i = len - 1; i >= 0; i--)
2738     if (IS_DIR_SEPARATOR (name[i]))
2739       break;
2740
2741   for (i++; i < len; i++)
2742     if (name[i] == '.')
2743       return name;
2744
2745   obstack_grow (&obstack, name, len);
2746   obstack_grow0 (&obstack, EXECUTABLE_SUFFIX, strlen (EXECUTABLE_SUFFIX));
2747   name = obstack_finish (&obstack);
2748 #endif
2749
2750   return name;
2751 }
2752 #endif
2753 \f
2754 /* Display the command line switches accepted by gcc.  */
2755 static void
2756 display_help ()
2757 {
2758   printf (_("Usage: %s [options] file...\n"), programname);
2759   fputs (_("Options:\n"), stdout);
2760
2761   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
2762   fputs (_("  --help                   Display this information\n"), stdout);
2763   if (! verbose_flag)
2764     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2765   fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
2766   fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
2767   fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
2768   fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
2769   fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
2770   fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
2771   fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
2772   fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
2773   fputs (_("\
2774   -print-multi-lib         Display the mapping between command line options and\n\
2775                            multiple library search directories\n"), stdout);
2776   fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
2777   fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
2778   fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
2779   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
2780   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
2781   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
2782   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
2783   fputs (_("  -specs=<file>            Override builtin specs with the contents of <file>\n"), stdout);
2784   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
2785   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
2786   fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
2787   fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
2788   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
2789   fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
2790   fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
2791   fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
2792   fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
2793   fputs (_("\
2794   -x <language>            Specify the language of the following input files\n\
2795                            Permissable languages include: c c++ assembler none\n\
2796                            'none' means revert to the default behaviour of\n\
2797                            guessing the language based on the file's extension\n\
2798 "), stdout);
2799
2800   printf (_("\
2801 \nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n\
2802 the various sub-processes invoked by %s.  In order to pass other options\n\
2803 on to these processes the -W<letter> options must be used.\n\
2804 "), programname);
2805
2806   /* The rest of the options are displayed by invocations of the various
2807      sub-processes.  */
2808 }
2809
2810 static void
2811 add_preprocessor_option (option, len)
2812      const char *option;
2813      int len;
2814 {
2815   n_preprocessor_options++;
2816
2817   if (! preprocessor_options)
2818     preprocessor_options
2819       = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
2820   else
2821     preprocessor_options
2822       = (char **) xrealloc (preprocessor_options,
2823                             n_preprocessor_options * sizeof (char *));
2824
2825   preprocessor_options [n_preprocessor_options - 1] =
2826     save_string (option, len);
2827 }
2828
2829 static void
2830 add_assembler_option (option, len)
2831      const char *option;
2832      int len;
2833 {
2834   n_assembler_options++;
2835
2836   if (! assembler_options)
2837     assembler_options
2838       = (char **) xmalloc (n_assembler_options * sizeof (char *));
2839   else
2840     assembler_options
2841       = (char **) xrealloc (assembler_options,
2842                             n_assembler_options * sizeof (char *));
2843
2844   assembler_options [n_assembler_options - 1] = save_string (option, len);
2845 }
2846
2847 static void
2848 add_linker_option (option, len)
2849      const char *option;
2850      int len;
2851 {
2852   n_linker_options++;
2853
2854   if (! linker_options)
2855     linker_options
2856       = (char **) xmalloc (n_linker_options * sizeof (char *));
2857   else
2858     linker_options
2859       = (char **) xrealloc (linker_options,
2860                             n_linker_options * sizeof (char *));
2861
2862   linker_options [n_linker_options - 1] = save_string (option, len);
2863 }
2864 \f
2865 /* Create the vector `switches' and its contents.
2866    Store its length in `n_switches'.  */
2867
2868 static void
2869 process_command (argc, argv)
2870      int argc;
2871      const char *const *argv;
2872 {
2873   register int i;
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 (strchr (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 = strchr (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 = strchr (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   memcpy ((char *) compilers, (char *) default_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   memcpy (result, s, 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 }