OSDN Git Service

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