OSDN Git Service

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