OSDN Git Service

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