OSDN Git Service

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