OSDN Git Service

* gcc.c (do_spec_1): [case 'o'] Account for
[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_ENVIRONMENT
115 #define GET_ENVIRONMENT(ENV_VALUE,ENV_NAME) ENV_VALUE = getenv (ENV_NAME)
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   bcopy ((char *) old_environ, (char *) (environ + 1),
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   if (machine_suffix)
1987     len += strlen (machine_suffix);
1988
1989   temp = xmalloc (len);
1990
1991   /* Determine the filename to execute (special case for absolute paths).  */
1992
1993   if (*name == '/' || *name == DIR_SEPARATOR
1994       /* Check for disk name on MS-DOS-based systems.  */
1995       || (DIR_SEPARATOR == '\\' && name[1] == ':'
1996           && (name[2] == DIR_SEPARATOR || name[2] == '/')))
1997     {
1998       if (access (name, mode))
1999         {
2000           strcpy (temp, name);
2001           return temp;
2002         }
2003     }
2004   else
2005     for (pl = pprefix->plist; pl; pl = pl->next)
2006       {
2007         if (machine_suffix)
2008           {
2009             /* Some systems have a suffix for executable files.
2010                So try appending that first.  */
2011             if (file_suffix[0] != 0)
2012               {
2013                 strcpy (temp, pl->prefix);
2014                 strcat (temp, machine_suffix);
2015                 strcat (temp, name);
2016                 strcat (temp, file_suffix);
2017                 if (access (temp, mode) == 0)
2018                   {
2019                     if (pl->used_flag_ptr != 0)
2020                       *pl->used_flag_ptr = 1;
2021                     return temp;
2022                   }
2023               }
2024
2025             /* Now try just the name.  */
2026             strcpy (temp, pl->prefix);
2027             strcat (temp, machine_suffix);
2028             strcat (temp, name);
2029             if (access (temp, mode) == 0)
2030               {
2031                 if (pl->used_flag_ptr != 0)
2032                   *pl->used_flag_ptr = 1;
2033                 return temp;
2034               }
2035           }
2036
2037         /* Certain prefixes are tried with just the machine type,
2038            not the version.  This is used for finding as, ld, etc.  */
2039         if (just_machine_suffix && pl->require_machine_suffix == 2)
2040           {
2041             /* Some systems have a suffix for executable files.
2042                So try appending that first.  */
2043             if (file_suffix[0] != 0)
2044               {
2045                 strcpy (temp, pl->prefix);
2046                 strcat (temp, just_machine_suffix);
2047                 strcat (temp, name);
2048                 strcat (temp, file_suffix);
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             strcpy (temp, pl->prefix);
2058             strcat (temp, just_machine_suffix);
2059             strcat (temp, name);
2060             if (access (temp, mode) == 0)
2061               {
2062                 if (pl->used_flag_ptr != 0)
2063                   *pl->used_flag_ptr = 1;
2064                 return temp;
2065               }
2066           }
2067
2068         /* Certain prefixes can't be used without the machine suffix
2069            when the machine or version is explicitly specified.  */
2070         if (! pl->require_machine_suffix)
2071           {
2072             /* Some systems have a suffix for executable files.
2073                So try appending that first.  */
2074             if (file_suffix[0] != 0)
2075               {
2076                 strcpy (temp, pl->prefix);
2077                 strcat (temp, name);
2078                 strcat (temp, file_suffix);
2079                 if (access (temp, mode) == 0)
2080                   {
2081                     if (pl->used_flag_ptr != 0)
2082                       *pl->used_flag_ptr = 1;
2083                     return temp;
2084                   }
2085               }
2086
2087             strcpy (temp, pl->prefix);
2088             strcat (temp, name);
2089             if (access (temp, mode) == 0)
2090               {
2091                 if (pl->used_flag_ptr != 0)
2092                   *pl->used_flag_ptr = 1;
2093                 return temp;
2094               }
2095           }
2096       }
2097
2098   free (temp);
2099   return 0;
2100 }
2101
2102 /* Add an entry for PREFIX in PLIST.  If FIRST is set, it goes
2103    at the start of the list, otherwise it goes at the end.
2104
2105    If WARN is nonzero, we will warn if no file is found
2106    through this prefix.  WARN should point to an int
2107    which will be set to 1 if this entry is used.
2108
2109    COMPONENT is the value to be passed to update_path.
2110
2111    REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2112    the complete value of machine_suffix.
2113    2 means try both machine_suffix and just_machine_suffix.  */
2114
2115 static void
2116 add_prefix (pprefix, prefix, component, first, require_machine_suffix, warn)
2117      struct path_prefix *pprefix;
2118      char *prefix;
2119      char *component;
2120      int first;
2121      int require_machine_suffix;
2122      int *warn;
2123 {
2124   struct prefix_list *pl, **prev;
2125   int len;
2126
2127   if (! first && pprefix->plist)
2128     {
2129       for (pl = pprefix->plist; pl->next; pl = pl->next)
2130         ;
2131       prev = &pl->next;
2132     }
2133   else
2134     prev = &pprefix->plist;
2135
2136   /* Keep track of the longest prefix */
2137
2138   prefix = update_path (prefix, component);
2139   len = strlen (prefix);
2140   if (len > pprefix->max_len)
2141     pprefix->max_len = len;
2142
2143   pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
2144   pl->prefix = save_string (prefix, len);
2145   pl->require_machine_suffix = require_machine_suffix;
2146   pl->used_flag_ptr = warn;
2147   if (warn)
2148     *warn = 0;
2149
2150   if (*prev)
2151     pl->next = *prev;
2152   else
2153     pl->next = (struct prefix_list *) 0;
2154   *prev = pl;
2155 }
2156
2157 /* Print warnings for any prefixes in the list PPREFIX that were not used.  */
2158
2159 static void
2160 unused_prefix_warnings (pprefix)
2161      struct path_prefix *pprefix;
2162 {
2163   struct prefix_list *pl = pprefix->plist;
2164
2165   while (pl)
2166     {
2167       if (pl->used_flag_ptr != 0 && !*pl->used_flag_ptr)
2168         {
2169           if (pl->require_machine_suffix && machine_suffix)
2170             error ("file path prefix `%s%s' never used", pl->prefix,
2171                    machine_suffix);
2172           else
2173             error ("file path prefix `%s' never used", pl->prefix);
2174
2175           /* Prevent duplicate warnings.  */
2176           *pl->used_flag_ptr = 1;
2177         }
2178
2179       pl = pl->next;
2180     }
2181 }
2182
2183 \f
2184 /* Execute the command specified by the arguments on the current line of spec.
2185    When using pipes, this includes several piped-together commands
2186    with `|' between them.
2187
2188    Return 0 if successful, -1 if failed.  */
2189
2190 static int
2191 execute ()
2192 {
2193   int i;
2194   int n_commands;               /* # of command.  */
2195   char *string;
2196   struct command
2197     {
2198       char *prog;               /* program name.  */
2199       char **argv;              /* vector of args.  */
2200       int pid;                  /* pid of process for this command.  */
2201     };
2202
2203   struct command *commands;     /* each command buffer with above info.  */
2204
2205   /* Count # of piped commands.  */
2206   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2207     if (strcmp (argbuf[i], "|") == 0)
2208       n_commands++;
2209
2210   /* Get storage for each command.  */
2211   commands
2212     = (struct command *) alloca (n_commands * sizeof (struct command));
2213
2214   /* Split argbuf into its separate piped processes,
2215      and record info about each one.
2216      Also search for the programs that are to be run.  */
2217
2218   commands[0].prog = argbuf[0]; /* first command.  */
2219   commands[0].argv = &argbuf[0];
2220   string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
2221
2222   if (string)
2223     commands[0].argv[0] = string;
2224
2225   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2226     if (strcmp (argbuf[i], "|") == 0)
2227       {                         /* each command.  */
2228 #if defined (__MSDOS__) || (defined (_WIN32) && defined (__CYGWIN32_)) || defined (OS2) || defined (VMS)
2229         fatal ("-pipe not supported");
2230 #endif
2231         argbuf[i] = 0;  /* termination of command args.  */
2232         commands[n_commands].prog = argbuf[i + 1];
2233         commands[n_commands].argv = &argbuf[i + 1];
2234         string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
2235         if (string)
2236           commands[n_commands].argv[0] = string;
2237         n_commands++;
2238       }
2239
2240   argbuf[argbuf_index] = 0;
2241
2242   /* If -v, print what we are about to do, and maybe query.  */
2243
2244   if (verbose_flag)
2245     {
2246       /* For help listings, put a blank line between sub-processes.  */
2247       if (print_help_list)
2248         fputc ('\n', stderr);
2249       
2250       /* Print each piped command as a separate line.  */
2251       for (i = 0; i < n_commands ; i++)
2252         {
2253           char **j;
2254
2255           for (j = commands[i].argv; *j; j++)
2256             fprintf (stderr, " %s", *j);
2257
2258           /* Print a pipe symbol after all but the last command.  */
2259           if (i + 1 != n_commands)
2260             fprintf (stderr, " |");
2261           fprintf (stderr, "\n");
2262         }
2263       fflush (stderr);
2264 #ifdef DEBUG
2265       fprintf (stderr, "\nGo ahead? (y or n) ");
2266       fflush (stderr);
2267       i = getchar ();
2268       if (i != '\n')
2269         while (getchar () != '\n')
2270           ;
2271
2272       if (i != 'y' && i != 'Y')
2273         return 0;
2274 #endif /* DEBUG */
2275     }
2276
2277   /* Run each piped subprocess.  */
2278
2279   for (i = 0; i < n_commands; i++)
2280     {
2281       char *errmsg_fmt, *errmsg_arg;
2282       char *string = commands[i].argv[0];
2283
2284       commands[i].pid = pexecute (string, commands[i].argv,
2285                                   programname, temp_filename,
2286                                   &errmsg_fmt, &errmsg_arg,
2287                                   ((i == 0 ? PEXECUTE_FIRST : 0)
2288                                    | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2289                                    | (string == commands[i].prog
2290                                       ? PEXECUTE_SEARCH : 0)
2291                                    | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2292
2293       if (commands[i].pid == -1)
2294         pfatal_pexecute (errmsg_fmt, errmsg_arg);
2295
2296       if (string != commands[i].prog)
2297         free (string);
2298     }
2299
2300   execution_count++;
2301
2302   /* Wait for all the subprocesses to finish.
2303      We don't care what order they finish in;
2304      we know that N_COMMANDS waits will get them all.
2305      Ignore subprocesses that we don't know about,
2306      since they can be spawned by the process that exec'ed us.  */
2307
2308   {
2309     int ret_code = 0;
2310
2311     for (i = 0; i < n_commands; )
2312       {
2313         int j;
2314         int status;
2315         int pid;
2316
2317         pid = pwait (commands[i].pid, &status, 0);
2318         if (pid < 0)
2319           abort ();
2320
2321         for (j = 0; j < n_commands; j++)
2322           if (commands[j].pid == pid)
2323             {
2324               i++;
2325               if (status != 0)
2326                 {
2327                   if (WIFSIGNALED (status))
2328                     {
2329                       fatal ("Internal compiler error: program %s got fatal signal %d",
2330                              commands[j].prog, WTERMSIG (status));
2331                       signal_count++;
2332                       ret_code = -1;
2333                     }
2334                   else if (WIFEXITED (status)
2335                            && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2336                     ret_code = -1;
2337                 }
2338               break;
2339             }
2340       }
2341     return ret_code;
2342   }
2343 }
2344 \f
2345 /* Find all the switches given to us
2346    and make a vector describing them.
2347    The elements of the vector are strings, one per switch given.
2348    If a switch uses following arguments, then the `part1' field
2349    is the switch itself and the `args' field
2350    is a null-terminated vector containing the following arguments.
2351    The `live_cond' field is 1 if the switch is true in a conditional spec,
2352    -1 if false (overridden by a later switch), and is initialized to zero.
2353    The `valid' field is nonzero if any spec has looked at this switch;
2354    if it remains zero at the end of the run, it must be meaningless.  */
2355
2356 struct switchstr
2357 {
2358   char *part1;
2359   char **args;
2360   int live_cond;
2361   int valid;
2362 };
2363
2364 static struct switchstr *switches;
2365
2366 static int n_switches;
2367
2368 struct infile
2369 {
2370   char *name;
2371   char *language;
2372 };
2373
2374 /* Also a vector of input files specified.  */
2375
2376 static struct infile *infiles;
2377
2378 static int n_infiles;
2379
2380 /* This counts the number of libraries added by LANG_SPECIFIC_DRIVER, so that
2381    we can tell if there were any user supplied any files or libraries.  */
2382
2383 static int added_libraries;
2384
2385 /* And a vector of corresponding output files is made up later.  */
2386
2387 static char **outfiles;
2388
2389 /* Used to track if none of the -B paths are used.  */
2390 static int warn_B;
2391
2392 /* Used to track if standard path isn't used and -b or -V is specified.  */
2393 static int warn_std;
2394
2395 /* Gives value to pass as "warn" to add_prefix for standard prefixes.  */
2396 static int *warn_std_ptr = 0;
2397
2398 \f
2399 #if defined(HAVE_OBJECT_SUFFIX) || defined(HAVE_EXECUTABLE_SUFFIX)
2400
2401 /* Convert NAME to a new name if it is the standard suffix.  DO_EXE
2402    is true if we should look for an executable suffix as well.  */
2403
2404 static char *
2405 convert_filename (name, do_exe)
2406      char *name;
2407      int do_exe;
2408 {
2409   int i;
2410   int len = strlen (name);
2411
2412 #ifdef HAVE_OBJECT_SUFFIX
2413   /* Convert x.o to x.obj if OBJECT_SUFFIX is ".obj".  */
2414   if (len > 2
2415       && name[len - 2] == '.'
2416       && name[len - 1] == 'o')
2417     {
2418       obstack_grow (&obstack, name, len - 2);
2419       obstack_grow0 (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
2420       name = obstack_finish (&obstack);
2421     }
2422 #endif
2423
2424 #ifdef HAVE_EXECUTABLE_SUFFIX
2425   /* If there is no filetype, make it the executable suffix (which includes
2426      the ".").  But don't get confused if we have just "-o".  */
2427   if (! do_exe || EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2428     return name;
2429
2430   for (i = len - 1; i >= 0; i--)
2431     if (name[i] == '/' || name[i] == DIR_SEPARATOR)
2432       break;
2433
2434   for (i++; i < len; i++)
2435     if (name[i] == '.')
2436       return name;
2437
2438   obstack_grow (&obstack, name, len);
2439   obstack_grow0 (&obstack, EXECUTABLE_SUFFIX, strlen (EXECUTABLE_SUFFIX));
2440   name = obstack_finish (&obstack);
2441 #endif
2442
2443   return name;
2444 }
2445 #endif
2446 \f
2447 /* Display the command line switches accepted by gcc.  */
2448 static void
2449 display_help ()
2450 {
2451   printf ("Usage: %s [options] file...\n", programname);
2452   printf ("Options:\n");
2453
2454   printf ("  --help                   Display this information\n");
2455   if (! verbose_flag)
2456     printf ("  (Use '-v --help' to display command line options of sub-processes)\n");
2457   printf ("  -dumpspecs               Display all of the built in spec strings\n");
2458   printf ("  -dumpversion             Display the version of the compiler\n");
2459   printf ("  -dumpmachine             Display the compiler's target processor\n");
2460   printf ("  -print-search-dirs       Display the directories in the compiler's search path\n");
2461   printf ("  -print-libgcc-file-name  Display the name of the compiler's companion library\n");
2462   printf ("  -print-file-name=<lib>   Display the full path to library <lib>\n");
2463   printf ("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n");
2464   printf ("  -print-multi-directory   Display the root directory for versions of libgcc\n");
2465   printf ("  -print-multi-lib         Display the mapping between command line options and\n");
2466   printf ("                            multiple library search directories\n");
2467   printf ("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n");
2468   printf ("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n");
2469   printf ("  -Wl,<options>            Pass comma-separated <options> on to the linker\n");
2470   printf ("  -Xlinker <arg>           Pass <arg> on to the linker\n");
2471   printf ("  -save-temps              Do not delete intermediate files\n");
2472   printf ("  -pipe                    Use pipes rather than intermediate files\n");
2473   printf ("  -specs=<file>            Override builtin specs with the contents of <file>\n");
2474   printf ("  -B <directory>           Add <directory> to the compiler's search paths\n");
2475   printf ("  -b <machine>             Run gcc for target <machine>, if installed\n");
2476   printf ("  -V <version>             Run gcc version number <version>, if installed\n");
2477   printf ("  -v                       Display the programs invoked by the compiler\n");
2478   printf ("  -E                       Preprocess only; do not compile, assemble or link\n");
2479   printf ("  -S                       Compile only; do not assemble or link\n");
2480   printf ("  -c                       Compile and assemble, but do not link\n");
2481   printf ("  -o <file>                Place the output into <file>\n");
2482   printf ("  -x <language>            Specify the language of the following input files\n");
2483   printf ("                            Permissable languages include: c c++ assembler none\n");
2484   printf ("                            'none' means revert to the default behaviour of\n");
2485   printf ("                            guessing the language based on the file's extension\n");
2486
2487   printf ("\nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n");
2488   printf ("the various sub-processes invoked by %s.  In order to pass other options\n",
2489           programname);
2490   printf ("on to these processes the -W<letter> options must be used.\n");
2491
2492   /* The rest of the options are displayed by invocations of the various
2493      sub-processes.  */
2494 }
2495
2496 static void                                                             
2497 add_preprocessor_option (option, len)                                   
2498      char * option;                                                     
2499      int    len;                                                        
2500 {                                                                       
2501   n_preprocessor_options++;                                                     
2502                                                                         
2503   if (! preprocessor_options)                                           
2504     preprocessor_options                                                        
2505       = (char **) xmalloc (n_preprocessor_options * sizeof (char **));  
2506   else                                                                  
2507     preprocessor_options                                                        
2508       = (char **) xrealloc (preprocessor_options,                               
2509                             n_preprocessor_options * sizeof (char **)); 
2510                                                                         
2511   preprocessor_options [n_preprocessor_options - 1] = save_string (option, len);  
2512 }
2513      
2514 static void                                                             
2515 add_assembler_option (option, len)                                      
2516      char * option;                                                     
2517      int    len;                                                        
2518 {                                                                       
2519   n_assembler_options++;                                                        
2520                                                                         
2521   if (! assembler_options)                                              
2522     assembler_options                                                   
2523       = (char **) xmalloc (n_assembler_options * sizeof (char **));     
2524   else                                                                  
2525     assembler_options                                                   
2526       = (char **) xrealloc (assembler_options,                          
2527                             n_assembler_options * sizeof (char **));    
2528                                                                         
2529   assembler_options [n_assembler_options - 1] = save_string (option, len);  
2530 }
2531      
2532 static void                                                             
2533 add_linker_option (option, len)                                 
2534      char * option;                                                     
2535      int    len;                                                        
2536 {                                                                       
2537   n_linker_options++;                                                   
2538                                                                         
2539   if (! linker_options)                                         
2540     linker_options                                                      
2541       = (char **) xmalloc (n_linker_options * sizeof (char **));        
2542   else                                                                  
2543     linker_options                                                      
2544       = (char **) xrealloc (linker_options,                             
2545                             n_linker_options * sizeof (char **));       
2546                                                                         
2547   linker_options [n_linker_options - 1] = save_string (option, len);  
2548 }
2549 \f
2550 /* Create the vector `switches' and its contents.
2551    Store its length in `n_switches'.  */
2552
2553 static void
2554 process_command (argc, argv)
2555      int argc;
2556      char **argv;
2557 {
2558   register int i;
2559   char *temp;
2560   char *spec_lang = 0;
2561   int last_language_n_infiles;
2562   int have_c = 0;
2563   int have_o = 0;
2564   int lang_n_infiles = 0;
2565
2566   GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
2567
2568   n_switches = 0;
2569   n_infiles = 0;
2570   added_libraries = 0;
2571
2572   /* Figure compiler version from version string.  */
2573
2574   compiler_version = save_string (version_string, strlen (version_string));
2575   for (temp = compiler_version; *temp; ++temp)
2576     {
2577       if (*temp == ' ')
2578         {
2579           *temp = '\0';
2580           break;
2581         }
2582     }
2583
2584   /* Set up the default search paths.  */
2585
2586   if (gcc_exec_prefix)
2587     {
2588       int len = strlen (gcc_exec_prefix);
2589       if (len > sizeof ("/lib/gcc-lib/")-1
2590           && (gcc_exec_prefix[len-1] == '/'
2591               || gcc_exec_prefix[len-1] == DIR_SEPARATOR))
2592         {
2593           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
2594           if ((*temp == '/' || *temp == DIR_SEPARATOR)
2595               && strncmp (temp+1, "lib", 3) == 0
2596               && (temp[4] == '/' || temp[4] == DIR_SEPARATOR)
2597               && strncmp (temp+5, "gcc-lib", 7) == 0)
2598             len -= sizeof ("/lib/gcc-lib/") - 1;
2599         }
2600
2601       set_std_prefix (gcc_exec_prefix, len);
2602       add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2603       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2604     }
2605
2606   /* COMPILER_PATH and LIBRARY_PATH have values
2607      that are lists of directory names with colons.  */
2608
2609   GET_ENVIRONMENT (temp, "COMPILER_PATH");
2610   if (temp)
2611     {
2612       char *startp, *endp;
2613       char *nstore = (char *) alloca (strlen (temp) + 3);
2614
2615       startp = endp = temp;
2616       while (1)
2617         {
2618           if (*endp == PATH_SEPARATOR || *endp == 0)
2619             {
2620               strncpy (nstore, startp, endp-startp);
2621               if (endp == startp)
2622                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2623               else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2624                 {
2625                   nstore[endp-startp] = DIR_SEPARATOR;
2626                   nstore[endp-startp+1] = 0;
2627                 }
2628               else
2629                 nstore[endp-startp] = 0;
2630               add_prefix (&exec_prefixes, nstore, 0, 0, 0, NULL_PTR);
2631               add_prefix (&include_prefixes,
2632                           concat (nstore, "include", NULL_PTR),
2633                           0, 0, 0, NULL_PTR);
2634               if (*endp == 0)
2635                 break;
2636               endp = startp = endp + 1;
2637             }
2638           else
2639             endp++;
2640         }
2641     }
2642
2643   GET_ENVIRONMENT (temp, "LIBRARY_PATH");
2644   if (temp && *cross_compile == '0')
2645     {
2646       char *startp, *endp;
2647       char *nstore = (char *) alloca (strlen (temp) + 3);
2648
2649       startp = endp = temp;
2650       while (1)
2651         {
2652           if (*endp == PATH_SEPARATOR || *endp == 0)
2653             {
2654               strncpy (nstore, startp, endp-startp);
2655               if (endp == startp)
2656                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2657               else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2658                 {
2659                   nstore[endp-startp] = DIR_SEPARATOR;
2660                   nstore[endp-startp+1] = 0;
2661                 }
2662               else
2663                 nstore[endp-startp] = 0;
2664               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
2665                           0, 0, NULL_PTR);
2666               if (*endp == 0)
2667                 break;
2668               endp = startp = endp + 1;
2669             }
2670           else
2671             endp++;
2672         }
2673     }
2674
2675   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
2676   GET_ENVIRONMENT (temp, "LPATH");
2677   if (temp && *cross_compile == '0')
2678     {
2679       char *startp, *endp;
2680       char *nstore = (char *) alloca (strlen (temp) + 3);
2681
2682       startp = endp = temp;
2683       while (1)
2684         {
2685           if (*endp == PATH_SEPARATOR || *endp == 0)
2686             {
2687               strncpy (nstore, startp, endp-startp);
2688               if (endp == startp)
2689                 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2690               else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2691                 {
2692                   nstore[endp-startp] = DIR_SEPARATOR;
2693                   nstore[endp-startp+1] = 0;
2694                 }
2695               else
2696                 nstore[endp-startp] = 0;
2697               add_prefix (&startfile_prefixes, nstore, NULL_PTR,
2698                           0, 0, NULL_PTR);
2699               if (*endp == 0)
2700                 break;
2701               endp = startp = endp + 1;
2702             }
2703           else
2704             endp++;
2705         }
2706     }
2707
2708   /* Convert new-style -- options to old-style.  */
2709   translate_options (&argc, &argv);
2710
2711 #ifdef LANG_SPECIFIC_DRIVER
2712   /* Do language-specific adjustment/addition of flags.  */
2713   lang_specific_driver (fatal, &argc, &argv, &added_libraries);
2714 #endif
2715
2716   /* Scan argv twice.  Here, the first time, just count how many switches
2717      there will be in their vector, and how many input files in theirs.
2718      Here we also parse the switches that cc itself uses (e.g. -v).  */
2719
2720   for (i = 1; i < argc; i++)
2721     {
2722       if (! strcmp (argv[i], "-dumpspecs"))
2723         {
2724           struct spec_list *sl;
2725           init_spec ();
2726           for (sl = specs; sl; sl = sl->next)
2727             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
2728           exit (0);
2729         }
2730       else if (! strcmp (argv[i], "-dumpversion"))
2731         {
2732           printf ("%s\n", spec_version);
2733           exit (0);
2734         }
2735       else if (! strcmp (argv[i], "-dumpmachine"))
2736         {
2737           printf ("%s\n", spec_machine);
2738           exit  (0);
2739         }
2740       else if (strcmp (argv[i], "-fhelp") == 0)
2741         {
2742           /* translate_options () has turned --help into -fhelp.  */
2743           print_help_list = 1;
2744
2745           /* We will be passing a dummy file on to the sub-processes.  */
2746           n_infiles++;
2747           n_switches++;
2748           
2749           add_preprocessor_option ("--help", 6);
2750           add_assembler_option ("--help", 6);
2751           add_linker_option ("--help", 6);
2752         }
2753       else if (! strcmp (argv[i], "-print-search-dirs"))
2754         print_search_dirs = 1;
2755       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2756         print_file_name = "libgcc.a";
2757       else if (! strncmp (argv[i], "-print-file-name=", 17))
2758         print_file_name = argv[i] + 17;
2759       else if (! strncmp (argv[i], "-print-prog-name=", 17))
2760         print_prog_name = argv[i] + 17;
2761       else if (! strcmp (argv[i], "-print-multi-lib"))
2762         print_multi_lib = 1;
2763       else if (! strcmp (argv[i], "-print-multi-directory"))
2764         print_multi_directory = 1;
2765       else if (! strncmp (argv[i], "-Wa,", 4))
2766         {
2767           int prev, j;
2768           /* Pass the rest of this option to the assembler.  */
2769
2770           /* Split the argument at commas.  */
2771           prev = 4;
2772           for (j = 4; argv[i][j]; j++)
2773             if (argv[i][j] == ',')
2774               {
2775                 add_assembler_option (argv[i] + prev, j - prev);
2776                 prev = j + 1;
2777               }
2778           
2779           /* Record the part after the last comma.  */
2780           add_assembler_option (argv[i] + prev, j - prev);
2781         }
2782       else if (! strncmp (argv[i], "-Wp,", 4))
2783         {
2784           int prev, j;
2785           /* Pass the rest of this option to the preprocessor.  */
2786
2787           /* Split the argument at commas.  */
2788           prev = 4;
2789           for (j = 4; argv[i][j]; j++)
2790             if (argv[i][j] == ',')
2791               {
2792                 add_preprocessor_option (argv[i] + prev, j - prev);
2793                 prev = j + 1;
2794               }
2795           
2796           /* Record the part after the last comma.  */
2797           add_preprocessor_option (argv[i] + prev, j - prev);
2798         }
2799       else if (argv[i][0] == '+' && argv[i][1] == 'e')
2800         /* The +e options to the C++ front-end.  */
2801         n_switches++;
2802       else if (strncmp (argv[i], "-Wl,", 4) == 0)
2803         {
2804           int j;
2805           /* Split the argument at commas.  */
2806           for (j = 3; argv[i][j]; j++)
2807             n_infiles += (argv[i][j] == ',');
2808         }
2809       else if (strcmp (argv[i], "-Xlinker") == 0)
2810         {
2811           if (i + 1 == argc)
2812             fatal ("argument to `-Xlinker' is missing");
2813
2814           n_infiles++;
2815           i++;
2816         }
2817       else if (strncmp (argv[i], "-l", 2) == 0)
2818         n_infiles++;
2819       else if (strcmp (argv[i], "-save-temps") == 0)
2820         {
2821           save_temps_flag = 1;
2822           n_switches++;
2823         }
2824       else if (strcmp (argv[i], "-specs") == 0)
2825         {
2826           struct user_specs *user = (struct user_specs *)
2827             xmalloc (sizeof (struct user_specs));
2828           if (++i >= argc)
2829             fatal ("argument to `-specs' is missing");
2830
2831           user->next = (struct user_specs *)0;
2832           user->filename = argv[i];
2833           if (user_specs_tail)
2834             user_specs_tail->next = user;
2835           else
2836             user_specs_head = user;
2837           user_specs_tail = user;
2838         }
2839       else if (strncmp (argv[i], "-specs=", 7) == 0)
2840         {
2841           struct user_specs *user = (struct user_specs *)
2842             xmalloc (sizeof (struct user_specs));
2843           if (strlen (argv[i]) == 7)
2844             fatal ("argument to `-specs=' is missing");
2845
2846           user->next = (struct user_specs *)0;
2847           user->filename = argv[i]+7;
2848           if (user_specs_tail)
2849             user_specs_tail->next = user;
2850           else
2851             user_specs_head = user;
2852           user_specs_tail = user;
2853         }
2854       else if (argv[i][0] == '-' && argv[i][1] != 0)
2855         {
2856           register char *p = &argv[i][1];
2857           register int c = *p;
2858
2859           switch (c)
2860             {
2861             case 'b':
2862               n_switches++;
2863               if (p[1] == 0 && i + 1 == argc)
2864                 fatal ("argument to `-b' is missing");
2865               if (p[1] == 0)
2866                 spec_machine = argv[++i];
2867               else
2868                 spec_machine = p + 1;
2869
2870               warn_std_ptr = &warn_std;
2871               break;
2872
2873             case 'B':
2874               {
2875                 char *value;
2876                 if (p[1] == 0 && i + 1 == argc)
2877                   fatal ("argument to `-B' is missing");
2878                 if (p[1] == 0)
2879                   value = argv[++i];
2880                 else
2881                   value = p + 1;
2882                 add_prefix (&exec_prefixes, value, NULL_PTR, 1, 0, &warn_B);
2883                 add_prefix (&startfile_prefixes, value, NULL_PTR,
2884                             1, 0, &warn_B);
2885                 add_prefix (&include_prefixes, concat (value, "include",
2886                                                        NULL_PTR),
2887                             NULL_PTR, 1, 0, NULL_PTR);
2888
2889                 /* As a kludge, if the arg is "[foo/]stageN/", just add
2890                    "[foo/]include" to the include prefix.  */
2891                 {
2892                   int len = strlen (value);
2893                   if ((len == 7
2894                        || (len > 7
2895                            && (value[len - 8] == '/'
2896                                || value[len - 8] == DIR_SEPARATOR)))
2897                       && strncmp (value + len - 7, "stage", 5) == 0
2898                       && ISDIGIT (value[len - 2])
2899                       && (value[len - 1] == '/'
2900                           || value[len - 1] == DIR_SEPARATOR))
2901                     {
2902                       if (len == 7)
2903                         add_prefix (&include_prefixes, "include", NULL_PTR,
2904                                     1, 0, NULL_PTR);
2905                       else
2906                         {
2907                           char *string = xmalloc (len + 1);
2908                           strncpy (string, value, len-7);
2909                           strcpy (string+len-7, "include");
2910                           add_prefix (&include_prefixes, string, NULL_PTR,
2911                                       1, 0, NULL_PTR);
2912                         }
2913                     }
2914                 }
2915                 n_switches++;
2916               }
2917               break;
2918
2919             case 'v':   /* Print our subcommands and print versions.  */
2920               n_switches++;
2921               /* If they do anything other than exactly `-v', don't set
2922                  verbose_flag; rather, continue on to give the error.  */
2923               if (p[1] != 0)
2924                 break;
2925               verbose_flag++;
2926               break;
2927
2928             case 'V':
2929               n_switches++;
2930               if (p[1] == 0 && i + 1 == argc)
2931                 fatal ("argument to `-V' is missing");
2932               if (p[1] == 0)
2933                 spec_version = argv[++i];
2934               else
2935                 spec_version = p + 1;
2936               compiler_version = spec_version;
2937               warn_std_ptr = &warn_std;
2938
2939               /* Validate the version number.  Use the same checks
2940                  done when inserting it into a spec.
2941
2942                  The format of the version string is
2943                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
2944               {
2945                 char *v = compiler_version;
2946
2947                 /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
2948                 while (! ISDIGIT (*v))
2949                   v++;
2950
2951                 if (v > compiler_version && v[-1] != '-')
2952                   fatal ("invalid version number format");
2953
2954                 /* Set V after the first period.  */
2955                 while (ISDIGIT (*v))
2956                   v++;
2957
2958                 if (*v != '.')
2959                   fatal ("invalid version number format");
2960
2961                 v++;
2962                 while (ISDIGIT (*v))
2963                   v++;
2964
2965                 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
2966                   fatal ("invalid version number format");
2967               }
2968               break;
2969
2970             case 'S':
2971             case 'c':
2972               if (p[1] == 0)
2973                 {
2974                   have_c = 1;
2975                   n_switches++;
2976                   break;
2977                 }
2978               goto normal_switch;
2979
2980             case 'o':
2981               have_o = 1;
2982 #if defined(HAVE_EXECUTABLE_SUFFIX)
2983               if (! have_c)
2984                 {
2985                   int skip;
2986                   
2987                   /* Forward scan, just in case -S or -c is specified
2988                      after -o.  */
2989                   int j = i + 1;
2990                   if (p[1] == 0)
2991                     ++j;
2992                   while (j < argc)
2993                     {
2994                       if (argv[j][0] == '-')
2995                         {
2996                           if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
2997                               && argv[j][2] == 0)
2998                             {
2999                               have_c = 1;
3000                               break;
3001                             }
3002                           else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3003                             j += skip - (argv[j][2] != 0);
3004                           else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3005                             j += skip;
3006                         }
3007                       j++;
3008                     }
3009                 }
3010 #endif
3011 #if defined(HAVE_EXECUTABLE_SUFFIX) || defined(HAVE_OBJECT_SUFFIX)
3012               if (p[1] == 0)
3013                 argv[i+1] = convert_filename (argv[i+1], ! have_c);
3014               else
3015                 argv[i] = convert_filename (argv[i], ! have_c);
3016 #endif
3017               goto normal_switch;
3018
3019             default:
3020             normal_switch:
3021               n_switches++;
3022
3023               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3024                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3025               else if (WORD_SWITCH_TAKES_ARG (p))
3026                 i += WORD_SWITCH_TAKES_ARG (p);
3027             }
3028         }
3029       else
3030         {
3031           n_infiles++;
3032           lang_n_infiles++;
3033         }
3034     }
3035
3036   if (have_c && have_o && lang_n_infiles > 1)
3037     fatal ("cannot specify -o with -c or -S and multiple compilations");
3038
3039   /* Set up the search paths before we go looking for config files.  */
3040
3041   /* These come before the md prefixes so that we will find gcc's subcommands
3042      (such as cpp) rather than those of the host system.  */
3043   /* Use 2 as fourth arg meaning try just the machine as a suffix,
3044      as well as trying the machine and the version.  */
3045 #ifndef OS2
3046   add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3047               0, 2, warn_std_ptr);
3048   add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3049               0, 2, warn_std_ptr);
3050 #endif
3051
3052   add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3053               0, 1, warn_std_ptr);
3054   add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3055               0, 1, warn_std_ptr);
3056
3057   tooldir_prefix = concat (tooldir_base_prefix, spec_machine, 
3058                            dir_separator_str, NULL_PTR);
3059
3060   /* If tooldir is relative, base it on exec_prefixes.  A relative
3061      tooldir lets us move the installed tree as a unit.
3062
3063      If GCC_EXEC_PREFIX is defined, then we want to add two relative
3064      directories, so that we can search both the user specified directory
3065      and the standard place.  */
3066
3067   if (*tooldir_prefix != '/' && *tooldir_prefix != DIR_SEPARATOR)
3068     {
3069       if (gcc_exec_prefix)
3070         {
3071           char *gcc_exec_tooldir_prefix
3072             = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3073                       spec_version, dir_separator_str, tooldir_prefix, NULL_PTR);
3074
3075           add_prefix (&exec_prefixes,
3076                       concat (gcc_exec_tooldir_prefix, "bin", 
3077                               dir_separator_str, NULL_PTR),
3078                       NULL_PTR, 0, 0, NULL_PTR);
3079           add_prefix (&startfile_prefixes,
3080                       concat (gcc_exec_tooldir_prefix, "lib", 
3081                               dir_separator_str, NULL_PTR),
3082                       NULL_PTR, 0, 0, NULL_PTR);
3083         }
3084
3085       tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3086                                dir_separator_str, spec_version, 
3087                                dir_separator_str, tooldir_prefix, NULL_PTR);
3088     }
3089
3090   add_prefix (&exec_prefixes, 
3091               concat (tooldir_prefix, "bin", dir_separator_str, NULL_PTR),
3092               "BINUTILS", 0, 0, NULL_PTR);
3093   add_prefix (&startfile_prefixes,
3094               concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
3095               "BINUTILS", 0, 0, NULL_PTR);
3096
3097   /* More prefixes are enabled in main, after we read the specs file
3098      and determine whether this is cross-compilation or not.  */
3099
3100
3101   /* Then create the space for the vectors and scan again.  */
3102
3103   switches = ((struct switchstr *)
3104               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3105   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3106   n_switches = 0;
3107   n_infiles = 0;
3108   last_language_n_infiles = -1;
3109
3110   /* This, time, copy the text of each switch and store a pointer
3111      to the copy in the vector of switches.
3112      Store all the infiles in their vector.  */
3113
3114   for (i = 1; i < argc; i++)
3115     {
3116       /* Just skip the switches that were handled by the preceding loop.  */
3117       if (! strncmp (argv[i], "-Wa,", 4))
3118         ;
3119       else if (! strncmp (argv[i], "-Wp,", 4))
3120         ;
3121       else if (! strcmp (argv[i], "-print-search-dirs"))
3122         ;
3123       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3124         ;
3125       else if (! strncmp (argv[i], "-print-file-name=", 17))
3126         ;
3127       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3128         ;
3129       else if (! strcmp (argv[i], "-print-multi-lib"))
3130         ;
3131       else if (! strcmp (argv[i], "-print-multi-directory"))
3132         ;
3133       else if (strcmp (argv[i], "-fhelp") == 0)
3134         {
3135           if (verbose_flag)
3136             {
3137               /* Create a dummy input file, so that we can pass --help on to
3138                  the various sub-processes.  */
3139               infiles[n_infiles].language = "c";
3140               infiles[n_infiles++].name   = "help-dummy";
3141               
3142               /* Preserve the --help switch so that it can be caught by the
3143                  cc1 spec string.  */
3144               switches[n_switches].part1     = "--help";
3145               switches[n_switches].args      = 0;
3146               switches[n_switches].live_cond = 0;
3147               switches[n_switches].valid     = 0;
3148               
3149               n_switches++;
3150             }
3151         }
3152       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3153         {
3154           /* Compensate for the +e options to the C++ front-end;
3155              they're there simply for cfront call-compatibility.  We do
3156              some magic in default_compilers to pass them down properly.
3157              Note we deliberately start at the `+' here, to avoid passing
3158              -e0 or -e1 down into the linker.  */
3159           switches[n_switches].part1 = &argv[i][0];
3160           switches[n_switches].args = 0;
3161           switches[n_switches].live_cond = 0;
3162           switches[n_switches].valid = 0;
3163           n_switches++;
3164         }
3165       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3166         {
3167           int prev, j;
3168           /* Split the argument at commas.  */
3169           prev = 4;
3170           for (j = 4; argv[i][j]; j++)
3171             if (argv[i][j] == ',')
3172               {
3173                 infiles[n_infiles].language = "*";
3174                 infiles[n_infiles++].name
3175                   = save_string (argv[i] + prev, j - prev);
3176                 prev = j + 1;
3177               }
3178           /* Record the part after the last comma.  */
3179           infiles[n_infiles].language = "*";
3180           infiles[n_infiles++].name = argv[i] + prev;
3181         }
3182       else if (strcmp (argv[i], "-Xlinker") == 0)
3183         {
3184           infiles[n_infiles].language = "*";
3185           infiles[n_infiles++].name = argv[++i];
3186         }
3187       else if (strncmp (argv[i], "-l", 2) == 0)
3188         {
3189           infiles[n_infiles].language = "*";
3190           infiles[n_infiles++].name = argv[i];
3191         }
3192       else if (strcmp (argv[i], "-specs") == 0)
3193         i++;
3194       else if (strncmp (argv[i], "-specs=", 7) == 0)
3195         ;
3196       /* -save-temps overrides -pipe, so that temp files are produced */
3197       else if (save_temps_flag && strcmp (argv[i], "-pipe") == 0)
3198         error ("Warning: -pipe ignored since -save-temps specified");
3199       else if (argv[i][0] == '-' && argv[i][1] != 0)
3200         {
3201           register char *p = &argv[i][1];
3202           register int c = *p;
3203
3204           if (c == 'x')
3205             {
3206               if (p[1] == 0 && i + 1 == argc)
3207                 fatal ("argument to `-x' is missing");
3208               if (p[1] == 0)
3209                 spec_lang = argv[++i];
3210               else
3211                 spec_lang = p + 1;
3212               if (! strcmp (spec_lang, "none"))
3213                 /* Suppress the warning if -xnone comes after the last input
3214                    file, because alternate command interfaces like g++ might
3215                    find it useful to place -xnone after each input file.  */
3216                 spec_lang = 0;
3217               else
3218                 last_language_n_infiles = n_infiles;
3219               continue;
3220             }
3221           switches[n_switches].part1 = p;
3222           /* Deal with option arguments in separate argv elements.  */
3223           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
3224               || WORD_SWITCH_TAKES_ARG (p))
3225             {
3226               int j = 0;
3227               int n_args = WORD_SWITCH_TAKES_ARG (p);
3228
3229               if (n_args == 0)
3230                 {
3231                   /* Count only the option arguments in separate argv elements.  */
3232                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3233                 }
3234               if (i + n_args >= argc)
3235                 fatal ("argument to `-%s' is missing", p);
3236               switches[n_switches].args
3237                 = (char **) xmalloc ((n_args + 1) * sizeof (char *));
3238               while (j < n_args)
3239                 switches[n_switches].args[j++] = argv[++i];
3240               /* Null-terminate the vector.  */
3241               switches[n_switches].args[j] = 0;
3242             }
3243           else if (index (switches_need_spaces, c))
3244             {
3245               /* On some systems, ld cannot handle some options without
3246                  a space.  So split the option from its argument.  */
3247               char *part1 = (char *) xmalloc (2);
3248               part1[0] = c;
3249               part1[1] = '\0';
3250               
3251               switches[n_switches].part1 = part1;
3252               switches[n_switches].args = (char **) xmalloc (2 * sizeof (char *));
3253               switches[n_switches].args[0] = xmalloc (strlen (p));
3254               strcpy (switches[n_switches].args[0], &p[1]);
3255               switches[n_switches].args[1] = 0;
3256             }
3257           else
3258             switches[n_switches].args = 0;
3259
3260           switches[n_switches].live_cond = 0;
3261           switches[n_switches].valid = 0;
3262           /* This is always valid, since gcc.c itself understands it.  */
3263           if (!strcmp (p, "save-temps"))
3264             switches[n_switches].valid = 1;
3265           else
3266             {
3267               char ch = switches[n_switches].part1[0];
3268               if (ch == 'V' || ch == 'b' || ch == 'B')
3269                 switches[n_switches].valid = 1;
3270             }
3271           n_switches++;
3272         }
3273       else
3274         {
3275 #ifdef HAVE_OBJECT_SUFFIX
3276           argv[i] = convert_filename (argv[i], 0);
3277 #endif
3278
3279           if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
3280             {
3281               perror_with_name (argv[i]);
3282               error_count++;
3283             }
3284           else
3285             {
3286               infiles[n_infiles].language = spec_lang;
3287               infiles[n_infiles++].name = argv[i];
3288             }
3289         }
3290     }
3291
3292   if (n_infiles == last_language_n_infiles && spec_lang != 0)
3293     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3294
3295   switches[n_switches].part1 = 0;
3296   infiles[n_infiles].name = 0;
3297 }
3298 \f
3299 /* Process a spec string, accumulating and running commands.  */
3300
3301 /* These variables describe the input file name.
3302    input_file_number is the index on outfiles of this file,
3303    so that the output file name can be stored for later use by %o.
3304    input_basename is the start of the part of the input file
3305    sans all directory names, and basename_length is the number
3306    of characters starting there excluding the suffix .c or whatever.  */
3307
3308 char *input_filename;
3309 static int input_file_number;
3310 size_t input_filename_length;
3311 static int basename_length;
3312 static char *input_basename;
3313 static char *input_suffix;
3314
3315 /* These are variables used within do_spec and do_spec_1.  */
3316
3317 /* Nonzero if an arg has been started and not yet terminated
3318    (with space, tab or newline).  */
3319 static int arg_going;
3320
3321 /* Nonzero means %d or %g has been seen; the next arg to be terminated
3322    is a temporary file name.  */
3323 static int delete_this_arg;
3324
3325 /* Nonzero means %w has been seen; the next arg to be terminated
3326    is the output file name of this compilation.  */
3327 static int this_is_output_file;
3328
3329 /* Nonzero means %s has been seen; the next arg to be terminated
3330    is the name of a library file and we should try the standard
3331    search dirs for it.  */
3332 static int this_is_library_file;
3333
3334 /* Nonzero means that the input of this command is coming from a pipe.  */
3335 static int input_from_pipe;
3336
3337 /* Process the spec SPEC and run the commands specified therein.
3338    Returns 0 if the spec is successfully processed; -1 if failed.  */
3339
3340 int
3341 do_spec (spec)
3342      char *spec;
3343 {
3344   int value;
3345
3346   clear_args ();
3347   arg_going = 0;
3348   delete_this_arg = 0;
3349   this_is_output_file = 0;
3350   this_is_library_file = 0;
3351   input_from_pipe = 0;
3352
3353   value = do_spec_1 (spec, 0, NULL_PTR);
3354
3355   /* Force out any unfinished command.
3356      If -pipe, this forces out the last command if it ended in `|'.  */
3357   if (value == 0)
3358     {
3359       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3360         argbuf_index--;
3361
3362       if (argbuf_index > 0)
3363         value = execute ();
3364     }
3365
3366   return value;
3367 }
3368
3369 /* Process the sub-spec SPEC as a portion of a larger spec.
3370    This is like processing a whole spec except that we do
3371    not initialize at the beginning and we do not supply a
3372    newline by default at the end.
3373    INSWITCH nonzero means don't process %-sequences in SPEC;
3374    in this case, % is treated as an ordinary character.
3375    This is used while substituting switches.
3376    INSWITCH nonzero also causes SPC not to terminate an argument.
3377
3378    Value is zero unless a line was finished
3379    and the command on that line reported an error.  */
3380
3381 static int
3382 do_spec_1 (spec, inswitch, soft_matched_part)
3383      char *spec;
3384      int inswitch;
3385      char *soft_matched_part;
3386 {
3387   register char *p = spec;
3388   register int c;
3389   int i;
3390   char *string;
3391   int value;
3392
3393   while ((c = *p++))
3394     /* If substituting a switch, treat all chars like letters.
3395        Otherwise, NL, SPC, TAB and % are special.  */
3396     switch (inswitch ? 'a' : c)
3397       {
3398       case '\n':
3399         /* End of line: finish any pending argument,
3400            then run the pending command if one has been started.  */
3401         if (arg_going)
3402           {
3403             obstack_1grow (&obstack, 0);
3404             string = obstack_finish (&obstack);
3405             if (this_is_library_file)
3406               string = find_file (string);
3407             store_arg (string, delete_this_arg, this_is_output_file);
3408             if (this_is_output_file)
3409               outfiles[input_file_number] = string;
3410           }
3411         arg_going = 0;
3412
3413         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3414           {
3415             for (i = 0; i < n_switches; i++)
3416               if (!strcmp (switches[i].part1, "pipe"))
3417                 break;
3418
3419             /* A `|' before the newline means use a pipe here,
3420                but only if -pipe was specified.
3421                Otherwise, execute now and don't pass the `|' as an arg.  */
3422             if (i < n_switches)
3423               {
3424                 input_from_pipe = 1;
3425                 switches[i].valid = 1;
3426                 break;
3427               }
3428             else
3429               argbuf_index--;
3430           }
3431
3432         if (argbuf_index > 0)
3433           {
3434             value = execute ();
3435             if (value)
3436               return value;
3437           }
3438         /* Reinitialize for a new command, and for a new argument.  */
3439         clear_args ();
3440         arg_going = 0;
3441         delete_this_arg = 0;
3442         this_is_output_file = 0;
3443         this_is_library_file = 0;
3444         input_from_pipe = 0;
3445         break;
3446
3447       case '|':
3448         /* End any pending argument.  */
3449         if (arg_going)
3450           {
3451             obstack_1grow (&obstack, 0);
3452             string = obstack_finish (&obstack);
3453             if (this_is_library_file)
3454               string = find_file (string);
3455             store_arg (string, delete_this_arg, this_is_output_file);
3456             if (this_is_output_file)
3457               outfiles[input_file_number] = string;
3458           }
3459
3460         /* Use pipe */
3461         obstack_1grow (&obstack, c);
3462         arg_going = 1;
3463         break;
3464
3465       case '\t':
3466       case ' ':
3467         /* Space or tab ends an argument if one is pending.  */
3468         if (arg_going)
3469           {
3470             obstack_1grow (&obstack, 0);
3471             string = obstack_finish (&obstack);
3472             if (this_is_library_file)
3473               string = find_file (string);
3474             store_arg (string, delete_this_arg, this_is_output_file);
3475             if (this_is_output_file)
3476               outfiles[input_file_number] = string;
3477           }
3478         /* Reinitialize for a new argument.  */
3479         arg_going = 0;
3480         delete_this_arg = 0;
3481         this_is_output_file = 0;
3482         this_is_library_file = 0;
3483         break;
3484
3485       case '%':
3486         switch (c = *p++)
3487           {
3488           case 0:
3489             fatal ("Invalid specification!  Bug in cc.");
3490
3491           case 'b':
3492             obstack_grow (&obstack, input_basename, basename_length);
3493             arg_going = 1;
3494             break;
3495
3496           case 'd':
3497             delete_this_arg = 2;
3498             break;
3499
3500           /* Dump out the directories specified with LIBRARY_PATH,
3501              followed by the absolute directories
3502              that we search for startfiles.  */
3503           case 'D':
3504             {
3505               struct prefix_list *pl = startfile_prefixes.plist;
3506               size_t bufsize = 100;
3507               char *buffer = (char *) xmalloc (bufsize);
3508               int idx;
3509
3510               for (; pl; pl = pl->next)
3511                 {
3512 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
3513                   /* Used on systems which record the specified -L dirs
3514                      and use them to search for dynamic linking.  */
3515                   /* Relative directories always come from -B,
3516                      and it is better not to use them for searching
3517                      at run time.  In particular, stage1 loses  */
3518                   if (pl->prefix[0] != '/' && pl->prefix[0] != DIR_SEPARATOR)
3519                     continue;
3520 #endif
3521                   /* Try subdirectory if there is one.  */
3522                   if (multilib_dir != NULL)
3523                     {
3524                       if (machine_suffix)
3525                         {
3526                           if (strlen (pl->prefix) + strlen (machine_suffix)
3527                               >= bufsize)
3528                             bufsize = (strlen (pl->prefix)
3529                                        + strlen (machine_suffix)) * 2 + 1;
3530                           buffer = (char *) xrealloc (buffer, bufsize);
3531                           strcpy (buffer, pl->prefix);
3532                           strcat (buffer, machine_suffix);
3533                           if (is_directory (buffer, multilib_dir, 1))
3534                             {
3535                               do_spec_1 ("-L", 0, NULL_PTR);
3536 #ifdef SPACE_AFTER_L_OPTION
3537                               do_spec_1 (" ", 0, NULL_PTR);
3538 #endif
3539                               do_spec_1 (buffer, 1, NULL_PTR);
3540                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3541                               /* Make this a separate argument.  */
3542                               do_spec_1 (" ", 0, NULL_PTR);
3543                             }
3544                         }
3545                       if (!pl->require_machine_suffix)
3546                         {
3547                           if (is_directory (pl->prefix, multilib_dir, 1))
3548                             {
3549                               do_spec_1 ("-L", 0, NULL_PTR);
3550 #ifdef SPACE_AFTER_L_OPTION
3551                               do_spec_1 (" ", 0, NULL_PTR);
3552 #endif
3553                               do_spec_1 (pl->prefix, 1, NULL_PTR);
3554                               do_spec_1 (multilib_dir, 1, NULL_PTR);
3555                               /* Make this a separate argument.  */
3556                               do_spec_1 (" ", 0, NULL_PTR);
3557                             }
3558                         }
3559                     }
3560                   if (machine_suffix)
3561                     {
3562                       if (is_directory (pl->prefix, machine_suffix, 1))
3563                         {
3564                           do_spec_1 ("-L", 0, NULL_PTR);
3565 #ifdef SPACE_AFTER_L_OPTION
3566                           do_spec_1 (" ", 0, NULL_PTR);
3567 #endif
3568                           do_spec_1 (pl->prefix, 1, NULL_PTR);
3569                           /* Remove slash from machine_suffix.  */
3570                           if (strlen (machine_suffix) >= bufsize)
3571                             bufsize = strlen (machine_suffix) * 2 + 1;
3572                           buffer = (char *) xrealloc (buffer, bufsize);
3573                           strcpy (buffer, machine_suffix);
3574                           idx = strlen (buffer);
3575                           if (buffer[idx - 1] == '/'
3576                               || buffer[idx - 1] == DIR_SEPARATOR)
3577                             buffer[idx - 1] = 0;
3578                           do_spec_1 (buffer, 1, NULL_PTR);
3579                           /* Make this a separate argument.  */
3580                           do_spec_1 (" ", 0, NULL_PTR);
3581                         }
3582                     }
3583                   if (!pl->require_machine_suffix)
3584                     {
3585                       if (is_directory (pl->prefix, "", 1))
3586                         {
3587                           do_spec_1 ("-L", 0, NULL_PTR);
3588 #ifdef SPACE_AFTER_L_OPTION
3589                           do_spec_1 (" ", 0, NULL_PTR);
3590 #endif
3591                           /* Remove slash from pl->prefix.  */
3592                           if (strlen (pl->prefix) >= bufsize)
3593                             bufsize = strlen (pl->prefix) * 2 + 1;
3594                           buffer = (char *) xrealloc (buffer, bufsize);
3595                           strcpy (buffer, pl->prefix);
3596                           idx = strlen (buffer);
3597                           if (buffer[idx - 1] == '/'
3598                               || buffer[idx - 1] == DIR_SEPARATOR)
3599                             buffer[idx - 1] = 0;
3600                           do_spec_1 (buffer, 1, NULL_PTR);
3601                           /* Make this a separate argument.  */
3602                           do_spec_1 (" ", 0, NULL_PTR);
3603                         }
3604                     }
3605                 }
3606               free (buffer);
3607             }
3608             break;
3609
3610           case 'e':
3611             /* {...:%efoo} means report an error with `foo' as error message
3612                and don't execute any more commands for this file.  */
3613             {
3614               char *q = p;
3615               char *buf;
3616               while (*p != 0 && *p != '\n') p++;
3617               buf = (char *) alloca (p - q + 1);
3618               strncpy (buf, q, p - q);
3619               buf[p - q] = 0;
3620               error ("%s", buf);
3621               return -1;
3622             }
3623             break;
3624
3625           case 'g':
3626           case 'u':
3627           case 'U':
3628             if (save_temps_flag)
3629               {
3630                 obstack_grow (&obstack, input_basename, basename_length);
3631                 delete_this_arg = 0;
3632               }
3633             else
3634               {
3635 #ifdef MKTEMP_EACH_FILE
3636                 /* ??? This has a problem: the total number of
3637                    values mktemp can return is limited.
3638                    That matters for the names of object files.
3639                    In 2.4, do something about that.  */
3640                 struct temp_name *t;
3641                 int suffix_length;
3642                 char *suffix = p;
3643
3644                 if (p[0] == '%' && p[1] == 'O')
3645                   {
3646                     /* We don't support extra suffix characters after %O.  */
3647                     if (*p == '.' || ISALPHA (*p))
3648                       abort ();
3649                     suffix = OBJECT_SUFFIX;
3650                     suffix_length = strlen (OBJECT_SUFFIX);
3651                     p += 2;
3652                   }
3653                 else
3654                   {
3655                     while (*p == '.' || ISALPHA (*p))
3656                       p++;
3657                     suffix_length = p - suffix;
3658                   }
3659
3660                 /* See if we already have an association of %g/%u/%U and
3661                    suffix.  */
3662                 for (t = temp_names; t; t = t->next)
3663                   if (t->length == suffix_length
3664                       && strncmp (t->suffix, suffix, suffix_length) == 0
3665                       && t->unique == (c != 'g'))
3666                     break;
3667
3668                 /* Make a new association if needed.  %u requires one.  */
3669                 if (t == 0 || c == 'u')
3670                   {
3671                     if (t == 0)
3672                       {
3673                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
3674                         t->next = temp_names;
3675                         temp_names = t;
3676                       }
3677                     t->length = suffix_length;
3678                     t->suffix = save_string (suffix, suffix_length);
3679                     t->unique = (c != 'g');
3680                     temp_filename = make_temp_file (t->suffix);
3681                     temp_filename_length = strlen (temp_filename);
3682                     t->filename = temp_filename;
3683                     t->filename_length = temp_filename_length;
3684                   }
3685
3686                 obstack_grow (&obstack, t->filename, t->filename_length);
3687                 delete_this_arg = 1;
3688 #else
3689                 obstack_grow (&obstack, temp_filename, temp_filename_length);
3690                 if (c == 'u' || c == 'U')
3691                   {
3692                     static int unique;
3693                     char buff[9];
3694                     if (c == 'u')
3695                       unique++;
3696                     sprintf (buff, "%d", unique);
3697                     obstack_grow (&obstack, buff, strlen (buff));
3698                   }
3699 #endif
3700                 delete_this_arg = 1;
3701               }
3702             arg_going = 1;
3703             break;
3704
3705           case 'i':
3706             obstack_grow (&obstack, input_filename, input_filename_length);
3707             arg_going = 1;
3708             break;
3709
3710           case 'I':
3711             {
3712               struct prefix_list *pl = include_prefixes.plist;
3713
3714               if (gcc_exec_prefix)
3715                 {
3716                   do_spec_1 ("-iprefix", 1, NULL_PTR);
3717                   /* Make this a separate argument.  */
3718                   do_spec_1 (" ", 0, NULL_PTR);
3719                   do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
3720                   do_spec_1 (" ", 0, NULL_PTR);
3721                 }
3722
3723               for (; pl; pl = pl->next)
3724                 {
3725                   do_spec_1 ("-isystem", 1, NULL_PTR);
3726                   /* Make this a separate argument.  */
3727                   do_spec_1 (" ", 0, NULL_PTR);
3728                   do_spec_1 (pl->prefix, 1, NULL_PTR);
3729                   do_spec_1 (" ", 0, NULL_PTR);
3730                 }
3731             }
3732             break;
3733
3734           case 'o':
3735             {
3736               int max = n_infiles;
3737 #ifdef LANG_SPECIFIC_DRIVER
3738               max += lang_specific_extra_outfiles;
3739 #endif
3740               for (i = 0; i < max; i++)
3741                 if (outfiles[i])
3742                   store_arg (outfiles[i], 0, 0);
3743               break;
3744             }
3745
3746           case 'O':
3747             obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
3748             arg_going = 1;
3749             break;
3750
3751           case 's':
3752             this_is_library_file = 1;
3753             break;
3754
3755           case 'w':
3756             this_is_output_file = 1;
3757             break;
3758
3759           case 'W':
3760             {
3761               int cur_index = argbuf_index;
3762               /* Handle the {...} following the %W.  */
3763               if (*p != '{')
3764                 abort ();
3765               p = handle_braces (p + 1);
3766               if (p == 0)
3767                 return -1;
3768               /* If any args were output, mark the last one for deletion
3769                  on failure.  */
3770               if (argbuf_index != cur_index)
3771                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
3772               break;
3773             }
3774
3775           /* %x{OPTION} records OPTION for %X to output.  */
3776           case 'x':
3777             {
3778               char *p1 = p;
3779               char *string;
3780
3781               /* Skip past the option value and make a copy.  */
3782               if (*p != '{')
3783                 abort ();
3784               while (*p++ != '}')
3785                 ;
3786               string = save_string (p1 + 1, p - p1 - 2);
3787
3788               /* See if we already recorded this option.  */
3789               for (i = 0; i < n_linker_options; i++)
3790                 if (! strcmp (string, linker_options[i]))
3791                   {
3792                     free (string);
3793                     return 0;
3794                   }
3795
3796               /* This option is new; add it.  */
3797               add_linker_option (string, strlen (string));
3798             }
3799             break;
3800
3801           /* Dump out the options accumulated previously using %x.  */
3802           case 'X':
3803             for (i = 0; i < n_linker_options; i++)
3804               {
3805                 do_spec_1 (linker_options[i], 1, NULL_PTR);
3806                 /* Make each accumulated option a separate argument.  */
3807                 do_spec_1 (" ", 0, NULL_PTR);
3808               }
3809             break;
3810
3811           /* Dump out the options accumulated previously using -Wa,.  */
3812           case 'Y':
3813             for (i = 0; i < n_assembler_options; i++)
3814               {
3815                 do_spec_1 (assembler_options[i], 1, NULL_PTR);
3816                 /* Make each accumulated option a separate argument.  */
3817                 do_spec_1 (" ", 0, NULL_PTR);
3818               }
3819             break;
3820
3821           /* Dump out the options accumulated previously using -Wp,.  */
3822           case 'Z':
3823             for (i = 0; i < n_preprocessor_options; i++)
3824               {
3825                 do_spec_1 (preprocessor_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             /* Here are digits and numbers that just process
3832                a certain constant string as a spec.  */
3833
3834           case '1':
3835             value = do_spec_1 (cc1_spec, 0, NULL_PTR);
3836             if (value != 0)
3837               return value;
3838             break;
3839
3840           case '2':
3841             value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
3842             if (value != 0)
3843               return value;
3844             break;
3845
3846           case 'a':
3847             value = do_spec_1 (asm_spec, 0, NULL_PTR);
3848             if (value != 0)
3849               return value;
3850             break;
3851
3852           case 'A':
3853             value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
3854             if (value != 0)
3855               return value;
3856             break;
3857
3858           case 'c':
3859             value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
3860             if (value != 0)
3861               return value;
3862             break;
3863
3864           case 'C':
3865             value = do_spec_1 (cpp_spec, 0, NULL_PTR);
3866             if (value != 0)
3867               return value;
3868             break;
3869
3870           case 'E':
3871             value = do_spec_1 (endfile_spec, 0, NULL_PTR);
3872             if (value != 0)
3873               return value;
3874             break;
3875
3876           case 'l':
3877             value = do_spec_1 (link_spec, 0, NULL_PTR);
3878             if (value != 0)
3879               return value;
3880             break;
3881
3882           case 'L':
3883             value = do_spec_1 (lib_spec, 0, NULL_PTR);
3884             if (value != 0)
3885               return value;
3886             break;
3887
3888           case 'G':
3889             value = do_spec_1 (libgcc_spec, 0, NULL_PTR);
3890             if (value != 0)
3891               return value;
3892             break;
3893
3894           case 'p':
3895             {
3896               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
3897               char *buf = x;
3898               char *y;
3899
3900               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
3901               y = cpp_predefines;
3902               while (*y != 0)
3903                 {
3904                   if (! strncmp (y, "-D", 2))
3905                     /* Copy the whole option.  */
3906                     while (*y && *y != ' ' && *y != '\t')
3907                       *x++ = *y++;
3908                   else if (*y == ' ' || *y == '\t')
3909                     /* Copy whitespace to the result.  */
3910                     *x++ = *y++;
3911                   /* Don't copy other options.  */
3912                   else
3913                     y++;
3914                 }
3915
3916               *x = 0;
3917
3918               value = do_spec_1 (buf, 0, NULL_PTR);
3919               if (value != 0)
3920                 return value;
3921             }
3922             break;
3923
3924           case 'P':
3925             {
3926               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
3927               char *buf = x;
3928               char *y;
3929
3930               /* Copy all of CPP_PREDEFINES into BUF,
3931                  but put __ after every -D and at the end of each arg.  */
3932               y = cpp_predefines;
3933               while (*y != 0)
3934                 {
3935                   if (! strncmp (y, "-D", 2))
3936                     {
3937                       int flag = 0;
3938
3939                       *x++ = *y++;
3940                       *x++ = *y++;
3941
3942                       if (*y != '_'
3943                           || (*(y+1) != '_' && ! ISUPPER (*(y+1))))
3944                         {
3945                           /* Stick __ at front of macro name.  */
3946                           *x++ = '_';
3947                           *x++ = '_';
3948                           /* Arrange to stick __ at the end as well.  */
3949                           flag = 1;
3950                         }
3951
3952                       /* Copy the macro name.  */
3953                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
3954                         *x++ = *y++;
3955
3956                       if (flag)
3957                         {
3958                           *x++ = '_';
3959                           *x++ = '_';
3960                         }
3961
3962                       /* Copy the value given, if any.  */
3963                       while (*y && *y != ' ' && *y != '\t')
3964                         *x++ = *y++;
3965                     }
3966                   else if (*y == ' ' || *y == '\t')
3967                     /* Copy whitespace to the result.  */
3968                     *x++ = *y++;
3969                   /* Don't copy -A options  */
3970                   else
3971                     y++;
3972                 }
3973               *x++ = ' ';
3974
3975               /* Copy all of CPP_PREDEFINES into BUF,
3976                  but put __ after every -D.  */
3977               y = cpp_predefines;
3978               while (*y != 0)
3979                 {
3980                   if (! strncmp (y, "-D", 2))
3981                     {
3982                       y += 2;
3983
3984                       if (*y != '_'
3985                           || (*(y+1) != '_' && ! ISUPPER (*(y+1))))
3986                         {
3987                           /* Stick -D__ at front of macro name.  */
3988                           *x++ = '-';
3989                           *x++ = 'D';
3990                           *x++ = '_';
3991                           *x++ = '_';
3992
3993                           /* Copy the macro name.  */
3994                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
3995                             *x++ = *y++;
3996
3997                           /* Copy the value given, if any.  */
3998                           while (*y && *y != ' ' && *y != '\t')
3999                             *x++ = *y++;
4000                         }
4001                       else
4002                         {
4003                           /* Do not copy this macro - we have just done it before */
4004                           while (*y && *y != ' ' && *y != '\t')
4005                             y++;
4006                         }
4007                     }
4008                   else if (*y == ' ' || *y == '\t')
4009                     /* Copy whitespace to the result.  */
4010                     *x++ = *y++;
4011                   /* Don't copy -A options  */
4012                   else
4013                     y++;
4014                 }
4015               *x++ = ' ';
4016
4017               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4018               y = cpp_predefines;
4019               while (*y != 0)
4020                 {
4021                   if (! strncmp (y, "-A", 2))
4022                     /* Copy the whole option.  */
4023                     while (*y && *y != ' ' && *y != '\t')
4024                       *x++ = *y++;
4025                   else if (*y == ' ' || *y == '\t')
4026                     /* Copy whitespace to the result.  */
4027                     *x++ = *y++;
4028                   /* Don't copy other options.  */
4029                   else
4030                     y++;
4031                 }
4032
4033               *x = 0;
4034
4035               value = do_spec_1 (buf, 0, NULL_PTR);
4036               if (value != 0)
4037                 return value;
4038             }
4039             break;
4040
4041           case 'S':
4042             value = do_spec_1 (startfile_spec, 0, NULL_PTR);
4043             if (value != 0)
4044               return value;
4045             break;
4046
4047             /* Here we define characters other than letters and digits.  */
4048
4049           case '{':
4050             p = handle_braces (p);
4051             if (p == 0)
4052               return -1;
4053             break;
4054
4055           case '%':
4056             obstack_1grow (&obstack, '%');
4057             break;
4058
4059           case '*':
4060             do_spec_1 (soft_matched_part, 1, NULL_PTR);
4061             do_spec_1 (" ", 0, NULL_PTR);
4062             break;
4063
4064             /* Process a string found as the value of a spec given by name.
4065                This feature allows individual machine descriptions
4066                to add and use their own specs.
4067                %[...] modifies -D options the way %P does;
4068                %(...) uses the spec unmodified.  */
4069           case '[':
4070             error ("Warning: use of obsolete %%[ operator in specs");
4071           case '(':
4072             {
4073               char *name = p;
4074               struct spec_list *sl;
4075               int len;
4076
4077               /* The string after the S/P is the name of a spec that is to be
4078                  processed.  */
4079               while (*p && *p != ')' && *p != ']')
4080                 p++;
4081
4082               /* See if it's in the list */
4083               for (len = p - name, sl = specs; sl; sl = sl->next)
4084                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4085                   {
4086                     name = *(sl->ptr_spec);
4087 #ifdef DEBUG_SPECS
4088                     fprintf (stderr, "Processing spec %c%s%c, which is '%s'\n",
4089                              c, sl->name, (c == '(') ? ')' : ']', name);
4090 #endif
4091                     break;
4092                   }
4093
4094               if (sl)
4095                 {
4096                   if (c == '(')
4097                     {
4098                       value = do_spec_1 (name, 0, NULL_PTR);
4099                       if (value != 0)
4100                         return value;
4101                     }
4102                   else
4103                     {
4104                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4105                       char *buf = x;
4106                       char *y = name;
4107                       int flag = 0;
4108
4109                       /* Copy all of NAME into BUF, but put __ after
4110                          every -D and at the end of each arg,  */
4111                       while (1)
4112                         {
4113                           if (! strncmp (y, "-D", 2))
4114                             {
4115                               *x++ = '-';
4116                               *x++ = 'D';
4117                               *x++ = '_';
4118                               *x++ = '_';
4119                               y += 2;
4120                               flag = 1;
4121                               continue;
4122                             }
4123                           else if (flag && (*y == ' ' || *y == '\t' || *y == '='
4124                                             || *y == '}' || *y == 0))
4125                             {
4126                               *x++ = '_';
4127                               *x++ = '_';
4128                               flag = 0;
4129                             }
4130                           if (*y == 0)
4131                             break;
4132                           else
4133                             *x++ = *y++;
4134                         }
4135                       *x = 0;
4136
4137                       value = do_spec_1 (buf, 0, NULL_PTR);
4138                       if (value != 0)
4139                         return value;
4140                     }
4141                 }
4142
4143               /* Discard the closing paren or bracket.  */
4144               if (*p)
4145                 p++;
4146             }
4147             break;
4148
4149           case 'v':
4150             {
4151               int c1 = *p++;  /* Select first or second version number.  */
4152               char *v = compiler_version;
4153               char *q;
4154
4155               /* The format of the version string is
4156                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
4157
4158               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
4159               while (! ISDIGIT (*v))
4160                 v++;
4161               if (v > compiler_version && v[-1] != '-')
4162                 abort ();
4163
4164               /* If desired, advance to second version number.  */
4165               if (c1 == '2')
4166                 {
4167                   /* Set V after the first period.  */
4168                   while (ISDIGIT (*v))
4169                     v++;
4170                   if (*v != '.')
4171                     abort ();
4172                   v++;
4173                 }
4174
4175               /* Set Q at the next period or at the end.  */
4176               q = v;
4177               while (ISDIGIT (*q))
4178                 q++;
4179               if (*q != 0 && *q != ' ' && *q != '.' && *q != '-')
4180                 abort ();
4181
4182               /* Put that part into the command.  */
4183               obstack_grow (&obstack, v, q - v);
4184               arg_going = 1;
4185             }
4186             break;
4187
4188           case '|':
4189             if (input_from_pipe)
4190               do_spec_1 ("-", 0, NULL_PTR);
4191             break;
4192
4193           default:
4194             abort ();
4195           }
4196         break;
4197
4198       case '\\':
4199         /* Backslash: treat next character as ordinary.  */
4200         c = *p++;
4201
4202         /* fall through */
4203       default:
4204         /* Ordinary character: put it into the current argument.  */
4205         obstack_1grow (&obstack, c);
4206         arg_going = 1;
4207       }
4208
4209   return 0;             /* End of string */
4210 }
4211
4212 /* Return 0 if we call do_spec_1 and that returns -1.  */
4213
4214 static char *
4215 handle_braces (p)
4216      register char *p;
4217 {
4218   char *filter, *body = NULL, *endbody;
4219   int pipe_p = 0;
4220   int negate;
4221   int suffix;
4222   int include_blanks = 1;
4223
4224   if (*p == '^')
4225     /* A '^' after the open-brace means to not give blanks before args.  */
4226     include_blanks = 0, ++p;
4227
4228   if (*p == '|')
4229     /* A `|' after the open-brace means,
4230        if the test fails, output a single minus sign rather than nothing.
4231        This is used in %{|!pipe:...}.  */
4232     pipe_p = 1, ++p;
4233
4234 next_member:
4235   negate = suffix = 0;
4236
4237   if (*p == '!')
4238     /* A `!' after the open-brace negates the condition:
4239        succeed if the specified switch is not present.  */
4240     negate = 1, ++p;
4241
4242   if (*p == '.')
4243     /* A `.' after the open-brace means test against the current suffix.  */
4244     {
4245       if (pipe_p)
4246         abort ();
4247
4248       suffix = 1;
4249       ++p;
4250     }
4251
4252   filter = p;
4253   while (*p != ':' && *p != '}' && *p != '|') p++;
4254
4255   if (*p == '|' && pipe_p)
4256     abort ();
4257
4258   if (!body)
4259     {
4260       if (*p != '}')
4261         {
4262           register int count = 1;
4263           register char *q = p;
4264
4265           while (*q++ != ':') continue;
4266           body = q;
4267           
4268           while (count > 0)
4269             {
4270               if (*q == '{')
4271                 count++;
4272               else if (*q == '}')
4273                 count--;
4274               else if (*q == 0)
4275                 abort ();
4276               q++;
4277             }
4278           endbody = q;
4279         }
4280       else
4281         body = p, endbody = p+1;
4282     }
4283
4284   if (suffix)
4285     {
4286       int found = (input_suffix != 0
4287                    && strlen (input_suffix) == p - filter
4288                    && strncmp (input_suffix, filter, p - filter) == 0);
4289
4290       if (body[0] == '}')
4291         abort ();
4292
4293       if (negate != found
4294           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL_PTR) < 0)
4295         return 0;
4296     }
4297   else if (p[-1] == '*' && p[0] == '}')
4298     {
4299       /* Substitute all matching switches as separate args.  */
4300       register int i;
4301       --p;
4302       for (i = 0; i < n_switches; i++)
4303         if (!strncmp (switches[i].part1, filter, p - filter)
4304             && check_live_switch (i, p - filter))
4305           give_switch (i, 0, include_blanks);
4306     }
4307   else
4308     {
4309       /* Test for presence of the specified switch.  */
4310       register int i;
4311       int present = 0;
4312
4313       /* If name specified ends in *, as in {x*:...},
4314          check for %* and handle that case.  */
4315       if (p[-1] == '*' && !negate)
4316         {
4317           int substitution;
4318           char *r = body;
4319
4320           /* First see whether we have %*.  */
4321           substitution = 0;
4322           while (r < endbody)
4323             {
4324               if (*r == '%' && r[1] == '*')
4325                 substitution = 1;
4326               r++;
4327             }
4328           /* If we do, handle that case.  */
4329           if (substitution)
4330             {
4331               /* Substitute all matching switches as separate args.
4332                  But do this by substituting for %*
4333                  in the text that follows the colon.  */
4334
4335               unsigned hard_match_len = p - filter - 1;
4336               char *string = save_string (body, endbody - body - 1);
4337
4338               for (i = 0; i < n_switches; i++)
4339                 if (!strncmp (switches[i].part1, filter, hard_match_len)
4340                     && check_live_switch (i, -1))
4341                   {
4342                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4343                     /* Pass any arguments this switch has.  */
4344                     give_switch (i, 1, 1);
4345                   }
4346
4347               /* We didn't match.  Try again.  */
4348               if (*p++ == '|')
4349                 goto next_member;
4350               return endbody;
4351             }
4352         }
4353
4354       /* If name specified ends in *, as in {x*:...},
4355          check for presence of any switch name starting with x.  */
4356       if (p[-1] == '*')
4357         {
4358           for (i = 0; i < n_switches; i++)
4359             {
4360               unsigned hard_match_len = p - filter - 1;
4361
4362               if (!strncmp (switches[i].part1, filter, hard_match_len)
4363                   && check_live_switch (i, hard_match_len))
4364                 {
4365                   present = 1;
4366                 }
4367             }
4368         }
4369       /* Otherwise, check for presence of exact name specified.  */
4370       else
4371         {
4372           for (i = 0; i < n_switches; i++)
4373             {
4374               if (!strncmp (switches[i].part1, filter, p - filter)
4375                   && switches[i].part1[p - filter] == 0
4376                   && check_live_switch (i, -1))
4377                 {
4378                   present = 1;
4379                   break;
4380                 }
4381             }
4382         }
4383
4384       /* If it is as desired (present for %{s...}, absent for %{!s...})
4385          then substitute either the switch or the specified
4386          conditional text.  */
4387       if (present != negate)
4388         {
4389           if (*p == '}')
4390             {
4391               give_switch (i, 0, include_blanks);
4392             }
4393           else
4394             {
4395               if (do_spec_1 (save_string (body, endbody - body - 1),
4396                              0, NULL_PTR) < 0)
4397                 return 0;
4398             }
4399         }
4400       else if (pipe_p)
4401         {
4402           /* Here if a %{|...} conditional fails: output a minus sign,
4403              which means "standard output" or "standard input".  */
4404           do_spec_1 ("-", 0, NULL_PTR);
4405           return endbody;
4406         }
4407     }
4408
4409   /* We didn't match; try again.  */
4410   if (*p++ == '|')
4411     goto next_member;
4412
4413   return endbody;
4414 }
4415 \f
4416 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4417    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
4418    spec, or -1 if either exact match or %* is used.
4419
4420    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
4421    whose value does not begin with "no-" is obsoleted by the same value
4422    with the "no-", similarly for a switch with the "no-" prefix.  */
4423
4424 static int
4425 check_live_switch (switchnum, prefix_length)
4426      int switchnum;
4427      int prefix_length;
4428 {
4429   char *name = switches[switchnum].part1;
4430   int i;
4431
4432   /* In the common case of {<at-most-one-letter>*}, a negating
4433      switch would always match, so ignore that case.  We will just
4434      send the conflicting switches to the compiler phase.  */
4435   if (prefix_length >= 0 && prefix_length <= 1)
4436     return 1;
4437
4438   /* If we already processed this switch and determined if it was
4439      live or not, return our past determination.  */
4440   if (switches[switchnum].live_cond != 0)
4441     return switches[switchnum].live_cond > 0;
4442
4443   /* Now search for duplicate in a manner that depends on the name.  */
4444   switch (*name)
4445     {
4446     case 'O':
4447         for (i = switchnum + 1; i < n_switches; i++)
4448           if (switches[i].part1[0] == 'O')
4449             {
4450               switches[switchnum].valid = 1;
4451               switches[switchnum].live_cond = -1;
4452               return 0;
4453             }
4454       break;
4455
4456     case 'W':  case 'f':  case 'm':
4457       if (! strncmp (name + 1, "no-", 3))
4458         {
4459           /* We have Xno-YYY, search for XYYY.  */
4460           for (i = switchnum + 1; i < n_switches; i++)
4461             if (switches[i].part1[0] == name[0]
4462                 && ! strcmp (&switches[i].part1[1], &name[4]))
4463             {
4464               switches[switchnum].valid = 1;
4465               switches[switchnum].live_cond = -1;
4466               return 0;
4467             }
4468         }
4469       else
4470         {
4471           /* We have XYYY, search for Xno-YYY.  */
4472           for (i = switchnum + 1; i < n_switches; i++)
4473             if (switches[i].part1[0] == name[0]
4474                 && switches[i].part1[1] == 'n'
4475                 && switches[i].part1[2] == 'o'
4476                 && switches[i].part1[3] == '-'
4477                 && !strcmp (&switches[i].part1[4], &name[1]))
4478             {
4479               switches[switchnum].valid = 1;
4480               switches[switchnum].live_cond = -1;
4481               return 0;
4482             }
4483         }
4484       break;
4485     }
4486
4487   /* Otherwise the switch is live.  */
4488   switches[switchnum].live_cond = 1;
4489   return 1;
4490 }
4491 \f
4492 /* Pass a switch to the current accumulating command
4493    in the same form that we received it.
4494    SWITCHNUM identifies the switch; it is an index into
4495    the vector of switches gcc received, which is `switches'.
4496    This cannot fail since it never finishes a command line.
4497
4498    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
4499
4500    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
4501    of the switch.  */
4502
4503 static void
4504 give_switch (switchnum, omit_first_word, include_blanks)
4505      int switchnum;
4506      int omit_first_word;
4507      int include_blanks;
4508 {
4509   if (!omit_first_word)
4510     {
4511       do_spec_1 ("-", 0, NULL_PTR);
4512       do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
4513     }
4514
4515   if (switches[switchnum].args != 0)
4516     {
4517       char **p;
4518       for (p = switches[switchnum].args; *p; p++)
4519         {
4520           if (include_blanks)
4521             do_spec_1 (" ", 0, NULL_PTR);
4522           do_spec_1 (*p, 1, NULL_PTR);
4523         }
4524     }
4525
4526   do_spec_1 (" ", 0, NULL_PTR);
4527   switches[switchnum].valid = 1;
4528 }
4529 \f
4530 /* Search for a file named NAME trying various prefixes including the
4531    user's -B prefix and some standard ones.
4532    Return the absolute file name found.  If nothing is found, return NAME.  */
4533
4534 static char *
4535 find_file (name)
4536      char *name;
4537 {
4538   char *newname;
4539
4540   /* Try multilib_dir if it is defined.  */
4541   if (multilib_dir != NULL)
4542     {
4543       char *try;
4544
4545       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
4546       strcpy (try, multilib_dir);
4547       strcat (try, dir_separator_str);
4548       strcat (try, name);
4549
4550       newname = find_a_file (&startfile_prefixes, try, R_OK);
4551
4552       /* If we don't find it in the multi library dir, then fall
4553          through and look for it in the normal places.  */
4554       if (newname != NULL)
4555         return newname;
4556     }
4557
4558   newname = find_a_file (&startfile_prefixes, name, R_OK);
4559   return newname ? newname : name;
4560 }
4561
4562 /* Determine whether a directory exists.  If LINKER, return 0 for
4563    certain fixed names not needed by the linker.  If not LINKER, it is
4564    only important to return 0 if the host machine has a small ARG_MAX
4565    limit.  */
4566
4567 static int
4568 is_directory (path1, path2, linker)
4569      char *path1;
4570      char *path2;
4571      int linker;
4572 {
4573   int len1 = strlen (path1);
4574   int len2 = strlen (path2);
4575   char *path = (char *) alloca (3 + len1 + len2);
4576   char *cp;
4577   struct stat st;
4578
4579 #ifndef SMALL_ARG_MAX
4580   if (! linker)
4581     return 1;
4582 #endif
4583
4584   /* Construct the path from the two parts.  Ensure the string ends with "/.".
4585      The resulting path will be a directory even if the given path is a
4586      symbolic link.  */
4587   bcopy (path1, path, len1);
4588   bcopy (path2, path + len1, len2);
4589   cp = path + len1 + len2;
4590   if (cp[-1] != '/' && cp[-1] != DIR_SEPARATOR)
4591     *cp++ = DIR_SEPARATOR;
4592   *cp++ = '.';
4593   *cp = '\0';
4594
4595   /* Exclude directories that the linker is known to search.  */
4596   if (linker
4597       && ((cp - path == 6
4598            && strcmp (path, concat (dir_separator_str, "lib", 
4599                                     dir_separator_str, ".", NULL_PTR)) == 0)
4600           || (cp - path == 10
4601               && strcmp (path, concat (dir_separator_str, "usr", 
4602                                        dir_separator_str, "lib", 
4603                                        dir_separator_str, ".", NULL_PTR)) == 0)))
4604     return 0;
4605
4606   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
4607 }
4608 \f
4609 /* On fatal signals, delete all the temporary files.  */
4610
4611 static void
4612 fatal_error (signum)
4613      int signum;
4614 {
4615   signal (signum, SIG_DFL);
4616   delete_failure_queue ();
4617   delete_temp_files ();
4618   /* Get the same signal again, this time not handled,
4619      so its normal effect occurs.  */
4620   kill (getpid (), signum);
4621 }
4622
4623 int
4624 main (argc, argv)
4625      int argc;
4626      char **argv;
4627 {
4628   register size_t i;
4629   size_t j;
4630   int value;
4631   int linker_was_run = 0;
4632   char *explicit_link_files;
4633   char *specs_file;
4634   char *p;
4635   struct user_specs *uptr;
4636
4637   p = argv[0] + strlen (argv[0]);
4638   while (p != argv[0] && p[-1] != '/' && p[-1] != DIR_SEPARATOR) --p;
4639   programname = p;
4640
4641   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
4642     signal (SIGINT, fatal_error);
4643 #ifdef SIGHUP
4644   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
4645     signal (SIGHUP, fatal_error);
4646 #endif
4647   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
4648     signal (SIGTERM, fatal_error);
4649 #ifdef SIGPIPE
4650   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
4651     signal (SIGPIPE, fatal_error);
4652 #endif
4653
4654   argbuf_length = 10;
4655   argbuf = (char **) xmalloc (argbuf_length * sizeof (char *));
4656
4657   obstack_init (&obstack);
4658
4659   /* Build multilib_select, et. al from the separate lines that make up each
4660      multilib selection.  */
4661   {
4662     char **q = multilib_raw;
4663     int need_space;
4664
4665     obstack_init (&multilib_obstack);
4666     while ((p = *q++) != (char *) 0)
4667       obstack_grow (&multilib_obstack, p, strlen (p));
4668
4669     obstack_1grow (&multilib_obstack, 0);
4670     multilib_select = obstack_finish (&multilib_obstack);
4671
4672     q = multilib_matches_raw;
4673     while ((p = *q++) != (char *) 0)
4674       obstack_grow (&multilib_obstack, p, strlen (p));
4675
4676     obstack_1grow (&multilib_obstack, 0);
4677     multilib_matches = obstack_finish (&multilib_obstack);
4678
4679     need_space = FALSE;
4680     for (i = 0;
4681          i < sizeof (multilib_defaults_raw) / sizeof (multilib_defaults_raw[0]);
4682          i++)
4683       {
4684         if (need_space)
4685           obstack_1grow (&multilib_obstack, ' ');
4686         obstack_grow (&multilib_obstack,
4687                       multilib_defaults_raw[i],
4688                       strlen (multilib_defaults_raw[i]));
4689         need_space = TRUE;
4690       }
4691
4692     obstack_1grow (&multilib_obstack, 0);
4693     multilib_defaults = obstack_finish (&multilib_obstack);
4694   }
4695
4696   /* Set up to remember the pathname of gcc and any options
4697      needed for collect.  We use argv[0] instead of programname because
4698      we need the complete pathname.  */
4699   obstack_init (&collect_obstack);
4700   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
4701   obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
4702   putenv (obstack_finish (&collect_obstack));
4703
4704 #ifdef INIT_ENVIRONMENT
4705   /* Set up any other necessary machine specific environment variables.  */
4706   putenv (INIT_ENVIRONMENT);
4707 #endif
4708
4709   /* Choose directory for temp files.  */
4710
4711 #ifndef MKTEMP_EACH_FILE
4712   temp_filename = choose_temp_base ();
4713   temp_filename_length = strlen (temp_filename);
4714 #endif
4715
4716   /* Make a table of what switches there are (switches, n_switches).
4717      Make a table of specified input files (infiles, n_infiles).
4718      Decode switches that are handled locally.  */
4719
4720   process_command (argc, argv);
4721
4722   {
4723     int first_time;
4724
4725     /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4726        the compiler.  */
4727     obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4728                   sizeof ("COLLECT_GCC_OPTIONS=")-1);
4729
4730     first_time = TRUE;
4731     for (i = 0; i < n_switches; i++)
4732       {
4733         char **args;
4734         char *p, *q;
4735         if (!first_time)
4736           obstack_grow (&collect_obstack, " ", 1);
4737
4738         first_time = FALSE;
4739         obstack_grow (&collect_obstack, "'-", 2);
4740         q = switches[i].part1;
4741         while ((p = index (q,'\'')))
4742           {
4743             obstack_grow (&collect_obstack, q, p-q);
4744             obstack_grow (&collect_obstack, "'\\''", 4);
4745             q = ++p;
4746           }
4747         obstack_grow (&collect_obstack, q, strlen (q));
4748         obstack_grow (&collect_obstack, "'", 1);
4749
4750         for (args = switches[i].args; args && *args; args++)
4751           {
4752             obstack_grow (&collect_obstack, " '", 2);
4753             q = *args;
4754             while ((p = index (q,'\'')))
4755               {
4756                 obstack_grow (&collect_obstack, q, p-q);
4757                 obstack_grow (&collect_obstack, "'\\''", 4);
4758                 q = ++p;
4759               }
4760             obstack_grow (&collect_obstack, q, strlen (q));
4761             obstack_grow (&collect_obstack, "'", 1);
4762           }
4763       }
4764     obstack_grow (&collect_obstack, "\0", 1);
4765     putenv (obstack_finish (&collect_obstack));
4766   }
4767
4768   /* Initialize the vector of specs to just the default.
4769      This means one element containing 0s, as a terminator.  */
4770
4771   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
4772   bcopy ((char *) default_compilers, (char *) compilers,
4773          sizeof default_compilers);
4774   n_compilers = n_default_compilers;
4775
4776   /* Read specs from a file if there is one.  */
4777
4778   machine_suffix = concat (spec_machine, dir_separator_str,
4779                            spec_version, dir_separator_str, NULL_PTR);
4780   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
4781
4782   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
4783   /* Read the specs file unless it is a default one.  */
4784   if (specs_file != 0 && strcmp (specs_file, "specs"))
4785     read_specs (specs_file, TRUE);
4786   else
4787     init_spec ();
4788
4789   /* We need to check standard_exec_prefix/just_machine_suffix/specs
4790      for any override of as, ld and libraries. */
4791   specs_file = (char *) alloca (strlen (standard_exec_prefix)
4792                                 + strlen (just_machine_suffix)
4793                                 + sizeof ("specs"));
4794
4795   strcpy (specs_file, standard_exec_prefix);
4796   strcat (specs_file, just_machine_suffix);
4797   strcat (specs_file, "specs");
4798   if (access (specs_file, R_OK) == 0)
4799     read_specs (specs_file, TRUE);
4800  
4801   /* Process any user specified specs in the order given on the command
4802      line.  */
4803   for (uptr = user_specs_head; uptr; uptr = uptr->next)
4804     {
4805       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
4806       read_specs (filename ? filename : uptr->filename, FALSE);
4807     }
4808
4809   /* If not cross-compiling, look for startfiles in the standard places.  */
4810   /* The fact that these are done here, after reading the specs file,
4811      means that it cannot be found in these directories.
4812      But that's okay.  It should never be there anyway.  */
4813   if (*cross_compile == '0')
4814     {
4815 #ifdef MD_EXEC_PREFIX
4816       add_prefix (&exec_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
4817       add_prefix (&startfile_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
4818 #endif
4819
4820 #ifdef MD_STARTFILE_PREFIX
4821       add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
4822                   0, 0, NULL_PTR);
4823 #endif
4824
4825 #ifdef MD_STARTFILE_PREFIX_1
4826       add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
4827                   0, 0, NULL_PTR);
4828 #endif
4829
4830       /* If standard_startfile_prefix is relative, base it on
4831          standard_exec_prefix.  This lets us move the installed tree
4832          as a unit.  If GCC_EXEC_PREFIX is defined, base
4833          standard_startfile_prefix on that as well.  */
4834       if (*standard_startfile_prefix == '/'
4835           || *standard_startfile_prefix == DIR_SEPARATOR
4836           || *standard_startfile_prefix == '$'
4837 #ifdef __MSDOS__
4838           /* Check for disk name on MS-DOS-based systems.  */
4839           || (standard_startfile_prefix[1] == ':'
4840               && (standard_startfile_prefix[2] == DIR_SEPARATOR
4841                   || standard_startfile_prefix[2] == '/'))
4842 #endif
4843           )
4844         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
4845                     0, 0, NULL_PTR);
4846       else
4847         {
4848           if (gcc_exec_prefix)
4849             add_prefix (&startfile_prefixes,
4850                         concat (gcc_exec_prefix, machine_suffix,
4851                                 standard_startfile_prefix, NULL_PTR),
4852                         NULL_PTR, 0, 0, NULL_PTR);
4853           add_prefix (&startfile_prefixes,
4854                       concat (standard_exec_prefix,
4855                               machine_suffix,
4856                               standard_startfile_prefix, NULL_PTR),
4857                       NULL_PTR, 0, 0, NULL_PTR);
4858         }                      
4859
4860       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
4861                   "BINUTILS", 0, 0, NULL_PTR);
4862       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
4863                   "BINUTILS", 0, 0, NULL_PTR);
4864 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
4865       add_prefix (&startfile_prefixes, "./", NULL_PTR, 0, 1, NULL_PTR);
4866 #endif
4867     }
4868   else
4869     {
4870       if (*standard_startfile_prefix != DIR_SEPARATOR && gcc_exec_prefix)
4871         add_prefix (&startfile_prefixes,
4872                     concat (gcc_exec_prefix, machine_suffix,
4873                             standard_startfile_prefix, NULL_PTR),
4874                     "BINUTILS", 0, 0, NULL_PTR);
4875     }
4876
4877   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
4878   if (gcc_exec_prefix)
4879     {
4880       char * temp = (char *) xmalloc (strlen (gcc_exec_prefix)
4881                                       + strlen (spec_version)
4882                                       + strlen (spec_machine) + 3);
4883       strcpy (temp, gcc_exec_prefix);
4884       strcat (temp, spec_machine);
4885       strcat (temp, dir_separator_str);
4886       strcat (temp, spec_version);
4887       strcat (temp, dir_separator_str);
4888       gcc_exec_prefix = temp;
4889     }
4890
4891   /* Now we have the specs.
4892      Set the `valid' bits for switches that match anything in any spec.  */
4893
4894   validate_all_switches ();
4895
4896   /* Now that we have the switches and the specs, set
4897      the subdirectory based on the options.  */
4898   set_multilib_dir ();
4899
4900   /* Warn about any switches that no pass was interested in.  */
4901
4902   for (i = 0; i < n_switches; i++)
4903     if (! switches[i].valid)
4904       error ("unrecognized option `-%s'", switches[i].part1);
4905
4906   /* Obey some of the options.  */
4907
4908   if (print_search_dirs)
4909     {
4910       printf ("install: %s%s\n", standard_exec_prefix, machine_suffix);
4911       printf ("programs: %s\n", build_search_list (&exec_prefixes, "", 0));
4912       printf ("libraries: %s\n", build_search_list (&startfile_prefixes, "", 0));
4913       exit (0);
4914     }
4915
4916   if (print_file_name)
4917     {
4918       printf ("%s\n", find_file (print_file_name));
4919       exit (0);
4920     }
4921
4922   if (print_prog_name)
4923     {
4924       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
4925       printf ("%s\n", (newname ? newname : print_prog_name));
4926       exit (0);
4927     }
4928
4929   if (print_multi_lib)
4930     {
4931       print_multilib_info ();
4932       exit (0);
4933     }
4934
4935   if (print_multi_directory)
4936     {
4937       if (multilib_dir == NULL)
4938         printf (".\n");
4939       else
4940         printf ("%s\n", multilib_dir);
4941       exit (0);
4942     }
4943
4944   if (print_help_list)
4945     {
4946       display_help ();
4947
4948       if (! verbose_flag)
4949         {
4950           printf ("\nReport bugs to egcs-bugs@cygnus.com.\n");
4951           printf ("Please see the file BUGS (included with the sources) first.\n");
4952           
4953           exit (0);
4954         }
4955
4956       /* We do not exit here.  Instead we have created a fake input file
4957          called 'help-dummy' which needs to be compiled, and we pass this
4958          on the the various sub-processes, along with the --help switch.  */
4959     }
4960   
4961   if (verbose_flag)
4962     {
4963       int n;
4964
4965       /* compiler_version is truncated at the first space when initialized
4966          from version string, so truncate version_string at the first space
4967          before comparing.  */
4968       for (n = 0; version_string[n]; n++)
4969         if (version_string[n] == ' ')
4970           break;
4971
4972       if (! strncmp (version_string, compiler_version, n)
4973           && compiler_version[n] == 0)
4974         fprintf (stderr, "gcc version %s\n", version_string);
4975       else
4976         fprintf (stderr, "gcc driver version %s executing gcc version %s\n",
4977                  version_string, compiler_version);
4978
4979       if (n_infiles == 0)
4980         exit (0);
4981     }
4982
4983   if (n_infiles == added_libraries)
4984     fatal ("No input files");
4985
4986   /* Make a place to record the compiler output file names
4987      that correspond to the input files.  */
4988
4989   i = n_infiles;
4990 #ifdef LANG_SPECIFIC_DRIVER
4991   i += lang_specific_extra_outfiles;
4992 #endif
4993   outfiles = (char **) xmalloc (i * sizeof (char *));
4994   bzero ((char *) outfiles, i * sizeof (char *));
4995
4996   /* Record which files were specified explicitly as link input.  */
4997
4998   explicit_link_files = xmalloc (n_infiles);
4999   bzero (explicit_link_files, n_infiles);
5000
5001   for (i = 0; i < n_infiles; i++)
5002     {
5003       register struct compiler *cp = 0;
5004       int this_file_error = 0;
5005
5006       /* Tell do_spec what to substitute for %i.  */
5007
5008       input_filename = infiles[i].name;
5009       input_filename_length = strlen (input_filename);
5010       input_file_number = i;
5011
5012       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5013
5014       outfiles[i] = input_filename;
5015
5016       /* Figure out which compiler from the file's suffix.  */
5017
5018       cp = lookup_compiler (infiles[i].name, input_filename_length,
5019                             infiles[i].language);
5020
5021       if (cp)
5022         {
5023           /* Ok, we found an applicable compiler.  Run its spec.  */
5024           /* First say how much of input_filename to substitute for %b  */
5025           register char *p;
5026           int len;
5027
5028           if (cp->spec[0][0] == '#')
5029             error ("%s: %s compiler not installed on this system",
5030                    input_filename, &cp->spec[0][1]);
5031
5032           input_basename = input_filename;
5033           for (p = input_filename; *p; p++)
5034             if (*p == '/' || *p == DIR_SEPARATOR)
5035               input_basename = p + 1;
5036
5037           /* Find a suffix starting with the last period,
5038              and set basename_length to exclude that suffix.  */
5039           basename_length = strlen (input_basename);
5040           p = input_basename + basename_length;
5041           while (p != input_basename && *p != '.') --p;
5042           if (*p == '.' && p != input_basename)
5043             {
5044               basename_length = p - input_basename;
5045               input_suffix = p + 1;
5046             }
5047           else
5048             input_suffix = "";
5049
5050           len = 0;
5051           for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5052             if (cp->spec[j])
5053               len += strlen (cp->spec[j]);
5054
5055           p = (char *) xmalloc (len + 1);
5056
5057           len = 0;
5058           for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5059             if (cp->spec[j])
5060               {
5061                 strcpy (p + len, cp->spec[j]);
5062                 len += strlen (cp->spec[j]);
5063               }
5064
5065           value = do_spec (p);
5066           free (p);
5067           if (value < 0)
5068             this_file_error = 1;
5069         }
5070
5071       /* If this file's name does not contain a recognized suffix,
5072          record it as explicit linker input.  */
5073
5074       else
5075         explicit_link_files[i] = 1;
5076
5077       /* Clear the delete-on-failure queue, deleting the files in it
5078          if this compilation failed.  */
5079
5080       if (this_file_error)
5081         {
5082           delete_failure_queue ();
5083           error_count++;
5084         }
5085       /* If this compilation succeeded, don't delete those files later.  */
5086       clear_failure_queue ();
5087     }
5088
5089 #ifdef LANG_SPECIFIC_DRIVER
5090   if (error_count == 0)
5091     {
5092       /* Make sure INPUT_FILE_NUMBER points to first available open
5093          slot.  */
5094       input_file_number = n_infiles;
5095       if (lang_specific_pre_link ())
5096         error_count++;
5097     }
5098 #endif
5099
5100   /* Run ld to link all the compiler output files.  */
5101
5102   if (error_count == 0)
5103     {
5104       int tmp = execution_count;
5105
5106       /* We'll use ld if we can't find collect2. */
5107       if (! strcmp (linker_name_spec, "collect2"))
5108         {
5109           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
5110           if (s == NULL)
5111             linker_name_spec = "ld";
5112         }
5113       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
5114          for collect.  */
5115       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH=");
5116       putenv_from_prefixes (&startfile_prefixes, "LIBRARY_PATH=");
5117
5118       value = do_spec (link_command_spec);
5119       if (value < 0)
5120         error_count = 1;
5121       linker_was_run = (tmp != execution_count);
5122     }
5123
5124   /* Warn if a -B option was specified but the prefix was never used.  */
5125   unused_prefix_warnings (&exec_prefixes);
5126   unused_prefix_warnings (&startfile_prefixes);
5127
5128   /* If options said don't run linker,
5129      complain about input files to be given to the linker.  */
5130
5131   if (! linker_was_run && error_count == 0)
5132     for (i = 0; i < n_infiles; i++)
5133       if (explicit_link_files[i])
5134         error ("%s: linker input file unused since linking not done",
5135                outfiles[i]);
5136
5137   /* Delete some or all of the temporary files we made.  */
5138
5139   if (error_count)
5140     delete_failure_queue ();
5141   delete_temp_files ();
5142
5143   if (print_help_list)
5144     {
5145       printf ("\nReport bugs to egcs-bugs@cygnus.com.\n");
5146       printf ("Please see the file BUGS (included with the sources) first.\n");
5147     }
5148   
5149   exit (error_count > 0 ? (signal_count ? 2 : 1) : 0);
5150   /* NOTREACHED */
5151   return 0;
5152 }
5153
5154 /* Find the proper compilation spec for the file name NAME,
5155    whose length is LENGTH.  LANGUAGE is the specified language,
5156    or 0 if this file is to be passed to the linker.  */
5157
5158 static struct compiler *
5159 lookup_compiler (name, length, language)
5160      char *name;
5161      size_t length;
5162      char *language;
5163 {
5164   struct compiler *cp;
5165
5166   /* If this was specified by the user to be a linker input, indicate that. */
5167   if (language != 0 && language[0] == '*')
5168     return 0;
5169
5170   /* Otherwise, look for the language, if one is spec'd.  */
5171   if (language != 0)
5172     {
5173       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5174         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
5175           return cp;
5176
5177       error ("language %s not recognized", language);
5178       return 0;
5179     }
5180
5181   /* Look for a suffix.  */
5182   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5183     {
5184       if (/* The suffix `-' matches only the file name `-'.  */
5185           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5186           || (strlen (cp->suffix) < length
5187               /* See if the suffix matches the end of NAME.  */
5188 #ifdef OS2
5189               && ((!strcmp (cp->suffix,
5190                            name + length - strlen (cp->suffix))
5191                    || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
5192                   && !strcasecmp (cp->suffix,
5193                                   name + length - strlen (cp->suffix)))
5194 #else
5195               && !strcmp (cp->suffix,
5196                           name + length - strlen (cp->suffix))
5197 #endif
5198          ))
5199         {
5200           if (cp->spec[0][0] == '@')
5201             {
5202               struct compiler *new;
5203
5204               /* An alias entry maps a suffix to a language.
5205                  Search for the language; pass 0 for NAME and LENGTH
5206                  to avoid infinite recursion if language not found.
5207                  Construct the new compiler spec.  */
5208               language = cp->spec[0] + 1;
5209               new = (struct compiler *) xmalloc (sizeof (struct compiler));
5210               new->suffix = cp->suffix;
5211               bcopy ((char *) lookup_compiler (NULL_PTR, 0, language)->spec,
5212                      (char *) new->spec, sizeof new->spec);
5213               return new;
5214             }
5215
5216           /* A non-alias entry: return it.  */
5217           return cp;
5218         }
5219     }
5220
5221   return 0;
5222 }
5223 \f
5224 char *
5225 xmalloc (size)
5226      unsigned size;
5227 {
5228   register char *value = (char *) malloc (size);
5229   if (value == 0)
5230     fatal ("virtual memory exhausted");
5231   return value;
5232 }
5233
5234 char *
5235 xrealloc (ptr, size)
5236      char *ptr;
5237      unsigned size;
5238 {
5239   register char *value = (char *) realloc (ptr, size);
5240   if (value == 0)
5241     fatal ("virtual memory exhausted");
5242   return value;
5243 }
5244
5245 /* This function is based on the one in libiberty.  */
5246
5247 static char *
5248 concat VPROTO((char *first, ...))
5249 {
5250   register int length;
5251   register char *newstr;
5252   register char *end;
5253   register char *arg;
5254   va_list args;
5255 #ifndef __STDC__
5256   char *first;
5257 #endif
5258
5259   /* First compute the size of the result and get sufficient memory.  */
5260
5261   VA_START (args, first);
5262 #ifndef __STDC__
5263   first = va_arg (args, char *);
5264 #endif
5265
5266   arg = first;
5267   length = 0;
5268
5269   while (arg != 0)
5270     {
5271       length += strlen (arg);
5272       arg = va_arg (args, char *);
5273     }
5274
5275   newstr = (char *) xmalloc (length + 1);
5276   va_end (args);
5277
5278   /* Now copy the individual pieces to the result string.  */
5279
5280   VA_START (args, first);
5281 #ifndef __STDC__
5282   first = va_arg (args, char *);
5283 #endif
5284
5285   end = newstr;
5286   arg = first;
5287   while (arg != 0)
5288     {
5289       while (*arg)
5290         *end++ = *arg++;
5291       arg = va_arg (args, char *);
5292     }
5293   *end = '\000';
5294   va_end (args);
5295
5296   return (newstr);
5297 }
5298
5299 static char *
5300 save_string (s, len)
5301      char *s;
5302      int len;
5303 {
5304   register char *result = xmalloc (len + 1);
5305
5306   bcopy (s, result, len);
5307   result[len] = 0;
5308   return result;
5309 }
5310
5311 static void
5312 pfatal_with_name (name)
5313      char *name;
5314 {
5315   fatal ("%s: %s", name, my_strerror (errno));
5316 }
5317
5318 static void
5319 perror_with_name (name)
5320      char *name;
5321 {
5322   error ("%s: %s", name, my_strerror (errno));
5323 }
5324
5325 static void
5326 pfatal_pexecute (errmsg_fmt, errmsg_arg)
5327      char *errmsg_fmt;
5328      char *errmsg_arg;
5329 {
5330   int save_errno = errno;
5331
5332   if (errmsg_arg)
5333     {
5334       /* Space for trailing '\0' is in %s.  */
5335       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
5336       sprintf (msg, errmsg_fmt, errmsg_arg);
5337       errmsg_fmt = msg;
5338     }
5339
5340   fatal ("%s: %s", errmsg_fmt, my_strerror (save_errno));
5341 }
5342
5343 /* More 'friendly' abort that prints the line and file.
5344    config.h can #define abort fancy_abort if you like that sort of thing.  */
5345
5346 void
5347 fancy_abort ()
5348 {
5349   fatal ("Internal gcc abort.");
5350 }
5351 \f
5352 /* Output an error message and exit */
5353
5354 static void
5355 fatal VPROTO((char *format, ...))
5356 {
5357 #ifndef __STDC__
5358   char *format;
5359 #endif
5360   va_list ap;
5361
5362   VA_START (ap, format);
5363
5364 #ifndef __STDC__
5365   format = va_arg (ap, char *);
5366 #endif
5367
5368   fprintf (stderr, "%s: ", programname);
5369   vfprintf (stderr, format, ap);
5370   va_end (ap);
5371   fprintf (stderr, "\n");
5372   delete_temp_files ();
5373   exit (1);
5374 }
5375
5376 static void
5377 error VPROTO((char *format, ...))
5378 {
5379 #ifndef __STDC__
5380   char *format;
5381 #endif
5382   va_list ap;
5383
5384   VA_START (ap, format);
5385
5386 #ifndef __STDC__
5387   format = va_arg (ap, char *);
5388 #endif
5389
5390   fprintf (stderr, "%s: ", programname);
5391   vfprintf (stderr, format, ap);
5392   va_end (ap);
5393
5394   fprintf (stderr, "\n");
5395 }
5396 \f
5397 static void
5398 validate_all_switches ()
5399 {
5400   struct compiler *comp;
5401   register char *p;
5402   register char c;
5403   struct spec_list *spec;
5404
5405   for (comp = compilers; comp->spec[0]; comp++)
5406     {
5407       size_t i;
5408       for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
5409         {
5410           p = comp->spec[i];
5411           while ((c = *p++))
5412             if (c == '%' && *p == '{')
5413               /* We have a switch spec.  */
5414               validate_switches (p + 1);
5415         }
5416     }
5417
5418   /* look through the linked list of specs read from the specs file */
5419   for (spec = specs; spec ; spec = spec->next)
5420     {
5421       p = *(spec->ptr_spec);
5422       while ((c = *p++))
5423         if (c == '%' && *p == '{')
5424           /* We have a switch spec.  */
5425           validate_switches (p + 1);
5426     }
5427
5428   p = link_command_spec;
5429   while ((c = *p++))
5430     if (c == '%' && *p == '{')
5431       /* We have a switch spec.  */
5432       validate_switches (p + 1);
5433 }
5434
5435 /* Look at the switch-name that comes after START
5436    and mark as valid all supplied switches that match it.  */
5437
5438 static void
5439 validate_switches (start)
5440      char *start;
5441 {
5442   register char *p = start;
5443   char *filter;
5444   register int i;
5445   int suffix = 0;
5446
5447   if (*p == '|')
5448     ++p;
5449
5450   if (*p == '!')
5451     ++p;
5452
5453   if (*p == '.')
5454     suffix = 1, ++p;
5455
5456   filter = p;
5457   while (*p != ':' && *p != '}') p++;
5458
5459   if (suffix)
5460     ;
5461   else if (p[-1] == '*')
5462     {
5463       /* Mark all matching switches as valid.  */
5464       --p;
5465       for (i = 0; i < n_switches; i++)
5466         if (!strncmp (switches[i].part1, filter, p - filter))
5467           switches[i].valid = 1;
5468     }
5469   else
5470     {
5471       /* Mark an exact matching switch as valid.  */
5472       for (i = 0; i < n_switches; i++)
5473         {
5474           if (!strncmp (switches[i].part1, filter, p - filter)
5475               && switches[i].part1[p - filter] == 0)
5476             switches[i].valid = 1;
5477         }
5478     }
5479 }
5480 \f
5481 /* Check whether a particular argument was used.  The first time we
5482    canonicalize the switches to keep only the ones we care about.  */
5483
5484 static int
5485 used_arg (p, len)
5486      char *p;
5487      int len;
5488 {
5489   struct mswitchstr {
5490     char *str;
5491     char *replace;
5492     int len;
5493     int rep_len;
5494   };
5495
5496   static struct mswitchstr *mswitches;
5497   static int n_mswitches;
5498   int i, j;
5499
5500   if (!mswitches)
5501     {
5502       struct mswitchstr *matches;
5503       char *q;
5504       int cnt = 0;
5505
5506       /* Break multilib_matches into the component strings of string and replacement
5507          string */
5508       for (q = multilib_matches; *q != '\0'; q++)
5509         if (*q == ';')
5510           cnt++;
5511
5512       matches = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
5513       i = 0;
5514       q = multilib_matches;
5515       while (*q != '\0')
5516         {
5517           matches[i].str = q;
5518           while (*q != ' ')
5519             {
5520               if (*q == '\0')
5521                 abort ();
5522               q++;
5523             }
5524           *q = '\0';
5525           matches[i].len = q - matches[i].str;
5526
5527           matches[i].replace = ++q;
5528           while (*q != ';' && *q != '\0')
5529             {
5530               if (*q == ' ')
5531                 abort ();
5532               q++;
5533             }
5534           matches[i].rep_len = q - matches[i].replace;
5535           i++;
5536           if (*q == ';')
5537             *q++ = '\0';
5538           else
5539             break;
5540         }
5541
5542       /* Now build a list of the replacement string for switches that we care
5543          about.  Make sure we allocate at least one entry.  This prevents
5544          xmalloc from calling fatal, and prevents us from re-executing this
5545          block of code.  */
5546       mswitches
5547         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
5548                                          * (n_switches ? n_switches : 1));
5549       for (i = 0; i < n_switches; i++)
5550         {
5551           int xlen = strlen (switches[i].part1);
5552           for (j = 0; j < cnt; j++)
5553             if (xlen == matches[j].len && ! strcmp (switches[i].part1, matches[j].str))
5554               {
5555                 mswitches[n_mswitches].str = matches[j].replace;
5556                 mswitches[n_mswitches].len = matches[j].rep_len;
5557                 mswitches[n_mswitches].replace = (char *)0;
5558                 mswitches[n_mswitches].rep_len = 0;
5559                 n_mswitches++;
5560                 break;
5561               }
5562         }
5563     }
5564
5565   for (i = 0; i < n_mswitches; i++)
5566     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
5567       return 1;
5568
5569   return 0;
5570 }
5571
5572 static int
5573 default_arg (p, len)
5574      char *p;
5575      int len;
5576 {
5577   char *start, *end;
5578
5579   for (start = multilib_defaults; *start != '\0'; start = end+1)
5580     {
5581       while (*start == ' ' || *start == '\t')
5582         start++;
5583
5584       if (*start == '\0')
5585         break;
5586
5587       for (end = start+1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
5588         ;
5589
5590       if ((end - start) == len && strncmp (p, start, len) == 0)
5591         return 1;
5592
5593       if (*end == '\0')
5594         break;
5595     }
5596
5597   return 0;
5598 }
5599
5600 /* Work out the subdirectory to use based on the
5601    options.  The format of multilib_select is a list of elements.
5602    Each element is a subdirectory name followed by a list of options
5603    followed by a semicolon.  gcc will consider each line in turn.  If
5604    none of the options beginning with an exclamation point are
5605    present, and all of the other options are present, that
5606    subdirectory will be used.  */
5607
5608 static void
5609 set_multilib_dir ()
5610 {
5611   char *p = multilib_select;
5612   int this_path_len;
5613   char *this_path, *this_arg;
5614   int not_arg;
5615   int ok;
5616
5617   while (*p != '\0')
5618     {
5619       /* Ignore newlines.  */
5620       if (*p == '\n')
5621         {
5622           ++p;
5623           continue;
5624         }
5625
5626       /* Get the initial path.  */
5627       this_path = p;
5628       while (*p != ' ')
5629         {
5630           if (*p == '\0')
5631             abort ();
5632           ++p;
5633         }
5634       this_path_len = p - this_path;
5635
5636       /* Check the arguments.  */
5637       ok = 1;
5638       ++p;
5639       while (*p != ';')
5640         {
5641           if (*p == '\0')
5642             abort ();
5643
5644           if (! ok)
5645             {
5646               ++p;
5647               continue;
5648             }
5649
5650           this_arg = p;
5651           while (*p != ' ' && *p != ';')
5652             {
5653               if (*p == '\0')
5654                 abort ();
5655               ++p;
5656             }
5657
5658           if (*this_arg != '!')
5659             not_arg = 0;
5660           else
5661             {
5662               not_arg = 1;
5663               ++this_arg;
5664             }
5665
5666           /* If this is a default argument, we can just ignore it.
5667              This is true even if this_arg begins with '!'.  Beginning
5668              with '!' does not mean that this argument is necessarily
5669              inappropriate for this library: it merely means that
5670              there is a more specific library which uses this
5671              argument.  If this argument is a default, we need not
5672              consider that more specific library.  */
5673           if (! default_arg (this_arg, p - this_arg))
5674             {
5675               ok = used_arg (this_arg, p - this_arg);
5676               if (not_arg)
5677                 ok = ! ok;
5678             }
5679
5680           if (*p == ' ')
5681             ++p;
5682         }
5683
5684       if (ok)
5685         {
5686           if (this_path_len != 1
5687               || this_path[0] != '.')
5688             {
5689               multilib_dir = xmalloc (this_path_len + 1);
5690               strncpy (multilib_dir, this_path, this_path_len);
5691               multilib_dir[this_path_len] = '\0';
5692             }
5693           break;
5694         }
5695
5696       ++p;
5697     }      
5698 }
5699
5700 /* Print out the multiple library subdirectory selection
5701    information.  This prints out a series of lines.  Each line looks
5702    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
5703    required.  Only the desired options are printed out, the negative
5704    matches.  The options are print without a leading dash.  There are
5705    no spaces to make it easy to use the information in the shell.
5706    Each subdirectory is printed only once.  This assumes the ordering
5707    generated by the genmultilib script.  */
5708
5709 static void
5710 print_multilib_info ()
5711 {
5712   char *p = multilib_select;
5713   char *last_path = 0, *this_path;
5714   int skip;
5715   int last_path_len = 0;
5716
5717   while (*p != '\0')
5718     {
5719       /* Ignore newlines.  */
5720       if (*p == '\n')
5721         {
5722           ++p;
5723           continue;
5724         }
5725
5726       /* Get the initial path.  */
5727       this_path = p;
5728       while (*p != ' ')
5729         {
5730           if (*p == '\0')
5731             abort ();
5732           ++p;
5733         }
5734
5735       /* If this is a duplicate, skip it.  */
5736       skip = (last_path != 0 && p - this_path == last_path_len
5737               && ! strncmp (last_path, this_path, last_path_len));
5738
5739       last_path = this_path;
5740       last_path_len = p - this_path;
5741
5742       /* If this directory requires any default arguments, we can skip
5743          it.  We will already have printed a directory identical to
5744          this one which does not require that default argument.  */
5745       if (! skip)
5746         {
5747           char *q;
5748
5749           q = p + 1;
5750           while (*q != ';')
5751             {
5752               char *arg;
5753
5754               if (*q == '\0')
5755                 abort ();
5756
5757               if (*q == '!')
5758                 arg = NULL;
5759               else
5760                 arg = q;
5761
5762               while (*q != ' ' && *q != ';')
5763                 {
5764                   if (*q == '\0')
5765                     abort ();
5766                   ++q;
5767                 }
5768
5769               if (arg != NULL
5770                   && default_arg (arg, q - arg))
5771                 {
5772                   skip = 1;
5773                   break;
5774                 }
5775
5776               if (*q == ' ')
5777                 ++q;
5778             }
5779         }
5780
5781       if (! skip)
5782         {
5783           char *p1;
5784
5785           for (p1 = last_path; p1 < p; p1++)
5786             putchar (*p1);
5787           putchar (';');
5788         }
5789
5790       ++p;
5791       while (*p != ';')
5792         {
5793           int use_arg;
5794
5795           if (*p == '\0')
5796             abort ();
5797
5798           if (skip)
5799             {
5800               ++p;
5801               continue;
5802             }
5803
5804           use_arg = *p != '!';
5805
5806           if (use_arg)
5807             putchar ('@');
5808
5809           while (*p != ' ' && *p != ';')
5810             {
5811               if (*p == '\0')
5812                 abort ();
5813               if (use_arg)
5814                 putchar (*p);
5815               ++p;
5816             }
5817
5818           if (*p == ' ')
5819             ++p;
5820         }
5821
5822       if (! skip)
5823         {
5824           /* If there are extra options, print them now */
5825           if (multilib_extra && *multilib_extra)
5826             {
5827               int print_at = TRUE;
5828               char *q;
5829
5830               for (q = multilib_extra; *q != '\0'; q++)
5831                 {
5832                   if (*q == ' ')
5833                     print_at = TRUE;
5834                   else
5835                     {
5836                       if (print_at)
5837                         putchar ('@');
5838                       putchar (*q);
5839                       print_at = FALSE;
5840                     }
5841                 }
5842             }
5843           putchar ('\n');
5844         }
5845
5846       ++p;
5847     }
5848 }