OSDN Git Service

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