OSDN Git Service

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