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