OSDN Git Service

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