OSDN Git Service

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