OSDN Git Service

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