OSDN Git Service

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