OSDN Git Service

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