OSDN Git Service

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