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