OSDN Git Service

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