OSDN Git Service

Remove bogus patch.
[pf3gnuchains/gcc-fork.git] / gcc / gcc.c
1 /* Compiler driver program that can handle many languages.
2    Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
21
22 This paragraph is here to try to keep Sun CC from dying.
23 The number of chars here seems crucial!!!!  */
24
25 /* This program is the user interface to the C compiler and possibly to
26 other compilers.  It is used because compilation is a complicated procedure
27 which involves running several programs and passing temporary files between
28 them, forwarding the users switches to those programs selectively,
29 and deleting the temporary files at the end.
30
31 CC recognizes how to compile each input file by suffixes in the file names.
32 Once it knows which kind of compilation to perform, the procedure for
33 compilation is specified by a string called a "spec".  */
34
35 /* A Short Introduction to Adding a Command-Line Option.
36
37    Before adding a command-line option, consider if it is really
38    necessary.  Each additional command-line option adds complexity and
39    is difficult to remove in subsequent versions.
40
41    In the following, consider adding the command-line argument
42    `--bar'.
43
44    1. Each command-line option is specified in the specs file.  The
45    notation is described below in the comment entitled "The Specs
46    Language".  Read it.
47
48    2. In this file, add an entry to "option_map" equating the long
49    `--' argument version and any shorter, single letter version.  Read
50    the comments in the declaration of "struct option_map" for an
51    explanation.  Do not omit the first `-'.
52
53    3. Look in the "specs" file to determine which program or option
54    list should be given the argument, e.g., "cc1_options".  Add the
55    appropriate syntax for the shorter option version to the
56    corresponding "const char *" entry in this file.  Omit the first
57    `-' from the option.  For example, use `-bar', rather than `--bar'.
58
59    4. If the argument takes an argument, e.g., `--baz argument1',
60    modify either DEFAULT_SWITCH_TAKES_ARG or
61    DEFAULT_WORD_SWITCH_TAKES_ARG in this file.  Omit the first `-'
62    from `--baz'.
63
64    5. Document the option in this file's display_help().  If the
65    option is passed to a subprogram, modify its corresponding
66    function, e.g., cppinit.c:print_help() or toplev.c:display_help(),
67    instead.
68
69    6. Compile and test.  Make sure that your new specs file is being
70    read.  For example, use a debugger to investigate the value of
71    "specs_file" in main().  */
72
73 #include "config.h"
74 #include "system.h"
75 #include <signal.h>
76 #if ! defined( SIGCHLD ) && defined( SIGCLD )
77 #  define SIGCHLD SIGCLD
78 #endif
79 #include "obstack.h"
80 #include "intl.h"
81 #include "prefix.h"
82 #include "gcc.h"
83
84 #ifdef VMS
85 #define exit __posix_exit
86 #endif
87
88 #ifdef HAVE_SYS_RESOURCE_H
89 #include <sys/resource.h>
90 #endif
91 #if defined (HAVE_DECL_GETRUSAGE) && !HAVE_DECL_GETRUSAGE
92 extern int getrusage PARAMS ((int, struct rusage *));
93 #endif
94
95 /* By default there is no special suffix for target executables.  */
96 /* FIXME: when autoconf is fixed, remove the host check - dj */
97 #if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
98 #define HAVE_TARGET_EXECUTABLE_SUFFIX
99 #else
100 #define TARGET_EXECUTABLE_SUFFIX ""
101 #endif
102
103 /* By default there is no special suffix for host executables.  */
104 #ifdef HOST_EXECUTABLE_SUFFIX
105 #define HAVE_HOST_EXECUTABLE_SUFFIX
106 #else
107 #define HOST_EXECUTABLE_SUFFIX ""
108 #endif
109
110 /* By default, the suffix for target object files is ".o".  */
111 #ifdef TARGET_OBJECT_SUFFIX
112 #define HAVE_TARGET_OBJECT_SUFFIX
113 #else
114 #define TARGET_OBJECT_SUFFIX ".o"
115 #endif
116
117 #ifndef VMS
118 /* FIXME: the location independence code for VMS is hairier than this,
119    and hasn't been written.  */
120 #ifndef DIR_UP
121 #define DIR_UP ".."
122 #endif /* DIR_UP */
123 #endif /* VMS */
124
125 static char dir_separator_str[] = { DIR_SEPARATOR, 0 };
126
127 #define obstack_chunk_alloc xmalloc
128 #define obstack_chunk_free free
129
130 #ifndef GET_ENV_PATH_LIST
131 #define GET_ENV_PATH_LIST(VAR,NAME)     do { (VAR) = getenv (NAME); } while (0)
132 #endif
133
134 /* Most every one is fine with LIBRARY_PATH.  For some, it conflicts.  */
135 #ifndef LIBRARY_PATH_ENV
136 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
137 #endif
138
139 #ifndef HAVE_KILL
140 #define kill(p,s) raise(s)
141 #endif
142
143 /* If a stage of compilation returns an exit status >= 1,
144    compilation of that file ceases.  */
145
146 #define MIN_FATAL_STATUS 1
147
148 /* Flag saying to pass the greatest exit code returned by a sub-process
149    to the calling program.  */
150 static int pass_exit_codes;
151
152 /* Definition of string containing the arguments given to configure.  */
153 #include "configargs.h"
154
155 /* Flag saying to print the directories gcc will search through looking for
156    programs, libraries, etc.  */
157
158 static int print_search_dirs;
159
160 /* Flag saying to print the full filename of this file
161    as found through our usual search mechanism.  */
162
163 static const char *print_file_name = NULL;
164
165 /* As print_file_name, but search for executable file.  */
166
167 static const char *print_prog_name = NULL;
168
169 /* Flag saying to print the relative path we'd use to
170    find libgcc.a given the current compiler flags.  */
171
172 static int print_multi_directory;
173
174 /* Flag saying to print the list of subdirectories and
175    compiler flags used to select them in a standard form.  */
176
177 static int print_multi_lib;
178
179 /* Flag saying to print the command line options understood by gcc and its
180    sub-processes.  */
181
182 static int print_help_list;
183
184 /* Flag indicating whether we should print the command and arguments */
185
186 static int verbose_flag;
187
188 /* Flag indicating to print target specific command line options. */
189
190 static int target_help_flag;
191
192 /* Flag indicating whether we should report subprocess execution times
193    (if this is supported by the system - see pexecute.c).  */
194
195 static int report_times;
196
197 /* Nonzero means write "temp" files in source directory
198    and use the source file's name in them, and don't delete them.  */
199
200 static int save_temps_flag;
201
202 /* The compiler version.  */
203
204 static const char *compiler_version;
205
206 /* The target version specified with -V */
207
208 static const char *spec_version = DEFAULT_TARGET_VERSION;
209
210 /* The target machine specified with -b.  */
211
212 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
213
214 /* Nonzero if cross-compiling.
215    When -b is used, the value comes from the `specs' file.  */
216
217 #ifdef CROSS_COMPILE
218 static const char *cross_compile = "1";
219 #else
220 static const char *cross_compile = "0";
221 #endif
222
223 #ifdef MODIFY_TARGET_NAME
224
225 /* Information on how to alter the target name based on a command-line
226    switch.  The only case we support now is simply appending or deleting a
227    string to or from the end of the first part of the configuration name.  */
228
229 struct modify_target
230 {
231   const char *sw;
232   enum add_del {ADD, DELETE} add_del;
233   const char *str;
234 }
235 modify_target[] = MODIFY_TARGET_NAME;
236 #endif
237  
238 /* The number of errors that have occurred; the link phase will not be
239    run if this is non-zero.  */
240 static int error_count = 0;
241
242 /* Greatest exit code of sub-processes that has been encountered up to
243    now.  */
244 static int greatest_status = 1;
245
246 /* This is the obstack which we use to allocate many strings.  */
247
248 static struct obstack obstack;
249
250 /* This is the obstack to build an environment variable to pass to
251    collect2 that describes all of the relevant switches of what to
252    pass the compiler in building the list of pointers to constructors
253    and destructors.  */
254
255 static struct obstack collect_obstack;
256
257 /* These structs are used to collect resource usage information for
258    subprocesses.  */
259 #ifdef HAVE_GETRUSAGE
260 static struct rusage rus, prus;
261 #endif
262
263 /* Forward declaration for prototypes.  */
264 struct path_prefix;
265
266 static void init_spec           PARAMS ((void));
267 #ifndef VMS
268 static char **split_directories PARAMS ((const char *, int *));
269 static void free_split_directories PARAMS ((char **));
270 static char *make_relative_prefix PARAMS ((const char *, const char *, const char *));
271 #endif /* VMS */
272 static void store_arg           PARAMS ((const char *, int, int));
273 static char *load_specs         PARAMS ((const char *));
274 static void read_specs          PARAMS ((const char *, int));
275 static void set_spec            PARAMS ((const char *, const char *));
276 static struct compiler *lookup_compiler PARAMS ((const char *, size_t, const char *));
277 static char *build_search_list  PARAMS ((struct path_prefix *, const char *, int));
278 static void putenv_from_prefixes PARAMS ((struct path_prefix *, const char *));
279 static int access_check         PARAMS ((const char *, int));
280 static char *find_a_file        PARAMS ((struct path_prefix *, const char *, int));
281 static void add_prefix          PARAMS ((struct path_prefix *, const char *,
282                                          const char *, int, int, int *));
283 static void translate_options   PARAMS ((int *, const char *const **));
284 static char *skip_whitespace    PARAMS ((char *));
285 static void delete_if_ordinary  PARAMS ((const char *));
286 static void delete_temp_files   PARAMS ((void));
287 static void delete_failure_queue PARAMS ((void));
288 static void clear_failure_queue PARAMS ((void));
289 static int check_live_switch    PARAMS ((int, int));
290 static const char *handle_braces PARAMS ((const char *));
291 static char *save_string        PARAMS ((const char *, int));
292 static int do_spec_1            PARAMS ((const char *, int, const char *));
293 static const char *find_file    PARAMS ((const char *));
294 static int is_directory         PARAMS ((const char *, const char *, int));
295 static void validate_switches   PARAMS ((const char *));
296 static void validate_all_switches PARAMS ((void));
297 static void give_switch         PARAMS ((int, int, int));
298 static int used_arg             PARAMS ((const char *, int));
299 static int default_arg          PARAMS ((const char *, int));
300 static void set_multilib_dir    PARAMS ((void));
301 static void print_multilib_info PARAMS ((void));
302 static void perror_with_name    PARAMS ((const char *));
303 static void pfatal_pexecute     PARAMS ((const char *, const char *))
304   ATTRIBUTE_NORETURN;
305 static void notice              PARAMS ((const char *, ...))
306   ATTRIBUTE_PRINTF_1;
307 static void display_help        PARAMS ((void));
308 static void add_preprocessor_option     PARAMS ((const char *, int));
309 static void add_assembler_option        PARAMS ((const char *, int));
310 static void add_linker_option           PARAMS ((const char *, int));
311 static void process_command             PARAMS ((int, const char *const *));
312 static int execute                      PARAMS ((void));
313 static void clear_args                  PARAMS ((void));
314 static void fatal_error                 PARAMS ((int));
315 static void set_input                   PARAMS ((const char *));
316 static void init_gcc_specs              PARAMS ((struct obstack *,
317                                                  const char *,
318                                                  const char *));
319 \f
320 /* The Specs Language
321
322 Specs are strings containing lines, each of which (if not blank)
323 is made up of a program name, and arguments separated by spaces.
324 The program name must be exact and start from root, since no path
325 is searched and it is unreliable to depend on the current working directory.
326 Redirection of input or output is not supported; the subprograms must
327 accept filenames saying what files to read and write.
328
329 In addition, the specs can contain %-sequences to substitute variable text
330 or for conditional text.  Here is a table of all defined %-sequences.
331 Note that spaces are not generated automatically around the results of
332 expanding these sequences; therefore, you can concatenate them together
333 or with constant text in a single argument.
334
335  %%     substitute one % into the program name or argument.
336  %i     substitute the name of the input file being processed.
337  %b     substitute the basename of the input file being processed.
338         This is the substring up to (and not including) the last period
339         and not including the directory.
340  %B     same as %b, but include the file suffix (text after the last period).
341  %gSUFFIX
342         substitute a file name that has suffix SUFFIX and is chosen
343         once per compilation, and mark the argument a la %d.  To reduce
344         exposure to denial-of-service attacks, the file name is now
345         chosen in a way that is hard to predict even when previously
346         chosen file names are known.  For example, `%g.s ... %g.o ... %g.s'
347         might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'.  SUFFIX matches
348         the regexp "[.A-Za-z]*%O"; "%O" is treated exactly as if it
349         had been pre-processed.  Previously, %g was simply substituted
350         with a file name chosen once per compilation, without regard
351         to any appended suffix (which was therefore treated just like
352         ordinary text), making such attacks more likely to succeed.
353  %uSUFFIX
354         like %g, but generates a new temporary file name even if %uSUFFIX
355         was already seen.
356  %USUFFIX
357         substitutes the last file name generated with %uSUFFIX, generating a
358         new one if there is no such last file name.  In the absence of any
359         %uSUFFIX, this is just like %gSUFFIX, except they don't share
360         the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
361         would involve the generation of two distinct file names, one
362         for each `%g.s' and another for each `%U.s'.  Previously, %U was
363         simply substituted with a file name chosen for the previous %u,
364         without regard to any appended suffix.
365  %jSUFFIX
366         substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
367         writable, and if save-temps is off; otherwise, substitute the name
368         of a temporary file, just like %u.  This temporary file is not
369         meant for communication between processes, but rather as a junk
370         disposal mechanism.
371  %.SUFFIX
372         substitutes .SUFFIX for the suffixes of a matched switch's args when
373         it is subsequently output with %*. SUFFIX is terminated by the next
374         space or %.
375  %d     marks the argument containing or following the %d as a
376         temporary file name, so that that file will be deleted if CC exits
377         successfully.  Unlike %g, this contributes no text to the argument.
378  %w     marks the argument containing or following the %w as the
379         "output file" of this compilation.  This puts the argument
380         into the sequence of arguments that %o will substitute later.
381  %W{...}
382         like %{...} but mark last argument supplied within
383         as a file to be deleted on failure.
384  %o     substitutes the names of all the output files, with spaces
385         automatically placed around them.  You should write spaces
386         around the %o as well or the results are undefined.
387         %o is for use in the specs for running the linker.
388         Input files whose names have no recognized suffix are not compiled
389         at all, but they are included among the output files, so they will
390         be linked.
391  %O     substitutes the suffix for object files.  Note that this is
392         handled specially when it immediately follows %g, %u, or %U
393         (with or without a suffix argument) because of the need for
394         those to form complete file names.  The handling is such that
395         %O is treated exactly as if it had already been substituted,
396         except that %g, %u, and %U do not currently support additional
397         SUFFIX characters following %O as they would following, for
398         example, `.o'.
399  %p     substitutes the standard macro predefinitions for the
400         current target machine.  Use this when running cpp.
401  %P     like %p, but puts `__' before and after the name of each macro.
402         (Except macros that already have __.)
403         This is for ANSI C.
404  %I     Substitute a -iprefix option made from GCC_EXEC_PREFIX.
405  %s     current argument is the name of a library or startup file of some sort.
406         Search for that file in a standard list of directories
407         and substitute the full name found.
408  %eSTR  Print STR as an error message.  STR is terminated by a newline.
409         Use this when inconsistent options are detected.
410  %nSTR  Print STR as an notice.  STR is terminated by a newline.
411  %x{OPTION}     Accumulate an option for %X.
412  %X     Output the accumulated linker options specified by compilations.
413  %Y     Output the accumulated assembler options specified by compilations.
414  %Z     Output the accumulated preprocessor options specified by compilations.
415  %v1    Substitute the major version number of GCC.
416         (For version 2.5.3, this is 2.)
417  %v2    Substitute the minor version number of GCC.
418         (For version 2.5.3, this is 5.)
419  %v3    Substitute the patch level number of GCC.
420         (For version 2.5.3, this is 3.)
421  %a     process ASM_SPEC as a spec.
422         This allows config.h to specify part of the spec for running as.
423  %A     process ASM_FINAL_SPEC as a spec.  A capital A is actually
424         used here.  This can be used to run a post-processor after the
425         assembler has done its job.
426  %D     Dump out a -L option for each directory in startfile_prefixes.
427         If multilib_dir is set, extra entries are generated with it affixed.
428  %l     process LINK_SPEC as a spec.
429  %L     process LIB_SPEC as a spec.
430  %G     process LIBGCC_SPEC as a spec.
431  %M     output multilib_dir with directory separators replaced with "_";
432         if multilib_dir is not set or is ".", output "".
433  %S     process STARTFILE_SPEC as a spec.  A capital S is actually used here.
434  %E     process ENDFILE_SPEC as a spec.  A capital E is actually used here.
435  %c     process SIGNED_CHAR_SPEC as a spec.
436  %C     process CPP_SPEC as a spec.
437  %1     process CC1_SPEC as a spec.
438  %2     process CC1PLUS_SPEC as a spec.
439  %|     output "-" if the input for the current command is coming from a pipe.
440  %*     substitute the variable part of a matched option.  (See below.)
441         Note that each comma in the substituted string is replaced by
442         a single space.
443  %{S}   substitutes the -S switch, if that switch was given to CC.
444         If that switch was not specified, this substitutes nothing.
445         Here S is a metasyntactic variable.
446  %{S*}  substitutes all the switches specified to CC whose names start
447         with -S.  This is used for -o, -I, etc; switches that take
448         arguments.  CC considers `-o foo' as being one switch whose
449         name starts with `o'.  %{o*} would substitute this text,
450         including the space; thus, two arguments would be generated.
451  %{^S*} likewise, but don't put a blank between a switch and any args.
452  %{S*&T*} likewise, but preserve order of S and T options (the order
453         of S and T in the spec is not significant).  Can be any number
454         of ampersand-separated variables; for each the wild card is
455         optional.  Useful for CPP as %{D*&U*&A*}.
456  %{S*:X} substitutes X if one or more switches whose names start with -S are
457         specified to CC.  Note that the tail part of the -S option
458         (i.e. the part matched by the `*') will be substituted for each
459         occurrence of %* within X.
460  %{<S}  remove all occurences of -S from the command line.
461         Note - this option is position dependent.  % commands in the
462         spec string before this option will see -S, % commands in the
463         spec string after this option will not.
464  %{S:X} substitutes X, but only if the -S switch was given to CC.
465  %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
466  %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
467  %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
468  %{.S:X} substitutes X, but only if processing a file with suffix S.
469  %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
470  %{S|P:X} substitutes X if either -S or -P was given to CC.  This may be
471           combined with ! and . as above binding stronger than the OR.
472  %(Spec) processes a specification defined in a specs file as *Spec:
473  %[Spec] as above, but put __ around -D arguments
474
475 The conditional text X in a %{S:X} or %{!S:X} construct may contain
476 other nested % constructs or spaces, or even newlines.  They are
477 processed as usual, as described above.
478
479 The -O, -f, -m, and -W switches are handled specifically in these
480 constructs.  If another value of -O or the negated form of a -f, -m, or
481 -W switch is found later in the command line, the earlier switch
482 value is ignored, except with {S*} where S is just one letter; this
483 passes all matching options.
484
485 The character | at the beginning of the predicate text is used to indicate
486 that a command should be piped to the following command, but only if -pipe
487 is specified.
488
489 Note that it is built into CC which switches take arguments and which
490 do not.  You might think it would be useful to generalize this to
491 allow each compiler's spec to say which switches take arguments.  But
492 this cannot be done in a consistent fashion.  CC cannot even decide
493 which input files have been specified without knowing which switches
494 take arguments, and it must know which input files to compile in order
495 to tell which compilers to run.
496
497 CC also knows implicitly that arguments starting in `-l' are to be
498 treated as compiler output files, and passed to the linker in their
499 proper position among the other output files.  */
500 \f
501 /* Define the macros used for specs %a, %l, %L, %S, %c, %C, %1.  */
502
503 /* config.h can define ASM_SPEC to provide extra args to the assembler
504    or extra switch-translations.  */
505 #ifndef ASM_SPEC
506 #define ASM_SPEC ""
507 #endif
508
509 /* config.h can define ASM_FINAL_SPEC to run a post processor after
510    the assembler has run.  */
511 #ifndef ASM_FINAL_SPEC
512 #define ASM_FINAL_SPEC ""
513 #endif
514
515 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
516    or extra switch-translations.  */
517 #ifndef CPP_SPEC
518 #define CPP_SPEC ""
519 #endif
520
521 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
522    or extra switch-translations.  */
523 #ifndef CC1_SPEC
524 #define CC1_SPEC ""
525 #endif
526
527 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
528    or extra switch-translations.  */
529 #ifndef CC1PLUS_SPEC
530 #define CC1PLUS_SPEC ""
531 #endif
532
533 /* config.h can define LINK_SPEC to provide extra args to the linker
534    or extra switch-translations.  */
535 #ifndef LINK_SPEC
536 #define LINK_SPEC ""
537 #endif
538
539 /* config.h can define LIB_SPEC to override the default libraries.  */
540 #ifndef LIB_SPEC
541 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
542 #endif
543
544 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
545    included.  */
546 #ifndef LIBGCC_SPEC
547 #if defined(LINK_LIBGCC_SPECIAL) || defined(LINK_LIBGCC_SPECIAL_1)
548 /* Have gcc do the search for libgcc.a.  */
549 #define LIBGCC_SPEC "libgcc.a%s"
550 #else
551 #define LIBGCC_SPEC "-lgcc"
552 #endif
553 #endif
554
555 /* config.h can define STARTFILE_SPEC to override the default crt0 files.  */
556 #ifndef STARTFILE_SPEC
557 #define STARTFILE_SPEC  \
558   "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
559 #endif
560
561 /* config.h can define SWITCHES_NEED_SPACES to control which options
562    require spaces between the option and the argument.  */
563 #ifndef SWITCHES_NEED_SPACES
564 #define SWITCHES_NEED_SPACES ""
565 #endif
566
567 /* config.h can define ENDFILE_SPEC to override the default crtn files.  */
568 #ifndef ENDFILE_SPEC
569 #define ENDFILE_SPEC ""
570 #endif
571
572 /* This spec is used for telling cpp whether char is signed or not.  */
573 #ifndef SIGNED_CHAR_SPEC
574 /* Use #if rather than ?:
575    because MIPS C compiler rejects like ?: in initializers.  */
576 #if DEFAULT_SIGNED_CHAR
577 #define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
578 #else
579 #define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
580 #endif
581 #endif
582
583 #ifndef LINKER_NAME
584 #define LINKER_NAME "collect2"
585 #endif
586
587 /* Here is the spec for running the linker, after compiling all files.  */
588
589 /* -u* was put back because both BSD and SysV seem to support it.  */
590 /* %{static:} simply prevents an error message if the target machine
591    doesn't handle -static.  */
592 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
593    scripts which exist in user specified directories, or in standard
594    directories.  */
595 #ifndef LINK_COMMAND_SPEC
596 #define LINK_COMMAND_SPEC "\
597 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
598     %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t}\
599     %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
600     %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
601     %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
602 #endif
603
604 #ifndef LINK_LIBGCC_SPEC
605 # ifdef LINK_LIBGCC_SPECIAL
606 /* Don't generate -L options for startfile prefix list.  */
607 #  define LINK_LIBGCC_SPEC ""
608 # else
609 /* Do generate them.  */
610 #  define LINK_LIBGCC_SPEC "%D"
611 # endif
612 #endif
613
614 static const char *cpp_spec = CPP_SPEC;
615 static const char *cpp_predefines = CPP_PREDEFINES;
616 static const char *cc1_spec = CC1_SPEC;
617 static const char *cc1plus_spec = CC1PLUS_SPEC;
618 static const char *signed_char_spec = SIGNED_CHAR_SPEC;
619 static const char *asm_spec = ASM_SPEC;
620 static const char *asm_final_spec = ASM_FINAL_SPEC;
621 static const char *link_spec = LINK_SPEC;
622 static const char *lib_spec = LIB_SPEC;
623 static const char *libgcc_spec = LIBGCC_SPEC;
624 static const char *endfile_spec = ENDFILE_SPEC;
625 static const char *startfile_spec = STARTFILE_SPEC;
626 static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
627 static const char *linker_name_spec = LINKER_NAME;
628 static const char *link_command_spec = LINK_COMMAND_SPEC;
629 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
630
631 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
632    There should be no need to override these in target dependent files,
633    but we need to copy them to the specs file so that newer versions
634    of the GCC driver can correctly drive older tool chains with the
635    appropriate -B options.  */
636
637 static const char *trad_capable_cpp =
638 "%{traditional|ftraditional|traditional-cpp:trad}cpp0";
639
640 static const char *cpp_options =
641 "%{C:%{!E:%eGNU C does not support -C without using -E}}\
642  %{std*} %{nostdinc*}\
643  %{C} %{v} %{I*} %{P} %{$} %I\
644  %{MD:-M -MF %W{!o: %b.d}%W{o*:%.d%*}}\
645  %{MMD:-MM -MF %W{!o: %b.d}%W{o*:%.d%*}}\
646  %{M} %{MM} %W{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{M|MD|MM|MMD:%{o*:-MQ %*}}\
647  %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
648  %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
649  %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
650  %{fno-inline|O0|!O*:-D__NO_INLINE__} %{ffast-math:-D__FAST_MATH__}\
651  %{fshort-wchar:-U__WCHAR_TYPE__ -D__WCHAR_TYPE__=short\\ unsigned\\ int}\
652  %{ffreestanding:-D__STDC_HOSTED__=0} %{fno-hosted:-D__STDC_HOSTED__=0}\
653  %{!ffreestanding:%{!fno-hosted:-D__STDC_HOSTED__=1}}\
654  %{fshow-column} %{fno-show-column}\
655  %{fleading-underscore} %{fno-leading-underscore}\
656  %{fno-operator-names} %{ftabstop=*} %{remap}\
657  %{g3:-dD} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*&U*&A*} %{i*} %Z %i\
658  %{E:%{!M*:%W{o*}}}";
659
660 /* NB: This is shared amongst all front-ends.  */
661 static const char *cc1_options =
662 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
663  %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*}\
664  %{g*} %{O*} %{W*} %{w} %{pedantic*} %{std*} %{ansi}\
665  %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
666  %{Qn:-fno-ident} %{--help:--help}\
667  %{--target-help:--target-help}\
668  %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
669  %{fsyntax-only:-o %j} %{-param*}";
670
671 static const char *asm_options =
672 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
673
674 static const char *invoke_as =
675 "%{!S:-o %{|!pipe:%g.s} |\n as %(asm_options) %{!pipe:%g.s} %A }";
676
677 /* Some compilers have limits on line lengths, and the multilib_select
678    and/or multilib_matches strings can be very long, so we build them at
679    run time.  */
680 static struct obstack multilib_obstack;
681 static const char *multilib_select;
682 static const char *multilib_matches;
683 static const char *multilib_defaults;
684 static const char *multilib_exclusions;
685 #include "multilib.h"
686
687 /* Check whether a particular argument is a default argument.  */
688
689 #ifndef MULTILIB_DEFAULTS
690 #define MULTILIB_DEFAULTS { "" }
691 #endif
692
693 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
694
695 struct user_specs
696 {
697   struct user_specs *next;
698   const char *filename;
699 };
700
701 static struct user_specs *user_specs_head, *user_specs_tail;
702
703 /* This defines which switch letters take arguments.  */
704
705 #define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
706   ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
707    || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
708    || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x' \
709    || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V' \
710    || (CHAR) == 'B' || (CHAR) == 'b')
711
712 #ifndef SWITCH_TAKES_ARG
713 #define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
714 #endif
715
716 /* This defines which multi-letter switches take arguments.  */
717
718 #define DEFAULT_WORD_SWITCH_TAKES_ARG(STR)              \
719  (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext")      \
720   || !strcmp (STR, "Tbss") || !strcmp (STR, "include")  \
721   || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
722   || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
723   || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
724   || !strcmp (STR, "isystem") || !strcmp (STR, "-param") \
725   || !strcmp (STR, "specs") \
726   || !strcmp (STR, "MF") || !strcmp (STR, "MT") || !strcmp (STR, "MQ"))
727
728 #ifndef WORD_SWITCH_TAKES_ARG
729 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
730 #endif
731 \f
732 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
733 /* This defines which switches stop a full compilation.  */
734 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
735   ((CHAR) == 'c' || (CHAR) == 'S')
736
737 #ifndef SWITCH_CURTAILS_COMPILATION
738 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
739   DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
740 #endif
741 #endif
742
743 /* Record the mapping from file suffixes for compilation specs.  */
744
745 struct compiler
746 {
747   const char *suffix;           /* Use this compiler for input files
748                                    whose names end in this suffix.  */
749
750   const char *spec;             /* To use this compiler, run this spec.  */
751
752   const char *cpp_spec;         /* If non-NULL, substitute this spec
753                                    for `%C', rather than the usual
754                                    cpp_spec.  */
755 };
756
757 /* Pointer to a vector of `struct compiler' that gives the spec for
758    compiling a file, based on its suffix.
759    A file that does not end in any of these suffixes will be passed
760    unchanged to the loader and nothing else will be done to it.
761
762    An entry containing two 0s is used to terminate the vector.
763
764    If multiple entries match a file, the last matching one is used.  */
765
766 static struct compiler *compilers;
767
768 /* Number of entries in `compilers', not counting the null terminator.  */
769
770 static int n_compilers;
771
772 /* The default list of file name suffixes and their compilation specs.  */
773
774 static struct compiler default_compilers[] =
775 {
776   /* Add lists of suffixes of known languages here.  If those languages
777      were not present when we built the driver, we will hit these copies
778      and be given a more meaningful error than "file not used since
779      linking is not done".  */
780   {".m",  "#Objective-C", 0}, {".mi",  "#Objective-C", 0},
781   {".cc", "#C++", 0}, {".cxx", "#C++", 0}, {".cpp", "#C++", 0},
782   {".cp", "#C++", 0}, {".c++", "#C++", 0}, {".C", "#C++", 0},
783   {".ii", "#C++", 0},
784   {".ads", "#Ada", 0}, {".adb", "#Ada", 0}, {".ada", "#Ada", 0},
785   {".f", "#Fortran", 0}, {".for", "#Fortran", 0}, {".fpp", "#Fortran", 0},
786   {".F", "#Fortran", 0}, {".FOR", "#Fortran", 0}, {".FPP", "#Fortran", 0},
787   {".r", "#Ratfor", 0},
788   {".p", "#Pascal", 0}, {".pas", "#Pascal", 0},
789   {".ch", "#Chill", 0}, {".chi", "#Chill", 0},
790   {".java", "#Java", 0}, {".class", "#Java", 0},
791   {".zip", "#Java", 0}, {".jar", "#Java", 0},
792   /* Next come the entries for C.  */
793   {".c", "@c", 0},
794   {"@c",
795    /* cc1 has an integrated ISO C preprocessor.  We should invoke the
796       external preprocessor if -save-temps or -traditional is given.  */
797      "%{E|M|MM:%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)}\
798       %{!E:%{!M:%{!MM:\
799           %{save-temps:%(trad_capable_cpp) -lang-c %{ansi:-std=c89}\
800                 %(cpp_options) %b.i \n\
801                     cc1 -fpreprocessed %b.i %(cc1_options)}\
802           %{!save-temps:\
803             %{traditional|ftraditional|traditional-cpp:\
804                 tradcpp0 -lang-c %{ansi:-std=c89} %(cpp_options) %{!pipe:%g.i} |\n\
805                     cc1 -fpreprocessed %{!pipe:%g.i} %(cc1_options)}\
806             %{!traditional:%{!ftraditional:%{!traditional-cpp:\
807                 cc1 -lang-c %{ansi:-std=c89} %(cpp_options) %(cc1_options)}}}}\
808         %{!fsyntax-only:%(invoke_as)}}}}", 0},
809   {"-",
810    "%{!E:%e-E required when input is from standard input}\
811     %(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)", 0},
812   {".h", "@c-header", 0},
813   {"@c-header",
814    "%{!E:%eCompilation of header file requested} \
815     %(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options)", 0},
816   {".i", "@cpp-output", 0},
817   {"@cpp-output",
818    "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0},
819   {".s", "@assembler", 0},
820   {"@assembler",
821    "%{!M:%{!MM:%{!E:%{!S:as %(asm_options) %i %A }}}}", 0},
822   {".S", "@assembler-with-cpp", 0},
823   {"@assembler-with-cpp",
824    "%(trad_capable_cpp) -lang-asm %(cpp_options)\
825         %{!M:%{!MM:%{!E:%(invoke_as)}}}", 0},
826 #include "specs.h"
827   /* Mark end of table */
828   {0, 0, 0}
829 };
830
831 /* Number of elements in default_compilers, not counting the terminator.  */
832
833 static int n_default_compilers
834   = (sizeof default_compilers / sizeof (struct compiler)) - 1;
835
836 /* A vector of options to give to the linker.
837    These options are accumulated by %x,
838    and substituted into the linker command with %X.  */
839 static int n_linker_options;
840 static char **linker_options;
841
842 /* A vector of options to give to the assembler.
843    These options are accumulated by -Wa,
844    and substituted into the assembler command with %Y.  */
845 static int n_assembler_options;
846 static char **assembler_options;
847
848 /* A vector of options to give to the preprocessor.
849    These options are accumulated by -Wp,
850    and substituted into the preprocessor command with %Z.  */
851 static int n_preprocessor_options;
852 static char **preprocessor_options;
853 \f
854 /* Define how to map long options into short ones.  */
855
856 /* This structure describes one mapping.  */
857 struct option_map
858 {
859   /* The long option's name.  */
860   const char *name;
861   /* The equivalent short option.  */
862   const char *equivalent;
863   /* Argument info.  A string of flag chars; NULL equals no options.
864      a => argument required.
865      o => argument optional.
866      j => join argument to equivalent, making one word.
867      * => require other text after NAME as an argument.  */
868   const char *arg_info;
869 };
870
871 /* This is the table of mappings.  Mappings are tried sequentially
872    for each option encountered; the first one that matches, wins.  */
873
874 struct option_map option_map[] =
875  {
876    {"--all-warnings", "-Wall", 0},
877    {"--ansi", "-ansi", 0},
878    {"--assemble", "-S", 0},
879    {"--assert", "-A", "a"},
880    {"--classpath", "-fclasspath=", "aj"},
881    {"--CLASSPATH", "-fCLASSPATH=", "aj"},
882    {"--comments", "-C", 0},
883    {"--compile", "-c", 0},
884    {"--debug", "-g", "oj"},
885    {"--define-macro", "-D", "aj"},
886    {"--dependencies", "-M", 0},
887    {"--dump", "-d", "a"},
888    {"--dumpbase", "-dumpbase", "a"},
889    {"--entry", "-e", 0},
890    {"--extra-warnings", "-W", 0},
891    {"--for-assembler", "-Wa", "a"},
892    {"--for-linker", "-Xlinker", "a"},
893    {"--force-link", "-u", "a"},
894    {"--imacros", "-imacros", "a"},
895    {"--include", "-include", "a"},
896    {"--include-barrier", "-I-", 0},
897    {"--include-directory", "-I", "aj"},
898    {"--include-directory-after", "-idirafter", "a"},
899    {"--include-prefix", "-iprefix", "a"},
900    {"--include-with-prefix", "-iwithprefix", "a"},
901    {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
902    {"--include-with-prefix-after", "-iwithprefix", "a"},
903    {"--language", "-x", "a"},
904    {"--library-directory", "-L", "a"},
905    {"--machine", "-m", "aj"},
906    {"--machine-", "-m", "*j"},
907    {"--no-line-commands", "-P", 0},
908    {"--no-precompiled-includes", "-noprecomp", 0},
909    {"--no-standard-includes", "-nostdinc", 0},
910    {"--no-standard-libraries", "-nostdlib", 0},
911    {"--no-warnings", "-w", 0},
912    {"--optimize", "-O", "oj"},
913    {"--output", "-o", "a"},
914    {"--output-class-directory", "-foutput-class-dir=", "ja"},
915    {"--param", "--param", "a"},
916    {"--pedantic", "-pedantic", 0},
917    {"--pedantic-errors", "-pedantic-errors", 0},
918    {"--pipe", "-pipe", 0},
919    {"--prefix", "-B", "a"},
920    {"--preprocess", "-E", 0},
921    {"--print-search-dirs", "-print-search-dirs", 0},
922    {"--print-file-name", "-print-file-name=", "aj"},
923    {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
924    {"--print-missing-file-dependencies", "-MG", 0},
925    {"--print-multi-lib", "-print-multi-lib", 0},
926    {"--print-multi-directory", "-print-multi-directory", 0},
927    {"--print-prog-name", "-print-prog-name=", "aj"},
928    {"--profile", "-p", 0},
929    {"--profile-blocks", "-a", 0},
930    {"--quiet", "-q", 0},
931    {"--save-temps", "-save-temps", 0},
932    {"--shared", "-shared", 0},
933    {"--silent", "-q", 0},
934    {"--specs", "-specs=", "aj"},
935    {"--static", "-static", 0},
936    {"--std", "-std=", "aj"},
937    {"--symbolic", "-symbolic", 0},
938    {"--target", "-b", "a"},
939    {"--time", "-time", 0},
940    {"--trace-includes", "-H", 0},
941    {"--traditional", "-traditional", 0},
942    {"--traditional-cpp", "-traditional-cpp", 0},
943    {"--trigraphs", "-trigraphs", 0},
944    {"--undefine-macro", "-U", "aj"},
945    {"--use-version", "-V", "a"},
946    {"--user-dependencies", "-MM", 0},
947    {"--verbose", "-v", 0},
948    {"--version", "-dumpversion", 0},
949    {"--warn-", "-W", "*j"},
950    {"--write-dependencies", "-MD", 0},
951    {"--write-user-dependencies", "-MMD", 0},
952    {"--", "-f", "*j"}
953  };
954 \f
955
956 #ifdef TARGET_OPTION_TRANSLATE_TABLE
957 static struct {
958   const char *option_found;
959   const char *replacements;
960 } target_option_translations[] =
961 {
962   TARGET_OPTION_TRANSLATE_TABLE,
963   { 0, 0 }
964 };
965 #endif
966
967 /* Translate the options described by *ARGCP and *ARGVP.
968    Make a new vector and store it back in *ARGVP,
969    and store its length in *ARGVC.  */
970
971 static void
972 translate_options (argcp, argvp)
973      int *argcp;
974      const char *const **argvp;
975 {
976   int i;
977   int argc = *argcp;
978   const char *const *argv = *argvp;
979   int newvsize = (argc + 2) * 2 * sizeof (const char *);
980   const char **newv =
981     (const char **) xmalloc (newvsize);
982   int newindex = 0;
983
984   i = 0;
985   newv[newindex++] = argv[i++];
986
987   while (i < argc)
988     {
989 #ifdef TARGET_OPTION_TRANSLATE_TABLE
990       int tott_idx;
991
992       for (tott_idx = 0;
993            target_option_translations[tott_idx].option_found;
994            tott_idx++)
995         {
996           if (strcmp (target_option_translations[tott_idx].option_found,
997                       argv[i]) == 0)
998             {
999               int spaces = 1;
1000               const char *sp;
1001               char *np;
1002
1003               for (sp = target_option_translations[tott_idx].replacements;
1004                    *sp; sp++)
1005                 {
1006                   if (*sp == ' ')
1007                     spaces ++;
1008                 }
1009
1010               newvsize += spaces * sizeof (const char *);
1011               newv = (const char **) xrealloc (newv, newvsize);
1012
1013               sp = target_option_translations[tott_idx].replacements;
1014               np = (char *) xmalloc (strlen (sp) + 1);
1015               strcpy (np, sp);
1016
1017               while (1)
1018                 {
1019                   while (*np == ' ')
1020                     np++;
1021                   if (*np == 0)
1022                     break;
1023                   newv[newindex++] = np;
1024                   while (*np != ' ' && *np)
1025                     np++;
1026                   if (*np == 0)
1027                     break;
1028                   *np++ = 0;
1029                 }
1030
1031               i ++;
1032               break;
1033             }
1034         }
1035       if (target_option_translations[tott_idx].option_found)
1036         continue;
1037 #endif
1038
1039       /* Translate -- options.  */
1040       if (argv[i][0] == '-' && argv[i][1] == '-')
1041         {
1042           size_t j;
1043           /* Find a mapping that applies to this option.  */
1044           for (j = 0; j < ARRAY_SIZE (option_map); j++)
1045             {
1046               size_t optlen = strlen (option_map[j].name);
1047               size_t arglen = strlen (argv[i]);
1048               size_t complen = arglen > optlen ? optlen : arglen;
1049               const char *arginfo = option_map[j].arg_info;
1050
1051               if (arginfo == 0)
1052                 arginfo = "";
1053
1054               if (!strncmp (argv[i], option_map[j].name, complen))
1055                 {
1056                   const char *arg = 0;
1057
1058                   if (arglen < optlen)
1059                     {
1060                       size_t k;
1061                       for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1062                         if (strlen (option_map[k].name) >= arglen
1063                             && !strncmp (argv[i], option_map[k].name, arglen))
1064                           {
1065                             error ("Ambiguous abbreviation %s", argv[i]);
1066                             break;
1067                           }
1068
1069                       if (k != ARRAY_SIZE (option_map))
1070                         break;
1071                     }
1072
1073                   if (arglen > optlen)
1074                     {
1075                       /* If the option has an argument, accept that.  */
1076                       if (argv[i][optlen] == '=')
1077                         arg = argv[i] + optlen + 1;
1078
1079                       /* If this mapping requires extra text at end of name,
1080                          accept that as "argument".  */
1081                       else if (strchr (arginfo, '*') != 0)
1082                         arg = argv[i] + optlen;
1083
1084                       /* Otherwise, extra text at end means mismatch.
1085                          Try other mappings.  */
1086                       else
1087                         continue;
1088                     }
1089
1090                   else if (strchr (arginfo, '*') != 0)
1091                     {
1092                       error ("Incomplete `%s' option", option_map[j].name);
1093                       break;
1094                     }
1095
1096                   /* Handle arguments.  */
1097                   if (strchr (arginfo, 'a') != 0)
1098                     {
1099                       if (arg == 0)
1100                         {
1101                           if (i + 1 == argc)
1102                             {
1103                               error ("Missing argument to `%s' option",
1104                                      option_map[j].name);
1105                               break;
1106                             }
1107
1108                           arg = argv[++i];
1109                         }
1110                     }
1111                   else if (strchr (arginfo, '*') != 0)
1112                     ;
1113                   else if (strchr (arginfo, 'o') == 0)
1114                     {
1115                       if (arg != 0)
1116                         error ("Extraneous argument to `%s' option",
1117                                option_map[j].name);
1118                       arg = 0;
1119                     }
1120
1121                   /* Store the translation as one argv elt or as two.  */
1122                   if (arg != 0 && strchr (arginfo, 'j') != 0)
1123                     newv[newindex++] = concat (option_map[j].equivalent, arg,
1124                                                NULL);
1125                   else if (arg != 0)
1126                     {
1127                       newv[newindex++] = option_map[j].equivalent;
1128                       newv[newindex++] = arg;
1129                     }
1130                   else
1131                     newv[newindex++] = option_map[j].equivalent;
1132
1133                   break;
1134                 }
1135             }
1136           i++;
1137         }
1138
1139       /* Handle old-fashioned options--just copy them through,
1140          with their arguments.  */
1141       else if (argv[i][0] == '-')
1142         {
1143           const char *p = argv[i] + 1;
1144           int c = *p;
1145           int nskip = 1;
1146
1147           if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1148             nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1149           else if (WORD_SWITCH_TAKES_ARG (p))
1150             nskip += WORD_SWITCH_TAKES_ARG (p);
1151           else if ((c == 'B' || c == 'b' || c == 'V' || c == 'x')
1152                    && p[1] == 0)
1153             nskip += 1;
1154           else if (! strcmp (p, "Xlinker"))
1155             nskip += 1;
1156
1157           /* Watch out for an option at the end of the command line that
1158              is missing arguments, and avoid skipping past the end of the
1159              command line.  */
1160           if (nskip + i > argc)
1161             nskip = argc - i;
1162
1163           while (nskip > 0)
1164             {
1165               newv[newindex++] = argv[i++];
1166               nskip--;
1167             }
1168         }
1169       else
1170         /* Ordinary operands, or +e options.  */
1171         newv[newindex++] = argv[i++];
1172     }
1173
1174   newv[newindex] = 0;
1175
1176   *argvp = newv;
1177   *argcp = newindex;
1178 }
1179 \f
1180 static char *
1181 skip_whitespace (p)
1182      char *p;
1183 {
1184   while (1)
1185     {
1186       /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1187          be considered whitespace.  */
1188       if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1189         return p + 1;
1190       else if (*p == '\n' || *p == ' ' || *p == '\t')
1191         p++;
1192       else if (*p == '#')
1193         {
1194           while (*p != '\n')
1195             p++;
1196           p++;
1197         }
1198       else
1199         break;
1200     }
1201
1202   return p;
1203 }
1204 /* Structures to keep track of prefixes to try when looking for files.  */
1205
1206 struct prefix_list
1207 {
1208   char *prefix;               /* String to prepend to the path.  */
1209   struct prefix_list *next;   /* Next in linked list.  */
1210   int require_machine_suffix; /* Don't use without machine_suffix.  */
1211   /* 2 means try both machine_suffix and just_machine_suffix.  */
1212   int *used_flag_ptr;         /* 1 if a file was found with this prefix.  */
1213   int priority;               /* Sort key - priority within list */
1214 };
1215
1216 struct path_prefix
1217 {
1218   struct prefix_list *plist;  /* List of prefixes to try */
1219   int max_len;                /* Max length of a prefix in PLIST */
1220   const char *name;           /* Name of this list (used in config stuff) */
1221 };
1222
1223 /* List of prefixes to try when looking for executables.  */
1224
1225 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1226
1227 /* List of prefixes to try when looking for startup (crt0) files.  */
1228
1229 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1230
1231 /* List of prefixes to try when looking for include files.  */
1232
1233 static struct path_prefix include_prefixes = { 0, 0, "include" };
1234
1235 /* Suffix to attach to directories searched for commands.
1236    This looks like `MACHINE/VERSION/'.  */
1237
1238 static const char *machine_suffix = 0;
1239
1240 /* Suffix to attach to directories searched for commands.
1241    This is just `MACHINE/'.  */
1242
1243 static const char *just_machine_suffix = 0;
1244
1245 /* Adjusted value of GCC_EXEC_PREFIX envvar.  */
1246
1247 static const char *gcc_exec_prefix;
1248
1249 /* Default prefixes to attach to command names.  */
1250
1251 #ifdef CROSS_COMPILE  /* Don't use these prefixes for a cross compiler.  */
1252 #undef MD_EXEC_PREFIX
1253 #undef MD_STARTFILE_PREFIX
1254 #undef MD_STARTFILE_PREFIX_1
1255 #endif
1256
1257 /* If no prefixes defined, use the null string, which will disable them.  */
1258 #ifndef MD_EXEC_PREFIX
1259 #define MD_EXEC_PREFIX ""
1260 #endif
1261 #ifndef MD_STARTFILE_PREFIX
1262 #define MD_STARTFILE_PREFIX ""
1263 #endif
1264 #ifndef MD_STARTFILE_PREFIX_1
1265 #define MD_STARTFILE_PREFIX_1 ""
1266 #endif
1267
1268 /* Supply defaults for the standard prefixes.  */
1269
1270 #ifndef STANDARD_EXEC_PREFIX
1271 #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
1272 #endif
1273 #ifndef STANDARD_STARTFILE_PREFIX
1274 #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
1275 #endif
1276 #ifndef TOOLDIR_BASE_PREFIX
1277 #define TOOLDIR_BASE_PREFIX "/usr/local/"
1278 #endif
1279 #ifndef STANDARD_BINDIR_PREFIX
1280 #define STANDARD_BINDIR_PREFIX "/usr/local/bin"
1281 #endif
1282
1283 static const char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
1284 static const char *standard_exec_prefix_1 = "/usr/lib/gcc/";
1285 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1286
1287 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1288 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1289 static const char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1290 static const char *standard_startfile_prefix_1 = "/lib/";
1291 static const char *standard_startfile_prefix_2 = "/usr/lib/";
1292
1293 static const char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1294 static const char *tooldir_prefix;
1295
1296 static const char *standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1297
1298 /* Subdirectory to use for locating libraries.  Set by
1299    set_multilib_dir based on the compilation options.  */
1300
1301 static const char *multilib_dir;
1302 \f
1303 /* Structure to keep track of the specs that have been defined so far.
1304    These are accessed using %(specname) or %[specname] in a compiler
1305    or link spec.  */
1306
1307 struct spec_list
1308 {
1309                                 /* The following 2 fields must be first */
1310                                 /* to allow EXTRA_SPECS to be initialized */
1311   const char *name;             /* name of the spec.  */
1312   const char *ptr;              /* available ptr if no static pointer */
1313
1314                                 /* The following fields are not initialized */
1315                                 /* by EXTRA_SPECS */
1316   const char **ptr_spec;        /* pointer to the spec itself.  */
1317   struct spec_list *next;       /* Next spec in linked list.  */
1318   int name_len;                 /* length of the name */
1319   int alloc_p;                  /* whether string was allocated */
1320 };
1321
1322 #define INIT_STATIC_SPEC(NAME,PTR) \
1323 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1324
1325 /* List of statically defined specs.  */
1326 static struct spec_list static_specs[] =
1327 {
1328   INIT_STATIC_SPEC ("asm",                      &asm_spec),
1329   INIT_STATIC_SPEC ("asm_final",                &asm_final_spec),
1330   INIT_STATIC_SPEC ("asm_options",              &asm_options),
1331   INIT_STATIC_SPEC ("invoke_as",                &invoke_as),
1332   INIT_STATIC_SPEC ("cpp",                      &cpp_spec),
1333   INIT_STATIC_SPEC ("cpp_options",              &cpp_options),
1334   INIT_STATIC_SPEC ("trad_capable_cpp",         &trad_capable_cpp),
1335   INIT_STATIC_SPEC ("cc1",                      &cc1_spec),
1336   INIT_STATIC_SPEC ("cc1_options",              &cc1_options),
1337   INIT_STATIC_SPEC ("cc1plus",                  &cc1plus_spec),
1338   INIT_STATIC_SPEC ("endfile",                  &endfile_spec),
1339   INIT_STATIC_SPEC ("link",                     &link_spec),
1340   INIT_STATIC_SPEC ("lib",                      &lib_spec),
1341   INIT_STATIC_SPEC ("libgcc",                   &libgcc_spec),
1342   INIT_STATIC_SPEC ("startfile",                &startfile_spec),
1343   INIT_STATIC_SPEC ("switches_need_spaces",     &switches_need_spaces),
1344   INIT_STATIC_SPEC ("signed_char",              &signed_char_spec),
1345   INIT_STATIC_SPEC ("predefines",               &cpp_predefines),
1346   INIT_STATIC_SPEC ("cross_compile",            &cross_compile),
1347   INIT_STATIC_SPEC ("version",                  &compiler_version),
1348   INIT_STATIC_SPEC ("multilib",                 &multilib_select),
1349   INIT_STATIC_SPEC ("multilib_defaults",        &multilib_defaults),
1350   INIT_STATIC_SPEC ("multilib_extra",           &multilib_extra),
1351   INIT_STATIC_SPEC ("multilib_matches",         &multilib_matches),
1352   INIT_STATIC_SPEC ("multilib_exclusions",      &multilib_exclusions),
1353   INIT_STATIC_SPEC ("linker",                   &linker_name_spec),
1354   INIT_STATIC_SPEC ("link_libgcc",              &link_libgcc_spec),
1355   INIT_STATIC_SPEC ("md_exec_prefix",           &md_exec_prefix),
1356   INIT_STATIC_SPEC ("md_startfile_prefix",      &md_startfile_prefix),
1357   INIT_STATIC_SPEC ("md_startfile_prefix_1",    &md_startfile_prefix_1),
1358 };
1359
1360 #ifdef EXTRA_SPECS              /* additional specs needed */
1361 /* Structure to keep track of just the first two args of a spec_list.
1362    That is all that the EXTRA_SPECS macro gives us.  */
1363 struct spec_list_1
1364 {
1365   const char *name;
1366   const char *ptr;
1367 };
1368
1369 static struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1370 static struct spec_list *extra_specs = (struct spec_list *) 0;
1371 #endif
1372
1373 /* List of dynamically allocates specs that have been defined so far.  */
1374
1375 static struct spec_list *specs = (struct spec_list *) 0;
1376 \f
1377 /* Add appropriate libgcc specs to OBSTACK, taking into account
1378    various permutations of -shared-libgcc, -shared, and such.  */
1379
1380 static void
1381 init_gcc_specs (obstack, shared_name, static_name)
1382      struct obstack *obstack;
1383      const char *shared_name;
1384      const char *static_name;
1385 {
1386   char buffer[128];
1387
1388   /* If we see -shared-libgcc, then use the shared version.  */
1389   sprintf (buffer, "%%{shared-libgcc:%s %s}", shared_name, static_name);
1390   obstack_grow (obstack, buffer, strlen (buffer));
1391   /* If we see -static-libgcc, then use the static version.  */
1392   sprintf (buffer, "%%{static-libgcc:%s}", static_name);
1393   obstack_grow (obstack, buffer, strlen (buffer));
1394   /* Otherwise, if we see -shared, then use the shared version.  */
1395   sprintf (buffer,
1396            "%%{!shared-libgcc:%%{!static-libgcc:%%{shared:%s %s}}}", 
1397            shared_name, static_name);
1398   obstack_grow (obstack, buffer, strlen (buffer));
1399   /* Otherwise, use the static version.  */
1400   sprintf (buffer, 
1401            "%%{!shared-libgcc:%%{!static-libgcc:%%{!shared:%s}}}", 
1402            static_name);
1403   obstack_grow (obstack, buffer, strlen (buffer));
1404 }
1405
1406 /* Initialize the specs lookup routines.  */
1407
1408 static void
1409 init_spec ()
1410 {
1411   struct spec_list *next = (struct spec_list *) 0;
1412   struct spec_list *sl   = (struct spec_list *) 0;
1413   int i;
1414
1415   if (specs)
1416     return;                     /* Already initialized.  */
1417
1418   if (verbose_flag)
1419     notice ("Using builtin specs.\n");
1420
1421 #ifdef EXTRA_SPECS
1422   extra_specs = (struct spec_list *)
1423     xcalloc (sizeof (struct spec_list), ARRAY_SIZE (extra_specs_1));
1424
1425   for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1426     {
1427       sl = &extra_specs[i];
1428       sl->name = extra_specs_1[i].name;
1429       sl->ptr = extra_specs_1[i].ptr;
1430       sl->next = next;
1431       sl->name_len = strlen (sl->name);
1432       sl->ptr_spec = &sl->ptr;
1433       next = sl;
1434     }
1435 #endif
1436
1437   for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1438     {
1439       sl = &static_specs[i];
1440       sl->next = next;
1441       next = sl;
1442     }
1443
1444 #ifdef ENABLE_SHARED_LIBGCC
1445   /* ??? If neither -shared-libgcc nor --static-libgcc was
1446      seen, then we should be making an educated guess.  Some proposed
1447      heuristics for ELF include:
1448
1449         (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1450             program will be doing dynamic loading, which will likely
1451             need the shared libgcc.
1452
1453         (2) If "-ldl", then it's also a fair bet that we're doing
1454             dynamic loading.
1455
1456         (3) For each ET_DYN we're linking against (either through -lfoo
1457             or /some/path/foo.so), check to see whether it or one of
1458             its dependancies depends on a shared libgcc.
1459
1460         (4) If "-shared"
1461
1462             If the runtime is fixed to look for program headers instead
1463             of calling __register_frame_info at all, for each object,
1464             use the shared libgcc if any EH symbol referenced.
1465
1466             If crtstuff is fixed to not invoke __register_frame_info
1467             automatically, for each object, use the shared libgcc if
1468             any non-empty unwind section found.
1469
1470      Doing any of this probably requires invoking an external program to
1471      do the actual object file scanning.  */
1472   {
1473     const char *p = libgcc_spec;
1474     int in_sep = 1;
1475  
1476     /* Transform the extant libgcc_spec into one that uses the shared libgcc
1477        when given the proper command line arguments.  */
1478     while (*p)
1479       {
1480         if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1481           {
1482             init_gcc_specs (&obstack,
1483 #ifdef NO_SHARED_LIBGCC_MULTILIB
1484                             "-lgcc_s"
1485 #else
1486                             "-lgcc_s%M"
1487 #endif
1488                             ,
1489                             "-lgcc");
1490             p += 5;
1491             in_sep = 0;
1492           }
1493         else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1494           {
1495             /* Ug.  We don't know shared library extensions.  Hope that
1496                systems that use this form don't do shared libraries.  */
1497             init_gcc_specs (&obstack,
1498 #ifdef NO_SHARED_LIBGCC_MULTILIB
1499                             "-lgcc_s"
1500 #else
1501                             "-lgcc_s%M"
1502 #endif
1503                             ,
1504                             "libgcc.a%s");
1505             p += 10;
1506             in_sep = 0;
1507           }
1508         else
1509           {
1510             obstack_1grow (&obstack, *p);
1511             in_sep = (*p == ' ');
1512             p += 1;
1513           }
1514       }
1515
1516     obstack_1grow (&obstack, '\0');
1517     libgcc_spec = obstack_finish (&obstack);
1518   }
1519 #endif
1520 #ifdef USE_AS_TRADITIONAL_FORMAT
1521   /* Prepend "--traditional-format" to whatever asm_spec we had before.  */
1522   {
1523     static char tf[] = "--traditional-format ";
1524     obstack_grow (&obstack, tf, sizeof(tf) - 1);
1525     obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1526     asm_spec = obstack_finish (&obstack);
1527   }
1528 #endif
1529
1530   specs = sl;
1531 }
1532 \f
1533 /* Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
1534    removed; If the spec starts with a + then SPEC is added to the end of the
1535    current spec.  */
1536
1537 static void
1538 set_spec (name, spec)
1539      const char *name;
1540      const char *spec;
1541 {
1542   struct spec_list *sl;
1543   const char *old_spec;
1544   int name_len = strlen (name);
1545   int i;
1546
1547   /* If this is the first call, initialize the statically allocated specs.  */
1548   if (!specs)
1549     {
1550       struct spec_list *next = (struct spec_list *) 0;
1551       for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1552         {
1553           sl = &static_specs[i];
1554           sl->next = next;
1555           next = sl;
1556         }
1557       specs = sl;
1558     }
1559
1560   /* See if the spec already exists.  */
1561   for (sl = specs; sl; sl = sl->next)
1562     if (name_len == sl->name_len && !strcmp (sl->name, name))
1563       break;
1564
1565   if (!sl)
1566     {
1567       /* Not found - make it.  */
1568       sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
1569       sl->name = xstrdup (name);
1570       sl->name_len = name_len;
1571       sl->ptr_spec = &sl->ptr;
1572       sl->alloc_p = 0;
1573       *(sl->ptr_spec) = "";
1574       sl->next = specs;
1575       specs = sl;
1576     }
1577
1578   old_spec = *(sl->ptr_spec);
1579   *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1580                      ? concat (old_spec, spec + 1, NULL)
1581                      : xstrdup (spec));
1582
1583 #ifdef DEBUG_SPECS
1584   if (verbose_flag)
1585     notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1586 #endif
1587
1588   /* Free the old spec.  */
1589   if (old_spec && sl->alloc_p)
1590     free ((PTR) old_spec);
1591
1592   sl->alloc_p = 1;
1593 }
1594 \f
1595 /* Accumulate a command (program name and args), and run it.  */
1596
1597 /* Vector of pointers to arguments in the current line of specifications.  */
1598
1599 static const char **argbuf;
1600
1601 /* Number of elements allocated in argbuf.  */
1602
1603 static int argbuf_length;
1604
1605 /* Number of elements in argbuf currently in use (containing args).  */
1606
1607 static int argbuf_index;
1608
1609 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1610    temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
1611    it here.  */
1612
1613 static struct temp_name {
1614   const char *suffix;   /* suffix associated with the code.  */
1615   int length;           /* strlen (suffix).  */
1616   int unique;           /* Indicates whether %g or %u/%U was used.  */
1617   const char *filename; /* associated filename.  */
1618   int filename_length;  /* strlen (filename).  */
1619   struct temp_name *next;
1620 } *temp_names;
1621
1622 /* Number of commands executed so far.  */
1623
1624 static int execution_count;
1625
1626 /* Number of commands that exited with a signal.  */
1627
1628 static int signal_count;
1629
1630 /* Name with which this program was invoked.  */
1631
1632 static const char *programname;
1633 \f
1634 /* Clear out the vector of arguments (after a command is executed).  */
1635
1636 static void
1637 clear_args ()
1638 {
1639   argbuf_index = 0;
1640 }
1641
1642 /* Add one argument to the vector at the end.
1643    This is done when a space is seen or at the end of the line.
1644    If DELETE_ALWAYS is nonzero, the arg is a filename
1645     and the file should be deleted eventually.
1646    If DELETE_FAILURE is nonzero, the arg is a filename
1647     and the file should be deleted if this compilation fails.  */
1648
1649 static void
1650 store_arg (arg, delete_always, delete_failure)
1651      const char *arg;
1652      int delete_always, delete_failure;
1653 {
1654   if (argbuf_index + 1 == argbuf_length)
1655     argbuf
1656       = (const char **) xrealloc (argbuf,
1657                                   (argbuf_length *= 2) * sizeof (const char *));
1658
1659   argbuf[argbuf_index++] = arg;
1660   argbuf[argbuf_index] = 0;
1661
1662   if (delete_always || delete_failure)
1663     record_temp_file (arg, delete_always, delete_failure);
1664 }
1665 \f
1666 /* Load specs from a file name named FILENAME, replacing occurances of
1667    various different types of line-endings, \r\n, \n\r and just \r, with
1668    a single \n.  */
1669
1670 static char *
1671 load_specs (filename)
1672      const char *filename;
1673 {
1674   int desc;
1675   int readlen;
1676   struct stat statbuf;
1677   char *buffer;
1678   char *buffer_p;
1679   char *specs;
1680   char *specs_p;
1681
1682   if (verbose_flag)
1683     notice ("Reading specs from %s\n", filename);
1684
1685   /* Open and stat the file.  */
1686   desc = open (filename, O_RDONLY, 0);
1687   if (desc < 0)
1688     pfatal_with_name (filename);
1689   if (stat (filename, &statbuf) < 0)
1690     pfatal_with_name (filename);
1691
1692   /* Read contents of file into BUFFER.  */
1693   buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1694   readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1695   if (readlen < 0)
1696     pfatal_with_name (filename);
1697   buffer[readlen] = 0;
1698   close (desc);
1699
1700   specs = xmalloc (readlen + 1);
1701   specs_p = specs;
1702   for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1703     {
1704       int skip = 0;
1705       char c = *buffer_p;
1706       if (c == '\r')
1707         {
1708           if (buffer_p > buffer && *(buffer_p - 1) == '\n')     /* \n\r */
1709             skip = 1;
1710           else if (*(buffer_p + 1) == '\n')                     /* \r\n */
1711             skip = 1;
1712           else                                                  /* \r */
1713             c = '\n';
1714         }
1715       if (! skip)
1716         *specs_p++ = c;
1717     }
1718   *specs_p = '\0';
1719
1720   free (buffer);
1721   return (specs);
1722 }
1723
1724 /* Read compilation specs from a file named FILENAME,
1725    replacing the default ones.
1726
1727    A suffix which starts with `*' is a definition for
1728    one of the machine-specific sub-specs.  The "suffix" should be
1729    *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
1730    The corresponding spec is stored in asm_spec, etc.,
1731    rather than in the `compilers' vector.
1732
1733    Anything invalid in the file is a fatal error.  */
1734
1735 static void
1736 read_specs (filename, main_p)
1737      const char *filename;
1738      int main_p;
1739 {
1740   char *buffer;
1741   register char *p;
1742
1743   buffer = load_specs (filename);
1744
1745   /* Scan BUFFER for specs, putting them in the vector.  */
1746   p = buffer;
1747   while (1)
1748     {
1749       char *suffix;
1750       char *spec;
1751       char *in, *out, *p1, *p2, *p3;
1752
1753       /* Advance P in BUFFER to the next nonblank nocomment line.  */
1754       p = skip_whitespace (p);
1755       if (*p == 0)
1756         break;
1757
1758       /* Is this a special command that starts with '%'? */
1759       /* Don't allow this for the main specs file, since it would
1760          encourage people to overwrite it.  */
1761       if (*p == '%' && !main_p)
1762         {
1763           p1 = p;
1764           while (*p && *p != '\n')
1765             p++;
1766
1767           /* Skip '\n'.  */
1768           p++;
1769
1770           if (!strncmp (p1, "%include", sizeof ("%include") - 1)
1771               && (p1[sizeof "%include" - 1] == ' '
1772                   || p1[sizeof "%include" - 1] == '\t'))
1773             {
1774               char *new_filename;
1775
1776               p1 += sizeof ("%include");
1777               while (*p1 == ' ' || *p1 == '\t')
1778                 p1++;
1779
1780               if (*p1++ != '<' || p[-2] != '>')
1781                 fatal ("specs %%include syntax malformed after %ld characters",
1782                        (long) (p1 - buffer + 1));
1783
1784               p[-2] = '\0';
1785               new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1786               read_specs (new_filename ? new_filename : p1, FALSE);
1787               continue;
1788             }
1789           else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1790                    && (p1[sizeof "%include_noerr" - 1] == ' '
1791                        || p1[sizeof "%include_noerr" - 1] == '\t'))
1792             {
1793               char *new_filename;
1794
1795               p1 += sizeof "%include_noerr";
1796               while (*p1 == ' ' || *p1 == '\t')
1797                 p1++;
1798
1799               if (*p1++ != '<' || p[-2] != '>')
1800                 fatal ("specs %%include syntax malformed after %ld characters",
1801                        (long) (p1 - buffer + 1));
1802
1803               p[-2] = '\0';
1804               new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1805               if (new_filename)
1806                 read_specs (new_filename, FALSE);
1807               else if (verbose_flag)
1808                 notice ("Could not find specs file %s\n", p1);
1809               continue;
1810             }
1811           else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1812                    && (p1[sizeof "%rename" - 1] == ' '
1813                        || p1[sizeof "%rename" - 1] == '\t'))
1814             {
1815               int name_len;
1816               struct spec_list *sl;
1817
1818               /* Get original name */
1819               p1 += sizeof "%rename";
1820               while (*p1 == ' ' || *p1 == '\t')
1821                 p1++;
1822
1823               if (! ISALPHA ((unsigned char) *p1))
1824                 fatal ("specs %%rename syntax malformed after %ld characters",
1825                        (long) (p1 - buffer));
1826
1827               p2 = p1;
1828               while (*p2 && !ISSPACE ((unsigned char) *p2))
1829                 p2++;
1830
1831               if (*p2 != ' ' && *p2 != '\t')
1832                 fatal ("specs %%rename syntax malformed after %ld characters",
1833                        (long) (p2 - buffer));
1834
1835               name_len = p2 - p1;
1836               *p2++ = '\0';
1837               while (*p2 == ' ' || *p2 == '\t')
1838                 p2++;
1839
1840               if (! ISALPHA ((unsigned char) *p2))
1841                 fatal ("specs %%rename syntax malformed after %ld characters",
1842                        (long) (p2 - buffer));
1843
1844               /* Get new spec name.  */
1845               p3 = p2;
1846               while (*p3 && !ISSPACE ((unsigned char) *p3))
1847                 p3++;
1848
1849               if (p3 != p - 1)
1850                 fatal ("specs %%rename syntax malformed after %ld characters",
1851                        (long) (p3 - buffer));
1852               *p3 = '\0';
1853
1854               for (sl = specs; sl; sl = sl->next)
1855                 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1856                   break;
1857
1858               if (!sl)
1859                 fatal ("specs %s spec was not found to be renamed", p1);
1860
1861               if (strcmp (p1, p2) == 0)
1862                 continue;
1863
1864               if (verbose_flag)
1865                 {
1866                   notice ("rename spec %s to %s\n", p1, p2);
1867 #ifdef DEBUG_SPECS
1868                   notice ("spec is '%s'\n\n", *(sl->ptr_spec));
1869 #endif
1870                 }
1871
1872               set_spec (p2, *(sl->ptr_spec));
1873               if (sl->alloc_p)
1874                 free ((PTR) *(sl->ptr_spec));
1875
1876               *(sl->ptr_spec) = "";
1877               sl->alloc_p = 0;
1878               continue;
1879             }
1880           else
1881             fatal ("specs unknown %% command after %ld characters",
1882                    (long) (p1 - buffer));
1883         }
1884
1885       /* Find the colon that should end the suffix.  */
1886       p1 = p;
1887       while (*p1 && *p1 != ':' && *p1 != '\n')
1888         p1++;
1889
1890       /* The colon shouldn't be missing.  */
1891       if (*p1 != ':')
1892         fatal ("specs file malformed after %ld characters",
1893                (long) (p1 - buffer));
1894
1895       /* Skip back over trailing whitespace.  */
1896       p2 = p1;
1897       while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1898         p2--;
1899
1900       /* Copy the suffix to a string.  */
1901       suffix = save_string (p, p2 - p);
1902       /* Find the next line.  */
1903       p = skip_whitespace (p1 + 1);
1904       if (p[1] == 0)
1905         fatal ("specs file malformed after %ld characters",
1906                (long) (p - buffer));
1907
1908       p1 = p;
1909       /* Find next blank line or end of string.  */
1910       while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
1911         p1++;
1912
1913       /* Specs end at the blank line and do not include the newline.  */
1914       spec = save_string (p, p1 - p);
1915       p = p1;
1916
1917       /* Delete backslash-newline sequences from the spec.  */
1918       in = spec;
1919       out = spec;
1920       while (*in != 0)
1921         {
1922           if (in[0] == '\\' && in[1] == '\n')
1923             in += 2;
1924           else if (in[0] == '#')
1925             while (*in && *in != '\n')
1926               in++;
1927
1928           else
1929             *out++ = *in++;
1930         }
1931       *out = 0;
1932
1933       if (suffix[0] == '*')
1934         {
1935           if (! strcmp (suffix, "*link_command"))
1936             link_command_spec = spec;
1937           else
1938             set_spec (suffix + 1, spec);
1939         }
1940       else
1941         {
1942           /* Add this pair to the vector.  */
1943           compilers
1944             = ((struct compiler *)
1945                xrealloc (compilers,
1946                          (n_compilers + 2) * sizeof (struct compiler)));
1947
1948           compilers[n_compilers].suffix = suffix;
1949           compilers[n_compilers].spec = spec;
1950           n_compilers++;
1951           memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
1952         }
1953
1954       if (*suffix == 0)
1955         link_command_spec = spec;
1956     }
1957
1958   if (link_command_spec == 0)
1959     fatal ("spec file has no spec for linking");
1960 }
1961 \f
1962 /* Record the names of temporary files we tell compilers to write,
1963    and delete them at the end of the run.  */
1964
1965 /* This is the common prefix we use to make temp file names.
1966    It is chosen once for each run of this program.
1967    It is substituted into a spec by %g or %j.
1968    Thus, all temp file names contain this prefix.
1969    In practice, all temp file names start with this prefix.
1970
1971    This prefix comes from the envvar TMPDIR if it is defined;
1972    otherwise, from the P_tmpdir macro if that is defined;
1973    otherwise, in /usr/tmp or /tmp;
1974    or finally the current directory if all else fails.  */
1975
1976 static const char *temp_filename;
1977
1978 /* Length of the prefix.  */
1979
1980 static int temp_filename_length;
1981
1982 /* Define the list of temporary files to delete.  */
1983
1984 struct temp_file
1985 {
1986   const char *name;
1987   struct temp_file *next;
1988 };
1989
1990 /* Queue of files to delete on success or failure of compilation.  */
1991 static struct temp_file *always_delete_queue;
1992 /* Queue of files to delete on failure of compilation.  */
1993 static struct temp_file *failure_delete_queue;
1994
1995 /* Record FILENAME as a file to be deleted automatically.
1996    ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
1997    otherwise delete it in any case.
1998    FAIL_DELETE nonzero means delete it if a compilation step fails;
1999    otherwise delete it in any case.  */
2000
2001 void
2002 record_temp_file (filename, always_delete, fail_delete)
2003      const char *filename;
2004      int always_delete;
2005      int fail_delete;
2006 {
2007   register char *const name = xstrdup (filename);
2008
2009   if (always_delete)
2010     {
2011       register struct temp_file *temp;
2012       for (temp = always_delete_queue; temp; temp = temp->next)
2013         if (! strcmp (name, temp->name))
2014           goto already1;
2015
2016       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
2017       temp->next = always_delete_queue;
2018       temp->name = name;
2019       always_delete_queue = temp;
2020
2021     already1:;
2022     }
2023
2024   if (fail_delete)
2025     {
2026       register struct temp_file *temp;
2027       for (temp = failure_delete_queue; temp; temp = temp->next)
2028         if (! strcmp (name, temp->name))
2029           goto already2;
2030
2031       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
2032       temp->next = failure_delete_queue;
2033       temp->name = name;
2034       failure_delete_queue = temp;
2035
2036     already2:;
2037     }
2038 }
2039
2040 /* Delete all the temporary files whose names we previously recorded.  */
2041
2042 static void
2043 delete_if_ordinary (name)
2044      const char *name;
2045 {
2046   struct stat st;
2047 #ifdef DEBUG
2048   int i, c;
2049
2050   printf ("Delete %s? (y or n) ", name);
2051   fflush (stdout);
2052   i = getchar ();
2053   if (i != '\n')
2054     while ((c = getchar ()) != '\n' && c != EOF)
2055       ;
2056
2057   if (i == 'y' || i == 'Y')
2058 #endif /* DEBUG */
2059     if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
2060       if (unlink (name) < 0)
2061         if (verbose_flag)
2062           perror_with_name (name);
2063 }
2064
2065 static void
2066 delete_temp_files ()
2067 {
2068   register struct temp_file *temp;
2069
2070   for (temp = always_delete_queue; temp; temp = temp->next)
2071     delete_if_ordinary (temp->name);
2072   always_delete_queue = 0;
2073 }
2074
2075 /* Delete all the files to be deleted on error.  */
2076
2077 static void
2078 delete_failure_queue ()
2079 {
2080   register struct temp_file *temp;
2081
2082   for (temp = failure_delete_queue; temp; temp = temp->next)
2083     delete_if_ordinary (temp->name);
2084 }
2085
2086 static void
2087 clear_failure_queue ()
2088 {
2089   failure_delete_queue = 0;
2090 }
2091 \f
2092 /* Build a list of search directories from PATHS.
2093    PREFIX is a string to prepend to the list.
2094    If CHECK_DIR_P is non-zero we ensure the directory exists.
2095    This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2096    It is also used by the --print-search-dirs flag.  */
2097
2098 static char *
2099 build_search_list (paths, prefix, check_dir_p)
2100      struct path_prefix *paths;
2101      const char *prefix;
2102      int check_dir_p;
2103 {
2104   int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
2105   int just_suffix_len
2106     = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
2107   int first_time = TRUE;
2108   struct prefix_list *pprefix;
2109
2110   obstack_grow (&collect_obstack, prefix, strlen (prefix));
2111   obstack_1grow (&collect_obstack, '=');
2112
2113   for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
2114     {
2115       int len = strlen (pprefix->prefix);
2116
2117       if (machine_suffix
2118           && (! check_dir_p
2119               || is_directory (pprefix->prefix, machine_suffix, 0)))
2120         {
2121           if (!first_time)
2122             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2123
2124           first_time = FALSE;
2125           obstack_grow (&collect_obstack, pprefix->prefix, len);
2126           obstack_grow (&collect_obstack, machine_suffix, suffix_len);
2127         }
2128
2129       if (just_machine_suffix
2130           && pprefix->require_machine_suffix == 2
2131           && (! check_dir_p
2132               || is_directory (pprefix->prefix, just_machine_suffix, 0)))
2133         {
2134           if (! first_time)
2135             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2136
2137           first_time = FALSE;
2138           obstack_grow (&collect_obstack, pprefix->prefix, len);
2139           obstack_grow (&collect_obstack, just_machine_suffix,
2140                         just_suffix_len);
2141         }
2142
2143       if (! pprefix->require_machine_suffix)
2144         {
2145           if (! first_time)
2146             obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2147
2148           first_time = FALSE;
2149           obstack_grow (&collect_obstack, pprefix->prefix, len);
2150         }
2151     }
2152
2153   obstack_1grow (&collect_obstack, '\0');
2154   return obstack_finish (&collect_obstack);
2155 }
2156
2157 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2158    for collect.  */
2159
2160 static void
2161 putenv_from_prefixes (paths, env_var)
2162      struct path_prefix *paths;
2163      const char *env_var;
2164 {
2165   putenv (build_search_list (paths, env_var, 1));
2166 }
2167 \f
2168 #ifndef VMS
2169
2170 /* FIXME: the location independence code for VMS is hairier than this,
2171    and hasn't been written.  */
2172
2173 /* Split a filename into component directories.  */
2174
2175 static char **
2176 split_directories (name, ptr_num_dirs)
2177      const char *name;
2178      int *ptr_num_dirs;
2179 {
2180   int num_dirs = 0;
2181   char **dirs;
2182   const char *p, *q;
2183   int ch;
2184
2185   /* Count the number of directories.  Special case MSDOS disk names as part
2186      of the initial directory.  */
2187   p = name;
2188 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2189   if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2190     {
2191       p += 3;
2192       num_dirs++;
2193     }
2194 #endif /* HAVE_DOS_BASED_FILE_SYSTEM */
2195
2196   while ((ch = *p++) != '\0')
2197     {
2198       if (IS_DIR_SEPARATOR (ch))
2199         {
2200           num_dirs++;
2201           while (IS_DIR_SEPARATOR (*p))
2202             p++;
2203         }
2204     }
2205
2206   dirs = (char **) xmalloc (sizeof (char *) * (num_dirs + 2));
2207
2208   /* Now copy the directory parts.  */
2209   num_dirs = 0;
2210   p = name;
2211 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2212   if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2213     {
2214       dirs[num_dirs++] = save_string (p, 3);
2215       p += 3;
2216     }
2217 #endif /* HAVE_DOS_BASED_FILE_SYSTEM */
2218
2219   q = p;
2220   while ((ch = *p++) != '\0')
2221     {
2222       if (IS_DIR_SEPARATOR (ch))
2223         {
2224           while (IS_DIR_SEPARATOR (*p))
2225             p++;
2226
2227           dirs[num_dirs++] = save_string (q, p - q);
2228           q = p;
2229         }
2230     }
2231
2232   if (p - 1 - q > 0)
2233     dirs[num_dirs++] = save_string (q, p - 1 - q);
2234
2235   dirs[num_dirs] = NULL;
2236   if (ptr_num_dirs)
2237     *ptr_num_dirs = num_dirs;
2238
2239   return dirs;
2240 }
2241
2242 /* Release storage held by split directories.  */
2243
2244 static void
2245 free_split_directories (dirs)
2246      char **dirs;
2247 {
2248   int i = 0;
2249
2250   while (dirs[i] != NULL)
2251     free (dirs[i++]);
2252
2253   free ((char *) dirs);
2254 }
2255
2256 /* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets
2257    to PREFIX starting with the directory portion of PROGNAME and a relative
2258    pathname of the difference between BIN_PREFIX and PREFIX.
2259
2260    For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is
2261    /alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this
2262    function will return /red/green/blue/../omega.
2263
2264    If no relative prefix can be found, return NULL.  */
2265
2266 static char *
2267 make_relative_prefix (progname, bin_prefix, prefix)
2268      const char *progname;
2269      const char *bin_prefix;
2270      const char *prefix;
2271 {
2272   char **prog_dirs, **bin_dirs, **prefix_dirs;
2273   int prog_num, bin_num, prefix_num, std_loc_p;
2274   int i, n, common;
2275
2276   prog_dirs = split_directories (progname, &prog_num);
2277   bin_dirs = split_directories (bin_prefix, &bin_num);
2278
2279   /* If there is no full pathname, try to find the program by checking in each
2280      of the directories specified in the PATH environment variable.  */
2281   if (prog_num == 1)
2282     {
2283       char *temp;
2284
2285       GET_ENV_PATH_LIST (temp, "PATH");
2286       if (temp)
2287         {
2288           char *startp, *endp;
2289           char *nstore = (char *) alloca (strlen (temp) + strlen (progname) + 1);
2290
2291           startp = endp = temp;
2292           while (1)
2293             {
2294               if (*endp == PATH_SEPARATOR || *endp == 0)
2295                 {
2296                   if (endp == startp)
2297                     {
2298                       nstore[0] = '.';
2299                       nstore[1] = DIR_SEPARATOR;
2300                       nstore[2] = '\0';
2301                     }
2302                   else
2303                     {
2304                       strncpy (nstore, startp, endp - startp);
2305                       if (! IS_DIR_SEPARATOR (endp[-1]))
2306                         {
2307                           nstore[endp - startp] = DIR_SEPARATOR;
2308                           nstore[endp - startp + 1] = 0;
2309                         }
2310                       else
2311                         nstore[endp - startp] = 0;
2312                     }
2313                   strcat (nstore, progname);
2314                   if (! access (nstore, X_OK)
2315 #ifdef HAVE_HOST_EXECUTABLE_SUFFIX
2316                       || ! access (strcat (nstore, HOST_EXECUTABLE_SUFFIX), X_OK)
2317 #endif
2318                       )
2319                     {
2320                       free_split_directories (prog_dirs);
2321                       progname = nstore;
2322                       prog_dirs = split_directories (progname, &prog_num);
2323                       break;
2324                     }
2325
2326                   if (*endp == 0)
2327                     break;
2328                   endp = startp = endp + 1;
2329                 }
2330               else
2331                 endp++;
2332             }
2333         }
2334     }
2335
2336   /* Remove the program name from comparison of directory names.  */
2337   prog_num--;
2338
2339   /* Determine if the compiler is installed in the standard location, and if
2340      so, we don't need to specify relative directories.  Also, if argv[0]
2341      doesn't contain any directory specifiers, there is not much we can do.  */
2342   std_loc_p = 0;
2343   if (prog_num == bin_num)
2344     {
2345       for (i = 0; i < bin_num; i++)
2346         {
2347           if (strcmp (prog_dirs[i], bin_dirs[i]) != 0)
2348             break;
2349         }
2350
2351       if (prog_num <= 0 || i == bin_num)
2352         {
2353           std_loc_p = 1;
2354           free_split_directories (prog_dirs);
2355           free_split_directories (bin_dirs);
2356           prog_dirs = bin_dirs = (char **) 0;
2357           return NULL;
2358         }
2359     }
2360
2361   prefix_dirs = split_directories (prefix, &prefix_num);
2362
2363   /* Find how many directories are in common between bin_prefix & prefix.  */
2364   n = (prefix_num < bin_num) ? prefix_num : bin_num;
2365   for (common = 0; common < n; common++)
2366     {
2367       if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0)
2368         break;
2369     }
2370
2371   /* If there are no common directories, there can be no relative prefix.  */
2372   if (common == 0)
2373     {
2374       free_split_directories (prog_dirs);
2375       free_split_directories (bin_dirs);
2376       free_split_directories (prefix_dirs);
2377       return NULL;
2378     }
2379
2380   /* Build up the pathnames in argv[0].  */
2381   for (i = 0; i < prog_num; i++)
2382     obstack_grow (&obstack, prog_dirs[i], strlen (prog_dirs[i]));
2383
2384   /* Now build up the ..'s.  */
2385   for (i = common; i < n; i++)
2386     {
2387       obstack_grow (&obstack, DIR_UP, sizeof (DIR_UP) - 1);
2388       obstack_1grow (&obstack, DIR_SEPARATOR);
2389     }
2390
2391   /* Put in directories to move over to prefix.  */
2392   for (i = common; i < prefix_num; i++)
2393     obstack_grow (&obstack, prefix_dirs[i], strlen (prefix_dirs[i]));
2394
2395   free_split_directories (prog_dirs);
2396   free_split_directories (bin_dirs);
2397   free_split_directories (prefix_dirs);
2398
2399   obstack_1grow (&obstack, '\0');
2400   return obstack_finish (&obstack);
2401 }
2402 #endif /* VMS */
2403 \f
2404 /* Check whether NAME can be accessed in MODE.  This is like access,
2405    except that it never considers directories to be executable.  */
2406
2407 static int
2408 access_check (name, mode)
2409      const char *name;
2410      int mode;
2411 {
2412   if (mode == X_OK)
2413     {
2414       struct stat st;
2415
2416       if (stat (name, &st) < 0
2417           || S_ISDIR (st.st_mode))
2418         return -1;
2419     }
2420
2421   return access (name, mode);
2422 }
2423
2424 /* Search for NAME using the prefix list PREFIXES.  MODE is passed to
2425    access to check permissions.
2426    Return 0 if not found, otherwise return its name, allocated with malloc.  */
2427
2428 static char *
2429 find_a_file (pprefix, name, mode)
2430      struct path_prefix *pprefix;
2431      const char *name;
2432      int mode;
2433 {
2434   char *temp;
2435   const char *file_suffix = ((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "");
2436   struct prefix_list *pl;
2437   int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
2438
2439 #ifdef DEFAULT_ASSEMBLER
2440   if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2441     return xstrdup (DEFAULT_ASSEMBLER);
2442 #endif
2443
2444 #ifdef DEFAULT_LINKER
2445   if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2446     return xstrdup (DEFAULT_LINKER);
2447 #endif
2448
2449   if (machine_suffix)
2450     len += strlen (machine_suffix);
2451
2452   temp = xmalloc (len);
2453
2454   /* Determine the filename to execute (special case for absolute paths).  */
2455
2456   if (IS_ABSOLUTE_PATHNAME (name))
2457     {
2458       if (access (name, mode) == 0)
2459         {
2460           strcpy (temp, name);
2461           return temp;
2462         }
2463     }
2464   else
2465     for (pl = pprefix->plist; pl; pl = pl->next)
2466       {
2467         if (machine_suffix)
2468           {
2469             /* Some systems have a suffix for executable files.
2470                So try appending that first.  */
2471             if (file_suffix[0] != 0)
2472               {
2473                 strcpy (temp, pl->prefix);
2474                 strcat (temp, machine_suffix);
2475                 strcat (temp, name);
2476                 strcat (temp, file_suffix);
2477                 if (access_check (temp, mode) == 0)
2478                   {
2479                     if (pl->used_flag_ptr != 0)
2480                       *pl->used_flag_ptr = 1;
2481                     return temp;
2482                   }
2483               }
2484
2485             /* Now try just the name.  */
2486             strcpy (temp, pl->prefix);
2487             strcat (temp, machine_suffix);
2488             strcat (temp, name);
2489             if (access_check (temp, mode) == 0)
2490               {
2491                 if (pl->used_flag_ptr != 0)
2492                   *pl->used_flag_ptr = 1;
2493                 return temp;
2494               }
2495           }
2496
2497         /* Certain prefixes are tried with just the machine type,
2498            not the version.  This is used for finding as, ld, etc.  */
2499         if (just_machine_suffix && pl->require_machine_suffix == 2)
2500           {
2501             /* Some systems have a suffix for executable files.
2502                So try appending that first.  */
2503             if (file_suffix[0] != 0)
2504               {
2505                 strcpy (temp, pl->prefix);
2506                 strcat (temp, just_machine_suffix);
2507                 strcat (temp, name);
2508                 strcat (temp, file_suffix);
2509                 if (access_check (temp, mode) == 0)
2510                   {
2511                     if (pl->used_flag_ptr != 0)
2512                       *pl->used_flag_ptr = 1;
2513                     return temp;
2514                   }
2515               }
2516
2517             strcpy (temp, pl->prefix);
2518             strcat (temp, just_machine_suffix);
2519             strcat (temp, name);
2520             if (access_check (temp, mode) == 0)
2521               {
2522                 if (pl->used_flag_ptr != 0)
2523                   *pl->used_flag_ptr = 1;
2524                 return temp;
2525               }
2526           }
2527
2528         /* Certain prefixes can't be used without the machine suffix
2529            when the machine or version is explicitly specified.  */
2530         if (! pl->require_machine_suffix)
2531           {
2532             /* Some systems have a suffix for executable files.
2533                So try appending that first.  */
2534             if (file_suffix[0] != 0)
2535               {
2536                 strcpy (temp, pl->prefix);
2537                 strcat (temp, name);
2538                 strcat (temp, file_suffix);
2539                 if (access_check (temp, mode) == 0)
2540                   {
2541                     if (pl->used_flag_ptr != 0)
2542                       *pl->used_flag_ptr = 1;
2543                     return temp;
2544                   }
2545               }
2546
2547             strcpy (temp, pl->prefix);
2548             strcat (temp, name);
2549             if (access_check (temp, mode) == 0)
2550               {
2551                 if (pl->used_flag_ptr != 0)
2552                   *pl->used_flag_ptr = 1;
2553                 return temp;
2554               }
2555           }
2556       }
2557
2558   free (temp);
2559   return 0;
2560 }
2561
2562 /* Ranking of prefixes in the sort list. -B prefixes are put before
2563    all others.  */
2564
2565 enum path_prefix_priority
2566 {
2567   PREFIX_PRIORITY_B_OPT,
2568   PREFIX_PRIORITY_LAST
2569 };
2570
2571 /* Add an entry for PREFIX in PLIST.  The PLIST is kept in assending
2572    order according to PRIORITY.  Within each PRIORITY, new entries are
2573    appended.
2574
2575    If WARN is nonzero, we will warn if no file is found
2576    through this prefix.  WARN should point to an int
2577    which will be set to 1 if this entry is used.
2578
2579    COMPONENT is the value to be passed to update_path.
2580
2581    REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2582    the complete value of machine_suffix.
2583    2 means try both machine_suffix and just_machine_suffix.  */
2584
2585 static void
2586 add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn)
2587      struct path_prefix *pprefix;
2588      const char *prefix;
2589      const char *component;
2590      /* enum prefix_priority */ int priority;
2591      int require_machine_suffix;
2592      int *warn;
2593 {
2594   struct prefix_list *pl, **prev;
2595   int len;
2596
2597   for (prev = &pprefix->plist;
2598        (*prev) != NULL && (*prev)->priority <= priority;
2599        prev = &(*prev)->next)
2600     ;
2601
2602   /* Keep track of the longest prefix */
2603
2604   prefix = update_path (prefix, component);
2605   len = strlen (prefix);
2606   if (len > pprefix->max_len)
2607     pprefix->max_len = len;
2608
2609   pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
2610   pl->prefix = save_string (prefix, len);
2611   pl->require_machine_suffix = require_machine_suffix;
2612   pl->used_flag_ptr = warn;
2613   pl->priority = priority;
2614   if (warn)
2615     *warn = 0;
2616
2617   /* Insert after PREV */
2618   pl->next = (*prev);
2619   (*prev) = pl;
2620 }
2621 \f
2622 /* Execute the command specified by the arguments on the current line of spec.
2623    When using pipes, this includes several piped-together commands
2624    with `|' between them.
2625
2626    Return 0 if successful, -1 if failed.  */
2627
2628 static int
2629 execute ()
2630 {
2631   int i;
2632   int n_commands;               /* # of command.  */
2633   char *string;
2634   struct command
2635   {
2636     const char *prog;           /* program name.  */
2637     const char **argv;          /* vector of args.  */
2638     int pid;                    /* pid of process for this command.  */
2639   };
2640
2641   struct command *commands;     /* each command buffer with above info.  */
2642
2643   /* Count # of piped commands.  */
2644   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2645     if (strcmp (argbuf[i], "|") == 0)
2646       n_commands++;
2647
2648   /* Get storage for each command.  */
2649   commands = (struct command *) alloca (n_commands * sizeof (struct command));
2650
2651   /* Split argbuf into its separate piped processes,
2652      and record info about each one.
2653      Also search for the programs that are to be run.  */
2654
2655   commands[0].prog = argbuf[0]; /* first command.  */
2656   commands[0].argv = &argbuf[0];
2657   string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
2658
2659   if (string)
2660     commands[0].argv[0] = string;
2661
2662   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2663     if (strcmp (argbuf[i], "|") == 0)
2664       {                         /* each command.  */
2665 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2666         fatal ("-pipe not supported");
2667 #endif
2668         argbuf[i] = 0;  /* termination of command args.  */
2669         commands[n_commands].prog = argbuf[i + 1];
2670         commands[n_commands].argv = &argbuf[i + 1];
2671         string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
2672         if (string)
2673           commands[n_commands].argv[0] = string;
2674         n_commands++;
2675       }
2676
2677   argbuf[argbuf_index] = 0;
2678
2679   /* If -v, print what we are about to do, and maybe query.  */
2680
2681   if (verbose_flag)
2682     {
2683       /* For help listings, put a blank line between sub-processes.  */
2684       if (print_help_list)
2685         fputc ('\n', stderr);
2686
2687       /* Print each piped command as a separate line.  */
2688       for (i = 0; i < n_commands; i++)
2689         {
2690           const char *const *j;
2691
2692           for (j = commands[i].argv; *j; j++)
2693             fprintf (stderr, " %s", *j);
2694
2695           /* Print a pipe symbol after all but the last command.  */
2696           if (i + 1 != n_commands)
2697             fprintf (stderr, " |");
2698           fprintf (stderr, "\n");
2699         }
2700       fflush (stderr);
2701 #ifdef DEBUG
2702       notice ("\nGo ahead? (y or n) ");
2703       fflush (stderr);
2704       i = getchar ();
2705       if (i != '\n')
2706         while (getchar () != '\n')
2707           ;
2708
2709       if (i != 'y' && i != 'Y')
2710         return 0;
2711 #endif /* DEBUG */
2712     }
2713
2714   /* Run each piped subprocess.  */
2715
2716   for (i = 0; i < n_commands; i++)
2717     {
2718       char *errmsg_fmt, *errmsg_arg;
2719       const char *string = commands[i].argv[0];
2720
2721       /* For some bizarre reason, the second argument of execvp() is
2722          char *const *, not const char *const *.  */
2723       commands[i].pid = pexecute (string, (char *const *) commands[i].argv,
2724                                   programname, temp_filename,
2725                                   &errmsg_fmt, &errmsg_arg,
2726                                   ((i == 0 ? PEXECUTE_FIRST : 0)
2727                                    | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2728                                    | (string == commands[i].prog
2729                                       ? PEXECUTE_SEARCH : 0)
2730                                    | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2731
2732       if (commands[i].pid == -1)
2733         pfatal_pexecute (errmsg_fmt, errmsg_arg);
2734
2735       if (string != commands[i].prog)
2736         free ((PTR) string);
2737     }
2738
2739   execution_count++;
2740
2741   /* Wait for all the subprocesses to finish.
2742      We don't care what order they finish in;
2743      we know that N_COMMANDS waits will get them all.
2744      Ignore subprocesses that we don't know about,
2745      since they can be spawned by the process that exec'ed us.  */
2746
2747   {
2748     int ret_code = 0;
2749 #ifdef HAVE_GETRUSAGE
2750     struct timeval d;
2751     double ut = 0.0, st = 0.0;
2752 #endif
2753
2754     for (i = 0; i < n_commands;)
2755       {
2756         int j;
2757         int status;
2758         int pid;
2759
2760         pid = pwait (commands[i].pid, &status, 0);
2761         if (pid < 0)
2762           abort ();
2763
2764 #ifdef HAVE_GETRUSAGE
2765         if (report_times)
2766           {
2767             /* getrusage returns the total resource usage of all children
2768                up to now.  Copy the previous values into prus, get the
2769                current statistics, then take the difference.  */
2770
2771             prus = rus;
2772             getrusage (RUSAGE_CHILDREN, &rus);
2773             d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
2774             d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
2775             ut = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2776
2777             d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
2778             d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
2779             st = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2780           }
2781 #endif
2782
2783         for (j = 0; j < n_commands; j++)
2784           if (commands[j].pid == pid)
2785             {
2786               i++;
2787               if (WIFSIGNALED (status))
2788                 {
2789 #ifdef SIGPIPE
2790                   /* SIGPIPE is a special case.  It happens in -pipe mode
2791                      when the compiler dies before the preprocessor is
2792                      done, or the assembler dies before the compiler is
2793                      done.  There's generally been an error already, and
2794                      this is just fallout.  So don't generate another error
2795                      unless we would otherwise have succeeded.  */
2796                   if (WTERMSIG (status) == SIGPIPE
2797                       && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2798                     ;
2799                   else
2800 #endif
2801                     fatal ("\
2802 Internal error: %s (program %s)\n\
2803 Please submit a full bug report.\n\
2804 See %s for instructions.",
2805                            strsignal (WTERMSIG (status)), commands[j].prog,
2806                            GCCBUGURL);
2807                   signal_count++;
2808                   ret_code = -1;
2809                 }
2810               else if (WIFEXITED (status)
2811                        && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2812                 {
2813                   if (WEXITSTATUS (status) > greatest_status)
2814                     greatest_status = WEXITSTATUS (status);
2815                   ret_code = -1;
2816                 }
2817 #ifdef HAVE_GETRUSAGE
2818               if (report_times && ut + st != 0)
2819                 notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
2820 #endif
2821               break;
2822             }
2823       }
2824     return ret_code;
2825   }
2826 }
2827 \f
2828 /* Find all the switches given to us
2829    and make a vector describing them.
2830    The elements of the vector are strings, one per switch given.
2831    If a switch uses following arguments, then the `part1' field
2832    is the switch itself and the `args' field
2833    is a null-terminated vector containing the following arguments.
2834    The `live_cond' field is:
2835    0 when initialized
2836    1 if the switch is true in a conditional spec,
2837    -1 if false (overridden by a later switch)
2838    -2 if this switch should be ignored (used in %{<S})
2839    The `validated' field is nonzero if any spec has looked at this switch;
2840    if it remains zero at the end of the run, it must be meaningless.  */
2841
2842 #define SWITCH_OK       0
2843 #define SWITCH_FALSE   -1
2844 #define SWITCH_IGNORE  -2
2845 #define SWITCH_LIVE     1
2846
2847 struct switchstr
2848 {
2849   const char *part1;
2850   const char **args;
2851   int live_cond;
2852   unsigned char validated;
2853   unsigned char ordering;
2854 };
2855
2856 static struct switchstr *switches;
2857
2858 static int n_switches;
2859
2860 struct infile
2861 {
2862   const char *name;
2863   const char *language;
2864 };
2865
2866 /* Also a vector of input files specified.  */
2867
2868 static struct infile *infiles;
2869
2870 int n_infiles;
2871
2872 /* This counts the number of libraries added by lang_specific_driver, so that
2873    we can tell if there were any user supplied any files or libraries.  */
2874
2875 static int added_libraries;
2876
2877 /* And a vector of corresponding output files is made up later.  */
2878
2879 const char **outfiles;
2880
2881 /* Used to track if none of the -B paths are used.  */
2882 static int warn_B;
2883
2884 /* Used to track if standard path isn't used and -b or -V is specified.  */
2885 static int warn_std;
2886
2887 /* Gives value to pass as "warn" to add_prefix for standard prefixes.  */
2888 static int *warn_std_ptr = 0;
2889 \f
2890 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2891
2892 /* Convert NAME to a new name if it is the standard suffix.  DO_EXE
2893    is true if we should look for an executable suffix as well.  */
2894
2895 static char *
2896 convert_filename (name, do_exe)
2897      char *name;
2898      int do_exe;
2899 {
2900   int i;
2901   int len;
2902
2903   if (name == NULL)
2904     return NULL;
2905
2906   len = strlen (name);
2907
2908 #ifdef HAVE_TARGET_OBJECT_SUFFIX
2909   /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj".  */
2910   if (len > 2
2911       && name[len - 2] == '.'
2912       && name[len - 1] == 'o')
2913     {
2914       obstack_grow (&obstack, name, len - 2);
2915       obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
2916       name = obstack_finish (&obstack);
2917     }
2918 #endif
2919
2920 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2921   /* If there is no filetype, make it the executable suffix (which includes
2922      the ".").  But don't get confused if we have just "-o".  */
2923   if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2924     return name;
2925
2926   for (i = len - 1; i >= 0; i--)
2927     if (IS_DIR_SEPARATOR (name[i]))
2928       break;
2929
2930   for (i++; i < len; i++)
2931     if (name[i] == '.')
2932       return name;
2933
2934   obstack_grow (&obstack, name, len);
2935   obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
2936                  strlen (TARGET_EXECUTABLE_SUFFIX));
2937   name = obstack_finish (&obstack);
2938 #endif
2939
2940   return name;
2941 }
2942 #endif
2943 \f
2944 /* Display the command line switches accepted by gcc.  */
2945 static void
2946 display_help ()
2947 {
2948   printf (_("Usage: %s [options] file...\n"), programname);
2949   fputs (_("Options:\n"), stdout);
2950
2951   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
2952   fputs (_("  --help                   Display this information\n"), stdout);
2953   fputs (_("  --target-help            Display target specific command line options\n"), stdout);
2954   if (! verbose_flag)
2955     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2956   fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
2957   fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
2958   fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
2959   fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
2960   fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
2961   fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
2962   fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
2963   fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
2964   fputs (_("\
2965   -print-multi-lib         Display the mapping between command line options and\n\
2966                            multiple library search directories\n"), stdout);
2967   fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
2968   fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
2969   fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
2970   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
2971   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
2972   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
2973   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
2974   fputs (_("  -specs=<file>            Override builtin specs with the contents of <file>\n"), stdout);
2975   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
2976   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
2977   fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
2978   fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
2979   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
2980   fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
2981   fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
2982   fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
2983   fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
2984   fputs (_("\
2985   -x <language>            Specify the language of the following input files\n\
2986                            Permissable languages include: c c++ assembler none\n\
2987                            'none' means revert to the default behaviour of\n\
2988                            guessing the language based on the file's extension\n\
2989 "), stdout);
2990
2991   printf (_("\
2992 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
2993  passed on to the various sub-processes invoked by %s.  In order to pass\n\
2994  other options on to these processes the -W<letter> options must be used.\n\
2995 "), programname);
2996
2997   /* The rest of the options are displayed by invocations of the various
2998      sub-processes.  */
2999 }
3000
3001 static void
3002 add_preprocessor_option (option, len)
3003      const char *option;
3004      int len;
3005 {
3006   n_preprocessor_options++;
3007
3008   if (! preprocessor_options)
3009     preprocessor_options
3010       = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
3011   else
3012     preprocessor_options
3013       = (char **) xrealloc (preprocessor_options,
3014                             n_preprocessor_options * sizeof (char *));
3015
3016   preprocessor_options [n_preprocessor_options - 1] =
3017     save_string (option, len);
3018 }
3019
3020 static void
3021 add_assembler_option (option, len)
3022      const char *option;
3023      int len;
3024 {
3025   n_assembler_options++;
3026
3027   if (! assembler_options)
3028     assembler_options
3029       = (char **) xmalloc (n_assembler_options * sizeof (char *));
3030   else
3031     assembler_options
3032       = (char **) xrealloc (assembler_options,
3033                             n_assembler_options * sizeof (char *));
3034
3035   assembler_options [n_assembler_options - 1] = save_string (option, len);
3036 }
3037
3038 static void
3039 add_linker_option (option, len)
3040      const char *option;
3041      int len;
3042 {
3043   n_linker_options++;
3044
3045   if (! linker_options)
3046     linker_options
3047       = (char **) xmalloc (n_linker_options * sizeof (char *));
3048   else
3049     linker_options
3050       = (char **) xrealloc (linker_options,
3051                             n_linker_options * sizeof (char *));
3052
3053   linker_options [n_linker_options - 1] = save_string (option, len);
3054 }
3055 \f
3056 /* Create the vector `switches' and its contents.
3057    Store its length in `n_switches'.  */
3058
3059 static void
3060 process_command (argc, argv)
3061      int argc;
3062      const char *const *argv;
3063 {
3064   register int i;
3065   const char *temp;
3066   char *temp1;
3067   const char *spec_lang = 0;
3068   int last_language_n_infiles;
3069   int have_c = 0;
3070   int have_o = 0;
3071   int lang_n_infiles = 0;
3072 #ifdef MODIFY_TARGET_NAME
3073   int is_modify_target_name;
3074   int j;
3075 #endif
3076
3077   GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3078
3079   n_switches = 0;
3080   n_infiles = 0;
3081   added_libraries = 0;
3082
3083   /* Figure compiler version from version string.  */
3084
3085   compiler_version = temp1 = xstrdup (version_string);
3086
3087   for (; *temp1; ++temp1)
3088     {
3089       if (*temp1 == ' ')
3090         {
3091           *temp1 = '\0';
3092           break;
3093         }
3094     }
3095
3096   /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
3097      see if we can create it from the pathname specified in argv[0].  */
3098
3099 #ifndef VMS
3100   /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
3101   if (!gcc_exec_prefix)
3102     {
3103       gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
3104                                               standard_exec_prefix);
3105       if (gcc_exec_prefix)
3106         putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3107     }
3108 #endif
3109
3110   if (gcc_exec_prefix)
3111     {
3112       int len = strlen (gcc_exec_prefix);
3113
3114       if (len > (int) sizeof ("/lib/gcc-lib/") - 1
3115           && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3116         {
3117           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
3118           if (IS_DIR_SEPARATOR (*temp)
3119               && strncmp (temp + 1, "lib", 3) == 0
3120               && IS_DIR_SEPARATOR (temp[4])
3121               && strncmp (temp + 5, "gcc-lib", 7) == 0)
3122             len -= sizeof ("/lib/gcc-lib/") - 1;
3123         }
3124
3125       set_std_prefix (gcc_exec_prefix, len);
3126       add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC",
3127                   PREFIX_PRIORITY_LAST, 0, NULL);
3128       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3129                   PREFIX_PRIORITY_LAST, 0, NULL);
3130     }
3131
3132   /* COMPILER_PATH and LIBRARY_PATH have values
3133      that are lists of directory names with colons.  */
3134
3135   GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
3136   if (temp)
3137     {
3138       const char *startp, *endp;
3139       char *nstore = (char *) alloca (strlen (temp) + 3);
3140
3141       startp = endp = temp;
3142       while (1)
3143         {
3144           if (*endp == PATH_SEPARATOR || *endp == 0)
3145             {
3146               strncpy (nstore, startp, endp - startp);
3147               if (endp == startp)
3148                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3149               else if (!IS_DIR_SEPARATOR (endp[-1]))
3150                 {
3151                   nstore[endp - startp] = DIR_SEPARATOR;
3152                   nstore[endp - startp + 1] = 0;
3153                 }
3154               else
3155                 nstore[endp - startp] = 0;
3156               add_prefix (&exec_prefixes, nstore, 0,
3157                           PREFIX_PRIORITY_LAST, 0, NULL);
3158               add_prefix (&include_prefixes,
3159                           concat (nstore, "include", NULL),
3160                           0, PREFIX_PRIORITY_LAST, 0, NULL);
3161               if (*endp == 0)
3162                 break;
3163               endp = startp = endp + 1;
3164             }
3165           else
3166             endp++;
3167         }
3168     }
3169
3170   GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
3171   if (temp && *cross_compile == '0')
3172     {
3173       const char *startp, *endp;
3174       char *nstore = (char *) alloca (strlen (temp) + 3);
3175
3176       startp = endp = temp;
3177       while (1)
3178         {
3179           if (*endp == PATH_SEPARATOR || *endp == 0)
3180             {
3181               strncpy (nstore, startp, endp - startp);
3182               if (endp == startp)
3183                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3184               else if (!IS_DIR_SEPARATOR (endp[-1]))
3185                 {
3186                   nstore[endp - startp] = DIR_SEPARATOR;
3187                   nstore[endp - startp + 1] = 0;
3188                 }
3189               else
3190                 nstore[endp - startp] = 0;
3191               add_prefix (&startfile_prefixes, nstore, NULL,
3192                           PREFIX_PRIORITY_LAST, 0, NULL);
3193               if (*endp == 0)
3194                 break;
3195               endp = startp = endp + 1;
3196             }
3197           else
3198             endp++;
3199         }
3200     }
3201
3202   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
3203   GET_ENV_PATH_LIST (temp, "LPATH");
3204   if (temp && *cross_compile == '0')
3205     {
3206       const char *startp, *endp;
3207       char *nstore = (char *) alloca (strlen (temp) + 3);
3208
3209       startp = endp = temp;
3210       while (1)
3211         {
3212           if (*endp == PATH_SEPARATOR || *endp == 0)
3213             {
3214               strncpy (nstore, startp, endp - startp);
3215               if (endp == startp)
3216                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3217               else if (!IS_DIR_SEPARATOR (endp[-1]))
3218                 {
3219                   nstore[endp - startp] = DIR_SEPARATOR;
3220                   nstore[endp - startp + 1] = 0;
3221                 }
3222               else
3223                 nstore[endp - startp] = 0;
3224               add_prefix (&startfile_prefixes, nstore, NULL,
3225                           PREFIX_PRIORITY_LAST, 0, NULL);
3226               if (*endp == 0)
3227                 break;
3228               endp = startp = endp + 1;
3229             }
3230           else
3231             endp++;
3232         }
3233     }
3234
3235   /* Convert new-style -- options to old-style.  */
3236   translate_options (&argc, &argv);
3237
3238   /* Do language-specific adjustment/addition of flags.  */
3239   lang_specific_driver (&argc, &argv, &added_libraries);
3240
3241   /* Scan argv twice.  Here, the first time, just count how many switches
3242      there will be in their vector, and how many input files in theirs.
3243      Also parse any switches that determine the configuration name, such as -b.
3244      Here we also parse the switches that cc itself uses (e.g. -v).  */
3245
3246   for (i = 1; i < argc; i++)
3247     {
3248       if (! strcmp (argv[i], "-dumpspecs"))
3249         {
3250           struct spec_list *sl;
3251           init_spec ();
3252           for (sl = specs; sl; sl = sl->next)
3253             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3254           if (link_command_spec)
3255             printf ("*link_command:\n%s\n\n", link_command_spec);
3256           exit (0);
3257         }
3258       else if (! strcmp (argv[i], "-dumpversion"))
3259         {
3260           printf ("%s\n", spec_version);
3261           exit (0);
3262         }
3263       else if (! strcmp (argv[i], "-dumpmachine"))
3264         {
3265           printf ("%s\n", spec_machine);
3266           exit (0);
3267         }
3268       else if (strcmp (argv[i], "-fhelp") == 0)
3269         {
3270           /* translate_options () has turned --help into -fhelp.  */
3271           print_help_list = 1;
3272
3273           /* We will be passing a dummy file on to the sub-processes.  */
3274           n_infiles++;
3275           n_switches++;
3276
3277           add_preprocessor_option ("--help", 6);
3278           add_assembler_option ("--help", 6);
3279           add_linker_option ("--help", 6);
3280         }
3281       else if (strcmp (argv[i], "-ftarget-help") == 0)
3282         {
3283           /* translate_options() has turned --target-help into -ftarget-help. */
3284           target_help_flag = 1;
3285
3286           /* We will be passing a dummy file on to the sub-processes.  */
3287           n_infiles++;
3288           n_switches++;
3289
3290           add_preprocessor_option ("--target-help", 13);
3291           add_assembler_option ("--target-help", 13);
3292           add_linker_option ("--target-help", 13);
3293         }
3294       else if (! strcmp (argv[i], "-pass-exit-codes"))
3295         {
3296           pass_exit_codes = 1;
3297           n_switches++;
3298         }
3299       else if (! strcmp (argv[i], "-print-search-dirs"))
3300         print_search_dirs = 1;
3301       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3302         print_file_name = "libgcc.a";
3303       else if (! strncmp (argv[i], "-print-file-name=", 17))
3304         print_file_name = argv[i] + 17;
3305       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3306         print_prog_name = argv[i] + 17;
3307       else if (! strcmp (argv[i], "-print-multi-lib"))
3308         print_multi_lib = 1;
3309       else if (! strcmp (argv[i], "-print-multi-directory"))
3310         print_multi_directory = 1;
3311       else if (! strncmp (argv[i], "-Wa,", 4))
3312         {
3313           int prev, j;
3314           /* Pass the rest of this option to the assembler.  */
3315
3316           /* Split the argument at commas.  */
3317           prev = 4;
3318           for (j = 4; argv[i][j]; j++)
3319             if (argv[i][j] == ',')
3320               {
3321                 add_assembler_option (argv[i] + prev, j - prev);
3322                 prev = j + 1;
3323               }
3324
3325           /* Record the part after the last comma.  */
3326           add_assembler_option (argv[i] + prev, j - prev);
3327         }
3328       else if (! strncmp (argv[i], "-Wp,", 4))
3329         {
3330           int prev, j;
3331           /* Pass the rest of this option to the preprocessor.  */
3332
3333           /* Split the argument at commas.  */
3334           prev = 4;
3335           for (j = 4; argv[i][j]; j++)
3336             if (argv[i][j] == ',')
3337               {
3338                 add_preprocessor_option (argv[i] + prev, j - prev);
3339                 prev = j + 1;
3340               }
3341
3342           /* Record the part after the last comma.  */
3343           add_preprocessor_option (argv[i] + prev, j - prev);
3344         }
3345       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3346         /* The +e options to the C++ front-end.  */
3347         n_switches++;
3348       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3349         {
3350           int j;
3351           /* Split the argument at commas.  */
3352           for (j = 3; argv[i][j]; j++)
3353             n_infiles += (argv[i][j] == ',');
3354         }
3355       else if (strcmp (argv[i], "-Xlinker") == 0)
3356         {
3357           if (i + 1 == argc)
3358             fatal ("argument to `-Xlinker' is missing");
3359
3360           n_infiles++;
3361           i++;
3362         }
3363       else if (strcmp (argv[i], "-l") == 0)
3364         {
3365           if (i + 1 == argc)
3366             fatal ("argument to `-l' is missing");
3367
3368           n_infiles++;
3369           i++;
3370         }
3371       else if (strncmp (argv[i], "-l", 2) == 0)
3372         n_infiles++;
3373       else if (strcmp (argv[i], "-save-temps") == 0)
3374         {
3375           save_temps_flag = 1;
3376           n_switches++;
3377         }
3378       else if (strcmp (argv[i], "-specs") == 0)
3379         {
3380           struct user_specs *user = (struct user_specs *)
3381             xmalloc (sizeof (struct user_specs));
3382           if (++i >= argc)
3383             fatal ("argument to `-specs' is missing");
3384
3385           user->next = (struct user_specs *) 0;
3386           user->filename = argv[i];
3387           if (user_specs_tail)
3388             user_specs_tail->next = user;
3389           else
3390             user_specs_head = user;
3391           user_specs_tail = user;
3392         }
3393       else if (strncmp (argv[i], "-specs=", 7) == 0)
3394         {
3395           struct user_specs *user = (struct user_specs *)
3396             xmalloc (sizeof (struct user_specs));
3397           if (strlen (argv[i]) == 7)
3398             fatal ("argument to `-specs=' is missing");
3399
3400           user->next = (struct user_specs *) 0;
3401           user->filename = argv[i] + 7;
3402           if (user_specs_tail)
3403             user_specs_tail->next = user;
3404           else
3405             user_specs_head = user;
3406           user_specs_tail = user;
3407         }
3408       else if (strcmp (argv[i], "-time") == 0)
3409         report_times = 1;
3410       else if (argv[i][0] == '-' && argv[i][1] != 0)
3411         {
3412           register const char *p = &argv[i][1];
3413           register int c = *p;
3414
3415           switch (c)
3416             {
3417             case 'b':
3418               n_switches++;
3419               if (p[1] == 0 && i + 1 == argc)
3420                 fatal ("argument to `-b' is missing");
3421               if (p[1] == 0)
3422                 spec_machine = argv[++i];
3423               else
3424                 spec_machine = p + 1;
3425
3426               warn_std_ptr = &warn_std;
3427               break;
3428
3429             case 'B':
3430               {
3431                 const char *value;
3432                 int len;
3433
3434                 if (p[1] == 0 && i + 1 == argc)
3435                   fatal ("argument to `-B' is missing");
3436                 if (p[1] == 0)
3437                   value = argv[++i];
3438                 else
3439                   value = p + 1;
3440
3441                 len = strlen (value);
3442
3443                 /* Catch the case where the user has forgotten to append a
3444                    directory seperator to the path.  Note, they may be using
3445                    -B to add an executable name prefix, eg "i386-elf-", in
3446                    order to distinguish between multiple installations of
3447                    GCC in the same directory.  Hence we must check to see
3448                    if appending a directory separator actually makes a
3449                    valid directory name.  */
3450                 if (! IS_DIR_SEPARATOR (value [len - 1])
3451                     && is_directory (value, "", 0))
3452                   {
3453                     char *tmp = xmalloc (len + 2);
3454                     strcpy (tmp, value);
3455                     tmp[len] = DIR_SEPARATOR;
3456                     tmp[++ len] = 0;
3457                     value = tmp;
3458                   }
3459                 
3460                 /* As a kludge, if the arg is "[foo/]stageN/", just
3461                    add "[foo/]include" to the include prefix.  */
3462                 if ((len == 7
3463                      || (len > 7
3464                          && (IS_DIR_SEPARATOR (value[len - 8]))))
3465                     && strncmp (value + len - 7, "stage", 5) == 0
3466                     && ISDIGIT (value[len - 2])
3467                     && (IS_DIR_SEPARATOR (value[len - 1])))
3468                   {
3469                     if (len == 7)
3470                       add_prefix (&include_prefixes, "include", NULL,
3471                                   PREFIX_PRIORITY_B_OPT, 0, NULL);
3472                     else
3473                       {
3474                         char * string = xmalloc (len + 1);
3475
3476                         strncpy (string, value, len - 7);
3477                         strcpy (string + len - 7, "include");
3478                         add_prefix (&include_prefixes, string, NULL,
3479                                     PREFIX_PRIORITY_B_OPT, 0, NULL);
3480                       }
3481                   }
3482
3483                 add_prefix (&exec_prefixes, value, NULL,
3484                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3485                 add_prefix (&startfile_prefixes, value, NULL,
3486                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3487                 add_prefix (&include_prefixes, concat (value, "include", NULL),
3488                             NULL, PREFIX_PRIORITY_B_OPT, 0, NULL);
3489                 n_switches++;
3490               }
3491               break;
3492
3493             case 'v':   /* Print our subcommands and print versions.  */
3494               n_switches++;
3495               /* If they do anything other than exactly `-v', don't set
3496                  verbose_flag; rather, continue on to give the error.  */
3497               if (p[1] != 0)
3498                 break;
3499               verbose_flag++;
3500               break;
3501
3502             case 'V':
3503               n_switches++;
3504               if (p[1] == 0 && i + 1 == argc)
3505                 fatal ("argument to `-V' is missing");
3506               if (p[1] == 0)
3507                 spec_version = argv[++i];
3508               else
3509                 spec_version = p + 1;
3510               compiler_version = spec_version;
3511               warn_std_ptr = &warn_std;
3512
3513               /* Validate the version number.  Use the same checks
3514                  done when inserting it into a spec.
3515
3516                  The format of the version string is
3517                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
3518               {
3519                 const char *v = compiler_version;
3520
3521                 /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
3522                 while (! ISDIGIT (*v))
3523                   v++;
3524
3525                 if (v > compiler_version && v[-1] != '-')
3526                   fatal ("invalid version number format");
3527
3528                 /* Set V after the first period.  */
3529                 while (ISDIGIT (*v))
3530                   v++;
3531
3532                 if (*v != '.')
3533                   fatal ("invalid version number format");
3534
3535                 v++;
3536                 while (ISDIGIT (*v))
3537                   v++;
3538
3539                 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3540                   fatal ("invalid version number format");
3541               }
3542               break;
3543
3544             case 'S':
3545             case 'c':
3546               if (p[1] == 0)
3547                 {
3548                   have_c = 1;
3549                   n_switches++;
3550                   break;
3551                 }
3552               goto normal_switch;
3553
3554             case 'o':
3555               have_o = 1;
3556 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3557               if (! have_c)
3558                 {
3559                   int skip;
3560
3561                   /* Forward scan, just in case -S or -c is specified
3562                      after -o.  */
3563                   int j = i + 1;
3564                   if (p[1] == 0)
3565                     ++j;
3566                   while (j < argc)
3567                     {
3568                       if (argv[j][0] == '-')
3569                         {
3570                           if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3571                               && argv[j][2] == 0)
3572                             {
3573                               have_c = 1;
3574                               break;
3575                             }
3576                           else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3577                             j += skip - (argv[j][2] != 0);
3578                           else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3579                             j += skip;
3580                         }
3581                       j++;
3582                     }
3583                 }
3584 #endif
3585 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3586               if (p[1] == 0)
3587                 argv[i + 1] = convert_filename (argv[i + 1], ! have_c);
3588               else
3589                 argv[i] = convert_filename (argv[i], ! have_c);
3590 #endif
3591               goto normal_switch;
3592
3593             default:
3594             normal_switch:
3595
3596 #ifdef MODIFY_TARGET_NAME
3597               is_modify_target_name = 0;
3598
3599               for (j = 0;
3600                    j < sizeof modify_target / sizeof modify_target[0]; j++)
3601                 if (! strcmp (argv[i], modify_target[j].sw))
3602                   {
3603                     char *new_name
3604                       = (char *) xmalloc (strlen (modify_target[j].str)
3605                                           + strlen (spec_machine));
3606                     const char *p, *r;
3607                     char *q;
3608                     int made_addition = 0;
3609
3610                     is_modify_target_name = 1;
3611                     for (p = spec_machine, q = new_name; *p != 0; )
3612                       {
3613                         if (modify_target[j].add_del == DELETE
3614                             && (! strncmp (q, modify_target[j].str,
3615                                            strlen (modify_target[j].str))))
3616                           p += strlen (modify_target[j].str);
3617                         else if (modify_target[j].add_del == ADD
3618                                  && ! made_addition && *p == '-')
3619                           {
3620                             for (r = modify_target[j].str; *r != 0; )
3621                               *q++ = *r++;
3622                             made_addition = 1;
3623                           }
3624
3625                         *q++ = *p++;
3626                       }
3627
3628                     spec_machine = new_name;
3629                   }
3630
3631               if (is_modify_target_name)
3632                 break;
3633 #endif                
3634
3635               n_switches++;
3636
3637               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3638                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3639               else if (WORD_SWITCH_TAKES_ARG (p))
3640                 i += WORD_SWITCH_TAKES_ARG (p);
3641             }
3642         }
3643       else
3644         {
3645           n_infiles++;
3646           lang_n_infiles++;
3647         }
3648     }
3649
3650   if (have_c && have_o && lang_n_infiles > 1)
3651     fatal ("cannot specify -o with -c or -S and multiple compilations");
3652
3653   /* Set up the search paths before we go looking for config files.  */
3654
3655   /* These come before the md prefixes so that we will find gcc's subcommands
3656      (such as cpp) rather than those of the host system.  */
3657   /* Use 2 as fourth arg meaning try just the machine as a suffix,
3658      as well as trying the machine and the version.  */
3659 #ifndef OS2
3660   add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3661               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3662   add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3663               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3664   add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3665               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3666 #endif
3667
3668   add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3669               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3670   add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3671               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3672
3673   tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3674                            dir_separator_str, NULL);
3675
3676   /* If tooldir is relative, base it on exec_prefixes.  A relative
3677      tooldir lets us move the installed tree as a unit.
3678
3679      If GCC_EXEC_PREFIX is defined, then we want to add two relative
3680      directories, so that we can search both the user specified directory
3681      and the standard place.  */
3682
3683   if (!IS_ABSOLUTE_PATHNAME (tooldir_prefix))
3684     {
3685       if (gcc_exec_prefix)
3686         {
3687           char *gcc_exec_tooldir_prefix
3688             = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3689                       spec_version, dir_separator_str, tooldir_prefix, NULL);
3690
3691           add_prefix (&exec_prefixes,
3692                       concat (gcc_exec_tooldir_prefix, "bin",
3693                               dir_separator_str, NULL),
3694                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
3695           add_prefix (&startfile_prefixes,
3696                       concat (gcc_exec_tooldir_prefix, "lib",
3697                               dir_separator_str, NULL),
3698                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
3699         }
3700
3701       tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3702                                dir_separator_str, spec_version,
3703                                dir_separator_str, tooldir_prefix, NULL);
3704     }
3705
3706   add_prefix (&exec_prefixes,
3707               concat (tooldir_prefix, "bin", dir_separator_str, NULL),
3708               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
3709   add_prefix (&startfile_prefixes,
3710               concat (tooldir_prefix, "lib", dir_separator_str, NULL),
3711               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
3712
3713   /* More prefixes are enabled in main, after we read the specs file
3714      and determine whether this is cross-compilation or not.  */
3715
3716   /* Then create the space for the vectors and scan again.  */
3717
3718   switches = ((struct switchstr *)
3719               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3720   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3721   n_switches = 0;
3722   n_infiles = 0;
3723   last_language_n_infiles = -1;
3724
3725   /* This, time, copy the text of each switch and store a pointer
3726      to the copy in the vector of switches.
3727      Store all the infiles in their vector.  */
3728
3729   for (i = 1; i < argc; i++)
3730     {
3731       /* Just skip the switches that were handled by the preceding loop.  */
3732 #ifdef MODIFY_TARGET_NAME
3733       is_modify_target_name = 0;
3734
3735       for (j = 0; j < sizeof modify_target / sizeof modify_target[0]; j++)
3736         if (! strcmp (argv[i], modify_target[j].sw))
3737           is_modify_target_name = 1;
3738
3739       if (is_modify_target_name)
3740         ;
3741       else
3742 #endif
3743       if (! strncmp (argv[i], "-Wa,", 4))
3744         ;
3745       else if (! strncmp (argv[i], "-Wp,", 4))
3746         ;
3747       else if (! strcmp (argv[i], "-pass-exit-codes"))
3748         ;
3749       else if (! strcmp (argv[i], "-print-search-dirs"))
3750         ;
3751       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3752         ;
3753       else if (! strncmp (argv[i], "-print-file-name=", 17))
3754         ;
3755       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3756         ;
3757       else if (! strcmp (argv[i], "-print-multi-lib"))
3758         ;
3759       else if (! strcmp (argv[i], "-print-multi-directory"))
3760         ;
3761       else if (strcmp (argv[i], "-ftarget-help") == 0)
3762         {
3763            /* Create a dummy input file, so that we can pass --target-help on to
3764               the various sub-processes.  */
3765            infiles[n_infiles].language = "c";
3766            infiles[n_infiles++].name   = "target-dummy";
3767
3768            /* Preserve the --target-help switch so that it can be caught by
3769               the cc1 spec string.  */
3770            switches[n_switches].part1     = "--target-help";
3771            switches[n_switches].args      = 0;
3772            switches[n_switches].live_cond = SWITCH_OK;
3773            switches[n_switches].validated = 0;
3774
3775            n_switches++;
3776         }
3777       else if (strcmp (argv[i], "-fhelp") == 0)
3778         {
3779           if (verbose_flag)
3780             {
3781               /* Create a dummy input file, so that we can pass --help on to
3782                  the various sub-processes.  */
3783               infiles[n_infiles].language = "c";
3784               infiles[n_infiles++].name   = "help-dummy";
3785
3786               /* Preserve the --help switch so that it can be caught by the
3787                  cc1 spec string.  */
3788               switches[n_switches].part1     = "--help";
3789               switches[n_switches].args      = 0;
3790               switches[n_switches].live_cond = SWITCH_OK;
3791               switches[n_switches].validated = 0;
3792
3793               n_switches++;
3794             }
3795         }
3796       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3797         {
3798           /* Compensate for the +e options to the C++ front-end;
3799              they're there simply for cfront call-compatibility.  We do
3800              some magic in default_compilers to pass them down properly.
3801              Note we deliberately start at the `+' here, to avoid passing
3802              -e0 or -e1 down into the linker.  */
3803           switches[n_switches].part1 = &argv[i][0];
3804           switches[n_switches].args = 0;
3805           switches[n_switches].live_cond = SWITCH_OK;
3806           switches[n_switches].validated = 0;
3807           n_switches++;
3808         }
3809       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3810         {
3811           int prev, j;
3812           /* Split the argument at commas.  */
3813           prev = 4;
3814           for (j = 4; argv[i][j]; j++)
3815             if (argv[i][j] == ',')
3816               {
3817                 infiles[n_infiles].language = "*";
3818                 infiles[n_infiles++].name
3819                   = save_string (argv[i] + prev, j - prev);
3820                 prev = j + 1;
3821               }
3822           /* Record the part after the last comma.  */
3823           infiles[n_infiles].language = "*";
3824           infiles[n_infiles++].name = argv[i] + prev;
3825         }
3826       else if (strcmp (argv[i], "-Xlinker") == 0)
3827         {
3828           infiles[n_infiles].language = "*";
3829           infiles[n_infiles++].name = argv[++i];
3830         }
3831       else if (strcmp (argv[i], "-l") == 0)
3832         { /* POSIX allows separation of -l and the lib arg;
3833              canonicalize by concatenating -l with its arg */
3834           infiles[n_infiles].language = "*";
3835           infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
3836         }
3837       else if (strncmp (argv[i], "-l", 2) == 0)
3838         {
3839           infiles[n_infiles].language = "*";
3840           infiles[n_infiles++].name = argv[i];
3841         }
3842       else if (strcmp (argv[i], "-specs") == 0)
3843         i++;
3844       else if (strncmp (argv[i], "-specs=", 7) == 0)
3845         ;
3846       else if (strcmp (argv[i], "-time") == 0)
3847         ;
3848       else if ((save_temps_flag || report_times)
3849                && strcmp (argv[i], "-pipe") == 0)
3850         {
3851           /* -save-temps overrides -pipe, so that temp files are produced */
3852           if (save_temps_flag)
3853             error ("Warning: -pipe ignored because -save-temps specified");
3854           /* -time overrides -pipe because we can't get correct stats when
3855              multiple children are running at once.  */
3856           else if (report_times)
3857             error ("Warning: -pipe ignored because -time specified");
3858         }
3859       else if (argv[i][0] == '-' && argv[i][1] != 0)
3860         {
3861           const char *p = &argv[i][1];
3862           int c = *p;
3863
3864           if (c == 'x')
3865             {
3866               if (p[1] == 0 && i + 1 == argc)
3867                 fatal ("argument to `-x' is missing");
3868               if (p[1] == 0)
3869                 spec_lang = argv[++i];
3870               else
3871                 spec_lang = p + 1;
3872               if (! strcmp (spec_lang, "none"))
3873                 /* Suppress the warning if -xnone comes after the last input
3874                    file, because alternate command interfaces like g++ might
3875                    find it useful to place -xnone after each input file.  */
3876                 spec_lang = 0;
3877               else
3878                 last_language_n_infiles = n_infiles;
3879               continue;
3880             }
3881           switches[n_switches].part1 = p;
3882           /* Deal with option arguments in separate argv elements.  */
3883           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
3884               || WORD_SWITCH_TAKES_ARG (p))
3885             {
3886               int j = 0;
3887               int n_args = WORD_SWITCH_TAKES_ARG (p);
3888
3889               if (n_args == 0)
3890                 {
3891                   /* Count only the option arguments in separate argv elements.  */
3892                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3893                 }
3894               if (i + n_args >= argc)
3895                 fatal ("argument to `-%s' is missing", p);
3896               switches[n_switches].args
3897                 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
3898               while (j < n_args)
3899                 switches[n_switches].args[j++] = argv[++i];
3900               /* Null-terminate the vector.  */
3901               switches[n_switches].args[j] = 0;
3902             }
3903           else if (strchr (switches_need_spaces, c))
3904             {
3905               /* On some systems, ld cannot handle some options without
3906                  a space.  So split the option from its argument.  */
3907               char *part1 = (char *) xmalloc (2);
3908               char *tmp;
3909               part1[0] = c;
3910               part1[1] = '\0';
3911
3912               switches[n_switches].part1 = part1;
3913               switches[n_switches].args
3914                 = (const char **) xmalloc (2 * sizeof (const char *));
3915               switches[n_switches].args[0] = tmp = xmalloc (strlen (p));
3916               strcpy (tmp, &p[1]);
3917               switches[n_switches].args[1] = 0;
3918             }
3919           else
3920             switches[n_switches].args = 0;
3921
3922           switches[n_switches].live_cond = SWITCH_OK;
3923           switches[n_switches].validated = 0;
3924           switches[n_switches].ordering = 0;
3925           /* These are always valid, since gcc.c itself understands it.  */
3926           if (!strcmp (p, "save-temps")
3927               || !strcmp (p, "static-libgcc")
3928               || !strcmp (p, "shared-libgcc"))
3929             switches[n_switches].validated = 1;
3930           else
3931             {
3932               char ch = switches[n_switches].part1[0];
3933               if (ch == 'V' || ch == 'b' || ch == 'B')
3934                 switches[n_switches].validated = 1;
3935             }
3936           n_switches++;
3937         }
3938       else
3939         {
3940 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3941           argv[i] = convert_filename (argv[i], 0);
3942 #endif
3943
3944           if (strcmp (argv[i], "-") != 0 && access (argv[i], F_OK) < 0)
3945             {
3946               perror_with_name (argv[i]);
3947               error_count++;
3948             }
3949           else
3950             {
3951               infiles[n_infiles].language = spec_lang;
3952               infiles[n_infiles++].name = argv[i];
3953             }
3954         }
3955     }
3956
3957   if (n_infiles == last_language_n_infiles && spec_lang != 0)
3958     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3959
3960   switches[n_switches].part1 = 0;
3961   infiles[n_infiles].name = 0;
3962 }
3963 \f
3964 /* Process a spec string, accumulating and running commands.  */
3965
3966 /* These variables describe the input file name.
3967    input_file_number is the index on outfiles of this file,
3968    so that the output file name can be stored for later use by %o.
3969    input_basename is the start of the part of the input file
3970    sans all directory names, and basename_length is the number
3971    of characters starting there excluding the suffix .c or whatever.  */
3972
3973 const char *input_filename;
3974 static int input_file_number;
3975 size_t input_filename_length;
3976 static int basename_length;
3977 static int suffixed_basename_length;
3978 static const char *input_basename;
3979 static const char *input_suffix;
3980
3981 /* The compiler used to process the current input file.  */
3982 static struct compiler *input_file_compiler;
3983
3984 /* These are variables used within do_spec and do_spec_1.  */
3985
3986 /* Nonzero if an arg has been started and not yet terminated
3987    (with space, tab or newline).  */
3988 static int arg_going;
3989
3990 /* Nonzero means %d or %g has been seen; the next arg to be terminated
3991    is a temporary file name.  */
3992 static int delete_this_arg;
3993
3994 /* Nonzero means %w has been seen; the next arg to be terminated
3995    is the output file name of this compilation.  */
3996 static int this_is_output_file;
3997
3998 /* Nonzero means %s has been seen; the next arg to be terminated
3999    is the name of a library file and we should try the standard
4000    search dirs for it.  */
4001 static int this_is_library_file;
4002
4003 /* Nonzero means that the input of this command is coming from a pipe.  */
4004 static int input_from_pipe;
4005
4006 /* Nonnull means substitute this for any suffix when outputting a switches
4007    arguments. */
4008 static const char *suffix_subst;
4009
4010 /* Process the spec SPEC and run the commands specified therein.
4011    Returns 0 if the spec is successfully processed; -1 if failed.  */
4012
4013 int
4014 do_spec (spec)
4015      const char *spec;
4016 {
4017   int value;
4018
4019   clear_args ();
4020   arg_going = 0;
4021   delete_this_arg = 0;
4022   this_is_output_file = 0;
4023   this_is_library_file = 0;
4024   input_from_pipe = 0;
4025   suffix_subst = NULL;
4026
4027   value = do_spec_1 (spec, 0, NULL);
4028
4029   /* Force out any unfinished command.
4030      If -pipe, this forces out the last command if it ended in `|'.  */
4031   if (value == 0)
4032     {
4033       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4034         argbuf_index--;
4035
4036       if (argbuf_index > 0)
4037         value = execute ();
4038     }
4039
4040   return value;
4041 }
4042
4043 /* Process the sub-spec SPEC as a portion of a larger spec.
4044    This is like processing a whole spec except that we do
4045    not initialize at the beginning and we do not supply a
4046    newline by default at the end.
4047    INSWITCH nonzero means don't process %-sequences in SPEC;
4048    in this case, % is treated as an ordinary character.
4049    This is used while substituting switches.
4050    INSWITCH nonzero also causes SPC not to terminate an argument.
4051
4052    Value is zero unless a line was finished
4053    and the command on that line reported an error.  */
4054
4055 static int
4056 do_spec_1 (spec, inswitch, soft_matched_part)
4057      const char *spec;
4058      int inswitch;
4059      const char *soft_matched_part;
4060 {
4061   register const char *p = spec;
4062   register int c;
4063   int i;
4064   const char *string;
4065   int value;
4066
4067   while ((c = *p++))
4068     /* If substituting a switch, treat all chars like letters.
4069        Otherwise, NL, SPC, TAB and % are special.  */
4070     switch (inswitch ? 'a' : c)
4071       {
4072       case '\n':
4073         /* End of line: finish any pending argument,
4074            then run the pending command if one has been started.  */
4075         if (arg_going)
4076           {
4077             obstack_1grow (&obstack, 0);
4078             string = obstack_finish (&obstack);
4079             if (this_is_library_file)
4080               string = find_file (string);
4081             store_arg (string, delete_this_arg, this_is_output_file);
4082             if (this_is_output_file)
4083               outfiles[input_file_number] = string;
4084           }
4085         arg_going = 0;
4086
4087         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4088           {
4089             for (i = 0; i < n_switches; i++)
4090               if (!strcmp (switches[i].part1, "pipe"))
4091                 break;
4092
4093             /* A `|' before the newline means use a pipe here,
4094                but only if -pipe was specified.
4095                Otherwise, execute now and don't pass the `|' as an arg.  */
4096             if (i < n_switches)
4097               {
4098                 input_from_pipe = 1;
4099                 switches[i].validated = 1;
4100                 break;
4101               }
4102             else
4103               argbuf_index--;
4104           }
4105
4106         if (argbuf_index > 0)
4107           {
4108             value = execute ();
4109             if (value)
4110               return value;
4111           }
4112         /* Reinitialize for a new command, and for a new argument.  */
4113         clear_args ();
4114         arg_going = 0;
4115         delete_this_arg = 0;
4116         this_is_output_file = 0;
4117         this_is_library_file = 0;
4118         input_from_pipe = 0;
4119         break;
4120
4121       case '|':
4122         /* End any pending argument.  */
4123         if (arg_going)
4124           {
4125             obstack_1grow (&obstack, 0);
4126             string = obstack_finish (&obstack);
4127             if (this_is_library_file)
4128               string = find_file (string);
4129             store_arg (string, delete_this_arg, this_is_output_file);
4130             if (this_is_output_file)
4131               outfiles[input_file_number] = string;
4132           }
4133
4134         /* Use pipe */
4135         obstack_1grow (&obstack, c);
4136         arg_going = 1;
4137         break;
4138
4139       case '\t':
4140       case ' ':
4141         /* Space or tab ends an argument if one is pending.  */
4142         if (arg_going)
4143           {
4144             obstack_1grow (&obstack, 0);
4145             string = obstack_finish (&obstack);
4146             if (this_is_library_file)
4147               string = find_file (string);
4148             store_arg (string, delete_this_arg, this_is_output_file);
4149             if (this_is_output_file)
4150               outfiles[input_file_number] = string;
4151           }
4152         /* Reinitialize for a new argument.  */
4153         arg_going = 0;
4154         delete_this_arg = 0;
4155         this_is_output_file = 0;
4156         this_is_library_file = 0;
4157         break;
4158
4159       case '%':
4160         switch (c = *p++)
4161           {
4162           case 0:
4163             fatal ("Invalid specification!  Bug in cc.");
4164
4165           case 'b':
4166             obstack_grow (&obstack, input_basename, basename_length);
4167             arg_going = 1;
4168             break;
4169
4170           case 'B':
4171             obstack_grow (&obstack, input_basename, suffixed_basename_length);
4172             arg_going = 1;
4173             break;
4174
4175           case 'd':
4176             delete_this_arg = 2;
4177             break;
4178
4179           /* Dump out the directories specified with LIBRARY_PATH,
4180              followed by the absolute directories
4181              that we search for startfiles.  */
4182           case 'D':
4183             {
4184               struct prefix_list *pl = startfile_prefixes.plist;
4185               size_t bufsize = 100;
4186               char *buffer = (char *) xmalloc (bufsize);
4187               int idx;
4188
4189               for (; pl; pl = pl->next)
4190                 {
4191 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4192                   /* Used on systems which record the specified -L dirs
4193                      and use them to search for dynamic linking.  */
4194                   /* Relative directories always come from -B,
4195                      and it is better not to use them for searching
4196                      at run time.  In particular, stage1 loses.  */
4197                   if (!IS_ABSOLUTE_PATHNAME (pl->prefix))
4198                     continue;
4199 #endif
4200                   /* Try subdirectory if there is one.  */
4201                   if (multilib_dir != NULL)
4202                     {
4203                       if (machine_suffix)
4204                         {
4205                           if (strlen (pl->prefix) + strlen (machine_suffix)
4206                               >= bufsize)
4207                             bufsize = (strlen (pl->prefix)
4208                                        + strlen (machine_suffix)) * 2 + 1;
4209                           buffer = (char *) xrealloc (buffer, bufsize);
4210                           strcpy (buffer, pl->prefix);
4211                           strcat (buffer, machine_suffix);
4212                           if (is_directory (buffer, multilib_dir, 1))
4213                             {
4214                               do_spec_1 ("-L", 0, NULL);
4215 #ifdef SPACE_AFTER_L_OPTION
4216                               do_spec_1 (" ", 0, NULL);
4217 #endif
4218                               do_spec_1 (buffer, 1, NULL);
4219                               do_spec_1 (multilib_dir, 1, NULL);
4220                               /* Make this a separate argument.  */
4221                               do_spec_1 (" ", 0, NULL);
4222                             }
4223                         }
4224                       if (!pl->require_machine_suffix)
4225                         {
4226                           if (is_directory (pl->prefix, multilib_dir, 1))
4227                             {
4228                               do_spec_1 ("-L", 0, NULL);
4229 #ifdef SPACE_AFTER_L_OPTION
4230                               do_spec_1 (" ", 0, NULL);
4231 #endif
4232                               do_spec_1 (pl->prefix, 1, NULL);
4233                               do_spec_1 (multilib_dir, 1, NULL);
4234                               /* Make this a separate argument.  */
4235                               do_spec_1 (" ", 0, NULL);
4236                             }
4237                         }
4238                     }
4239                   if (machine_suffix)
4240                     {
4241                       if (is_directory (pl->prefix, machine_suffix, 1))
4242                         {
4243                           do_spec_1 ("-L", 0, NULL);
4244 #ifdef SPACE_AFTER_L_OPTION
4245                           do_spec_1 (" ", 0, NULL);
4246 #endif
4247                           do_spec_1 (pl->prefix, 1, NULL);
4248                           /* Remove slash from machine_suffix.  */
4249                           if (strlen (machine_suffix) >= bufsize)
4250                             bufsize = strlen (machine_suffix) * 2 + 1;
4251                           buffer = (char *) xrealloc (buffer, bufsize);
4252                           strcpy (buffer, machine_suffix);
4253                           idx = strlen (buffer);
4254                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4255                             buffer[idx - 1] = 0;
4256                           do_spec_1 (buffer, 1, NULL);
4257                           /* Make this a separate argument.  */
4258                           do_spec_1 (" ", 0, NULL);
4259                         }
4260                     }
4261                   if (!pl->require_machine_suffix)
4262                     {
4263                       if (is_directory (pl->prefix, "", 1))
4264                         {
4265                           do_spec_1 ("-L", 0, NULL);
4266 #ifdef SPACE_AFTER_L_OPTION
4267                           do_spec_1 (" ", 0, NULL);
4268 #endif
4269                           /* Remove slash from pl->prefix.  */
4270                           if (strlen (pl->prefix) >= bufsize)
4271                             bufsize = strlen (pl->prefix) * 2 + 1;
4272                           buffer = (char *) xrealloc (buffer, bufsize);
4273                           strcpy (buffer, pl->prefix);
4274                           idx = strlen (buffer);
4275                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4276                             buffer[idx - 1] = 0;
4277                           do_spec_1 (buffer, 1, NULL);
4278                           /* Make this a separate argument.  */
4279                           do_spec_1 (" ", 0, NULL);
4280                         }
4281                     }
4282                 }
4283               free (buffer);
4284             }
4285             break;
4286
4287           case 'e':
4288             /* %efoo means report an error with `foo' as error message
4289                and don't execute any more commands for this file.  */
4290             {
4291               const char *q = p;
4292               char *buf;
4293               while (*p != 0 && *p != '\n')
4294                 p++;
4295               buf = (char *) alloca (p - q + 1);
4296               strncpy (buf, q, p - q);
4297               buf[p - q] = 0;
4298               error ("%s", buf);
4299               return -1;
4300             }
4301             break;
4302           case 'n':
4303             /* %nfoo means report an notice with `foo' on stderr.  */
4304             {
4305               const char *q = p;
4306               char *buf;
4307               while (*p != 0 && *p != '\n')
4308                 p++;
4309               buf = (char *) alloca (p - q + 1);
4310               strncpy (buf, q, p - q);
4311               buf[p - q] = 0;
4312               notice ("%s\n", buf);
4313               if (*p)
4314                 p++;
4315             }
4316             break;
4317
4318           case 'j':
4319             {
4320               struct stat st;
4321
4322               /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined,
4323                  and it is not a directory, and it is writable, use it.
4324                  Otherwise, fall through and treat this like any other
4325                  temporary file.  */
4326
4327               if ((!save_temps_flag)
4328                   && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4329                   && (access (HOST_BIT_BUCKET, W_OK) == 0))
4330                 {
4331                   obstack_grow (&obstack, HOST_BIT_BUCKET,
4332                                 strlen (HOST_BIT_BUCKET));
4333                   delete_this_arg = 0;
4334                   arg_going = 1;
4335                   break;
4336                 }
4337             }
4338           case 'g':
4339           case 'u':
4340           case 'U':
4341             if (save_temps_flag)
4342               {
4343                 obstack_grow (&obstack, input_basename, basename_length);
4344                 delete_this_arg = 0;
4345               }
4346             else
4347               {
4348                 struct temp_name *t;
4349                 int suffix_length;
4350                 const char *suffix = p;
4351                 char *saved_suffix = NULL;
4352
4353                 while (*p == '.' || ISALPHA ((unsigned char) *p))
4354                   p++;
4355                 suffix_length = p - suffix;
4356                 if (p[0] == '%' && p[1] == 'O')
4357                   {
4358                     p += 2;
4359                     /* We don't support extra suffix characters after %O.  */
4360                     if (*p == '.' || ISALPHA ((unsigned char) *p))
4361                       abort ();
4362                     if (suffix_length == 0)
4363                       suffix = TARGET_OBJECT_SUFFIX;
4364                     else
4365                       {
4366                         saved_suffix
4367                           = (char *) xmalloc (suffix_length
4368                                               + strlen (TARGET_OBJECT_SUFFIX));
4369                         strncpy (saved_suffix, suffix, suffix_length);
4370                         strcpy (saved_suffix + suffix_length,
4371                                 TARGET_OBJECT_SUFFIX);
4372                       }
4373                     suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4374                   }
4375
4376                 /* See if we already have an association of %g/%u/%U and
4377                    suffix.  */
4378                 for (t = temp_names; t; t = t->next)
4379                   if (t->length == suffix_length
4380                       && strncmp (t->suffix, suffix, suffix_length) == 0
4381                       && t->unique == (c != 'g'))
4382                     break;
4383
4384                 /* Make a new association if needed.  %u and %j
4385                    require one.  */
4386                 if (t == 0 || c == 'u' || c == 'j')
4387                   {
4388                     if (t == 0)
4389                       {
4390                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4391                         t->next = temp_names;
4392                         temp_names = t;
4393                       }
4394                     t->length = suffix_length;
4395                     if (saved_suffix)
4396                       {
4397                         t->suffix = saved_suffix;
4398                         saved_suffix = NULL;
4399                       }
4400                     else
4401                       t->suffix = save_string (suffix, suffix_length);
4402                     t->unique = (c != 'g');
4403                     temp_filename = make_temp_file (t->suffix);
4404                     temp_filename_length = strlen (temp_filename);
4405                     t->filename = temp_filename;
4406                     t->filename_length = temp_filename_length;
4407                   }
4408
4409                 if (saved_suffix)
4410                   free (saved_suffix);
4411
4412                 obstack_grow (&obstack, t->filename, t->filename_length);
4413                 delete_this_arg = 1;
4414               }
4415             arg_going = 1;
4416             break;
4417
4418           case 'i':
4419             obstack_grow (&obstack, input_filename, input_filename_length);
4420             arg_going = 1;
4421             break;
4422
4423           case 'I':
4424             {
4425               struct prefix_list *pl = include_prefixes.plist;
4426
4427               if (gcc_exec_prefix)
4428                 {
4429                   do_spec_1 ("-iprefix", 1, NULL);
4430                   /* Make this a separate argument.  */
4431                   do_spec_1 (" ", 0, NULL);
4432                   do_spec_1 (gcc_exec_prefix, 1, NULL);
4433                   do_spec_1 (" ", 0, NULL);
4434                 }
4435
4436               for (; pl; pl = pl->next)
4437                 {
4438                   do_spec_1 ("-isystem", 1, NULL);
4439                   /* Make this a separate argument.  */
4440                   do_spec_1 (" ", 0, NULL);
4441                   do_spec_1 (pl->prefix, 1, NULL);
4442                   do_spec_1 (" ", 0, NULL);
4443                 }
4444             }
4445             break;
4446
4447           case 'o':
4448             {
4449               int max = n_infiles;
4450               max += lang_specific_extra_outfiles;
4451
4452               for (i = 0; i < max; i++)
4453                 if (outfiles[i])
4454                   store_arg (outfiles[i], 0, 0);
4455               break;
4456             }
4457
4458           case 'O':
4459             obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4460             arg_going = 1;
4461             break;
4462
4463           case 's':
4464             this_is_library_file = 1;
4465             break;
4466
4467           case 'w':
4468             this_is_output_file = 1;
4469             break;
4470
4471           case 'W':
4472             {
4473               int cur_index = argbuf_index;
4474               /* Handle the {...} following the %W.  */
4475               if (*p != '{')
4476                 abort ();
4477               p = handle_braces (p + 1);
4478               if (p == 0)
4479                 return -1;
4480               /* If any args were output, mark the last one for deletion
4481                  on failure.  */
4482               if (argbuf_index != cur_index)
4483                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4484               break;
4485             }
4486
4487           /* %x{OPTION} records OPTION for %X to output.  */
4488           case 'x':
4489             {
4490               const char *p1 = p;
4491               char *string;
4492
4493               /* Skip past the option value and make a copy.  */
4494               if (*p != '{')
4495                 abort ();
4496               while (*p++ != '}')
4497                 ;
4498               string = save_string (p1 + 1, p - p1 - 2);
4499
4500               /* See if we already recorded this option.  */
4501               for (i = 0; i < n_linker_options; i++)
4502                 if (! strcmp (string, linker_options[i]))
4503                   {
4504                     free (string);
4505                     return 0;
4506                   }
4507
4508               /* This option is new; add it.  */
4509               add_linker_option (string, strlen (string));
4510             }
4511             break;
4512
4513           /* Dump out the options accumulated previously using %x.  */
4514           case 'X':
4515             for (i = 0; i < n_linker_options; i++)
4516               {
4517                 do_spec_1 (linker_options[i], 1, NULL);
4518                 /* Make each accumulated option a separate argument.  */
4519                 do_spec_1 (" ", 0, NULL);
4520               }
4521             break;
4522
4523           /* Dump out the options accumulated previously using -Wa,.  */
4524           case 'Y':
4525             for (i = 0; i < n_assembler_options; i++)
4526               {
4527                 do_spec_1 (assembler_options[i], 1, NULL);
4528                 /* Make each accumulated option a separate argument.  */
4529                 do_spec_1 (" ", 0, NULL);
4530               }
4531             break;
4532
4533           /* Dump out the options accumulated previously using -Wp,.  */
4534           case 'Z':
4535             for (i = 0; i < n_preprocessor_options; i++)
4536               {
4537                 do_spec_1 (preprocessor_options[i], 1, NULL);
4538                 /* Make each accumulated option a separate argument.  */
4539                 do_spec_1 (" ", 0, NULL);
4540               }
4541             break;
4542
4543             /* Here are digits and numbers that just process
4544                a certain constant string as a spec.  */
4545
4546           case '1':
4547             value = do_spec_1 (cc1_spec, 0, NULL);
4548             if (value != 0)
4549               return value;
4550             break;
4551
4552           case '2':
4553             value = do_spec_1 (cc1plus_spec, 0, NULL);
4554             if (value != 0)
4555               return value;
4556             break;
4557
4558           case 'a':
4559             value = do_spec_1 (asm_spec, 0, NULL);
4560             if (value != 0)
4561               return value;
4562             break;
4563
4564           case 'A':
4565             value = do_spec_1 (asm_final_spec, 0, NULL);
4566             if (value != 0)
4567               return value;
4568             break;
4569
4570           case 'c':
4571             value = do_spec_1 (signed_char_spec, 0, NULL);
4572             if (value != 0)
4573               return value;
4574             break;
4575
4576           case 'C':
4577             {
4578               const char* spec 
4579                 = (input_file_compiler->cpp_spec 
4580                    ? input_file_compiler->cpp_spec 
4581                    : cpp_spec);
4582               value = do_spec_1 (spec, 0, NULL);
4583               if (value != 0)
4584                 return value;
4585             }
4586             break;
4587
4588           case 'E':
4589             value = do_spec_1 (endfile_spec, 0, NULL);
4590             if (value != 0)
4591               return value;
4592             break;
4593
4594           case 'l':
4595             value = do_spec_1 (link_spec, 0, NULL);
4596             if (value != 0)
4597               return value;
4598             break;
4599
4600           case 'L':
4601             value = do_spec_1 (lib_spec, 0, NULL);
4602             if (value != 0)
4603               return value;
4604             break;
4605
4606           case 'G':
4607             value = do_spec_1 (libgcc_spec, 0, NULL);
4608             if (value != 0)
4609               return value;
4610             break;
4611
4612           case 'M':
4613             if (multilib_dir && strcmp (multilib_dir, ".") != 0)
4614               {
4615                 char *p;
4616                 const char *q;
4617                 size_t len;
4618
4619                 len = strlen (multilib_dir);
4620                 obstack_blank (&obstack, len + 1);
4621                 p = obstack_next_free (&obstack) - (len + 1);
4622
4623                 *p++ = '_';
4624                 for (q = multilib_dir; *q ; ++q, ++p)
4625                   *p = (IS_DIR_SEPARATOR (*q) ? '_' : *q);
4626               }
4627             break;
4628
4629           case 'p':
4630             {
4631               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4632               char *buf = x;
4633               const char *y;
4634
4635               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
4636               y = cpp_predefines;
4637               while (*y != 0)
4638                 {
4639                   if (! strncmp (y, "-D", 2))
4640                     /* Copy the whole option.  */
4641                     while (*y && *y != ' ' && *y != '\t')
4642                       *x++ = *y++;
4643                   else if (*y == ' ' || *y == '\t')
4644                     /* Copy whitespace to the result.  */
4645                     *x++ = *y++;
4646                   /* Don't copy other options.  */
4647                   else
4648                     y++;
4649                 }
4650
4651               *x = 0;
4652
4653               value = do_spec_1 (buf, 0, NULL);
4654               if (value != 0)
4655                 return value;
4656             }
4657             break;
4658
4659           case 'P':
4660             {
4661               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4662               char *buf = x;
4663               const char *y;
4664
4665               /* Copy all of CPP_PREDEFINES into BUF,
4666                  but force them all into the reserved name space if they
4667                  aren't already there.  The reserved name space is all
4668                  identifiers beginning with two underscores or with one
4669                  underscore and a capital letter.  We do the forcing by
4670                  adding up to two underscores to the beginning and end
4671                  of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4672                  become __mips__.  */
4673               y = cpp_predefines;
4674               while (*y != 0)
4675                 {
4676                   if (! strncmp (y, "-D", 2))
4677                     {
4678                       int flag = 0;
4679
4680                       *x++ = *y++;
4681                       *x++ = *y++;
4682
4683                       if (*y != '_'
4684                           || (*(y + 1) != '_'
4685                               && ! ISUPPER ((unsigned char) *(y + 1))))
4686                         {
4687                           /* Stick __ at front of macro name.  */
4688                           if (*y != '_')
4689                             *x++ = '_';
4690                           *x++ = '_';
4691                           /* Arrange to stick __ at the end as well.  */
4692                           flag = 1;
4693                         }
4694
4695                       /* Copy the macro name.  */
4696                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
4697                         *x++ = *y++;
4698
4699                       if (flag)
4700                         {
4701                           if (x[-1] != '_')
4702                             {
4703                               if (x[-2] != '_')
4704                                 *x++ = '_';
4705                               *x++ = '_';
4706                             }
4707                         }
4708
4709                       /* Copy the value given, if any.  */
4710                       while (*y && *y != ' ' && *y != '\t')
4711                         *x++ = *y++;
4712                     }
4713                   else if (*y == ' ' || *y == '\t')
4714                     /* Copy whitespace to the result.  */
4715                     *x++ = *y++;
4716                   /* Don't copy -A options  */
4717                   else
4718                     y++;
4719                 }
4720               *x++ = ' ';
4721
4722               /* Copy all of CPP_PREDEFINES into BUF,
4723                  but put __ after every -D.  */
4724               y = cpp_predefines;
4725               while (*y != 0)
4726                 {
4727                   if (! strncmp (y, "-D", 2))
4728                     {
4729                       y += 2;
4730
4731                       if (*y != '_'
4732                           || (*(y + 1) != '_'
4733                               && ! ISUPPER ((unsigned char) *(y + 1))))
4734                         {
4735                           /* Stick -D__ at front of macro name.  */
4736                           *x++ = '-';
4737                           *x++ = 'D';
4738                           if (*y != '_')
4739                             *x++ = '_';
4740                           *x++ = '_';
4741
4742                           /* Copy the macro name.  */
4743                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
4744                             *x++ = *y++;
4745
4746                           /* Copy the value given, if any.  */
4747                           while (*y && *y != ' ' && *y != '\t')
4748                             *x++ = *y++;
4749                         }
4750                       else
4751                         {
4752                           /* Do not copy this macro - we have just done it before */
4753                           while (*y && *y != ' ' && *y != '\t')
4754                             y++;
4755                         }
4756                     }
4757                   else if (*y == ' ' || *y == '\t')
4758                     /* Copy whitespace to the result.  */
4759                     *x++ = *y++;
4760                   /* Don't copy -A options.  */
4761                   else
4762                     y++;
4763                 }
4764               *x++ = ' ';
4765
4766               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4767               y = cpp_predefines;
4768               while (*y != 0)
4769                 {
4770                   if (! strncmp (y, "-A", 2))
4771                     /* Copy the whole option.  */
4772                     while (*y && *y != ' ' && *y != '\t')
4773                       *x++ = *y++;
4774                   else if (*y == ' ' || *y == '\t')
4775                     /* Copy whitespace to the result.  */
4776                     *x++ = *y++;
4777                   /* Don't copy other options.  */
4778                   else
4779                     y++;
4780                 }
4781
4782               *x = 0;
4783
4784               value = do_spec_1 (buf, 0, NULL);
4785               if (value != 0)
4786                 return value;
4787             }
4788             break;
4789
4790           case 'S':
4791             value = do_spec_1 (startfile_spec, 0, NULL);
4792             if (value != 0)
4793               return value;
4794             break;
4795
4796             /* Here we define characters other than letters and digits.  */
4797
4798           case '{':
4799             p = handle_braces (p);
4800             if (p == 0)
4801               return -1;
4802             break;
4803
4804           case '%':
4805             obstack_1grow (&obstack, '%');
4806             break;
4807
4808          case '.':
4809            {
4810              unsigned len = 0;
4811
4812              while (p[len] && p[len] != ' ' && p[len] != '%')
4813                len++;
4814              suffix_subst = save_string (p - 1, len + 1);
4815              p += len;
4816            }
4817            break;
4818           
4819           case '*':
4820             if (soft_matched_part)
4821               {
4822                 do_spec_1 (soft_matched_part, 1, NULL);
4823                 do_spec_1 (" ", 0, NULL);
4824               }
4825             else
4826               /* Catch the case where a spec string contains something like
4827                  '%{foo:%*}'.  ie there is no * in the pattern on the left
4828                  hand side of the :.  */
4829               error ("Spec failure: '%%*' has not been initialised by pattern match");
4830             break;
4831
4832             /* Process a string found as the value of a spec given by name.
4833                This feature allows individual machine descriptions
4834                to add and use their own specs.
4835                %[...] modifies -D options the way %P does;
4836                %(...) uses the spec unmodified.  */
4837           case '[':
4838             error ("Warning: use of obsolete %%[ operator in specs");
4839           case '(':
4840             {
4841               const char *name = p;
4842               struct spec_list *sl;
4843               int len;
4844
4845               /* The string after the S/P is the name of a spec that is to be
4846                  processed.  */
4847               while (*p && *p != ')' && *p != ']')
4848                 p++;
4849
4850               /* See if it's in the list.  */
4851               for (len = p - name, sl = specs; sl; sl = sl->next)
4852                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4853                   {
4854                     name = *(sl->ptr_spec);
4855 #ifdef DEBUG_SPECS
4856                     notice ("Processing spec %c%s%c, which is '%s'\n",
4857                             c, sl->name, (c == '(') ? ')' : ']', name);
4858 #endif
4859                     break;
4860                   }
4861
4862               if (sl)
4863                 {
4864                   if (c == '(')
4865                     {
4866                       value = do_spec_1 (name, 0, NULL);
4867                       if (value != 0)
4868                         return value;
4869                     }
4870                   else
4871                     {
4872                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4873                       char *buf = x;
4874                       const char *y = name;
4875                       int flag = 0;
4876
4877                       /* Copy all of NAME into BUF, but put __ after
4878                          every -D and at the end of each arg.  */
4879                       while (1)
4880                         {
4881                           if (! strncmp (y, "-D", 2))
4882                             {
4883                               *x++ = '-';
4884                               *x++ = 'D';
4885                               *x++ = '_';
4886                               *x++ = '_';
4887                               y += 2;
4888                               flag = 1;
4889                               continue;
4890                             }
4891                           else if (flag
4892                                    && (*y == ' ' || *y == '\t' || *y == '='
4893                                        || *y == '}' || *y == 0))
4894                             {
4895                               *x++ = '_';
4896                               *x++ = '_';
4897                               flag = 0;
4898                             }
4899                           if (*y == 0)
4900                             break;
4901                           else
4902                             *x++ = *y++;
4903                         }
4904                       *x = 0;
4905
4906                       value = do_spec_1 (buf, 0, NULL);
4907                       if (value != 0)
4908                         return value;
4909                     }
4910                 }
4911
4912               /* Discard the closing paren or bracket.  */
4913               if (*p)
4914                 p++;
4915             }
4916             break;
4917
4918           case 'v':
4919             {
4920               int c1 = *p++;  /* Select first or second version number.  */
4921               const char *v = compiler_version;
4922               const char *q;
4923               static const char zeroc = '0';
4924
4925               /* The format of the version string is
4926                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
4927
4928               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
4929               while (! ISDIGIT (*v))
4930                 v++;
4931               if (v > compiler_version && v[-1] != '-')
4932                 abort ();
4933
4934               /* If desired, advance to second version number.  */
4935               if (c1 >= '2')
4936                 {
4937                   /* Set V after the first period.  */
4938                   while (ISDIGIT (*v))
4939                     v++;
4940                   if (*v != '.')
4941                     abort ();
4942                   v++;
4943                 }
4944
4945               /* If desired, advance to third version number.
4946                  But don't complain if it's not present */
4947               if (c1 == '3')
4948                 {
4949                   /* Set V after the second period.  */
4950                   while (ISDIGIT (*v))
4951                     v++;
4952                   if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
4953                     abort ();
4954                   if (*v != 0)
4955                     v++;
4956                 }
4957
4958               /* Set Q at the next period or at the end.  */
4959               q = v;
4960               while (ISDIGIT (*q))
4961                 q++;
4962               if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
4963                 abort ();
4964
4965               if (q > v)
4966                 /* Put that part into the command.  */
4967                 obstack_grow (&obstack, v, q - v);
4968               else
4969                 /* Default to "0" */
4970                 obstack_grow (&obstack, &zeroc, 1);
4971               arg_going = 1;
4972             }
4973             break;
4974
4975           case '|':
4976             if (input_from_pipe)
4977               do_spec_1 ("-", 0, NULL);
4978             break;
4979
4980           default:
4981             error ("Spec failure: Unrecognised spec option '%c'", c);
4982             break;
4983           }
4984         break;
4985
4986       case '\\':
4987         /* Backslash: treat next character as ordinary.  */
4988         c = *p++;
4989
4990         /* fall through */
4991       default:
4992         /* Ordinary character: put it into the current argument.  */
4993         obstack_1grow (&obstack, c);
4994         arg_going = 1;
4995       }
4996
4997   /* End of string.  */
4998   return 0;
4999 }
5000
5001 /* Return 0 if we call do_spec_1 and that returns -1.  */
5002
5003 static const char *
5004 handle_braces (p)
5005      register const char *p;
5006 {
5007   const char *filter, *body = NULL, *endbody = NULL;
5008   int pipe_p = 0;
5009   int true_once = 0;    /* If, in %{a|b:d}, at least one of a,b was seen.  */
5010   int negate;
5011   int suffix;
5012   int include_blanks = 1;
5013   int elide_switch = 0;
5014   int ordered = 0;
5015
5016   if (*p == '^')
5017     {
5018       /* A '^' after the open-brace means to not give blanks before args.  */
5019       include_blanks = 0;
5020       ++p;
5021     }
5022
5023   if (*p == '|')
5024     {
5025       /* A `|' after the open-brace means,
5026          if the test fails, output a single minus sign rather than nothing.
5027          This is used in %{|!pipe:...}.  */
5028       pipe_p = 1;
5029       ++p;
5030     }
5031
5032   if (*p == '<')
5033     {
5034       /* A `<' after the open-brace means that the switch should be
5035          removed from the command-line.  */
5036       elide_switch = 1;
5037       ++p;
5038     }
5039
5040 next_member:
5041   negate = suffix = 0;
5042
5043   if (*p == '!')
5044     /* A `!' after the open-brace negates the condition:
5045        succeed if the specified switch is not present.  */
5046     negate = 1, ++p;
5047
5048   if (*p == '.')
5049     /* A `.' after the open-brace means test against the current suffix.  */
5050     {
5051       if (pipe_p)
5052         abort ();
5053
5054       suffix = 1;
5055       ++p;
5056     }
5057
5058   if (elide_switch && (negate || pipe_p || suffix))
5059     {
5060       /* It doesn't make sense to mix elision with other flags.  We
5061          could fatal() here, but the standard seems to be to abort.  */
5062       abort ();
5063     }
5064
5065  next_ampersand:
5066   filter = p;
5067   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
5068     p++;
5069
5070   if (*p == '|' && (pipe_p || ordered))
5071     abort ();
5072
5073   if (!body)
5074     {
5075       if (*p != '}' && *p != '&')
5076         {
5077           register int count = 1;
5078           register const char *q = p;
5079
5080           while (*q++ != ':')
5081             continue;
5082           body = q;
5083
5084           while (count > 0)
5085             {
5086               if (*q == '{')
5087                 count++;
5088               else if (*q == '}')
5089                 count--;
5090               else if (*q == 0)
5091                 abort ();
5092               q++;
5093             }
5094           endbody = q;
5095         }
5096       else
5097         body = p, endbody = p + 1;
5098     }
5099
5100   if (suffix)
5101     {
5102       int found = (input_suffix != 0
5103                    && (long) strlen (input_suffix) == (long) (p - filter)
5104                    && strncmp (input_suffix, filter, p - filter) == 0);
5105
5106       if (body[0] == '}')
5107         abort ();
5108
5109       if (negate != found
5110           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL) < 0)
5111         return 0;
5112     }
5113   else if (p[-1] == '*' && (p[0] == '}' || p[0] == '&'))
5114     {
5115       /* Substitute all matching switches as separate args.  */
5116       register int i;
5117
5118       for (i = 0; i < n_switches; i++)
5119         if (!strncmp (switches[i].part1, filter, p - 1 - filter)
5120             && check_live_switch (i, p - 1 - filter))
5121           {
5122             if (elide_switch)
5123               {
5124                 switches[i].live_cond = SWITCH_IGNORE;
5125                 switches[i].validated = 1;
5126               }
5127             else
5128               ordered = 1, switches[i].ordering = 1;
5129           }
5130     }
5131   else
5132     {
5133       /* Test for presence of the specified switch.  */
5134       register int i;
5135       int present = 0;
5136
5137       /* If name specified ends in *, as in {x*:...},
5138          check for %* and handle that case.  */
5139       if (p[-1] == '*' && !negate)
5140         {
5141           int substitution;
5142           const char *r = body;
5143
5144           /* First see whether we have %*.  */
5145           substitution = 0;
5146           while (r < endbody)
5147             {
5148               if (*r == '%' && r[1] == '*')
5149                 substitution = 1;
5150               r++;
5151             }
5152           /* If we do, handle that case.  */
5153           if (substitution)
5154             {
5155               /* Substitute all matching switches as separate args.
5156                  But do this by substituting for %*
5157                  in the text that follows the colon.  */
5158
5159               unsigned hard_match_len = p - filter - 1;
5160               char *string = save_string (body, endbody - body - 1);
5161
5162               for (i = 0; i < n_switches; i++)
5163                 if (!strncmp (switches[i].part1, filter, hard_match_len)
5164                     && check_live_switch (i, -1))
5165                   {
5166                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
5167                     /* Pass any arguments this switch has.  */
5168                     give_switch (i, 1, 1);
5169                     suffix_subst = NULL;
5170                   }
5171
5172               /* We didn't match.  Try again.  */
5173               if (*p++ == '|')
5174                 goto next_member;
5175               return endbody;
5176             }
5177         }
5178
5179       /* If name specified ends in *, as in {x*:...},
5180          check for presence of any switch name starting with x.  */
5181       if (p[-1] == '*')
5182         {
5183           for (i = 0; i < n_switches; i++)
5184             {
5185               unsigned hard_match_len = p - filter - 1;
5186
5187               if (!strncmp (switches[i].part1, filter, hard_match_len)
5188                   && check_live_switch (i, hard_match_len))
5189                 {
5190                   present = 1;
5191                   break;
5192                 }
5193             }
5194         }
5195       /* Otherwise, check for presence of exact name specified.  */
5196       else
5197         {
5198           for (i = 0; i < n_switches; i++)
5199             {
5200               if (!strncmp (switches[i].part1, filter, p - filter)
5201                   && switches[i].part1[p - filter] == 0
5202                   && check_live_switch (i, -1))
5203                 {
5204                   present = 1;
5205                   break;
5206                 }
5207             }
5208         }
5209
5210       /* If it is as desired (present for %{s...}, absent for %{!s...})
5211          then substitute either the switch or the specified
5212          conditional text.  */
5213       if (present != negate)
5214         {
5215           if (elide_switch)
5216             {
5217               switches[i].live_cond = SWITCH_IGNORE;
5218               switches[i].validated = 1;
5219             }
5220           else if (ordered || *p == '&')
5221             ordered = 1, switches[i].ordering = 1;
5222           else if (*p == '}')
5223             give_switch (i, 0, include_blanks);
5224           else
5225             /* Even if many alternatives are matched, only output once.  */
5226             true_once = 1;
5227         }
5228       else if (pipe_p)
5229         {
5230           /* Here if a %{|...} conditional fails: output a minus sign,
5231              which means "standard output" or "standard input".  */
5232           do_spec_1 ("-", 0, NULL);
5233           return endbody;
5234         }
5235     }
5236
5237   /* We didn't match; try again.  */
5238   if (*p++ == '|')
5239     goto next_member;
5240
5241   if (p[-1] == '&')
5242     {
5243       body = 0;
5244       goto next_ampersand;
5245     }
5246
5247   if (ordered)
5248     {
5249       int i;
5250       /* Doing this set of switches later preserves their command-line
5251          ordering.  This is needed for e.g. -U, -D and -A.  */
5252       for (i = 0; i < n_switches; i++)
5253         if (switches[i].ordering == 1)
5254           {
5255             switches[i].ordering = 0;
5256             give_switch (i, 0, include_blanks);
5257           }
5258     }
5259   /* Process the spec just once, regardless of match count.  */
5260   else if (true_once)
5261     {
5262       if (do_spec_1 (save_string (body, endbody - body - 1),
5263                      0, NULL) < 0)
5264         return 0;
5265     }
5266
5267   return endbody;
5268 }
5269 \f
5270 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5271    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
5272    spec, or -1 if either exact match or %* is used.
5273
5274    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
5275    whose value does not begin with "no-" is obsoleted by the same value
5276    with the "no-", similarly for a switch with the "no-" prefix.  */
5277
5278 static int
5279 check_live_switch (switchnum, prefix_length)
5280      int switchnum;
5281      int prefix_length;
5282 {
5283   const char *name = switches[switchnum].part1;
5284   int i;
5285
5286   /* In the common case of {<at-most-one-letter>*}, a negating
5287      switch would always match, so ignore that case.  We will just
5288      send the conflicting switches to the compiler phase.  */
5289   if (prefix_length >= 0 && prefix_length <= 1)
5290     return 1;
5291
5292   /* If we already processed this switch and determined if it was
5293      live or not, return our past determination.  */
5294   if (switches[switchnum].live_cond != 0)
5295     return switches[switchnum].live_cond > 0;
5296
5297   /* Now search for duplicate in a manner that depends on the name.  */
5298   switch (*name)
5299     {
5300     case 'O':
5301       for (i = switchnum + 1; i < n_switches; i++)
5302         if (switches[i].part1[0] == 'O')
5303           {
5304             switches[switchnum].validated = 1;
5305             switches[switchnum].live_cond = SWITCH_FALSE;
5306             return 0;
5307           }
5308       break;
5309
5310     case 'W':  case 'f':  case 'm':
5311       if (! strncmp (name + 1, "no-", 3))
5312         {
5313           /* We have Xno-YYY, search for XYYY.  */
5314           for (i = switchnum + 1; i < n_switches; i++)
5315             if (switches[i].part1[0] == name[0]
5316                 && ! strcmp (&switches[i].part1[1], &name[4]))
5317               {
5318                 switches[switchnum].validated = 1;
5319                 switches[switchnum].live_cond = SWITCH_FALSE;
5320                 return 0;
5321               }
5322         }
5323       else
5324         {
5325           /* We have XYYY, search for Xno-YYY.  */
5326           for (i = switchnum + 1; i < n_switches; i++)
5327             if (switches[i].part1[0] == name[0]
5328                 && switches[i].part1[1] == 'n'
5329                 && switches[i].part1[2] == 'o'
5330                 && switches[i].part1[3] == '-'
5331                 && !strcmp (&switches[i].part1[4], &name[1]))
5332               {
5333                 switches[switchnum].validated = 1;
5334                 switches[switchnum].live_cond = SWITCH_FALSE;
5335                 return 0;
5336               }
5337         }
5338       break;
5339     }
5340
5341   /* Otherwise the switch is live.  */
5342   switches[switchnum].live_cond = SWITCH_LIVE;
5343   return 1;
5344 }
5345 \f
5346 /* Pass a switch to the current accumulating command
5347    in the same form that we received it.
5348    SWITCHNUM identifies the switch; it is an index into
5349    the vector of switches gcc received, which is `switches'.
5350    This cannot fail since it never finishes a command line.
5351
5352    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
5353
5354    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
5355    of the switch.  */
5356
5357 static void
5358 give_switch (switchnum, omit_first_word, include_blanks)
5359      int switchnum;
5360      int omit_first_word;
5361      int include_blanks;
5362 {
5363   if (switches[switchnum].live_cond == SWITCH_IGNORE)
5364     return;
5365
5366   if (!omit_first_word)
5367     {
5368       do_spec_1 ("-", 0, NULL);
5369       do_spec_1 (switches[switchnum].part1, 1, NULL);
5370     }
5371
5372   if (switches[switchnum].args != 0)
5373     {
5374       const char **p;
5375       for (p = switches[switchnum].args; *p; p++)
5376         {
5377           const char *arg = *p;
5378
5379           if (include_blanks)
5380             do_spec_1 (" ", 0, NULL);
5381           if (suffix_subst)
5382             {
5383               unsigned length = strlen (arg);
5384               int dot = 0;
5385
5386               while (length-- && !IS_DIR_SEPARATOR (arg[length]))
5387                 if (arg[length] == '.')
5388                   {
5389                     ((char *)arg)[length] = 0;
5390                     dot = 1;
5391                     break;
5392                   }
5393               do_spec_1 (arg, 1, NULL);
5394               if (dot)
5395                 ((char *)arg)[length] = '.';
5396               do_spec_1 (suffix_subst, 1, NULL);
5397             }
5398           else
5399             do_spec_1 (arg, 1, NULL);
5400         }
5401     }
5402
5403   do_spec_1 (" ", 0, NULL);
5404   switches[switchnum].validated = 1;
5405 }
5406 \f
5407 /* Search for a file named NAME trying various prefixes including the
5408    user's -B prefix and some standard ones.
5409    Return the absolute file name found.  If nothing is found, return NAME.  */
5410
5411 static const char *
5412 find_file (name)
5413      const char *name;
5414 {
5415   char *newname;
5416
5417   /* Try multilib_dir if it is defined.  */
5418   if (multilib_dir != NULL)
5419     {
5420       char *try;
5421
5422       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
5423       strcpy (try, multilib_dir);
5424       strcat (try, dir_separator_str);
5425       strcat (try, name);
5426
5427       newname = find_a_file (&startfile_prefixes, try, R_OK);
5428
5429       /* If we don't find it in the multi library dir, then fall
5430          through and look for it in the normal places.  */
5431       if (newname != NULL)
5432         return newname;
5433     }
5434
5435   newname = find_a_file (&startfile_prefixes, name, R_OK);
5436   return newname ? newname : name;
5437 }
5438
5439 /* Determine whether a directory exists.  If LINKER, return 0 for
5440    certain fixed names not needed by the linker.  If not LINKER, it is
5441    only important to return 0 if the host machine has a small ARG_MAX
5442    limit.  */
5443
5444 static int
5445 is_directory (path1, path2, linker)
5446      const char *path1;
5447      const char *path2;
5448      int linker;
5449 {
5450   int len1 = strlen (path1);
5451   int len2 = strlen (path2);
5452   char *path = (char *) alloca (3 + len1 + len2);
5453   char *cp;
5454   struct stat st;
5455
5456 #ifndef SMALL_ARG_MAX
5457   if (! linker)
5458     return 1;
5459 #endif
5460
5461   /* Construct the path from the two parts.  Ensure the string ends with "/.".
5462      The resulting path will be a directory even if the given path is a
5463      symbolic link.  */
5464   memcpy (path, path1, len1);
5465   memcpy (path + len1, path2, len2);
5466   cp = path + len1 + len2;
5467   if (!IS_DIR_SEPARATOR (cp[-1]))
5468     *cp++ = DIR_SEPARATOR;
5469   *cp++ = '.';
5470   *cp = '\0';
5471
5472   /* Exclude directories that the linker is known to search.  */
5473   if (linker
5474       && ((cp - path == 6
5475            && strcmp (path, concat (dir_separator_str, "lib",
5476                                     dir_separator_str, ".", NULL)) == 0)
5477           || (cp - path == 10
5478               && strcmp (path, concat (dir_separator_str, "usr",
5479                                        dir_separator_str, "lib",
5480                                        dir_separator_str, ".", NULL)) == 0)))
5481     return 0;
5482
5483   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5484 }
5485
5486 /* Set up the various global variables to indicate that we're processing
5487    the input file named FILENAME.  */
5488
5489 static void
5490 set_input (filename)
5491      const char *filename;
5492 {
5493   register const char *p;
5494
5495   input_filename = filename;
5496   input_filename_length = strlen (input_filename);
5497
5498   input_basename = input_filename;
5499 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5500   /* Skip drive name so 'x:foo' is handled properly.  */
5501   if (input_basename[1] == ':')
5502     input_basename += 2;
5503 #endif
5504   for (p = input_basename; *p; p++)
5505     if (IS_DIR_SEPARATOR (*p))
5506       input_basename = p + 1;
5507
5508   /* Find a suffix starting with the last period,
5509      and set basename_length to exclude that suffix.  */
5510   basename_length = strlen (input_basename);
5511   suffixed_basename_length = basename_length;
5512   p = input_basename + basename_length;
5513   while (p != input_basename && *p != '.')
5514     --p;
5515   if (*p == '.' && p != input_basename)
5516     {
5517       basename_length = p - input_basename;
5518       input_suffix = p + 1;
5519     }
5520   else
5521     input_suffix = "";
5522 }
5523 \f
5524 /* On fatal signals, delete all the temporary files.  */
5525
5526 static void
5527 fatal_error (signum)
5528      int signum;
5529 {
5530   signal (signum, SIG_DFL);
5531   delete_failure_queue ();
5532   delete_temp_files ();
5533   /* Get the same signal again, this time not handled,
5534      so its normal effect occurs.  */
5535   kill (getpid (), signum);
5536 }
5537
5538 extern int main PARAMS ((int, const char *const *));
5539
5540 int
5541 main (argc, argv)
5542      int argc;
5543      const char *const *argv;
5544 {
5545   size_t i;
5546   int value;
5547   int linker_was_run = 0;
5548   char *explicit_link_files;
5549   char *specs_file;
5550   const char *p;
5551   struct user_specs *uptr;
5552
5553   p = argv[0] + strlen (argv[0]);
5554   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5555     --p;
5556   programname = p;
5557
5558   xmalloc_set_program_name (programname);
5559
5560 #ifdef GCC_DRIVER_HOST_INITIALIZATION
5561   /* Perform host dependant initialization when needed.  */
5562   GCC_DRIVER_HOST_INITIALIZATION;
5563 #endif
5564
5565 /* LC_CTYPE determines the character set used by the terminal so it has be set
5566    to output messages correctly.  */
5567
5568 #ifdef HAVE_LC_MESSAGES
5569   setlocale (LC_CTYPE, "");
5570   setlocale (LC_MESSAGES, "");
5571 #else
5572   setlocale (LC_ALL, "");
5573 #endif
5574
5575   (void) bindtextdomain (PACKAGE, localedir);
5576   (void) textdomain (PACKAGE);
5577
5578   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5579     signal (SIGINT, fatal_error);
5580 #ifdef SIGHUP
5581   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5582     signal (SIGHUP, fatal_error);
5583 #endif
5584   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5585     signal (SIGTERM, fatal_error);
5586 #ifdef SIGPIPE
5587   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5588     signal (SIGPIPE, fatal_error);
5589 #endif
5590 #ifdef SIGCHLD
5591   /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
5592      receive the signal.  A different setting is inheritable */
5593   signal (SIGCHLD, SIG_DFL);
5594 #endif
5595
5596   argbuf_length = 10;
5597   argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
5598
5599   obstack_init (&obstack);
5600
5601   /* Build multilib_select, et. al from the separate lines that make up each
5602      multilib selection.  */
5603   {
5604     const char *const *q = multilib_raw;
5605     int need_space;
5606
5607     obstack_init (&multilib_obstack);
5608     while ((p = *q++) != (char *) 0)
5609       obstack_grow (&multilib_obstack, p, strlen (p));
5610
5611     obstack_1grow (&multilib_obstack, 0);
5612     multilib_select = obstack_finish (&multilib_obstack);
5613
5614     q = multilib_matches_raw;
5615     while ((p = *q++) != (char *) 0)
5616       obstack_grow (&multilib_obstack, p, strlen (p));
5617
5618     obstack_1grow (&multilib_obstack, 0);
5619     multilib_matches = obstack_finish (&multilib_obstack);
5620
5621     q = multilib_exclusions_raw;
5622     while ((p = *q++) != (char *) 0)
5623       obstack_grow (&multilib_obstack, p, strlen (p));
5624
5625     obstack_1grow (&multilib_obstack, 0);
5626     multilib_exclusions = obstack_finish (&multilib_obstack);
5627
5628     need_space = FALSE;
5629     for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
5630       {
5631         if (need_space)
5632           obstack_1grow (&multilib_obstack, ' ');
5633         obstack_grow (&multilib_obstack,
5634                       multilib_defaults_raw[i],
5635                       strlen (multilib_defaults_raw[i]));
5636         need_space = TRUE;
5637       }
5638
5639     obstack_1grow (&multilib_obstack, 0);
5640     multilib_defaults = obstack_finish (&multilib_obstack);
5641   }
5642
5643   /* Set up to remember the pathname of gcc and any options
5644      needed for collect.  We use argv[0] instead of programname because
5645      we need the complete pathname.  */
5646   obstack_init (&collect_obstack);
5647   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
5648   obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
5649   putenv (obstack_finish (&collect_obstack));
5650
5651 #ifdef INIT_ENVIRONMENT
5652   /* Set up any other necessary machine specific environment variables.  */
5653   putenv (INIT_ENVIRONMENT);
5654 #endif
5655
5656   /* Make a table of what switches there are (switches, n_switches).
5657      Make a table of specified input files (infiles, n_infiles).
5658      Decode switches that are handled locally.  */
5659
5660   process_command (argc, argv);
5661
5662   {
5663     int first_time;
5664
5665     /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5666        the compiler.  */
5667     obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5668                   sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5669
5670     first_time = TRUE;
5671     for (i = 0; (int) i < n_switches; i++)
5672       {
5673         const char *const *args;
5674         const char *p, *q;
5675         if (!first_time)
5676           obstack_grow (&collect_obstack, " ", 1);
5677
5678         first_time = FALSE;
5679         obstack_grow (&collect_obstack, "'-", 2);
5680         q = switches[i].part1;
5681         while ((p = strchr (q, '\'')))
5682           {
5683             obstack_grow (&collect_obstack, q, p - q);
5684             obstack_grow (&collect_obstack, "'\\''", 4);
5685             q = ++p;
5686           }
5687         obstack_grow (&collect_obstack, q, strlen (q));
5688         obstack_grow (&collect_obstack, "'", 1);
5689
5690         for (args = switches[i].args; args && *args; args++)
5691           {
5692             obstack_grow (&collect_obstack, " '", 2);
5693             q = *args;
5694             while ((p = strchr (q, '\'')))
5695               {
5696                 obstack_grow (&collect_obstack, q, p - q);
5697                 obstack_grow (&collect_obstack, "'\\''", 4);
5698                 q = ++p;
5699               }
5700             obstack_grow (&collect_obstack, q, strlen (q));
5701             obstack_grow (&collect_obstack, "'", 1);
5702           }
5703       }
5704     obstack_grow (&collect_obstack, "\0", 1);
5705     putenv (obstack_finish (&collect_obstack));
5706   }
5707
5708   /* Initialize the vector of specs to just the default.
5709      This means one element containing 0s, as a terminator.  */
5710
5711   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
5712   memcpy ((char *) compilers, (char *) default_compilers,
5713           sizeof default_compilers);
5714   n_compilers = n_default_compilers;
5715
5716   /* Read specs from a file if there is one.  */
5717
5718   machine_suffix = concat (spec_machine, dir_separator_str,
5719                            spec_version, dir_separator_str, NULL);
5720   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
5721
5722   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
5723   /* Read the specs file unless it is a default one.  */
5724   if (specs_file != 0 && strcmp (specs_file, "specs"))
5725     read_specs (specs_file, TRUE);
5726   else
5727     init_spec ();
5728
5729   /* We need to check standard_exec_prefix/just_machine_suffix/specs
5730      for any override of as, ld and libraries.  */
5731   specs_file = (char *) alloca (strlen (standard_exec_prefix)
5732                                 + strlen (just_machine_suffix)
5733                                 + sizeof ("specs"));
5734
5735   strcpy (specs_file, standard_exec_prefix);
5736   strcat (specs_file, just_machine_suffix);
5737   strcat (specs_file, "specs");
5738   if (access (specs_file, R_OK) == 0)
5739     read_specs (specs_file, TRUE);
5740
5741   /* If not cross-compiling, look for startfiles in the standard places.  */
5742   if (*cross_compile == '0')
5743     {
5744       if (*md_exec_prefix)
5745         {
5746           add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
5747                       PREFIX_PRIORITY_LAST, 0, NULL);
5748           add_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
5749                       PREFIX_PRIORITY_LAST, 0, NULL);
5750         }
5751
5752       if (*md_startfile_prefix)
5753         add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5754                     PREFIX_PRIORITY_LAST, 0, NULL);
5755
5756       if (*md_startfile_prefix_1)
5757         add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5758                     PREFIX_PRIORITY_LAST, 0, NULL);
5759
5760       /* If standard_startfile_prefix is relative, base it on
5761          standard_exec_prefix.  This lets us move the installed tree
5762          as a unit.  If GCC_EXEC_PREFIX is defined, base
5763          standard_startfile_prefix on that as well.  */
5764       if (IS_ABSOLUTE_PATHNAME (standard_startfile_prefix))
5765         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5766                     PREFIX_PRIORITY_LAST, 0, NULL);
5767       else
5768         {
5769           if (gcc_exec_prefix)
5770             add_prefix (&startfile_prefixes,
5771                         concat (gcc_exec_prefix, machine_suffix,
5772                                 standard_startfile_prefix, NULL),
5773                         NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5774           add_prefix (&startfile_prefixes,
5775                       concat (standard_exec_prefix,
5776                               machine_suffix,
5777                               standard_startfile_prefix, NULL),
5778                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5779         }
5780
5781       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5782                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5783       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5784                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5785 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
5786       add_prefix (&startfile_prefixes, "./", NULL,
5787                   PREFIX_PRIORITY_LAST, 1, NULL);
5788 #endif
5789     }
5790   else
5791     {
5792       if (!IS_ABSOLUTE_PATHNAME (standard_startfile_prefix)
5793           && gcc_exec_prefix)
5794         add_prefix (&startfile_prefixes,
5795                     concat (gcc_exec_prefix, machine_suffix,
5796                             standard_startfile_prefix, NULL),
5797                     "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5798     }
5799
5800   /* Process any user specified specs in the order given on the command
5801      line.  */
5802   for (uptr = user_specs_head; uptr; uptr = uptr->next)
5803     {
5804       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5805       read_specs (filename ? filename : uptr->filename, FALSE);
5806     }
5807
5808   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
5809   if (gcc_exec_prefix)
5810     {
5811       char *temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5812                                      + strlen (spec_version)
5813                                      + strlen (spec_machine) + 3);
5814       strcpy (temp, gcc_exec_prefix);
5815       strcat (temp, spec_machine);
5816       strcat (temp, dir_separator_str);
5817       strcat (temp, spec_version);
5818       strcat (temp, dir_separator_str);
5819       gcc_exec_prefix = temp;
5820     }
5821
5822   /* Now we have the specs.
5823      Set the `valid' bits for switches that match anything in any spec.  */
5824
5825   validate_all_switches ();
5826
5827   /* Now that we have the switches and the specs, set
5828      the subdirectory based on the options.  */
5829   set_multilib_dir ();
5830
5831   /* Warn about any switches that no pass was interested in.  */
5832
5833   for (i = 0; (int) i < n_switches; i++)
5834     if (! switches[i].validated)
5835       error ("unrecognized option `-%s'", switches[i].part1);
5836
5837   /* Obey some of the options.  */
5838
5839   if (print_search_dirs)
5840     {
5841       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5842       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5843       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
5844       return (0);
5845     }
5846
5847   if (print_file_name)
5848     {
5849       printf ("%s\n", find_file (print_file_name));
5850       return (0);
5851     }
5852
5853   if (print_prog_name)
5854     {
5855       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
5856       printf ("%s\n", (newname ? newname : print_prog_name));
5857       return (0);
5858     }
5859
5860   if (print_multi_lib)
5861     {
5862       print_multilib_info ();
5863       return (0);
5864     }
5865
5866   if (print_multi_directory)
5867     {
5868       if (multilib_dir == NULL)
5869         printf (".\n");
5870       else
5871         printf ("%s\n", multilib_dir);
5872       return (0);
5873     }
5874
5875   if (target_help_flag)
5876    {
5877       /* Print if any target specific options.*/
5878
5879       /* We do not exit here. Instead we have created a fake input file
5880          called 'target-dummy' which needs to be compiled, and we pass this
5881          on to the various sub-processes, along with the --target-help
5882          switch. */
5883     }
5884
5885   if (print_help_list)
5886     {
5887       display_help ();
5888
5889       if (! verbose_flag)
5890         {
5891           printf (_("\nFor bug reporting instructions, please see:\n"));
5892           printf ("%s.\n", GCCBUGURL);
5893
5894           return (0);
5895         }
5896
5897       /* We do not exit here.  Instead we have created a fake input file
5898          called 'help-dummy' which needs to be compiled, and we pass this
5899          on the the various sub-processes, along with the --help switch.  */
5900     }
5901
5902   if (verbose_flag)
5903     {
5904       int n;
5905       const char *thrmod;
5906
5907       notice ("Configured with: %s\n", configuration_arguments);
5908
5909 #ifdef THREAD_MODEL_SPEC
5910       /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
5911          but there's no point in doing all this processing just to get
5912          thread_model back.  */
5913       obstack_init (&obstack);
5914       do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
5915       obstack_1grow (&obstack, '\0');
5916       thrmod = obstack_finish (&obstack);
5917 #else
5918       thrmod = thread_model;
5919 #endif
5920
5921       notice ("Thread model: %s\n", thrmod);
5922
5923       /* compiler_version is truncated at the first space when initialized
5924          from version string, so truncate version_string at the first space
5925          before comparing.  */
5926       for (n = 0; version_string[n]; n++)
5927         if (version_string[n] == ' ')
5928           break;
5929
5930       if (! strncmp (version_string, compiler_version, n)
5931           && compiler_version[n] == 0)
5932         notice ("gcc version %s\n", version_string);
5933       else
5934         notice ("gcc driver version %s executing gcc version %s\n",
5935                 version_string, compiler_version);
5936
5937       if (n_infiles == 0)
5938         return (0);
5939     }
5940
5941   if (n_infiles == added_libraries)
5942     fatal ("No input files");
5943
5944   /* Make a place to record the compiler output file names
5945      that correspond to the input files.  */
5946
5947   i = n_infiles;
5948   i += lang_specific_extra_outfiles;
5949   outfiles = (const char **) xcalloc (i, sizeof (char *));
5950
5951   /* Record which files were specified explicitly as link input.  */
5952
5953   explicit_link_files = xcalloc (1, n_infiles);
5954
5955   for (i = 0; (int) i < n_infiles; i++)
5956     {
5957       int this_file_error = 0;
5958
5959       /* Tell do_spec what to substitute for %i.  */
5960
5961       input_file_number = i;
5962       set_input (infiles[i].name);
5963
5964       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5965
5966       outfiles[i] = input_filename;
5967
5968       /* Figure out which compiler from the file's suffix.  */
5969
5970       input_file_compiler
5971         = lookup_compiler (infiles[i].name, input_filename_length,
5972                            infiles[i].language);
5973       
5974       if (input_file_compiler)
5975         {
5976           /* Ok, we found an applicable compiler.  Run its spec.  */
5977
5978           if (input_file_compiler->spec[0] == '#')
5979             error ("%s: %s compiler not installed on this system",
5980                    input_filename, &input_file_compiler->spec[1]);
5981           value = do_spec (input_file_compiler->spec);
5982           if (value < 0)
5983             this_file_error = 1;
5984         }
5985
5986       /* If this file's name does not contain a recognized suffix,
5987          record it as explicit linker input.  */
5988
5989       else
5990         explicit_link_files[i] = 1;
5991
5992       /* Clear the delete-on-failure queue, deleting the files in it
5993          if this compilation failed.  */
5994
5995       if (this_file_error)
5996         {
5997           delete_failure_queue ();
5998           error_count++;
5999         }
6000       /* If this compilation succeeded, don't delete those files later.  */
6001       clear_failure_queue ();
6002     }
6003
6004   /* Reset the output file name to the first input file name, for use
6005      with %b in LINK_SPEC on a target that prefers not to emit a.out
6006      by default.  */
6007   if (n_infiles > 0)
6008     set_input (infiles[0].name);
6009
6010   if (error_count == 0)
6011     {
6012       /* Make sure INPUT_FILE_NUMBER points to first available open
6013          slot.  */
6014       input_file_number = n_infiles;
6015       if (lang_specific_pre_link ())
6016         error_count++;
6017     }
6018
6019   /* Run ld to link all the compiler output files.  */
6020
6021   if (error_count == 0)
6022     {
6023       int tmp = execution_count;
6024
6025       /* We'll use ld if we can't find collect2.  */
6026       if (! strcmp (linker_name_spec, "collect2"))
6027         {
6028           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
6029           if (s == NULL)
6030             linker_name_spec = "ld";
6031         }
6032       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
6033          for collect.  */
6034       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
6035       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
6036
6037       value = do_spec (link_command_spec);
6038       if (value < 0)
6039         error_count = 1;
6040       linker_was_run = (tmp != execution_count);
6041     }
6042
6043   /* If options said don't run linker,
6044      complain about input files to be given to the linker.  */
6045
6046   if (! linker_was_run && error_count == 0)
6047     for (i = 0; (int) i < n_infiles; i++)
6048       if (explicit_link_files[i])
6049         error ("%s: linker input file unused because linking not done",
6050                outfiles[i]);
6051
6052   /* Delete some or all of the temporary files we made.  */
6053
6054   if (error_count)
6055     delete_failure_queue ();
6056   delete_temp_files ();
6057
6058   if (print_help_list)
6059     {
6060       printf (("\nFor bug reporting instructions, please see:\n"));
6061       printf ("%s\n", GCCBUGURL);
6062     }
6063
6064   return (signal_count != 0 ? 2
6065           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
6066           : 0);
6067 }
6068
6069 /* Find the proper compilation spec for the file name NAME,
6070    whose length is LENGTH.  LANGUAGE is the specified language,
6071    or 0 if this file is to be passed to the linker.  */
6072
6073 static struct compiler *
6074 lookup_compiler (name, length, language)
6075      const char *name;
6076      size_t length;
6077      const char *language;
6078 {
6079   struct compiler *cp;
6080
6081   /* If this was specified by the user to be a linker input, indicate that.  */
6082   if (language != 0 && language[0] == '*')
6083     return 0;
6084
6085   /* Otherwise, look for the language, if one is spec'd.  */
6086   if (language != 0)
6087     {
6088       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6089         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
6090           return cp;
6091
6092       error ("language %s not recognized", language);
6093       return 0;
6094     }
6095
6096   /* Look for a suffix.  */
6097   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6098     {
6099       if (/* The suffix `-' matches only the file name `-'.  */
6100           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6101           || (strlen (cp->suffix) < length
6102               /* See if the suffix matches the end of NAME.  */
6103               && !strcmp (cp->suffix,
6104                           name + length - strlen (cp->suffix))
6105          ))
6106         break;
6107     }
6108
6109 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6110   /* look again, but case-insensitively this time.  */
6111   if (cp < compilers)
6112     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6113       {
6114         if (/* The suffix `-' matches only the file name `-'.  */
6115             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6116             || (strlen (cp->suffix) < length
6117                 /* See if the suffix matches the end of NAME.  */
6118                 && ((!strcmp (cp->suffix,
6119                              name + length - strlen (cp->suffix))
6120                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
6121                     && !strcasecmp (cp->suffix,
6122                                     name + length - strlen (cp->suffix)))
6123            ))
6124           break;
6125       }
6126 #endif
6127
6128   if (cp >= compilers)
6129     {
6130       if (cp->spec[0] != '@')
6131         /* A non-alias entry: return it.  */
6132         return cp;
6133
6134       /* An alias entry maps a suffix to a language.
6135          Search for the language; pass 0 for NAME and LENGTH
6136          to avoid infinite recursion if language not found.  */
6137       return lookup_compiler (NULL, 0, cp->spec + 1);
6138     }
6139   return 0;
6140 }
6141 \f
6142 static char *
6143 save_string (s, len)
6144      const char *s;
6145      int len;
6146 {
6147   register char *result = xmalloc (len + 1);
6148
6149   memcpy (result, s, len);
6150   result[len] = 0;
6151   return result;
6152 }
6153
6154 void
6155 pfatal_with_name (name)
6156      const char *name;
6157 {
6158   perror_with_name (name);
6159   delete_temp_files ();
6160   exit (1);
6161 }
6162
6163 static void
6164 perror_with_name (name)
6165      const char *name;
6166 {
6167   error ("%s: %s", name, xstrerror (errno));
6168 }
6169
6170 static void
6171 pfatal_pexecute (errmsg_fmt, errmsg_arg)
6172      const char *errmsg_fmt;
6173      const char *errmsg_arg;
6174 {
6175   if (errmsg_arg)
6176     {
6177       int save_errno = errno;
6178
6179       /* Space for trailing '\0' is in %s.  */
6180       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
6181       sprintf (msg, errmsg_fmt, errmsg_arg);
6182       errmsg_fmt = msg;
6183
6184       errno = save_errno;
6185     }
6186
6187   pfatal_with_name (errmsg_fmt);
6188 }
6189
6190 /* Output an error message and exit */
6191
6192 void
6193 fancy_abort ()
6194 {
6195   fatal ("Internal gcc abort.");
6196 }
6197 \f
6198 /* Output an error message and exit */
6199
6200 void
6201 fatal VPARAMS ((const char *msgid, ...))
6202 {
6203 #ifndef ANSI_PROTOTYPES
6204   const char *msgid;
6205 #endif
6206   va_list ap;
6207
6208   VA_START (ap, msgid);
6209
6210 #ifndef ANSI_PROTOTYPES
6211   msgid = va_arg (ap, const char *);
6212 #endif
6213
6214   fprintf (stderr, "%s: ", programname);
6215   vfprintf (stderr, _(msgid), ap);
6216   va_end (ap);
6217   fprintf (stderr, "\n");
6218   delete_temp_files ();
6219   exit (1);
6220 }
6221
6222 void
6223 error VPARAMS ((const char *msgid, ...))
6224 {
6225 #ifndef ANSI_PROTOTYPES
6226   const char *msgid;
6227 #endif
6228   va_list ap;
6229
6230   VA_START (ap, msgid);
6231
6232 #ifndef ANSI_PROTOTYPES
6233   msgid = va_arg (ap, const char *);
6234 #endif
6235
6236   fprintf (stderr, "%s: ", programname);
6237   vfprintf (stderr, _(msgid), ap);
6238   va_end (ap);
6239
6240   fprintf (stderr, "\n");
6241 }
6242
6243 static void
6244 notice VPARAMS ((const char *msgid, ...))
6245 {
6246 #ifndef ANSI_PROTOTYPES
6247   const char *msgid;
6248 #endif
6249   va_list ap;
6250
6251   VA_START (ap, msgid);
6252
6253 #ifndef ANSI_PROTOTYPES
6254   msgid = va_arg (ap, const char *);
6255 #endif
6256
6257   vfprintf (stderr, _(msgid), ap);
6258   va_end (ap);
6259 }
6260 \f
6261 static void
6262 validate_all_switches ()
6263 {
6264   struct compiler *comp;
6265   register const char *p;
6266   register char c;
6267   struct spec_list *spec;
6268
6269   for (comp = compilers; comp->spec; comp++)
6270     {
6271       p = comp->spec;
6272       while ((c = *p++))
6273         if (c == '%' && *p == '{')
6274           /* We have a switch spec.  */
6275           validate_switches (p + 1);
6276     }
6277
6278   /* Look through the linked list of specs read from the specs file.  */
6279   for (spec = specs; spec; spec = spec->next)
6280     {
6281       p = *(spec->ptr_spec);
6282       while ((c = *p++))
6283         if (c == '%' && *p == '{')
6284           /* We have a switch spec.  */
6285           validate_switches (p + 1);
6286     }
6287
6288   p = link_command_spec;
6289   while ((c = *p++))
6290     if (c == '%' && *p == '{')
6291       /* We have a switch spec.  */
6292       validate_switches (p + 1);
6293 }
6294
6295 /* Look at the switch-name that comes after START
6296    and mark as valid all supplied switches that match it.  */
6297
6298 static void
6299 validate_switches (start)
6300      const char *start;
6301 {
6302   register const char *p = start;
6303   const char *filter;
6304   register int i;
6305   int suffix;
6306
6307   if (*p == '|')
6308     ++p;
6309
6310 next_member:
6311   if (*p == '!')
6312     ++p;
6313
6314   suffix = 0;
6315   if (*p == '.')
6316     suffix = 1, ++p;
6317
6318   filter = p;
6319   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
6320     p++;
6321
6322   if (suffix)
6323     ;
6324   else if (p[-1] == '*')
6325     {
6326       /* Mark all matching switches as valid.  */
6327       for (i = 0; i < n_switches; i++)
6328         if (!strncmp (switches[i].part1, filter, p - filter - 1))
6329           switches[i].validated = 1;
6330     }
6331   else
6332     {
6333       /* Mark an exact matching switch as valid.  */
6334       for (i = 0; i < n_switches; i++)
6335         {
6336           if (!strncmp (switches[i].part1, filter, p - filter)
6337               && switches[i].part1[p - filter] == 0)
6338             switches[i].validated = 1;
6339         }
6340     }
6341
6342   if (*p++ == '|' || p[-1] == '&')
6343     goto next_member;
6344 }
6345 \f
6346 /* Check whether a particular argument was used.  The first time we
6347    canonicalize the switches to keep only the ones we care about.  */
6348
6349 static int
6350 used_arg (p, len)
6351      const char *p;
6352      int len;
6353 {
6354   struct mswitchstr
6355   {
6356     const char *str;
6357     const char *replace;
6358     int len;
6359     int rep_len;
6360   };
6361
6362   static struct mswitchstr *mswitches;
6363   static int n_mswitches;
6364   int i, j;
6365
6366   if (!mswitches)
6367     {
6368       struct mswitchstr *matches;
6369       const char *q;
6370       int cnt = 0;
6371
6372       /* Break multilib_matches into the component strings of string
6373          and replacement string.  */
6374       for (q = multilib_matches; *q != '\0'; q++)
6375         if (*q == ';')
6376           cnt++;
6377
6378       matches =
6379         (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
6380       i = 0;
6381       q = multilib_matches;
6382       while (*q != '\0')
6383         {
6384           matches[i].str = q;
6385           while (*q != ' ')
6386             {
6387               if (*q == '\0')
6388                 abort ();
6389               q++;
6390             }
6391           matches[i].len = q - matches[i].str;
6392
6393           matches[i].replace = ++q;
6394           while (*q != ';' && *q != '\0')
6395             {
6396               if (*q == ' ')
6397                 abort ();
6398               q++;
6399             }
6400           matches[i].rep_len = q - matches[i].replace;
6401           i++;
6402           if (*q == ';')
6403             q++;
6404         }
6405
6406       /* Now build a list of the replacement string for switches that we care
6407          about.  Make sure we allocate at least one entry.  This prevents
6408          xmalloc from calling fatal, and prevents us from re-executing this
6409          block of code.  */
6410       mswitches
6411         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
6412                                          * (n_switches ? n_switches : 1));
6413       for (i = 0; i < n_switches; i++)
6414         {
6415           int xlen = strlen (switches[i].part1);
6416           for (j = 0; j < cnt; j++)
6417             if (xlen == matches[j].len
6418                 && ! strncmp (switches[i].part1, matches[j].str, xlen))
6419               {
6420                 mswitches[n_mswitches].str = matches[j].replace;
6421                 mswitches[n_mswitches].len = matches[j].rep_len;
6422                 mswitches[n_mswitches].replace = (char *) 0;
6423                 mswitches[n_mswitches].rep_len = 0;
6424                 n_mswitches++;
6425                 break;
6426               }
6427         }
6428     }
6429
6430   for (i = 0; i < n_mswitches; i++)
6431     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
6432       return 1;
6433
6434   return 0;
6435 }
6436
6437 static int
6438 default_arg (p, len)
6439      const char *p;
6440      int len;
6441 {
6442   const char *start, *end;
6443
6444   for (start = multilib_defaults; *start != '\0'; start = end + 1)
6445     {
6446       while (*start == ' ' || *start == '\t')
6447         start++;
6448
6449       if (*start == '\0')
6450         break;
6451
6452       for (end = start + 1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
6453         ;
6454
6455       if ((end - start) == len && strncmp (p, start, len) == 0)
6456         return 1;
6457
6458       if (*end == '\0')
6459         break;
6460     }
6461
6462   return 0;
6463 }
6464
6465 /* Work out the subdirectory to use based on the options. The format of
6466    multilib_select is a list of elements. Each element is a subdirectory
6467    name followed by a list of options followed by a semicolon. The format
6468    of multilib_exclusions is the same, but without the preceding
6469    directory. First gcc will check the exclusions, if none of the options
6470    beginning with an exclamation point are present, and all of the other
6471    options are present, then we will ignore this completely. Passing
6472    that, gcc will consider each multilib_select in turn using the same
6473    rules for matching the options. If a match is found, that subdirectory
6474    will be used.  */
6475
6476 static void
6477 set_multilib_dir ()
6478 {
6479   const char *p;
6480   unsigned int this_path_len;
6481   const char *this_path, *this_arg;
6482   int not_arg;
6483   int ok;
6484
6485   p = multilib_exclusions;
6486   while (*p != '\0')
6487     {
6488       /* Ignore newlines.  */
6489       if (*p == '\n')
6490         {
6491           ++p;
6492           continue;
6493         }
6494
6495       /* Check the arguments.  */
6496       ok = 1;
6497       while (*p != ';')
6498         {
6499           if (*p == '\0')
6500             abort ();
6501
6502           if (! ok)
6503             {
6504               ++p;
6505               continue;
6506             }
6507
6508           this_arg = p;
6509           while (*p != ' ' && *p != ';')
6510             {
6511               if (*p == '\0')
6512                 abort ();
6513               ++p;
6514             }
6515
6516           if (*this_arg != '!')
6517             not_arg = 0;
6518           else
6519             {
6520               not_arg = 1;
6521               ++this_arg;
6522             }
6523
6524           ok = used_arg (this_arg, p - this_arg);
6525           if (not_arg)
6526             ok = ! ok;
6527
6528           if (*p == ' ')
6529             ++p;
6530         }
6531
6532       if (ok)
6533         return;
6534
6535       ++p;
6536     }
6537
6538   p = multilib_select;
6539   while (*p != '\0')
6540     {
6541       /* Ignore newlines.  */
6542       if (*p == '\n')
6543         {
6544           ++p;
6545           continue;
6546         }
6547
6548       /* Get the initial path.  */
6549       this_path = p;
6550       while (*p != ' ')
6551         {
6552           if (*p == '\0')
6553             abort ();
6554           ++p;
6555         }
6556       this_path_len = p - this_path;
6557
6558       /* Check the arguments.  */
6559       ok = 1;
6560       ++p;
6561       while (*p != ';')
6562         {
6563           if (*p == '\0')
6564             abort ();
6565
6566           if (! ok)
6567             {
6568               ++p;
6569               continue;
6570             }
6571
6572           this_arg = p;
6573           while (*p != ' ' && *p != ';')
6574             {
6575               if (*p == '\0')
6576                 abort ();
6577               ++p;
6578             }
6579
6580           if (*this_arg != '!')
6581             not_arg = 0;
6582           else
6583             {
6584               not_arg = 1;
6585               ++this_arg;
6586             }
6587
6588           /* If this is a default argument, we can just ignore it.
6589              This is true even if this_arg begins with '!'.  Beginning
6590              with '!' does not mean that this argument is necessarily
6591              inappropriate for this library: it merely means that
6592              there is a more specific library which uses this
6593              argument.  If this argument is a default, we need not
6594              consider that more specific library.  */
6595           if (! default_arg (this_arg, p - this_arg))
6596             {
6597               ok = used_arg (this_arg, p - this_arg);
6598               if (not_arg)
6599                 ok = ! ok;
6600             }
6601
6602           if (*p == ' ')
6603             ++p;
6604         }
6605
6606       if (ok)
6607         {
6608           if (this_path_len != 1
6609               || this_path[0] != '.')
6610             {
6611               char *new_multilib_dir = xmalloc (this_path_len + 1);
6612               strncpy (new_multilib_dir, this_path, this_path_len);
6613               new_multilib_dir[this_path_len] = '\0';
6614               multilib_dir = new_multilib_dir;
6615             }
6616           break;
6617         }
6618
6619       ++p;
6620     }
6621 }
6622
6623 /* Print out the multiple library subdirectory selection
6624    information.  This prints out a series of lines.  Each line looks
6625    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6626    required.  Only the desired options are printed out, the negative
6627    matches.  The options are print without a leading dash.  There are
6628    no spaces to make it easy to use the information in the shell.
6629    Each subdirectory is printed only once.  This assumes the ordering
6630    generated by the genmultilib script. Also, we leave out ones that match
6631    the exclusions.  */
6632
6633 static void
6634 print_multilib_info ()
6635 {
6636   const char *p = multilib_select;
6637   const char *last_path = 0, *this_path;
6638   int skip;
6639   unsigned int last_path_len = 0;
6640
6641   while (*p != '\0')
6642     {
6643       skip = 0;
6644       /* Ignore newlines.  */
6645       if (*p == '\n')
6646         {
6647           ++p;
6648           continue;
6649         }
6650
6651       /* Get the initial path.  */
6652       this_path = p;
6653       while (*p != ' ')
6654         {
6655           if (*p == '\0')
6656             abort ();
6657           ++p;
6658         }
6659
6660       /* Check for matches with the multilib_exclusions. We don't bother
6661          with the '!' in either list. If any of the exclusion rules match
6662          all of its options with the select rule, we skip it.  */
6663       {
6664         const char *e = multilib_exclusions;
6665         const char *this_arg;
6666
6667         while (*e != '\0')
6668           {
6669             int m = 1;
6670             /* Ignore newlines.  */
6671             if (*e == '\n')
6672               {
6673                 ++e;
6674                 continue;
6675               }
6676
6677             /* Check the arguments.  */
6678             while (*e != ';')
6679               {
6680                 const char *q;
6681                 int mp = 0;
6682
6683                 if (*e == '\0')
6684                   abort ();
6685
6686                 if (! m)
6687                   {
6688                     ++e;
6689                     continue;
6690                   }
6691
6692                 this_arg = e;
6693
6694                 while (*e != ' ' && *e != ';')
6695                   {
6696                     if (*e == '\0')
6697                       abort ();
6698                     ++e;
6699                   }
6700
6701                 q = p + 1;
6702                 while (*q != ';')
6703                   {
6704                     const char *arg;
6705                     int len = e - this_arg;
6706
6707                     if (*q == '\0')
6708                       abort ();
6709
6710                     arg = q;
6711
6712                     while (*q != ' ' && *q != ';')
6713                       {
6714                         if (*q == '\0')
6715                           abort ();
6716                         ++q;
6717                       }
6718
6719                     if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6720                         default_arg (this_arg, e - this_arg))
6721                       {
6722                         mp = 1;
6723                         break;
6724                       }
6725
6726                     if (*q == ' ')
6727                       ++q;
6728                   }
6729
6730                 if (! mp)
6731                   m = 0;
6732
6733                 if (*e == ' ')
6734                   ++e;
6735               }
6736
6737             if (m)
6738               {
6739                 skip = 1;
6740                 break;
6741               }
6742
6743             if (*e != '\0')
6744               ++e;
6745           }
6746       }
6747
6748       if (! skip)
6749         {
6750           /* If this is a duplicate, skip it.  */
6751           skip = (last_path != 0 && (unsigned int) (p - this_path) == last_path_len
6752                   && ! strncmp (last_path, this_path, last_path_len));
6753
6754           last_path = this_path;
6755           last_path_len = p - this_path;
6756         }
6757
6758       /* If this directory requires any default arguments, we can skip
6759          it.  We will already have printed a directory identical to
6760          this one which does not require that default argument.  */
6761       if (! skip)
6762         {
6763           const char *q;
6764
6765           q = p + 1;
6766           while (*q != ';')
6767             {
6768               const char *arg;
6769
6770               if (*q == '\0')
6771                 abort ();
6772
6773               if (*q == '!')
6774                 arg = NULL;
6775               else
6776                 arg = q;
6777
6778               while (*q != ' ' && *q != ';')
6779                 {
6780                   if (*q == '\0')
6781                     abort ();
6782                   ++q;
6783                 }
6784
6785               if (arg != NULL
6786                   && default_arg (arg, q - arg))
6787                 {
6788                   skip = 1;
6789                   break;
6790                 }
6791
6792               if (*q == ' ')
6793                 ++q;
6794             }
6795         }
6796
6797       if (! skip)
6798         {
6799           const char *p1;
6800
6801           for (p1 = last_path; p1 < p; p1++)
6802             putchar (*p1);
6803           putchar (';');
6804         }
6805
6806       ++p;
6807       while (*p != ';')
6808         {
6809           int use_arg;
6810
6811           if (*p == '\0')
6812             abort ();
6813
6814           if (skip)
6815             {
6816               ++p;
6817               continue;
6818             }
6819
6820           use_arg = *p != '!';
6821
6822           if (use_arg)
6823             putchar ('@');
6824
6825           while (*p != ' ' && *p != ';')
6826             {
6827               if (*p == '\0')
6828                 abort ();
6829               if (use_arg)
6830                 putchar (*p);
6831               ++p;
6832             }
6833
6834           if (*p == ' ')
6835             ++p;
6836         }
6837
6838       if (! skip)
6839         {
6840           /* If there are extra options, print them now.  */
6841           if (multilib_extra && *multilib_extra)
6842             {
6843               int print_at = TRUE;
6844               const char *q;
6845
6846               for (q = multilib_extra; *q != '\0'; q++)
6847                 {
6848                   if (*q == ' ')
6849                     print_at = TRUE;
6850                   else
6851                     {
6852                       if (print_at)
6853                         putchar ('@');
6854                       putchar (*q);
6855                       print_at = FALSE;
6856                     }
6857                 }
6858             }
6859
6860           putchar ('\n');
6861         }
6862
6863       ++p;
6864     }
6865 }