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