OSDN Git Service

2000-06-29 Philipp Thomas <pthomas@suse.de>
[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   fputs (_("Options:\n"), stdout);
2809
2810   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
2811   fputs (_("  --help                   Display this information\n"), stdout);
2812   if (! verbose_flag)
2813     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2814   fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
2815   fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
2816   fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
2817   fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
2818   fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
2819   fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
2820   fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
2821   fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
2822   fputs (_("\
2823   -print-multi-lib         Display the mapping between command line options and\n\
2824                            multiple library search directories\n"), stdout);
2825   fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
2826   fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
2827   fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
2828   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
2829   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
2830   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
2831   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
2832   fputs (_("  -specs=<file>            Override builtin specs with the contents of <file>\n"), stdout);
2833   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
2834   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
2835   fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
2836   fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
2837   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
2838   fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
2839   fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
2840   fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
2841   fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
2842   fputs (_("\
2843   -x <language>            Specify the language of the following input files\n\
2844                            Permissable languages include: c c++ assembler none\n\
2845                            'none' means revert to the default behaviour of\n\
2846                            guessing the language based on the file's extension\n\
2847 "), stdout);
2848
2849   printf (_("\
2850 \nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n\
2851 the various sub-processes invoked by %s.  In order to pass other options\n\
2852 on to these processes the -W<letter> options must be used.\n\
2853 "), programname);
2854
2855   /* The rest of the options are displayed by invocations of the various
2856      sub-processes.  */
2857 }
2858
2859 static void                                                             
2860 add_preprocessor_option (option, len)                                   
2861      const char * option;
2862      int len;
2863 {                                                                       
2864   n_preprocessor_options++;
2865                                                                         
2866   if (! preprocessor_options)
2867     preprocessor_options
2868       = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
2869   else
2870     preprocessor_options
2871       = (char **) xrealloc (preprocessor_options,
2872                             n_preprocessor_options * sizeof (char *));
2873                                                                         
2874   preprocessor_options [n_preprocessor_options - 1] =
2875     save_string (option, len);
2876 }
2877      
2878 static void                                                             
2879 add_assembler_option (option, len)                                      
2880      const char * option;
2881      int len;
2882 {
2883   n_assembler_options++;
2884
2885   if (! assembler_options)
2886     assembler_options
2887       = (char **) xmalloc (n_assembler_options * sizeof (char *));
2888   else
2889     assembler_options
2890       = (char **) xrealloc (assembler_options,
2891                             n_assembler_options * sizeof (char *));
2892
2893   assembler_options [n_assembler_options - 1] = save_string (option, len);
2894 }
2895      
2896 static void                                                             
2897 add_linker_option (option, len)                                 
2898      const char * option;
2899      int    len;
2900 {
2901   n_linker_options++;
2902
2903   if (! linker_options)
2904     linker_options
2905       = (char **) xmalloc (n_linker_options * sizeof (char *));
2906   else
2907     linker_options
2908       = (char **) xrealloc (linker_options,
2909                             n_linker_options * sizeof (char *));
2910
2911   linker_options [n_linker_options - 1] = save_string (option, len);
2912 }
2913 \f
2914 /* Create the vector `switches' and its contents.
2915    Store its length in `n_switches'.  */
2916
2917 static void
2918 process_command (argc, argv)
2919      int argc;
2920      const char **argv;
2921 {
2922   register int i;
2923   const char *temp;
2924   char *temp1;
2925   const char *spec_lang = 0;
2926   int last_language_n_infiles;
2927   int have_c = 0;
2928   int have_o = 0;
2929   int lang_n_infiles = 0;
2930
2931   GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
2932
2933   n_switches = 0;
2934   n_infiles = 0;
2935   added_libraries = 0;
2936
2937   /* Figure compiler version from version string.  */
2938
2939   compiler_version = temp1 = xstrdup (version_string); 
2940
2941   for (; *temp1; ++temp1)
2942     {
2943       if (*temp1 == ' ')
2944         {
2945           *temp1 = '\0';
2946           break;
2947         }
2948     }
2949
2950   /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
2951      see if we can create it from the pathname specified in argv[0].  */
2952
2953 #ifndef VMS
2954   /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
2955   if (!gcc_exec_prefix)
2956     {
2957       gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
2958                                               standard_exec_prefix);
2959       if (gcc_exec_prefix)
2960         putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL_PTR));
2961     }
2962 #endif
2963
2964   if (gcc_exec_prefix)
2965     {
2966       int len = strlen (gcc_exec_prefix);
2967       if (len > (int) sizeof ("/lib/gcc-lib/")-1
2968           && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
2969         {
2970           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
2971           if (IS_DIR_SEPARATOR (*temp)
2972               && strncmp (temp+1, "lib", 3) == 0
2973               && IS_DIR_SEPARATOR (temp[4])
2974               && strncmp (temp+5, "gcc-lib", 7) == 0)
2975             len -= sizeof ("/lib/gcc-lib/") - 1;
2976         }
2977
2978       set_std_prefix (gcc_exec_prefix, len);
2979       add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2980       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2981     }
2982
2983   /* COMPILER_PATH and LIBRARY_PATH have values
2984      that are lists of directory names with colons.  */
2985
2986   GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
2987   if (temp)
2988     {
2989       const char *startp, *endp;
2990       char *nstore = (char *) alloca (strlen (temp) + 3);
2991
2992       startp = endp = temp;
2993       while (1)
2994         {
2995           if (*endp == PATH_SEPARATOR || *endp == 0)
2996             {
2997               strncpy (nstore, startp, endp-startp);
2998               if (endp == startp)
2999                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
3000               else if (!IS_DIR_SEPARATOR (endp[-1]))
3001                 {
3002                   nstore[endp-startp] = DIR_SEPARATOR;
3003                   nstore[endp-startp+1] = 0;
3004                 }
3005               else
3006                 nstore[endp-startp] = 0;
3007               add_prefix (&exec_prefixes, nstore, 0, 0, 0, NULL_PTR);
3008               add_prefix (&include_prefixes,
3009                           concat (nstore, "include", NULL_PTR),
3010                           0, 0, 0, NULL_PTR);
3011               if (*endp == 0)
3012                 break;
3013               endp = startp = endp + 1;
3014             }
3015           else
3016             endp++;
3017         }
3018     }
3019
3020   GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
3021   if (temp && *cross_compile == '0')
3022     {
3023       const char *startp, *endp;
3024       char *nstore = (char *) alloca (strlen (temp) + 3);
3025
3026       startp = endp = temp;
3027       while (1)
3028         {
3029           if (*endp == PATH_SEPARATOR || *endp == 0)
3030             {
3031               strncpy (nstore, startp, endp-startp);
3032               if (endp == startp)
3033                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
3034               else if (!IS_DIR_SEPARATOR (endp[-1]))
3035                 {
3036                   nstore[endp-startp] = DIR_SEPARATOR;
3037                   nstore[endp-startp+1] = 0;
3038                 }
3039               else
3040                 nstore[endp-startp] = 0;
3041               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
3042                           0, 0, NULL_PTR);
3043               if (*endp == 0)
3044                 break;
3045               endp = startp = endp + 1;
3046             }
3047           else
3048             endp++;
3049         }
3050     }
3051
3052   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
3053   GET_ENV_PATH_LIST (temp, "LPATH");
3054   if (temp && *cross_compile == '0')
3055     {
3056       const char *startp, *endp;
3057       char *nstore = (char *) alloca (strlen (temp) + 3);
3058
3059       startp = endp = temp;
3060       while (1)
3061         {
3062           if (*endp == PATH_SEPARATOR || *endp == 0)
3063             {
3064               strncpy (nstore, startp, endp-startp);
3065               if (endp == startp)
3066                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
3067               else if (!IS_DIR_SEPARATOR (endp[-1]))
3068                 {
3069                   nstore[endp-startp] = DIR_SEPARATOR;
3070                   nstore[endp-startp+1] = 0;
3071                 }
3072               else
3073                 nstore[endp-startp] = 0;
3074               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
3075                           0, 0, NULL_PTR);
3076               if (*endp == 0)
3077                 break;
3078               endp = startp = endp + 1;
3079             }
3080           else
3081             endp++;
3082         }
3083     }
3084
3085   /* Convert new-style -- options to old-style.  */
3086   translate_options (&argc, &argv);
3087
3088   /* Do language-specific adjustment/addition of flags.  */
3089   lang_specific_driver (&argc, &argv, &added_libraries);
3090
3091   /* Scan argv twice.  Here, the first time, just count how many switches
3092      there will be in their vector, and how many input files in theirs.
3093      Here we also parse the switches that cc itself uses (e.g. -v).  */
3094
3095   for (i = 1; i < argc; i++)
3096     {
3097       if (! strcmp (argv[i], "-dumpspecs"))
3098         {
3099           struct spec_list *sl;
3100           init_spec ();
3101           for (sl = specs; sl; sl = sl->next)
3102             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3103           if (link_command_spec)
3104             printf ("*link_command:\n%s\n\n", link_command_spec);
3105           exit (0);
3106         }
3107       else if (! strcmp (argv[i], "-dumpversion"))
3108         {
3109           printf ("%s\n", spec_version);
3110           exit (0);
3111         }
3112       else if (! strcmp (argv[i], "-dumpmachine"))
3113         {
3114           printf ("%s\n", spec_machine);
3115           exit  (0);
3116         }
3117       else if (strcmp (argv[i], "-fhelp") == 0)
3118         {
3119           /* translate_options () has turned --help into -fhelp.  */
3120           print_help_list = 1;
3121
3122           /* We will be passing a dummy file on to the sub-processes.  */
3123           n_infiles++;
3124           n_switches++;
3125           
3126           add_preprocessor_option ("--help", 6);
3127           add_assembler_option ("--help", 6);
3128           add_linker_option ("--help", 6);
3129         }
3130       else if (! strcmp (argv[i], "-pass-exit-codes"))
3131         {
3132           pass_exit_codes = 1;
3133           n_switches++;
3134         }
3135       else if (! strcmp (argv[i], "-print-search-dirs"))
3136         print_search_dirs = 1;
3137       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3138         print_file_name = "libgcc.a";
3139       else if (! strncmp (argv[i], "-print-file-name=", 17))
3140         print_file_name = argv[i] + 17;
3141       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3142         print_prog_name = argv[i] + 17;
3143       else if (! strcmp (argv[i], "-print-multi-lib"))
3144         print_multi_lib = 1;
3145       else if (! strcmp (argv[i], "-print-multi-directory"))
3146         print_multi_directory = 1;
3147       else if (! strncmp (argv[i], "-Wa,", 4))
3148         {
3149           int prev, j;
3150           /* Pass the rest of this option to the assembler.  */
3151
3152           /* Split the argument at commas.  */
3153           prev = 4;
3154           for (j = 4; argv[i][j]; j++)
3155             if (argv[i][j] == ',')
3156               {
3157                 add_assembler_option (argv[i] + prev, j - prev);
3158                 prev = j + 1;
3159               }
3160           
3161           /* Record the part after the last comma.  */
3162           add_assembler_option (argv[i] + prev, j - prev);
3163         }
3164       else if (! strncmp (argv[i], "-Wp,", 4))
3165         {
3166           int prev, j;
3167           /* Pass the rest of this option to the preprocessor.  */
3168
3169           /* Split the argument at commas.  */
3170           prev = 4;
3171           for (j = 4; argv[i][j]; j++)
3172             if (argv[i][j] == ',')
3173               {
3174                 add_preprocessor_option (argv[i] + prev, j - prev);
3175                 prev = j + 1;
3176               }
3177           
3178           /* Record the part after the last comma.  */
3179           add_preprocessor_option (argv[i] + prev, j - prev);
3180         }
3181       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3182         /* The +e options to the C++ front-end.  */
3183         n_switches++;
3184       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3185         {
3186           int j;
3187           /* Split the argument at commas.  */
3188           for (j = 3; argv[i][j]; j++)
3189             n_infiles += (argv[i][j] == ',');
3190         }
3191       else if (strcmp (argv[i], "-Xlinker") == 0)
3192         {
3193           if (i + 1 == argc)
3194             fatal ("argument to `-Xlinker' is missing");
3195
3196           n_infiles++;
3197           i++;
3198         }
3199       else if (strncmp (argv[i], "-l", 2) == 0)
3200         n_infiles++;
3201       else if (strcmp (argv[i], "-save-temps") == 0)
3202         {
3203           save_temps_flag = 1;
3204           n_switches++;
3205         }
3206       else if (strcmp (argv[i], "-specs") == 0)
3207         {
3208           struct user_specs *user = (struct user_specs *)
3209             xmalloc (sizeof (struct user_specs));
3210           if (++i >= argc)
3211             fatal ("argument to `-specs' is missing");
3212
3213           user->next = (struct user_specs *)0;
3214           user->filename = argv[i];
3215           if (user_specs_tail)
3216             user_specs_tail->next = user;
3217           else
3218             user_specs_head = user;
3219           user_specs_tail = user;
3220         }
3221       else if (strncmp (argv[i], "-specs=", 7) == 0)
3222         {
3223           struct user_specs *user = (struct user_specs *)
3224             xmalloc (sizeof (struct user_specs));
3225           if (strlen (argv[i]) == 7)
3226             fatal ("argument to `-specs=' is missing");
3227
3228           user->next = (struct user_specs *)0;
3229           user->filename = argv[i]+7;
3230           if (user_specs_tail)
3231             user_specs_tail->next = user;
3232           else
3233             user_specs_head = user;
3234           user_specs_tail = user;
3235         }
3236       else if (strcmp (argv[i], "-time") == 0)
3237         report_times = 1;
3238       else if (argv[i][0] == '-' && argv[i][1] != 0)
3239         {
3240           register const char *p = &argv[i][1];
3241           register int c = *p;
3242
3243           switch (c)
3244             {
3245             case 'b':
3246               n_switches++;
3247               if (p[1] == 0 && i + 1 == argc)
3248                 fatal ("argument to `-b' is missing");
3249               if (p[1] == 0)
3250                 spec_machine = argv[++i];
3251               else
3252                 spec_machine = p + 1;
3253
3254               warn_std_ptr = &warn_std;
3255               break;
3256
3257             case 'B':
3258               {
3259                 const char *value;
3260                 if (p[1] == 0 && i + 1 == argc)
3261                   fatal ("argument to `-B' is missing");
3262                 if (p[1] == 0)
3263                   value = argv[++i];
3264                 else
3265                   value = p + 1;
3266                 add_prefix (&exec_prefixes, value, NULL_PTR, 1, 0, &warn_B);
3267                 add_prefix (&startfile_prefixes, value, NULL_PTR,
3268                             1, 0, &warn_B);
3269                 add_prefix (&include_prefixes, concat (value, "include",
3270                                                        NULL_PTR),
3271                             NULL_PTR, 1, 0, NULL_PTR);
3272
3273                 /* As a kludge, if the arg is "[foo/]stageN/", just add
3274                    "[foo/]include" to the include prefix.  */
3275                 {
3276                   int len = strlen (value);
3277                   if ((len == 7
3278                        || (len > 7
3279                            && (IS_DIR_SEPARATOR (value[len - 8]))))
3280                       && strncmp (value + len - 7, "stage", 5) == 0
3281                       && ISDIGIT (value[len - 2])
3282                       && (IS_DIR_SEPARATOR (value[len - 1])))
3283                     {
3284                       if (len == 7)
3285                         add_prefix (&include_prefixes, "include", NULL_PTR,
3286                                     1, 0, NULL_PTR);
3287                       else
3288                         {
3289                           char *string = xmalloc (len + 1);
3290                           strncpy (string, value, len-7);
3291                           strcpy (string+len-7, "include");
3292                           add_prefix (&include_prefixes, string, NULL_PTR,
3293                                       1, 0, NULL_PTR);
3294                         }
3295                     }
3296                 }
3297                 n_switches++;
3298               }
3299               break;
3300
3301             case 'v':   /* Print our subcommands and print versions.  */
3302               n_switches++;
3303               /* If they do anything other than exactly `-v', don't set
3304                  verbose_flag; rather, continue on to give the error.  */
3305               if (p[1] != 0)
3306                 break;
3307               verbose_flag++;
3308               break;
3309
3310             case 'V':
3311               n_switches++;
3312               if (p[1] == 0 && i + 1 == argc)
3313                 fatal ("argument to `-V' is missing");
3314               if (p[1] == 0)
3315                 spec_version = argv[++i];
3316               else
3317                 spec_version = p + 1;
3318               compiler_version = spec_version;
3319               warn_std_ptr = &warn_std;
3320
3321               /* Validate the version number.  Use the same checks
3322                  done when inserting it into a spec.
3323
3324                  The format of the version string is
3325                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
3326               {
3327                 const char *v = compiler_version;
3328
3329                 /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
3330                 while (! ISDIGIT (*v))
3331                   v++;
3332
3333                 if (v > compiler_version && v[-1] != '-')
3334                   fatal ("invalid version number format");
3335
3336                 /* Set V after the first period.  */
3337                 while (ISDIGIT (*v))
3338                   v++;
3339
3340                 if (*v != '.')
3341                   fatal ("invalid version number format");
3342
3343                 v++;
3344                 while (ISDIGIT (*v))
3345                   v++;
3346
3347                 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3348                   fatal ("invalid version number format");
3349               }
3350               break;
3351
3352             case 'S':
3353             case 'c':
3354               if (p[1] == 0)
3355                 {
3356                   have_c = 1;
3357                   n_switches++;
3358                   break;
3359                 }
3360               goto normal_switch;
3361
3362             case 'o':
3363               have_o = 1;
3364 #if defined(HAVE_EXECUTABLE_SUFFIX)
3365               if (! have_c)
3366                 {
3367                   int skip;
3368                   
3369                   /* Forward scan, just in case -S or -c is specified
3370                      after -o.  */
3371                   int j = i + 1;
3372                   if (p[1] == 0)
3373                     ++j;
3374                   while (j < argc)
3375                     {
3376                       if (argv[j][0] == '-')
3377                         {
3378                           if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3379                               && argv[j][2] == 0)
3380                             {
3381                               have_c = 1;
3382                               break;
3383                             }
3384                           else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3385                             j += skip - (argv[j][2] != 0);
3386                           else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3387                             j += skip;
3388                         }
3389                       j++;
3390                     }
3391                 }
3392 #endif
3393 #if defined(HAVE_EXECUTABLE_SUFFIX) || defined(HAVE_OBJECT_SUFFIX)
3394               if (p[1] == 0)
3395                 argv[i+1] = convert_filename (argv[i+1], ! have_c);
3396               else
3397                 argv[i] = convert_filename (argv[i], ! have_c);
3398 #endif
3399               goto normal_switch;
3400
3401             default:
3402             normal_switch:
3403               n_switches++;
3404
3405               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3406                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3407               else if (WORD_SWITCH_TAKES_ARG (p))
3408                 i += WORD_SWITCH_TAKES_ARG (p);
3409             }
3410         }
3411       else
3412         {
3413           n_infiles++;
3414           lang_n_infiles++;
3415         }
3416     }
3417
3418   if (have_c && have_o && lang_n_infiles > 1)
3419     fatal ("cannot specify -o with -c or -S and multiple compilations");
3420
3421   /* Set up the search paths before we go looking for config files.  */
3422
3423   /* These come before the md prefixes so that we will find gcc's subcommands
3424      (such as cpp) rather than those of the host system.  */
3425   /* Use 2 as fourth arg meaning try just the machine as a suffix,
3426      as well as trying the machine and the version.  */
3427 #ifndef OS2
3428   add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3429               0, 1, warn_std_ptr);
3430   add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3431               0, 2, warn_std_ptr);
3432   add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3433               0, 2, warn_std_ptr);
3434 #endif
3435
3436   add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3437               0, 1, warn_std_ptr);
3438   add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3439               0, 1, warn_std_ptr);
3440
3441   tooldir_prefix = concat (tooldir_base_prefix, spec_machine, 
3442                            dir_separator_str, NULL_PTR);
3443
3444   /* If tooldir is relative, base it on exec_prefixes.  A relative
3445      tooldir lets us move the installed tree as a unit.
3446
3447      If GCC_EXEC_PREFIX is defined, then we want to add two relative
3448      directories, so that we can search both the user specified directory
3449      and the standard place.  */
3450
3451   if (!IS_DIR_SEPARATOR (*tooldir_prefix))
3452     {
3453       if (gcc_exec_prefix)
3454         {
3455           char *gcc_exec_tooldir_prefix
3456             = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3457                       spec_version, dir_separator_str, tooldir_prefix, NULL_PTR);
3458
3459           add_prefix (&exec_prefixes,
3460                       concat (gcc_exec_tooldir_prefix, "bin", 
3461                               dir_separator_str, NULL_PTR),
3462                       NULL_PTR, 0, 0, NULL_PTR);
3463           add_prefix (&startfile_prefixes,
3464                       concat (gcc_exec_tooldir_prefix, "lib", 
3465                               dir_separator_str, NULL_PTR),
3466                       NULL_PTR, 0, 0, NULL_PTR);
3467         }
3468
3469       tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3470                                dir_separator_str, spec_version, 
3471                                dir_separator_str, tooldir_prefix, NULL_PTR);
3472     }
3473
3474   add_prefix (&exec_prefixes, 
3475               concat (tooldir_prefix, "bin", dir_separator_str, NULL_PTR),
3476               "BINUTILS", 0, 0, NULL_PTR);
3477   add_prefix (&startfile_prefixes,
3478               concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
3479               "BINUTILS", 0, 0, NULL_PTR);
3480
3481   /* More prefixes are enabled in main, after we read the specs file
3482      and determine whether this is cross-compilation or not.  */
3483
3484
3485   /* Then create the space for the vectors and scan again.  */
3486
3487   switches = ((struct switchstr *)
3488               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3489   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3490   n_switches = 0;
3491   n_infiles = 0;
3492   last_language_n_infiles = -1;
3493
3494   /* This, time, copy the text of each switch and store a pointer
3495      to the copy in the vector of switches.
3496      Store all the infiles in their vector.  */
3497
3498   for (i = 1; i < argc; i++)
3499     {
3500       /* Just skip the switches that were handled by the preceding loop.  */
3501       if (! strncmp (argv[i], "-Wa,", 4))
3502         ;
3503       else if (! strncmp (argv[i], "-Wp,", 4))
3504         ;
3505       else if (! strcmp (argv[i], "-pass-exit-codes"))
3506         ;
3507       else if (! strcmp (argv[i], "-print-search-dirs"))
3508         ;
3509       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3510         ;
3511       else if (! strncmp (argv[i], "-print-file-name=", 17))
3512         ;
3513       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3514         ;
3515       else if (! strcmp (argv[i], "-print-multi-lib"))
3516         ;
3517       else if (! strcmp (argv[i], "-print-multi-directory"))
3518         ;
3519       else if (strcmp (argv[i], "-fhelp") == 0)
3520         {
3521           if (verbose_flag)
3522             {
3523               /* Create a dummy input file, so that we can pass --help on to
3524                  the various sub-processes.  */
3525               infiles[n_infiles].language = "c";
3526               infiles[n_infiles++].name   = "help-dummy";
3527               
3528               /* Preserve the --help switch so that it can be caught by the
3529                  cc1 spec string.  */
3530               switches[n_switches].part1     = "--help";
3531               switches[n_switches].args      = 0;
3532               switches[n_switches].live_cond = SWITCH_OK;
3533               switches[n_switches].validated     = 0;
3534               
3535               n_switches++;
3536             }
3537         }
3538       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3539         {
3540           /* Compensate for the +e options to the C++ front-end;
3541              they're there simply for cfront call-compatibility.  We do
3542              some magic in default_compilers to pass them down properly.
3543              Note we deliberately start at the `+' here, to avoid passing
3544              -e0 or -e1 down into the linker.  */
3545           switches[n_switches].part1 = &argv[i][0];
3546           switches[n_switches].args = 0;
3547           switches[n_switches].live_cond = SWITCH_OK;
3548           switches[n_switches].validated = 0;
3549           n_switches++;
3550         }
3551       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3552         {
3553           int prev, j;
3554           /* Split the argument at commas.  */
3555           prev = 4;
3556           for (j = 4; argv[i][j]; j++)
3557             if (argv[i][j] == ',')
3558               {
3559                 infiles[n_infiles].language = "*";
3560                 infiles[n_infiles++].name
3561                   = save_string (argv[i] + prev, j - prev);
3562                 prev = j + 1;
3563               }
3564           /* Record the part after the last comma.  */
3565           infiles[n_infiles].language = "*";
3566           infiles[n_infiles++].name = argv[i] + prev;
3567         }
3568       else if (strcmp (argv[i], "-Xlinker") == 0)
3569         {
3570           infiles[n_infiles].language = "*";
3571           infiles[n_infiles++].name = argv[++i];
3572         }
3573       else if (strncmp (argv[i], "-l", 2) == 0)
3574         {
3575           infiles[n_infiles].language = "*";
3576           infiles[n_infiles++].name = argv[i];
3577         }
3578       else if (strcmp (argv[i], "-specs") == 0)
3579         i++;
3580       else if (strncmp (argv[i], "-specs=", 7) == 0)
3581         ;
3582       else if (strcmp (argv[i], "-time") == 0)
3583         ;
3584       else if ((save_temps_flag || report_times)
3585                && strcmp (argv[i], "-pipe") == 0)
3586         {
3587           /* -save-temps overrides -pipe, so that temp files are produced */
3588           if (save_temps_flag)
3589             error ("Warning: -pipe ignored since -save-temps specified");
3590           /* -time overrides -pipe because we can't get correct stats when
3591              multiple children are running at once.  */
3592           else if (report_times)
3593             error ("Warning: -pipe ignored since -time specified");
3594         }
3595       else if (argv[i][0] == '-' && argv[i][1] != 0)
3596         {
3597           const char *p = &argv[i][1];
3598           int c = *p;
3599
3600           if (c == 'x')
3601             {
3602               if (p[1] == 0 && i + 1 == argc)
3603                 fatal ("argument to `-x' is missing");
3604               if (p[1] == 0)
3605                 spec_lang = argv[++i];
3606               else
3607                 spec_lang = p + 1;
3608               if (! strcmp (spec_lang, "none"))
3609                 /* Suppress the warning if -xnone comes after the last input
3610                    file, because alternate command interfaces like g++ might
3611                    find it useful to place -xnone after each input file.  */
3612                 spec_lang = 0;
3613               else
3614                 last_language_n_infiles = n_infiles;
3615               continue;
3616             }
3617           switches[n_switches].part1 = p;
3618           /* Deal with option arguments in separate argv elements.  */
3619           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
3620               || WORD_SWITCH_TAKES_ARG (p))
3621             {
3622               int j = 0;
3623               int n_args = WORD_SWITCH_TAKES_ARG (p);
3624
3625               if (n_args == 0)
3626                 {
3627                   /* Count only the option arguments in separate argv elements.  */
3628                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3629                 }
3630               if (i + n_args >= argc)
3631                 fatal ("argument to `-%s' is missing", p);
3632               switches[n_switches].args
3633                 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
3634               while (j < n_args)
3635                 switches[n_switches].args[j++] = argv[++i];
3636               /* Null-terminate the vector.  */
3637               switches[n_switches].args[j] = 0;
3638             }
3639           else if (index (switches_need_spaces, c))
3640             {
3641               /* On some systems, ld cannot handle some options without
3642                  a space.  So split the option from its argument.  */
3643               char *part1 = (char *) xmalloc (2);
3644               char *tmp;
3645               part1[0] = c;
3646               part1[1] = '\0';
3647               
3648               switches[n_switches].part1 = part1;
3649               switches[n_switches].args
3650                 = (const char **) xmalloc (2 * sizeof (const char *));
3651               switches[n_switches].args[0] = tmp = xmalloc (strlen (p));
3652               strcpy (tmp, &p[1]);
3653               switches[n_switches].args[1] = 0;
3654             }
3655           else
3656             switches[n_switches].args = 0;
3657
3658           switches[n_switches].live_cond = SWITCH_OK;
3659           switches[n_switches].validated = 0;
3660           /* This is always valid, since gcc.c itself understands it.  */
3661           if (!strcmp (p, "save-temps"))
3662             switches[n_switches].validated = 1;
3663           else
3664             {
3665               char ch = switches[n_switches].part1[0];
3666               if (ch == 'V' || ch == 'b' || ch == 'B')
3667                 switches[n_switches].validated = 1;
3668             }
3669           n_switches++;
3670         }
3671       else
3672         {
3673 #ifdef HAVE_OBJECT_SUFFIX
3674           argv[i] = convert_filename (argv[i], 0);
3675 #endif
3676
3677           if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
3678             {
3679               perror_with_name (argv[i]);
3680               error_count++;
3681             }
3682           else
3683             {
3684               infiles[n_infiles].language = spec_lang;
3685               infiles[n_infiles++].name = argv[i];
3686             }
3687         }
3688     }
3689
3690   if (n_infiles == last_language_n_infiles && spec_lang != 0)
3691     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3692
3693   switches[n_switches].part1 = 0;
3694   infiles[n_infiles].name = 0;
3695 }
3696 \f
3697 /* Process a spec string, accumulating and running commands.  */
3698
3699 /* These variables describe the input file name.
3700    input_file_number is the index on outfiles of this file,
3701    so that the output file name can be stored for later use by %o.
3702    input_basename is the start of the part of the input file
3703    sans all directory names, and basename_length is the number
3704    of characters starting there excluding the suffix .c or whatever.  */
3705
3706 const char *input_filename;
3707 static int input_file_number;
3708 size_t input_filename_length;
3709 static int basename_length;
3710 static const char *input_basename;
3711 static const char *input_suffix;
3712
3713 /* These are variables used within do_spec and do_spec_1.  */
3714
3715 /* Nonzero if an arg has been started and not yet terminated
3716    (with space, tab or newline).  */
3717 static int arg_going;
3718
3719 /* Nonzero means %d or %g has been seen; the next arg to be terminated
3720    is a temporary file name.  */
3721 static int delete_this_arg;
3722
3723 /* Nonzero means %w has been seen; the next arg to be terminated
3724    is the output file name of this compilation.  */
3725 static int this_is_output_file;
3726
3727 /* Nonzero means %s has been seen; the next arg to be terminated
3728    is the name of a library file and we should try the standard
3729    search dirs for it.  */
3730 static int this_is_library_file;
3731
3732 /* Nonzero means that the input of this command is coming from a pipe.  */
3733 static int input_from_pipe;
3734
3735 /* Process the spec SPEC and run the commands specified therein.
3736    Returns 0 if the spec is successfully processed; -1 if failed.  */
3737
3738 int
3739 do_spec (spec)
3740      const char *spec;
3741 {
3742   int value;
3743
3744   clear_args ();
3745   arg_going = 0;
3746   delete_this_arg = 0;
3747   this_is_output_file = 0;
3748   this_is_library_file = 0;
3749   input_from_pipe = 0;
3750
3751   value = do_spec_1 (spec, 0, NULL_PTR);
3752
3753   /* Force out any unfinished command.
3754      If -pipe, this forces out the last command if it ended in `|'.  */
3755   if (value == 0)
3756     {
3757       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3758         argbuf_index--;
3759
3760       if (argbuf_index > 0)
3761         value = execute ();
3762     }
3763
3764   return value;
3765 }
3766
3767 /* Process the sub-spec SPEC as a portion of a larger spec.
3768    This is like processing a whole spec except that we do
3769    not initialize at the beginning and we do not supply a
3770    newline by default at the end.
3771    INSWITCH nonzero means don't process %-sequences in SPEC;
3772    in this case, % is treated as an ordinary character.
3773    This is used while substituting switches.
3774    INSWITCH nonzero also causes SPC not to terminate an argument.
3775
3776    Value is zero unless a line was finished
3777    and the command on that line reported an error.  */
3778
3779 static int
3780 do_spec_1 (spec, inswitch, soft_matched_part)
3781      const char *spec;
3782      int inswitch;
3783      const char *soft_matched_part;
3784 {
3785   register const char *p = spec;
3786   register int c;
3787   int i;
3788   const char *string;
3789   int value;
3790
3791   while ((c = *p++))
3792     /* If substituting a switch, treat all chars like letters.
3793        Otherwise, NL, SPC, TAB and % are special.  */
3794     switch (inswitch ? 'a' : c)
3795       {
3796       case '\n':
3797         /* End of line: finish any pending argument,
3798            then run the pending command if one has been started.  */
3799         if (arg_going)
3800           {
3801             obstack_1grow (&obstack, 0);
3802             string = obstack_finish (&obstack);
3803             if (this_is_library_file)
3804               string = find_file (string);
3805             store_arg (string, delete_this_arg, this_is_output_file);
3806             if (this_is_output_file)
3807               outfiles[input_file_number] = string;
3808           }
3809         arg_going = 0;
3810
3811         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3812           {
3813             for (i = 0; i < n_switches; i++)
3814               if (!strcmp (switches[i].part1, "pipe"))
3815                 break;
3816
3817             /* A `|' before the newline means use a pipe here,
3818                but only if -pipe was specified.
3819                Otherwise, execute now and don't pass the `|' as an arg.  */
3820             if (i < n_switches)
3821               {
3822                 input_from_pipe = 1;
3823                 switches[i].validated = 1;
3824                 break;
3825               }
3826             else
3827               argbuf_index--;
3828           }
3829
3830         if (argbuf_index > 0)
3831           {
3832             value = execute ();
3833             if (value)
3834               return value;
3835           }
3836         /* Reinitialize for a new command, and for a new argument.  */
3837         clear_args ();
3838         arg_going = 0;
3839         delete_this_arg = 0;
3840         this_is_output_file = 0;
3841         this_is_library_file = 0;
3842         input_from_pipe = 0;
3843         break;
3844
3845       case '|':
3846         /* End any pending argument.  */
3847         if (arg_going)
3848           {
3849             obstack_1grow (&obstack, 0);
3850             string = obstack_finish (&obstack);
3851             if (this_is_library_file)
3852               string = find_file (string);
3853             store_arg (string, delete_this_arg, this_is_output_file);
3854             if (this_is_output_file)
3855               outfiles[input_file_number] = string;
3856           }
3857
3858         /* Use pipe */
3859         obstack_1grow (&obstack, c);
3860         arg_going = 1;
3861         break;
3862
3863       case '\t':
3864       case ' ':
3865         /* Space or tab ends an argument if one is pending.  */
3866         if (arg_going)
3867           {
3868             obstack_1grow (&obstack, 0);
3869             string = obstack_finish (&obstack);
3870             if (this_is_library_file)
3871               string = find_file (string);
3872             store_arg (string, delete_this_arg, this_is_output_file);
3873             if (this_is_output_file)
3874               outfiles[input_file_number] = string;
3875           }
3876         /* Reinitialize for a new argument.  */
3877         arg_going = 0;
3878         delete_this_arg = 0;
3879         this_is_output_file = 0;
3880         this_is_library_file = 0;
3881         break;
3882
3883       case '%':
3884         switch (c = *p++)
3885           {
3886           case 0:
3887             fatal ("Invalid specification!  Bug in cc.");
3888
3889           case 'b':
3890             obstack_grow (&obstack, input_basename, basename_length);
3891             arg_going = 1;
3892             break;
3893
3894           case 'd':
3895             delete_this_arg = 2;
3896             break;
3897
3898           /* Dump out the directories specified with LIBRARY_PATH,
3899              followed by the absolute directories
3900              that we search for startfiles.  */
3901           case 'D':
3902             {
3903               struct prefix_list *pl = startfile_prefixes.plist;
3904               size_t bufsize = 100;
3905               char *buffer = (char *) xmalloc (bufsize);
3906               int idx;
3907
3908               for (; pl; pl = pl->next)
3909                 {
3910 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
3911                   /* Used on systems which record the specified -L dirs
3912                      and use them to search for dynamic linking.  */
3913                   /* Relative directories always come from -B,
3914                      and it is better not to use them for searching
3915                      at run time.  In particular, stage1 loses.  */
3916                   if (!IS_DIR_SEPARATOR (pl->prefix[0]))
3917                     continue;
3918 #endif
3919                   /* Try subdirectory if there is one.  */
3920                   if (multilib_dir != NULL)
3921                     {
3922                       if (machine_suffix)
3923                         {
3924                           if (strlen (pl->prefix) + strlen (machine_suffix)
3925                               >= bufsize)
3926                             bufsize = (strlen (pl->prefix)
3927                                        + strlen (machine_suffix)) * 2 + 1;
3928                           buffer = (char *) xrealloc (buffer, bufsize);
3929                           strcpy (buffer, pl->prefix);
3930                           strcat (buffer, machine_suffix);
3931                           if (is_directory (buffer, multilib_dir, 1))
3932                             {
3933                               do_spec_1 ("-L", 0, NULL_PTR);
3934 #ifdef SPACE_AFTER_L_OPTION
3935                               do_spec_1 (" ", 0, NULL_PTR);
3936 #endif
3937                               do_spec_1 (buffer, 1, NULL_PTR);
3938                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3939                               /* Make this a separate argument.  */
3940                               do_spec_1 (" ", 0, NULL_PTR);
3941                             }
3942                         }
3943                       if (!pl->require_machine_suffix)
3944                         {
3945                           if (is_directory (pl->prefix, multilib_dir, 1))
3946                             {
3947                               do_spec_1 ("-L", 0, NULL_PTR);
3948 #ifdef SPACE_AFTER_L_OPTION
3949                               do_spec_1 (" ", 0, NULL_PTR);
3950 #endif
3951                               do_spec_1 (pl->prefix, 1, NULL_PTR);
3952                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3953                               /* Make this a separate argument.  */
3954                               do_spec_1 (" ", 0, NULL_PTR);
3955                             }
3956                         }
3957                     }
3958                   if (machine_suffix)
3959                     {
3960                       if (is_directory (pl->prefix, machine_suffix, 1))
3961                         {
3962                           do_spec_1 ("-L", 0, NULL_PTR);
3963 #ifdef SPACE_AFTER_L_OPTION
3964                           do_spec_1 (" ", 0, NULL_PTR);
3965 #endif
3966                           do_spec_1 (pl->prefix, 1, NULL_PTR);
3967                           /* Remove slash from machine_suffix.  */
3968                           if (strlen (machine_suffix) >= bufsize)
3969                             bufsize = strlen (machine_suffix) * 2 + 1;
3970                           buffer = (char *) xrealloc (buffer, bufsize);
3971                           strcpy (buffer, machine_suffix);
3972                           idx = strlen (buffer);
3973                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
3974                             buffer[idx - 1] = 0;
3975                           do_spec_1 (buffer, 1, NULL_PTR);
3976                           /* Make this a separate argument.  */
3977                           do_spec_1 (" ", 0, NULL_PTR);
3978                         }
3979                     }
3980                   if (!pl->require_machine_suffix)
3981                     {
3982                       if (is_directory (pl->prefix, "", 1))
3983                         {
3984                           do_spec_1 ("-L", 0, NULL_PTR);
3985 #ifdef SPACE_AFTER_L_OPTION
3986                           do_spec_1 (" ", 0, NULL_PTR);
3987 #endif
3988                           /* Remove slash from pl->prefix.  */
3989                           if (strlen (pl->prefix) >= bufsize)
3990                             bufsize = strlen (pl->prefix) * 2 + 1;
3991                           buffer = (char *) xrealloc (buffer, bufsize);
3992                           strcpy (buffer, pl->prefix);
3993                           idx = strlen (buffer);
3994                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
3995                             buffer[idx - 1] = 0;
3996                           do_spec_1 (buffer, 1, NULL_PTR);
3997                           /* Make this a separate argument.  */
3998                           do_spec_1 (" ", 0, NULL_PTR);
3999                         }
4000                     }
4001                 }
4002               free (buffer);
4003             }
4004             break;
4005
4006           case 'e':
4007             /* %efoo means report an error with `foo' as error message
4008                and don't execute any more commands for this file.  */
4009             {
4010               const char *q = p;
4011               char *buf;
4012               while (*p != 0 && *p != '\n') p++;
4013               buf = (char *) alloca (p - q + 1);
4014               strncpy (buf, q, p - q);
4015               buf[p - q] = 0;
4016               error ("%s", buf);
4017               return -1;
4018             }
4019             break;
4020
4021           case 'g':
4022           case 'u':
4023           case 'U':
4024             if (save_temps_flag)
4025               {
4026                 obstack_grow (&obstack, input_basename, basename_length);
4027                 delete_this_arg = 0;
4028               }
4029             else
4030               {
4031 #ifdef MKTEMP_EACH_FILE
4032                 /* ??? This has a problem: the total number of
4033                    values mktemp can return is limited.
4034                    That matters for the names of object files.
4035                    In 2.4, do something about that.  */
4036                 struct temp_name *t;
4037                 int suffix_length;
4038                 const char *suffix = p;
4039                 char *saved_suffix = NULL;
4040
4041                 while (*p == '.' || ISALPHA ((unsigned char)*p))
4042                   p++;
4043                 suffix_length = p - suffix;
4044                 if (p[0] == '%' && p[1] == 'O')
4045                   {
4046                     p += 2;
4047                     /* We don't support extra suffix characters after %O.  */
4048                     if (*p == '.' || ISALPHA ((unsigned char)*p))
4049                       abort ();
4050                     if (suffix_length == 0)
4051                       suffix = OBJECT_SUFFIX;
4052                     else
4053                       {
4054                         saved_suffix
4055                           = (char *) xmalloc (suffix_length
4056                                               + strlen (OBJECT_SUFFIX));
4057                         strncpy (saved_suffix, suffix, suffix_length);
4058                         strcpy (saved_suffix + suffix_length,
4059                                 OBJECT_SUFFIX);
4060                       }
4061                     suffix_length += strlen (OBJECT_SUFFIX);
4062                   }
4063
4064                 /* See if we already have an association of %g/%u/%U and
4065                    suffix.  */
4066                 for (t = temp_names; t; t = t->next)
4067                   if (t->length == suffix_length
4068                       && strncmp (t->suffix, suffix, suffix_length) == 0
4069                       && t->unique == (c != 'g'))
4070                     break;
4071
4072                 /* Make a new association if needed.  %u requires one.  */
4073                 if (t == 0 || c == 'u')
4074                   {
4075                     if (t == 0)
4076                       {
4077                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4078                         t->next = temp_names;
4079                         temp_names = t;
4080                       }
4081                     t->length = suffix_length;
4082                     t->suffix = save_string (suffix, suffix_length);
4083                     t->unique = (c != 'g');
4084                     temp_filename = make_temp_file (t->suffix);
4085                     temp_filename_length = strlen (temp_filename);
4086                     t->filename = temp_filename;
4087                     t->filename_length = temp_filename_length;
4088                   }
4089
4090                 if (saved_suffix)
4091                   free (saved_suffix);
4092
4093                 obstack_grow (&obstack, t->filename, t->filename_length);
4094                 delete_this_arg = 1;
4095 #else
4096                 obstack_grow (&obstack, temp_filename, temp_filename_length);
4097                 if (c == 'u' || c == 'U')
4098                   {
4099                     static int unique;
4100                     char buff[9];
4101                     if (c == 'u')
4102                       unique++;
4103                     sprintf (buff, "%d", unique);
4104                     obstack_grow (&obstack, buff, strlen (buff));
4105                   }
4106 #endif
4107                 delete_this_arg = 1;
4108               }
4109             arg_going = 1;
4110             break;
4111
4112           case 'i':
4113             obstack_grow (&obstack, input_filename, input_filename_length);
4114             arg_going = 1;
4115             break;
4116
4117           case 'I':
4118             {
4119               struct prefix_list *pl = include_prefixes.plist;
4120
4121               if (gcc_exec_prefix)
4122                 {
4123                   do_spec_1 ("-iprefix", 1, NULL_PTR);
4124                   /* Make this a separate argument.  */
4125                   do_spec_1 (" ", 0, NULL_PTR);
4126                   do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
4127                   do_spec_1 (" ", 0, NULL_PTR);
4128                 }
4129
4130               for (; pl; pl = pl->next)
4131                 {
4132                   do_spec_1 ("-isystem", 1, NULL_PTR);
4133                   /* Make this a separate argument.  */
4134                   do_spec_1 (" ", 0, NULL_PTR);
4135                   do_spec_1 (pl->prefix, 1, NULL_PTR);
4136                   do_spec_1 (" ", 0, NULL_PTR);
4137                 }
4138             }
4139             break;
4140
4141           case 'o':
4142             {
4143               int max = n_infiles;
4144               max += lang_specific_extra_outfiles;
4145
4146               for (i = 0; i < max; i++)
4147                 if (outfiles[i])
4148                   store_arg (outfiles[i], 0, 0);
4149               break;
4150             }
4151
4152           case 'O':
4153             obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
4154             arg_going = 1;
4155             break;
4156
4157           case 's':
4158             this_is_library_file = 1;
4159             break;
4160
4161           case 'w':
4162             this_is_output_file = 1;
4163             break;
4164
4165           case 'W':
4166             {
4167               int cur_index = argbuf_index;
4168               /* Handle the {...} following the %W.  */
4169               if (*p != '{')
4170                 abort ();
4171               p = handle_braces (p + 1);
4172               if (p == 0)
4173                 return -1;
4174               /* If any args were output, mark the last one for deletion
4175                  on failure.  */
4176               if (argbuf_index != cur_index)
4177                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4178               break;
4179             }
4180
4181           /* %x{OPTION} records OPTION for %X to output.  */
4182           case 'x':
4183             {
4184               const char *p1 = p;
4185               char *string;
4186
4187               /* Skip past the option value and make a copy.  */
4188               if (*p != '{')
4189                 abort ();
4190               while (*p++ != '}')
4191                 ;
4192               string = save_string (p1 + 1, p - p1 - 2);
4193
4194               /* See if we already recorded this option.  */
4195               for (i = 0; i < n_linker_options; i++)
4196                 if (! strcmp (string, linker_options[i]))
4197                   {
4198                     free (string);
4199                     return 0;
4200                   }
4201
4202               /* This option is new; add it.  */
4203               add_linker_option (string, strlen (string));
4204             }
4205             break;
4206
4207           /* Dump out the options accumulated previously using %x.  */
4208           case 'X':
4209             for (i = 0; i < n_linker_options; i++)
4210               {
4211                 do_spec_1 (linker_options[i], 1, NULL_PTR);
4212                 /* Make each accumulated option a separate argument.  */
4213                 do_spec_1 (" ", 0, NULL_PTR);
4214               }
4215             break;
4216
4217           /* Dump out the options accumulated previously using -Wa,.  */
4218           case 'Y':
4219             for (i = 0; i < n_assembler_options; i++)
4220               {
4221                 do_spec_1 (assembler_options[i], 1, NULL_PTR);
4222                 /* Make each accumulated option a separate argument.  */
4223                 do_spec_1 (" ", 0, NULL_PTR);
4224               }
4225             break;
4226
4227           /* Dump out the options accumulated previously using -Wp,.  */
4228           case 'Z':
4229             for (i = 0; i < n_preprocessor_options; i++)
4230               {
4231                 do_spec_1 (preprocessor_options[i], 1, NULL_PTR);
4232                 /* Make each accumulated option a separate argument.  */
4233                 do_spec_1 (" ", 0, NULL_PTR);
4234               }
4235             break;
4236
4237             /* Here are digits and numbers that just process
4238                a certain constant string as a spec.  */
4239
4240           case '1':
4241             value = do_spec_1 (cc1_spec, 0, NULL_PTR);
4242             if (value != 0)
4243               return value;
4244             break;
4245
4246           case '2':
4247             value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
4248             if (value != 0)
4249               return value;
4250             break;
4251
4252           case 'a':
4253             value = do_spec_1 (asm_spec, 0, NULL_PTR);
4254             if (value != 0)
4255               return value;
4256             break;
4257
4258           case 'A':
4259             value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
4260             if (value != 0)
4261               return value;
4262             break;
4263
4264           case 'c':
4265             value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
4266             if (value != 0)
4267               return value;
4268             break;
4269
4270           case 'C':
4271             value = do_spec_1 (cpp_spec, 0, NULL_PTR);
4272             if (value != 0)
4273               return value;
4274             break;
4275
4276           case 'E':
4277             value = do_spec_1 (endfile_spec, 0, NULL_PTR);
4278             if (value != 0)
4279               return value;
4280             break;
4281
4282           case 'l':
4283             value = do_spec_1 (link_spec, 0, NULL_PTR);
4284             if (value != 0)
4285               return value;
4286             break;
4287
4288           case 'L':
4289             value = do_spec_1 (lib_spec, 0, NULL_PTR);
4290             if (value != 0)
4291               return value;
4292             break;
4293
4294           case 'G':
4295             value = do_spec_1 (libgcc_spec, 0, NULL_PTR);
4296             if (value != 0)
4297               return value;
4298             break;
4299
4300           case 'p':
4301             {
4302               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4303               char *buf = x;
4304               const char *y;
4305
4306               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
4307               y = cpp_predefines;
4308               while (*y != 0)
4309                 {
4310                   if (! strncmp (y, "-D", 2))
4311                     /* Copy the whole option.  */
4312                     while (*y && *y != ' ' && *y != '\t')
4313                       *x++ = *y++;
4314                   else if (*y == ' ' || *y == '\t')
4315                     /* Copy whitespace to the result.  */
4316                     *x++ = *y++;
4317                   /* Don't copy other options.  */
4318                   else
4319                     y++;
4320                 }
4321
4322               *x = 0;
4323
4324               value = do_spec_1 (buf, 0, NULL_PTR);
4325               if (value != 0)
4326                 return value;
4327             }
4328             break;
4329
4330           case 'P':
4331             {
4332               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4333               char *buf = x;
4334               const char *y;
4335
4336               /* Copy all of CPP_PREDEFINES into BUF,
4337                  but force them all into the reserved name space if they
4338                  aren't already there.  The reserved name space is all
4339                  identifiers beginning with two underscores or with one
4340                  underscore and a capital letter.  We do the forcing by
4341                  adding up to two underscores to the beginning and end
4342                  of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4343                  become __mips__.  */
4344               y = cpp_predefines;
4345               while (*y != 0)
4346                 {
4347                   if (! strncmp (y, "-D", 2))
4348                     {
4349                       int flag = 0;
4350
4351                       *x++ = *y++;
4352                       *x++ = *y++;
4353
4354                       if (*y != '_'
4355                           || (*(y+1) != '_'
4356                               && ! ISUPPER ((unsigned char)*(y+1))))
4357                         {
4358                           /* Stick __ at front of macro name.  */
4359                           if (*y != '_')
4360                             *x++ = '_';
4361                           *x++ = '_';
4362                           /* Arrange to stick __ at the end as well.  */
4363                           flag = 1;
4364                         }
4365
4366                       /* Copy the macro name.  */
4367                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
4368                         *x++ = *y++;
4369
4370                       if (flag)
4371                         {
4372                           if (x[-1] != '_')
4373                             {
4374                               if (x[-2] != '_')
4375                                 *x++ = '_';
4376                               *x++ = '_';
4377                             }
4378                         }
4379
4380                       /* Copy the value given, if any.  */
4381                       while (*y && *y != ' ' && *y != '\t')
4382                         *x++ = *y++;
4383                     }
4384                   else if (*y == ' ' || *y == '\t')
4385                     /* Copy whitespace to the result.  */
4386                     *x++ = *y++;
4387                   /* Don't copy -A options  */
4388                   else
4389                     y++;
4390                 }
4391               *x++ = ' ';
4392
4393               /* Copy all of CPP_PREDEFINES into BUF,
4394                  but put __ after every -D.  */
4395               y = cpp_predefines;
4396               while (*y != 0)
4397                 {
4398                   if (! strncmp (y, "-D", 2))
4399                     {
4400                       y += 2;
4401
4402                       if (*y != '_'
4403                           || (*(y+1) != '_'
4404                               && ! ISUPPER ((unsigned char)*(y+1))))
4405                         {
4406                           /* Stick -D__ at front of macro name.  */
4407                           *x++ = '-';
4408                           *x++ = 'D';
4409                           if (*y != '_')
4410                             *x++ = '_';
4411                           *x++ = '_';
4412
4413                           /* Copy the macro name.  */
4414                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
4415                             *x++ = *y++;
4416
4417                           /* Copy the value given, if any.  */
4418                           while (*y && *y != ' ' && *y != '\t')
4419                             *x++ = *y++;
4420                         }
4421                       else
4422                         {
4423                           /* Do not copy this macro - we have just done it before */
4424                           while (*y && *y != ' ' && *y != '\t')
4425                             y++;
4426                         }
4427                     }
4428                   else if (*y == ' ' || *y == '\t')
4429                     /* Copy whitespace to the result.  */
4430                     *x++ = *y++;
4431                   /* Don't copy -A options.  */
4432                   else
4433                     y++;
4434                 }
4435               *x++ = ' ';
4436
4437               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4438               y = cpp_predefines;
4439               while (*y != 0)
4440                 {
4441                   if (! strncmp (y, "-A", 2))
4442                     /* Copy the whole option.  */
4443                     while (*y && *y != ' ' && *y != '\t')
4444                       *x++ = *y++;
4445                   else if (*y == ' ' || *y == '\t')
4446                     /* Copy whitespace to the result.  */
4447                     *x++ = *y++;
4448                   /* Don't copy other options.  */
4449                   else
4450                     y++;
4451                 }
4452
4453               *x = 0;
4454
4455               value = do_spec_1 (buf, 0, NULL_PTR);
4456               if (value != 0)
4457                 return value;
4458             }
4459             break;
4460
4461           case 'S':
4462             value = do_spec_1 (startfile_spec, 0, NULL_PTR);
4463             if (value != 0)
4464               return value;
4465             break;
4466
4467             /* Here we define characters other than letters and digits.  */
4468
4469           case '{':
4470             p = handle_braces (p);
4471             if (p == 0)
4472               return -1;
4473             break;
4474
4475           case '%':
4476             obstack_1grow (&obstack, '%');
4477             break;
4478
4479           case '*':
4480             if (soft_matched_part)
4481               {
4482                 do_spec_1 (soft_matched_part, 1, NULL_PTR);
4483                 do_spec_1 (" ", 0, NULL_PTR);
4484               }
4485             else
4486               /* Catch the case where a spec string contains something like
4487                  '%{foo:%*}'.  ie there is no * in the pattern on the left
4488                  hand side of the :.  */
4489               error ("Spec failure: '%%*' has not been initialised by pattern match");
4490             break;
4491
4492             /* Process a string found as the value of a spec given by name.
4493                This feature allows individual machine descriptions
4494                to add and use their own specs.
4495                %[...] modifies -D options the way %P does;
4496                %(...) uses the spec unmodified.  */
4497           case '[':
4498             error ("Warning: use of obsolete %%[ operator in specs");
4499           case '(':
4500             {
4501               const char *name = p;
4502               struct spec_list *sl;
4503               int len;
4504
4505               /* The string after the S/P is the name of a spec that is to be
4506                  processed.  */
4507               while (*p && *p != ')' && *p != ']')
4508                 p++;
4509
4510               /* See if it's in the list.  */
4511               for (len = p - name, sl = specs; sl; sl = sl->next)
4512                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4513                   {
4514                     name = *(sl->ptr_spec);
4515 #ifdef DEBUG_SPECS
4516                     notice ("Processing spec %c%s%c, which is '%s'\n",
4517                             c, sl->name, (c == '(') ? ')' : ']', name);
4518 #endif
4519                     break;
4520                   }
4521
4522               if (sl)
4523                 {
4524                   if (c == '(')
4525                     {
4526                       value = do_spec_1 (name, 0, NULL_PTR);
4527                       if (value != 0)
4528                         return value;
4529                     }
4530                   else
4531                     {
4532                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4533                       char *buf = x;
4534                       const char *y = name;
4535                       int flag = 0;
4536
4537                       /* Copy all of NAME into BUF, but put __ after
4538                          every -D and at the end of each arg.  */
4539                       while (1)
4540                         {
4541                           if (! strncmp (y, "-D", 2))
4542                             {
4543                               *x++ = '-';
4544                               *x++ = 'D';
4545                               *x++ = '_';
4546                               *x++ = '_';
4547                               y += 2;
4548                               flag = 1;
4549                               continue;
4550                             }
4551                           else if (flag && (*y == ' ' || *y == '\t' || *y == '='
4552                                             || *y == '}' || *y == 0))
4553                             {
4554                               *x++ = '_';
4555                               *x++ = '_';
4556                               flag = 0;
4557                             }
4558                           if (*y == 0)
4559                             break;
4560                           else
4561                             *x++ = *y++;
4562                         }
4563                       *x = 0;
4564
4565                       value = do_spec_1 (buf, 0, NULL_PTR);
4566                       if (value != 0)
4567                         return value;
4568                     }
4569                 }
4570
4571               /* Discard the closing paren or bracket.  */
4572               if (*p)
4573                 p++;
4574             }
4575             break;
4576
4577           case 'v':
4578             {
4579               int c1 = *p++;  /* Select first or second version number.  */
4580               const char *v = compiler_version;
4581               const char *q;
4582               static const char zeroc = '0';
4583
4584               /* The format of the version string is
4585                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
4586
4587               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
4588               while (! ISDIGIT (*v))
4589                 v++;
4590               if (v > compiler_version && v[-1] != '-')
4591                 abort ();
4592
4593               /* If desired, advance to second version number.  */
4594               if (c1 >= '2')
4595                 {
4596                   /* Set V after the first period.  */
4597                   while (ISDIGIT (*v))
4598                     v++;
4599                   if (*v != '.')
4600                     abort ();
4601                   v++;
4602                 }
4603
4604               /* If desired, advance to third version number.
4605                  But don't complain if it's not present */
4606               if (c1 == '3')
4607                 {
4608                   /* Set V after the second period.  */
4609                   while (ISDIGIT (*v))
4610                     v++;
4611                   if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
4612                     abort ();
4613                   if (*v != 0)
4614                       v++;
4615                 }
4616
4617               /* Set Q at the next period or at the end.  */
4618               q = v;
4619               while (ISDIGIT (*q))
4620                 q++;
4621               if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
4622                 abort ();
4623
4624               if (q > v)
4625                 /* Put that part into the command.  */
4626                 obstack_grow (&obstack, v, q - v);
4627               else
4628                 /* Default to "0" */
4629                 obstack_grow (&obstack, &zeroc, 1);
4630               arg_going = 1;
4631             }
4632             break;
4633
4634           case '|':
4635             if (input_from_pipe)
4636               do_spec_1 ("-", 0, NULL_PTR);
4637             break;
4638
4639           default:
4640             error ("Spec failure: Unrecognised spec option '%c'", c);
4641             break;
4642           }
4643         break;
4644
4645       case '\\':
4646         /* Backslash: treat next character as ordinary.  */
4647         c = *p++;
4648
4649         /* fall through */
4650       default:
4651         /* Ordinary character: put it into the current argument.  */
4652         obstack_1grow (&obstack, c);
4653         arg_going = 1;
4654       }
4655
4656   return 0;             /* End of string */
4657 }
4658
4659 /* Return 0 if we call do_spec_1 and that returns -1.  */
4660
4661 static const char *
4662 handle_braces (p)
4663      register const char *p;
4664 {
4665   const char *filter, *body = NULL, *endbody = NULL;
4666   int pipe_p = 0;
4667   int negate;
4668   int suffix;
4669   int include_blanks = 1;
4670   int elide_switch = 0;
4671
4672   if (*p == '^')
4673     {
4674       /* A '^' after the open-brace means to not give blanks before args.  */
4675       include_blanks = 0;
4676       ++p;
4677     }
4678
4679   if (*p == '|')
4680     {
4681       /* A `|' after the open-brace means,
4682          if the test fails, output a single minus sign rather than nothing.
4683          This is used in %{|!pipe:...}.  */
4684       pipe_p = 1;
4685       ++p;
4686     }
4687
4688   if (*p == '<')
4689     {
4690       /* A `<' after the open-brace means that the switch should be
4691          removed from the command-line.  */
4692       elide_switch = 1;
4693       ++p;
4694     }
4695
4696 next_member:
4697   negate = suffix = 0;
4698
4699   if (*p == '!')
4700     /* A `!' after the open-brace negates the condition:
4701        succeed if the specified switch is not present.  */
4702     negate = 1, ++p;
4703
4704   if (*p == '.')
4705     /* A `.' after the open-brace means test against the current suffix.  */
4706     {
4707       if (pipe_p)
4708         abort ();
4709
4710       suffix = 1;
4711       ++p;
4712     }
4713
4714   if (elide_switch && (negate || pipe_p || suffix))
4715     {
4716       /* It doesn't make sense to mix elision with other flags.  We
4717          could fatal() here, but the standard seems to be to abort.  */
4718       abort ();
4719     }
4720
4721   filter = p;
4722   while (*p != ':' && *p != '}' && *p != '|') p++;
4723
4724   if (*p == '|' && pipe_p)
4725     abort ();
4726
4727   if (!body)
4728     {
4729       if (*p != '}')
4730         {
4731           register int count = 1;
4732           register const char *q = p;
4733
4734           while (*q++ != ':') continue;
4735           body = q;
4736           
4737           while (count > 0)
4738             {
4739               if (*q == '{')
4740                 count++;
4741               else if (*q == '}')
4742                 count--;
4743               else if (*q == 0)
4744                 abort ();
4745               q++;
4746             }
4747           endbody = q;
4748         }
4749       else
4750         body = p, endbody = p+1;
4751     }
4752
4753   if (suffix)
4754     {
4755       int found = (input_suffix != 0
4756                    && (long) strlen (input_suffix) == (long)(p - filter)
4757                    && strncmp (input_suffix, filter, p - filter) == 0);
4758
4759       if (body[0] == '}')
4760         abort ();
4761
4762       if (negate != found
4763           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL_PTR) < 0)
4764         return 0;
4765     }
4766   else if (p[-1] == '*' && p[0] == '}')
4767     {
4768       /* Substitute all matching switches as separate args.  */
4769       register int i;
4770       --p;
4771       for (i = 0; i < n_switches; i++)
4772         if (!strncmp (switches[i].part1, filter, p - filter)
4773             && check_live_switch (i, p - filter))
4774           give_switch (i, 0, include_blanks);
4775     }
4776   else
4777     {
4778       /* Test for presence of the specified switch.  */
4779       register int i;
4780       int present = 0;
4781
4782       /* If name specified ends in *, as in {x*:...},
4783          check for %* and handle that case.  */
4784       if (p[-1] == '*' && !negate)
4785         {
4786           int substitution;
4787           const char *r = body;
4788
4789           /* First see whether we have %*.  */
4790           substitution = 0;
4791           while (r < endbody)
4792             {
4793               if (*r == '%' && r[1] == '*')
4794                 substitution = 1;
4795               r++;
4796             }
4797           /* If we do, handle that case.  */
4798           if (substitution)
4799             {
4800               /* Substitute all matching switches as separate args.
4801                  But do this by substituting for %*
4802                  in the text that follows the colon.  */
4803
4804               unsigned hard_match_len = p - filter - 1;
4805               char *string = save_string (body, endbody - body - 1);
4806
4807               for (i = 0; i < n_switches; i++)
4808                 if (!strncmp (switches[i].part1, filter, hard_match_len)
4809                     && check_live_switch (i, -1))
4810                   {
4811                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4812                     /* Pass any arguments this switch has.  */
4813                     give_switch (i, 1, 1);
4814                   }
4815
4816               /* We didn't match.  Try again.  */
4817               if (*p++ == '|')
4818                 goto next_member;
4819               return endbody;
4820             }
4821         }
4822
4823       /* If name specified ends in *, as in {x*:...},
4824          check for presence of any switch name starting with x.  */
4825       if (p[-1] == '*')
4826         {
4827           for (i = 0; i < n_switches; i++)
4828             {
4829               unsigned hard_match_len = p - filter - 1;
4830
4831               if (!strncmp (switches[i].part1, filter, hard_match_len)
4832                   && check_live_switch (i, hard_match_len))
4833                 {
4834                   present = 1;
4835                   break;
4836                 }
4837             }
4838         }
4839       /* Otherwise, check for presence of exact name specified.  */
4840       else
4841         {
4842           for (i = 0; i < n_switches; i++)
4843             {
4844               if (!strncmp (switches[i].part1, filter, p - filter)
4845                   && switches[i].part1[p - filter] == 0
4846                   && check_live_switch (i, -1))
4847                 {
4848                   present = 1;
4849                   break;
4850                 }
4851             }
4852         }
4853
4854       /* If it is as desired (present for %{s...}, absent for %{!s...})
4855          then substitute either the switch or the specified
4856          conditional text.  */
4857       if (present != negate)
4858         {
4859           if (elide_switch)
4860             {
4861               switches[i].live_cond = SWITCH_IGNORE;
4862               switches[i].validated = 1;
4863             }
4864           else if (*p == '}')
4865             {
4866               give_switch (i, 0, include_blanks);
4867             }
4868           else
4869             {
4870               if (do_spec_1 (save_string (body, endbody - body - 1),
4871                              0, NULL_PTR) < 0)
4872                 return 0;
4873             }
4874         }
4875       else if (pipe_p)
4876         {
4877           /* Here if a %{|...} conditional fails: output a minus sign,
4878              which means "standard output" or "standard input".  */
4879           do_spec_1 ("-", 0, NULL_PTR);
4880           return endbody;
4881         }
4882     }
4883
4884   /* We didn't match; try again.  */
4885   if (*p++ == '|')
4886     goto next_member;
4887
4888   return endbody;
4889 }
4890 \f
4891 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4892    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
4893    spec, or -1 if either exact match or %* is used.
4894
4895    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
4896    whose value does not begin with "no-" is obsoleted by the same value
4897    with the "no-", similarly for a switch with the "no-" prefix.  */
4898
4899 static int
4900 check_live_switch (switchnum, prefix_length)
4901      int switchnum;
4902      int prefix_length;
4903 {
4904   const char *name = switches[switchnum].part1;
4905   int i;
4906
4907   /* In the common case of {<at-most-one-letter>*}, a negating
4908      switch would always match, so ignore that case.  We will just
4909      send the conflicting switches to the compiler phase.  */
4910   if (prefix_length >= 0 && prefix_length <= 1)
4911     return 1;
4912
4913   /* If we already processed this switch and determined if it was
4914      live or not, return our past determination.  */
4915   if (switches[switchnum].live_cond != 0)
4916     return switches[switchnum].live_cond > 0;
4917
4918   /* Now search for duplicate in a manner that depends on the name.  */
4919   switch (*name)
4920     {
4921     case 'O':
4922         for (i = switchnum + 1; i < n_switches; i++)
4923           if (switches[i].part1[0] == 'O')
4924             {
4925               switches[switchnum].validated = 1;
4926               switches[switchnum].live_cond = SWITCH_FALSE;
4927               return 0;
4928             }
4929       break;
4930
4931     case 'W':  case 'f':  case 'm':
4932       if (! strncmp (name + 1, "no-", 3))
4933         {
4934           /* We have Xno-YYY, search for XYYY.  */
4935           for (i = switchnum + 1; i < n_switches; i++)
4936             if (switches[i].part1[0] == name[0]
4937                 && ! strcmp (&switches[i].part1[1], &name[4]))
4938             {
4939               switches[switchnum].validated = 1;
4940               switches[switchnum].live_cond = SWITCH_FALSE;
4941               return 0;
4942             }
4943         }
4944       else
4945         {
4946           /* We have XYYY, search for Xno-YYY.  */
4947           for (i = switchnum + 1; i < n_switches; i++)
4948             if (switches[i].part1[0] == name[0]
4949                 && switches[i].part1[1] == 'n'
4950                 && switches[i].part1[2] == 'o'
4951                 && switches[i].part1[3] == '-'
4952                 && !strcmp (&switches[i].part1[4], &name[1]))
4953             {
4954               switches[switchnum].validated = 1;
4955               switches[switchnum].live_cond = SWITCH_FALSE;
4956               return 0;
4957             }
4958         }
4959       break;
4960     }
4961
4962   /* Otherwise the switch is live.  */
4963   switches[switchnum].live_cond = SWITCH_LIVE;
4964   return 1;
4965 }
4966 \f
4967 /* Pass a switch to the current accumulating command
4968    in the same form that we received it.
4969    SWITCHNUM identifies the switch; it is an index into
4970    the vector of switches gcc received, which is `switches'.
4971    This cannot fail since it never finishes a command line.
4972
4973    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
4974
4975    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
4976    of the switch.  */
4977
4978 static void
4979 give_switch (switchnum, omit_first_word, include_blanks)
4980      int switchnum;
4981      int omit_first_word;
4982      int include_blanks;
4983 {
4984   if (switches[switchnum].live_cond == SWITCH_IGNORE)
4985     return;
4986
4987   if (!omit_first_word)
4988     {
4989       do_spec_1 ("-", 0, NULL_PTR);
4990       do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
4991     }
4992
4993   if (switches[switchnum].args != 0)
4994     {
4995       const char **p;
4996       for (p = switches[switchnum].args; *p; p++)
4997         {
4998           if (include_blanks)
4999             do_spec_1 (" ", 0, NULL_PTR);
5000           do_spec_1 (*p, 1, NULL_PTR);
5001         }
5002     }
5003
5004   do_spec_1 (" ", 0, NULL_PTR);
5005   switches[switchnum].validated = 1;
5006 }
5007 \f
5008 /* Search for a file named NAME trying various prefixes including the
5009    user's -B prefix and some standard ones.
5010    Return the absolute file name found.  If nothing is found, return NAME.  */
5011
5012 static const char *
5013 find_file (name)
5014      const char *name;
5015 {
5016   char *newname;
5017
5018   /* Try multilib_dir if it is defined.  */
5019   if (multilib_dir != NULL)
5020     {
5021       char *try;
5022
5023       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
5024       strcpy (try, multilib_dir);
5025       strcat (try, dir_separator_str);
5026       strcat (try, name);
5027
5028       newname = find_a_file (&startfile_prefixes, try, R_OK);
5029
5030       /* If we don't find it in the multi library dir, then fall
5031          through and look for it in the normal places.  */
5032       if (newname != NULL)
5033         return newname;
5034     }
5035
5036   newname = find_a_file (&startfile_prefixes, name, R_OK);
5037   return newname ? newname : name;
5038 }
5039
5040 /* Determine whether a directory exists.  If LINKER, return 0 for
5041    certain fixed names not needed by the linker.  If not LINKER, it is
5042    only important to return 0 if the host machine has a small ARG_MAX
5043    limit.  */
5044
5045 static int
5046 is_directory (path1, path2, linker)
5047      const char *path1;
5048      const char *path2;
5049      int linker;
5050 {
5051   int len1 = strlen (path1);
5052   int len2 = strlen (path2);
5053   char *path = (char *) alloca (3 + len1 + len2);
5054   char *cp;
5055   struct stat st;
5056
5057 #ifndef SMALL_ARG_MAX
5058   if (! linker)
5059     return 1;
5060 #endif
5061
5062   /* Construct the path from the two parts.  Ensure the string ends with "/.".
5063      The resulting path will be a directory even if the given path is a
5064      symbolic link.  */
5065   memcpy (path, path1, len1);
5066   memcpy (path + len1, path2, len2);
5067   cp = path + len1 + len2;
5068   if (!IS_DIR_SEPARATOR (cp[-1]))
5069     *cp++ = DIR_SEPARATOR;
5070   *cp++ = '.';
5071   *cp = '\0';
5072
5073   /* Exclude directories that the linker is known to search.  */
5074   if (linker
5075       && ((cp - path == 6
5076            && strcmp (path, concat (dir_separator_str, "lib", 
5077                                     dir_separator_str, ".", NULL_PTR)) == 0)
5078           || (cp - path == 10
5079               && strcmp (path, concat (dir_separator_str, "usr", 
5080                                        dir_separator_str, "lib", 
5081                                        dir_separator_str, ".", NULL_PTR)) == 0)))
5082     return 0;
5083
5084   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5085 }
5086
5087 /* Set up the various global variables to indicate that we're processing
5088    the input file named FILENAME.  */
5089
5090 static void
5091 set_input (filename)
5092      const char *filename;
5093 {
5094   register const char *p;
5095
5096   input_filename = filename;
5097   input_filename_length = strlen (input_filename);
5098   
5099   input_basename = input_filename;
5100 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5101   /* Skip drive name so 'x:foo' is handled properly.  */
5102   if (input_basename[1] == ':')
5103     input_basename += 2;
5104 #endif
5105   for (p = input_basename; *p; p++)
5106     if (IS_DIR_SEPARATOR (*p))
5107       input_basename = p + 1;
5108
5109   /* Find a suffix starting with the last period,
5110      and set basename_length to exclude that suffix.  */
5111   basename_length = strlen (input_basename);
5112   p = input_basename + basename_length;
5113   while (p != input_basename && *p != '.') --p;
5114   if (*p == '.' && p != input_basename)
5115     {
5116       basename_length = p - input_basename;
5117       input_suffix = p + 1;
5118     }
5119   else
5120     input_suffix = "";
5121 }
5122 \f
5123 /* On fatal signals, delete all the temporary files.  */
5124
5125 static void
5126 fatal_error (signum)
5127      int signum;
5128 {
5129   signal (signum, SIG_DFL);
5130   delete_failure_queue ();
5131   delete_temp_files ();
5132   /* Get the same signal again, this time not handled,
5133      so its normal effect occurs.  */
5134   kill (getpid (), signum);
5135 }
5136
5137 extern int main PARAMS ((int, char **));
5138
5139 int
5140 main (argc, argv)
5141      int argc;
5142      char **argv;
5143 {
5144   register size_t i;
5145   size_t j;
5146   int value;
5147   int linker_was_run = 0;
5148   char *explicit_link_files;
5149   char *specs_file;
5150   const char *p;
5151   struct user_specs *uptr;
5152
5153   p = argv[0] + strlen (argv[0]);
5154   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5155     --p;
5156   programname = p;
5157
5158 #ifdef HAVE_LC_MESSAGES
5159   setlocale (LC_MESSAGES, "");
5160 #endif
5161   (void) bindtextdomain (PACKAGE, localedir);
5162   (void) textdomain (PACKAGE);
5163
5164   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5165     signal (SIGINT, fatal_error);
5166 #ifdef SIGHUP
5167   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5168     signal (SIGHUP, fatal_error);
5169 #endif
5170   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5171     signal (SIGTERM, fatal_error);
5172 #ifdef SIGPIPE
5173   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5174     signal (SIGPIPE, fatal_error);
5175 #endif
5176
5177   argbuf_length = 10;
5178   argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
5179
5180   obstack_init (&obstack);
5181
5182   /* Build multilib_select, et. al from the separate lines that make up each
5183      multilib selection.  */
5184   {
5185     const char *const *q = multilib_raw;
5186     int need_space;
5187
5188     obstack_init (&multilib_obstack);
5189     while ((p = *q++) != (char *) 0)
5190       obstack_grow (&multilib_obstack, p, strlen (p));
5191
5192     obstack_1grow (&multilib_obstack, 0);
5193     multilib_select = obstack_finish (&multilib_obstack);
5194
5195     q = multilib_matches_raw;
5196     while ((p = *q++) != (char *) 0)
5197       obstack_grow (&multilib_obstack, p, strlen (p));
5198
5199     obstack_1grow (&multilib_obstack, 0);
5200     multilib_matches = obstack_finish (&multilib_obstack);
5201
5202     q = multilib_exclusions_raw;
5203     while ((p = *q++) != (char *) 0)
5204         obstack_grow (&multilib_obstack, p, strlen (p));
5205
5206     obstack_1grow (&multilib_obstack, 0);
5207     multilib_exclusions = obstack_finish (&multilib_obstack);
5208     
5209     need_space = FALSE;
5210     for (i = 0;
5211          i < sizeof (multilib_defaults_raw) / sizeof (multilib_defaults_raw[0]);
5212          i++)
5213       {
5214         if (need_space)
5215           obstack_1grow (&multilib_obstack, ' ');
5216         obstack_grow (&multilib_obstack,
5217                       multilib_defaults_raw[i],
5218                       strlen (multilib_defaults_raw[i]));
5219         need_space = TRUE;
5220       }
5221
5222     obstack_1grow (&multilib_obstack, 0);
5223     multilib_defaults = obstack_finish (&multilib_obstack);
5224   }
5225
5226   /* Set up to remember the pathname of gcc and any options
5227      needed for collect.  We use argv[0] instead of programname because
5228      we need the complete pathname.  */
5229   obstack_init (&collect_obstack);
5230   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
5231   obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
5232   putenv (obstack_finish (&collect_obstack));
5233
5234 #ifdef INIT_ENVIRONMENT
5235   /* Set up any other necessary machine specific environment variables.  */
5236   putenv (INIT_ENVIRONMENT);
5237 #endif
5238
5239   /* Choose directory for temp files.  */
5240
5241 #ifndef MKTEMP_EACH_FILE
5242   temp_filename = choose_temp_base ();
5243   temp_filename_length = strlen (temp_filename);
5244 #endif
5245
5246   /* Make a table of what switches there are (switches, n_switches).
5247      Make a table of specified input files (infiles, n_infiles).
5248      Decode switches that are handled locally.  */
5249
5250   process_command (argc, argv);
5251
5252   {
5253     int first_time;
5254
5255     /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5256        the compiler.  */
5257     obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5258                   sizeof ("COLLECT_GCC_OPTIONS=")-1);
5259
5260     first_time = TRUE;
5261     for (i = 0; (int)i < n_switches; i++)
5262       {
5263         const char **args;
5264         const char *p, *q;
5265         if (!first_time)
5266           obstack_grow (&collect_obstack, " ", 1);
5267
5268         first_time = FALSE;
5269         obstack_grow (&collect_obstack, "'-", 2);
5270         q = switches[i].part1;
5271         while ((p = index (q,'\'')))
5272           {
5273             obstack_grow (&collect_obstack, q, p-q);
5274             obstack_grow (&collect_obstack, "'\\''", 4);
5275             q = ++p;
5276           }
5277         obstack_grow (&collect_obstack, q, strlen (q));
5278         obstack_grow (&collect_obstack, "'", 1);
5279
5280         for (args = switches[i].args; args && *args; args++)
5281           {
5282             obstack_grow (&collect_obstack, " '", 2);
5283             q = *args;
5284             while ((p = index (q,'\'')))
5285               {
5286                 obstack_grow (&collect_obstack, q, p-q);
5287                 obstack_grow (&collect_obstack, "'\\''", 4);
5288                 q = ++p;
5289               }
5290             obstack_grow (&collect_obstack, q, strlen (q));
5291             obstack_grow (&collect_obstack, "'", 1);
5292           }
5293       }
5294     obstack_grow (&collect_obstack, "\0", 1);
5295     putenv (obstack_finish (&collect_obstack));
5296   }
5297
5298   /* Initialize the vector of specs to just the default.
5299      This means one element containing 0s, as a terminator.  */
5300
5301   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
5302   bcopy ((char *) default_compilers, (char *) compilers,
5303          sizeof default_compilers);
5304   n_compilers = n_default_compilers;
5305
5306   /* Read specs from a file if there is one.  */
5307
5308   machine_suffix = concat (spec_machine, dir_separator_str,
5309                            spec_version, dir_separator_str, NULL_PTR);
5310   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
5311
5312   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
5313   /* Read the specs file unless it is a default one.  */
5314   if (specs_file != 0 && strcmp (specs_file, "specs"))
5315     read_specs (specs_file, TRUE);
5316   else
5317     init_spec ();
5318
5319   /* We need to check standard_exec_prefix/just_machine_suffix/specs
5320      for any override of as, ld and libraries.  */
5321   specs_file = (char *) alloca (strlen (standard_exec_prefix)
5322                                 + strlen (just_machine_suffix)
5323                                 + sizeof ("specs"));
5324
5325   strcpy (specs_file, standard_exec_prefix);
5326   strcat (specs_file, just_machine_suffix);
5327   strcat (specs_file, "specs");
5328   if (access (specs_file, R_OK) == 0)
5329     read_specs (specs_file, TRUE);
5330  
5331   /* If not cross-compiling, look for startfiles in the standard places.  */
5332   if (*cross_compile == '0')
5333     {
5334 #ifdef MD_EXEC_PREFIX
5335       add_prefix (&exec_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
5336       add_prefix (&startfile_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
5337 #endif
5338
5339 #ifdef MD_STARTFILE_PREFIX
5340       add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5341                   0, 0, NULL_PTR);
5342 #endif
5343
5344 #ifdef MD_STARTFILE_PREFIX_1
5345       add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5346                   0, 0, NULL_PTR);
5347 #endif
5348
5349       /* If standard_startfile_prefix is relative, base it on
5350          standard_exec_prefix.  This lets us move the installed tree
5351          as a unit.  If GCC_EXEC_PREFIX is defined, base
5352          standard_startfile_prefix on that as well.  */
5353       if (IS_DIR_SEPARATOR (*standard_startfile_prefix)
5354             || *standard_startfile_prefix == '$'
5355 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5356             /* Check for disk name on MS-DOS-based systems.  */
5357           || (standard_startfile_prefix[1] == ':'
5358               && (IS_DIR_SEPARATOR (standard_startfile_prefix[2])))
5359 #endif
5360           )
5361         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5362                     0, 0, NULL_PTR);
5363       else
5364         {
5365           if (gcc_exec_prefix)
5366             add_prefix (&startfile_prefixes,
5367                         concat (gcc_exec_prefix, machine_suffix,
5368                                 standard_startfile_prefix, NULL_PTR),
5369                         NULL_PTR, 0, 0, NULL_PTR);
5370           add_prefix (&startfile_prefixes,
5371                       concat (standard_exec_prefix,
5372                               machine_suffix,
5373                               standard_startfile_prefix, NULL_PTR),
5374                       NULL_PTR, 0, 0, NULL_PTR);
5375         }                      
5376
5377       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5378                   "BINUTILS", 0, 0, NULL_PTR);
5379       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5380                   "BINUTILS", 0, 0, NULL_PTR);
5381 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
5382       add_prefix (&startfile_prefixes, "./", NULL_PTR, 0, 1, NULL_PTR);
5383 #endif
5384     }
5385   else
5386     {
5387       if (!IS_DIR_SEPARATOR (*standard_startfile_prefix) && gcc_exec_prefix)
5388         add_prefix (&startfile_prefixes,
5389                     concat (gcc_exec_prefix, machine_suffix,
5390                             standard_startfile_prefix, NULL_PTR),
5391                     "BINUTILS", 0, 0, NULL_PTR);
5392     }
5393
5394   /* Process any user specified specs in the order given on the command
5395      line.  */
5396   for (uptr = user_specs_head; uptr; uptr = uptr->next)
5397     {
5398       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5399       read_specs (filename ? filename : uptr->filename, FALSE);
5400     }
5401
5402   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
5403   if (gcc_exec_prefix)
5404     {
5405       char * temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5406                                       + strlen (spec_version)
5407                                       + strlen (spec_machine) + 3);
5408       strcpy (temp, gcc_exec_prefix);
5409       strcat (temp, spec_machine);
5410       strcat (temp, dir_separator_str);
5411       strcat (temp, spec_version);
5412       strcat (temp, dir_separator_str);
5413       gcc_exec_prefix = temp;
5414     }
5415
5416   /* Now we have the specs.
5417      Set the `valid' bits for switches that match anything in any spec.  */
5418
5419   validate_all_switches ();
5420
5421   /* Now that we have the switches and the specs, set
5422      the subdirectory based on the options.  */
5423   set_multilib_dir ();
5424
5425   /* Warn about any switches that no pass was interested in.  */
5426
5427   for (i = 0; (int)i < n_switches; i++)
5428     if (! switches[i].validated)
5429       error ("unrecognized option `-%s'", switches[i].part1);
5430
5431   /* Obey some of the options.  */
5432
5433   if (print_search_dirs)
5434     {
5435       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5436       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5437       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
5438       return (0);
5439     }
5440
5441   if (print_file_name)
5442     {
5443       printf ("%s\n", find_file (print_file_name));
5444       return (0);
5445     }
5446
5447   if (print_prog_name)
5448     {
5449       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
5450       printf ("%s\n", (newname ? newname : print_prog_name));
5451       return (0);
5452     }
5453
5454   if (print_multi_lib)
5455     {
5456       print_multilib_info ();
5457       return (0);
5458     }
5459
5460   if (print_multi_directory)
5461     {
5462       if (multilib_dir == NULL)
5463         printf (".\n");
5464       else
5465         printf ("%s\n", multilib_dir);
5466       return (0);
5467     }
5468
5469   if (print_help_list)
5470     {
5471       display_help ();
5472
5473       if (! verbose_flag)
5474         {
5475           printf (_("\nFor bug reporting instructions, please see:\n"));
5476           printf ("%s.\n", GCCBUGURL);
5477           
5478           return (0);
5479         }
5480
5481       /* We do not exit here.  Instead we have created a fake input file
5482          called 'help-dummy' which needs to be compiled, and we pass this
5483          on the the various sub-processes, along with the --help switch.  */
5484     }
5485   
5486   if (verbose_flag)
5487     {
5488       int n;
5489
5490       /* compiler_version is truncated at the first space when initialized
5491          from version string, so truncate version_string at the first space
5492          before comparing.  */
5493       for (n = 0; version_string[n]; n++)
5494         if (version_string[n] == ' ')
5495           break;
5496
5497       if (! strncmp (version_string, compiler_version, n)
5498           && compiler_version[n] == 0)
5499         notice ("gcc version %s\n", version_string);
5500       else
5501         notice ("gcc driver version %s executing gcc version %s\n",
5502                 version_string, compiler_version);
5503
5504       if (n_infiles == 0)
5505         return (0);
5506     }
5507
5508   if (n_infiles == added_libraries)
5509     fatal ("No input files");
5510
5511   /* Make a place to record the compiler output file names
5512      that correspond to the input files.  */
5513
5514   i = n_infiles;
5515   i += lang_specific_extra_outfiles;
5516   outfiles = (const char **) xcalloc (i, sizeof (char *));
5517
5518   /* Record which files were specified explicitly as link input.  */
5519
5520   explicit_link_files = xcalloc (1, n_infiles);
5521
5522   for (i = 0; (int)i < n_infiles; i++)
5523     {
5524       register struct compiler *cp = 0;
5525       int this_file_error = 0;
5526
5527       /* Tell do_spec what to substitute for %i.  */
5528
5529       input_file_number = i;
5530       set_input (infiles[i].name);
5531
5532       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5533
5534       outfiles[i] = input_filename;
5535
5536       /* Figure out which compiler from the file's suffix.  */
5537
5538       cp = lookup_compiler (infiles[i].name, input_filename_length,
5539                             infiles[i].language);
5540
5541       if (cp)
5542         {
5543           /* Ok, we found an applicable compiler.  Run its spec.  */
5544           /* First say how much of input_filename to substitute for %b  */
5545           int len;
5546
5547           if (cp->spec[0][0] == '#')
5548             error ("%s: %s compiler not installed on this system",
5549                    input_filename, &cp->spec[0][1]);
5550
5551           len = 0;
5552           for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5553             if (cp->spec[j])
5554               len += strlen (cp->spec[j]);
5555
5556           {
5557             char *p1 = (char *) xmalloc (len + 1);
5558             
5559             len = 0;
5560             for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5561               if (cp->spec[j])
5562                 {
5563                   strcpy (p1 + len, cp->spec[j]);
5564                   len += strlen (cp->spec[j]);
5565                 }
5566             
5567             value = do_spec (p1);
5568             free (p1);
5569           }
5570           if (value < 0)
5571             this_file_error = 1;
5572         }
5573
5574       /* If this file's name does not contain a recognized suffix,
5575          record it as explicit linker input.  */
5576
5577       else
5578         explicit_link_files[i] = 1;
5579
5580       /* Clear the delete-on-failure queue, deleting the files in it
5581          if this compilation failed.  */
5582
5583       if (this_file_error)
5584         {
5585           delete_failure_queue ();
5586           error_count++;
5587         }
5588       /* If this compilation succeeded, don't delete those files later.  */
5589       clear_failure_queue ();
5590     }
5591
5592   /* Reset the output file name to the first input file name, for use
5593      with %b in LINK_SPEC on a target that prefers not to emit a.out
5594      by default.  */
5595   if (n_infiles > 0)
5596     set_input (infiles[0].name);
5597
5598   if (error_count == 0)
5599     {
5600       /* Make sure INPUT_FILE_NUMBER points to first available open
5601          slot.  */
5602       input_file_number = n_infiles;
5603       if (lang_specific_pre_link ())
5604         error_count++;
5605     }
5606
5607   /* Run ld to link all the compiler output files.  */
5608
5609   if (error_count == 0)
5610     {
5611       int tmp = execution_count;
5612
5613       /* We'll use ld if we can't find collect2. */
5614       if (! strcmp (linker_name_spec, "collect2"))
5615         {
5616           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
5617           if (s == NULL)
5618             linker_name_spec = "ld";
5619         }
5620       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
5621          for collect.  */
5622       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
5623       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
5624
5625       value = do_spec (link_command_spec);
5626       if (value < 0)
5627         error_count = 1;
5628       linker_was_run = (tmp != execution_count);
5629     }
5630
5631   /* Warn if a -B option was specified but the prefix was never used.  */
5632   unused_prefix_warnings (&exec_prefixes);
5633   unused_prefix_warnings (&startfile_prefixes);
5634
5635   /* If options said don't run linker,
5636      complain about input files to be given to the linker.  */
5637
5638   if (! linker_was_run && error_count == 0)
5639     for (i = 0; (int)i < n_infiles; i++)
5640       if (explicit_link_files[i])
5641         error ("%s: linker input file unused since linking not done",
5642                outfiles[i]);
5643
5644   /* Delete some or all of the temporary files we made.  */
5645
5646   if (error_count)
5647     delete_failure_queue ();
5648   delete_temp_files ();
5649
5650   if (print_help_list)
5651     {
5652       printf (("\nFor bug reporting instructions, please see:\n"));
5653       printf ("%s\n", GCCBUGURL);
5654     }
5655   
5656   return (signal_count != 0 ? 2
5657           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
5658           : 0);
5659 }
5660
5661 /* Find the proper compilation spec for the file name NAME,
5662    whose length is LENGTH.  LANGUAGE is the specified language,
5663    or 0 if this file is to be passed to the linker.  */
5664
5665 static struct compiler *
5666 lookup_compiler (name, length, language)
5667      const char *name;
5668      size_t length;
5669      const char *language;
5670 {
5671   struct compiler *cp;
5672
5673   /* If this was specified by the user to be a linker input, indicate that.  */
5674   if (language != 0 && language[0] == '*')
5675     return 0;
5676
5677   /* Otherwise, look for the language, if one is spec'd.  */
5678   if (language != 0)
5679     {
5680       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5681         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
5682           return cp;
5683
5684       error ("language %s not recognized", language);
5685       return 0;
5686     }
5687
5688   /* Look for a suffix.  */
5689   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5690     {
5691       if (/* The suffix `-' matches only the file name `-'.  */
5692           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5693           || (strlen (cp->suffix) < length
5694               /* See if the suffix matches the end of NAME.  */
5695               && !strcmp (cp->suffix,
5696                           name + length - strlen (cp->suffix))
5697          ))
5698         break;
5699     }
5700
5701 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
5702   /* look again, but case-insensitively this time.  */
5703   if (cp < compilers)
5704     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5705       {
5706         if (/* The suffix `-' matches only the file name `-'.  */
5707             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5708             || (strlen (cp->suffix) < length
5709                 /* See if the suffix matches the end of NAME.  */
5710                 && ((!strcmp (cp->suffix,
5711                              name + length - strlen (cp->suffix))
5712                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
5713                     && !strcasecmp (cp->suffix,
5714                                     name + length - strlen (cp->suffix)))
5715            ))
5716           break;
5717       }
5718 #endif
5719
5720
5721   if (cp >= compilers)
5722     {
5723       if (cp->spec[0][0] == '@')
5724         {
5725           struct compiler *new;
5726
5727           /* An alias entry maps a suffix to a language.
5728              Search for the language; pass 0 for NAME and LENGTH
5729              to avoid infinite recursion if language not found.
5730              Construct the new compiler spec.  */
5731           language = cp->spec[0] + 1;
5732           new = (struct compiler *) xmalloc (sizeof (struct compiler));
5733           new->suffix = cp->suffix;
5734           memcpy (new->spec,
5735                   lookup_compiler (NULL_PTR, 0, language)->spec,
5736                   sizeof new->spec);
5737           return new;
5738         }
5739
5740       /* A non-alias entry: return it.  */
5741       return cp;
5742     }
5743
5744   return 0;
5745 }
5746 \f
5747 static char *
5748 save_string (s, len)
5749   const char *s;
5750   int len;
5751 {
5752   register char *result = xmalloc (len + 1);
5753
5754   bcopy (s, result, len);
5755   result[len] = 0;
5756   return result;
5757 }
5758
5759 static void
5760 pfatal_with_name (name)
5761      const char *name;
5762 {
5763   perror_with_name (name);
5764   delete_temp_files ();
5765   exit (1);
5766 }
5767
5768 static void
5769 perror_with_name (name)
5770      const char *name;
5771 {
5772   error ("%s: %s", name, xstrerror (errno));
5773 }
5774
5775 static void
5776 pfatal_pexecute (errmsg_fmt, errmsg_arg)
5777      const char *errmsg_fmt;
5778      const char *errmsg_arg;
5779 {
5780   if (errmsg_arg)
5781     {
5782       int save_errno = errno;
5783
5784       /* Space for trailing '\0' is in %s.  */
5785       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
5786       sprintf (msg, errmsg_fmt, errmsg_arg);
5787       errmsg_fmt = msg;
5788
5789       errno = save_errno;
5790     }
5791
5792   pfatal_with_name (errmsg_fmt);
5793 }
5794
5795 /* Output an error message and exit */
5796
5797 void
5798 fancy_abort ()
5799 {
5800   fatal ("Internal gcc abort.");
5801 }
5802 \f
5803 /* Output an error message and exit */
5804
5805 void
5806 fatal VPARAMS ((const char *msgid, ...))
5807 {
5808 #ifndef ANSI_PROTOTYPES
5809   const char *msgid;
5810 #endif
5811   va_list ap;
5812
5813   VA_START (ap, msgid);
5814
5815 #ifndef ANSI_PROTOTYPES
5816   msgid = va_arg (ap, const char *);
5817 #endif
5818
5819   fprintf (stderr, "%s: ", programname);
5820   vfprintf (stderr, _(msgid), ap);
5821   va_end (ap);
5822   fprintf (stderr, "\n");
5823   delete_temp_files ();
5824   exit (1);
5825 }
5826
5827 static void
5828 error VPARAMS ((const char *msgid, ...))
5829 {
5830 #ifndef ANSI_PROTOTYPES
5831   const char *msgid;
5832 #endif
5833   va_list ap;
5834
5835   VA_START (ap, msgid);
5836
5837 #ifndef ANSI_PROTOTYPES
5838   msgid = va_arg (ap, const char *);
5839 #endif
5840
5841   fprintf (stderr, "%s: ", programname);
5842   vfprintf (stderr, _(msgid), ap);
5843   va_end (ap);
5844
5845   fprintf (stderr, "\n");
5846 }
5847
5848 static void
5849 notice VPARAMS ((const char *msgid, ...))
5850 {
5851 #ifndef ANSI_PROTOTYPES
5852   const char *msgid;
5853 #endif
5854   va_list ap;
5855
5856   VA_START (ap, msgid);
5857
5858 #ifndef ANSI_PROTOTYPES
5859   msgid = va_arg (ap, const char *);
5860 #endif
5861
5862   vfprintf (stderr, _(msgid), ap);
5863   va_end (ap);
5864 }
5865
5866 \f
5867 static void
5868 validate_all_switches ()
5869 {
5870   struct compiler *comp;
5871   register const char *p;
5872   register char c;
5873   struct spec_list *spec;
5874
5875   for (comp = compilers; comp->spec[0]; comp++)
5876     {
5877       size_t i;
5878       for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
5879         {
5880           p = comp->spec[i];
5881           while ((c = *p++))
5882             if (c == '%' && *p == '{')
5883               /* We have a switch spec.  */
5884               validate_switches (p + 1);
5885         }
5886     }
5887
5888   /* Look through the linked list of specs read from the specs file.  */
5889   for (spec = specs; spec ; spec = spec->next)
5890     {
5891       p = *(spec->ptr_spec);
5892       while ((c = *p++))
5893         if (c == '%' && *p == '{')
5894           /* We have a switch spec.  */
5895           validate_switches (p + 1);
5896     }
5897
5898   p = link_command_spec;
5899   while ((c = *p++))
5900     if (c == '%' && *p == '{')
5901       /* We have a switch spec.  */
5902       validate_switches (p + 1);
5903 }
5904
5905 /* Look at the switch-name that comes after START
5906    and mark as valid all supplied switches that match it.  */
5907
5908 static void
5909 validate_switches (start)
5910      const char *start;
5911 {
5912   register const char *p = start;
5913   const char *filter;
5914   register int i;
5915   int suffix = 0;
5916
5917   if (*p == '|')
5918     ++p;
5919
5920   if (*p == '!')
5921     ++p;
5922
5923   if (*p == '.')
5924     suffix = 1, ++p;
5925
5926   filter = p;
5927   while (*p != ':' && *p != '}') p++;
5928
5929   if (suffix)
5930     ;
5931   else if (p[-1] == '*')
5932     {
5933       /* Mark all matching switches as valid.  */
5934       --p;
5935       for (i = 0; i < n_switches; i++)
5936         if (!strncmp (switches[i].part1, filter, p - filter))
5937           switches[i].validated = 1;
5938     }
5939   else
5940     {
5941       /* Mark an exact matching switch as valid.  */
5942       for (i = 0; i < n_switches; i++)
5943         {
5944           if (!strncmp (switches[i].part1, filter, p - filter)
5945               && switches[i].part1[p - filter] == 0)
5946             switches[i].validated = 1;
5947         }
5948     }
5949 }
5950 \f
5951 /* Check whether a particular argument was used.  The first time we
5952    canonicalize the switches to keep only the ones we care about.  */
5953
5954 static int
5955 used_arg (p, len)
5956      const char *p;
5957      int len;
5958 {
5959   struct mswitchstr
5960   {
5961     const char *str;
5962     const char *replace;
5963     int len;
5964     int rep_len;
5965   };
5966
5967   static struct mswitchstr *mswitches;
5968   static int n_mswitches;
5969   int i, j;
5970
5971   if (!mswitches)
5972     {
5973       struct mswitchstr *matches;
5974       const char *q;
5975       int cnt = 0;
5976
5977       /* Break multilib_matches into the component strings of string and replacement
5978          string.  */
5979       for (q = multilib_matches; *q != '\0'; q++)
5980         if (*q == ';')
5981           cnt++;
5982
5983       matches = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
5984       i = 0;
5985       q = multilib_matches;
5986       while (*q != '\0')
5987         {
5988           matches[i].str = q;
5989           while (*q != ' ')
5990             {
5991               if (*q == '\0')
5992                 abort ();
5993               q++;
5994             }
5995           matches[i].len = q - matches[i].str;
5996
5997           matches[i].replace = ++q;
5998           while (*q != ';' && *q != '\0')
5999             {
6000               if (*q == ' ')
6001                 abort ();
6002               q++;
6003             }
6004           matches[i].rep_len = q - matches[i].replace;
6005           i++;
6006           if (*q == ';')
6007             q++;
6008         }
6009
6010       /* Now build a list of the replacement string for switches that we care
6011          about.  Make sure we allocate at least one entry.  This prevents
6012          xmalloc from calling fatal, and prevents us from re-executing this
6013          block of code.  */
6014       mswitches
6015         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
6016                                          * (n_switches ? n_switches : 1));
6017       for (i = 0; i < n_switches; i++)
6018         {
6019           int xlen = strlen (switches[i].part1);
6020           for (j = 0; j < cnt; j++)
6021             if (xlen == matches[j].len
6022                 && ! strncmp (switches[i].part1, matches[j].str, xlen))
6023               {
6024                 mswitches[n_mswitches].str = matches[j].replace;
6025                 mswitches[n_mswitches].len = matches[j].rep_len;
6026                 mswitches[n_mswitches].replace = (char *)0;
6027                 mswitches[n_mswitches].rep_len = 0;
6028                 n_mswitches++;
6029                 break;
6030               }
6031         }
6032     }
6033
6034   for (i = 0; i < n_mswitches; i++)
6035     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
6036       return 1;
6037
6038   return 0;
6039 }
6040
6041 static int
6042 default_arg (p, len)
6043      const char *p;
6044      int len;
6045 {
6046   const char *start, *end;
6047
6048   for (start = multilib_defaults; *start != '\0'; start = end+1)
6049     {
6050       while (*start == ' ' || *start == '\t')
6051         start++;
6052
6053       if (*start == '\0')
6054         break;
6055
6056       for (end = start+1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
6057         ;
6058
6059       if ((end - start) == len && strncmp (p, start, len) == 0)
6060         return 1;
6061
6062       if (*end == '\0')
6063         break;
6064     }
6065
6066   return 0;
6067 }
6068
6069 /* Work out the subdirectory to use based on the options. The format of
6070    multilib_select is a list of elements. Each element is a subdirectory
6071    name followed by a list of options followed by a semicolon. The format
6072    of multilib_exclusions is the same, but without the preceding
6073    directory. First gcc will check the exclusions, if none of the options
6074    beginning with an exclamation point are present, and all of the other
6075    options are present, then we will ignore this completely. Passing
6076    that, gcc will consider each multilib_select in turn using the same
6077    rules for matching the options. If a match is found, that subdirectory
6078    will be used.  */
6079
6080 static void
6081 set_multilib_dir ()
6082 {
6083   const char *p;
6084   unsigned int this_path_len;
6085   const char *this_path, *this_arg;
6086   int not_arg;
6087   int ok;
6088
6089   p = multilib_exclusions;
6090   while (*p != '\0')
6091     {
6092       /* Ignore newlines.  */
6093       if (*p == '\n')
6094         {
6095           ++p;
6096           continue;
6097         }
6098
6099       /* Check the arguments.  */
6100       ok = 1;
6101       while (*p != ';')
6102         {
6103           if (*p == '\0')
6104             abort ();
6105
6106           if (! ok)
6107             {
6108               ++p;
6109               continue;
6110             }
6111
6112           this_arg = p;
6113           while (*p != ' ' && *p != ';')
6114             {
6115               if (*p == '\0')
6116                 abort ();
6117               ++p;
6118             }
6119
6120           if (*this_arg != '!')
6121             not_arg = 0;
6122           else
6123             {
6124               not_arg = 1;
6125               ++this_arg;
6126             }
6127   
6128           ok = used_arg (this_arg, p - this_arg);
6129           if (not_arg)
6130             ok = ! ok;
6131
6132           if (*p == ' ')
6133             ++p;
6134         }
6135
6136       if (ok)
6137         return;
6138
6139       ++p;
6140     }
6141
6142   p = multilib_select;
6143   while (*p != '\0')
6144     {
6145       /* Ignore newlines.  */
6146       if (*p == '\n')
6147         {
6148           ++p;
6149           continue;
6150         }
6151
6152       /* Get the initial path.  */
6153       this_path = p;
6154       while (*p != ' ')
6155         {
6156           if (*p == '\0')
6157             abort ();
6158           ++p;
6159         }
6160       this_path_len = p - this_path;
6161
6162       /* Check the arguments.  */
6163       ok = 1;
6164       ++p;
6165       while (*p != ';')
6166         {
6167           if (*p == '\0')
6168             abort ();
6169
6170           if (! ok)
6171             {
6172               ++p;
6173               continue;
6174             }
6175
6176           this_arg = p;
6177           while (*p != ' ' && *p != ';')
6178             {
6179               if (*p == '\0')
6180                 abort ();
6181               ++p;
6182             }
6183
6184           if (*this_arg != '!')
6185             not_arg = 0;
6186           else
6187             {
6188               not_arg = 1;
6189               ++this_arg;
6190             }
6191
6192           /* If this is a default argument, we can just ignore it.
6193              This is true even if this_arg begins with '!'.  Beginning
6194              with '!' does not mean that this argument is necessarily
6195              inappropriate for this library: it merely means that
6196              there is a more specific library which uses this
6197              argument.  If this argument is a default, we need not
6198              consider that more specific library.  */
6199           if (! default_arg (this_arg, p - this_arg))
6200             {
6201               ok = used_arg (this_arg, p - this_arg);
6202               if (not_arg)
6203                 ok = ! ok;
6204             }
6205
6206           if (*p == ' ')
6207             ++p;
6208         }
6209
6210       if (ok)
6211         {
6212           if (this_path_len != 1
6213               || this_path[0] != '.')
6214             {
6215               char * new_multilib_dir = xmalloc (this_path_len + 1);
6216               strncpy (new_multilib_dir, this_path, this_path_len);
6217               new_multilib_dir[this_path_len] = '\0';
6218               multilib_dir = new_multilib_dir;
6219             }
6220           break;
6221         }
6222
6223       ++p;
6224     }      
6225 }
6226
6227 /* Print out the multiple library subdirectory selection
6228    information.  This prints out a series of lines.  Each line looks
6229    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6230    required.  Only the desired options are printed out, the negative
6231    matches.  The options are print without a leading dash.  There are
6232    no spaces to make it easy to use the information in the shell.
6233    Each subdirectory is printed only once.  This assumes the ordering
6234    generated by the genmultilib script. Also, we leave out ones that match
6235    the exclusions.  */
6236
6237 static void
6238 print_multilib_info ()
6239 {
6240   const char *p = multilib_select;
6241   const char *last_path = 0, *this_path;
6242   int skip;
6243   unsigned int last_path_len = 0;
6244
6245   while (*p != '\0')
6246     {
6247       skip = 0;
6248       /* Ignore newlines.  */
6249       if (*p == '\n')
6250         {
6251           ++p;
6252           continue;
6253         }
6254
6255       /* Get the initial path.  */
6256       this_path = p;
6257       while (*p != ' ')
6258         {
6259           if (*p == '\0')
6260             abort ();
6261           ++p;
6262         }
6263
6264       /* Check for matches with the multilib_exclusions. We don't bother
6265          with the '!' in either list. If any of the exclusion rules match
6266          all of its options with the select rule, we skip it.  */
6267         {
6268           const char *e = multilib_exclusions;
6269           const char *this_arg;
6270
6271           while (*e != '\0')
6272             {
6273               int m = 1;        
6274               /* Ignore newlines.  */
6275               if (*e == '\n')
6276                 {
6277                   ++e;
6278                   continue;
6279                 }
6280               
6281               /* Check the arguments.  */
6282               while (*e != ';')
6283                 {
6284                   const char *q;
6285                   int mp = 0;
6286
6287                   if (*e == '\0')
6288                     abort ();
6289
6290                   if (! m)
6291                     {
6292                       ++e;
6293                       continue;
6294                     }
6295
6296                   this_arg = e;
6297
6298                   while (*e != ' ' && *e != ';')
6299                     {
6300                       if (*e == '\0')
6301                         abort ();
6302                       ++e;
6303                     }
6304                   
6305                   q = p + 1;
6306                   while (*q != ';')
6307                     {
6308                       const char *arg;
6309                       int len = e - this_arg;
6310
6311                       if (*q == '\0')
6312                         abort ();
6313         
6314                       arg = q;
6315
6316                       while (*q != ' ' && *q != ';')
6317                         {
6318                           if (*q == '\0')
6319                             abort ();
6320                             ++q;
6321                         }
6322
6323                       if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6324                           default_arg (this_arg, e - this_arg))
6325                         {
6326                           mp = 1;
6327                           break;
6328                         }
6329
6330                       if (*q == ' ')
6331                         ++q;
6332                     }
6333
6334                   if (! mp)
6335                     m = 0;
6336
6337                   if (*e == ' ')
6338                     ++e;
6339                 }
6340               
6341               if (m)
6342                 {
6343                   skip = 1;
6344                   break;
6345                 }
6346
6347               if (*e != '\0')
6348                 ++e;
6349             }
6350         }
6351
6352       if (! skip)
6353         {
6354           /* If this is a duplicate, skip it.  */
6355           skip = (last_path != 0 && (unsigned int)(p - this_path) == last_path_len
6356                   && ! strncmp (last_path, this_path, last_path_len));
6357
6358           last_path = this_path;
6359           last_path_len = p - this_path;
6360         }
6361
6362       /* If this directory requires any default arguments, we can skip
6363          it.  We will already have printed a directory identical to
6364          this one which does not require that default argument.  */
6365       if (! skip)
6366         {
6367           const char *q;
6368
6369           q = p + 1;
6370           while (*q != ';')
6371             {
6372               const char *arg;
6373
6374               if (*q == '\0')
6375                 abort ();
6376
6377               if (*q == '!')
6378                 arg = NULL;
6379               else
6380                 arg = q;
6381
6382               while (*q != ' ' && *q != ';')
6383                 {
6384                   if (*q == '\0')
6385                     abort ();
6386                   ++q;
6387                 }
6388
6389               if (arg != NULL
6390                   && default_arg (arg, q - arg))
6391                 {
6392                   skip = 1;
6393                   break;
6394                 }
6395
6396               if (*q == ' ')
6397                 ++q;
6398             }
6399         }
6400
6401       if (! skip)
6402         {
6403           const char *p1;
6404
6405           for (p1 = last_path; p1 < p; p1++)
6406             putchar (*p1);
6407           putchar (';');
6408         }
6409
6410       ++p;
6411       while (*p != ';')
6412         {
6413           int use_arg;
6414
6415           if (*p == '\0')
6416             abort ();
6417
6418           if (skip)
6419             {
6420               ++p;
6421               continue;
6422             }
6423
6424           use_arg = *p != '!';
6425
6426           if (use_arg)
6427             putchar ('@');
6428
6429           while (*p != ' ' && *p != ';')
6430             {
6431               if (*p == '\0')
6432                 abort ();
6433               if (use_arg)
6434                 putchar (*p);
6435               ++p;
6436             }
6437
6438           if (*p == ' ')
6439             ++p;
6440         }
6441
6442       if (! skip)
6443         {
6444           /* If there are extra options, print them now.  */
6445           if (multilib_extra && *multilib_extra)
6446             {
6447               int print_at = TRUE;
6448               const char *q;
6449
6450               for (q = multilib_extra; *q != '\0'; q++)
6451                 {
6452                   if (*q == ' ')
6453                     print_at = TRUE;
6454                   else
6455                     {
6456                       if (print_at)
6457                         putchar ('@');
6458                       putchar (*q);
6459                       print_at = FALSE;
6460                     }
6461                 }
6462             }
6463           
6464           putchar ('\n');
6465         }
6466
6467       ++p;
6468     }
6469 }