OSDN Git Service

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