OSDN Git Service

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