OSDN Git Service

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