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