OSDN Git Service

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