OSDN Git Service

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