OSDN Git Service

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