OSDN Git Service

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