OSDN Git Service

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