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