OSDN Git Service

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