OSDN Git Service

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