OSDN Git Service

(main): Improve "No input files" error message.
[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             int j = 0;
2513             int n_args = WORD_SWITCH_TAKES_ARG (p);
2514
2515             if (n_args == 0) {
2516               /* Count only the option arguments in separate argv elements.  */
2517               n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
2518             }
2519             if (i + n_args >= argc)
2520               fatal ("argument to `-%s' is missing", p);
2521             switches[n_switches].args
2522               = (char **) xmalloc ((n_args + 1) * sizeof (char *));
2523             while (j < n_args)
2524               switches[n_switches].args[j++] = argv[++i];
2525             /* Null-terminate the vector.  */
2526             switches[n_switches].args[j] = 0;
2527           } else if (*switches_need_spaces != 0 && (c == 'o' || c == 'L')) {
2528             /* On some systems, ld cannot handle -o or -L without space.
2529                So split the -o or -L from its argument.  */
2530             switches[n_switches].part1 = (c == 'o' ? "o" : "L");
2531             switches[n_switches].args = (char **) xmalloc (2 * sizeof (char *));
2532             switches[n_switches].args[0] = xmalloc (strlen (p));
2533             strcpy (switches[n_switches].args[0], &p[1]);
2534             switches[n_switches].args[1] = 0;
2535           } else
2536             switches[n_switches].args = 0;
2537           switches[n_switches].valid = 0;
2538           /* This is always valid, since gcc.c itself understands it.  */
2539           if (!strcmp (p, "save-temps"))
2540             switches[n_switches].valid = 1;
2541           n_switches++;
2542         }
2543       else
2544         {
2545           if ((argv[i][0] != '-' || argv[i][1] != 'l')
2546               && access (argv[i], R_OK) < 0)
2547             {
2548               perror_with_name (argv[i]);
2549               error_count++;
2550             }
2551           else
2552             {
2553               infiles[n_infiles].language = spec_lang;
2554               infiles[n_infiles++].name = argv[i];
2555             }
2556         }
2557     }
2558
2559   if (n_infiles == last_language_n_infiles)
2560     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
2561
2562   switches[n_switches].part1 = 0;
2563   infiles[n_infiles].name = 0;
2564
2565   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
2566   if (gcc_exec_prefix)
2567     {
2568       temp = (char *) xmalloc (strlen (gcc_exec_prefix) + strlen (spec_version)
2569                                + strlen (spec_machine) + 3);
2570       strcpy (temp, gcc_exec_prefix);
2571       strcat (temp, spec_machine);
2572       strcat (temp, "/");
2573       strcat (temp, spec_version);
2574       strcat (temp, "/");
2575       gcc_exec_prefix = temp;
2576     }
2577 }
2578 \f
2579 /* Process a spec string, accumulating and running commands.  */
2580
2581 /* These variables describe the input file name.
2582    input_file_number is the index on outfiles of this file,
2583    so that the output file name can be stored for later use by %o.
2584    input_basename is the start of the part of the input file
2585    sans all directory names, and basename_length is the number
2586    of characters starting there excluding the suffix .c or whatever.  */
2587
2588 static char *input_filename;
2589 static int input_file_number;
2590 static int input_filename_length;
2591 static int basename_length;
2592 static char *input_basename;
2593 static char *input_suffix;
2594
2595 /* These are variables used within do_spec and do_spec_1.  */
2596
2597 /* Nonzero if an arg has been started and not yet terminated
2598    (with space, tab or newline).  */
2599 static int arg_going;
2600
2601 /* Nonzero means %d or %g has been seen; the next arg to be terminated
2602    is a temporary file name.  */
2603 static int delete_this_arg;
2604
2605 /* Nonzero means %w has been seen; the next arg to be terminated
2606    is the output file name of this compilation.  */
2607 static int this_is_output_file;
2608
2609 /* Nonzero means %s has been seen; the next arg to be terminated
2610    is the name of a library file and we should try the standard
2611    search dirs for it.  */
2612 static int this_is_library_file;
2613
2614 /* Nonzero means that the input of this command is coming from a pipe.  */
2615 static int input_from_pipe;
2616
2617 /* Process the spec SPEC and run the commands specified therein.
2618    Returns 0 if the spec is successfully processed; -1 if failed.  */
2619
2620 static int
2621 do_spec (spec)
2622      char *spec;
2623 {
2624   int value;
2625
2626   clear_args ();
2627   arg_going = 0;
2628   delete_this_arg = 0;
2629   this_is_output_file = 0;
2630   this_is_library_file = 0;
2631   input_from_pipe = 0;
2632
2633   value = do_spec_1 (spec, 0, NULL_PTR);
2634
2635   /* Force out any unfinished command.
2636      If -pipe, this forces out the last command if it ended in `|'.  */
2637   if (value == 0)
2638     {
2639       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
2640         argbuf_index--;
2641
2642       if (argbuf_index > 0)
2643         value = execute ();
2644     }
2645
2646   return value;
2647 }
2648
2649 /* Process the sub-spec SPEC as a portion of a larger spec.
2650    This is like processing a whole spec except that we do
2651    not initialize at the beginning and we do not supply a
2652    newline by default at the end.
2653    INSWITCH nonzero means don't process %-sequences in SPEC;
2654    in this case, % is treated as an ordinary character.
2655    This is used while substituting switches.
2656    INSWITCH nonzero also causes SPC not to terminate an argument.
2657
2658    Value is zero unless a line was finished
2659    and the command on that line reported an error.  */
2660
2661 static int
2662 do_spec_1 (spec, inswitch, soft_matched_part)
2663      char *spec;
2664      int inswitch;
2665      char *soft_matched_part;
2666 {
2667   register char *p = spec;
2668   register int c;
2669   int i;
2670   char *string;
2671   int value;
2672
2673   while (c = *p++)
2674     /* If substituting a switch, treat all chars like letters.
2675        Otherwise, NL, SPC, TAB and % are special.  */
2676     switch (inswitch ? 'a' : c)
2677       {
2678       case '\n':
2679         /* End of line: finish any pending argument,
2680            then run the pending command if one has been started.  */
2681         if (arg_going)
2682           {
2683             obstack_1grow (&obstack, 0);
2684             string = obstack_finish (&obstack);
2685             if (this_is_library_file)
2686               string = find_file (string);
2687             store_arg (string, delete_this_arg, this_is_output_file);
2688             if (this_is_output_file)
2689               outfiles[input_file_number] = string;
2690           }
2691         arg_going = 0;
2692
2693         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
2694           {
2695             int i;
2696             for (i = 0; i < n_switches; i++)
2697               if (!strcmp (switches[i].part1, "pipe"))
2698                 break;
2699
2700             /* A `|' before the newline means use a pipe here,
2701                but only if -pipe was specified.
2702                Otherwise, execute now and don't pass the `|' as an arg.  */
2703             if (i < n_switches)
2704               {
2705                 input_from_pipe = 1;
2706                 switches[i].valid = 1;
2707                 break;
2708               }
2709             else
2710               argbuf_index--;
2711           }
2712
2713         if (argbuf_index > 0)
2714           {
2715             value = execute ();
2716             if (value)
2717               return value;
2718           }
2719         /* Reinitialize for a new command, and for a new argument.  */
2720         clear_args ();
2721         arg_going = 0;
2722         delete_this_arg = 0;
2723         this_is_output_file = 0;
2724         this_is_library_file = 0;
2725         input_from_pipe = 0;
2726         break;
2727
2728       case '|':
2729         /* End any pending argument.  */
2730         if (arg_going)
2731           {
2732             obstack_1grow (&obstack, 0);
2733             string = obstack_finish (&obstack);
2734             if (this_is_library_file)
2735               string = find_file (string);
2736             store_arg (string, delete_this_arg, this_is_output_file);
2737             if (this_is_output_file)
2738               outfiles[input_file_number] = string;
2739           }
2740
2741         /* Use pipe */
2742         obstack_1grow (&obstack, c);
2743         arg_going = 1;
2744         break;
2745
2746       case '\t':
2747       case ' ':
2748         /* Space or tab ends an argument if one is pending.  */
2749         if (arg_going)
2750           {
2751             obstack_1grow (&obstack, 0);
2752             string = obstack_finish (&obstack);
2753             if (this_is_library_file)
2754               string = find_file (string);
2755             store_arg (string, delete_this_arg, this_is_output_file);
2756             if (this_is_output_file)
2757               outfiles[input_file_number] = string;
2758           }
2759         /* Reinitialize for a new argument.  */
2760         arg_going = 0;
2761         delete_this_arg = 0;
2762         this_is_output_file = 0;
2763         this_is_library_file = 0;
2764         break;
2765
2766       case '%':
2767         switch (c = *p++)
2768           {
2769           case 0:
2770             fatal ("Invalid specification!  Bug in cc.");
2771
2772           case 'b':
2773             obstack_grow (&obstack, input_basename, basename_length);
2774             arg_going = 1;
2775             break;
2776
2777           case 'd':
2778             delete_this_arg = 2;
2779             break;
2780
2781           /* Dump out the directories specified with LIBRARY_PATH,
2782              followed by the absolute directories
2783              that we search for startfiles.  */
2784           case 'D':
2785             {
2786               struct prefix_list *pl = startfile_prefix.plist;
2787               int bufsize = 100;
2788               char *buffer = (char *) xmalloc (bufsize);
2789               int idx;
2790
2791               for (; pl; pl = pl->next)
2792                 {
2793 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
2794                   /* Used on systems which record the specified -L dirs
2795                      and use them to search for dynamic linking.  */
2796                   /* Relative directories always come from -B,
2797                      and it is better not to use them for searching
2798                      at run time.  In particular, stage1 loses  */
2799                   if (pl->prefix[0] != '/')
2800                     continue;
2801 #endif
2802                   if (machine_suffix)
2803                     {
2804                       if (is_directory (pl->prefix, machine_suffix, 1))
2805                         {
2806                           do_spec_1 ("-L", 0, NULL_PTR);
2807 #ifdef SPACE_AFTER_L_OPTION
2808                           do_spec_1 (" ", 0, NULL_PTR);
2809 #endif
2810                           do_spec_1 (pl->prefix, 1, NULL_PTR);
2811                           /* Remove slash from machine_suffix.  */
2812                           if (strlen (machine_suffix) >= bufsize)
2813                             bufsize = strlen (machine_suffix) * 2 + 1;
2814                           buffer = (char *) xrealloc (buffer, bufsize);
2815                           strcpy (buffer, machine_suffix);
2816                           idx = strlen (buffer);
2817                           if (buffer[idx - 1] == '/')
2818                             buffer[idx - 1] = 0;
2819                           do_spec_1 (buffer, 1, NULL_PTR);
2820                           /* Make this a separate argument.  */
2821                           do_spec_1 (" ", 0, NULL_PTR);
2822                         }
2823                     }
2824                   if (!pl->require_machine_suffix)
2825                     {
2826                       if (is_directory (pl->prefix, "", 1))
2827                         {
2828                           do_spec_1 ("-L", 0, NULL_PTR);
2829 #ifdef SPACE_AFTER_L_OPTION
2830                           do_spec_1 (" ", 0, NULL_PTR);
2831 #endif
2832                           /* Remove slash from pl->prefix.  */
2833                           if (strlen (pl->prefix) >= bufsize)
2834                             bufsize = strlen (pl->prefix) * 2 + 1;
2835                           buffer = (char *) xrealloc (buffer, bufsize);
2836                           strcpy (buffer, pl->prefix);
2837                           idx = strlen (buffer);
2838                           if (buffer[idx - 1] == '/')
2839                             buffer[idx - 1] = 0;
2840                           do_spec_1 (buffer, 1, NULL_PTR);
2841                           /* Make this a separate argument.  */
2842                           do_spec_1 (" ", 0, NULL_PTR);
2843                         }
2844                     }
2845                 }
2846               free (buffer);
2847             }
2848             break;
2849
2850           case 'e':
2851             /* {...:%efoo} means report an error with `foo' as error message
2852                and don't execute any more commands for this file.  */
2853             {
2854               char *q = p;
2855               char *buf;
2856               while (*p != 0 && *p != '\n') p++;
2857               buf = (char *) alloca (p - q + 1);
2858               strncpy (buf, q, p - q);
2859               buf[p - q] = 0;
2860               error ("%s", buf);
2861               return -1;
2862             }
2863             break;
2864
2865           case 'g':
2866           case 'u':
2867           case 'U':
2868             if (save_temps_flag)
2869               obstack_grow (&obstack, input_basename, basename_length);
2870             else
2871               {
2872 #ifdef MKTEMP_EACH_FILE
2873                 /* ??? This has a problem: the total number of
2874                    values mktemp can return is limited.
2875                    That matters for the names of object files.
2876                    In 2.4, do something about that.  */
2877                 struct temp_name *t;
2878                 char *suffix = p;
2879                 while (*p == '.' || isalpha (*p))
2880                   p++;
2881
2882                 /* See if we already have an association of %g/%u/%U and
2883                    suffix.  */
2884                 for (t = temp_names; t; t = t->next)
2885                   if (t->length == p - suffix
2886                       && strncmp (t->suffix, suffix, p - suffix) == 0
2887                       && t->unique == (c != 'g'))
2888                     break;
2889
2890                 /* Make a new association if needed.  %u requires one.  */
2891                 if (t == 0 || c == 'u')
2892                   {
2893                     if (t == 0)
2894                       {
2895                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
2896                         t->next = temp_names;
2897                         temp_names = t;
2898                       }
2899                     t->length = p - suffix;
2900                     t->suffix = save_string (suffix, p - suffix);
2901                     t->unique = (c != 'g');
2902                     choose_temp_base ();
2903                     t->filename = temp_filename;
2904                     t->filename_length = temp_filename_length;
2905                   }
2906
2907                 obstack_grow (&obstack, t->filename, t->filename_length);
2908                 delete_this_arg = 1;
2909 #else
2910                 obstack_grow (&obstack, temp_filename, temp_filename_length);
2911                 if (c == 'u' || c == 'U')
2912                   {
2913                     static int unique;
2914                     char buff[9];
2915                     if (c == 'u')
2916                       unique++;
2917                     sprintf (buff, "%d", unique);
2918                     obstack_grow (&obstack, buff, strlen (buff));
2919                   }
2920 #endif
2921                 delete_this_arg = 1;
2922               }
2923             arg_going = 1;
2924             break;
2925
2926           case 'i':
2927             obstack_grow (&obstack, input_filename, input_filename_length);
2928             arg_going = 1;
2929             break;
2930
2931           case 'I':
2932             if (gcc_exec_prefix)
2933               {
2934                 do_spec_1 ("-iprefix", 1, NULL_PTR);
2935                 /* Make this a separate argument.  */
2936                 do_spec_1 (" ", 0, NULL_PTR);
2937                 do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
2938                 do_spec_1 (" ", 0, NULL_PTR);
2939               }
2940             break;
2941
2942           case 'o':
2943             {
2944               register int f;
2945               for (f = 0; f < n_infiles; f++)
2946                 store_arg (outfiles[f], 0, 0);
2947             }
2948             break;
2949
2950           case 's':
2951             this_is_library_file = 1;
2952             break;
2953
2954           case 'w':
2955             this_is_output_file = 1;
2956             break;
2957
2958           case 'W':
2959             {
2960               int index = argbuf_index;
2961               /* Handle the {...} following the %W.  */
2962               if (*p != '{')
2963                 abort ();
2964               p = handle_braces (p + 1);
2965               if (p == 0)
2966                 return -1;
2967               /* If any args were output, mark the last one for deletion
2968                  on failure.  */
2969               if (argbuf_index != index)
2970                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
2971               break;
2972             }
2973
2974           /* %x{OPTION} records OPTION for %X to output.  */
2975           case 'x':
2976             {
2977               char *p1 = p;
2978               char *string;
2979
2980               /* Skip past the option value and make a copy.  */
2981               if (*p != '{')
2982                 abort ();
2983               while (*p++ != '}')
2984                 ;
2985               string = save_string (p1 + 1, p - p1 - 2);
2986
2987               /* See if we already recorded this option.  */
2988               for (i = 0; i < n_linker_options; i++)
2989                 if (! strcmp (string, linker_options[i]))
2990                   {
2991                     free (string);
2992                     return 0;
2993                   }
2994
2995               /* This option is new; add it.  */
2996               n_linker_options++;
2997               if (!linker_options)
2998                 linker_options
2999                   = (char **) xmalloc (n_linker_options * sizeof (char **));
3000               else
3001                 linker_options
3002                   = (char **) xrealloc (linker_options,
3003                                         n_linker_options * sizeof (char **));
3004
3005               linker_options[n_linker_options - 1] = string;
3006             }
3007             break;
3008
3009           /* Dump out the options accumulated previously using %x,
3010              -Xlinker and -Wl,.  */
3011           case 'X':
3012             for (i = 0; i < n_linker_options; i++)
3013               {
3014                 do_spec_1 (linker_options[i], 1, NULL_PTR);
3015                 /* Make each accumulated option a separate argument.  */
3016                 do_spec_1 (" ", 0, NULL_PTR);
3017               }
3018             break;
3019
3020           /* Dump out the options accumulated previously using -Wa,.  */
3021           case 'Y':
3022             for (i = 0; i < n_assembler_options; i++)
3023               {
3024                 do_spec_1 (assembler_options[i], 1, NULL_PTR);
3025                 /* Make each accumulated option a separate argument.  */
3026                 do_spec_1 (" ", 0, NULL_PTR);
3027               }
3028             break;
3029
3030             /* Here are digits and numbers that just process
3031                a certain constant string as a spec.  */
3032
3033           case '1':
3034             value = do_spec_1 (cc1_spec, 0, NULL_PTR);
3035             if (value != 0)
3036               return value;
3037             break;
3038
3039           case '2':
3040             value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
3041             if (value != 0)
3042               return value;
3043             break;
3044
3045           case 'a':
3046             value = do_spec_1 (asm_spec, 0, NULL_PTR);
3047             if (value != 0)
3048               return value;
3049             break;
3050
3051           case 'A':
3052             value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
3053             if (value != 0)
3054               return value;
3055             break;
3056
3057           case 'c':
3058             value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
3059             if (value != 0)
3060               return value;
3061             break;
3062
3063           case 'C':
3064             value = do_spec_1 (cpp_spec, 0, NULL_PTR);
3065             if (value != 0)
3066               return value;
3067             break;
3068
3069           case 'E':
3070             value = do_spec_1 (endfile_spec, 0, NULL_PTR);
3071             if (value != 0)
3072               return value;
3073             break;
3074
3075           case 'l':
3076             value = do_spec_1 (link_spec, 0, NULL_PTR);
3077             if (value != 0)
3078               return value;
3079             break;
3080
3081           case 'L':
3082             value = do_spec_1 (lib_spec, 0, NULL_PTR);
3083             if (value != 0)
3084               return value;
3085             break;
3086
3087           case 'p':
3088             {
3089               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
3090               char *buf = x;
3091               char *y;
3092
3093               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
3094               y = cpp_predefines;
3095               while (*y != 0)
3096                 {
3097                   if (! strncmp (y, "-D", 2))
3098                     /* Copy the whole option.  */
3099                     while (*y && *y != ' ' && *y != '\t')
3100                       *x++ = *y++;
3101                   else if (*y == ' ' || *y == '\t')
3102                     /* Copy whitespace to the result.  */
3103                     *x++ = *y++;
3104                   /* Don't copy other options.  */
3105                   else
3106                     y++;
3107                 }
3108
3109               *x = 0;
3110
3111               value = do_spec_1 (buf, 0, NULL_PTR);
3112               if (value != 0)
3113                 return value;
3114             }
3115             break;
3116
3117           case 'P':
3118             {
3119               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
3120               char *buf = x;
3121               char *y;
3122
3123               /* Copy all of CPP_PREDEFINES into BUF,
3124                  but put __ after every -D and at the end of each arg.  */
3125               y = cpp_predefines;
3126               while (*y != 0)
3127                 {
3128                   if (! strncmp (y, "-D", 2))
3129                     {
3130                       int flag = 0;
3131
3132                       *x++ = *y++;
3133                       *x++ = *y++;
3134
3135                       if (strncmp (y, "__", 2))
3136                         {
3137                           /* Stick __ at front of macro name.  */
3138                           *x++ = '_';
3139                           *x++ = '_';
3140                           /* Arrange to stick __ at the end as well.  */
3141                           flag = 1;
3142                         }
3143
3144                       /* Copy the macro name.  */
3145                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
3146                         *x++ = *y++;
3147
3148                       if (flag)
3149                         {
3150                           *x++ = '_';
3151                           *x++ = '_';
3152                         }
3153
3154                       /* Copy the value given, if any.  */
3155                       while (*y && *y != ' ' && *y != '\t')
3156                         *x++ = *y++;
3157                     }
3158                   else if (*y == ' ' || *y == '\t')
3159                     /* Copy whitespace to the result.  */
3160                     *x++ = *y++;
3161                   /* Don't copy -A options  */
3162                   else
3163                     y++;
3164                 }
3165               *x++ = ' ';
3166
3167               /* Copy all of CPP_PREDEFINES into BUF,
3168                  but put __ after every -D.  */
3169               y = cpp_predefines;
3170               while (*y != 0)
3171                 {
3172                   if (! strncmp (y, "-D", 2))
3173                     {
3174                       *x++ = *y++;
3175                       *x++ = *y++;
3176
3177                       if (strncmp (y, "__", 2))
3178                         {
3179                           /* Stick __ at front of macro name.  */
3180                           *x++ = '_';
3181                           *x++ = '_';
3182                         }
3183
3184                       /* Copy the macro name.  */
3185                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
3186                         *x++ = *y++;
3187
3188                       /* Copy the value given, if any.  */
3189                       while (*y && *y != ' ' && *y != '\t')
3190                         *x++ = *y++;
3191                     }
3192                   else if (*y == ' ' || *y == '\t')
3193                     /* Copy whitespace to the result.  */
3194                     *x++ = *y++;
3195                   /* Don't copy -A options  */
3196                   else
3197                     y++;
3198                 }
3199               *x++ = ' ';
3200
3201               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
3202               y = cpp_predefines;
3203               while (*y != 0)
3204                 {
3205                   if (! strncmp (y, "-A", 2))
3206                     /* Copy the whole option.  */
3207                     while (*y && *y != ' ' && *y != '\t')
3208                       *x++ = *y++;
3209                   else if (*y == ' ' || *y == '\t')
3210                     /* Copy whitespace to the result.  */
3211                     *x++ = *y++;
3212                   /* Don't copy other options.  */
3213                   else
3214                     y++;
3215                 }
3216
3217               *x = 0;
3218
3219               value = do_spec_1 (buf, 0, NULL_PTR);
3220               if (value != 0)
3221                 return value;
3222             }
3223             break;
3224
3225           case 'S':
3226             value = do_spec_1 (startfile_spec, 0, NULL_PTR);
3227             if (value != 0)
3228               return value;
3229             break;
3230
3231             /* Here we define characters other than letters and digits.  */
3232
3233           case '{':
3234             p = handle_braces (p);
3235             if (p == 0)
3236               return -1;
3237             break;
3238
3239           case '%':
3240             obstack_1grow (&obstack, '%');
3241             break;
3242
3243           case '*':
3244             do_spec_1 (soft_matched_part, 1, NULL_PTR);
3245             do_spec_1 (" ", 0, NULL_PTR);
3246             break;
3247
3248             /* Process a string found as the value of a spec given by name.
3249                This feature allows individual machine descriptions
3250                to add and use their own specs.
3251                %[...] modifies -D options the way %P does;
3252                %(...) uses the spec unmodified.  */
3253           case '(':
3254           case '[':
3255             {
3256               char *name = p;
3257               struct spec_list *sl;
3258               int len;
3259
3260               /* The string after the S/P is the name of a spec that is to be
3261                  processed. */
3262               while (*p && *p != ')' && *p != ']')
3263                 p++;
3264
3265               /* See if it's in the list */
3266               for (len = p - name, sl = specs; sl; sl = sl->next)
3267                 if (strncmp (sl->name, name, len) == 0 && !sl->name[len])
3268                   {
3269                     name = sl->spec;
3270                     break;
3271                   }
3272
3273               if (sl)
3274                 {
3275                   if (c == '(')
3276                     {
3277                       value = do_spec_1 (name, 0, NULL_PTR);
3278                       if (value != 0)
3279                         return value;
3280                     }
3281                   else
3282                     {
3283                       char *x = (char *) alloca (strlen (name) * 2 + 1);
3284                       char *buf = x;
3285                       char *y = name;
3286
3287                       /* Copy all of NAME into BUF, but put __ after
3288                          every -D and at the end of each arg,  */
3289                       while (1)
3290                         {
3291                           if (! strncmp (y, "-D", 2))
3292                             {
3293                               *x++ = '-';
3294                               *x++ = 'D';
3295                               *x++ = '_';
3296                               *x++ = '_';
3297                               y += 2;
3298                             }
3299                           else if (*y == ' ' || *y == 0)
3300                             {
3301                               *x++ = '_';
3302                               *x++ = '_';
3303                               if (*y == 0)
3304                                 break;
3305                               else
3306                                 *x++ = *y++;
3307                             }
3308                           else
3309                             *x++ = *y++;
3310                         }
3311                       *x = 0;
3312
3313                       value = do_spec_1 (buf, 0, NULL_PTR);
3314                       if (value != 0)
3315                         return value;
3316                     }
3317                 }
3318
3319               /* Discard the closing paren or bracket.  */
3320               if (*p)
3321                 p++;
3322             }
3323             break;
3324
3325           case '|':
3326             if (input_from_pipe)
3327               do_spec_1 ("-", 0, NULL_PTR);
3328             break;
3329
3330           default:
3331             abort ();
3332           }
3333         break;
3334
3335       case '\\':
3336         /* Backslash: treat next character as ordinary.  */
3337         c = *p++;
3338
3339         /* fall through */
3340       default:
3341         /* Ordinary character: put it into the current argument.  */
3342         obstack_1grow (&obstack, c);
3343         arg_going = 1;
3344       }
3345
3346   return 0;             /* End of string */
3347 }
3348
3349 /* Return 0 if we call do_spec_1 and that returns -1.  */
3350
3351 static char *
3352 handle_braces (p)
3353      register char *p;
3354 {
3355   register char *q;
3356   char *filter;
3357   int pipe = 0;
3358   int negate = 0;
3359   int suffix = 0;
3360
3361   if (*p == '|')
3362     /* A `|' after the open-brace means,
3363        if the test fails, output a single minus sign rather than nothing.
3364        This is used in %{|!pipe:...}.  */
3365     pipe = 1, ++p;
3366
3367   if (*p == '!')
3368     /* A `!' after the open-brace negates the condition:
3369        succeed if the specified switch is not present.  */
3370     negate = 1, ++p;
3371
3372   if (*p == '.')
3373     /* A `.' after the open-brace means test against the current suffix.  */
3374     {
3375       if (pipe)
3376         abort ();
3377
3378       suffix = 1;
3379       ++p;
3380     }
3381
3382   filter = p;
3383   while (*p != ':' && *p != '}') p++;
3384   if (*p != '}')
3385     {
3386       register int count = 1;
3387       q = p + 1;
3388       while (count > 0)
3389         {
3390           if (*q == '{')
3391             count++;
3392           else if (*q == '}')
3393             count--;
3394           else if (*q == 0)
3395             abort ();
3396           q++;
3397         }
3398     }
3399   else
3400     q = p + 1;
3401
3402   if (suffix)
3403     {
3404       int found = (input_suffix != 0
3405                    && strlen (input_suffix) == p - filter
3406                    && strncmp (input_suffix, filter, p - filter) == 0);
3407
3408       if (p[0] == '}')
3409         abort ();
3410
3411       if (negate != found
3412           && do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL_PTR) < 0)
3413         return 0;
3414
3415       return q;
3416     }
3417   else if (p[-1] == '*' && p[0] == '}')
3418     {
3419       /* Substitute all matching switches as separate args.  */
3420       register int i;
3421       --p;
3422       for (i = 0; i < n_switches; i++)
3423         if (!strncmp (switches[i].part1, filter, p - filter))
3424           give_switch (i, 0);
3425     }
3426   else
3427     {
3428       /* Test for presence of the specified switch.  */
3429       register int i;
3430       int present = 0;
3431
3432       /* If name specified ends in *, as in {x*:...},
3433          check for %* and handle that case.  */
3434       if (p[-1] == '*' && !negate)
3435         {
3436           int substitution;
3437           char *r = p;
3438
3439           /* First see whether we have %*.  */
3440           substitution = 0;
3441           while (r < q)
3442             {
3443               if (*r == '%' && r[1] == '*')
3444                 substitution = 1;
3445               r++;
3446             }
3447           /* If we do, handle that case.  */
3448           if (substitution)
3449             {
3450               /* Substitute all matching switches as separate args.
3451                  But do this by substituting for %*
3452                  in the text that follows the colon.  */
3453
3454               unsigned hard_match_len = p - filter - 1;
3455               char *string = save_string (p + 1, q - p - 2);
3456
3457               for (i = 0; i < n_switches; i++)
3458                 if (!strncmp (switches[i].part1, filter, hard_match_len))
3459                   {
3460                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
3461                     /* Pass any arguments this switch has.  */
3462                     give_switch (i, 1);
3463                   }
3464
3465               return q;
3466             }
3467         }
3468
3469       /* If name specified ends in *, as in {x*:...},
3470          check for presence of any switch name starting with x.  */
3471       if (p[-1] == '*')
3472         {
3473           for (i = 0; i < n_switches; i++)
3474             {
3475               unsigned hard_match_len = p - filter - 1;
3476
3477               if (!strncmp (switches[i].part1, filter, hard_match_len))
3478                 {
3479                   switches[i].valid = 1;
3480                   present = 1;
3481                 }
3482             }
3483         }
3484       /* Otherwise, check for presence of exact name specified.  */
3485       else
3486         {
3487           for (i = 0; i < n_switches; i++)
3488             {
3489               if (!strncmp (switches[i].part1, filter, p - filter)
3490                   && switches[i].part1[p - filter] == 0)
3491                 {
3492                   switches[i].valid = 1;
3493                   present = 1;
3494                   break;
3495                 }
3496             }
3497         }
3498
3499       /* If it is as desired (present for %{s...}, absent for %{-s...})
3500          then substitute either the switch or the specified
3501          conditional text.  */
3502       if (present != negate)
3503         {
3504           if (*p == '}')
3505             {
3506               give_switch (i, 0);
3507             }
3508           else
3509             {
3510               if (do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL_PTR) < 0)
3511                 return 0;
3512             }
3513         }
3514       else if (pipe)
3515         {
3516           /* Here if a %{|...} conditional fails: output a minus sign,
3517              which means "standard output" or "standard input".  */
3518           do_spec_1 ("-", 0, NULL_PTR);
3519         }
3520     }
3521
3522   return q;
3523 }
3524
3525 /* Pass a switch to the current accumulating command
3526    in the same form that we received it.
3527    SWITCHNUM identifies the switch; it is an index into
3528    the vector of switches gcc received, which is `switches'.
3529    This cannot fail since it never finishes a command line.
3530
3531    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
3532
3533 static void
3534 give_switch (switchnum, omit_first_word)
3535      int switchnum;
3536      int omit_first_word;
3537 {
3538   if (!omit_first_word)
3539     {
3540       do_spec_1 ("-", 0, NULL_PTR);
3541       do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
3542     }
3543   do_spec_1 (" ", 0, NULL_PTR);
3544   if (switches[switchnum].args != 0)
3545     {
3546       char **p;
3547       for (p = switches[switchnum].args; *p; p++)
3548         {
3549           do_spec_1 (*p, 1, NULL_PTR);
3550           do_spec_1 (" ", 0, NULL_PTR);
3551         }
3552     }
3553   switches[switchnum].valid = 1;
3554 }
3555 \f
3556 /* Search for a file named NAME trying various prefixes including the
3557    user's -B prefix and some standard ones.
3558    Return the absolute file name found.  If nothing is found, return NAME.  */
3559
3560 static char *
3561 find_file (name)
3562      char *name;
3563 {
3564   char *newname;
3565
3566   newname = find_a_file (&startfile_prefix, name, R_OK);
3567   return newname ? newname : name;
3568 }
3569
3570 /* Determine whether a directory exists.  If LINKER, return 0 for
3571    certain fixed names not needed by the linker.  If not LINKER, it is
3572    only important to return 0 if the host machine has a small ARG_MAX
3573    limit.  */
3574
3575 static int
3576 is_directory (path1, path2, linker)
3577      char *path1;
3578      char *path2;
3579      int linker;
3580 {
3581   int len1 = strlen (path1);
3582   int len2 = strlen (path2);
3583   char *path = (char *) alloca (3 + len1 + len2);
3584   char *cp;
3585   struct stat st;
3586
3587 #ifndef SMALL_ARG_MAX
3588   if (! linker)
3589     return 1;
3590 #endif
3591
3592   /* Construct the path from the two parts.  Ensure the string ends with "/.".
3593      The resulting path will be a directory even if the given path is a
3594      symbolic link.  */
3595   bcopy (path1, path, len1);
3596   bcopy (path2, path + len1, len2);
3597   cp = path + len1 + len2;
3598   if (cp[-1] != '/')
3599     *cp++ = '/';
3600   *cp++ = '.';
3601   *cp = '\0';
3602
3603   /* Exclude directories that the linker is known to search.  */
3604   if (linker
3605       && ((cp - path == 6 && strcmp (path, "/lib/.") == 0)
3606           || (cp - path == 10 && strcmp (path, "/usr/lib/.") == 0)))
3607     return 0;
3608
3609   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
3610 }
3611 \f
3612 /* On fatal signals, delete all the temporary files.  */
3613
3614 static void
3615 fatal_error (signum)
3616      int signum;
3617 {
3618   signal (signum, SIG_DFL);
3619   delete_failure_queue ();
3620   delete_temp_files ();
3621   /* Get the same signal again, this time not handled,
3622      so its normal effect occurs.  */
3623   kill (getpid (), signum);
3624 }
3625
3626 int
3627 main (argc, argv)
3628      int argc;
3629      char **argv;
3630 {
3631   register int i;
3632   int j;
3633   int value;
3634   int linker_was_run = 0;
3635   char *explicit_link_files;
3636   char *specs_file;
3637   char *p;
3638
3639   p = argv[0] + strlen (argv[0]);
3640   while (p != argv[0] && p[-1] != '/') --p;
3641   programname = p;
3642
3643   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
3644     signal (SIGINT, fatal_error);
3645 #ifdef SIGHUP
3646   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
3647     signal (SIGHUP, fatal_error);
3648 #endif
3649   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
3650     signal (SIGTERM, fatal_error);
3651 #ifdef SIGPIPE
3652   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
3653     signal (SIGPIPE, fatal_error);
3654 #endif
3655
3656   argbuf_length = 10;
3657   argbuf = (char **) xmalloc (argbuf_length * sizeof (char *));
3658
3659   obstack_init (&obstack);
3660
3661   /* Set up to remember the pathname of gcc and any options
3662      needed for collect.  We use argv[0] instead of programname because
3663      we need the complete pathname.  */
3664   obstack_init (&collect_obstack);
3665   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
3666   obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
3667   putenv (obstack_finish (&collect_obstack));
3668
3669   /* Choose directory for temp files.  */
3670
3671   choose_temp_base ();
3672
3673   /* Make a table of what switches there are (switches, n_switches).
3674      Make a table of specified input files (infiles, n_infiles).
3675      Decode switches that are handled locally.  */
3676
3677   process_command (argc, argv);
3678
3679   /* Initialize the vector of specs to just the default.
3680      This means one element containing 0s, as a terminator.  */
3681
3682   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
3683   bcopy (default_compilers, compilers, sizeof default_compilers);
3684   n_compilers = n_default_compilers;
3685
3686   /* Read specs from a file if there is one.  */
3687
3688   machine_suffix = concat (spec_machine, "/", concat (spec_version, "/", ""));
3689   just_machine_suffix = concat (spec_machine, "/", "");
3690
3691   specs_file = find_a_file (&startfile_prefix, "specs", R_OK);
3692   /* Read the specs file unless it is a default one.  */
3693   if (specs_file != 0 && strcmp (specs_file, "specs"))
3694     read_specs (specs_file);
3695
3696   /* If not cross-compiling, look for startfiles in the standard places.  */
3697   /* The fact that these are done here, after reading the specs file,
3698      means that it cannot be found in these directories.
3699      But that's okay.  It should never be there anyway.  */
3700   if (!cross_compile)
3701     {
3702 #ifdef MD_EXEC_PREFIX
3703       add_prefix (&exec_prefix, md_exec_prefix, 0, 0, NULL_PTR);
3704       add_prefix (&startfile_prefix, md_exec_prefix, 0, 0, NULL_PTR);
3705 #endif
3706
3707 #ifdef MD_STARTFILE_PREFIX
3708       add_prefix (&startfile_prefix, md_startfile_prefix, 0, 0, NULL_PTR);
3709 #endif
3710
3711 #ifdef MD_STARTFILE_PREFIX_1
3712       add_prefix (&startfile_prefix, md_startfile_prefix_1, 0, 0, NULL_PTR);
3713 #endif
3714
3715       add_prefix (&startfile_prefix, standard_startfile_prefix, 0, 0,
3716                   NULL_PTR);
3717       add_prefix (&startfile_prefix, standard_startfile_prefix_1, 0, 0,
3718                   NULL_PTR);
3719       add_prefix (&startfile_prefix, standard_startfile_prefix_2, 0, 0,
3720                   NULL_PTR);
3721 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
3722       add_prefix (&startfile_prefix, "./", 0, 1, NULL_PTR);
3723 #endif
3724     }
3725
3726   /* Now we have the specs.
3727      Set the `valid' bits for switches that match anything in any spec.  */
3728
3729   validate_all_switches ();
3730
3731   /* Warn about any switches that no pass was interested in.  */
3732
3733   for (i = 0; i < n_switches; i++)
3734     if (! switches[i].valid)
3735       error ("unrecognized option `-%s'", switches[i].part1);
3736
3737   if (print_libgcc_file_name)
3738     {
3739       printf ("%s\n", find_file ("libgcc.a"));
3740       exit (0);
3741     }
3742
3743   /* Obey some of the options.  */
3744
3745   if (verbose_flag)
3746     {
3747       fprintf (stderr, "gcc version %s\n", version_string);
3748       if (n_infiles == 0)
3749         exit (0);
3750     }
3751
3752   if (n_infiles == 0)
3753     fatal ("No input files");
3754
3755   /* Make a place to record the compiler output file names
3756      that correspond to the input files.  */
3757
3758   outfiles = (char **) xmalloc (n_infiles * sizeof (char *));
3759   bzero (outfiles, n_infiles * sizeof (char *));
3760
3761   /* Record which files were specified explicitly as link input.  */
3762
3763   explicit_link_files = xmalloc (n_infiles);
3764   bzero (explicit_link_files, n_infiles);
3765
3766   for (i = 0; i < n_infiles; i++)
3767     {
3768       register struct compiler *cp = 0;
3769       int this_file_error = 0;
3770
3771       /* Tell do_spec what to substitute for %i.  */
3772
3773       input_filename = infiles[i].name;
3774       input_filename_length = strlen (input_filename);
3775       input_file_number = i;
3776
3777       /* Use the same thing in %o, unless cp->spec says otherwise.  */
3778
3779       outfiles[i] = input_filename;
3780
3781       /* Figure out which compiler from the file's suffix.  */
3782
3783       cp = lookup_compiler (infiles[i].name, input_filename_length,
3784                             infiles[i].language);
3785
3786       if (cp)
3787         {
3788           /* Ok, we found an applicable compiler.  Run its spec.  */
3789           /* First say how much of input_filename to substitute for %b  */
3790           register char *p;
3791           int len;
3792
3793           input_basename = input_filename;
3794           for (p = input_filename; *p; p++)
3795             if (*p == '/')
3796               input_basename = p + 1;
3797
3798           /* Find a suffix starting with the last period,
3799              and set basename_length to exclude that suffix.  */
3800           basename_length = strlen (input_basename);
3801           p = input_basename + basename_length;
3802           while (p != input_basename && *p != '.') --p;
3803           if (*p == '.' && p != input_basename)
3804             {
3805               basename_length = p - input_basename;
3806               input_suffix = p + 1;
3807             }
3808           else
3809             input_suffix = "";
3810
3811           len = 0;
3812           for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
3813             if (cp->spec[j])
3814               len += strlen (cp->spec[j]);
3815
3816           p = (char *) xmalloc (len + 1);
3817
3818           len = 0;
3819           for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
3820             if (cp->spec[j])
3821               {
3822                 strcpy (p + len, cp->spec[j]);
3823                 len += strlen (cp->spec[j]);
3824               }
3825
3826           value = do_spec (p);
3827           free (p);
3828           if (value < 0)
3829             this_file_error = 1;
3830         }
3831
3832       /* If this file's name does not contain a recognized suffix,
3833          record it as explicit linker input.  */
3834
3835       else
3836         explicit_link_files[i] = 1;
3837
3838       /* Clear the delete-on-failure queue, deleting the files in it
3839          if this compilation failed.  */
3840
3841       if (this_file_error)
3842         {
3843           delete_failure_queue ();
3844           error_count++;
3845         }
3846       /* If this compilation succeeded, don't delete those files later.  */
3847       clear_failure_queue ();
3848     }
3849
3850   /* Run ld to link all the compiler output files.  */
3851
3852   if (error_count == 0)
3853     {
3854       int tmp = execution_count;
3855       int i;
3856       int first_time;
3857
3858       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
3859          for collect.  */
3860       putenv_from_prefixes (&exec_prefix, "COMPILER_PATH=");
3861       putenv_from_prefixes (&startfile_prefix, "LIBRARY_PATH=");
3862
3863       /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
3864          the compiler.  */
3865       obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
3866                     sizeof ("COLLECT_GCC_OPTIONS=")-1);
3867
3868       first_time = TRUE;
3869       for (i = 0; i < n_switches; i++)
3870         {
3871           char **args;
3872           if (!first_time)
3873             obstack_grow (&collect_obstack, " ", 1);
3874
3875           first_time = FALSE;
3876           obstack_grow (&collect_obstack, "-", 1);
3877           obstack_grow (&collect_obstack, switches[i].part1,
3878                         strlen (switches[i].part1));
3879
3880           for (args = switches[i].args; args && *args; args++)
3881             {
3882               obstack_grow (&collect_obstack, " ", 1);
3883               obstack_grow (&collect_obstack, *args, strlen (*args));
3884             }
3885         }
3886       obstack_grow (&collect_obstack, "\0", 1);
3887       putenv (obstack_finish (&collect_obstack));
3888
3889       value = do_spec (link_command_spec);
3890       if (value < 0)
3891         error_count = 1;
3892       linker_was_run = (tmp != execution_count);
3893     }
3894
3895   /* Warn if a -B option was specified but the prefix was never used.  */
3896   unused_prefix_warnings (&exec_prefix);
3897   unused_prefix_warnings (&startfile_prefix);
3898
3899   /* If options said don't run linker,
3900      complain about input files to be given to the linker.  */
3901
3902   if (! linker_was_run && error_count == 0)
3903     for (i = 0; i < n_infiles; i++)
3904       if (explicit_link_files[i])
3905         error ("%s: linker input file unused since linking not done",
3906                outfiles[i]);
3907
3908   /* Delete some or all of the temporary files we made.  */
3909
3910   if (error_count)
3911     delete_failure_queue ();
3912   delete_temp_files ();
3913
3914   exit (error_count > 0 ? (signal_count ? 2 : 1) : 0);
3915   /* NOTREACHED */
3916   return 0;
3917 }
3918
3919 /* Find the proper compilation spec for the file name NAME,
3920    whose length is LENGTH.  LANGUAGE is the specified language,
3921    or 0 if none specified.  */
3922
3923 static struct compiler *
3924 lookup_compiler (name, length, language)
3925      char *name;
3926      int length;
3927      char *language;
3928 {
3929   struct compiler *cp;
3930
3931   /* Look for the language, if one is spec'd.  */
3932   if (language != 0)
3933     {
3934       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
3935         {
3936           if (language != 0)
3937             {
3938               if (cp->suffix[0] == '@'
3939                   && !strcmp (cp->suffix + 1, language))
3940                 return cp;
3941             }
3942         }
3943       error ("language %s not recognized", language);
3944     }
3945
3946   /* Look for a suffix.  */
3947   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
3948     {
3949       if (/* The suffix `-' matches only the file name `-'.  */
3950           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
3951           ||
3952           (strlen (cp->suffix) < length
3953            /* See if the suffix matches the end of NAME.  */
3954            && !strcmp (cp->suffix,
3955                        name + length - strlen (cp->suffix))))
3956         {
3957           if (cp->spec[0][0] == '@')
3958             {
3959               struct compiler *new;
3960               /* An alias entry maps a suffix to a language.
3961                  Search for the language; pass 0 for NAME and LENGTH
3962                  to avoid infinite recursion if language not found.
3963                  Construct the new compiler spec.  */
3964               language = cp->spec[0] + 1;
3965               new = (struct compiler *) xmalloc (sizeof (struct compiler));
3966               new->suffix = cp->suffix;
3967               bcopy (lookup_compiler (NULL_PTR, 0, language)->spec,
3968                      new->spec, sizeof new->spec);
3969               return new;
3970             }
3971           /* A non-alias entry: return it.  */
3972           return cp;
3973         }
3974     }
3975
3976   return 0;
3977 }
3978 \f
3979 char *
3980 xmalloc (size)
3981      unsigned size;
3982 {
3983   register char *value = (char *) malloc (size);
3984   if (value == 0)
3985     fatal ("virtual memory exhausted");
3986   return value;
3987 }
3988
3989 char *
3990 xrealloc (ptr, size)
3991      char *ptr;
3992      unsigned size;
3993 {
3994   register char *value = (char *) realloc (ptr, size);
3995   if (value == 0)
3996     fatal ("virtual memory exhausted");
3997   return value;
3998 }
3999
4000 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3.  */
4001
4002 static char *
4003 concat (s1, s2, s3)
4004      char *s1, *s2, *s3;
4005 {
4006   int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
4007   char *result = xmalloc (len1 + len2 + len3 + 1);
4008
4009   strcpy (result, s1);
4010   strcpy (result + len1, s2);
4011   strcpy (result + len1 + len2, s3);
4012   *(result + len1 + len2 + len3) = 0;
4013
4014   return result;
4015 }
4016
4017 static char *
4018 save_string (s, len)
4019      char *s;
4020      int len;
4021 {
4022   register char *result = xmalloc (len + 1);
4023
4024   bcopy (s, result, len);
4025   result[len] = 0;
4026   return result;
4027 }
4028
4029 static void
4030 pfatal_with_name (name)
4031      char *name;
4032 {
4033   char *s;
4034
4035   if (errno < sys_nerr)
4036     s = concat ("%s: ", sys_errlist[errno], "");
4037   else
4038     s = "cannot open %s";
4039   fatal (s, name);
4040 }
4041
4042 static void
4043 perror_with_name (name)
4044      char *name;
4045 {
4046   char *s;
4047
4048   if (errno < sys_nerr)
4049     s = concat ("%s: ", sys_errlist[errno], "");
4050   else
4051     s = "cannot open %s";
4052   error (s, name);
4053 }
4054
4055 static void
4056 perror_exec (name)
4057      char *name;
4058 {
4059   char *s;
4060
4061   if (errno < sys_nerr)
4062     s = concat ("installation problem, cannot exec %s: ",
4063                 sys_errlist[errno], "");
4064   else
4065     s = "installation problem, cannot exec %s";
4066   error (s, name);
4067 }
4068
4069 /* More 'friendly' abort that prints the line and file.
4070    config.h can #define abort fancy_abort if you like that sort of thing.  */
4071
4072 void
4073 fancy_abort ()
4074 {
4075   fatal ("Internal gcc abort.");
4076 }
4077 \f
4078 #ifdef HAVE_VPRINTF
4079
4080 /* Output an error message and exit */
4081
4082 static void
4083 fatal (va_alist)
4084      va_dcl
4085 {
4086   va_list ap;
4087   char *format;
4088
4089   va_start (ap);
4090   format = va_arg (ap, char *);
4091   fprintf (stderr, "%s: ", programname);
4092   vfprintf (stderr, format, ap);
4093   va_end (ap);
4094   fprintf (stderr, "\n");
4095   delete_temp_files ();
4096   exit (1);
4097 }
4098
4099 static void
4100 error (va_alist)
4101      va_dcl
4102 {
4103   va_list ap;
4104   char *format;
4105
4106   va_start (ap);
4107   format = va_arg (ap, char *);
4108   fprintf (stderr, "%s: ", programname);
4109   vfprintf (stderr, format, ap);
4110   va_end (ap);
4111
4112   fprintf (stderr, "\n");
4113 }
4114
4115 #else /* not HAVE_VPRINTF */
4116
4117 static void
4118 fatal (msg, arg1, arg2)
4119      char *msg, *arg1, *arg2;
4120 {
4121   error (msg, arg1, arg2);
4122   delete_temp_files ();
4123   exit (1);
4124 }
4125
4126 static void
4127 error (msg, arg1, arg2)
4128      char *msg, *arg1, *arg2;
4129 {
4130   fprintf (stderr, "%s: ", programname);
4131   fprintf (stderr, msg, arg1, arg2);
4132   fprintf (stderr, "\n");
4133 }
4134
4135 #endif /* not HAVE_VPRINTF */
4136
4137 \f
4138 static void
4139 validate_all_switches ()
4140 {
4141   struct compiler *comp;
4142   register char *p;
4143   register char c;
4144   struct spec_list *spec;
4145
4146   for (comp = compilers; comp->spec[0]; comp++)
4147     {
4148       int i;
4149       for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
4150         {
4151           p = comp->spec[i];
4152           while (c = *p++)
4153             if (c == '%' && *p == '{')
4154               /* We have a switch spec.  */
4155               validate_switches (p + 1);
4156         }
4157     }
4158
4159   /* look through the linked list of extra specs read from the specs file */
4160   for (spec = specs; spec ; spec = spec->next)
4161     {
4162       p = spec->spec;
4163       while (c = *p++)
4164         if (c == '%' && *p == '{')
4165           /* We have a switch spec.  */
4166           validate_switches (p + 1);
4167     }
4168
4169   p = link_command_spec;
4170   while (c = *p++)
4171     if (c == '%' && *p == '{')
4172       /* We have a switch spec.  */
4173       validate_switches (p + 1);
4174
4175   /* Now notice switches mentioned in the machine-specific specs.  */
4176
4177   p = asm_spec;
4178   while (c = *p++)
4179     if (c == '%' && *p == '{')
4180       /* We have a switch spec.  */
4181       validate_switches (p + 1);
4182
4183   p = asm_final_spec;
4184   while (c = *p++)
4185     if (c == '%' && *p == '{')
4186       /* We have a switch spec.  */
4187       validate_switches (p + 1);
4188
4189   p = cpp_spec;
4190   while (c = *p++)
4191     if (c == '%' && *p == '{')
4192       /* We have a switch spec.  */
4193       validate_switches (p + 1);
4194
4195   p = signed_char_spec;
4196   while (c = *p++)
4197     if (c == '%' && *p == '{')
4198       /* We have a switch spec.  */
4199       validate_switches (p + 1);
4200
4201   p = cc1_spec;
4202   while (c = *p++)
4203     if (c == '%' && *p == '{')
4204       /* We have a switch spec.  */
4205       validate_switches (p + 1);
4206
4207   p = cc1plus_spec;
4208   while (c = *p++)
4209     if (c == '%' && *p == '{')
4210       /* We have a switch spec.  */
4211       validate_switches (p + 1);
4212
4213   p = link_spec;
4214   while (c = *p++)
4215     if (c == '%' && *p == '{')
4216       /* We have a switch spec.  */
4217       validate_switches (p + 1);
4218
4219   p = lib_spec;
4220   while (c = *p++)
4221     if (c == '%' && *p == '{')
4222       /* We have a switch spec.  */
4223       validate_switches (p + 1);
4224
4225   p = startfile_spec;
4226   while (c = *p++)
4227     if (c == '%' && *p == '{')
4228       /* We have a switch spec.  */
4229       validate_switches (p + 1);
4230 }
4231
4232 /* Look at the switch-name that comes after START
4233    and mark as valid all supplied switches that match it.  */
4234
4235 static void
4236 validate_switches (start)
4237      char *start;
4238 {
4239   register char *p = start;
4240   char *filter;
4241   register int i;
4242   int suffix = 0;
4243
4244   if (*p == '|')
4245     ++p;
4246
4247   if (*p == '!')
4248     ++p;
4249
4250   if (*p == '.')
4251     suffix = 1, ++p;
4252
4253   filter = p;
4254   while (*p != ':' && *p != '}') p++;
4255
4256   if (suffix)
4257     ;
4258   else if (p[-1] == '*')
4259     {
4260       /* Mark all matching switches as valid.  */
4261       --p;
4262       for (i = 0; i < n_switches; i++)
4263         if (!strncmp (switches[i].part1, filter, p - filter))
4264           switches[i].valid = 1;
4265     }
4266   else
4267     {
4268       /* Mark an exact matching switch as valid.  */
4269       for (i = 0; i < n_switches; i++)
4270         {
4271           if (!strncmp (switches[i].part1, filter, p - filter)
4272               && switches[i].part1[p - filter] == 0)
4273             switches[i].valid = 1;
4274         }
4275     }
4276 }