OSDN Git Service

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