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