OSDN Git Service

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