OSDN Git Service

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