OSDN Git Service

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