OSDN Git Service

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