OSDN Git Service

99bca41314327064a71af59fd6dc98a276a3e54a
[pf3gnuchains/gcc-fork.git] / gcc / gcc.c
1 /* Compiler driver program that can handle many languages.
2    Copyright (C) 1987, 1989, 1992, 1993, 1994 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19
20 This paragraph is here to try to keep Sun CC from dying.
21 The number of chars here seems crucial!!!!  */
22
23 /* This program is the user interface to the C compiler and possibly to
24 other compilers.  It is used because compilation is a complicated procedure
25 which involves running several programs and passing temporary files between
26 them, forwarding the users switches to those programs selectively,
27 and deleting the temporary files at the end.
28
29 CC recognizes how to compile each input file by suffixes in the file names.
30 Once it knows which kind of compilation to perform, the procedure for
31 compilation is specified by a string called a "spec".  */
32 \f
33 #include <sys/types.h>
34 #include <ctype.h>
35 #include <signal.h>
36 #include <sys/stat.h>
37 #include <sys/file.h>   /* May get R_OK, etc. on some systems.  */
38 #include <errno.h>
39
40 #include "config.h"
41 #include "obstack.h"
42 #ifdef __STDC__
43 #include <stdarg.h>
44 #else
45 #include <varargs.h>
46 #endif
47 #include <stdio.h>
48
49 /* Include multi-lib information.  */
50 #include "multilib.h"
51
52 #ifndef R_OK
53 #define R_OK 4
54 #define W_OK 2
55 #define X_OK 1
56 #endif
57
58 /* Add prototype support.  */
59 #ifndef PROTO
60 #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
61 #define PROTO(ARGS) ARGS
62 #else
63 #define PROTO(ARGS) ()
64 #endif
65 #endif
66
67 #ifndef VPROTO
68 #ifdef __STDC__
69 #define PVPROTO(ARGS)           ARGS
70 #define VPROTO(ARGS)            ARGS
71 #define VA_START(va_list,var)   va_start(va_list,var)
72 #else
73 #define PVPROTO(ARGS)           ()
74 #define VPROTO(ARGS)            (va_alist) va_dcl
75 #define VA_START(va_list,var)   va_start(va_list)
76 #endif
77 #endif
78
79 /* Define a generic NULL if one hasn't already been defined.  */
80
81 #ifndef NULL
82 #define NULL 0
83 #endif
84
85 #ifndef GENERIC_PTR
86 #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
87 #define GENERIC_PTR void *
88 #else
89 #define GENERIC_PTR char *
90 #endif
91 #endif
92
93 #ifndef NULL_PTR
94 #define NULL_PTR ((GENERIC_PTR)0)
95 #endif
96
97 #ifdef USG
98 #define vfork fork
99 #endif /* USG */
100
101 /* On MSDOS, write temp files in current dir
102    because there's no place else we can expect to use.  */
103 #ifdef __MSDOS__
104 #ifndef P_tmpdir
105 #define P_tmpdir "."
106 #endif
107 #endif
108
109 /* Test if something is a normal file.  */
110 #ifndef S_ISREG
111 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
112 #endif
113
114 /* Test if something is a directory.  */
115 #ifndef S_ISDIR
116 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
117 #endif
118
119 /* By default there is no special suffix for executables.  */
120 #ifndef EXECUTABLE_SUFFIX
121 #define EXECUTABLE_SUFFIX ""
122 #endif
123
124 /* By default, colon separates directories in a path.  */
125 #ifndef PATH_SEPARATOR
126 #define PATH_SEPARATOR ':'
127 #endif
128
129 #define obstack_chunk_alloc xmalloc
130 #define obstack_chunk_free free
131
132 extern void free ();
133 extern char *getenv ();
134
135 #ifndef errno
136 extern int errno;
137 #endif
138
139 extern int sys_nerr;
140 #if defined(bsd4_4) || defined(__NetBSD__)
141 extern const char *const sys_errlist[];
142 #else
143 extern char *sys_errlist[];
144 #endif
145
146 extern int execv (), execvp ();
147
148 /* If a stage of compilation returns an exit status >= 1,
149    compilation of that file ceases.  */
150
151 #define MIN_FATAL_STATUS 1
152
153 /* Flag saying to print the full filename of this file
154    as found through our usual search mechanism.  */
155
156 static char *print_file_name = NULL;
157
158 /* As print_file_name, but search for executable file. */
159
160 static char *print_prog_name = NULL;
161
162 /* Flag saying to print the relative path we'd use to
163    find libgcc.a given the current compiler flags.  */
164
165 static int print_multi_directory;
166
167 /* Flag saying to print the list of subdirectories and
168    compiler flags used to select them in a standard form.  */
169
170 static int print_multi_lib;
171
172 /* Flag indicating whether we should print the command and arguments */
173
174 static int verbose_flag;
175
176 /* Nonzero means write "temp" files in source directory
177    and use the source file's name in them, and don't delete them.  */
178
179 static int save_temps_flag;
180
181 /* The compiler version.  */
182
183 static char *compiler_version;
184
185 /* The target version specified with -V */
186
187 static char *spec_version = DEFAULT_TARGET_VERSION;
188
189 /* The target machine specified with -b.  */
190
191 static char *spec_machine = DEFAULT_TARGET_MACHINE;
192
193 /* Nonzero if cross-compiling.
194    When -b is used, the value comes from the `specs' file.  */
195
196 #ifdef CROSS_COMPILE
197 static int cross_compile = 1;
198 #else
199 static int cross_compile = 0;
200 #endif
201
202 /* The number of errors that have occurred; the link phase will not be
203    run if this is non-zero.  */
204 static int error_count = 0;
205
206 /* This is the obstack which we use to allocate many strings.  */
207
208 static struct obstack obstack;
209
210 /* This is the obstack to build an environment variable to pass to
211    collect2 that describes all of the relevant switches of what to
212    pass the compiler in building the list of pointers to constructors
213    and destructors.  */
214
215 static struct obstack collect_obstack;
216
217 extern char *version_string;
218
219 /* Forward declaration for prototypes.  */
220 struct path_prefix;
221
222 static void set_spec            PROTO((char *, char *));
223 static struct compiler *lookup_compiler PROTO((char *, int, char *));
224 static char *find_a_file        PROTO((struct path_prefix *, char *, int));
225 static void add_prefix          PROTO((struct path_prefix *, char *, int, int, int *));
226 static char *skip_whitespace    PROTO((char *));
227 static void record_temp_file    PROTO((char *, int, int));
228 static void delete_if_ordinary  PROTO((char *));
229 static void delete_temp_files   PROTO((void));
230 static void delete_failure_queue PROTO((void));
231 static void clear_failure_queue PROTO((void));
232 static char *choose_temp_base_try PROTO((char *, char *));
233 static void choose_temp_base    PROTO((void));
234 static int check_live_switch    PROTO((int, int));
235 static char *handle_braces      PROTO((char *));
236 static char *save_string        PROTO((char *, int));
237 static char *concat             PROTO((char *, char *, char *));
238 static int do_spec              PROTO((char *));
239 static int do_spec_1            PROTO((char *, int, char *));
240 static char *find_file          PROTO((char *));
241 static int is_directory         PROTO((char *, char *, int));
242 static void validate_switches   PROTO((char *));
243 static void validate_all_switches PROTO((void));
244 static void give_switch         PROTO((int, int));
245 static int used_arg             PROTO((char *, int));
246 static void set_multilib_dir    PROTO((void));
247 static void print_multilib_info PROTO((void));
248 static void pfatal_with_name    PROTO((char *));
249 static void perror_with_name    PROTO((char *));
250 static void perror_exec         PROTO((char *));
251 #ifdef HAVE_VPRINTF
252 static void fatal               PVPROTO((char *, ...));
253 static void error               PVPROTO((char *, ...));
254 #else
255 /* We must not provide any prototype here, even if ANSI C.  */
256 static void fatal               PROTO(());
257 static void error               PROTO(());
258 #endif
259
260 void fancy_abort ();
261 char *xmalloc ();
262 char *xrealloc ();
263 \f
264 /* Specs are strings containing lines, each of which (if not blank)
265 is made up of a program name, and arguments separated by spaces.
266 The program name must be exact and start from root, since no path
267 is searched and it is unreliable to depend on the current working directory.
268 Redirection of input or output is not supported; the subprograms must
269 accept filenames saying what files to read and write.
270
271 In addition, the specs can contain %-sequences to substitute variable text
272 or for conditional text.  Here is a table of all defined %-sequences.
273 Note that spaces are not generated automatically around the results of
274 expanding these sequences; therefore, you can concatenate them together
275 or with constant text in a single argument.
276
277  %%     substitute one % into the program name or argument.
278  %i     substitute the name of the input file being processed.
279  %b     substitute the basename of the input file being processed.
280         This is the substring up to (and not including) the last period
281         and not including the directory.
282  %g     substitute the temporary-file-name-base.  This is a string chosen
283         once per compilation.  Different temporary file names are made by
284         concatenation of constant strings on the end, as in `%g.s'.
285         %g also has the same effect of %d.
286  %u     like %g, but make the temporary file name unique.
287  %U     returns the last file name generated with %u.
288  %d     marks the argument containing or following the %d as a
289         temporary file name, so that that file will be deleted if CC exits
290         successfully.  Unlike %g, this contributes no text to the argument.
291  %w     marks the argument containing or following the %w as the
292         "output file" of this compilation.  This puts the argument
293         into the sequence of arguments that %o will substitute later.
294  %W{...}
295         like %{...} but mark last argument supplied within
296         as a file to be deleted on failure.
297  %o     substitutes the names of all the output files, with spaces
298         automatically placed around them.  You should write spaces
299         around the %o as well or the results are undefined.
300         %o is for use in the specs for running the linker.
301         Input files whose names have no recognized suffix are not compiled
302         at all, but they are included among the output files, so they will
303         be linked.
304  %p     substitutes the standard macro predefinitions for the
305         current target machine.  Use this when running cpp.
306  %P     like %p, but puts `__' before and after the name of each macro.
307         (Except macros that already have __.)
308         This is for ANSI C.
309  %I     Substitute a -iprefix option made from GCC_EXEC_PREFIX.
310  %s     current argument is the name of a library or startup file of some sort.
311         Search for that file in a standard list of directories
312         and substitute the full name found.
313  %eSTR  Print STR as an error message.  STR is terminated by a newline.
314         Use this when inconsistent options are detected.
315  %x{OPTION}     Accumulate an option for %X.
316  %X     Output the accumulated linker options specified by compilations.
317  %Y     Output the accumulated assembler options specified by compilations.
318  %v1    Substitute the major version number of GCC.
319         (For version 2.5.n, this is 2.)
320  %v2    Substitute the minor version number of GCC.
321         (For version 2.5.n, this is 5.)
322  %a     process ASM_SPEC as a spec.
323         This allows config.h to specify part of the spec for running as.
324  %A     process ASM_FINAL_SPEC as a spec.  A capital A is actually
325         used here.  This can be used to run a post-processor after the
326         assembler has done it's job.
327  %D     Dump out a -L option for each directory in startfile_prefix.
328         If multilib_dir is set, extra entries are generated with it affixed.
329  %l     process LINK_SPEC as a spec.
330  %L     process LIB_SPEC as a spec.
331  %S     process STARTFILE_SPEC as a spec.  A capital S is actually used here.
332  %E     process ENDFILE_SPEC as a spec.  A capital E is actually used here.
333  %c     process SIGNED_CHAR_SPEC as a spec.
334  %C     process CPP_SPEC as a spec.  A capital C is actually used here.
335  %1     process CC1_SPEC as a spec.
336  %2     process CC1PLUS_SPEC as a spec.
337  %|     output "-" if the input for the current command is coming from a pipe.
338  %*     substitute the variable part of a matched option.  (See below.)
339         Note that each comma in the substituted string is replaced by
340         a single space.
341  %{S}   substitutes the -S switch, if that switch was given to CC.
342         If that switch was not specified, this substitutes nothing.
343         Here S is a metasyntactic variable.
344  %{S*}  substitutes all the switches specified to CC whose names start
345         with -S.  This is used for -o, -D, -I, etc; switches that take
346         arguments.  CC considers `-o foo' as being one switch whose
347         name starts with `o'.  %{o*} would substitute this text,
348         including the space; thus, two arguments would be generated.
349  %{S*:X} substitutes X if one or more switches whose names start with -S are
350         specified to CC.  Note that the tail part of the -S option
351         (i.e. the part matched by the `*') will be substituted for each
352         occurrence of %* within X.
353  %{S:X} substitutes X, but only if the -S switch was given to CC.
354  %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
355  %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
356  %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
357  %{.S:X} substitutes X, but only if processing a file with suffix S.
358  %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
359  %(Spec) processes a specification defined in a specs file as *Spec:
360  %[Spec] as above, but put __ around -D arguments
361
362 The conditional text X in a %{S:X} or %{!S:X} construct may contain
363 other nested % constructs or spaces, or even newlines.  They are
364 processed as usual, as described above.
365
366 The -O, -f, -m, and -W switches are handled specifically in these
367 constructs.  If another value of -O or the negated form of a -f, -m, or
368 -W switch is found later in the command line, the earlier switch
369 value is ignored, except with {S*} where S is just one letter; this
370 passes all matching options.
371
372 The character | is used to indicate that a command should be piped to
373 the following command, but only if -pipe is specified.
374
375 Note that it is built into CC which switches take arguments and which
376 do not.  You might think it would be useful to generalize this to
377 allow each compiler's spec to say which switches take arguments.  But
378 this cannot be done in a consistent fashion.  CC cannot even decide
379 which input files have been specified without knowing which switches
380 take arguments, and it must know which input files to compile in order
381 to tell which compilers to run.
382
383 CC also knows implicitly that arguments starting in `-l' are to be
384 treated as compiler output files, and passed to the linker in their
385 proper position among the other output files.  */
386 \f
387 /* Define the macros used for specs %a, %l, %L, %S, %c, %C, %1.  */
388
389 /* config.h can define ASM_SPEC to provide extra args to the assembler
390    or extra switch-translations.  */
391 #ifndef ASM_SPEC
392 #define ASM_SPEC ""
393 #endif
394
395 /* config.h can define ASM_FINAL_SPEC to run a post processor after
396    the assembler has run.  */
397 #ifndef ASM_FINAL_SPEC
398 #define ASM_FINAL_SPEC ""
399 #endif
400
401 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
402    or extra switch-translations.  */
403 #ifndef CPP_SPEC
404 #define CPP_SPEC ""
405 #endif
406
407 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
408    or extra switch-translations.  */
409 #ifndef CC1_SPEC
410 #define CC1_SPEC ""
411 #endif
412
413 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
414    or extra switch-translations.  */
415 #ifndef CC1PLUS_SPEC
416 #define CC1PLUS_SPEC ""
417 #endif
418
419 /* config.h can define LINK_SPEC to provide extra args to the linker
420    or extra switch-translations.  */
421 #ifndef LINK_SPEC
422 #define LINK_SPEC ""
423 #endif
424
425 /* config.h can define LIB_SPEC to override the default libraries.  */
426 #ifndef LIB_SPEC
427 #define LIB_SPEC "%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
428 #endif
429
430 /* config.h can define STARTFILE_SPEC to override the default crt0 files.  */
431 #ifndef STARTFILE_SPEC
432 #define STARTFILE_SPEC  \
433   "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}"
434 #endif
435
436 /* config.h can define SWITCHES_NEED_SPACES to control passing -o and -L.
437    Make the string nonempty to require spaces there.  */
438 #ifndef SWITCHES_NEED_SPACES
439 #define SWITCHES_NEED_SPACES ""
440 #endif
441
442 /* config.h can define ENDFILE_SPEC to override the default crtn files.  */
443 #ifndef ENDFILE_SPEC
444 #define ENDFILE_SPEC ""
445 #endif
446
447 /* This spec is used for telling cpp whether char is signed or not.  */
448 #ifndef SIGNED_CHAR_SPEC
449 /* Use #if rather than ?:
450    because MIPS C compiler rejects like ?: in initializers.  */
451 #if DEFAULT_SIGNED_CHAR
452 #define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
453 #else
454 #define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
455 #endif
456 #endif
457
458 /* MULTILIB_SELECT comes from multilib.h.  It gives a
459    string interpreted by set_multilib_dir to select a library
460    subdirectory based on the compiler options.  */
461 #ifndef MULTILIB_SELECT
462 #define MULTILIB_SELECT ". ;"
463 #endif
464
465 static char *cpp_spec = CPP_SPEC;
466 static char *cpp_predefines = CPP_PREDEFINES;
467 static char *cc1_spec = CC1_SPEC;
468 static char *cc1plus_spec = CC1PLUS_SPEC;
469 static char *signed_char_spec = SIGNED_CHAR_SPEC;
470 static char *asm_spec = ASM_SPEC;
471 static char *asm_final_spec = ASM_FINAL_SPEC;
472 static char *link_spec = LINK_SPEC;
473 static char *lib_spec = LIB_SPEC;
474 static char *endfile_spec = ENDFILE_SPEC;
475 static char *startfile_spec = STARTFILE_SPEC;
476 static char *switches_need_spaces = SWITCHES_NEED_SPACES;
477 static char *multilib_select = MULTILIB_SELECT;
478
479 /* This defines which switch letters take arguments.  */
480
481 #ifndef SWITCH_TAKES_ARG
482 #define SWITCH_TAKES_ARG(CHAR)      \
483   ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
484    || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
485    || (CHAR) == 'I' || (CHAR) == 'm' \
486    || (CHAR) == 'L' || (CHAR) == 'A')
487 #endif
488
489 /* This defines which multi-letter switches take arguments.  */
490
491 #define DEFAULT_WORD_SWITCH_TAKES_ARG(STR)              \
492  (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext")      \
493   || !strcmp (STR, "Tbss") || !strcmp (STR, "include")  \
494   || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
495   || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
496   || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
497   || !strcmp (STR, "isystem"))
498
499 #ifndef WORD_SWITCH_TAKES_ARG
500 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
501 #endif
502 \f
503 /* Record the mapping from file suffixes for compilation specs.  */
504
505 struct compiler
506 {
507   char *suffix;                 /* Use this compiler for input files
508                                    whose names end in this suffix.  */
509
510   char *spec[4];                /* To use this compiler, concatenate these
511                                    specs and pass to do_spec.  */
512 };
513
514 /* Pointer to a vector of `struct compiler' that gives the spec for
515    compiling a file, based on its suffix.
516    A file that does not end in any of these suffixes will be passed
517    unchanged to the loader and nothing else will be done to it.
518
519    An entry containing two 0s is used to terminate the vector.
520
521    If multiple entries match a file, the last matching one is used.  */
522
523 static struct compiler *compilers;
524
525 /* Number of entries in `compilers', not counting the null terminator.  */
526
527 static int n_compilers;
528
529 /* The default list of file name suffixes and their compilation specs.  */
530
531 static struct compiler default_compilers[] =
532 {
533   {".c", "@c"},
534   {"@c",
535    "cpp -lang-c %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
536         %{C:%{!E:%eGNU C does not support -C without using -E}}\
537         %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
538         -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
539         %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
540         %{!undef:%{!ansi:%p} %P} %{trigraphs} \
541         %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
542         %{traditional-cpp:-traditional}\
543         %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\
544         %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
545    "%{!M:%{!MM:%{!E:cc1 %{!pipe:%g.i} %1 \
546                    %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a}\
547                    %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
548                    %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
549                    %{aux-info*}\
550                    %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
551                    %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
552               %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
553                       %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\
554                       %{!pipe:%g.s} %A\n }}}}"},
555   {"-",
556    "%{E:cpp -lang-c %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
557         %{C:%{!E:%eGNU C does not support -C without using -E}}\
558         %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
559         -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
560         %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
561         %{!undef:%{!ansi:%p} %P} %{trigraphs}\
562         %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
563         %{traditional-cpp:-traditional}\
564         %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\
565         %i %W{o*}}\
566     %{!E:%e-E required when input is from standard input}"},
567   {".m", "@objective-c"},
568   {"@objective-c",
569    "cpp -lang-objc %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
570         %{C:%{!E:%eGNU C does not support -C without using -E}}\
571         %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
572         -undef -D__OBJC__ -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
573          %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
574         %{!undef:%{!ansi:%p} %P} %{trigraphs}\
575         %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
576         %{traditional-cpp:-traditional}\
577         %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\
578         %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
579    "%{!M:%{!MM:%{!E:cc1obj %{!pipe:%g.i} %1 \
580                    %{!Q:-quiet} -dumpbase %b.m %{d*} %{m*} %{a}\
581                    %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
582                    %{traditional} %{v:-version} %{pg:-p} %{p} %{f*} \
583                    -lang-objc %{gen-decls} \
584                    %{aux-info*}\
585                    %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
586                    %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
587               %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
588                       %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\
589                       %{!pipe:%g.s} %A\n }}}}"},
590   {".h", "@c-header"},
591   {"@c-header",
592    "%{!E:%eCompilation of header file requested} \
593     cpp %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
594         %{C:%{!E:%eGNU C does not support -C without using -E}}\
595          %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
596         -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
597          %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
598         %{!undef:%{!ansi:%p} %P} %{trigraphs}\
599         %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
600         %{traditional-cpp:-traditional}\
601         %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\
602         %i %W{o*}"},
603   {".cc", "@c++"},
604   {".cxx", "@c++"},
605   {".cpp", "@c++"},
606   {".C", "@c++"},
607   {"@c++",
608    "cpp -lang-c++ %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
609         %{C:%{!E:%eGNU C++ does not support -C without using -E}}\
610         %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
611         -undef -D__GNUC__=%v1 -D__GNUG__=%v1 -D__cplusplus -D__GNUC_MINOR__=%v2\
612         %{ansi:-trigraphs -$ -D__STRICT_ANSI__} %{!undef:%{!ansi:%p} %P}\
613         %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
614         %{traditional-cpp:-traditional} %{trigraphs}\
615         %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\
616         %i %{!M:%{!MM:%{!E:%{!pipe:%g.ii}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
617    "%{!M:%{!MM:%{!E:cc1plus %{!pipe:%g.ii} %1 %2\
618                             %{!Q:-quiet} -dumpbase %b.cc %{d*} %{m*} %{a}\
619                             %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\
620                             %{traditional} %{v:-version} %{pg:-p} %{p}\
621                             %{f*} %{+e*} %{aux-info*}\
622                             %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
623                             %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}}|\n\
624               %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
625                       %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\
626                       %{!pipe:%g.s} %A\n }}}}"},
627   {".i", "@cpp-output"},
628   {"@cpp-output",
629    "%{!M:%{!MM:%{!E:cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a}\
630                         %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\
631                         %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
632                         %{aux-info*}\
633                         %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
634                         %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
635                      %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
636                              %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\
637                              %{!pipe:%g.s} %A\n }}}}"},
638   {".ii", "@c++-cpp-output"},
639   {"@c++-cpp-output",
640    "%{!M:%{!MM:%{!E:cc1plus %i %1 %2 %{!Q:-quiet} %{d*} %{m*} %{a}\
641                             %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\
642                             %{traditional} %{v:-version} %{pg:-p} %{p}\
643                             %{f*} %{+e*} %{aux-info*}\
644                             %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
645                             %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
646                     %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
647                             %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\
648                             %{!pipe:%g.s} %A\n }}}}"},
649   {".s", "@assembler"},
650   {"@assembler",
651    "%{!M:%{!MM:%{!E:%{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
652                             %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\
653                             %i %A\n }}}}"},
654   {".S", "@assembler-with-cpp"},
655   {"@assembler-with-cpp",
656    "cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
657         %{C:%{!E:%eGNU C does not support -C without using -E}}\
658         %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{trigraphs}\
659         -undef -$ %{!undef:%p %P} -D__ASSEMBLER__ \
660         %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
661         %{traditional-cpp:-traditional}\
662         %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*}\
663         %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
664    "%{!M:%{!MM:%{!E:%{!S:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
665                     %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%u.o}\
666                     %{!pipe:%g.s} %A\n }}}}"},
667   {".ads", "@ada"},
668   {".adb", "@ada"},
669   {".ada", "@ada"},
670   {"@ada",
671    "%{!M:%{!MM:%{!E:gnat1 %{k8:-gnatk8} %{w:-gnatws} %{!Q:-quiet}\
672                            -dumpbase %b.ada %{g*} %{O*} %{p} %{pg:-p} %{f*}\
673                           %{d*}\
674                           %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
675                           %i %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
676                     %{!S:%{!gnatc:%{!gnats:as %{R} %{j} %{J} %{h} %{d2} %a %Y\
677                                               %{c:%W{o*}%{!o*:-o %w%b.o}}\
678                                               %{!c:-o %d%w%u.o} %{!pipe:%g.s} %A\n}}}}}} "},
679   /* Mark end of table */
680   {0, 0}
681 };
682
683 /* Number of elements in default_compilers, not counting the terminator.  */
684
685 static int n_default_compilers
686   = (sizeof default_compilers / sizeof (struct compiler)) - 1;
687
688 /* Here is the spec for running the linker, after compiling all files.  */
689
690 /* -u* was put back because both BSD and SysV seem to support it.  */
691 /* %{static:} simply prevents an error message if the target machine
692    doesn't handle -static.  */
693 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
694    scripts which exist in user specified directories, or in standard
695    directories.  */
696 #ifdef LINK_LIBGCC_SPECIAL_1
697 /* Have gcc do the search for libgcc.a, but generate -L options as usual.  */
698 static char *link_command_spec = "\
699 %{!fsyntax-only: \
700  %{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
701                         %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
702                         %{!A:%{!nostartfiles:%{!nostdlib:%S}}} %{static:}\
703                         %{L*} %D %{T*} %o %{!nostdlib:libgcc.a%s %L libgcc.a%s %{!A:%E}}\n }}}}}}";
704 #else
705 #ifdef LINK_LIBGCC_SPECIAL
706 /* Have gcc do the search for libgcc.a, and don't generate -L options.  */
707 static char *link_command_spec = "\
708 %{!fsyntax-only: \
709  %{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
710                         %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
711                         %{!A:%{!nostartfiles:%{!nostdlib:%S}}} %{static:}\
712                         %{L*} %{T*} %o %{!nostdlib:libgcc.a%s %L libgcc.a%s %{!A:%E}}\n }}}}}}";
713 #else
714 /* Use -L and have the linker do the search for -lgcc.  */
715 static char *link_command_spec = "\
716 %{!fsyntax-only: \
717  %{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
718                         %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
719                         %{!A:%{!nostartfiles:%{!nostdlib:%S}}} %{static:}\
720                         %{L*} %D %{T*} %o %{!nostdlib:-lgcc %L -lgcc %{!A:%E}}\n }}}}}}";
721 #endif
722 #endif
723
724 /* A vector of options to give to the linker.
725    These options are accumulated by -Xlinker and -Wl,
726    and substituted into the linker command with %X.  */
727 static int n_linker_options;
728 static char **linker_options;
729
730 /* A vector of options to give to the assembler.
731    These options are accumulated by -Wa,
732    and substituted into the assembler command with %X.  */
733 static int n_assembler_options;
734 static char **assembler_options;
735 \f
736 /* Define how to map long options into short ones.  */
737
738 /* This structure describes one mapping.  */
739 struct option_map
740 {
741   /* The long option's name.  */
742   char *name;
743   /* The equivalent short option.  */
744   char *equivalent;
745   /* Argument info.  A string of flag chars; NULL equals no options.
746      a => argument required.
747      o => argument optional.
748      j => join argument to equivalent, making one word.
749      * => require other text after NAME as an argument.  */
750   char *arg_info;
751 };
752
753 /* This is the table of mappings.  Mappings are tried sequentially
754    for each option encountered; the first one that matches, wins.  */
755
756 struct option_map option_map[] =
757  {
758    {"--all-warnings", "-Wall", 0},
759    {"--ansi", "-ansi", 0},
760    {"--assemble", "-S", 0},
761    {"--assert", "-A", "a"},
762    {"--comments", "-C", 0},
763    {"--compile", "-c", 0},
764    {"--debug", "-g", "oj"},
765    {"--define-macro", "-D", "a"},
766    {"--dependencies", "-M", 0},
767    {"--dump", "-d", "a"},
768    {"--dumpbase", "-dumpbase", "a"},
769    {"--entry", "-e", 0},
770    {"--extra-warnings", "-W", 0},
771    {"--for-assembler", "-Wa", "a"},
772    {"--for-linker", "-Xlinker", "a"},
773    {"--force-link", "-u", "a"},
774    {"--imacros", "-imacros", "a"},
775    {"--include", "-include", "a"},
776    {"--include-barrier", "-I-", 0},
777    {"--include-directory", "-I", "a"},
778    {"--include-directory-after", "-idirafter", "a"},
779    {"--include-prefix", "-iprefix", "a"},
780    {"--include-with-prefix", "-iwithprefix", "a"},
781    {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
782    {"--include-with-prefix-after", "-iwithprefix", "a"},
783    {"--language", "-x", "a"},
784    {"--library-directory", "-L", "a"},
785    {"--machine", "-m", "aj"},
786    {"--machine-", "-m", "*j"},
787    {"--no-line-commands", "-P", 0},
788    {"--no-precompiled-includes", "-noprecomp", 0},
789    {"--no-standard-includes", "-nostdinc", 0},
790    {"--no-standard-libraries", "-nostdlib", 0},
791    {"--no-warnings", "-w", 0},
792    {"--optimize", "-O", "oj"},
793    {"--output", "-o", "a"},
794    {"--pedantic", "-pedantic", 0},
795    {"--pedantic-errors", "-pedantic-errors", 0},
796    {"--pipe", "-pipe", 0},
797    {"--prefix", "-B", "a"},
798    {"--preprocess", "-E", 0},
799    {"--print-file-name", "-print-file-name=", "aj"},
800    {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
801    {"--print-missing-file-dependencies", "-MG", 0},
802    {"--print-multi-lib", "-print-multi-lib", 0},
803    {"--print-multi-directory", "-print-multi-directory", 0},
804    {"--print-prog-name", "-print-prog-name=", "aj"},
805    {"--profile", "-p", 0},
806    {"--profile-blocks", "-a", 0},
807    {"--quiet", "-q", 0},
808    {"--save-temps", "-save-temps", 0},
809    {"--shared", "-shared", 0},
810    {"--silent", "-q", 0},
811    {"--static", "-static", 0},
812    {"--symbolic", "-symbolic", 0},
813    {"--target", "-b", "a"},
814    {"--trace-includes", "-H", 0},
815    {"--traditional", "-traditional", 0},
816    {"--traditional-cpp", "-traditional-cpp", 0},
817    {"--trigraphs", "-trigraphs", 0},
818    {"--undefine-macro", "-U", "a"},
819    {"--use-version", "-V", "a"},
820    {"--user-dependencies", "-MM", 0},
821    {"--verbose", "-v", 0},
822    {"--version", "-dumpversion", 0},
823    {"--warn-", "-W", "*j"},
824    {"--write-dependencies", "-MD", 0},
825    {"--write-user-dependencies", "-MMD", 0},
826    {"--", "-f", "*j"}
827  };
828 \f
829 /* Translate the options described by *ARGCP and *ARGVP.
830    Make a new vector and store it back in *ARGVP,
831    and store its length in *ARGVC.  */
832
833 static void
834 translate_options (argcp, argvp)
835      int *argcp;
836      char ***argvp;
837 {
838   int i, j, k;
839   int argc = *argcp;
840   char **argv = *argvp;
841   char **newv = (char **) xmalloc ((argc + 2) * 2 * sizeof (char *));
842   int newindex = 0;
843
844   i = 0;
845   newv[newindex++] = argv[i++];
846
847   while (i < argc)
848     {
849       /* Translate -- options.  */
850       if (argv[i][0] == '-' && argv[i][1] == '-')
851         {
852           /* Find a mapping that applies to this option.  */
853           for (j = 0; j < sizeof (option_map) / sizeof (option_map[0]); j++)
854             {
855               int optlen = strlen (option_map[j].name);
856               int arglen = strlen (argv[i]);
857               int complen = arglen > optlen ? optlen : arglen;
858               char *arginfo = option_map[j].arg_info;
859
860               if (arginfo == 0)
861                 arginfo = "";
862
863               if (!strncmp (argv[i], option_map[j].name, complen))
864                 {
865                   char *arg = 0;
866
867                   if (arglen < optlen)
868                     {
869                       for (k = j + 1;
870                            k < sizeof (option_map) / sizeof (option_map[0]);
871                            k++)
872                         if (strlen (option_map[k].name) >= arglen
873                             && !strncmp (argv[i], option_map[k].name, arglen))
874                           {
875                             error ("Ambiguous abbreviation %s", argv[i]);
876                             break;
877                           }
878
879                       if (k != sizeof (option_map) / sizeof (option_map[0]))
880                         break;
881                     }
882
883                   if (arglen > optlen)
884                     {
885                       /* If the option has an argument, accept that.  */
886                       if (argv[i][optlen] == '=')
887                         arg = argv[i] + optlen + 1;
888
889                       /* If this mapping requires extra text at end of name,
890                          accept that as "argument".  */
891                       else if (index (arginfo, '*') != 0)
892                         arg = argv[i] + optlen;
893
894                       /* Otherwise, extra text at end means mismatch.
895                          Try other mappings.  */
896                       else
897                         continue;
898                     }
899
900                   else if (index (arginfo, '*') != 0)
901                     {
902                       error ("Incomplete `%s' option", option_map[j].name);
903                       break;
904                     }
905
906                   /* Handle arguments.  */
907                   if (index (arginfo, 'a') != 0)
908                     {
909                       if (arg == 0)
910                         {
911                           if (i + 1 == argc)
912                             {
913                               error ("Missing argument to `%s' option",
914                                      option_map[j].name);
915                               break;
916                             }
917
918                           arg = argv[++i];
919                         }
920                     }
921                   else if (index (arginfo, '*') != 0)
922                     ;
923                   else if (index (arginfo, 'o') == 0)
924                     {
925                       if (arg != 0)
926                         error ("Extraneous argument to `%s' option",
927                                option_map[j].name);
928                       arg = 0;
929                     }
930
931                   /* Store the translation as one argv elt or as two.  */
932                   if (arg != 0 && index (arginfo, 'j') != 0)
933                     newv[newindex++] = concat (option_map[j].equivalent,
934                                                arg, "");
935                   else if (arg != 0)
936                     {
937                       newv[newindex++] = option_map[j].equivalent;
938                       newv[newindex++] = arg;
939                     }
940                   else
941                     newv[newindex++] = option_map[j].equivalent;
942
943                   break;
944                 }
945             }
946           i++;
947         }
948
949       /* Handle old-fashioned options--just copy them through,
950          with their arguments.  */
951       else if (argv[i][0] == '-')
952         {
953           char *p = argv[i] + 1;
954           int c = *p;
955           int nskip = 1;
956
957           if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
958             nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
959           else if (WORD_SWITCH_TAKES_ARG (p))
960             nskip += WORD_SWITCH_TAKES_ARG (p);
961           else if ((c == 'B' || c == 'b' || c == 'V' || c == 'x')
962                    && p[1] == 0)
963             nskip += 1;
964           else if (! strcmp (p, "Xlinker"))
965             nskip += 1;
966
967           /* Watch out for an option at the end of the command line that
968              is missing arguments, and avoid skipping past the end of the
969              command line.  */
970           if (nskip + i > argc)
971             nskip = argc - i;
972
973           while (nskip > 0)
974             {
975               newv[newindex++] = argv[i++];
976               nskip--;
977             }
978         }
979       else
980         /* Ordinary operands, or +e options.  */
981         newv[newindex++] = argv[i++];
982     }
983
984   newv[newindex] = 0;
985
986   *argvp = newv;
987   *argcp = newindex;
988 }
989 \f
990 /* Read compilation specs from a file named FILENAME,
991    replacing the default ones.
992
993    A suffix which starts with `*' is a definition for
994    one of the machine-specific sub-specs.  The "suffix" should be
995    *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
996    The corresponding spec is stored in asm_spec, etc.,
997    rather than in the `compilers' vector.
998
999    Anything invalid in the file is a fatal error.  */
1000
1001 static void
1002 read_specs (filename)
1003      char *filename;
1004 {
1005   int desc;
1006   struct stat statbuf;
1007   char *buffer;
1008   register char *p;
1009
1010   if (verbose_flag)
1011     fprintf (stderr, "Reading specs from %s\n", filename);
1012
1013   /* Open and stat the file.  */
1014   desc = open (filename, 0, 0);
1015   if (desc < 0)
1016     pfatal_with_name (filename);
1017   if (stat (filename, &statbuf) < 0)
1018     pfatal_with_name (filename);
1019
1020   /* Read contents of file into BUFFER.  */
1021   buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1022   read (desc, buffer, (unsigned) statbuf.st_size);
1023   buffer[statbuf.st_size] = 0;
1024   close (desc);
1025
1026   /* Scan BUFFER for specs, putting them in the vector.  */
1027   p = buffer;
1028   while (1)
1029     {
1030       char *suffix;
1031       char *spec;
1032       char *in, *out, *p1, *p2;
1033
1034       /* Advance P in BUFFER to the next nonblank nocomment line.  */
1035       p = skip_whitespace (p);
1036       if (*p == 0)
1037         break;
1038
1039       /* Find the colon that should end the suffix.  */
1040       p1 = p;
1041       while (*p1 && *p1 != ':' && *p1 != '\n') p1++;
1042       /* The colon shouldn't be missing.  */
1043       if (*p1 != ':')
1044         fatal ("specs file malformed after %d characters", p1 - buffer);
1045       /* Skip back over trailing whitespace.  */
1046       p2 = p1;
1047       while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t')) p2--;
1048       /* Copy the suffix to a string.  */
1049       suffix = save_string (p, p2 - p);
1050       /* Find the next line.  */
1051       p = skip_whitespace (p1 + 1);
1052       if (p[1] == 0)
1053         fatal ("specs file malformed after %d characters", p - buffer);
1054       p1 = p;
1055       /* Find next blank line.  */
1056       while (*p1 && !(*p1 == '\n' && p1[1] == '\n')) p1++;
1057       /* Specs end at the blank line and do not include the newline.  */
1058       spec = save_string (p, p1 - p);
1059       p = p1;
1060
1061       /* Delete backslash-newline sequences from the spec.  */
1062       in = spec;
1063       out = spec;
1064       while (*in != 0)
1065         {
1066           if (in[0] == '\\' && in[1] == '\n')
1067             in += 2;
1068           else if (in[0] == '#')
1069             {
1070               while (*in && *in != '\n') in++;
1071             }
1072           else
1073             *out++ = *in++;
1074         }
1075       *out = 0;
1076
1077       if (suffix[0] == '*')
1078         {
1079           if (! strcmp (suffix, "*link_command"))
1080             link_command_spec = spec;
1081           else
1082             set_spec (suffix + 1, spec);
1083         }
1084       else
1085         {
1086           /* Add this pair to the vector.  */
1087           compilers
1088             = ((struct compiler *)
1089                xrealloc (compilers, (n_compilers + 2) * sizeof (struct compiler)));
1090           compilers[n_compilers].suffix = suffix;
1091           bzero ((char *) compilers[n_compilers].spec,
1092                  sizeof compilers[n_compilers].spec);
1093           compilers[n_compilers].spec[0] = spec;
1094           n_compilers++;
1095           bzero ((char *) &compilers[n_compilers],
1096                  sizeof compilers[n_compilers]);
1097         }
1098
1099       if (*suffix == 0)
1100         link_command_spec = spec;
1101     }
1102
1103   if (link_command_spec == 0)
1104     fatal ("spec file has no spec for linking");
1105 }
1106
1107 static char *
1108 skip_whitespace (p)
1109      char *p;
1110 {
1111   while (1)
1112     {
1113       /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1114          be considered whitespace.  */
1115       if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1116         return p + 1;
1117       else if (*p == '\n' || *p == ' ' || *p == '\t')
1118         p++;
1119       else if (*p == '#')
1120         {
1121           while (*p != '\n') p++;
1122           p++;
1123         }
1124       else
1125         break;
1126     }
1127
1128   return p;
1129 }
1130 \f
1131 /* Structure to keep track of the specs that have been defined so far.  These
1132    are accessed using %(specname) or %[specname] in a compiler or link spec. */
1133
1134 struct spec_list
1135 {
1136   char *name;                 /* Name of the spec. */
1137   char *spec;                 /* The spec itself. */
1138   struct spec_list *next;     /* Next spec in linked list. */
1139 };
1140
1141 /* List of specs that have been defined so far. */
1142
1143 static struct spec_list *specs = (struct spec_list *) 0;
1144 \f
1145 /* Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
1146    removed; If the spec starts with a + then SPEC is added to the end of the
1147    current spec. */
1148
1149 static void
1150 set_spec (name, spec)
1151      char *name;
1152      char *spec;
1153 {
1154   struct spec_list *sl;
1155   char *old_spec;
1156
1157   /* See if the spec already exists */
1158   for (sl = specs; sl; sl = sl->next)
1159     if (strcmp (sl->name, name) == 0)
1160       break;
1161
1162   if (!sl)
1163     {
1164       /* Not found - make it */
1165       sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
1166       sl->name = save_string (name, strlen (name));
1167       sl->spec = save_string ("", 0);
1168       sl->next = specs;
1169       specs = sl;
1170     }
1171
1172   old_spec = sl->spec;
1173   if (name && spec[0] == '+' && isspace (spec[1]))
1174     sl->spec = concat (old_spec, spec + 1, "");
1175   else
1176     sl->spec = save_string (spec, strlen (spec));
1177
1178   if (! strcmp (name, "asm"))
1179     asm_spec = sl->spec;
1180   else if (! strcmp (name, "asm_final"))
1181     asm_final_spec = sl->spec;
1182   else if (! strcmp (name, "cc1"))
1183     cc1_spec = sl->spec;
1184   else if (! strcmp (name, "cc1plus"))
1185     cc1plus_spec = sl->spec;
1186   else if (! strcmp (name, "cpp"))
1187     cpp_spec = sl->spec;
1188   else if (! strcmp (name, "endfile"))
1189     endfile_spec = sl->spec;
1190   else if (! strcmp (name, "lib"))
1191     lib_spec = sl->spec;
1192   else if (! strcmp (name, "link"))
1193     link_spec = sl->spec;
1194   else if (! strcmp (name, "predefines"))
1195     cpp_predefines = sl->spec;
1196   else if (! strcmp (name, "signed_char"))
1197     signed_char_spec = sl->spec;
1198   else if (! strcmp (name, "startfile"))
1199     startfile_spec = sl->spec;
1200   else if (! strcmp (name, "switches_need_spaces"))
1201     switches_need_spaces = sl->spec;
1202   else if (! strcmp (name, "cross_compile"))
1203     cross_compile = atoi (sl->spec);
1204   else if (! strcmp (name, "multilib"))
1205     multilib_select = sl->spec;
1206   /* Free the old spec */
1207   if (old_spec)
1208     free (old_spec);
1209 }
1210 \f
1211 /* Accumulate a command (program name and args), and run it.  */
1212
1213 /* Vector of pointers to arguments in the current line of specifications.  */
1214
1215 static char **argbuf;
1216
1217 /* Number of elements allocated in argbuf.  */
1218
1219 static int argbuf_length;
1220
1221 /* Number of elements in argbuf currently in use (containing args).  */
1222
1223 static int argbuf_index;
1224
1225 /* This is the list of suffixes and codes (%g/%u/%U) and the associated
1226    temp file.  Used only if MKTEMP_EACH_FILE.  */
1227
1228 static struct temp_name {
1229   char *suffix;         /* suffix associated with the code.  */
1230   int length;           /* strlen (suffix).  */
1231   int unique;           /* Indicates whether %g or %u/%U was used.  */
1232   char *filename;       /* associated filename.  */
1233   int filename_length;  /* strlen (filename).  */
1234   struct temp_name *next;
1235 } *temp_names;
1236
1237 /* Number of commands executed so far.  */
1238
1239 static int execution_count;
1240
1241 /* Number of commands that exited with a signal.  */
1242
1243 static int signal_count;
1244
1245 /* Name with which this program was invoked.  */
1246
1247 static char *programname;
1248 \f
1249 /* Structures to keep track of prefixes to try when looking for files. */
1250
1251 struct prefix_list
1252 {
1253   char *prefix;               /* String to prepend to the path. */
1254   struct prefix_list *next;   /* Next in linked list. */
1255   int require_machine_suffix; /* Don't use without machine_suffix.  */
1256   /* 2 means try both machine_suffix and just_machine_suffix.  */
1257   int *used_flag_ptr;         /* 1 if a file was found with this prefix.  */
1258 };
1259
1260 struct path_prefix
1261 {
1262   struct prefix_list *plist;  /* List of prefixes to try */
1263   int max_len;                /* Max length of a prefix in PLIST */
1264   char *name;                 /* Name of this list (used in config stuff) */
1265 };
1266
1267 /* List of prefixes to try when looking for executables. */
1268
1269 static struct path_prefix exec_prefix = { 0, 0, "exec" };
1270
1271 /* List of prefixes to try when looking for startup (crt0) files. */
1272
1273 static struct path_prefix startfile_prefix = { 0, 0, "startfile" };
1274
1275 /* List of prefixes to try when looking for include files.  */
1276
1277 static struct path_prefix include_prefix = { 0, 0, "include" };
1278
1279 /* Suffix to attach to directories searched for commands.
1280    This looks like `MACHINE/VERSION/'.  */
1281
1282 static char *machine_suffix = 0;
1283
1284 /* Suffix to attach to directories searched for commands.
1285    This is just `MACHINE/'.  */
1286
1287 static char *just_machine_suffix = 0;
1288
1289 /* Adjusted value of GCC_EXEC_PREFIX envvar.  */
1290
1291 static char *gcc_exec_prefix;
1292
1293 /* Default prefixes to attach to command names.  */
1294
1295 #ifdef CROSS_COMPILE  /* Don't use these prefixes for a cross compiler.  */
1296 #undef MD_EXEC_PREFIX
1297 #undef MD_STARTFILE_PREFIX
1298 #undef MD_STARTFILE_PREFIX_1
1299 #endif
1300
1301 #ifndef STANDARD_EXEC_PREFIX
1302 #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
1303 #endif /* !defined STANDARD_EXEC_PREFIX */
1304
1305 static char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
1306 static char *standard_exec_prefix_1 = "/usr/lib/gcc/";
1307 #ifdef MD_EXEC_PREFIX
1308 static char *md_exec_prefix = MD_EXEC_PREFIX;
1309 #endif
1310
1311 #ifndef STANDARD_STARTFILE_PREFIX
1312 #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
1313 #endif /* !defined STANDARD_STARTFILE_PREFIX */
1314
1315 #ifdef MD_STARTFILE_PREFIX
1316 static char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1317 #endif
1318 #ifdef MD_STARTFILE_PREFIX_1
1319 static char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1320 #endif
1321 static char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1322 static char *standard_startfile_prefix_1 = "/lib/";
1323 static char *standard_startfile_prefix_2 = "/usr/lib/";
1324
1325 #ifndef TOOLDIR_BASE_PREFIX
1326 #define TOOLDIR_BASE_PREFIX "/usr/local/"
1327 #endif
1328 static char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1329 static char *tooldir_prefix;
1330
1331 /* Subdirectory to use for locating libraries.  Set by
1332    set_multilib_dir based on the compilation options.  */
1333
1334 static char *multilib_dir;
1335
1336 /* Clear out the vector of arguments (after a command is executed).  */
1337
1338 static void
1339 clear_args ()
1340 {
1341   argbuf_index = 0;
1342 }
1343
1344 /* Add one argument to the vector at the end.
1345    This is done when a space is seen or at the end of the line.
1346    If DELETE_ALWAYS is nonzero, the arg is a filename
1347     and the file should be deleted eventually.
1348    If DELETE_FAILURE is nonzero, the arg is a filename
1349     and the file should be deleted if this compilation fails.  */
1350
1351 static void
1352 store_arg (arg, delete_always, delete_failure)
1353      char *arg;
1354      int delete_always, delete_failure;
1355 {
1356   if (argbuf_index + 1 == argbuf_length)
1357     {
1358       argbuf = (char **) xrealloc (argbuf, (argbuf_length *= 2) * sizeof (char *));
1359     }
1360
1361   argbuf[argbuf_index++] = arg;
1362   argbuf[argbuf_index] = 0;
1363
1364   if (delete_always || delete_failure)
1365     record_temp_file (arg, delete_always, delete_failure);
1366 }
1367 \f
1368 /* Record the names of temporary files we tell compilers to write,
1369    and delete them at the end of the run.  */
1370
1371 /* This is the common prefix we use to make temp file names.
1372    It is chosen once for each run of this program.
1373    It is substituted into a spec by %g.
1374    Thus, all temp file names contain this prefix.
1375    In practice, all temp file names start with this prefix.
1376
1377    This prefix comes from the envvar TMPDIR if it is defined;
1378    otherwise, from the P_tmpdir macro if that is defined;
1379    otherwise, in /usr/tmp or /tmp.  */
1380
1381 static char *temp_filename;
1382
1383 /* Length of the prefix.  */
1384
1385 static int temp_filename_length;
1386
1387 /* Define the list of temporary files to delete.  */
1388
1389 struct temp_file
1390 {
1391   char *name;
1392   struct temp_file *next;
1393 };
1394
1395 /* Queue of files to delete on success or failure of compilation.  */
1396 static struct temp_file *always_delete_queue;
1397 /* Queue of files to delete on failure of compilation.  */
1398 static struct temp_file *failure_delete_queue;
1399
1400 /* Record FILENAME as a file to be deleted automatically.
1401    ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
1402    otherwise delete it in any case.
1403    FAIL_DELETE nonzero means delete it if a compilation step fails;
1404    otherwise delete it in any case.  */
1405
1406 static void
1407 record_temp_file (filename, always_delete, fail_delete)
1408      char *filename;
1409      int always_delete;
1410      int fail_delete;
1411 {
1412   register char *name;
1413   name = xmalloc (strlen (filename) + 1);
1414   strcpy (name, filename);
1415
1416   if (always_delete)
1417     {
1418       register struct temp_file *temp;
1419       for (temp = always_delete_queue; temp; temp = temp->next)
1420         if (! strcmp (name, temp->name))
1421           goto already1;
1422       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1423       temp->next = always_delete_queue;
1424       temp->name = name;
1425       always_delete_queue = temp;
1426     already1:;
1427     }
1428
1429   if (fail_delete)
1430     {
1431       register struct temp_file *temp;
1432       for (temp = failure_delete_queue; temp; temp = temp->next)
1433         if (! strcmp (name, temp->name))
1434           goto already2;
1435       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1436       temp->next = failure_delete_queue;
1437       temp->name = name;
1438       failure_delete_queue = temp;
1439     already2:;
1440     }
1441 }
1442
1443 /* Delete all the temporary files whose names we previously recorded.  */
1444
1445 static void
1446 delete_if_ordinary (name)
1447      char *name;
1448 {
1449   struct stat st;
1450 #ifdef DEBUG
1451   int i, c;
1452
1453   printf ("Delete %s? (y or n) ", name);
1454   fflush (stdout);
1455   i = getchar ();
1456   if (i != '\n')
1457     while ((c = getchar ()) != '\n' && c != EOF) ;
1458   if (i == 'y' || i == 'Y')
1459 #endif /* DEBUG */
1460     if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
1461       if (unlink (name) < 0)
1462         if (verbose_flag)
1463           perror_with_name (name);
1464 }
1465
1466 static void
1467 delete_temp_files ()
1468 {
1469   register struct temp_file *temp;
1470
1471   for (temp = always_delete_queue; temp; temp = temp->next)
1472     delete_if_ordinary (temp->name);
1473   always_delete_queue = 0;
1474 }
1475
1476 /* Delete all the files to be deleted on error.  */
1477
1478 static void
1479 delete_failure_queue ()
1480 {
1481   register struct temp_file *temp;
1482
1483   for (temp = failure_delete_queue; temp; temp = temp->next)
1484     delete_if_ordinary (temp->name);
1485 }
1486
1487 static void
1488 clear_failure_queue ()
1489 {
1490   failure_delete_queue = 0;
1491 }
1492
1493 /* Compute a string to use as the base of all temporary file names.
1494    It is substituted for %g.  */
1495
1496 static char *
1497 choose_temp_base_try (try, base)
1498      char *try;
1499      char *base;
1500 {
1501   char *rv;
1502   if (base)
1503     rv = base;
1504   else if (try == (char *)0)
1505     rv = 0;
1506   else if (access (try, R_OK | W_OK) != 0)
1507     rv = 0;
1508   else
1509     rv = try;
1510   return rv;
1511 }
1512
1513 static void
1514 choose_temp_base ()
1515 {
1516   char *base = 0;
1517   int len;
1518
1519   base = choose_temp_base_try (getenv ("TMPDIR"), base);
1520   base = choose_temp_base_try (getenv ("TMP"), base);
1521   base = choose_temp_base_try (getenv ("TEMP"), base);
1522
1523 #ifdef P_tmpdir
1524   base = choose_temp_base_try (P_tmpdir, base);
1525 #endif
1526
1527   base = choose_temp_base_try ("/usr/tmp", base);
1528   base = choose_temp_base_try ("/tmp", base);
1529
1530   /* If all else fails, use the current directory! */  
1531   if (base == (char *)0)
1532     base = "./";
1533
1534   len = strlen (base);
1535   temp_filename = xmalloc (len + sizeof("/ccXXXXXX") + 1);
1536   strcpy (temp_filename, base);
1537   if (len > 0 && temp_filename[len-1] != '/')
1538     temp_filename[len++] = '/';
1539   strcpy (temp_filename + len, "ccXXXXXX");
1540
1541   mktemp (temp_filename);
1542   temp_filename_length = strlen (temp_filename);
1543   if (temp_filename_length == 0)
1544     abort ();
1545 }
1546 \f
1547
1548 /* Routine to add variables to the environment.  We do this to pass
1549    the pathname of the gcc driver, and the directories search to the
1550    collect2 program, which is being run as ld.  This way, we can be
1551    sure of executing the right compiler when collect2 wants to build
1552    constructors and destructors.  Since the environment variables we
1553    use come from an obstack, we don't have to worry about allocating
1554    space for them.  */
1555
1556 #ifndef HAVE_PUTENV
1557
1558 void
1559 putenv (str)
1560      char *str;
1561 {
1562 #ifndef VMS                     /* nor about VMS */
1563
1564   extern char **environ;
1565   char **old_environ = environ;
1566   char **envp;
1567   int num_envs = 0;
1568   int name_len = 1;
1569   int str_len = strlen (str);
1570   char *p = str;
1571   int ch;
1572
1573   while ((ch = *p++) != '\0' && ch != '=')
1574     name_len++;
1575
1576   if (!ch)
1577     abort ();
1578
1579   /* Search for replacing an existing environment variable, and
1580      count the number of total environment variables.  */
1581   for (envp = old_environ; *envp; envp++)
1582     {
1583       num_envs++;
1584       if (!strncmp (str, *envp, name_len))
1585         {
1586           *envp = str;
1587           return;
1588         }
1589     }
1590
1591   /* Add a new environment variable */
1592   environ = (char **) xmalloc (sizeof (char *) * (num_envs+2));
1593   *environ = str;
1594   bcopy ((char *) old_environ, (char *) (environ + 1),
1595          sizeof (char *) * (num_envs+1));
1596
1597 #endif  /* VMS */
1598 }
1599
1600 #endif  /* HAVE_PUTENV */
1601
1602 \f
1603 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables for collect.  */
1604
1605 static void
1606 putenv_from_prefixes (paths, env_var)
1607      struct path_prefix *paths;
1608      char *env_var;
1609 {
1610   int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
1611   int just_suffix_len
1612     = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
1613   int first_time = TRUE;
1614   struct prefix_list *pprefix;
1615
1616   obstack_grow (&collect_obstack, env_var, strlen (env_var));
1617
1618   for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
1619     {
1620       int len = strlen (pprefix->prefix);
1621
1622       if (machine_suffix
1623           && is_directory (pprefix->prefix, machine_suffix, 0))
1624         {
1625           if (!first_time)
1626             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1627             
1628           first_time = FALSE;
1629           obstack_grow (&collect_obstack, pprefix->prefix, len);
1630           obstack_grow (&collect_obstack, machine_suffix, suffix_len);
1631         }
1632
1633       if (just_machine_suffix
1634           && pprefix->require_machine_suffix == 2
1635           && is_directory (pprefix->prefix, just_machine_suffix, 0))
1636         {
1637           if (!first_time)
1638             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1639             
1640           first_time = FALSE;
1641           obstack_grow (&collect_obstack, pprefix->prefix, len);
1642           obstack_grow (&collect_obstack, just_machine_suffix,
1643                         just_suffix_len);
1644         }
1645
1646       if (!pprefix->require_machine_suffix)
1647         {
1648           if (!first_time)
1649             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1650
1651           first_time = FALSE;
1652           obstack_grow (&collect_obstack, pprefix->prefix, len);
1653         }
1654     }
1655   obstack_1grow (&collect_obstack, '\0');
1656   putenv (obstack_finish (&collect_obstack));
1657 }
1658
1659 \f
1660 /* Search for NAME using the prefix list PREFIXES.  MODE is passed to
1661    access to check permissions.
1662    Return 0 if not found, otherwise return its name, allocated with malloc. */
1663
1664 static char *
1665 find_a_file (pprefix, name, mode)
1666      struct path_prefix *pprefix;
1667      char *name;
1668      int mode;
1669 {
1670   char *temp;
1671   char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
1672   struct prefix_list *pl;
1673   int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
1674
1675   if (machine_suffix)
1676     len += strlen (machine_suffix);
1677
1678   temp = xmalloc (len);
1679
1680   /* Determine the filename to execute (special case for absolute paths).  */
1681
1682   if (*name == '/')
1683     {
1684       if (access (name, mode))
1685         {
1686           strcpy (temp, name);
1687           return temp;
1688         }
1689     }
1690   else
1691     for (pl = pprefix->plist; pl; pl = pl->next)
1692       {
1693         if (machine_suffix)
1694           {
1695             /* Some systems have a suffix for executable files.
1696                So try appending that first.  */
1697             if (file_suffix[0] != 0)
1698               {
1699                 strcpy (temp, pl->prefix);
1700                 strcat (temp, machine_suffix);
1701                 strcat (temp, name);
1702                 strcat (temp, file_suffix);
1703                 if (access (temp, mode) == 0)
1704                   {
1705                     if (pl->used_flag_ptr != 0)
1706                       *pl->used_flag_ptr = 1;
1707                     return temp;
1708                   }
1709               }
1710
1711             /* Now try just the name.  */
1712             strcpy (temp, pl->prefix);
1713             strcat (temp, machine_suffix);
1714             strcat (temp, name);
1715             if (access (temp, mode) == 0)
1716               {
1717                 if (pl->used_flag_ptr != 0)
1718                   *pl->used_flag_ptr = 1;
1719                 return temp;
1720               }
1721           }
1722
1723         /* Certain prefixes are tried with just the machine type,
1724            not the version.  This is used for finding as, ld, etc.  */
1725         if (just_machine_suffix && pl->require_machine_suffix == 2)
1726           {
1727             /* Some systems have a suffix for executable files.
1728                So try appending that first.  */
1729             if (file_suffix[0] != 0)
1730               {
1731                 strcpy (temp, pl->prefix);
1732                 strcat (temp, just_machine_suffix);
1733                 strcat (temp, name);
1734                 strcat (temp, file_suffix);
1735                 if (access (temp, mode) == 0)
1736                   {
1737                     if (pl->used_flag_ptr != 0)
1738                       *pl->used_flag_ptr = 1;
1739                     return temp;
1740                   }
1741               }
1742
1743             strcpy (temp, pl->prefix);
1744             strcat (temp, just_machine_suffix);
1745             strcat (temp, name);
1746             if (access (temp, mode) == 0)
1747               {
1748                 if (pl->used_flag_ptr != 0)
1749                   *pl->used_flag_ptr = 1;
1750                 return temp;
1751               }
1752           }
1753
1754         /* Certain prefixes can't be used without the machine suffix
1755            when the machine or version is explicitly specified.  */
1756         if (!pl->require_machine_suffix)
1757           {
1758             /* Some systems have a suffix for executable files.
1759                So try appending that first.  */
1760             if (file_suffix[0] != 0)
1761               {
1762                 strcpy (temp, pl->prefix);
1763                 strcat (temp, name);
1764                 strcat (temp, file_suffix);
1765                 if (access (temp, mode) == 0)
1766                   {
1767                     if (pl->used_flag_ptr != 0)
1768                       *pl->used_flag_ptr = 1;
1769                     return temp;
1770                   }
1771               }
1772
1773             strcpy (temp, pl->prefix);
1774             strcat (temp, name);
1775             if (access (temp, mode) == 0)
1776               {
1777                 if (pl->used_flag_ptr != 0)
1778                   *pl->used_flag_ptr = 1;
1779                 return temp;
1780               }
1781           }
1782       }
1783
1784   free (temp);
1785   return 0;
1786 }
1787
1788 /* Add an entry for PREFIX in PLIST.  If FIRST is set, it goes
1789    at the start of the list, otherwise it goes at the end.
1790
1791    If WARN is nonzero, we will warn if no file is found
1792    through this prefix.  WARN should point to an int
1793    which will be set to 1 if this entry is used.
1794
1795    REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
1796    the complete value of machine_suffix.
1797    2 means try both machine_suffix and just_machine_suffix.  */
1798
1799 static void
1800 add_prefix (pprefix, prefix, first, require_machine_suffix, warn)
1801      struct path_prefix *pprefix;
1802      char *prefix;
1803      int first;
1804      int require_machine_suffix;
1805      int *warn;
1806 {
1807   struct prefix_list *pl, **prev;
1808   int len;
1809
1810   if (!first && pprefix->plist)
1811     {
1812       for (pl = pprefix->plist; pl->next; pl = pl->next)
1813         ;
1814       prev = &pl->next;
1815     }
1816   else
1817     prev = &pprefix->plist;
1818
1819   /* Keep track of the longest prefix */
1820
1821   len = strlen (prefix);
1822   if (len > pprefix->max_len)
1823     pprefix->max_len = len;
1824
1825   pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
1826   pl->prefix = save_string (prefix, len);
1827   pl->require_machine_suffix = require_machine_suffix;
1828   pl->used_flag_ptr = warn;
1829   if (warn)
1830     *warn = 0;
1831
1832   if (*prev)
1833     pl->next = *prev;
1834   else
1835     pl->next = (struct prefix_list *) 0;
1836   *prev = pl;
1837 }
1838
1839 /* Print warnings for any prefixes in the list PPREFIX that were not used.  */
1840
1841 static void
1842 unused_prefix_warnings (pprefix)
1843      struct path_prefix *pprefix;
1844 {
1845   struct prefix_list *pl = pprefix->plist;
1846
1847   while (pl)
1848     {
1849       if (pl->used_flag_ptr != 0 && !*pl->used_flag_ptr)
1850         {
1851           error ("file path prefix `%s' never used",
1852                  pl->prefix);
1853           /* Prevent duplicate warnings.  */
1854           *pl->used_flag_ptr = 1;
1855         }
1856       pl = pl->next;
1857     }
1858 }
1859
1860 /* Get rid of all prefixes built up so far in *PLISTP. */
1861
1862 static void
1863 free_path_prefix (pprefix)
1864      struct path_prefix *pprefix;
1865 {
1866   struct prefix_list *pl = pprefix->plist;
1867   struct prefix_list *temp;
1868
1869   while (pl)
1870     {
1871       temp = pl;
1872       pl = pl->next;
1873       free (temp->prefix);
1874       free ((char *) temp);
1875     }
1876   pprefix->plist = (struct prefix_list *) 0;
1877 }
1878 \f
1879 /* stdin file number.  */
1880 #define STDIN_FILE_NO 0
1881
1882 /* stdout file number.  */
1883 #define STDOUT_FILE_NO 1
1884
1885 /* value of `pipe': port index for reading.  */
1886 #define READ_PORT 0
1887
1888 /* value of `pipe': port index for writing.  */
1889 #define WRITE_PORT 1
1890
1891 /* Pipe waiting from last process, to be used as input for the next one.
1892    Value is STDIN_FILE_NO if no pipe is waiting
1893    (i.e. the next command is the first of a group).  */
1894
1895 static int last_pipe_input;
1896
1897 /* Fork one piped subcommand.  FUNC is the system call to use
1898    (either execv or execvp).  ARGV is the arg vector to use.
1899    NOT_LAST is nonzero if this is not the last subcommand
1900    (i.e. its output should be piped to the next one.)  */
1901
1902 #ifndef OS2
1903 #ifdef __MSDOS__
1904
1905 #include <process.h>
1906 static int
1907 pexecute (search_flag, program, argv, not_last)
1908      int search_flag;
1909      char *program;
1910      char *argv[];
1911      int not_last;
1912 {
1913 #ifdef __GO32__
1914   int i = (search_flag ? spawnv : spawnvp) (1, program, argv);
1915 #else
1916   char *scmd, *rf;
1917   FILE *argfile;
1918   int i, el = search_flag ? 0 : 4;
1919
1920   scmd = (char *)malloc (strlen (program) + strlen (temp_filename) + 6 + el);
1921   rf = scmd + strlen(program) + 2 + el;
1922   sprintf (scmd, "%s%s @%s.gp", program,
1923            (search_flag ? "" : ".exe"), temp_filename);
1924   argfile = fopen (rf, "w");
1925   if (argfile == 0)
1926     pfatal_with_name (rf);
1927
1928   for (i=1; argv[i]; i++)
1929     {
1930       char *cp;
1931       for (cp = argv[i]; *cp; cp++)
1932         {
1933           if (*cp == '"' || *cp == '\'' || *cp == '\\' || isspace (*cp))
1934             fputc ('\\', argfile);
1935           fputc (*cp, argfile);
1936         }
1937       fputc ('\n', argfile);
1938     }
1939   fclose (argfile);
1940
1941   i = system (scmd);
1942
1943   remove (rf);
1944 #endif
1945   
1946   if (i == -1)
1947     {
1948       perror_exec (program);
1949       return MIN_FATAL_STATUS << 8;
1950     }
1951   return i << 8;
1952 }
1953
1954 #else /* not __MSDOS__ */
1955
1956 static int
1957 pexecute (search_flag, program, argv, not_last)
1958      int search_flag;
1959      char *program;
1960      char *argv[];
1961      int not_last;
1962 {
1963   int (*func)() = (search_flag ? execv : execvp);
1964   int pid;
1965   int pdes[2];
1966   int input_desc = last_pipe_input;
1967   int output_desc = STDOUT_FILE_NO;
1968   int retries, sleep_interval;
1969
1970   /* If this isn't the last process, make a pipe for its output,
1971      and record it as waiting to be the input to the next process.  */
1972
1973   if (not_last)
1974     {
1975       if (pipe (pdes) < 0)
1976         pfatal_with_name ("pipe");
1977       output_desc = pdes[WRITE_PORT];
1978       last_pipe_input = pdes[READ_PORT];
1979     }
1980   else
1981     last_pipe_input = STDIN_FILE_NO;
1982
1983   /* Fork a subprocess; wait and retry if it fails.  */
1984   sleep_interval = 1;
1985   for (retries = 0; retries < 4; retries++)
1986     {
1987       pid = vfork ();
1988       if (pid >= 0)
1989         break;
1990       sleep (sleep_interval);
1991       sleep_interval *= 2;
1992     }
1993
1994   switch (pid)
1995     {
1996     case -1:
1997 #ifdef vfork
1998       pfatal_with_name ("fork");
1999 #else
2000       pfatal_with_name ("vfork");
2001 #endif
2002       /* NOTREACHED */
2003       return 0;
2004
2005     case 0: /* child */
2006       /* Move the input and output pipes into place, if nec.  */
2007       if (input_desc != STDIN_FILE_NO)
2008         {
2009           close (STDIN_FILE_NO);
2010           dup (input_desc);
2011           close (input_desc);
2012         }
2013       if (output_desc != STDOUT_FILE_NO)
2014         {
2015           close (STDOUT_FILE_NO);
2016           dup (output_desc);
2017           close (output_desc);
2018         }
2019
2020       /* Close the parent's descs that aren't wanted here.  */
2021       if (last_pipe_input != STDIN_FILE_NO)
2022         close (last_pipe_input);
2023
2024       /* Exec the program.  */
2025       (*func) (program, argv);
2026       perror_exec (program);
2027       exit (-1);
2028       /* NOTREACHED */
2029       return 0;
2030
2031     default:
2032       /* In the parent, after forking.
2033          Close the descriptors that we made for this child.  */
2034       if (input_desc != STDIN_FILE_NO)
2035         close (input_desc);
2036       if (output_desc != STDOUT_FILE_NO)
2037         close (output_desc);
2038
2039       /* Return child's process number.  */
2040       return pid;
2041     }
2042 }
2043
2044 #endif /* not __MSDOS__ */
2045 #else /* not OS2 */
2046
2047 static int
2048 pexecute (search_flag, program, argv, not_last)
2049      int search_flag;
2050      char *program;
2051      char *argv[];
2052      int not_last;
2053 {
2054   return (search_flag ? spawnv : spawnvp) (1, program, argv);
2055 }
2056 #endif /* not OS2 */
2057 \f
2058 /* Execute the command specified by the arguments on the current line of spec.
2059    When using pipes, this includes several piped-together commands
2060    with `|' between them.
2061
2062    Return 0 if successful, -1 if failed.  */
2063
2064 static int
2065 execute ()
2066 {
2067   int i;
2068   int n_commands;               /* # of command.  */
2069   char *string;
2070   struct command
2071     {
2072       char *prog;               /* program name.  */
2073       char **argv;              /* vector of args.  */
2074       int pid;                  /* pid of process for this command.  */
2075     };
2076
2077   struct command *commands;     /* each command buffer with above info.  */
2078
2079   /* Count # of piped commands.  */
2080   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2081     if (strcmp (argbuf[i], "|") == 0)
2082       n_commands++;
2083
2084   /* Get storage for each command.  */
2085   commands
2086     = (struct command *) alloca (n_commands * sizeof (struct command));
2087
2088   /* Split argbuf into its separate piped processes,
2089      and record info about each one.
2090      Also search for the programs that are to be run.  */
2091
2092   commands[0].prog = argbuf[0]; /* first command.  */
2093   commands[0].argv = &argbuf[0];
2094   string = find_a_file (&exec_prefix, commands[0].prog, X_OK);
2095   if (string)
2096     commands[0].argv[0] = string;
2097
2098   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2099     if (strcmp (argbuf[i], "|") == 0)
2100       {                         /* each command.  */
2101 #ifdef __MSDOS__
2102         fatal ("-pipe not supported under MS-DOS");
2103 #endif
2104         argbuf[i] = 0;  /* termination of command args.  */
2105         commands[n_commands].prog = argbuf[i + 1];
2106         commands[n_commands].argv = &argbuf[i + 1];
2107         string = find_a_file (&exec_prefix, commands[n_commands].prog, X_OK);
2108         if (string)
2109           commands[n_commands].argv[0] = string;
2110         n_commands++;
2111       }
2112
2113   argbuf[argbuf_index] = 0;
2114
2115   /* If -v, print what we are about to do, and maybe query.  */
2116
2117   if (verbose_flag)
2118     {
2119       /* Print each piped command as a separate line.  */
2120       for (i = 0; i < n_commands ; i++)
2121         {
2122           char **j;
2123
2124           for (j = commands[i].argv; *j; j++)
2125             fprintf (stderr, " %s", *j);
2126
2127           /* Print a pipe symbol after all but the last command.  */
2128           if (i + 1 != n_commands)
2129             fprintf (stderr, " |");
2130           fprintf (stderr, "\n");
2131         }
2132       fflush (stderr);
2133 #ifdef DEBUG
2134       fprintf (stderr, "\nGo ahead? (y or n) ");
2135       fflush (stderr);
2136       i = getchar ();
2137       if (i != '\n')
2138         while (getchar () != '\n') ;
2139       if (i != 'y' && i != 'Y')
2140         return 0;
2141 #endif /* DEBUG */
2142     }
2143
2144   /* Run each piped subprocess.  */
2145
2146   last_pipe_input = STDIN_FILE_NO;
2147   for (i = 0; i < n_commands; i++)
2148     {
2149       char *string = commands[i].argv[0];
2150
2151       commands[i].pid = pexecute (string != commands[i].prog,
2152                                   string, commands[i].argv,
2153                                   i + 1 < n_commands);
2154
2155       if (string != commands[i].prog)
2156         free (string);
2157     }
2158
2159   execution_count++;
2160
2161   /* Wait for all the subprocesses to finish.
2162      We don't care what order they finish in;
2163      we know that N_COMMANDS waits will get them all.  */
2164
2165   {
2166     int ret_code = 0;
2167
2168     for (i = 0; i < n_commands; i++)
2169       {
2170         int status;
2171         int pid;
2172         char *prog = "unknown";
2173
2174 #ifdef __MSDOS__
2175         status = pid = commands[i].pid;
2176 #else
2177         pid = wait (&status);
2178 #endif
2179         if (pid < 0)
2180           abort ();
2181
2182         if (status != 0)
2183           {
2184             int j;
2185             for (j = 0; j < n_commands; j++)
2186               if (commands[j].pid == pid)
2187                 prog = commands[j].prog;
2188
2189             if ((status & 0x7F) != 0)
2190               {
2191                 fatal ("Internal compiler error: program %s got fatal signal %d",
2192                        prog, (status & 0x7F));
2193                 signal_count++;
2194               }
2195             if (((status & 0xFF00) >> 8) >= MIN_FATAL_STATUS)
2196               ret_code = -1;
2197           }
2198       }
2199     return ret_code;
2200   }
2201 }
2202 \f
2203 /* Find all the switches given to us
2204    and make a vector describing them.
2205    The elements of the vector are strings, one per switch given.
2206    If a switch uses following arguments, then the `part1' field
2207    is the switch itself and the `args' field
2208    is a null-terminated vector containing the following arguments.
2209    The `live_cond' field is 1 if the switch is true in a conditional spec,
2210    -1 if false (overridden by a later switch), and is initialized to zero.
2211    The `valid' field is nonzero if any spec has looked at this switch;
2212    if it remains zero at the end of the run, it must be meaningless.  */
2213
2214 struct switchstr
2215 {
2216   char *part1;
2217   char **args;
2218   int live_cond;
2219   int valid;
2220 };
2221
2222 static struct switchstr *switches;
2223
2224 static int n_switches;
2225
2226 struct infile
2227 {
2228   char *name;
2229   char *language;
2230 };
2231
2232 /* Also a vector of input files specified.  */
2233
2234 static struct infile *infiles;
2235
2236 static int n_infiles;
2237
2238 /* And a vector of corresponding output files is made up later.  */
2239
2240 static char **outfiles;
2241
2242 /* Create the vector `switches' and its contents.
2243    Store its length in `n_switches'.  */
2244
2245 static void
2246 process_command (argc, argv)
2247      int argc;
2248      char **argv;
2249 {
2250   register int i;
2251   char *temp;
2252   char *spec_lang = 0;
2253   int last_language_n_infiles;
2254
2255   gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
2256
2257   n_switches = 0;
2258   n_infiles = 0;
2259
2260   /* Figure compiler version from version string.  */
2261
2262   compiler_version = save_string (version_string, strlen (version_string));
2263   for (temp = compiler_version; *temp; ++temp)
2264     {
2265       if (*temp == ' ')
2266         {
2267           *temp = '\0';
2268           break;
2269         }
2270     }
2271
2272   /* Set up the default search paths.  */
2273
2274   if (gcc_exec_prefix)
2275     {
2276       add_prefix (&exec_prefix, gcc_exec_prefix, 0, 0, NULL_PTR);
2277       add_prefix (&startfile_prefix, gcc_exec_prefix, 0, 0, NULL_PTR);
2278     }
2279
2280   /* COMPILER_PATH and LIBRARY_PATH have values
2281      that are lists of directory names with colons.  */
2282
2283   temp = getenv ("COMPILER_PATH");
2284   if (temp)
2285     {
2286       char *startp, *endp;
2287       char *nstore = (char *) alloca (strlen (temp) + 3);
2288
2289       startp = endp = temp;
2290       while (1)
2291         {
2292           if (*endp == PATH_SEPARATOR || *endp == 0)
2293             {
2294               strncpy (nstore, startp, endp-startp);
2295               if (endp == startp)
2296                 {
2297                   strcpy (nstore, "./");
2298                 }
2299               else if (endp[-1] != '/')
2300                 {
2301                   nstore[endp-startp] = '/';
2302                   nstore[endp-startp+1] = 0;
2303                 }
2304               else
2305                 nstore[endp-startp] = 0;
2306               add_prefix (&exec_prefix, nstore, 0, 0, NULL_PTR);
2307               if (*endp == 0)
2308                 break;
2309               endp = startp = endp + 1;
2310             }
2311           else
2312             endp++;
2313         }
2314     }
2315
2316   temp = getenv ("LIBRARY_PATH");
2317   if (temp)
2318     {
2319       char *startp, *endp;
2320       char *nstore = (char *) alloca (strlen (temp) + 3);
2321
2322       startp = endp = temp;
2323       while (1)
2324         {
2325           if (*endp == PATH_SEPARATOR || *endp == 0)
2326             {
2327               strncpy (nstore, startp, endp-startp);
2328               if (endp == startp)
2329                 {
2330                   strcpy (nstore, "./");
2331                 }
2332               else if (endp[-1] != '/')
2333                 {
2334                   nstore[endp-startp] = '/';
2335                   nstore[endp-startp+1] = 0;
2336                 }
2337               else
2338                 nstore[endp-startp] = 0;
2339               add_prefix (&startfile_prefix, nstore, 0, 0, NULL_PTR);
2340               if (*endp == 0)
2341                 break;
2342               endp = startp = endp + 1;
2343             }
2344           else
2345             endp++;
2346         }
2347     }
2348
2349   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
2350   temp = getenv ("LPATH");
2351   if (temp)
2352     {
2353       char *startp, *endp;
2354       char *nstore = (char *) alloca (strlen (temp) + 3);
2355
2356       startp = endp = temp;
2357       while (1)
2358         {
2359           if (*endp == PATH_SEPARATOR || *endp == 0)
2360             {
2361               strncpy (nstore, startp, endp-startp);
2362               if (endp == startp)
2363                 {
2364                   strcpy (nstore, "./");
2365                 }
2366               else if (endp[-1] != '/')
2367                 {
2368                   nstore[endp-startp] = '/';
2369                   nstore[endp-startp+1] = 0;
2370                 }
2371               else
2372                 nstore[endp-startp] = 0;
2373               add_prefix (&startfile_prefix, nstore, 0, 0, NULL_PTR);
2374               if (*endp == 0)
2375                 break;
2376               endp = startp = endp + 1;
2377             }
2378           else
2379             endp++;
2380         }
2381     }
2382
2383   /* Convert new-style -- options to old-style.  */
2384   translate_options (&argc, &argv);
2385
2386   /* Scan argv twice.  Here, the first time, just count how many switches
2387      there will be in their vector, and how many input files in theirs.
2388      Here we also parse the switches that cc itself uses (e.g. -v).  */
2389
2390   for (i = 1; i < argc; i++)
2391     {
2392       if (! strcmp (argv[i], "-dumpspecs"))
2393         {
2394           printf ("*asm:\n%s\n\n", asm_spec);
2395           printf ("*asm_final:\n%s\n\n", asm_final_spec);
2396           printf ("*cpp:\n%s\n\n", cpp_spec);
2397           printf ("*cc1:\n%s\n\n", cc1_spec);
2398           printf ("*cc1plus:\n%s\n\n", cc1plus_spec);
2399           printf ("*endfile:\n%s\n\n", endfile_spec);
2400           printf ("*link:\n%s\n\n", link_spec);
2401           printf ("*lib:\n%s\n\n", lib_spec);
2402           printf ("*startfile:\n%s\n\n", startfile_spec);
2403           printf ("*switches_need_spaces:\n%s\n\n", switches_need_spaces);
2404           printf ("*signed_char:\n%s\n\n", signed_char_spec);
2405           printf ("*predefines:\n%s\n\n", cpp_predefines);
2406           printf ("*cross_compile:\n%d\n\n", cross_compile);
2407           printf ("*multilib:\n%s\n\n", multilib_select);
2408
2409           exit (0);
2410         }
2411       else if (! strcmp (argv[i], "-dumpversion"))
2412         {
2413           printf ("%s\n", version_string);
2414           exit (0);
2415         }
2416       else if (! strcmp (argv[i], "-dumpmachine"))
2417         {
2418           printf ("%s\n", spec_machine);
2419           exit  (0);
2420         }
2421       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2422           print_file_name = "libgcc.a";
2423       else if (! strncmp (argv[i], "-print-file-name=", 17))
2424           print_file_name = argv[i] + 17;
2425       else if (! strncmp (argv[i], "-print-prog-name=", 17))
2426           print_prog_name = argv[i] + 17;
2427       else if (! strcmp (argv[i], "-print-multi-lib"))
2428         print_multi_lib = 1;
2429       else if (! strcmp (argv[i], "-print-multi-directory"))
2430         print_multi_directory = 1;
2431       else if (! strcmp (argv[i], "-Xlinker"))
2432         {
2433           /* Pass the argument of this option to the linker when we link.  */
2434
2435           if (i + 1 == argc)
2436             fatal ("argument to `-Xlinker' is missing");
2437
2438           n_linker_options++;
2439           if (!linker_options)
2440             linker_options
2441               = (char **) xmalloc (n_linker_options * sizeof (char **));
2442           else
2443             linker_options
2444               = (char **) xrealloc (linker_options,
2445                                     n_linker_options * sizeof (char **));
2446
2447           linker_options[n_linker_options - 1] = argv[++i];
2448         }
2449       else if (! strncmp (argv[i], "-Wl,", 4))
2450         {
2451           int prev, j;
2452           /* Pass the rest of this option to the linker when we link.  */
2453
2454           n_linker_options++;
2455           if (!linker_options)
2456             linker_options
2457               = (char **) xmalloc (n_linker_options * sizeof (char **));
2458           else
2459             linker_options
2460               = (char **) xrealloc (linker_options,
2461                                     n_linker_options * sizeof (char **));
2462
2463           /* Split the argument at commas.  */
2464           prev = 4;
2465           for (j = 4; argv[i][j]; j++)
2466             if (argv[i][j] == ',')
2467               {
2468                 linker_options[n_linker_options - 1]
2469                   = save_string (argv[i] + prev, j - prev);
2470                 n_linker_options++;
2471                 linker_options
2472                   = (char **) xrealloc (linker_options,
2473                                         n_linker_options * sizeof (char **));
2474                 prev = j + 1;
2475               }
2476           /* Record the part after the last comma.  */
2477           linker_options[n_linker_options - 1] = argv[i] + prev;
2478         }
2479       else if (! strncmp (argv[i], "-Wa,", 4))
2480         {
2481           int prev, j;
2482           /* Pass the rest of this option to the assembler.  */
2483
2484           n_assembler_options++;
2485           if (!assembler_options)
2486             assembler_options
2487               = (char **) xmalloc (n_assembler_options * sizeof (char **));
2488           else
2489             assembler_options
2490               = (char **) xrealloc (assembler_options,
2491                                     n_assembler_options * sizeof (char **));
2492
2493           /* Split the argument at commas.  */
2494           prev = 4;
2495           for (j = 4; argv[i][j]; j++)
2496             if (argv[i][j] == ',')
2497               {
2498                 assembler_options[n_assembler_options - 1]
2499                   = save_string (argv[i] + prev, j - prev);
2500                 n_assembler_options++;
2501                 assembler_options
2502                   = (char **) xrealloc (assembler_options,
2503                                         n_assembler_options * sizeof (char **));
2504                 prev = j + 1;
2505               }
2506           /* Record the part after the last comma.  */
2507           assembler_options[n_assembler_options - 1] = argv[i] + prev;
2508         }
2509       else if (argv[i][0] == '+' && argv[i][1] == 'e')
2510         /* The +e options to the C++ front-end.  */
2511         n_switches++;
2512       else if (argv[i][0] == '-' && argv[i][1] != 0 && argv[i][1] != 'l')
2513         {
2514           register char *p = &argv[i][1];
2515           register int c = *p;
2516
2517           switch (c)
2518             {
2519             case 'b':
2520               if (p[1] == 0 && i + 1 == argc)
2521                 fatal ("argument to `-b' is missing");
2522               if (p[1] == 0)
2523                 spec_machine = argv[++i];
2524               else
2525                 spec_machine = p + 1;
2526               break;
2527
2528             case 'B':
2529               {
2530                 int *temp = (int *) xmalloc (sizeof (int));
2531                 char *value;
2532                 if (p[1] == 0 && i + 1 == argc)
2533                   fatal ("argument to `-B' is missing");
2534                 if (p[1] == 0)
2535                   value = argv[++i];
2536                 else
2537                   value = p + 1;
2538                 add_prefix (&exec_prefix, value, 1, 0, temp);
2539                 add_prefix (&startfile_prefix, value, 1, 0, temp);
2540                 add_prefix (&include_prefix, concat (value, "include", ""),
2541                             1, 0, 0);
2542
2543                 /* As a kludge, if the arg is "[foo/]stageN/", just add
2544                    "[foo/]include" to the include prefix.  */
2545                 {
2546                   int len = strlen (value);
2547                   if ((len == 7 || (len > 7 && value[len - 8] == '/'))
2548                       && strncmp (value + len - 7, "stage", 5) == 0
2549                       && isdigit (value[len - 2])
2550                       && value[len - 1] == '/')
2551                     {
2552                       if (len == 7)
2553                         add_prefix (&include_prefix, "include", 1, 0, 0);
2554                       else
2555                         {
2556                           char *string = xmalloc (len + 1);
2557                           strncpy (string, value, len-7);
2558                           strcat (string, "include");
2559                           add_prefix (&include_prefix, string, 1, 0, 0);
2560                         }
2561                     }
2562                 }
2563               }
2564               break;
2565
2566             case 'v':   /* Print our subcommands and print versions.  */
2567               n_switches++;
2568               /* If they do anything other than exactly `-v', don't set
2569                  verbose_flag; rather, continue on to give the error.  */
2570               if (p[1] != 0)
2571                 break;
2572               verbose_flag++;
2573               break;
2574
2575             case 'V':
2576               if (p[1] == 0 && i + 1 == argc)
2577                 fatal ("argument to `-V' is missing");
2578               if (p[1] == 0)
2579                 spec_version = argv[++i];
2580               else
2581                 spec_version = p + 1;
2582               compiler_version = spec_version;
2583               break;
2584
2585             case 's':
2586               if (!strcmp (p, "save-temps"))
2587                 {
2588                   save_temps_flag = 1;
2589                   n_switches++;
2590                   break;
2591                 }
2592             default:
2593               n_switches++;
2594
2595               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
2596                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
2597               else if (WORD_SWITCH_TAKES_ARG (p))
2598                 i += WORD_SWITCH_TAKES_ARG (p);
2599             }
2600         }
2601       else
2602         n_infiles++;
2603     }
2604
2605   /* Set up the search paths before we go looking for config files.  */
2606
2607   /* These come before the md prefixes so that we will find gcc's subcommands
2608      (such as cpp) rather than those of the host system.  */
2609   /* Use 2 as fourth arg meaning try just the machine as a suffix,
2610      as well as trying the machine and the version.  */
2611   add_prefix (&exec_prefix, standard_exec_prefix, 0, 2, NULL_PTR);
2612   add_prefix (&exec_prefix, standard_exec_prefix_1, 0, 2, NULL_PTR);
2613
2614   add_prefix (&startfile_prefix, standard_exec_prefix, 0, 1, NULL_PTR);
2615   add_prefix (&startfile_prefix, standard_exec_prefix_1, 0, 1, NULL_PTR);
2616
2617   tooldir_prefix = concat (tooldir_base_prefix, spec_machine, "/");
2618
2619   /* If tooldir is relative, base it on exec_prefix.  A relative
2620      tooldir lets us move the installed tree as a unit.
2621
2622      If GCC_EXEC_PREFIX is defined, then we want to add two relative
2623      directories, so that we can search both the user specified directory
2624      and the standard place.  */
2625
2626   if (*tooldir_prefix != '/')
2627     {
2628       if (gcc_exec_prefix)
2629         {
2630           char *gcc_exec_tooldir_prefix
2631             = concat (concat (gcc_exec_prefix, spec_machine, "/"),
2632                       concat (spec_version, "/", tooldir_prefix),
2633                       "");
2634
2635           add_prefix (&exec_prefix, concat (gcc_exec_tooldir_prefix, "bin", "/"),
2636                       0, 0, NULL_PTR);
2637           add_prefix (&startfile_prefix, concat (gcc_exec_tooldir_prefix, "lib", "/"),
2638                       0, 0, NULL_PTR);
2639         }
2640
2641       tooldir_prefix = concat (concat (standard_exec_prefix, spec_machine, "/"),
2642                                concat (spec_version, "/", tooldir_prefix),
2643                                "");
2644     }
2645
2646   add_prefix (&exec_prefix, concat (tooldir_prefix, "bin", "/"),
2647               0, 0, NULL_PTR);
2648   add_prefix (&startfile_prefix, concat (tooldir_prefix, "lib", "/"),
2649               0, 0, NULL_PTR);
2650
2651   /* More prefixes are enabled in main, after we read the specs file
2652      and determine whether this is cross-compilation or not.  */
2653
2654
2655   /* Then create the space for the vectors and scan again.  */
2656
2657   switches = ((struct switchstr *)
2658               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
2659   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
2660   n_switches = 0;
2661   n_infiles = 0;
2662   last_language_n_infiles = -1;
2663
2664   /* This, time, copy the text of each switch and store a pointer
2665      to the copy in the vector of switches.
2666      Store all the infiles in their vector.  */
2667
2668   for (i = 1; i < argc; i++)
2669     {
2670       /* Just skip the switches that were handled by the preceding loop.  */
2671       if (!strcmp (argv[i], "-Xlinker"))
2672         i++;
2673       else if (! strncmp (argv[i], "-Wl,", 4))
2674         ;
2675       else if (! strncmp (argv[i], "-Wa,", 4))
2676         ;
2677       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2678         ;
2679       else if (! strncmp (argv[i], "-print-file-name=", 17))
2680         ;
2681       else if (! strncmp (argv[i], "-print-prog-name=", 17))
2682         ;
2683       else if (! strcmp (argv[i], "-print-multi-lib"))
2684         ;
2685       else if (! strcmp (argv[i], "-print-multi-directory"))
2686         ;
2687       else if (argv[i][0] == '+' && argv[i][1] == 'e')
2688         {
2689           /* Compensate for the +e options to the C++ front-end;
2690              they're there simply for cfront call-compatibility.  We do
2691              some magic in default_compilers to pass them down properly.
2692              Note we deliberately start at the `+' here, to avoid passing
2693              -e0 or -e1 down into the linker.  */
2694           switches[n_switches].part1 = &argv[i][0];
2695           switches[n_switches].args = 0;
2696           switches[n_switches].live_cond = 0;
2697           switches[n_switches].valid = 0;
2698           n_switches++;
2699         }
2700       else if (argv[i][0] == '-' && argv[i][1] != 0 && argv[i][1] != 'l')
2701         {
2702           register char *p = &argv[i][1];
2703           register int c = *p;
2704
2705           if (c == 'B' || c == 'b' || c == 'V')
2706             {
2707               /* Skip a separate arg, if any.  */
2708               if (p[1] == 0)
2709                 i++;
2710               continue;
2711             }
2712           if (c == 'x')
2713             {
2714               if (p[1] == 0 && i + 1 == argc)
2715                 fatal ("argument to `-x' is missing");
2716               if (p[1] == 0)
2717                 spec_lang = argv[++i];
2718               else
2719                 spec_lang = p + 1;
2720               if (! strcmp (spec_lang, "none"))
2721                 /* Suppress the warning if -xnone comes after the last input file,
2722                    because alternate command interfaces like g++ might find it
2723                    useful to place -xnone after each input file.  */
2724                 spec_lang = 0;
2725               else
2726                 last_language_n_infiles = n_infiles;
2727               continue;
2728             }
2729           switches[n_switches].part1 = p;
2730           /* Deal with option arguments in separate argv elements.  */
2731           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
2732               || WORD_SWITCH_TAKES_ARG (p))
2733             {
2734               int j = 0;
2735               int n_args = WORD_SWITCH_TAKES_ARG (p);
2736
2737               if (n_args == 0)
2738                 {
2739                   /* Count only the option arguments in separate argv elements.  */
2740                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
2741                 }
2742               if (i + n_args >= argc)
2743                 fatal ("argument to `-%s' is missing", p);
2744               switches[n_switches].args
2745                 = (char **) xmalloc ((n_args + 1) * sizeof (char *));
2746               while (j < n_args)
2747                 switches[n_switches].args[j++] = argv[++i];
2748               /* Null-terminate the vector.  */
2749               switches[n_switches].args[j] = 0;
2750             }
2751           else if (*switches_need_spaces != 0 && (c == 'o' || c == 'L'))
2752             {
2753               /* On some systems, ld cannot handle -o or -L without space.
2754                  So split the -o or -L from its argument.  */
2755               switches[n_switches].part1 = (c == 'o' ? "o" : "L");
2756               switches[n_switches].args = (char **) xmalloc (2 * sizeof (char *));
2757               switches[n_switches].args[0] = xmalloc (strlen (p));
2758               strcpy (switches[n_switches].args[0], &p[1]);
2759               switches[n_switches].args[1] = 0;
2760             }
2761           else
2762             switches[n_switches].args = 0;
2763
2764           switches[n_switches].live_cond = 0;
2765           switches[n_switches].valid = 0;
2766           /* This is always valid, since gcc.c itself understands it.  */
2767           if (!strcmp (p, "save-temps"))
2768             switches[n_switches].valid = 1;
2769           n_switches++;
2770         }
2771       else
2772         {
2773           if ((argv[i][0] != '-' || argv[i][1] != 'l')
2774               && strcmp (argv[i], "-")
2775               && access (argv[i], R_OK) < 0)
2776             {
2777               perror_with_name (argv[i]);
2778               error_count++;
2779             }
2780           else
2781             {
2782               infiles[n_infiles].language = spec_lang;
2783               infiles[n_infiles++].name = argv[i];
2784             }
2785         }
2786     }
2787
2788   if (n_infiles == last_language_n_infiles && spec_lang != 0)
2789     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
2790
2791   switches[n_switches].part1 = 0;
2792   infiles[n_infiles].name = 0;
2793
2794   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
2795   if (gcc_exec_prefix)
2796     {
2797       temp = (char *) xmalloc (strlen (gcc_exec_prefix) + strlen (spec_version)
2798                                + strlen (spec_machine) + 3);
2799       strcpy (temp, gcc_exec_prefix);
2800       strcat (temp, spec_machine);
2801       strcat (temp, "/");
2802       strcat (temp, spec_version);
2803       strcat (temp, "/");
2804       gcc_exec_prefix = temp;
2805     }
2806 }
2807 \f
2808 /* Process a spec string, accumulating and running commands.  */
2809
2810 /* These variables describe the input file name.
2811    input_file_number is the index on outfiles of this file,
2812    so that the output file name can be stored for later use by %o.
2813    input_basename is the start of the part of the input file
2814    sans all directory names, and basename_length is the number
2815    of characters starting there excluding the suffix .c or whatever.  */
2816
2817 static char *input_filename;
2818 static int input_file_number;
2819 static int input_filename_length;
2820 static int basename_length;
2821 static char *input_basename;
2822 static char *input_suffix;
2823
2824 /* These are variables used within do_spec and do_spec_1.  */
2825
2826 /* Nonzero if an arg has been started and not yet terminated
2827    (with space, tab or newline).  */
2828 static int arg_going;
2829
2830 /* Nonzero means %d or %g has been seen; the next arg to be terminated
2831    is a temporary file name.  */
2832 static int delete_this_arg;
2833
2834 /* Nonzero means %w has been seen; the next arg to be terminated
2835    is the output file name of this compilation.  */
2836 static int this_is_output_file;
2837
2838 /* Nonzero means %s has been seen; the next arg to be terminated
2839    is the name of a library file and we should try the standard
2840    search dirs for it.  */
2841 static int this_is_library_file;
2842
2843 /* Nonzero means that the input of this command is coming from a pipe.  */
2844 static int input_from_pipe;
2845
2846 /* Process the spec SPEC and run the commands specified therein.
2847    Returns 0 if the spec is successfully processed; -1 if failed.  */
2848
2849 static int
2850 do_spec (spec)
2851      char *spec;
2852 {
2853   int value;
2854
2855   clear_args ();
2856   arg_going = 0;
2857   delete_this_arg = 0;
2858   this_is_output_file = 0;
2859   this_is_library_file = 0;
2860   input_from_pipe = 0;
2861
2862   value = do_spec_1 (spec, 0, NULL_PTR);
2863
2864   /* Force out any unfinished command.
2865      If -pipe, this forces out the last command if it ended in `|'.  */
2866   if (value == 0)
2867     {
2868       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
2869         argbuf_index--;
2870
2871       if (argbuf_index > 0)
2872         value = execute ();
2873     }
2874
2875   return value;
2876 }
2877
2878 /* Process the sub-spec SPEC as a portion of a larger spec.
2879    This is like processing a whole spec except that we do
2880    not initialize at the beginning and we do not supply a
2881    newline by default at the end.
2882    INSWITCH nonzero means don't process %-sequences in SPEC;
2883    in this case, % is treated as an ordinary character.
2884    This is used while substituting switches.
2885    INSWITCH nonzero also causes SPC not to terminate an argument.
2886
2887    Value is zero unless a line was finished
2888    and the command on that line reported an error.  */
2889
2890 static int
2891 do_spec_1 (spec, inswitch, soft_matched_part)
2892      char *spec;
2893      int inswitch;
2894      char *soft_matched_part;
2895 {
2896   register char *p = spec;
2897   register int c;
2898   int i;
2899   char *string;
2900   int value;
2901
2902   while (c = *p++)
2903     /* If substituting a switch, treat all chars like letters.
2904        Otherwise, NL, SPC, TAB and % are special.  */
2905     switch (inswitch ? 'a' : c)
2906       {
2907       case '\n':
2908         /* End of line: finish any pending argument,
2909            then run the pending command if one has been started.  */
2910         if (arg_going)
2911           {
2912             obstack_1grow (&obstack, 0);
2913             string = obstack_finish (&obstack);
2914             if (this_is_library_file)
2915               string = find_file (string);
2916             store_arg (string, delete_this_arg, this_is_output_file);
2917             if (this_is_output_file)
2918               outfiles[input_file_number] = string;
2919           }
2920         arg_going = 0;
2921
2922         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
2923           {
2924             int i;
2925             for (i = 0; i < n_switches; i++)
2926               if (!strcmp (switches[i].part1, "pipe"))
2927                 break;
2928
2929             /* A `|' before the newline means use a pipe here,
2930                but only if -pipe was specified.
2931                Otherwise, execute now and don't pass the `|' as an arg.  */
2932             if (i < n_switches)
2933               {
2934                 input_from_pipe = 1;
2935                 switches[i].valid = 1;
2936                 break;
2937               }
2938             else
2939               argbuf_index--;
2940           }
2941
2942         if (argbuf_index > 0)
2943           {
2944             value = execute ();
2945             if (value)
2946               return value;
2947           }
2948         /* Reinitialize for a new command, and for a new argument.  */
2949         clear_args ();
2950         arg_going = 0;
2951         delete_this_arg = 0;
2952         this_is_output_file = 0;
2953         this_is_library_file = 0;
2954         input_from_pipe = 0;
2955         break;
2956
2957       case '|':
2958         /* End any pending argument.  */
2959         if (arg_going)
2960           {
2961             obstack_1grow (&obstack, 0);
2962             string = obstack_finish (&obstack);
2963             if (this_is_library_file)
2964               string = find_file (string);
2965             store_arg (string, delete_this_arg, this_is_output_file);
2966             if (this_is_output_file)
2967               outfiles[input_file_number] = string;
2968           }
2969
2970         /* Use pipe */
2971         obstack_1grow (&obstack, c);
2972         arg_going = 1;
2973         break;
2974
2975       case '\t':
2976       case ' ':
2977         /* Space or tab ends an argument if one is pending.  */
2978         if (arg_going)
2979           {
2980             obstack_1grow (&obstack, 0);
2981             string = obstack_finish (&obstack);
2982             if (this_is_library_file)
2983               string = find_file (string);
2984             store_arg (string, delete_this_arg, this_is_output_file);
2985             if (this_is_output_file)
2986               outfiles[input_file_number] = string;
2987           }
2988         /* Reinitialize for a new argument.  */
2989         arg_going = 0;
2990         delete_this_arg = 0;
2991         this_is_output_file = 0;
2992         this_is_library_file = 0;
2993         break;
2994
2995       case '%':
2996         switch (c = *p++)
2997           {
2998           case 0:
2999             fatal ("Invalid specification!  Bug in cc.");
3000
3001           case 'b':
3002             obstack_grow (&obstack, input_basename, basename_length);
3003             arg_going = 1;
3004             break;
3005
3006           case 'd':
3007             delete_this_arg = 2;
3008             break;
3009
3010           /* Dump out the directories specified with LIBRARY_PATH,
3011              followed by the absolute directories
3012              that we search for startfiles.  */
3013           case 'D':
3014             {
3015               struct prefix_list *pl = startfile_prefix.plist;
3016               int bufsize = 100;
3017               char *buffer = (char *) xmalloc (bufsize);
3018               int idx;
3019
3020               for (; pl; pl = pl->next)
3021                 {
3022 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
3023                   /* Used on systems which record the specified -L dirs
3024                      and use them to search for dynamic linking.  */
3025                   /* Relative directories always come from -B,
3026                      and it is better not to use them for searching
3027                      at run time.  In particular, stage1 loses  */
3028                   if (pl->prefix[0] != '/')
3029                     continue;
3030 #endif
3031                   /* Try subdirectory if there is one.  */
3032                   if (multilib_dir != NULL)
3033                     {
3034                       if (machine_suffix)
3035                         {
3036                           if (strlen (pl->prefix) + strlen (machine_suffix)
3037                               >= bufsize)
3038                             bufsize = (strlen (pl->prefix)
3039                                        + strlen (machine_suffix)) * 2 + 1;
3040                           buffer = (char *) xrealloc (buffer, bufsize);
3041                           strcpy (buffer, pl->prefix);
3042                           strcat (buffer, machine_suffix);
3043                           if (is_directory (buffer, multilib_dir, 1))
3044                             {
3045                               do_spec_1 ("-L", 0, NULL_PTR);
3046 #ifdef SPACE_AFTER_L_OPTION
3047                               do_spec_1 (" ", 0, NULL_PTR);
3048 #endif
3049                               do_spec_1 (buffer, 1, NULL_PTR);
3050                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3051                               /* Make this a separate argument.  */
3052                               do_spec_1 (" ", 0, NULL_PTR);
3053                             }
3054                         }
3055                       if (!pl->require_machine_suffix)
3056                         {
3057                           if (is_directory (pl->prefix, multilib_dir, 1))
3058                             {
3059                               do_spec_1 ("-L", 0, NULL_PTR);
3060 #ifdef SPACE_AFTER_L_OPTION
3061                               do_spec_1 (" ", 0, NULL_PTR);
3062 #endif
3063                               do_spec_1 (pl->prefix, 1, NULL_PTR);
3064                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3065                               /* Make this a separate argument.  */
3066                               do_spec_1 (" ", 0, NULL_PTR);
3067                             }
3068                         }
3069                     }
3070                   if (machine_suffix)
3071                     {
3072                       if (is_directory (pl->prefix, machine_suffix, 1))
3073                         {
3074                           do_spec_1 ("-L", 0, NULL_PTR);
3075 #ifdef SPACE_AFTER_L_OPTION
3076                           do_spec_1 (" ", 0, NULL_PTR);
3077 #endif
3078                           do_spec_1 (pl->prefix, 1, NULL_PTR);
3079                           /* Remove slash from machine_suffix.  */
3080                           if (strlen (machine_suffix) >= bufsize)
3081                             bufsize = strlen (machine_suffix) * 2 + 1;
3082                           buffer = (char *) xrealloc (buffer, bufsize);
3083                           strcpy (buffer, machine_suffix);
3084                           idx = strlen (buffer);
3085                           if (buffer[idx - 1] == '/')
3086                             buffer[idx - 1] = 0;
3087                           do_spec_1 (buffer, 1, NULL_PTR);
3088                           /* Make this a separate argument.  */
3089                           do_spec_1 (" ", 0, NULL_PTR);
3090                         }
3091                     }
3092                   if (!pl->require_machine_suffix)
3093                     {
3094                       if (is_directory (pl->prefix, "", 1))
3095                         {
3096                           do_spec_1 ("-L", 0, NULL_PTR);
3097 #ifdef SPACE_AFTER_L_OPTION
3098                           do_spec_1 (" ", 0, NULL_PTR);
3099 #endif
3100                           /* Remove slash from pl->prefix.  */
3101                           if (strlen (pl->prefix) >= bufsize)
3102                             bufsize = strlen (pl->prefix) * 2 + 1;
3103                           buffer = (char *) xrealloc (buffer, bufsize);
3104                           strcpy (buffer, pl->prefix);
3105                           idx = strlen (buffer);
3106                           if (buffer[idx - 1] == '/')
3107                             buffer[idx - 1] = 0;
3108                           do_spec_1 (buffer, 1, NULL_PTR);
3109                           /* Make this a separate argument.  */
3110                           do_spec_1 (" ", 0, NULL_PTR);
3111                         }
3112                     }
3113                 }
3114               free (buffer);
3115             }
3116             break;
3117
3118           case 'e':
3119             /* {...:%efoo} means report an error with `foo' as error message
3120                and don't execute any more commands for this file.  */
3121             {
3122               char *q = p;
3123               char *buf;
3124               while (*p != 0 && *p != '\n') p++;
3125               buf = (char *) alloca (p - q + 1);
3126               strncpy (buf, q, p - q);
3127               buf[p - q] = 0;
3128               error ("%s", buf);
3129               return -1;
3130             }
3131             break;
3132
3133           case 'g':
3134           case 'u':
3135           case 'U':
3136             if (save_temps_flag)
3137               {
3138                 obstack_grow (&obstack, input_basename, basename_length);
3139                 delete_this_arg = 0;
3140               }
3141             else
3142               {
3143 #ifdef MKTEMP_EACH_FILE
3144                 /* ??? This has a problem: the total number of
3145                    values mktemp can return is limited.
3146                    That matters for the names of object files.
3147                    In 2.4, do something about that.  */
3148                 struct temp_name *t;
3149                 char *suffix = p;
3150                 while (*p == '.' || isalpha (*p))
3151                   p++;
3152
3153                 /* See if we already have an association of %g/%u/%U and
3154                    suffix.  */
3155                 for (t = temp_names; t; t = t->next)
3156                   if (t->length == p - suffix
3157                       && strncmp (t->suffix, suffix, p - suffix) == 0
3158                       && t->unique == (c != 'g'))
3159                     break;
3160
3161                 /* Make a new association if needed.  %u requires one.  */
3162                 if (t == 0 || c == 'u')
3163                   {
3164                     if (t == 0)
3165                       {
3166                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
3167                         t->next = temp_names;
3168                         temp_names = t;
3169                       }
3170                     t->length = p - suffix;
3171                     t->suffix = save_string (suffix, p - suffix);
3172                     t->unique = (c != 'g');
3173                     choose_temp_base ();
3174                     t->filename = temp_filename;
3175                     t->filename_length = temp_filename_length;
3176                   }
3177
3178                 obstack_grow (&obstack, t->filename, t->filename_length);
3179                 delete_this_arg = 1;
3180 #else
3181                 obstack_grow (&obstack, temp_filename, temp_filename_length);
3182                 if (c == 'u' || c == 'U')
3183                   {
3184                     static int unique;
3185                     char buff[9];
3186                     if (c == 'u')
3187                       unique++;
3188                     sprintf (buff, "%d", unique);
3189                     obstack_grow (&obstack, buff, strlen (buff));
3190                   }
3191 #endif
3192                 delete_this_arg = 1;
3193               }
3194             arg_going = 1;
3195             break;
3196
3197           case 'i':
3198             obstack_grow (&obstack, input_filename, input_filename_length);
3199             arg_going = 1;
3200             break;
3201
3202           case 'I':
3203             {
3204               struct prefix_list *pl = include_prefix.plist;
3205
3206               if (gcc_exec_prefix)
3207                 {
3208                   do_spec_1 ("-iprefix", 1, NULL_PTR);
3209                   /* Make this a separate argument.  */
3210                   do_spec_1 (" ", 0, NULL_PTR);
3211                   do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
3212                   do_spec_1 (" ", 0, NULL_PTR);
3213                 }
3214
3215               for (; pl; pl = pl->next)
3216                 {
3217                   do_spec_1 ("-isystem", 1, NULL_PTR);
3218                   /* Make this a separate argument.  */
3219                   do_spec_1 (" ", 0, NULL_PTR);
3220                   do_spec_1 (pl->prefix, 1, NULL_PTR);
3221                   do_spec_1 (" ", 0, NULL_PTR);
3222                 }
3223             }
3224             break;
3225
3226           case 'o':
3227             {
3228               register int f;
3229               for (f = 0; f < n_infiles; f++)
3230                 store_arg (outfiles[f], 0, 0);
3231             }
3232             break;
3233
3234           case 's':
3235             this_is_library_file = 1;
3236             break;
3237
3238           case 'w':
3239             this_is_output_file = 1;
3240             break;
3241
3242           case 'W':
3243             {
3244               int index = argbuf_index;
3245               /* Handle the {...} following the %W.  */
3246               if (*p != '{')
3247                 abort ();
3248               p = handle_braces (p + 1);
3249               if (p == 0)
3250                 return -1;
3251               /* If any args were output, mark the last one for deletion
3252                  on failure.  */
3253               if (argbuf_index != index)
3254                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
3255               break;
3256             }
3257
3258           /* %x{OPTION} records OPTION for %X to output.  */
3259           case 'x':
3260             {
3261               char *p1 = p;
3262               char *string;
3263
3264               /* Skip past the option value and make a copy.  */
3265               if (*p != '{')
3266                 abort ();
3267               while (*p++ != '}')
3268                 ;
3269               string = save_string (p1 + 1, p - p1 - 2);
3270
3271               /* See if we already recorded this option.  */
3272               for (i = 0; i < n_linker_options; i++)
3273                 if (! strcmp (string, linker_options[i]))
3274                   {
3275                     free (string);
3276                     return 0;
3277                   }
3278
3279               /* This option is new; add it.  */
3280               n_linker_options++;
3281               if (!linker_options)
3282                 linker_options
3283                   = (char **) xmalloc (n_linker_options * sizeof (char **));
3284               else
3285                 linker_options
3286                   = (char **) xrealloc (linker_options,
3287                                         n_linker_options * sizeof (char **));
3288
3289               linker_options[n_linker_options - 1] = string;
3290             }
3291             break;
3292
3293           /* Dump out the options accumulated previously using %x,
3294              -Xlinker and -Wl,.  */
3295           case 'X':
3296             for (i = 0; i < n_linker_options; i++)
3297               {
3298                 do_spec_1 (linker_options[i], 1, NULL_PTR);
3299                 /* Make each accumulated option a separate argument.  */
3300                 do_spec_1 (" ", 0, NULL_PTR);
3301               }
3302             break;
3303
3304           /* Dump out the options accumulated previously using -Wa,.  */
3305           case 'Y':
3306             for (i = 0; i < n_assembler_options; i++)
3307               {
3308                 do_spec_1 (assembler_options[i], 1, NULL_PTR);
3309                 /* Make each accumulated option a separate argument.  */
3310                 do_spec_1 (" ", 0, NULL_PTR);
3311               }
3312             break;
3313
3314             /* Here are digits and numbers that just process
3315                a certain constant string as a spec.  */
3316
3317           case '1':
3318             value = do_spec_1 (cc1_spec, 0, NULL_PTR);
3319             if (value != 0)
3320               return value;
3321             break;
3322
3323           case '2':
3324             value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
3325             if (value != 0)
3326               return value;
3327             break;
3328
3329           case 'a':
3330             value = do_spec_1 (asm_spec, 0, NULL_PTR);
3331             if (value != 0)
3332               return value;
3333             break;
3334
3335           case 'A':
3336             value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
3337             if (value != 0)
3338               return value;
3339             break;
3340
3341           case 'c':
3342             value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
3343             if (value != 0)
3344               return value;
3345             break;
3346
3347           case 'C':
3348             value = do_spec_1 (cpp_spec, 0, NULL_PTR);
3349             if (value != 0)
3350               return value;
3351             break;
3352
3353           case 'E':
3354             value = do_spec_1 (endfile_spec, 0, NULL_PTR);
3355             if (value != 0)
3356               return value;
3357             break;
3358
3359           case 'l':
3360             value = do_spec_1 (link_spec, 0, NULL_PTR);
3361             if (value != 0)
3362               return value;
3363             break;
3364
3365           case 'L':
3366             value = do_spec_1 (lib_spec, 0, NULL_PTR);
3367             if (value != 0)
3368               return value;
3369             break;
3370
3371           case 'p':
3372             {
3373               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
3374               char *buf = x;
3375               char *y;
3376
3377               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
3378               y = cpp_predefines;
3379               while (*y != 0)
3380                 {
3381                   if (! strncmp (y, "-D", 2))
3382                     /* Copy the whole option.  */
3383                     while (*y && *y != ' ' && *y != '\t')
3384                       *x++ = *y++;
3385                   else if (*y == ' ' || *y == '\t')
3386                     /* Copy whitespace to the result.  */
3387                     *x++ = *y++;
3388                   /* Don't copy other options.  */
3389                   else
3390                     y++;
3391                 }
3392
3393               *x = 0;
3394
3395               value = do_spec_1 (buf, 0, NULL_PTR);
3396               if (value != 0)
3397                 return value;
3398             }
3399             break;
3400
3401           case 'P':
3402             {
3403               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
3404               char *buf = x;
3405               char *y;
3406
3407               /* Copy all of CPP_PREDEFINES into BUF,
3408                  but put __ after every -D and at the end of each arg.  */
3409               y = cpp_predefines;
3410               while (*y != 0)
3411                 {
3412                   if (! strncmp (y, "-D", 2))
3413                     {
3414                       int flag = 0;
3415
3416                       *x++ = *y++;
3417                       *x++ = *y++;
3418
3419                       if (*y != '_'
3420                           || (*(y+1) != '_' && ! isupper (*(y+1))))
3421                         {
3422                           /* Stick __ at front of macro name.  */
3423                           *x++ = '_';
3424                           *x++ = '_';
3425                           /* Arrange to stick __ at the end as well.  */
3426                           flag = 1;
3427                         }
3428
3429                       /* Copy the macro name.  */
3430                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
3431                         *x++ = *y++;
3432
3433                       if (flag)
3434                         {
3435                           *x++ = '_';
3436                           *x++ = '_';
3437                         }
3438
3439                       /* Copy the value given, if any.  */
3440                       while (*y && *y != ' ' && *y != '\t')
3441                         *x++ = *y++;
3442                     }
3443                   else if (*y == ' ' || *y == '\t')
3444                     /* Copy whitespace to the result.  */
3445                     *x++ = *y++;
3446                   /* Don't copy -A options  */
3447                   else
3448                     y++;
3449                 }
3450               *x++ = ' ';
3451
3452               /* Copy all of CPP_PREDEFINES into BUF,
3453                  but put __ after every -D.  */
3454               y = cpp_predefines;
3455               while (*y != 0)
3456                 {
3457                   if (! strncmp (y, "-D", 2))
3458                     {
3459                       y += 2;
3460
3461                       if (*y != '_'
3462                           || (*(y+1) != '_' && ! isupper (*(y+1))))
3463                         {
3464                           /* Stick -D__ at front of macro name.  */
3465                           *x++ = '-';
3466                           *x++ = 'D';
3467                           *x++ = '_';
3468                           *x++ = '_';
3469
3470                           /* Copy the macro name.  */
3471                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
3472                             *x++ = *y++;
3473
3474                           /* Copy the value given, if any.  */
3475                           while (*y && *y != ' ' && *y != '\t')
3476                             *x++ = *y++;
3477                         }
3478                       else
3479                         {
3480                           /* Do not copy this macro - we have just done it before */
3481                           while (*y && *y != ' ' && *y != '\t')
3482                             y++;
3483                         }
3484                     }
3485                   else if (*y == ' ' || *y == '\t')
3486                     /* Copy whitespace to the result.  */
3487                     *x++ = *y++;
3488                   /* Don't copy -A options  */
3489                   else
3490                     y++;
3491                 }
3492               *x++ = ' ';
3493
3494               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
3495               y = cpp_predefines;
3496               while (*y != 0)
3497                 {
3498                   if (! strncmp (y, "-A", 2))
3499                     /* Copy the whole option.  */
3500                     while (*y && *y != ' ' && *y != '\t')
3501                       *x++ = *y++;
3502                   else if (*y == ' ' || *y == '\t')
3503                     /* Copy whitespace to the result.  */
3504                     *x++ = *y++;
3505                   /* Don't copy other options.  */
3506                   else
3507                     y++;
3508                 }
3509
3510               *x = 0;
3511
3512               value = do_spec_1 (buf, 0, NULL_PTR);
3513               if (value != 0)
3514                 return value;
3515             }
3516             break;
3517
3518           case 'S':
3519             value = do_spec_1 (startfile_spec, 0, NULL_PTR);
3520             if (value != 0)
3521               return value;
3522             break;
3523
3524             /* Here we define characters other than letters and digits.  */
3525
3526           case '{':
3527             p = handle_braces (p);
3528             if (p == 0)
3529               return -1;
3530             break;
3531
3532           case '%':
3533             obstack_1grow (&obstack, '%');
3534             break;
3535
3536           case '*':
3537             do_spec_1 (soft_matched_part, 1, NULL_PTR);
3538             do_spec_1 (" ", 0, NULL_PTR);
3539             break;
3540
3541             /* Process a string found as the value of a spec given by name.
3542                This feature allows individual machine descriptions
3543                to add and use their own specs.
3544                %[...] modifies -D options the way %P does;
3545                %(...) uses the spec unmodified.  */
3546           case '(':
3547           case '[':
3548             {
3549               char *name = p;
3550               struct spec_list *sl;
3551               int len;
3552
3553               /* The string after the S/P is the name of a spec that is to be
3554                  processed. */
3555               while (*p && *p != ')' && *p != ']')
3556                 p++;
3557
3558               /* See if it's in the list */
3559               for (len = p - name, sl = specs; sl; sl = sl->next)
3560                 if (strncmp (sl->name, name, len) == 0 && !sl->name[len])
3561                   {
3562                     name = sl->spec;
3563                     break;
3564                   }
3565
3566               if (sl)
3567                 {
3568                   if (c == '(')
3569                     {
3570                       value = do_spec_1 (name, 0, NULL_PTR);
3571                       if (value != 0)
3572                         return value;
3573                     }
3574                   else
3575                     {
3576                       char *x = (char *) alloca (strlen (name) * 2 + 1);
3577                       char *buf = x;
3578                       char *y = name;
3579
3580                       /* Copy all of NAME into BUF, but put __ after
3581                          every -D and at the end of each arg,  */
3582                       while (1)
3583                         {
3584                           if (! strncmp (y, "-D", 2))
3585                             {
3586                               *x++ = '-';
3587                               *x++ = 'D';
3588                               *x++ = '_';
3589                               *x++ = '_';
3590                               y += 2;
3591                             }
3592                           else if (*y == ' ' || *y == 0)
3593                             {
3594                               *x++ = '_';
3595                               *x++ = '_';
3596                               if (*y == 0)
3597                                 break;
3598                               else
3599                                 *x++ = *y++;
3600                             }
3601                           else
3602                             *x++ = *y++;
3603                         }
3604                       *x = 0;
3605
3606                       value = do_spec_1 (buf, 0, NULL_PTR);
3607                       if (value != 0)
3608                         return value;
3609                     }
3610                 }
3611
3612               /* Discard the closing paren or bracket.  */
3613               if (*p)
3614                 p++;
3615             }
3616             break;
3617
3618           case 'v':
3619             {
3620               int c1 = *p++;  /* Select first or second version number.  */
3621               char *v = compiler_version;
3622               char *q, *copy;
3623               /* If desired, advance to second version number.  */
3624               if (c1 == '2')
3625                 {
3626                   /* Set P after the first period.  */
3627                   while (*v != 0 && *v != ' ' && *v != '.')
3628                     v++;
3629                   if (*v == '.')
3630                     v++;
3631                 }
3632               /* Set Q at the next period or at the end.  */
3633               q = v;
3634               while (*q != 0 && *q != ' ' && *q != '.')
3635                 q++;
3636               /* Empty string means zero.  */
3637               if (p == q)
3638                 {
3639                   v = "0";
3640                   q = v + 1;
3641                 }
3642               /* Put that part into the command.  */
3643               obstack_grow (&obstack, v, q - v);
3644               arg_going = 1;
3645             }
3646             break;
3647
3648           case '|':
3649             if (input_from_pipe)
3650               do_spec_1 ("-", 0, NULL_PTR);
3651             break;
3652
3653           default:
3654             abort ();
3655           }
3656         break;
3657
3658       case '\\':
3659         /* Backslash: treat next character as ordinary.  */
3660         c = *p++;
3661
3662         /* fall through */
3663       default:
3664         /* Ordinary character: put it into the current argument.  */
3665         obstack_1grow (&obstack, c);
3666         arg_going = 1;
3667       }
3668
3669   return 0;             /* End of string */
3670 }
3671
3672 /* Return 0 if we call do_spec_1 and that returns -1.  */
3673
3674 static char *
3675 handle_braces (p)
3676      register char *p;
3677 {
3678   register char *q;
3679   char *filter;
3680   int pipe = 0;
3681   int negate = 0;
3682   int suffix = 0;
3683
3684   if (*p == '|')
3685     /* A `|' after the open-brace means,
3686        if the test fails, output a single minus sign rather than nothing.
3687        This is used in %{|!pipe:...}.  */
3688     pipe = 1, ++p;
3689
3690   if (*p == '!')
3691     /* A `!' after the open-brace negates the condition:
3692        succeed if the specified switch is not present.  */
3693     negate = 1, ++p;
3694
3695   if (*p == '.')
3696     /* A `.' after the open-brace means test against the current suffix.  */
3697     {
3698       if (pipe)
3699         abort ();
3700
3701       suffix = 1;
3702       ++p;
3703     }
3704
3705   filter = p;
3706   while (*p != ':' && *p != '}') p++;
3707   if (*p != '}')
3708     {
3709       register int count = 1;
3710       q = p + 1;
3711       while (count > 0)
3712         {
3713           if (*q == '{')
3714             count++;
3715           else if (*q == '}')
3716             count--;
3717           else if (*q == 0)
3718             abort ();
3719           q++;
3720         }
3721     }
3722   else
3723     q = p + 1;
3724
3725   if (suffix)
3726     {
3727       int found = (input_suffix != 0
3728                    && strlen (input_suffix) == p - filter
3729                    && strncmp (input_suffix, filter, p - filter) == 0);
3730
3731       if (p[0] == '}')
3732         abort ();
3733
3734       if (negate != found
3735           && do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL_PTR) < 0)
3736         return 0;
3737
3738       return q;
3739     }
3740   else if (p[-1] == '*' && p[0] == '}')
3741     {
3742       /* Substitute all matching switches as separate args.  */
3743       register int i;
3744       --p;
3745       for (i = 0; i < n_switches; i++)
3746         if (!strncmp (switches[i].part1, filter, p - filter)
3747             && check_live_switch (i, p - filter))
3748           give_switch (i, 0);
3749     }
3750   else
3751     {
3752       /* Test for presence of the specified switch.  */
3753       register int i;
3754       int present = 0;
3755
3756       /* If name specified ends in *, as in {x*:...},
3757          check for %* and handle that case.  */
3758       if (p[-1] == '*' && !negate)
3759         {
3760           int substitution;
3761           char *r = p;
3762
3763           /* First see whether we have %*.  */
3764           substitution = 0;
3765           while (r < q)
3766             {
3767               if (*r == '%' && r[1] == '*')
3768                 substitution = 1;
3769               r++;
3770             }
3771           /* If we do, handle that case.  */
3772           if (substitution)
3773             {
3774               /* Substitute all matching switches as separate args.
3775                  But do this by substituting for %*
3776                  in the text that follows the colon.  */
3777
3778               unsigned hard_match_len = p - filter - 1;
3779               char *string = save_string (p + 1, q - p - 2);
3780
3781               for (i = 0; i < n_switches; i++)
3782                 if (!strncmp (switches[i].part1, filter, hard_match_len)
3783                     && check_live_switch (i, -1))
3784                   {
3785                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
3786                     /* Pass any arguments this switch has.  */
3787                     give_switch (i, 1);
3788                   }
3789
3790               return q;
3791             }
3792         }
3793
3794       /* If name specified ends in *, as in {x*:...},
3795          check for presence of any switch name starting with x.  */
3796       if (p[-1] == '*')
3797         {
3798           for (i = 0; i < n_switches; i++)
3799             {
3800               unsigned hard_match_len = p - filter - 1;
3801
3802               if (!strncmp (switches[i].part1, filter, hard_match_len)
3803                   && check_live_switch (i, hard_match_len))
3804                 {
3805                   present = 1;
3806                 }
3807             }
3808         }
3809       /* Otherwise, check for presence of exact name specified.  */
3810       else
3811         {
3812           for (i = 0; i < n_switches; i++)
3813             {
3814               if (!strncmp (switches[i].part1, filter, p - filter)
3815                   && switches[i].part1[p - filter] == 0
3816                   && check_live_switch (i, -1))
3817                 {
3818                   present = 1;
3819                   break;
3820                 }
3821             }
3822         }
3823
3824       /* If it is as desired (present for %{s...}, absent for %{-s...})
3825          then substitute either the switch or the specified
3826          conditional text.  */
3827       if (present != negate)
3828         {
3829           if (*p == '}')
3830             {
3831               give_switch (i, 0);
3832             }
3833           else
3834             {
3835               if (do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL_PTR) < 0)
3836                 return 0;
3837             }
3838         }
3839       else if (pipe)
3840         {
3841           /* Here if a %{|...} conditional fails: output a minus sign,
3842              which means "standard output" or "standard input".  */
3843           do_spec_1 ("-", 0, NULL_PTR);
3844         }
3845     }
3846
3847   return q;
3848 }
3849 \f
3850 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
3851    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
3852    spec, or -1 if either exact match or %* is used.
3853
3854    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
3855    whose value does not begin with "no-" is obsoleted by the same value
3856    with the "no-", similarly for a switch with the "no-" prefix.  */
3857
3858 static int
3859 check_live_switch (switchnum, prefix_length)
3860      int switchnum;
3861      int prefix_length;
3862 {
3863   char *name = switches[switchnum].part1;
3864   int i;
3865
3866   /* In the common case of {<at-most-one-letter>*}, a negating
3867      switch would always match, so ignore that case.  We will just
3868      send the conflicting switches to the compiler phase.  */
3869   if (prefix_length >= 0 && prefix_length <= 1)
3870     return 1;
3871
3872   /* If we already processed this switch and determined if it was
3873      live or not, return our past determination.  */
3874   if (switches[switchnum].live_cond != 0)
3875     return switches[switchnum].live_cond > 0;
3876
3877   /* Now search for duplicate in a manner that depends on the name.  */
3878   switch (*name)
3879     {
3880     case 'O':
3881         for (i = switchnum + 1; i < n_switches; i++)
3882           if (switches[i].part1[0] == 'O')
3883             {
3884               switches[switchnum].valid = 1;
3885               switches[switchnum].live_cond = -1;
3886               return 0;
3887             }
3888       break;
3889
3890     case 'W':  case 'f':  case 'm':
3891       if (! strncmp (name + 1, "no-", 3))
3892         {
3893           /* We have Xno-YYY, search for XYYY. */
3894           for (i = switchnum + 1; i < n_switches; i++)
3895             if (switches[i].part1[0] == name[0]
3896                 && ! strcmp (&switches[i].part1[1], &name[4]))
3897             {
3898               switches[switchnum].valid = 1;
3899               switches[switchnum].live_cond = -1;
3900               return 0;
3901             }
3902         }
3903       else
3904         {
3905           /* We have XYYY, search for Xno-YYY.  */
3906           for (i = switchnum + 1; i < n_switches; i++)
3907             if (switches[i].part1[0] == name[0]
3908                 && switches[i].part1[1] == 'n'
3909                 && switches[i].part1[2] == 'o'
3910                 && switches[i].part1[3] == '-'
3911                 && !strcmp (&switches[i].part1[4], &name[1]))
3912             {
3913               switches[switchnum].valid = 1;
3914               switches[switchnum].live_cond = -1;
3915               return 0;
3916             }
3917         }
3918       break;
3919     }
3920
3921   /* Otherwise the switch is live.  */
3922   switches[switchnum].live_cond = 1;
3923   return 1;
3924 }
3925 \f
3926 /* Pass a switch to the current accumulating command
3927    in the same form that we received it.
3928    SWITCHNUM identifies the switch; it is an index into
3929    the vector of switches gcc received, which is `switches'.
3930    This cannot fail since it never finishes a command line.
3931
3932    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
3933
3934 static void
3935 give_switch (switchnum, omit_first_word)
3936      int switchnum;
3937      int omit_first_word;
3938 {
3939   if (!omit_first_word)
3940     {
3941       do_spec_1 ("-", 0, NULL_PTR);
3942       do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
3943     }
3944   do_spec_1 (" ", 0, NULL_PTR);
3945   if (switches[switchnum].args != 0)
3946     {
3947       char **p;
3948       for (p = switches[switchnum].args; *p; p++)
3949         {
3950           do_spec_1 (*p, 1, NULL_PTR);
3951           do_spec_1 (" ", 0, NULL_PTR);
3952         }
3953     }
3954   switches[switchnum].valid = 1;
3955 }
3956 \f
3957 /* Search for a file named NAME trying various prefixes including the
3958    user's -B prefix and some standard ones.
3959    Return the absolute file name found.  If nothing is found, return NAME.  */
3960
3961 static char *
3962 find_file (name)
3963      char *name;
3964 {
3965   char *newname;
3966
3967   /* Try multilib_dir if it is defined.  */
3968   if (multilib_dir != NULL)
3969     {
3970       char *try;
3971
3972       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
3973       strcpy (try, multilib_dir);
3974       strcat (try, "/");
3975       strcat (try, name);
3976
3977       newname = find_a_file (&startfile_prefix, try, R_OK);
3978
3979       /* If we don't find it in the multi library dir, then fall
3980          through and look for it in the normal places.  */
3981       if (newname != NULL)
3982         return newname;
3983     }
3984
3985   newname = find_a_file (&startfile_prefix, name, R_OK);
3986   return newname ? newname : name;
3987 }
3988
3989 /* Determine whether a directory exists.  If LINKER, return 0 for
3990    certain fixed names not needed by the linker.  If not LINKER, it is
3991    only important to return 0 if the host machine has a small ARG_MAX
3992    limit.  */
3993
3994 static int
3995 is_directory (path1, path2, linker)
3996      char *path1;
3997      char *path2;
3998      int linker;
3999 {
4000   int len1 = strlen (path1);
4001   int len2 = strlen (path2);
4002   char *path = (char *) alloca (3 + len1 + len2);
4003   char *cp;
4004   struct stat st;
4005
4006 #ifndef SMALL_ARG_MAX
4007   if (! linker)
4008     return 1;
4009 #endif
4010
4011   /* Construct the path from the two parts.  Ensure the string ends with "/.".
4012      The resulting path will be a directory even if the given path is a
4013      symbolic link.  */
4014   bcopy (path1, path, len1);
4015   bcopy (path2, path + len1, len2);
4016   cp = path + len1 + len2;
4017   if (cp[-1] != '/')
4018     *cp++ = '/';
4019   *cp++ = '.';
4020   *cp = '\0';
4021
4022   /* Exclude directories that the linker is known to search.  */
4023   if (linker
4024       && ((cp - path == 6 && strcmp (path, "/lib/.") == 0)
4025           || (cp - path == 10 && strcmp (path, "/usr/lib/.") == 0)))
4026     return 0;
4027
4028   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
4029 }
4030 \f
4031 /* On fatal signals, delete all the temporary files.  */
4032
4033 static void
4034 fatal_error (signum)
4035      int signum;
4036 {
4037   signal (signum, SIG_DFL);
4038   delete_failure_queue ();
4039   delete_temp_files ();
4040   /* Get the same signal again, this time not handled,
4041      so its normal effect occurs.  */
4042   kill (getpid (), signum);
4043 }
4044
4045 int
4046 main (argc, argv)
4047      int argc;
4048      char **argv;
4049 {
4050   register int i;
4051   int j;
4052   int value;
4053   int linker_was_run = 0;
4054   char *explicit_link_files;
4055   char *specs_file;
4056   char *p;
4057
4058   p = argv[0] + strlen (argv[0]);
4059   while (p != argv[0] && p[-1] != '/') --p;
4060   programname = p;
4061
4062   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
4063     signal (SIGINT, fatal_error);
4064 #ifdef SIGHUP
4065   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
4066     signal (SIGHUP, fatal_error);
4067 #endif
4068   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
4069     signal (SIGTERM, fatal_error);
4070 #ifdef SIGPIPE
4071   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
4072     signal (SIGPIPE, fatal_error);
4073 #endif
4074
4075   argbuf_length = 10;
4076   argbuf = (char **) xmalloc (argbuf_length * sizeof (char *));
4077
4078   obstack_init (&obstack);
4079
4080   /* Set up to remember the pathname of gcc and any options
4081      needed for collect.  We use argv[0] instead of programname because
4082      we need the complete pathname.  */
4083   obstack_init (&collect_obstack);
4084   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
4085   obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
4086   putenv (obstack_finish (&collect_obstack));
4087
4088   /* Choose directory for temp files.  */
4089
4090   choose_temp_base ();
4091
4092   /* Make a table of what switches there are (switches, n_switches).
4093      Make a table of specified input files (infiles, n_infiles).
4094      Decode switches that are handled locally.  */
4095
4096   process_command (argc, argv);
4097
4098   /* Initialize the vector of specs to just the default.
4099      This means one element containing 0s, as a terminator.  */
4100
4101   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
4102   bcopy ((char *) default_compilers, (char *) compilers,
4103          sizeof default_compilers);
4104   n_compilers = n_default_compilers;
4105
4106   /* Read specs from a file if there is one.  */
4107
4108   machine_suffix = concat (spec_machine, "/", concat (spec_version, "/", ""));
4109   just_machine_suffix = concat (spec_machine, "/", "");
4110
4111   specs_file = find_a_file (&startfile_prefix, "specs", R_OK);
4112   /* Read the specs file unless it is a default one.  */
4113   if (specs_file != 0 && strcmp (specs_file, "specs"))
4114     read_specs (specs_file);
4115
4116   /* If not cross-compiling, look for startfiles in the standard places.  */
4117   /* The fact that these are done here, after reading the specs file,
4118      means that it cannot be found in these directories.
4119      But that's okay.  It should never be there anyway.  */
4120   if (!cross_compile)
4121     {
4122 #ifdef MD_EXEC_PREFIX
4123       add_prefix (&exec_prefix, md_exec_prefix, 0, 0, NULL_PTR);
4124       add_prefix (&startfile_prefix, md_exec_prefix, 0, 0, NULL_PTR);
4125 #endif
4126
4127 #ifdef MD_STARTFILE_PREFIX
4128       add_prefix (&startfile_prefix, md_startfile_prefix, 0, 0, NULL_PTR);
4129 #endif
4130
4131 #ifdef MD_STARTFILE_PREFIX_1
4132       add_prefix (&startfile_prefix, md_startfile_prefix_1, 0, 0, NULL_PTR);
4133 #endif
4134
4135       /* If standard_startfile_prefix is relative, base it on
4136          standard_exec_prefix.  This lets us move the installed tree
4137          as a unit.  If GCC_EXEC_PREFIX is defined, base
4138          standard_startfile_prefix on that as well.  */
4139       if (*standard_startfile_prefix == '/')
4140         add_prefix (&startfile_prefix, standard_startfile_prefix, 0, 0,
4141                     NULL_PTR);
4142       else
4143         {
4144           if (gcc_exec_prefix)
4145             add_prefix (&startfile_prefix,
4146                         concat (gcc_exec_prefix,
4147                                 standard_startfile_prefix,
4148                                 ""),
4149                         0, 0, NULL_PTR);
4150           add_prefix (&startfile_prefix,
4151                       concat (standard_exec_prefix,
4152                               machine_suffix,
4153                               standard_startfile_prefix),
4154                       0, 0, NULL_PTR);
4155         }                      
4156
4157       add_prefix (&startfile_prefix, standard_startfile_prefix_1, 0, 0,
4158                   NULL_PTR);
4159       add_prefix (&startfile_prefix, standard_startfile_prefix_2, 0, 0,
4160                   NULL_PTR);
4161 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
4162       add_prefix (&startfile_prefix, "./", 0, 1, NULL_PTR);
4163 #endif
4164     }
4165
4166   /* Now we have the specs.
4167      Set the `valid' bits for switches that match anything in any spec.  */
4168
4169   validate_all_switches ();
4170
4171   /* Now that we have the switches and the specs, set
4172      the subdirectory based on the options.  */
4173   set_multilib_dir ();
4174
4175   /* Warn about any switches that no pass was interested in.  */
4176
4177   for (i = 0; i < n_switches; i++)
4178     if (! switches[i].valid)
4179       error ("unrecognized option `-%s'", switches[i].part1);
4180
4181   /* Obey some of the options.  */
4182
4183   if (print_file_name)
4184     {
4185       printf ("%s\n", find_file (print_file_name));
4186       exit (0);
4187     }
4188
4189   if (print_prog_name)
4190     {
4191       char *newname = find_a_file (&exec_prefix, print_prog_name, X_OK);
4192       printf ("%s\n", (newname ? newname : print_prog_name));
4193       exit (0);
4194     }
4195
4196   if (print_multi_lib)
4197     {
4198       print_multilib_info ();
4199       exit (0);
4200     }
4201
4202   if (print_multi_directory)
4203     {
4204       if (multilib_dir == NULL)
4205         printf (".\n");
4206       else
4207         printf ("%s\n", multilib_dir);
4208       exit (0);
4209     }
4210
4211   if (verbose_flag)
4212     {
4213       fprintf (stderr, "gcc version %s\n", version_string);
4214       if (n_infiles == 0)
4215         exit (0);
4216     }
4217
4218   if (n_infiles == 0)
4219     fatal ("No input files");
4220
4221   /* Make a place to record the compiler output file names
4222      that correspond to the input files.  */
4223
4224   outfiles = (char **) xmalloc (n_infiles * sizeof (char *));
4225   bzero ((char *) outfiles, n_infiles * sizeof (char *));
4226
4227   /* Record which files were specified explicitly as link input.  */
4228
4229   explicit_link_files = xmalloc (n_infiles);
4230   bzero (explicit_link_files, n_infiles);
4231
4232   for (i = 0; i < n_infiles; i++)
4233     {
4234       register struct compiler *cp = 0;
4235       int this_file_error = 0;
4236
4237       /* Tell do_spec what to substitute for %i.  */
4238
4239       input_filename = infiles[i].name;
4240       input_filename_length = strlen (input_filename);
4241       input_file_number = i;
4242
4243       /* Use the same thing in %o, unless cp->spec says otherwise.  */
4244
4245       outfiles[i] = input_filename;
4246
4247       /* Figure out which compiler from the file's suffix.  */
4248
4249       cp = lookup_compiler (infiles[i].name, input_filename_length,
4250                             infiles[i].language);
4251
4252       if (cp)
4253         {
4254           /* Ok, we found an applicable compiler.  Run its spec.  */
4255           /* First say how much of input_filename to substitute for %b  */
4256           register char *p;
4257           int len;
4258
4259           input_basename = input_filename;
4260           for (p = input_filename; *p; p++)
4261             if (*p == '/')
4262               input_basename = p + 1;
4263
4264           /* Find a suffix starting with the last period,
4265              and set basename_length to exclude that suffix.  */
4266           basename_length = strlen (input_basename);
4267           p = input_basename + basename_length;
4268           while (p != input_basename && *p != '.') --p;
4269           if (*p == '.' && p != input_basename)
4270             {
4271               basename_length = p - input_basename;
4272               input_suffix = p + 1;
4273             }
4274           else
4275             input_suffix = "";
4276
4277           len = 0;
4278           for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
4279             if (cp->spec[j])
4280               len += strlen (cp->spec[j]);
4281
4282           p = (char *) xmalloc (len + 1);
4283
4284           len = 0;
4285           for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
4286             if (cp->spec[j])
4287               {
4288                 strcpy (p + len, cp->spec[j]);
4289                 len += strlen (cp->spec[j]);
4290               }
4291
4292           value = do_spec (p);
4293           free (p);
4294           if (value < 0)
4295             this_file_error = 1;
4296         }
4297
4298       /* If this file's name does not contain a recognized suffix,
4299          record it as explicit linker input.  */
4300
4301       else
4302         explicit_link_files[i] = 1;
4303
4304       /* Clear the delete-on-failure queue, deleting the files in it
4305          if this compilation failed.  */
4306
4307       if (this_file_error)
4308         {
4309           delete_failure_queue ();
4310           error_count++;
4311         }
4312       /* If this compilation succeeded, don't delete those files later.  */
4313       clear_failure_queue ();
4314     }
4315
4316   /* Run ld to link all the compiler output files.  */
4317
4318   if (error_count == 0)
4319     {
4320       int tmp = execution_count;
4321       int i;
4322       int first_time;
4323
4324       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
4325          for collect.  */
4326       putenv_from_prefixes (&exec_prefix, "COMPILER_PATH=");
4327       putenv_from_prefixes (&startfile_prefix, "LIBRARY_PATH=");
4328
4329       /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4330          the compiler.  */
4331       obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4332                     sizeof ("COLLECT_GCC_OPTIONS=")-1);
4333
4334       first_time = TRUE;
4335       for (i = 0; i < n_switches; i++)
4336         {
4337           char **args;
4338           if (!first_time)
4339             obstack_grow (&collect_obstack, " ", 1);
4340
4341           first_time = FALSE;
4342           obstack_grow (&collect_obstack, "-", 1);
4343           obstack_grow (&collect_obstack, switches[i].part1,
4344                         strlen (switches[i].part1));
4345
4346           for (args = switches[i].args; args && *args; args++)
4347             {
4348               obstack_grow (&collect_obstack, " ", 1);
4349               obstack_grow (&collect_obstack, *args, strlen (*args));
4350             }
4351         }
4352       obstack_grow (&collect_obstack, "\0", 1);
4353       putenv (obstack_finish (&collect_obstack));
4354
4355       value = do_spec (link_command_spec);
4356       if (value < 0)
4357         error_count = 1;
4358       linker_was_run = (tmp != execution_count);
4359     }
4360
4361   /* Warn if a -B option was specified but the prefix was never used.  */
4362   unused_prefix_warnings (&exec_prefix);
4363   unused_prefix_warnings (&startfile_prefix);
4364
4365   /* If options said don't run linker,
4366      complain about input files to be given to the linker.  */
4367
4368   if (! linker_was_run && error_count == 0)
4369     for (i = 0; i < n_infiles; i++)
4370       if (explicit_link_files[i])
4371         error ("%s: linker input file unused since linking not done",
4372                outfiles[i]);
4373
4374   /* Delete some or all of the temporary files we made.  */
4375
4376   if (error_count)
4377     delete_failure_queue ();
4378   delete_temp_files ();
4379
4380   exit (error_count > 0 ? (signal_count ? 2 : 1) : 0);
4381   /* NOTREACHED */
4382   return 0;
4383 }
4384
4385 /* Find the proper compilation spec for the file name NAME,
4386    whose length is LENGTH.  LANGUAGE is the specified language,
4387    or 0 if none specified.  */
4388
4389 static struct compiler *
4390 lookup_compiler (name, length, language)
4391      char *name;
4392      int length;
4393      char *language;
4394 {
4395   struct compiler *cp;
4396
4397   /* Look for the language, if one is spec'd.  */
4398   if (language != 0)
4399     {
4400       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
4401         {
4402           if (language != 0)
4403             {
4404               if (cp->suffix[0] == '@'
4405                   && !strcmp (cp->suffix + 1, language))
4406                 return cp;
4407             }
4408         }
4409       error ("language %s not recognized", language);
4410     }
4411
4412   /* Look for a suffix.  */
4413   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
4414     {
4415       if (/* The suffix `-' matches only the file name `-'.  */
4416           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
4417           ||
4418           (strlen (cp->suffix) < length
4419            /* See if the suffix matches the end of NAME.  */
4420            && !strcmp (cp->suffix,
4421                        name + length - strlen (cp->suffix))))
4422         {
4423           if (cp->spec[0][0] == '@')
4424             {
4425               struct compiler *new;
4426               /* An alias entry maps a suffix to a language.
4427                  Search for the language; pass 0 for NAME and LENGTH
4428                  to avoid infinite recursion if language not found.
4429                  Construct the new compiler spec.  */
4430               language = cp->spec[0] + 1;
4431               new = (struct compiler *) xmalloc (sizeof (struct compiler));
4432               new->suffix = cp->suffix;
4433               bcopy ((char *) lookup_compiler (NULL_PTR, 0, language)->spec,
4434                      (char *) new->spec, sizeof new->spec);
4435               return new;
4436             }
4437           /* A non-alias entry: return it.  */
4438           return cp;
4439         }
4440     }
4441
4442   return 0;
4443 }
4444 \f
4445 char *
4446 xmalloc (size)
4447      unsigned size;
4448 {
4449   register char *value = (char *) malloc (size);
4450   if (value == 0)
4451     fatal ("virtual memory exhausted");
4452   return value;
4453 }
4454
4455 char *
4456 xrealloc (ptr, size)
4457      char *ptr;
4458      unsigned size;
4459 {
4460   register char *value = (char *) realloc (ptr, size);
4461   if (value == 0)
4462     fatal ("virtual memory exhausted");
4463   return value;
4464 }
4465
4466 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3.  */
4467
4468 static char *
4469 concat (s1, s2, s3)
4470      char *s1, *s2, *s3;
4471 {
4472   int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
4473   char *result = xmalloc (len1 + len2 + len3 + 1);
4474
4475   strcpy (result, s1);
4476   strcpy (result + len1, s2);
4477   strcpy (result + len1 + len2, s3);
4478   *(result + len1 + len2 + len3) = 0;
4479
4480   return result;
4481 }
4482
4483 static char *
4484 save_string (s, len)
4485      char *s;
4486      int len;
4487 {
4488   register char *result = xmalloc (len + 1);
4489
4490   bcopy (s, result, len);
4491   result[len] = 0;
4492   return result;
4493 }
4494
4495 static void
4496 pfatal_with_name (name)
4497      char *name;
4498 {
4499   char *s;
4500
4501   if (errno < sys_nerr)
4502     s = concat ("%s: ", sys_errlist[errno], "");
4503   else
4504     s = "cannot open %s";
4505   fatal (s, name);
4506 }
4507
4508 static void
4509 perror_with_name (name)
4510      char *name;
4511 {
4512   char *s;
4513
4514   if (errno < sys_nerr)
4515     s = concat ("%s: ", sys_errlist[errno], "");
4516   else
4517     s = "cannot open %s";
4518   error (s, name);
4519 }
4520
4521 static void
4522 perror_exec (name)
4523      char *name;
4524 {
4525   char *s;
4526
4527   if (errno < sys_nerr)
4528     s = concat ("installation problem, cannot exec %s: ",
4529                 sys_errlist[errno], "");
4530   else
4531     s = "installation problem, cannot exec %s";
4532   error (s, name);
4533 }
4534
4535 /* More 'friendly' abort that prints the line and file.
4536    config.h can #define abort fancy_abort if you like that sort of thing.  */
4537
4538 void
4539 fancy_abort ()
4540 {
4541   fatal ("Internal gcc abort.");
4542 }
4543 \f
4544 #ifdef HAVE_VPRINTF
4545
4546 /* Output an error message and exit */
4547
4548 static void
4549 fatal VPROTO((char *format, ...))
4550 {
4551 #ifndef __STDC__
4552   char *format;
4553 #endif
4554   va_list ap;
4555
4556   VA_START (ap, format);
4557
4558 #ifndef __STDC__
4559   format = va_arg (ap, char*);
4560 #endif
4561
4562   fprintf (stderr, "%s: ", programname);
4563   vfprintf (stderr, format, ap);
4564   va_end (ap);
4565   fprintf (stderr, "\n");
4566   delete_temp_files ();
4567   exit (1);
4568 }
4569
4570 static void
4571 error VPROTO((char *format, ...))
4572 {
4573 #ifndef __STDC__
4574   char *format;
4575 #endif
4576   va_list ap;
4577
4578   VA_START (ap, format);
4579
4580 #ifndef __STDC__
4581   format = va_arg (ap, char*);
4582 #endif
4583
4584   fprintf (stderr, "%s: ", programname);
4585   vfprintf (stderr, format, ap);
4586   va_end (ap);
4587
4588   fprintf (stderr, "\n");
4589 }
4590
4591 #else /* not HAVE_VPRINTF */
4592
4593 static void
4594 fatal (msg, arg1, arg2)
4595      char *msg, *arg1, *arg2;
4596 {
4597   error (msg, arg1, arg2);
4598   delete_temp_files ();
4599   exit (1);
4600 }
4601
4602 static void
4603 error (msg, arg1, arg2)
4604      char *msg, *arg1, *arg2;
4605 {
4606   fprintf (stderr, "%s: ", programname);
4607   fprintf (stderr, msg, arg1, arg2);
4608   fprintf (stderr, "\n");
4609 }
4610
4611 #endif /* not HAVE_VPRINTF */
4612
4613 \f
4614 static void
4615 validate_all_switches ()
4616 {
4617   struct compiler *comp;
4618   register char *p;
4619   register char c;
4620   struct spec_list *spec;
4621
4622   for (comp = compilers; comp->spec[0]; comp++)
4623     {
4624       int i;
4625       for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
4626         {
4627           p = comp->spec[i];
4628           while (c = *p++)
4629             if (c == '%' && *p == '{')
4630               /* We have a switch spec.  */
4631               validate_switches (p + 1);
4632         }
4633     }
4634
4635   /* look through the linked list of extra specs read from the specs file */
4636   for (spec = specs; spec ; spec = spec->next)
4637     {
4638       p = spec->spec;
4639       while (c = *p++)
4640         if (c == '%' && *p == '{')
4641           /* We have a switch spec.  */
4642           validate_switches (p + 1);
4643     }
4644
4645   p = link_command_spec;
4646   while (c = *p++)
4647     if (c == '%' && *p == '{')
4648       /* We have a switch spec.  */
4649       validate_switches (p + 1);
4650
4651   /* Now notice switches mentioned in the machine-specific specs.  */
4652
4653   p = asm_spec;
4654   while (c = *p++)
4655     if (c == '%' && *p == '{')
4656       /* We have a switch spec.  */
4657       validate_switches (p + 1);
4658
4659   p = asm_final_spec;
4660   while (c = *p++)
4661     if (c == '%' && *p == '{')
4662       /* We have a switch spec.  */
4663       validate_switches (p + 1);
4664
4665   p = cpp_spec;
4666   while (c = *p++)
4667     if (c == '%' && *p == '{')
4668       /* We have a switch spec.  */
4669       validate_switches (p + 1);
4670
4671   p = signed_char_spec;
4672   while (c = *p++)
4673     if (c == '%' && *p == '{')
4674       /* We have a switch spec.  */
4675       validate_switches (p + 1);
4676
4677   p = cc1_spec;
4678   while (c = *p++)
4679     if (c == '%' && *p == '{')
4680       /* We have a switch spec.  */
4681       validate_switches (p + 1);
4682
4683   p = cc1plus_spec;
4684   while (c = *p++)
4685     if (c == '%' && *p == '{')
4686       /* We have a switch spec.  */
4687       validate_switches (p + 1);
4688
4689   p = link_spec;
4690   while (c = *p++)
4691     if (c == '%' && *p == '{')
4692       /* We have a switch spec.  */
4693       validate_switches (p + 1);
4694
4695   p = lib_spec;
4696   while (c = *p++)
4697     if (c == '%' && *p == '{')
4698       /* We have a switch spec.  */
4699       validate_switches (p + 1);
4700
4701   p = startfile_spec;
4702   while (c = *p++)
4703     if (c == '%' && *p == '{')
4704       /* We have a switch spec.  */
4705       validate_switches (p + 1);
4706 }
4707
4708 /* Look at the switch-name that comes after START
4709    and mark as valid all supplied switches that match it.  */
4710
4711 static void
4712 validate_switches (start)
4713      char *start;
4714 {
4715   register char *p = start;
4716   char *filter;
4717   register int i;
4718   int suffix = 0;
4719
4720   if (*p == '|')
4721     ++p;
4722
4723   if (*p == '!')
4724     ++p;
4725
4726   if (*p == '.')
4727     suffix = 1, ++p;
4728
4729   filter = p;
4730   while (*p != ':' && *p != '}') p++;
4731
4732   if (suffix)
4733     ;
4734   else if (p[-1] == '*')
4735     {
4736       /* Mark all matching switches as valid.  */
4737       --p;
4738       for (i = 0; i < n_switches; i++)
4739         if (!strncmp (switches[i].part1, filter, p - filter))
4740           switches[i].valid = 1;
4741     }
4742   else
4743     {
4744       /* Mark an exact matching switch as valid.  */
4745       for (i = 0; i < n_switches; i++)
4746         {
4747           if (!strncmp (switches[i].part1, filter, p - filter)
4748               && switches[i].part1[p - filter] == 0)
4749             switches[i].valid = 1;
4750         }
4751     }
4752 }
4753 \f
4754 /* Check whether a particular argument was used.  */
4755
4756 static int
4757 used_arg (p, len)
4758      char *p;
4759      int len;
4760 {
4761   int i;
4762
4763   for (i = 0; i < n_switches; i++)
4764     if (! strncmp (switches[i].part1, p, len)
4765         && strlen (switches[i].part1) == len)
4766       return 1;
4767   return 0;
4768 }
4769
4770 /* Work out the subdirectory to use based on the
4771    options.  The format of multilib_select is a list of elements.
4772    Each element is a subdirectory name followed by a list of options
4773    followed by a semicolon.  gcc will consider each line in turn.  If
4774    none of the options beginning with an exclamation point are
4775    present, and all of the other options are present, that
4776    subdirectory will be used.  */
4777
4778 static void
4779 set_multilib_dir ()
4780 {
4781   char *p = multilib_select;
4782   int this_path_len;
4783   char *this_path, *this_arg;
4784   int failed;
4785
4786   while (*p != '\0')
4787     {
4788       /* Ignore newlines.  */
4789       if (*p == '\n')
4790         {
4791           ++p;
4792           continue;
4793         }
4794
4795       /* Get the initial path.  */
4796       this_path = p;
4797       while (*p != ' ')
4798         {
4799           if (*p == '\0')
4800             abort ();
4801           ++p;
4802         }
4803       this_path_len = p - this_path;
4804
4805       /* Check the arguments.  */
4806       failed = 0;
4807       ++p;
4808       while (*p != ';')
4809         {
4810           if (*p == '\0')
4811             abort ();
4812
4813           if (failed)
4814             {
4815               ++p;
4816               continue;
4817             }
4818
4819           this_arg = p;
4820           while (*p != ' ' && *p != ';')
4821             {
4822               if (*p == '\0')
4823                 abort ();
4824               ++p;
4825             }
4826
4827           if (*this_arg == '!')
4828             failed = used_arg (this_arg + 1, p - (this_arg + 1));
4829           else
4830             failed = ! used_arg (this_arg, p - this_arg);
4831
4832           if (*p == ' ')
4833             ++p;
4834         }
4835
4836       if (! failed)
4837         {
4838           if (this_path_len != 1
4839               || this_path[0] != '.')
4840             {
4841               multilib_dir = xmalloc (this_path_len + 1);
4842               strncpy (multilib_dir, this_path, this_path_len);
4843               multilib_dir[this_path_len] = '\0';
4844             }
4845           break;
4846         }
4847
4848       ++p;
4849     }      
4850 }
4851
4852 /* Print out the multiple library subdirectory selection
4853    information.  This prints out a series of lines.  Each line looks
4854    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
4855    required.  Only the desired options are printed out, the negative
4856    matches.  The options are print without a leading dash.  There are
4857    no spaces to make it easy to use the information in the shell.
4858    Each subdirectory is printed only once.  This assumes the ordering
4859    generated by the genmultilib script.  */
4860
4861 static void
4862 print_multilib_info ()
4863 {
4864   char *p = multilib_select;
4865   char *last_path, *this_path;
4866   int last_path_len, skip, use_arg;
4867
4868   while (*p != '\0')
4869     {
4870       /* Ignore newlines.  */
4871       if (*p == '\n')
4872         {
4873           ++p;
4874           continue;
4875         }
4876
4877       /* Get the initial path.  */
4878       this_path = p;
4879       while (*p != ' ')
4880         {
4881           if (*p == '\0')
4882             abort ();
4883           ++p;
4884         }
4885
4886       /* If this is a duplicate, skip it.  */
4887       skip = (p - this_path == last_path_len
4888               && ! strncmp (last_path, this_path, last_path_len));
4889
4890       last_path = this_path;
4891       last_path_len = p - this_path;
4892
4893       if (! skip)
4894         {
4895           char *p1;
4896
4897           for (p1 = last_path; p1 < p; p1++)
4898             putchar (*p1);
4899           putchar (';');
4900         }
4901
4902       ++p;
4903       while (*p != ';')
4904         {
4905           int use_arg;
4906
4907           if (*p == '\0')
4908             abort ();
4909
4910           if (skip)
4911             {
4912               ++p;
4913               continue;
4914             }
4915
4916           use_arg = *p != '!';
4917
4918           if (use_arg)
4919             putchar ('@');
4920
4921           while (*p != ' ' && *p != ';')
4922             {
4923               if (*p == '\0')
4924                 abort ();
4925               if (use_arg)
4926                 putchar (*p);
4927               ++p;
4928             }
4929
4930           if (*p == ' ')
4931             ++p;
4932         }
4933
4934       if (! skip)
4935         putchar ('\n');
4936
4937       ++p;
4938     }
4939 }