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