OSDN Git Service

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