OSDN Git Service

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