OSDN Git Service

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