OSDN Git Service

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