OSDN Git Service

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