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