OSDN Git Service

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