OSDN Git Service

* doc/extend.texi (Arrays and pointers implementation): Document
[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 void set_collect_gcc_options PARAMS ((void));
293 static int do_spec_1            PARAMS ((const char *, int, const char *));
294 static const char *find_file    PARAMS ((const char *));
295 static int is_directory         PARAMS ((const char *, const char *, int));
296 static void validate_switches   PARAMS ((const char *));
297 static void validate_all_switches PARAMS ((void));
298 static void give_switch         PARAMS ((int, int, int));
299 static int used_arg             PARAMS ((const char *, int));
300 static int default_arg          PARAMS ((const char *, int));
301 static void set_multilib_dir    PARAMS ((void));
302 static void print_multilib_info PARAMS ((void));
303 static void perror_with_name    PARAMS ((const char *));
304 static void pfatal_pexecute     PARAMS ((const char *, const char *))
305   ATTRIBUTE_NORETURN;
306 static void notice              PARAMS ((const char *, ...))
307   ATTRIBUTE_PRINTF_1;
308 static void display_help        PARAMS ((void));
309 static void add_preprocessor_option     PARAMS ((const char *, int));
310 static void add_assembler_option        PARAMS ((const char *, int));
311 static void add_linker_option           PARAMS ((const char *, int));
312 static void process_command             PARAMS ((int, const char *const *));
313 static int execute                      PARAMS ((void));
314 static void clear_args                  PARAMS ((void));
315 static void fatal_error                 PARAMS ((int));
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
3964 /* Store switches not filtered out but %{<S} in spec in COLLECT_GCC_OPTIONS
3965    and place that in the environment.  */
3966
3967 static void
3968 set_collect_gcc_options ()
3969 {
3970   int i;
3971   int first_time;
3972
3973   /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
3974      the compiler.  */
3975   obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
3976                 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
3977
3978   first_time = TRUE;
3979   for (i = 0; (int) i < n_switches; i++)
3980     {
3981       const char *const *args;
3982       const char *p, *q;
3983       if (!first_time)
3984         obstack_grow (&collect_obstack, " ", 1);
3985
3986       first_time = FALSE;
3987
3988       /* Ignore elided switches.  */
3989       if (switches[i].live_cond == SWITCH_IGNORE)
3990         continue;
3991
3992       obstack_grow (&collect_obstack, "'-", 2);
3993       q = switches[i].part1;
3994       while ((p = strchr (q, '\'')))
3995         {
3996           obstack_grow (&collect_obstack, q, p - q);
3997           obstack_grow (&collect_obstack, "'\\''", 4);
3998           q = ++p;
3999         }
4000       obstack_grow (&collect_obstack, q, strlen (q));
4001       obstack_grow (&collect_obstack, "'", 1);
4002
4003       for (args = switches[i].args; args && *args; args++)
4004         {
4005           obstack_grow (&collect_obstack, " '", 2);
4006           q = *args;
4007           while ((p = strchr (q, '\'')))
4008             {
4009               obstack_grow (&collect_obstack, q, p - q);
4010               obstack_grow (&collect_obstack, "'\\''", 4);
4011               q = ++p;
4012             }
4013           obstack_grow (&collect_obstack, q, strlen (q));
4014           obstack_grow (&collect_obstack, "'", 1);
4015         }
4016     }
4017   obstack_grow (&collect_obstack, "\0", 1);
4018   putenv (obstack_finish (&collect_obstack));
4019 }
4020 \f
4021 /* Process a spec string, accumulating and running commands.  */
4022
4023 /* These variables describe the input file name.
4024    input_file_number is the index on outfiles of this file,
4025    so that the output file name can be stored for later use by %o.
4026    input_basename is the start of the part of the input file
4027    sans all directory names, and basename_length is the number
4028    of characters starting there excluding the suffix .c or whatever.  */
4029
4030 const char *input_filename;
4031 static int input_file_number;
4032 size_t input_filename_length;
4033 static int basename_length;
4034 static int suffixed_basename_length;
4035 static const char *input_basename;
4036 static const char *input_suffix;
4037
4038 /* The compiler used to process the current input file.  */
4039 static struct compiler *input_file_compiler;
4040
4041 /* These are variables used within do_spec and do_spec_1.  */
4042
4043 /* Nonzero if an arg has been started and not yet terminated
4044    (with space, tab or newline).  */
4045 static int arg_going;
4046
4047 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4048    is a temporary file name.  */
4049 static int delete_this_arg;
4050
4051 /* Nonzero means %w has been seen; the next arg to be terminated
4052    is the output file name of this compilation.  */
4053 static int this_is_output_file;
4054
4055 /* Nonzero means %s has been seen; the next arg to be terminated
4056    is the name of a library file and we should try the standard
4057    search dirs for it.  */
4058 static int this_is_library_file;
4059
4060 /* Nonzero means that the input of this command is coming from a pipe.  */
4061 static int input_from_pipe;
4062
4063 /* Nonnull means substitute this for any suffix when outputting a switches
4064    arguments. */
4065 static const char *suffix_subst;
4066
4067 /* Process the spec SPEC and run the commands specified therein.
4068    Returns 0 if the spec is successfully processed; -1 if failed.  */
4069
4070 int
4071 do_spec (spec)
4072      const char *spec;
4073 {
4074   int value;
4075
4076   clear_args ();
4077   arg_going = 0;
4078   delete_this_arg = 0;
4079   this_is_output_file = 0;
4080   this_is_library_file = 0;
4081   input_from_pipe = 0;
4082   suffix_subst = NULL;
4083
4084   value = do_spec_1 (spec, 0, NULL);
4085
4086   /* Force out any unfinished command.
4087      If -pipe, this forces out the last command if it ended in `|'.  */
4088   if (value == 0)
4089     {
4090       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4091         argbuf_index--;
4092
4093       if (argbuf_index > 0)
4094         value = execute ();
4095     }
4096
4097   return value;
4098 }
4099
4100 /* Process the sub-spec SPEC as a portion of a larger spec.
4101    This is like processing a whole spec except that we do
4102    not initialize at the beginning and we do not supply a
4103    newline by default at the end.
4104    INSWITCH nonzero means don't process %-sequences in SPEC;
4105    in this case, % is treated as an ordinary character.
4106    This is used while substituting switches.
4107    INSWITCH nonzero also causes SPC not to terminate an argument.
4108
4109    Value is zero unless a line was finished
4110    and the command on that line reported an error.  */
4111
4112 static int
4113 do_spec_1 (spec, inswitch, soft_matched_part)
4114      const char *spec;
4115      int inswitch;
4116      const char *soft_matched_part;
4117 {
4118   register const char *p = spec;
4119   register int c;
4120   int i;
4121   const char *string;
4122   int value;
4123
4124   while ((c = *p++))
4125     /* If substituting a switch, treat all chars like letters.
4126        Otherwise, NL, SPC, TAB and % are special.  */
4127     switch (inswitch ? 'a' : c)
4128       {
4129       case '\n':
4130         /* End of line: finish any pending argument,
4131            then run the pending command if one has been started.  */
4132         if (arg_going)
4133           {
4134             obstack_1grow (&obstack, 0);
4135             string = obstack_finish (&obstack);
4136             if (this_is_library_file)
4137               string = find_file (string);
4138             store_arg (string, delete_this_arg, this_is_output_file);
4139             if (this_is_output_file)
4140               outfiles[input_file_number] = string;
4141           }
4142         arg_going = 0;
4143
4144         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4145           {
4146             for (i = 0; i < n_switches; i++)
4147               if (!strcmp (switches[i].part1, "pipe"))
4148                 break;
4149
4150             /* A `|' before the newline means use a pipe here,
4151                but only if -pipe was specified.
4152                Otherwise, execute now and don't pass the `|' as an arg.  */
4153             if (i < n_switches)
4154               {
4155                 input_from_pipe = 1;
4156                 switches[i].validated = 1;
4157                 break;
4158               }
4159             else
4160               argbuf_index--;
4161           }
4162
4163         set_collect_gcc_options ();
4164
4165         if (argbuf_index > 0)
4166           {
4167             value = execute ();
4168             if (value)
4169               return value;
4170           }
4171         /* Reinitialize for a new command, and for a new argument.  */
4172         clear_args ();
4173         arg_going = 0;
4174         delete_this_arg = 0;
4175         this_is_output_file = 0;
4176         this_is_library_file = 0;
4177         input_from_pipe = 0;
4178         break;
4179
4180       case '|':
4181         /* End any pending argument.  */
4182         if (arg_going)
4183           {
4184             obstack_1grow (&obstack, 0);
4185             string = obstack_finish (&obstack);
4186             if (this_is_library_file)
4187               string = find_file (string);
4188             store_arg (string, delete_this_arg, this_is_output_file);
4189             if (this_is_output_file)
4190               outfiles[input_file_number] = string;
4191           }
4192
4193         /* Use pipe */
4194         obstack_1grow (&obstack, c);
4195         arg_going = 1;
4196         break;
4197
4198       case '\t':
4199       case ' ':
4200         /* Space or tab ends an argument if one is pending.  */
4201         if (arg_going)
4202           {
4203             obstack_1grow (&obstack, 0);
4204             string = obstack_finish (&obstack);
4205             if (this_is_library_file)
4206               string = find_file (string);
4207             store_arg (string, delete_this_arg, this_is_output_file);
4208             if (this_is_output_file)
4209               outfiles[input_file_number] = string;
4210           }
4211         /* Reinitialize for a new argument.  */
4212         arg_going = 0;
4213         delete_this_arg = 0;
4214         this_is_output_file = 0;
4215         this_is_library_file = 0;
4216         break;
4217
4218       case '%':
4219         switch (c = *p++)
4220           {
4221           case 0:
4222             fatal ("Invalid specification!  Bug in cc.");
4223
4224           case 'b':
4225             obstack_grow (&obstack, input_basename, basename_length);
4226             arg_going = 1;
4227             break;
4228
4229           case 'B':
4230             obstack_grow (&obstack, input_basename, suffixed_basename_length);
4231             arg_going = 1;
4232             break;
4233
4234           case 'd':
4235             delete_this_arg = 2;
4236             break;
4237
4238           /* Dump out the directories specified with LIBRARY_PATH,
4239              followed by the absolute directories
4240              that we search for startfiles.  */
4241           case 'D':
4242             {
4243               struct prefix_list *pl = startfile_prefixes.plist;
4244               size_t bufsize = 100;
4245               char *buffer = (char *) xmalloc (bufsize);
4246               int idx;
4247
4248               for (; pl; pl = pl->next)
4249                 {
4250 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4251                   /* Used on systems which record the specified -L dirs
4252                      and use them to search for dynamic linking.  */
4253                   /* Relative directories always come from -B,
4254                      and it is better not to use them for searching
4255                      at run time.  In particular, stage1 loses.  */
4256                   if (!IS_ABSOLUTE_PATHNAME (pl->prefix))
4257                     continue;
4258 #endif
4259                   /* Try subdirectory if there is one.  */
4260                   if (multilib_dir != NULL)
4261                     {
4262                       if (machine_suffix)
4263                         {
4264                           if (strlen (pl->prefix) + strlen (machine_suffix)
4265                               >= bufsize)
4266                             bufsize = (strlen (pl->prefix)
4267                                        + strlen (machine_suffix)) * 2 + 1;
4268                           buffer = (char *) xrealloc (buffer, bufsize);
4269                           strcpy (buffer, pl->prefix);
4270                           strcat (buffer, machine_suffix);
4271                           if (is_directory (buffer, multilib_dir, 1))
4272                             {
4273                               do_spec_1 ("-L", 0, NULL);
4274 #ifdef SPACE_AFTER_L_OPTION
4275                               do_spec_1 (" ", 0, NULL);
4276 #endif
4277                               do_spec_1 (buffer, 1, NULL);
4278                               do_spec_1 (multilib_dir, 1, NULL);
4279                               /* Make this a separate argument.  */
4280                               do_spec_1 (" ", 0, NULL);
4281                             }
4282                         }
4283                       if (!pl->require_machine_suffix)
4284                         {
4285                           if (is_directory (pl->prefix, multilib_dir, 1))
4286                             {
4287                               do_spec_1 ("-L", 0, NULL);
4288 #ifdef SPACE_AFTER_L_OPTION
4289                               do_spec_1 (" ", 0, NULL);
4290 #endif
4291                               do_spec_1 (pl->prefix, 1, NULL);
4292                               do_spec_1 (multilib_dir, 1, NULL);
4293                               /* Make this a separate argument.  */
4294                               do_spec_1 (" ", 0, NULL);
4295                             }
4296                         }
4297                     }
4298                   if (machine_suffix)
4299                     {
4300                       if (is_directory (pl->prefix, machine_suffix, 1))
4301                         {
4302                           do_spec_1 ("-L", 0, NULL);
4303 #ifdef SPACE_AFTER_L_OPTION
4304                           do_spec_1 (" ", 0, NULL);
4305 #endif
4306                           do_spec_1 (pl->prefix, 1, NULL);
4307                           /* Remove slash from machine_suffix.  */
4308                           if (strlen (machine_suffix) >= bufsize)
4309                             bufsize = strlen (machine_suffix) * 2 + 1;
4310                           buffer = (char *) xrealloc (buffer, bufsize);
4311                           strcpy (buffer, machine_suffix);
4312                           idx = strlen (buffer);
4313                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4314                             buffer[idx - 1] = 0;
4315                           do_spec_1 (buffer, 1, NULL);
4316                           /* Make this a separate argument.  */
4317                           do_spec_1 (" ", 0, NULL);
4318                         }
4319                     }
4320                   if (!pl->require_machine_suffix)
4321                     {
4322                       if (is_directory (pl->prefix, "", 1))
4323                         {
4324                           do_spec_1 ("-L", 0, NULL);
4325 #ifdef SPACE_AFTER_L_OPTION
4326                           do_spec_1 (" ", 0, NULL);
4327 #endif
4328                           /* Remove slash from pl->prefix.  */
4329                           if (strlen (pl->prefix) >= bufsize)
4330                             bufsize = strlen (pl->prefix) * 2 + 1;
4331                           buffer = (char *) xrealloc (buffer, bufsize);
4332                           strcpy (buffer, pl->prefix);
4333                           idx = strlen (buffer);
4334                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4335                             buffer[idx - 1] = 0;
4336                           do_spec_1 (buffer, 1, NULL);
4337                           /* Make this a separate argument.  */
4338                           do_spec_1 (" ", 0, NULL);
4339                         }
4340                     }
4341                 }
4342               free (buffer);
4343             }
4344             break;
4345
4346           case 'e':
4347             /* %efoo means report an error with `foo' as error message
4348                and don't execute any more commands for this file.  */
4349             {
4350               const char *q = p;
4351               char *buf;
4352               while (*p != 0 && *p != '\n')
4353                 p++;
4354               buf = (char *) alloca (p - q + 1);
4355               strncpy (buf, q, p - q);
4356               buf[p - q] = 0;
4357               error ("%s", buf);
4358               return -1;
4359             }
4360             break;
4361           case 'n':
4362             /* %nfoo means report an notice with `foo' on stderr.  */
4363             {
4364               const char *q = p;
4365               char *buf;
4366               while (*p != 0 && *p != '\n')
4367                 p++;
4368               buf = (char *) alloca (p - q + 1);
4369               strncpy (buf, q, p - q);
4370               buf[p - q] = 0;
4371               notice ("%s\n", buf);
4372               if (*p)
4373                 p++;
4374             }
4375             break;
4376
4377           case 'j':
4378             {
4379               struct stat st;
4380
4381               /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined,
4382                  and it is not a directory, and it is writable, use it.
4383                  Otherwise, fall through and treat this like any other
4384                  temporary file.  */
4385
4386               if ((!save_temps_flag)
4387                   && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4388                   && (access (HOST_BIT_BUCKET, W_OK) == 0))
4389                 {
4390                   obstack_grow (&obstack, HOST_BIT_BUCKET,
4391                                 strlen (HOST_BIT_BUCKET));
4392                   delete_this_arg = 0;
4393                   arg_going = 1;
4394                   break;
4395                 }
4396             }
4397           case 'g':
4398           case 'u':
4399           case 'U':
4400             if (save_temps_flag)
4401               {
4402                 obstack_grow (&obstack, input_basename, basename_length);
4403                 delete_this_arg = 0;
4404               }
4405             else
4406               {
4407                 struct temp_name *t;
4408                 int suffix_length;
4409                 const char *suffix = p;
4410                 char *saved_suffix = NULL;
4411
4412                 while (*p == '.' || ISALPHA ((unsigned char) *p))
4413                   p++;
4414                 suffix_length = p - suffix;
4415                 if (p[0] == '%' && p[1] == 'O')
4416                   {
4417                     p += 2;
4418                     /* We don't support extra suffix characters after %O.  */
4419                     if (*p == '.' || ISALPHA ((unsigned char) *p))
4420                       abort ();
4421                     if (suffix_length == 0)
4422                       suffix = TARGET_OBJECT_SUFFIX;
4423                     else
4424                       {
4425                         saved_suffix
4426                           = (char *) xmalloc (suffix_length
4427                                               + strlen (TARGET_OBJECT_SUFFIX));
4428                         strncpy (saved_suffix, suffix, suffix_length);
4429                         strcpy (saved_suffix + suffix_length,
4430                                 TARGET_OBJECT_SUFFIX);
4431                       }
4432                     suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4433                   }
4434
4435                 /* See if we already have an association of %g/%u/%U and
4436                    suffix.  */
4437                 for (t = temp_names; t; t = t->next)
4438                   if (t->length == suffix_length
4439                       && strncmp (t->suffix, suffix, suffix_length) == 0
4440                       && t->unique == (c != 'g'))
4441                     break;
4442
4443                 /* Make a new association if needed.  %u and %j
4444                    require one.  */
4445                 if (t == 0 || c == 'u' || c == 'j')
4446                   {
4447                     if (t == 0)
4448                       {
4449                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4450                         t->next = temp_names;
4451                         temp_names = t;
4452                       }
4453                     t->length = suffix_length;
4454                     if (saved_suffix)
4455                       {
4456                         t->suffix = saved_suffix;
4457                         saved_suffix = NULL;
4458                       }
4459                     else
4460                       t->suffix = save_string (suffix, suffix_length);
4461                     t->unique = (c != 'g');
4462                     temp_filename = make_temp_file (t->suffix);
4463                     temp_filename_length = strlen (temp_filename);
4464                     t->filename = temp_filename;
4465                     t->filename_length = temp_filename_length;
4466                   }
4467
4468                 if (saved_suffix)
4469                   free (saved_suffix);
4470
4471                 obstack_grow (&obstack, t->filename, t->filename_length);
4472                 delete_this_arg = 1;
4473               }
4474             arg_going = 1;
4475             break;
4476
4477           case 'i':
4478             obstack_grow (&obstack, input_filename, input_filename_length);
4479             arg_going = 1;
4480             break;
4481
4482           case 'I':
4483             {
4484               struct prefix_list *pl = include_prefixes.plist;
4485
4486               if (gcc_exec_prefix)
4487                 {
4488                   do_spec_1 ("-iprefix", 1, NULL);
4489                   /* Make this a separate argument.  */
4490                   do_spec_1 (" ", 0, NULL);
4491                   do_spec_1 (gcc_exec_prefix, 1, NULL);
4492                   do_spec_1 (" ", 0, NULL);
4493                 }
4494
4495               for (; pl; pl = pl->next)
4496                 {
4497                   do_spec_1 ("-isystem", 1, NULL);
4498                   /* Make this a separate argument.  */
4499                   do_spec_1 (" ", 0, NULL);
4500                   do_spec_1 (pl->prefix, 1, NULL);
4501                   do_spec_1 (" ", 0, NULL);
4502                 }
4503             }
4504             break;
4505
4506           case 'o':
4507             {
4508               int max = n_infiles;
4509               max += lang_specific_extra_outfiles;
4510
4511               for (i = 0; i < max; i++)
4512                 if (outfiles[i])
4513                   store_arg (outfiles[i], 0, 0);
4514               break;
4515             }
4516
4517           case 'O':
4518             obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4519             arg_going = 1;
4520             break;
4521
4522           case 's':
4523             this_is_library_file = 1;
4524             break;
4525
4526           case 'w':
4527             this_is_output_file = 1;
4528             break;
4529
4530           case 'W':
4531             {
4532               int cur_index = argbuf_index;
4533               /* Handle the {...} following the %W.  */
4534               if (*p != '{')
4535                 abort ();
4536               p = handle_braces (p + 1);
4537               if (p == 0)
4538                 return -1;
4539               /* If any args were output, mark the last one for deletion
4540                  on failure.  */
4541               if (argbuf_index != cur_index)
4542                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4543               break;
4544             }
4545
4546           /* %x{OPTION} records OPTION for %X to output.  */
4547           case 'x':
4548             {
4549               const char *p1 = p;
4550               char *string;
4551
4552               /* Skip past the option value and make a copy.  */
4553               if (*p != '{')
4554                 abort ();
4555               while (*p++ != '}')
4556                 ;
4557               string = save_string (p1 + 1, p - p1 - 2);
4558
4559               /* See if we already recorded this option.  */
4560               for (i = 0; i < n_linker_options; i++)
4561                 if (! strcmp (string, linker_options[i]))
4562                   {
4563                     free (string);
4564                     return 0;
4565                   }
4566
4567               /* This option is new; add it.  */
4568               add_linker_option (string, strlen (string));
4569             }
4570             break;
4571
4572           /* Dump out the options accumulated previously using %x.  */
4573           case 'X':
4574             for (i = 0; i < n_linker_options; i++)
4575               {
4576                 do_spec_1 (linker_options[i], 1, NULL);
4577                 /* Make each accumulated option a separate argument.  */
4578                 do_spec_1 (" ", 0, NULL);
4579               }
4580             break;
4581
4582           /* Dump out the options accumulated previously using -Wa,.  */
4583           case 'Y':
4584             for (i = 0; i < n_assembler_options; i++)
4585               {
4586                 do_spec_1 (assembler_options[i], 1, NULL);
4587                 /* Make each accumulated option a separate argument.  */
4588                 do_spec_1 (" ", 0, NULL);
4589               }
4590             break;
4591
4592           /* Dump out the options accumulated previously using -Wp,.  */
4593           case 'Z':
4594             for (i = 0; i < n_preprocessor_options; i++)
4595               {
4596                 do_spec_1 (preprocessor_options[i], 1, NULL);
4597                 /* Make each accumulated option a separate argument.  */
4598                 do_spec_1 (" ", 0, NULL);
4599               }
4600             break;
4601
4602             /* Here are digits and numbers that just process
4603                a certain constant string as a spec.  */
4604
4605           case '1':
4606             value = do_spec_1 (cc1_spec, 0, NULL);
4607             if (value != 0)
4608               return value;
4609             break;
4610
4611           case '2':
4612             value = do_spec_1 (cc1plus_spec, 0, NULL);
4613             if (value != 0)
4614               return value;
4615             break;
4616
4617           case 'a':
4618             value = do_spec_1 (asm_spec, 0, NULL);
4619             if (value != 0)
4620               return value;
4621             break;
4622
4623           case 'A':
4624             value = do_spec_1 (asm_final_spec, 0, NULL);
4625             if (value != 0)
4626               return value;
4627             break;
4628
4629           case 'c':
4630             value = do_spec_1 (signed_char_spec, 0, NULL);
4631             if (value != 0)
4632               return value;
4633             break;
4634
4635           case 'C':
4636             {
4637               const char* spec 
4638                 = (input_file_compiler->cpp_spec 
4639                    ? input_file_compiler->cpp_spec 
4640                    : cpp_spec);
4641               value = do_spec_1 (spec, 0, NULL);
4642               if (value != 0)
4643                 return value;
4644             }
4645             break;
4646
4647           case 'E':
4648             value = do_spec_1 (endfile_spec, 0, NULL);
4649             if (value != 0)
4650               return value;
4651             break;
4652
4653           case 'l':
4654             value = do_spec_1 (link_spec, 0, NULL);
4655             if (value != 0)
4656               return value;
4657             break;
4658
4659           case 'L':
4660             value = do_spec_1 (lib_spec, 0, NULL);
4661             if (value != 0)
4662               return value;
4663             break;
4664
4665           case 'G':
4666             value = do_spec_1 (libgcc_spec, 0, NULL);
4667             if (value != 0)
4668               return value;
4669             break;
4670
4671           case 'M':
4672             if (multilib_dir && strcmp (multilib_dir, ".") != 0)
4673               {
4674                 char *p;
4675                 const char *q;
4676                 size_t len;
4677
4678                 len = strlen (multilib_dir);
4679                 obstack_blank (&obstack, len + 1);
4680                 p = obstack_next_free (&obstack) - (len + 1);
4681
4682                 *p++ = '_';
4683                 for (q = multilib_dir; *q ; ++q, ++p)
4684                   *p = (IS_DIR_SEPARATOR (*q) ? '_' : *q);
4685               }
4686             break;
4687
4688           case 'p':
4689             {
4690               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4691               char *buf = x;
4692               const char *y;
4693
4694               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
4695               y = cpp_predefines;
4696               while (*y != 0)
4697                 {
4698                   if (! strncmp (y, "-D", 2))
4699                     /* Copy the whole option.  */
4700                     while (*y && *y != ' ' && *y != '\t')
4701                       *x++ = *y++;
4702                   else if (*y == ' ' || *y == '\t')
4703                     /* Copy whitespace to the result.  */
4704                     *x++ = *y++;
4705                   /* Don't copy other options.  */
4706                   else
4707                     y++;
4708                 }
4709
4710               *x = 0;
4711
4712               value = do_spec_1 (buf, 0, NULL);
4713               if (value != 0)
4714                 return value;
4715             }
4716             break;
4717
4718           case 'P':
4719             {
4720               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4721               char *buf = x;
4722               const char *y;
4723
4724               /* Copy all of CPP_PREDEFINES into BUF,
4725                  but force them all into the reserved name space if they
4726                  aren't already there.  The reserved name space is all
4727                  identifiers beginning with two underscores or with one
4728                  underscore and a capital letter.  We do the forcing by
4729                  adding up to two underscores to the beginning and end
4730                  of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4731                  become __mips__.  */
4732               y = cpp_predefines;
4733               while (*y != 0)
4734                 {
4735                   if (! strncmp (y, "-D", 2))
4736                     {
4737                       int flag = 0;
4738
4739                       *x++ = *y++;
4740                       *x++ = *y++;
4741
4742                       if (*y != '_'
4743                           || (*(y + 1) != '_'
4744                               && ! ISUPPER ((unsigned char) *(y + 1))))
4745                         {
4746                           /* Stick __ at front of macro name.  */
4747                           if (*y != '_')
4748                             *x++ = '_';
4749                           *x++ = '_';
4750                           /* Arrange to stick __ at the end as well.  */
4751                           flag = 1;
4752                         }
4753
4754                       /* Copy the macro name.  */
4755                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
4756                         *x++ = *y++;
4757
4758                       if (flag)
4759                         {
4760                           if (x[-1] != '_')
4761                             {
4762                               if (x[-2] != '_')
4763                                 *x++ = '_';
4764                               *x++ = '_';
4765                             }
4766                         }
4767
4768                       /* Copy the value given, if any.  */
4769                       while (*y && *y != ' ' && *y != '\t')
4770                         *x++ = *y++;
4771                     }
4772                   else if (*y == ' ' || *y == '\t')
4773                     /* Copy whitespace to the result.  */
4774                     *x++ = *y++;
4775                   /* Don't copy -A options  */
4776                   else
4777                     y++;
4778                 }
4779               *x++ = ' ';
4780
4781               /* Copy all of CPP_PREDEFINES into BUF,
4782                  but put __ after every -D.  */
4783               y = cpp_predefines;
4784               while (*y != 0)
4785                 {
4786                   if (! strncmp (y, "-D", 2))
4787                     {
4788                       y += 2;
4789
4790                       if (*y != '_'
4791                           || (*(y + 1) != '_'
4792                               && ! ISUPPER ((unsigned char) *(y + 1))))
4793                         {
4794                           /* Stick -D__ at front of macro name.  */
4795                           *x++ = '-';
4796                           *x++ = 'D';
4797                           if (*y != '_')
4798                             *x++ = '_';
4799                           *x++ = '_';
4800
4801                           /* Copy the macro name.  */
4802                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
4803                             *x++ = *y++;
4804
4805                           /* Copy the value given, if any.  */
4806                           while (*y && *y != ' ' && *y != '\t')
4807                             *x++ = *y++;
4808                         }
4809                       else
4810                         {
4811                           /* Do not copy this macro - we have just done it before */
4812                           while (*y && *y != ' ' && *y != '\t')
4813                             y++;
4814                         }
4815                     }
4816                   else if (*y == ' ' || *y == '\t')
4817                     /* Copy whitespace to the result.  */
4818                     *x++ = *y++;
4819                   /* Don't copy -A options.  */
4820                   else
4821                     y++;
4822                 }
4823               *x++ = ' ';
4824
4825               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4826               y = cpp_predefines;
4827               while (*y != 0)
4828                 {
4829                   if (! strncmp (y, "-A", 2))
4830                     /* Copy the whole option.  */
4831                     while (*y && *y != ' ' && *y != '\t')
4832                       *x++ = *y++;
4833                   else if (*y == ' ' || *y == '\t')
4834                     /* Copy whitespace to the result.  */
4835                     *x++ = *y++;
4836                   /* Don't copy other options.  */
4837                   else
4838                     y++;
4839                 }
4840
4841               *x = 0;
4842
4843               value = do_spec_1 (buf, 0, NULL);
4844               if (value != 0)
4845                 return value;
4846             }
4847             break;
4848
4849           case 'S':
4850             value = do_spec_1 (startfile_spec, 0, NULL);
4851             if (value != 0)
4852               return value;
4853             break;
4854
4855             /* Here we define characters other than letters and digits.  */
4856
4857           case '{':
4858             p = handle_braces (p);
4859             if (p == 0)
4860               return -1;
4861             break;
4862
4863           case '%':
4864             obstack_1grow (&obstack, '%');
4865             break;
4866
4867          case '.':
4868            {
4869              unsigned len = 0;
4870
4871              while (p[len] && p[len] != ' ' && p[len] != '%')
4872                len++;
4873              suffix_subst = save_string (p - 1, len + 1);
4874              p += len;
4875            }
4876            break;
4877           
4878           case '*':
4879             if (soft_matched_part)
4880               {
4881                 do_spec_1 (soft_matched_part, 1, NULL);
4882                 do_spec_1 (" ", 0, NULL);
4883               }
4884             else
4885               /* Catch the case where a spec string contains something like
4886                  '%{foo:%*}'.  ie there is no * in the pattern on the left
4887                  hand side of the :.  */
4888               error ("Spec failure: '%%*' has not been initialised by pattern match");
4889             break;
4890
4891             /* Process a string found as the value of a spec given by name.
4892                This feature allows individual machine descriptions
4893                to add and use their own specs.
4894                %[...] modifies -D options the way %P does;
4895                %(...) uses the spec unmodified.  */
4896           case '[':
4897             error ("Warning: use of obsolete %%[ operator in specs");
4898           case '(':
4899             {
4900               const char *name = p;
4901               struct spec_list *sl;
4902               int len;
4903
4904               /* The string after the S/P is the name of a spec that is to be
4905                  processed.  */
4906               while (*p && *p != ')' && *p != ']')
4907                 p++;
4908
4909               /* See if it's in the list.  */
4910               for (len = p - name, sl = specs; sl; sl = sl->next)
4911                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4912                   {
4913                     name = *(sl->ptr_spec);
4914 #ifdef DEBUG_SPECS
4915                     notice ("Processing spec %c%s%c, which is '%s'\n",
4916                             c, sl->name, (c == '(') ? ')' : ']', name);
4917 #endif
4918                     break;
4919                   }
4920
4921               if (sl)
4922                 {
4923                   if (c == '(')
4924                     {
4925                       value = do_spec_1 (name, 0, NULL);
4926                       if (value != 0)
4927                         return value;
4928                     }
4929                   else
4930                     {
4931                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4932                       char *buf = x;
4933                       const char *y = name;
4934                       int flag = 0;
4935
4936                       /* Copy all of NAME into BUF, but put __ after
4937                          every -D and at the end of each arg.  */
4938                       while (1)
4939                         {
4940                           if (! strncmp (y, "-D", 2))
4941                             {
4942                               *x++ = '-';
4943                               *x++ = 'D';
4944                               *x++ = '_';
4945                               *x++ = '_';
4946                               y += 2;
4947                               flag = 1;
4948                               continue;
4949                             }
4950                           else if (flag
4951                                    && (*y == ' ' || *y == '\t' || *y == '='
4952                                        || *y == '}' || *y == 0))
4953                             {
4954                               *x++ = '_';
4955                               *x++ = '_';
4956                               flag = 0;
4957                             }
4958                           if (*y == 0)
4959                             break;
4960                           else
4961                             *x++ = *y++;
4962                         }
4963                       *x = 0;
4964
4965                       value = do_spec_1 (buf, 0, NULL);
4966                       if (value != 0)
4967                         return value;
4968                     }
4969                 }
4970
4971               /* Discard the closing paren or bracket.  */
4972               if (*p)
4973                 p++;
4974             }
4975             break;
4976
4977           case 'v':
4978             {
4979               int c1 = *p++;  /* Select first or second version number.  */
4980               const char *v = compiler_version;
4981               const char *q;
4982               static const char zeroc = '0';
4983
4984               /* The format of the version string is
4985                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
4986
4987               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
4988               while (! ISDIGIT (*v))
4989                 v++;
4990               if (v > compiler_version && v[-1] != '-')
4991                 abort ();
4992
4993               /* If desired, advance to second version number.  */
4994               if (c1 >= '2')
4995                 {
4996                   /* Set V after the first period.  */
4997                   while (ISDIGIT (*v))
4998                     v++;
4999                   if (*v != '.')
5000                     abort ();
5001                   v++;
5002                 }
5003
5004               /* If desired, advance to third version number.
5005                  But don't complain if it's not present */
5006               if (c1 == '3')
5007                 {
5008                   /* Set V after the second period.  */
5009                   while (ISDIGIT (*v))
5010                     v++;
5011                   if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
5012                     abort ();
5013                   if (*v != 0)
5014                     v++;
5015                 }
5016
5017               /* Set Q at the next period or at the end.  */
5018               q = v;
5019               while (ISDIGIT (*q))
5020                 q++;
5021               if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
5022                 abort ();
5023
5024               if (q > v)
5025                 /* Put that part into the command.  */
5026                 obstack_grow (&obstack, v, q - v);
5027               else
5028                 /* Default to "0" */
5029                 obstack_grow (&obstack, &zeroc, 1);
5030               arg_going = 1;
5031             }
5032             break;
5033
5034           case '|':
5035             if (input_from_pipe)
5036               do_spec_1 ("-", 0, NULL);
5037             break;
5038
5039           default:
5040             error ("Spec failure: Unrecognised spec option '%c'", c);
5041             break;
5042           }
5043         break;
5044
5045       case '\\':
5046         /* Backslash: treat next character as ordinary.  */
5047         c = *p++;
5048
5049         /* fall through */
5050       default:
5051         /* Ordinary character: put it into the current argument.  */
5052         obstack_1grow (&obstack, c);
5053         arg_going = 1;
5054       }
5055
5056   /* End of string.  */
5057   return 0;
5058 }
5059
5060 /* Return 0 if we call do_spec_1 and that returns -1.  */
5061
5062 static const char *
5063 handle_braces (p)
5064      register const char *p;
5065 {
5066   const char *filter, *body = NULL, *endbody = NULL;
5067   int pipe_p = 0;
5068   int true_once = 0;    /* If, in %{a|b:d}, at least one of a,b was seen.  */
5069   int negate;
5070   int suffix;
5071   int include_blanks = 1;
5072   int elide_switch = 0;
5073   int ordered = 0;
5074
5075   if (*p == '^')
5076     {
5077       /* A '^' after the open-brace means to not give blanks before args.  */
5078       include_blanks = 0;
5079       ++p;
5080     }
5081
5082   if (*p == '|')
5083     {
5084       /* A `|' after the open-brace means,
5085          if the test fails, output a single minus sign rather than nothing.
5086          This is used in %{|!pipe:...}.  */
5087       pipe_p = 1;
5088       ++p;
5089     }
5090
5091   if (*p == '<')
5092     {
5093       /* A `<' after the open-brace means that the switch should be
5094          removed from the command-line.  */
5095       elide_switch = 1;
5096       ++p;
5097     }
5098
5099 next_member:
5100   negate = suffix = 0;
5101
5102   if (*p == '!')
5103     /* A `!' after the open-brace negates the condition:
5104        succeed if the specified switch is not present.  */
5105     negate = 1, ++p;
5106
5107   if (*p == '.')
5108     /* A `.' after the open-brace means test against the current suffix.  */
5109     {
5110       if (pipe_p)
5111         abort ();
5112
5113       suffix = 1;
5114       ++p;
5115     }
5116
5117   if (elide_switch && (negate || pipe_p || suffix))
5118     {
5119       /* It doesn't make sense to mix elision with other flags.  We
5120          could fatal() here, but the standard seems to be to abort.  */
5121       abort ();
5122     }
5123
5124  next_ampersand:
5125   filter = p;
5126   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
5127     p++;
5128
5129   if (*p == '|' && (pipe_p || ordered))
5130     abort ();
5131
5132   if (!body)
5133     {
5134       if (*p != '}' && *p != '&')
5135         {
5136           register int count = 1;
5137           register const char *q = p;
5138
5139           while (*q++ != ':')
5140             continue;
5141           body = q;
5142
5143           while (count > 0)
5144             {
5145               if (*q == '{')
5146                 count++;
5147               else if (*q == '}')
5148                 count--;
5149               else if (*q == 0)
5150                 abort ();
5151               q++;
5152             }
5153           endbody = q;
5154         }
5155       else
5156         body = p, endbody = p + 1;
5157     }
5158
5159   if (suffix)
5160     {
5161       int found = (input_suffix != 0
5162                    && (long) strlen (input_suffix) == (long) (p - filter)
5163                    && strncmp (input_suffix, filter, p - filter) == 0);
5164
5165       if (body[0] == '}')
5166         abort ();
5167
5168       if (negate != found
5169           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL) < 0)
5170         return 0;
5171     }
5172   else if (p[-1] == '*' && (p[0] == '}' || p[0] == '&'))
5173     {
5174       /* Substitute all matching switches as separate args.  */
5175       register int i;
5176
5177       for (i = 0; i < n_switches; i++)
5178         if (!strncmp (switches[i].part1, filter, p - 1 - filter)
5179             && check_live_switch (i, p - 1 - filter))
5180           {
5181             if (elide_switch)
5182               {
5183                 switches[i].live_cond = SWITCH_IGNORE;
5184                 switches[i].validated = 1;
5185               }
5186             else
5187               ordered = 1, switches[i].ordering = 1;
5188           }
5189     }
5190   else
5191     {
5192       /* Test for presence of the specified switch.  */
5193       register int i;
5194       int present = 0;
5195
5196       /* If name specified ends in *, as in {x*:...},
5197          check for %* and handle that case.  */
5198       if (p[-1] == '*' && !negate)
5199         {
5200           int substitution;
5201           const char *r = body;
5202
5203           /* First see whether we have %*.  */
5204           substitution = 0;
5205           while (r < endbody)
5206             {
5207               if (*r == '%' && r[1] == '*')
5208                 substitution = 1;
5209               r++;
5210             }
5211           /* If we do, handle that case.  */
5212           if (substitution)
5213             {
5214               /* Substitute all matching switches as separate args.
5215                  But do this by substituting for %*
5216                  in the text that follows the colon.  */
5217
5218               unsigned hard_match_len = p - filter - 1;
5219               char *string = save_string (body, endbody - body - 1);
5220
5221               for (i = 0; i < n_switches; i++)
5222                 if (!strncmp (switches[i].part1, filter, hard_match_len)
5223                     && check_live_switch (i, -1))
5224                   {
5225                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
5226                     /* Pass any arguments this switch has.  */
5227                     give_switch (i, 1, 1);
5228                     suffix_subst = NULL;
5229                   }
5230
5231               /* We didn't match.  Try again.  */
5232               if (*p++ == '|')
5233                 goto next_member;
5234               return endbody;
5235             }
5236         }
5237
5238       /* If name specified ends in *, as in {x*:...},
5239          check for presence of any switch name starting with x.  */
5240       if (p[-1] == '*')
5241         {
5242           for (i = 0; i < n_switches; i++)
5243             {
5244               unsigned hard_match_len = p - filter - 1;
5245
5246               if (!strncmp (switches[i].part1, filter, hard_match_len)
5247                   && check_live_switch (i, hard_match_len))
5248                 {
5249                   present = 1;
5250                   break;
5251                 }
5252             }
5253         }
5254       /* Otherwise, check for presence of exact name specified.  */
5255       else
5256         {
5257           for (i = 0; i < n_switches; i++)
5258             {
5259               if (!strncmp (switches[i].part1, filter, p - filter)
5260                   && switches[i].part1[p - filter] == 0
5261                   && check_live_switch (i, -1))
5262                 {
5263                   present = 1;
5264                   break;
5265                 }
5266             }
5267         }
5268
5269       /* If it is as desired (present for %{s...}, absent for %{!s...})
5270          then substitute either the switch or the specified
5271          conditional text.  */
5272       if (present != negate)
5273         {
5274           if (elide_switch)
5275             {
5276               switches[i].live_cond = SWITCH_IGNORE;
5277               switches[i].validated = 1;
5278             }
5279           else if (ordered || *p == '&')
5280             ordered = 1, switches[i].ordering = 1;
5281           else if (*p == '}')
5282             give_switch (i, 0, include_blanks);
5283           else
5284             /* Even if many alternatives are matched, only output once.  */
5285             true_once = 1;
5286         }
5287       else if (pipe_p)
5288         {
5289           /* Here if a %{|...} conditional fails: output a minus sign,
5290              which means "standard output" or "standard input".  */
5291           do_spec_1 ("-", 0, NULL);
5292           return endbody;
5293         }
5294     }
5295
5296   /* We didn't match; try again.  */
5297   if (*p++ == '|')
5298     goto next_member;
5299
5300   if (p[-1] == '&')
5301     {
5302       body = 0;
5303       goto next_ampersand;
5304     }
5305
5306   if (ordered)
5307     {
5308       int i;
5309       /* Doing this set of switches later preserves their command-line
5310          ordering.  This is needed for e.g. -U, -D and -A.  */
5311       for (i = 0; i < n_switches; i++)
5312         if (switches[i].ordering == 1)
5313           {
5314             switches[i].ordering = 0;
5315             give_switch (i, 0, include_blanks);
5316           }
5317     }
5318   /* Process the spec just once, regardless of match count.  */
5319   else if (true_once)
5320     {
5321       if (do_spec_1 (save_string (body, endbody - body - 1),
5322                      0, NULL) < 0)
5323         return 0;
5324     }
5325
5326   return endbody;
5327 }
5328 \f
5329 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5330    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
5331    spec, or -1 if either exact match or %* is used.
5332
5333    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
5334    whose value does not begin with "no-" is obsoleted by the same value
5335    with the "no-", similarly for a switch with the "no-" prefix.  */
5336
5337 static int
5338 check_live_switch (switchnum, prefix_length)
5339      int switchnum;
5340      int prefix_length;
5341 {
5342   const char *name = switches[switchnum].part1;
5343   int i;
5344
5345   /* In the common case of {<at-most-one-letter>*}, a negating
5346      switch would always match, so ignore that case.  We will just
5347      send the conflicting switches to the compiler phase.  */
5348   if (prefix_length >= 0 && prefix_length <= 1)
5349     return 1;
5350
5351   /* If we already processed this switch and determined if it was
5352      live or not, return our past determination.  */
5353   if (switches[switchnum].live_cond != 0)
5354     return switches[switchnum].live_cond > 0;
5355
5356   /* Now search for duplicate in a manner that depends on the name.  */
5357   switch (*name)
5358     {
5359     case 'O':
5360       for (i = switchnum + 1; i < n_switches; i++)
5361         if (switches[i].part1[0] == 'O')
5362           {
5363             switches[switchnum].validated = 1;
5364             switches[switchnum].live_cond = SWITCH_FALSE;
5365             return 0;
5366           }
5367       break;
5368
5369     case 'W':  case 'f':  case 'm':
5370       if (! strncmp (name + 1, "no-", 3))
5371         {
5372           /* We have Xno-YYY, search for XYYY.  */
5373           for (i = switchnum + 1; i < n_switches; i++)
5374             if (switches[i].part1[0] == name[0]
5375                 && ! strcmp (&switches[i].part1[1], &name[4]))
5376               {
5377                 switches[switchnum].validated = 1;
5378                 switches[switchnum].live_cond = SWITCH_FALSE;
5379                 return 0;
5380               }
5381         }
5382       else
5383         {
5384           /* We have XYYY, search for Xno-YYY.  */
5385           for (i = switchnum + 1; i < n_switches; i++)
5386             if (switches[i].part1[0] == name[0]
5387                 && switches[i].part1[1] == 'n'
5388                 && switches[i].part1[2] == 'o'
5389                 && switches[i].part1[3] == '-'
5390                 && !strcmp (&switches[i].part1[4], &name[1]))
5391               {
5392                 switches[switchnum].validated = 1;
5393                 switches[switchnum].live_cond = SWITCH_FALSE;
5394                 return 0;
5395               }
5396         }
5397       break;
5398     }
5399
5400   /* Otherwise the switch is live.  */
5401   switches[switchnum].live_cond = SWITCH_LIVE;
5402   return 1;
5403 }
5404 \f
5405 /* Pass a switch to the current accumulating command
5406    in the same form that we received it.
5407    SWITCHNUM identifies the switch; it is an index into
5408    the vector of switches gcc received, which is `switches'.
5409    This cannot fail since it never finishes a command line.
5410
5411    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
5412
5413    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
5414    of the switch.  */
5415
5416 static void
5417 give_switch (switchnum, omit_first_word, include_blanks)
5418      int switchnum;
5419      int omit_first_word;
5420      int include_blanks;
5421 {
5422   if (switches[switchnum].live_cond == SWITCH_IGNORE)
5423     return;
5424
5425   if (!omit_first_word)
5426     {
5427       do_spec_1 ("-", 0, NULL);
5428       do_spec_1 (switches[switchnum].part1, 1, NULL);
5429     }
5430
5431   if (switches[switchnum].args != 0)
5432     {
5433       const char **p;
5434       for (p = switches[switchnum].args; *p; p++)
5435         {
5436           const char *arg = *p;
5437
5438           if (include_blanks)
5439             do_spec_1 (" ", 0, NULL);
5440           if (suffix_subst)
5441             {
5442               unsigned length = strlen (arg);
5443               int dot = 0;
5444
5445               while (length-- && !IS_DIR_SEPARATOR (arg[length]))
5446                 if (arg[length] == '.')
5447                   {
5448                     ((char *)arg)[length] = 0;
5449                     dot = 1;
5450                     break;
5451                   }
5452               do_spec_1 (arg, 1, NULL);
5453               if (dot)
5454                 ((char *)arg)[length] = '.';
5455               do_spec_1 (suffix_subst, 1, NULL);
5456             }
5457           else
5458             do_spec_1 (arg, 1, NULL);
5459         }
5460     }
5461
5462   do_spec_1 (" ", 0, NULL);
5463   switches[switchnum].validated = 1;
5464 }
5465 \f
5466 /* Search for a file named NAME trying various prefixes including the
5467    user's -B prefix and some standard ones.
5468    Return the absolute file name found.  If nothing is found, return NAME.  */
5469
5470 static const char *
5471 find_file (name)
5472      const char *name;
5473 {
5474   char *newname;
5475
5476   /* Try multilib_dir if it is defined.  */
5477   if (multilib_dir != NULL)
5478     {
5479       char *try;
5480
5481       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
5482       strcpy (try, multilib_dir);
5483       strcat (try, dir_separator_str);
5484       strcat (try, name);
5485
5486       newname = find_a_file (&startfile_prefixes, try, R_OK);
5487
5488       /* If we don't find it in the multi library dir, then fall
5489          through and look for it in the normal places.  */
5490       if (newname != NULL)
5491         return newname;
5492     }
5493
5494   newname = find_a_file (&startfile_prefixes, name, R_OK);
5495   return newname ? newname : name;
5496 }
5497
5498 /* Determine whether a directory exists.  If LINKER, return 0 for
5499    certain fixed names not needed by the linker.  If not LINKER, it is
5500    only important to return 0 if the host machine has a small ARG_MAX
5501    limit.  */
5502
5503 static int
5504 is_directory (path1, path2, linker)
5505      const char *path1;
5506      const char *path2;
5507      int linker;
5508 {
5509   int len1 = strlen (path1);
5510   int len2 = strlen (path2);
5511   char *path = (char *) alloca (3 + len1 + len2);
5512   char *cp;
5513   struct stat st;
5514
5515 #ifndef SMALL_ARG_MAX
5516   if (! linker)
5517     return 1;
5518 #endif
5519
5520   /* Construct the path from the two parts.  Ensure the string ends with "/.".
5521      The resulting path will be a directory even if the given path is a
5522      symbolic link.  */
5523   memcpy (path, path1, len1);
5524   memcpy (path + len1, path2, len2);
5525   cp = path + len1 + len2;
5526   if (!IS_DIR_SEPARATOR (cp[-1]))
5527     *cp++ = DIR_SEPARATOR;
5528   *cp++ = '.';
5529   *cp = '\0';
5530
5531   /* Exclude directories that the linker is known to search.  */
5532   if (linker
5533       && ((cp - path == 6
5534            && strcmp (path, concat (dir_separator_str, "lib",
5535                                     dir_separator_str, ".", NULL)) == 0)
5536           || (cp - path == 10
5537               && strcmp (path, concat (dir_separator_str, "usr",
5538                                        dir_separator_str, "lib",
5539                                        dir_separator_str, ".", NULL)) == 0)))
5540     return 0;
5541
5542   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5543 }
5544
5545 /* Set up the various global variables to indicate that we're processing
5546    the input file named FILENAME.  */
5547
5548 void
5549 set_input (filename)
5550      const char *filename;
5551 {
5552   register const char *p;
5553
5554   input_filename = filename;
5555   input_filename_length = strlen (input_filename);
5556
5557   input_basename = input_filename;
5558 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5559   /* Skip drive name so 'x:foo' is handled properly.  */
5560   if (input_basename[1] == ':')
5561     input_basename += 2;
5562 #endif
5563   for (p = input_basename; *p; p++)
5564     if (IS_DIR_SEPARATOR (*p))
5565       input_basename = p + 1;
5566
5567   /* Find a suffix starting with the last period,
5568      and set basename_length to exclude that suffix.  */
5569   basename_length = strlen (input_basename);
5570   suffixed_basename_length = basename_length;
5571   p = input_basename + basename_length;
5572   while (p != input_basename && *p != '.')
5573     --p;
5574   if (*p == '.' && p != input_basename)
5575     {
5576       basename_length = p - input_basename;
5577       input_suffix = p + 1;
5578     }
5579   else
5580     input_suffix = "";
5581 }
5582 \f
5583 /* On fatal signals, delete all the temporary files.  */
5584
5585 static void
5586 fatal_error (signum)
5587      int signum;
5588 {
5589   signal (signum, SIG_DFL);
5590   delete_failure_queue ();
5591   delete_temp_files ();
5592   /* Get the same signal again, this time not handled,
5593      so its normal effect occurs.  */
5594   kill (getpid (), signum);
5595 }
5596
5597 extern int main PARAMS ((int, const char *const *));
5598
5599 int
5600 main (argc, argv)
5601      int argc;
5602      const char *const *argv;
5603 {
5604   size_t i;
5605   int value;
5606   int linker_was_run = 0;
5607   char *explicit_link_files;
5608   char *specs_file;
5609   const char *p;
5610   struct user_specs *uptr;
5611
5612   p = argv[0] + strlen (argv[0]);
5613   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5614     --p;
5615   programname = p;
5616
5617   xmalloc_set_program_name (programname);
5618
5619 #ifdef GCC_DRIVER_HOST_INITIALIZATION
5620   /* Perform host dependant initialization when needed.  */
5621   GCC_DRIVER_HOST_INITIALIZATION;
5622 #endif
5623
5624 /* LC_CTYPE determines the character set used by the terminal so it has be set
5625    to output messages correctly.  */
5626
5627 #ifdef HAVE_LC_MESSAGES
5628   setlocale (LC_CTYPE, "");
5629   setlocale (LC_MESSAGES, "");
5630 #else
5631   setlocale (LC_ALL, "");
5632 #endif
5633
5634   (void) bindtextdomain (PACKAGE, localedir);
5635   (void) textdomain (PACKAGE);
5636
5637   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5638     signal (SIGINT, fatal_error);
5639 #ifdef SIGHUP
5640   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5641     signal (SIGHUP, fatal_error);
5642 #endif
5643   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5644     signal (SIGTERM, fatal_error);
5645 #ifdef SIGPIPE
5646   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5647     signal (SIGPIPE, fatal_error);
5648 #endif
5649 #ifdef SIGCHLD
5650   /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
5651      receive the signal.  A different setting is inheritable */
5652   signal (SIGCHLD, SIG_DFL);
5653 #endif
5654
5655   argbuf_length = 10;
5656   argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
5657
5658   obstack_init (&obstack);
5659
5660   /* Build multilib_select, et. al from the separate lines that make up each
5661      multilib selection.  */
5662   {
5663     const char *const *q = multilib_raw;
5664     int need_space;
5665
5666     obstack_init (&multilib_obstack);
5667     while ((p = *q++) != (char *) 0)
5668       obstack_grow (&multilib_obstack, p, strlen (p));
5669
5670     obstack_1grow (&multilib_obstack, 0);
5671     multilib_select = obstack_finish (&multilib_obstack);
5672
5673     q = multilib_matches_raw;
5674     while ((p = *q++) != (char *) 0)
5675       obstack_grow (&multilib_obstack, p, strlen (p));
5676
5677     obstack_1grow (&multilib_obstack, 0);
5678     multilib_matches = obstack_finish (&multilib_obstack);
5679
5680     q = multilib_exclusions_raw;
5681     while ((p = *q++) != (char *) 0)
5682       obstack_grow (&multilib_obstack, p, strlen (p));
5683
5684     obstack_1grow (&multilib_obstack, 0);
5685     multilib_exclusions = obstack_finish (&multilib_obstack);
5686
5687     need_space = FALSE;
5688     for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
5689       {
5690         if (need_space)
5691           obstack_1grow (&multilib_obstack, ' ');
5692         obstack_grow (&multilib_obstack,
5693                       multilib_defaults_raw[i],
5694                       strlen (multilib_defaults_raw[i]));
5695         need_space = TRUE;
5696       }
5697
5698     obstack_1grow (&multilib_obstack, 0);
5699     multilib_defaults = obstack_finish (&multilib_obstack);
5700   }
5701
5702   /* Set up to remember the pathname of gcc and any options
5703      needed for collect.  We use argv[0] instead of programname because
5704      we need the complete pathname.  */
5705   obstack_init (&collect_obstack);
5706   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
5707   obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
5708   putenv (obstack_finish (&collect_obstack));
5709
5710 #ifdef INIT_ENVIRONMENT
5711   /* Set up any other necessary machine specific environment variables.  */
5712   putenv (INIT_ENVIRONMENT);
5713 #endif
5714
5715   /* Make a table of what switches there are (switches, n_switches).
5716      Make a table of specified input files (infiles, n_infiles).
5717      Decode switches that are handled locally.  */
5718
5719   process_command (argc, argv);
5720
5721   /* Initialize the vector of specs to just the default.
5722      This means one element containing 0s, as a terminator.  */
5723
5724   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
5725   memcpy ((char *) compilers, (char *) default_compilers,
5726           sizeof default_compilers);
5727   n_compilers = n_default_compilers;
5728
5729   /* Read specs from a file if there is one.  */
5730
5731   machine_suffix = concat (spec_machine, dir_separator_str,
5732                            spec_version, dir_separator_str, NULL);
5733   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
5734
5735   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
5736   /* Read the specs file unless it is a default one.  */
5737   if (specs_file != 0 && strcmp (specs_file, "specs"))
5738     read_specs (specs_file, TRUE);
5739   else
5740     init_spec ();
5741
5742   /* We need to check standard_exec_prefix/just_machine_suffix/specs
5743      for any override of as, ld and libraries.  */
5744   specs_file = (char *) alloca (strlen (standard_exec_prefix)
5745                                 + strlen (just_machine_suffix)
5746                                 + sizeof ("specs"));
5747
5748   strcpy (specs_file, standard_exec_prefix);
5749   strcat (specs_file, just_machine_suffix);
5750   strcat (specs_file, "specs");
5751   if (access (specs_file, R_OK) == 0)
5752     read_specs (specs_file, TRUE);
5753
5754   /* If not cross-compiling, look for startfiles in the standard places.  */
5755   if (*cross_compile == '0')
5756     {
5757       if (*md_exec_prefix)
5758         {
5759           add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
5760                       PREFIX_PRIORITY_LAST, 0, NULL);
5761           add_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
5762                       PREFIX_PRIORITY_LAST, 0, NULL);
5763         }
5764
5765       if (*md_startfile_prefix)
5766         add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5767                     PREFIX_PRIORITY_LAST, 0, NULL);
5768
5769       if (*md_startfile_prefix_1)
5770         add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5771                     PREFIX_PRIORITY_LAST, 0, NULL);
5772
5773       /* If standard_startfile_prefix is relative, base it on
5774          standard_exec_prefix.  This lets us move the installed tree
5775          as a unit.  If GCC_EXEC_PREFIX is defined, base
5776          standard_startfile_prefix on that as well.  */
5777       if (IS_ABSOLUTE_PATHNAME (standard_startfile_prefix))
5778         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5779                     PREFIX_PRIORITY_LAST, 0, NULL);
5780       else
5781         {
5782           if (gcc_exec_prefix)
5783             add_prefix (&startfile_prefixes,
5784                         concat (gcc_exec_prefix, machine_suffix,
5785                                 standard_startfile_prefix, NULL),
5786                         NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5787           add_prefix (&startfile_prefixes,
5788                       concat (standard_exec_prefix,
5789                               machine_suffix,
5790                               standard_startfile_prefix, NULL),
5791                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5792         }
5793
5794       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5795                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5796       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5797                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5798 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
5799       add_prefix (&startfile_prefixes, "./", NULL,
5800                   PREFIX_PRIORITY_LAST, 1, NULL);
5801 #endif
5802     }
5803   else
5804     {
5805       if (!IS_ABSOLUTE_PATHNAME (standard_startfile_prefix)
5806           && gcc_exec_prefix)
5807         add_prefix (&startfile_prefixes,
5808                     concat (gcc_exec_prefix, machine_suffix,
5809                             standard_startfile_prefix, NULL),
5810                     "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5811     }
5812
5813   /* Process any user specified specs in the order given on the command
5814      line.  */
5815   for (uptr = user_specs_head; uptr; uptr = uptr->next)
5816     {
5817       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5818       read_specs (filename ? filename : uptr->filename, FALSE);
5819     }
5820
5821   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
5822   if (gcc_exec_prefix)
5823     {
5824       char *temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5825                                      + strlen (spec_version)
5826                                      + strlen (spec_machine) + 3);
5827       strcpy (temp, gcc_exec_prefix);
5828       strcat (temp, spec_machine);
5829       strcat (temp, dir_separator_str);
5830       strcat (temp, spec_version);
5831       strcat (temp, dir_separator_str);
5832       gcc_exec_prefix = temp;
5833     }
5834
5835   /* Now we have the specs.
5836      Set the `valid' bits for switches that match anything in any spec.  */
5837
5838   validate_all_switches ();
5839
5840   /* Now that we have the switches and the specs, set
5841      the subdirectory based on the options.  */
5842   set_multilib_dir ();
5843
5844   /* Warn about any switches that no pass was interested in.  */
5845
5846   for (i = 0; (int) i < n_switches; i++)
5847     if (! switches[i].validated)
5848       error ("unrecognized option `-%s'", switches[i].part1);
5849
5850   /* Obey some of the options.  */
5851
5852   if (print_search_dirs)
5853     {
5854       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5855       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5856       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
5857       return (0);
5858     }
5859
5860   if (print_file_name)
5861     {
5862       printf ("%s\n", find_file (print_file_name));
5863       return (0);
5864     }
5865
5866   if (print_prog_name)
5867     {
5868       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
5869       printf ("%s\n", (newname ? newname : print_prog_name));
5870       return (0);
5871     }
5872
5873   if (print_multi_lib)
5874     {
5875       print_multilib_info ();
5876       return (0);
5877     }
5878
5879   if (print_multi_directory)
5880     {
5881       if (multilib_dir == NULL)
5882         printf (".\n");
5883       else
5884         printf ("%s\n", multilib_dir);
5885       return (0);
5886     }
5887
5888   if (target_help_flag)
5889    {
5890       /* Print if any target specific options.*/
5891
5892       /* We do not exit here. Instead we have created a fake input file
5893          called 'target-dummy' which needs to be compiled, and we pass this
5894          on to the various sub-processes, along with the --target-help
5895          switch. */
5896     }
5897
5898   if (print_help_list)
5899     {
5900       display_help ();
5901
5902       if (! verbose_flag)
5903         {
5904           printf (_("\nFor bug reporting instructions, please see:\n"));
5905           printf ("%s.\n", GCCBUGURL);
5906
5907           return (0);
5908         }
5909
5910       /* We do not exit here.  Instead we have created a fake input file
5911          called 'help-dummy' which needs to be compiled, and we pass this
5912          on the the various sub-processes, along with the --help switch.  */
5913     }
5914
5915   if (verbose_flag)
5916     {
5917       int n;
5918       const char *thrmod;
5919
5920       notice ("Configured with: %s\n", configuration_arguments);
5921
5922 #ifdef THREAD_MODEL_SPEC
5923       /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
5924          but there's no point in doing all this processing just to get
5925          thread_model back.  */
5926       obstack_init (&obstack);
5927       do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
5928       obstack_1grow (&obstack, '\0');
5929       thrmod = obstack_finish (&obstack);
5930 #else
5931       thrmod = thread_model;
5932 #endif
5933
5934       notice ("Thread model: %s\n", thrmod);
5935
5936       /* compiler_version is truncated at the first space when initialized
5937          from version string, so truncate version_string at the first space
5938          before comparing.  */
5939       for (n = 0; version_string[n]; n++)
5940         if (version_string[n] == ' ')
5941           break;
5942
5943       if (! strncmp (version_string, compiler_version, n)
5944           && compiler_version[n] == 0)
5945         notice ("gcc version %s\n", version_string);
5946       else
5947         notice ("gcc driver version %s executing gcc version %s\n",
5948                 version_string, compiler_version);
5949
5950       if (n_infiles == 0)
5951         return (0);
5952     }
5953
5954   if (n_infiles == added_libraries)
5955     fatal ("No input files");
5956
5957   /* Make a place to record the compiler output file names
5958      that correspond to the input files.  */
5959
5960   i = n_infiles;
5961   i += lang_specific_extra_outfiles;
5962   outfiles = (const char **) xcalloc (i, sizeof (char *));
5963
5964   /* Record which files were specified explicitly as link input.  */
5965
5966   explicit_link_files = xcalloc (1, n_infiles);
5967
5968   for (i = 0; (int) i < n_infiles; i++)
5969     {
5970       int this_file_error = 0;
5971
5972       /* Tell do_spec what to substitute for %i.  */
5973
5974       input_file_number = i;
5975       set_input (infiles[i].name);
5976
5977       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5978
5979       outfiles[i] = input_filename;
5980
5981       /* Figure out which compiler from the file's suffix.  */
5982
5983       input_file_compiler
5984         = lookup_compiler (infiles[i].name, input_filename_length,
5985                            infiles[i].language);
5986       
5987       if (input_file_compiler)
5988         {
5989           /* Ok, we found an applicable compiler.  Run its spec.  */
5990
5991           if (input_file_compiler->spec[0] == '#')
5992             error ("%s: %s compiler not installed on this system",
5993                    input_filename, &input_file_compiler->spec[1]);
5994           value = do_spec (input_file_compiler->spec);
5995           if (value < 0)
5996             this_file_error = 1;
5997         }
5998
5999       /* If this file's name does not contain a recognized suffix,
6000          record it as explicit linker input.  */
6001
6002       else
6003         explicit_link_files[i] = 1;
6004
6005       /* Clear the delete-on-failure queue, deleting the files in it
6006          if this compilation failed.  */
6007
6008       if (this_file_error)
6009         {
6010           delete_failure_queue ();
6011           error_count++;
6012         }
6013       /* If this compilation succeeded, don't delete those files later.  */
6014       clear_failure_queue ();
6015     }
6016
6017   /* Reset the output file name to the first input file name, for use
6018      with %b in LINK_SPEC on a target that prefers not to emit a.out
6019      by default.  */
6020   if (n_infiles > 0)
6021     set_input (infiles[0].name);
6022
6023   if (error_count == 0)
6024     {
6025       /* Make sure INPUT_FILE_NUMBER points to first available open
6026          slot.  */
6027       input_file_number = n_infiles;
6028       if (lang_specific_pre_link ())
6029         error_count++;
6030     }
6031
6032   /* Run ld to link all the compiler output files.  */
6033
6034   if (error_count == 0)
6035     {
6036       int tmp = execution_count;
6037
6038       /* We'll use ld if we can't find collect2.  */
6039       if (! strcmp (linker_name_spec, "collect2"))
6040         {
6041           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
6042           if (s == NULL)
6043             linker_name_spec = "ld";
6044         }
6045       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
6046          for collect.  */
6047       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
6048       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
6049
6050       value = do_spec (link_command_spec);
6051       if (value < 0)
6052         error_count = 1;
6053       linker_was_run = (tmp != execution_count);
6054     }
6055
6056   /* If options said don't run linker,
6057      complain about input files to be given to the linker.  */
6058
6059   if (! linker_was_run && error_count == 0)
6060     for (i = 0; (int) i < n_infiles; i++)
6061       if (explicit_link_files[i])
6062         error ("%s: linker input file unused because linking not done",
6063                outfiles[i]);
6064
6065   /* Delete some or all of the temporary files we made.  */
6066
6067   if (error_count)
6068     delete_failure_queue ();
6069   delete_temp_files ();
6070
6071   if (print_help_list)
6072     {
6073       printf (("\nFor bug reporting instructions, please see:\n"));
6074       printf ("%s\n", GCCBUGURL);
6075     }
6076
6077   return (signal_count != 0 ? 2
6078           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
6079           : 0);
6080 }
6081
6082 /* Find the proper compilation spec for the file name NAME,
6083    whose length is LENGTH.  LANGUAGE is the specified language,
6084    or 0 if this file is to be passed to the linker.  */
6085
6086 static struct compiler *
6087 lookup_compiler (name, length, language)
6088      const char *name;
6089      size_t length;
6090      const char *language;
6091 {
6092   struct compiler *cp;
6093
6094   /* If this was specified by the user to be a linker input, indicate that.  */
6095   if (language != 0 && language[0] == '*')
6096     return 0;
6097
6098   /* Otherwise, look for the language, if one is spec'd.  */
6099   if (language != 0)
6100     {
6101       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6102         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
6103           return cp;
6104
6105       error ("language %s not recognized", language);
6106       return 0;
6107     }
6108
6109   /* Look for a suffix.  */
6110   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6111     {
6112       if (/* The suffix `-' matches only the file name `-'.  */
6113           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6114           || (strlen (cp->suffix) < length
6115               /* See if the suffix matches the end of NAME.  */
6116               && !strcmp (cp->suffix,
6117                           name + length - strlen (cp->suffix))
6118          ))
6119         break;
6120     }
6121
6122 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6123   /* look again, but case-insensitively this time.  */
6124   if (cp < compilers)
6125     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6126       {
6127         if (/* The suffix `-' matches only the file name `-'.  */
6128             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6129             || (strlen (cp->suffix) < length
6130                 /* See if the suffix matches the end of NAME.  */
6131                 && ((!strcmp (cp->suffix,
6132                              name + length - strlen (cp->suffix))
6133                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
6134                     && !strcasecmp (cp->suffix,
6135                                     name + length - strlen (cp->suffix)))
6136            ))
6137           break;
6138       }
6139 #endif
6140
6141   if (cp >= compilers)
6142     {
6143       if (cp->spec[0] != '@')
6144         /* A non-alias entry: return it.  */
6145         return cp;
6146
6147       /* An alias entry maps a suffix to a language.
6148          Search for the language; pass 0 for NAME and LENGTH
6149          to avoid infinite recursion if language not found.  */
6150       return lookup_compiler (NULL, 0, cp->spec + 1);
6151     }
6152   return 0;
6153 }
6154 \f
6155 static char *
6156 save_string (s, len)
6157      const char *s;
6158      int len;
6159 {
6160   register char *result = xmalloc (len + 1);
6161
6162   memcpy (result, s, len);
6163   result[len] = 0;
6164   return result;
6165 }
6166
6167 void
6168 pfatal_with_name (name)
6169      const char *name;
6170 {
6171   perror_with_name (name);
6172   delete_temp_files ();
6173   exit (1);
6174 }
6175
6176 static void
6177 perror_with_name (name)
6178      const char *name;
6179 {
6180   error ("%s: %s", name, xstrerror (errno));
6181 }
6182
6183 static void
6184 pfatal_pexecute (errmsg_fmt, errmsg_arg)
6185      const char *errmsg_fmt;
6186      const char *errmsg_arg;
6187 {
6188   if (errmsg_arg)
6189     {
6190       int save_errno = errno;
6191
6192       /* Space for trailing '\0' is in %s.  */
6193       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
6194       sprintf (msg, errmsg_fmt, errmsg_arg);
6195       errmsg_fmt = msg;
6196
6197       errno = save_errno;
6198     }
6199
6200   pfatal_with_name (errmsg_fmt);
6201 }
6202
6203 /* Output an error message and exit */
6204
6205 void
6206 fancy_abort ()
6207 {
6208   fatal ("Internal gcc abort.");
6209 }
6210 \f
6211 /* Output an error message and exit */
6212
6213 void
6214 fatal VPARAMS ((const char *msgid, ...))
6215 {
6216 #ifndef ANSI_PROTOTYPES
6217   const char *msgid;
6218 #endif
6219   va_list ap;
6220
6221   VA_START (ap, msgid);
6222
6223 #ifndef ANSI_PROTOTYPES
6224   msgid = va_arg (ap, const char *);
6225 #endif
6226
6227   fprintf (stderr, "%s: ", programname);
6228   vfprintf (stderr, _(msgid), ap);
6229   va_end (ap);
6230   fprintf (stderr, "\n");
6231   delete_temp_files ();
6232   exit (1);
6233 }
6234
6235 void
6236 error VPARAMS ((const char *msgid, ...))
6237 {
6238 #ifndef ANSI_PROTOTYPES
6239   const char *msgid;
6240 #endif
6241   va_list ap;
6242
6243   VA_START (ap, msgid);
6244
6245 #ifndef ANSI_PROTOTYPES
6246   msgid = va_arg (ap, const char *);
6247 #endif
6248
6249   fprintf (stderr, "%s: ", programname);
6250   vfprintf (stderr, _(msgid), ap);
6251   va_end (ap);
6252
6253   fprintf (stderr, "\n");
6254 }
6255
6256 static void
6257 notice VPARAMS ((const char *msgid, ...))
6258 {
6259 #ifndef ANSI_PROTOTYPES
6260   const char *msgid;
6261 #endif
6262   va_list ap;
6263
6264   VA_START (ap, msgid);
6265
6266 #ifndef ANSI_PROTOTYPES
6267   msgid = va_arg (ap, const char *);
6268 #endif
6269
6270   vfprintf (stderr, _(msgid), ap);
6271   va_end (ap);
6272 }
6273 \f
6274 static void
6275 validate_all_switches ()
6276 {
6277   struct compiler *comp;
6278   register const char *p;
6279   register char c;
6280   struct spec_list *spec;
6281
6282   for (comp = compilers; comp->spec; comp++)
6283     {
6284       p = comp->spec;
6285       while ((c = *p++))
6286         if (c == '%' && *p == '{')
6287           /* We have a switch spec.  */
6288           validate_switches (p + 1);
6289     }
6290
6291   /* Look through the linked list of specs read from the specs file.  */
6292   for (spec = specs; spec; spec = spec->next)
6293     {
6294       p = *(spec->ptr_spec);
6295       while ((c = *p++))
6296         if (c == '%' && *p == '{')
6297           /* We have a switch spec.  */
6298           validate_switches (p + 1);
6299     }
6300
6301   p = link_command_spec;
6302   while ((c = *p++))
6303     if (c == '%' && *p == '{')
6304       /* We have a switch spec.  */
6305       validate_switches (p + 1);
6306 }
6307
6308 /* Look at the switch-name that comes after START
6309    and mark as valid all supplied switches that match it.  */
6310
6311 static void
6312 validate_switches (start)
6313      const char *start;
6314 {
6315   register const char *p = start;
6316   const char *filter;
6317   register int i;
6318   int suffix;
6319
6320   if (*p == '|')
6321     ++p;
6322
6323 next_member:
6324   if (*p == '!')
6325     ++p;
6326
6327   suffix = 0;
6328   if (*p == '.')
6329     suffix = 1, ++p;
6330
6331   filter = p;
6332   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
6333     p++;
6334
6335   if (suffix)
6336     ;
6337   else if (p[-1] == '*')
6338     {
6339       /* Mark all matching switches as valid.  */
6340       for (i = 0; i < n_switches; i++)
6341         if (!strncmp (switches[i].part1, filter, p - filter - 1))
6342           switches[i].validated = 1;
6343     }
6344   else
6345     {
6346       /* Mark an exact matching switch as valid.  */
6347       for (i = 0; i < n_switches; i++)
6348         {
6349           if (!strncmp (switches[i].part1, filter, p - filter)
6350               && switches[i].part1[p - filter] == 0)
6351             switches[i].validated = 1;
6352         }
6353     }
6354
6355   if (*p++ == '|' || p[-1] == '&')
6356     goto next_member;
6357 }
6358 \f
6359 /* Check whether a particular argument was used.  The first time we
6360    canonicalize the switches to keep only the ones we care about.  */
6361
6362 static int
6363 used_arg (p, len)
6364      const char *p;
6365      int len;
6366 {
6367   struct mswitchstr
6368   {
6369     const char *str;
6370     const char *replace;
6371     int len;
6372     int rep_len;
6373   };
6374
6375   static struct mswitchstr *mswitches;
6376   static int n_mswitches;
6377   int i, j;
6378
6379   if (!mswitches)
6380     {
6381       struct mswitchstr *matches;
6382       const char *q;
6383       int cnt = 0;
6384
6385       /* Break multilib_matches into the component strings of string
6386          and replacement string.  */
6387       for (q = multilib_matches; *q != '\0'; q++)
6388         if (*q == ';')
6389           cnt++;
6390
6391       matches =
6392         (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
6393       i = 0;
6394       q = multilib_matches;
6395       while (*q != '\0')
6396         {
6397           matches[i].str = q;
6398           while (*q != ' ')
6399             {
6400               if (*q == '\0')
6401                 abort ();
6402               q++;
6403             }
6404           matches[i].len = q - matches[i].str;
6405
6406           matches[i].replace = ++q;
6407           while (*q != ';' && *q != '\0')
6408             {
6409               if (*q == ' ')
6410                 abort ();
6411               q++;
6412             }
6413           matches[i].rep_len = q - matches[i].replace;
6414           i++;
6415           if (*q == ';')
6416             q++;
6417         }
6418
6419       /* Now build a list of the replacement string for switches that we care
6420          about.  Make sure we allocate at least one entry.  This prevents
6421          xmalloc from calling fatal, and prevents us from re-executing this
6422          block of code.  */
6423       mswitches
6424         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
6425                                          * (n_switches ? n_switches : 1));
6426       for (i = 0; i < n_switches; i++)
6427         {
6428           int xlen = strlen (switches[i].part1);
6429           for (j = 0; j < cnt; j++)
6430             if (xlen == matches[j].len
6431                 && ! strncmp (switches[i].part1, matches[j].str, xlen))
6432               {
6433                 mswitches[n_mswitches].str = matches[j].replace;
6434                 mswitches[n_mswitches].len = matches[j].rep_len;
6435                 mswitches[n_mswitches].replace = (char *) 0;
6436                 mswitches[n_mswitches].rep_len = 0;
6437                 n_mswitches++;
6438                 break;
6439               }
6440         }
6441     }
6442
6443   for (i = 0; i < n_mswitches; i++)
6444     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
6445       return 1;
6446
6447   return 0;
6448 }
6449
6450 static int
6451 default_arg (p, len)
6452      const char *p;
6453      int len;
6454 {
6455   const char *start, *end;
6456
6457   for (start = multilib_defaults; *start != '\0'; start = end + 1)
6458     {
6459       while (*start == ' ' || *start == '\t')
6460         start++;
6461
6462       if (*start == '\0')
6463         break;
6464
6465       for (end = start + 1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
6466         ;
6467
6468       if ((end - start) == len && strncmp (p, start, len) == 0)
6469         return 1;
6470
6471       if (*end == '\0')
6472         break;
6473     }
6474
6475   return 0;
6476 }
6477
6478 /* Work out the subdirectory to use based on the options. The format of
6479    multilib_select is a list of elements. Each element is a subdirectory
6480    name followed by a list of options followed by a semicolon. The format
6481    of multilib_exclusions is the same, but without the preceding
6482    directory. First gcc will check the exclusions, if none of the options
6483    beginning with an exclamation point are present, and all of the other
6484    options are present, then we will ignore this completely. Passing
6485    that, gcc will consider each multilib_select in turn using the same
6486    rules for matching the options. If a match is found, that subdirectory
6487    will be used.  */
6488
6489 static void
6490 set_multilib_dir ()
6491 {
6492   const char *p;
6493   unsigned int this_path_len;
6494   const char *this_path, *this_arg;
6495   int not_arg;
6496   int ok;
6497
6498   p = multilib_exclusions;
6499   while (*p != '\0')
6500     {
6501       /* Ignore newlines.  */
6502       if (*p == '\n')
6503         {
6504           ++p;
6505           continue;
6506         }
6507
6508       /* Check the arguments.  */
6509       ok = 1;
6510       while (*p != ';')
6511         {
6512           if (*p == '\0')
6513             abort ();
6514
6515           if (! ok)
6516             {
6517               ++p;
6518               continue;
6519             }
6520
6521           this_arg = p;
6522           while (*p != ' ' && *p != ';')
6523             {
6524               if (*p == '\0')
6525                 abort ();
6526               ++p;
6527             }
6528
6529           if (*this_arg != '!')
6530             not_arg = 0;
6531           else
6532             {
6533               not_arg = 1;
6534               ++this_arg;
6535             }
6536
6537           ok = used_arg (this_arg, p - this_arg);
6538           if (not_arg)
6539             ok = ! ok;
6540
6541           if (*p == ' ')
6542             ++p;
6543         }
6544
6545       if (ok)
6546         return;
6547
6548       ++p;
6549     }
6550
6551   p = multilib_select;
6552   while (*p != '\0')
6553     {
6554       /* Ignore newlines.  */
6555       if (*p == '\n')
6556         {
6557           ++p;
6558           continue;
6559         }
6560
6561       /* Get the initial path.  */
6562       this_path = p;
6563       while (*p != ' ')
6564         {
6565           if (*p == '\0')
6566             abort ();
6567           ++p;
6568         }
6569       this_path_len = p - this_path;
6570
6571       /* Check the arguments.  */
6572       ok = 1;
6573       ++p;
6574       while (*p != ';')
6575         {
6576           if (*p == '\0')
6577             abort ();
6578
6579           if (! ok)
6580             {
6581               ++p;
6582               continue;
6583             }
6584
6585           this_arg = p;
6586           while (*p != ' ' && *p != ';')
6587             {
6588               if (*p == '\0')
6589                 abort ();
6590               ++p;
6591             }
6592
6593           if (*this_arg != '!')
6594             not_arg = 0;
6595           else
6596             {
6597               not_arg = 1;
6598               ++this_arg;
6599             }
6600
6601           /* If this is a default argument, we can just ignore it.
6602              This is true even if this_arg begins with '!'.  Beginning
6603              with '!' does not mean that this argument is necessarily
6604              inappropriate for this library: it merely means that
6605              there is a more specific library which uses this
6606              argument.  If this argument is a default, we need not
6607              consider that more specific library.  */
6608           if (! default_arg (this_arg, p - this_arg))
6609             {
6610               ok = used_arg (this_arg, p - this_arg);
6611               if (not_arg)
6612                 ok = ! ok;
6613             }
6614
6615           if (*p == ' ')
6616             ++p;
6617         }
6618
6619       if (ok)
6620         {
6621           if (this_path_len != 1
6622               || this_path[0] != '.')
6623             {
6624               char *new_multilib_dir = xmalloc (this_path_len + 1);
6625               strncpy (new_multilib_dir, this_path, this_path_len);
6626               new_multilib_dir[this_path_len] = '\0';
6627               multilib_dir = new_multilib_dir;
6628             }
6629           break;
6630         }
6631
6632       ++p;
6633     }
6634 }
6635
6636 /* Print out the multiple library subdirectory selection
6637    information.  This prints out a series of lines.  Each line looks
6638    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6639    required.  Only the desired options are printed out, the negative
6640    matches.  The options are print without a leading dash.  There are
6641    no spaces to make it easy to use the information in the shell.
6642    Each subdirectory is printed only once.  This assumes the ordering
6643    generated by the genmultilib script. Also, we leave out ones that match
6644    the exclusions.  */
6645
6646 static void
6647 print_multilib_info ()
6648 {
6649   const char *p = multilib_select;
6650   const char *last_path = 0, *this_path;
6651   int skip;
6652   unsigned int last_path_len = 0;
6653
6654   while (*p != '\0')
6655     {
6656       skip = 0;
6657       /* Ignore newlines.  */
6658       if (*p == '\n')
6659         {
6660           ++p;
6661           continue;
6662         }
6663
6664       /* Get the initial path.  */
6665       this_path = p;
6666       while (*p != ' ')
6667         {
6668           if (*p == '\0')
6669             abort ();
6670           ++p;
6671         }
6672
6673       /* Check for matches with the multilib_exclusions. We don't bother
6674          with the '!' in either list. If any of the exclusion rules match
6675          all of its options with the select rule, we skip it.  */
6676       {
6677         const char *e = multilib_exclusions;
6678         const char *this_arg;
6679
6680         while (*e != '\0')
6681           {
6682             int m = 1;
6683             /* Ignore newlines.  */
6684             if (*e == '\n')
6685               {
6686                 ++e;
6687                 continue;
6688               }
6689
6690             /* Check the arguments.  */
6691             while (*e != ';')
6692               {
6693                 const char *q;
6694                 int mp = 0;
6695
6696                 if (*e == '\0')
6697                   abort ();
6698
6699                 if (! m)
6700                   {
6701                     ++e;
6702                     continue;
6703                   }
6704
6705                 this_arg = e;
6706
6707                 while (*e != ' ' && *e != ';')
6708                   {
6709                     if (*e == '\0')
6710                       abort ();
6711                     ++e;
6712                   }
6713
6714                 q = p + 1;
6715                 while (*q != ';')
6716                   {
6717                     const char *arg;
6718                     int len = e - this_arg;
6719
6720                     if (*q == '\0')
6721                       abort ();
6722
6723                     arg = q;
6724
6725                     while (*q != ' ' && *q != ';')
6726                       {
6727                         if (*q == '\0')
6728                           abort ();
6729                         ++q;
6730                       }
6731
6732                     if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6733                         default_arg (this_arg, e - this_arg))
6734                       {
6735                         mp = 1;
6736                         break;
6737                       }
6738
6739                     if (*q == ' ')
6740                       ++q;
6741                   }
6742
6743                 if (! mp)
6744                   m = 0;
6745
6746                 if (*e == ' ')
6747                   ++e;
6748               }
6749
6750             if (m)
6751               {
6752                 skip = 1;
6753                 break;
6754               }
6755
6756             if (*e != '\0')
6757               ++e;
6758           }
6759       }
6760
6761       if (! skip)
6762         {
6763           /* If this is a duplicate, skip it.  */
6764           skip = (last_path != 0 && (unsigned int) (p - this_path) == last_path_len
6765                   && ! strncmp (last_path, this_path, last_path_len));
6766
6767           last_path = this_path;
6768           last_path_len = p - this_path;
6769         }
6770
6771       /* If this directory requires any default arguments, we can skip
6772          it.  We will already have printed a directory identical to
6773          this one which does not require that default argument.  */
6774       if (! skip)
6775         {
6776           const char *q;
6777
6778           q = p + 1;
6779           while (*q != ';')
6780             {
6781               const char *arg;
6782
6783               if (*q == '\0')
6784                 abort ();
6785
6786               if (*q == '!')
6787                 arg = NULL;
6788               else
6789                 arg = q;
6790
6791               while (*q != ' ' && *q != ';')
6792                 {
6793                   if (*q == '\0')
6794                     abort ();
6795                   ++q;
6796                 }
6797
6798               if (arg != NULL
6799                   && default_arg (arg, q - arg))
6800                 {
6801                   skip = 1;
6802                   break;
6803                 }
6804
6805               if (*q == ' ')
6806                 ++q;
6807             }
6808         }
6809
6810       if (! skip)
6811         {
6812           const char *p1;
6813
6814           for (p1 = last_path; p1 < p; p1++)
6815             putchar (*p1);
6816           putchar (';');
6817         }
6818
6819       ++p;
6820       while (*p != ';')
6821         {
6822           int use_arg;
6823
6824           if (*p == '\0')
6825             abort ();
6826
6827           if (skip)
6828             {
6829               ++p;
6830               continue;
6831             }
6832
6833           use_arg = *p != '!';
6834
6835           if (use_arg)
6836             putchar ('@');
6837
6838           while (*p != ' ' && *p != ';')
6839             {
6840               if (*p == '\0')
6841                 abort ();
6842               if (use_arg)
6843                 putchar (*p);
6844               ++p;
6845             }
6846
6847           if (*p == ' ')
6848             ++p;
6849         }
6850
6851       if (! skip)
6852         {
6853           /* If there are extra options, print them now.  */
6854           if (multilib_extra && *multilib_extra)
6855             {
6856               int print_at = TRUE;
6857               const char *q;
6858
6859               for (q = multilib_extra; *q != '\0'; q++)
6860                 {
6861                   if (*q == ' ')
6862                     print_at = TRUE;
6863                   else
6864                     {
6865                       if (print_at)
6866                         putchar ('@');
6867                       putchar (*q);
6868                       print_at = FALSE;
6869                     }
6870                 }
6871             }
6872
6873           putchar ('\n');
6874         }
6875
6876       ++p;
6877     }
6878 }