OSDN Git Service

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