OSDN Git Service

* gcc.c (convert_filename): Add do_obj parameter. Don't convert
[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, 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.  DO_OBJ
2931    is true if we should look for an object suffix.  */
2932
2933 static const char *
2934 convert_filename (name, do_exe, do_obj)
2935      const char *name;
2936      int do_exe ATTRIBUTE_UNUSED;
2937      int do_obj ATTRIBUTE_UNUSED;
2938 {
2939 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2940   int i;
2941 #endif
2942   int len;
2943
2944   if (name == NULL)
2945     return NULL;
2946
2947   len = strlen (name);
2948
2949 #ifdef HAVE_TARGET_OBJECT_SUFFIX
2950   /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj".  */
2951   if (do_obj && len > 2
2952       && name[len - 2] == '.'
2953       && name[len - 1] == 'o')
2954     {
2955       obstack_grow (&obstack, name, len - 2);
2956       obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
2957       name = obstack_finish (&obstack);
2958     }
2959 #endif
2960
2961 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2962   /* If there is no filetype, make it the executable suffix (which includes
2963      the ".").  But don't get confused if we have just "-o".  */
2964   if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2965     return name;
2966
2967   for (i = len - 1; i >= 0; i--)
2968     if (IS_DIR_SEPARATOR (name[i]))
2969       break;
2970
2971   for (i++; i < len; i++)
2972     if (name[i] == '.')
2973       return name;
2974
2975   obstack_grow (&obstack, name, len);
2976   obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
2977                  strlen (TARGET_EXECUTABLE_SUFFIX));
2978   name = obstack_finish (&obstack);
2979 #endif
2980
2981   return name;
2982 }
2983 #endif
2984 \f
2985 /* Display the command line switches accepted by gcc.  */
2986 static void
2987 display_help ()
2988 {
2989   printf (_("Usage: %s [options] file...\n"), programname);
2990   fputs (_("Options:\n"), stdout);
2991
2992   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
2993   fputs (_("  --help                   Display this information\n"), stdout);
2994   fputs (_("  --target-help            Display target specific command line options\n"), stdout);
2995   if (! verbose_flag)
2996     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2997   fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
2998   fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
2999   fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
3000   fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
3001   fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
3002   fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
3003   fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
3004   fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
3005   fputs (_("\
3006   -print-multi-lib         Display the mapping between command line options and\n\
3007                            multiple library search directories\n"), stdout);
3008   fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
3009   fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
3010   fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
3011   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
3012   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
3013   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
3014   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
3015   fputs (_("  -specs=<file>            Override builtin specs with the contents of <file>\n"), stdout);
3016   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
3017   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
3018   fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
3019   fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
3020   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
3021   fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
3022   fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
3023   fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
3024   fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
3025   fputs (_("\
3026   -x <language>            Specify the language of the following input files\n\
3027                            Permissable languages include: c c++ assembler none\n\
3028                            'none' means revert to the default behaviour of\n\
3029                            guessing the language based on the file's extension\n\
3030 "), stdout);
3031
3032   printf (_("\
3033 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3034  passed on to the various sub-processes invoked by %s.  In order to pass\n\
3035  other options on to these processes the -W<letter> options must be used.\n\
3036 "), programname);
3037
3038   /* The rest of the options are displayed by invocations of the various
3039      sub-processes.  */
3040 }
3041
3042 static void
3043 add_preprocessor_option (option, len)
3044      const char *option;
3045      int len;
3046 {
3047   n_preprocessor_options++;
3048
3049   if (! preprocessor_options)
3050     preprocessor_options
3051       = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
3052   else
3053     preprocessor_options
3054       = (char **) xrealloc (preprocessor_options,
3055                             n_preprocessor_options * sizeof (char *));
3056
3057   preprocessor_options [n_preprocessor_options - 1] =
3058     save_string (option, len);
3059 }
3060
3061 static void
3062 add_assembler_option (option, len)
3063      const char *option;
3064      int len;
3065 {
3066   n_assembler_options++;
3067
3068   if (! assembler_options)
3069     assembler_options
3070       = (char **) xmalloc (n_assembler_options * sizeof (char *));
3071   else
3072     assembler_options
3073       = (char **) xrealloc (assembler_options,
3074                             n_assembler_options * sizeof (char *));
3075
3076   assembler_options [n_assembler_options - 1] = save_string (option, len);
3077 }
3078
3079 static void
3080 add_linker_option (option, len)
3081      const char *option;
3082      int len;
3083 {
3084   n_linker_options++;
3085
3086   if (! linker_options)
3087     linker_options
3088       = (char **) xmalloc (n_linker_options * sizeof (char *));
3089   else
3090     linker_options
3091       = (char **) xrealloc (linker_options,
3092                             n_linker_options * sizeof (char *));
3093
3094   linker_options [n_linker_options - 1] = save_string (option, len);
3095 }
3096 \f
3097 /* Create the vector `switches' and its contents.
3098    Store its length in `n_switches'.  */
3099
3100 static void
3101 process_command (argc, argv)
3102      int argc;
3103      const char *const *argv;
3104 {
3105   int i;
3106   const char *temp;
3107   char *temp1;
3108   const char *spec_lang = 0;
3109   int last_language_n_infiles;
3110   int have_c = 0;
3111   int have_o = 0;
3112   int lang_n_infiles = 0;
3113 #ifdef MODIFY_TARGET_NAME
3114   int is_modify_target_name;
3115   int j;
3116 #endif
3117
3118   GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3119
3120   n_switches = 0;
3121   n_infiles = 0;
3122   added_libraries = 0;
3123
3124   /* Figure compiler version from version string.  */
3125
3126   compiler_version = temp1 = xstrdup (version_string);
3127
3128   for (; *temp1; ++temp1)
3129     {
3130       if (*temp1 == ' ')
3131         {
3132           *temp1 = '\0';
3133           break;
3134         }
3135     }
3136
3137   /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
3138      see if we can create it from the pathname specified in argv[0].  */
3139
3140 #ifndef VMS
3141   /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
3142   if (!gcc_exec_prefix)
3143     {
3144       gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
3145                                               standard_exec_prefix);
3146       if (gcc_exec_prefix)
3147         putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3148     }
3149 #endif
3150
3151   if (gcc_exec_prefix)
3152     {
3153       int len = strlen (gcc_exec_prefix);
3154
3155       if (len > (int) sizeof ("/lib/gcc-lib/") - 1
3156           && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3157         {
3158           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
3159           if (IS_DIR_SEPARATOR (*temp)
3160               && strncmp (temp + 1, "lib", 3) == 0
3161               && IS_DIR_SEPARATOR (temp[4])
3162               && strncmp (temp + 5, "gcc-lib", 7) == 0)
3163             len -= sizeof ("/lib/gcc-lib/") - 1;
3164         }
3165
3166       set_std_prefix (gcc_exec_prefix, len);
3167       add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC",
3168                   PREFIX_PRIORITY_LAST, 0, NULL);
3169       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3170                   PREFIX_PRIORITY_LAST, 0, NULL);
3171     }
3172
3173   /* COMPILER_PATH and LIBRARY_PATH have values
3174      that are lists of directory names with colons.  */
3175
3176   GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
3177   if (temp)
3178     {
3179       const char *startp, *endp;
3180       char *nstore = (char *) alloca (strlen (temp) + 3);
3181
3182       startp = endp = temp;
3183       while (1)
3184         {
3185           if (*endp == PATH_SEPARATOR || *endp == 0)
3186             {
3187               strncpy (nstore, startp, endp - startp);
3188               if (endp == startp)
3189                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3190               else if (!IS_DIR_SEPARATOR (endp[-1]))
3191                 {
3192                   nstore[endp - startp] = DIR_SEPARATOR;
3193                   nstore[endp - startp + 1] = 0;
3194                 }
3195               else
3196                 nstore[endp - startp] = 0;
3197               add_prefix (&exec_prefixes, nstore, 0,
3198                           PREFIX_PRIORITY_LAST, 0, NULL);
3199               add_prefix (&include_prefixes,
3200                           concat (nstore, "include", NULL),
3201                           0, PREFIX_PRIORITY_LAST, 0, NULL);
3202               if (*endp == 0)
3203                 break;
3204               endp = startp = endp + 1;
3205             }
3206           else
3207             endp++;
3208         }
3209     }
3210
3211   GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
3212   if (temp && *cross_compile == '0')
3213     {
3214       const char *startp, *endp;
3215       char *nstore = (char *) alloca (strlen (temp) + 3);
3216
3217       startp = endp = temp;
3218       while (1)
3219         {
3220           if (*endp == PATH_SEPARATOR || *endp == 0)
3221             {
3222               strncpy (nstore, startp, endp - startp);
3223               if (endp == startp)
3224                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3225               else if (!IS_DIR_SEPARATOR (endp[-1]))
3226                 {
3227                   nstore[endp - startp] = DIR_SEPARATOR;
3228                   nstore[endp - startp + 1] = 0;
3229                 }
3230               else
3231                 nstore[endp - startp] = 0;
3232               add_prefix (&startfile_prefixes, nstore, NULL,
3233                           PREFIX_PRIORITY_LAST, 0, NULL);
3234               if (*endp == 0)
3235                 break;
3236               endp = startp = endp + 1;
3237             }
3238           else
3239             endp++;
3240         }
3241     }
3242
3243   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
3244   GET_ENV_PATH_LIST (temp, "LPATH");
3245   if (temp && *cross_compile == '0')
3246     {
3247       const char *startp, *endp;
3248       char *nstore = (char *) alloca (strlen (temp) + 3);
3249
3250       startp = endp = temp;
3251       while (1)
3252         {
3253           if (*endp == PATH_SEPARATOR || *endp == 0)
3254             {
3255               strncpy (nstore, startp, endp - startp);
3256               if (endp == startp)
3257                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3258               else if (!IS_DIR_SEPARATOR (endp[-1]))
3259                 {
3260                   nstore[endp - startp] = DIR_SEPARATOR;
3261                   nstore[endp - startp + 1] = 0;
3262                 }
3263               else
3264                 nstore[endp - startp] = 0;
3265               add_prefix (&startfile_prefixes, nstore, NULL,
3266                           PREFIX_PRIORITY_LAST, 0, NULL);
3267               if (*endp == 0)
3268                 break;
3269               endp = startp = endp + 1;
3270             }
3271           else
3272             endp++;
3273         }
3274     }
3275
3276   /* Convert new-style -- options to old-style.  */
3277   translate_options (&argc, &argv);
3278
3279   /* Do language-specific adjustment/addition of flags.  */
3280   lang_specific_driver (&argc, &argv, &added_libraries);
3281
3282   /* Scan argv twice.  Here, the first time, just count how many switches
3283      there will be in their vector, and how many input files in theirs.
3284      Also parse any switches that determine the configuration name, such as -b.
3285      Here we also parse the switches that cc itself uses (e.g. -v).  */
3286
3287   for (i = 1; i < argc; i++)
3288     {
3289       if (! strcmp (argv[i], "-dumpspecs"))
3290         {
3291           struct spec_list *sl;
3292           init_spec ();
3293           for (sl = specs; sl; sl = sl->next)
3294             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3295           if (link_command_spec)
3296             printf ("*link_command:\n%s\n\n", link_command_spec);
3297           exit (0);
3298         }
3299       else if (! strcmp (argv[i], "-dumpversion"))
3300         {
3301           printf ("%s\n", spec_version);
3302           exit (0);
3303         }
3304       else if (! strcmp (argv[i], "-dumpmachine"))
3305         {
3306           printf ("%s\n", spec_machine);
3307           exit (0);
3308         }
3309       else if (strcmp (argv[i], "-fhelp") == 0)
3310         {
3311           /* translate_options () has turned --help into -fhelp.  */
3312           print_help_list = 1;
3313
3314           /* We will be passing a dummy file on to the sub-processes.  */
3315           n_infiles++;
3316           n_switches++;
3317
3318           /* CPP driver cannot obtain switch from cc1_options.  */
3319           if (is_cpp_driver)
3320             add_preprocessor_option ("--help", 6);
3321           add_assembler_option ("--help", 6);
3322           add_linker_option ("--help", 6);
3323         }
3324       else if (strcmp (argv[i], "-ftarget-help") == 0)
3325         {
3326           /* translate_options() has turned --target-help into -ftarget-help.  */
3327           target_help_flag = 1;
3328
3329           /* We will be passing a dummy file on to the sub-processes.  */
3330           n_infiles++;
3331           n_switches++;
3332
3333           /* CPP driver cannot obtain switch from cc1_options.  */
3334           if (is_cpp_driver)
3335             add_preprocessor_option ("--target-help", 13);
3336           add_assembler_option ("--target-help", 13);
3337           add_linker_option ("--target-help", 13);
3338         }
3339       else if (! strcmp (argv[i], "-pass-exit-codes"))
3340         {
3341           pass_exit_codes = 1;
3342           n_switches++;
3343         }
3344       else if (! strcmp (argv[i], "-print-search-dirs"))
3345         print_search_dirs = 1;
3346       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3347         print_file_name = "libgcc.a";
3348       else if (! strncmp (argv[i], "-print-file-name=", 17))
3349         print_file_name = argv[i] + 17;
3350       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3351         print_prog_name = argv[i] + 17;
3352       else if (! strcmp (argv[i], "-print-multi-lib"))
3353         print_multi_lib = 1;
3354       else if (! strcmp (argv[i], "-print-multi-directory"))
3355         print_multi_directory = 1;
3356       else if (! strncmp (argv[i], "-Wa,", 4))
3357         {
3358           int prev, j;
3359           /* Pass the rest of this option to the assembler.  */
3360
3361           /* Split the argument at commas.  */
3362           prev = 4;
3363           for (j = 4; argv[i][j]; j++)
3364             if (argv[i][j] == ',')
3365               {
3366                 add_assembler_option (argv[i] + prev, j - prev);
3367                 prev = j + 1;
3368               }
3369
3370           /* Record the part after the last comma.  */
3371           add_assembler_option (argv[i] + prev, j - prev);
3372         }
3373       else if (! strncmp (argv[i], "-Wp,", 4))
3374         {
3375           int prev, j;
3376           /* Pass the rest of this option to the preprocessor.  */
3377
3378           /* Split the argument at commas.  */
3379           prev = 4;
3380           for (j = 4; argv[i][j]; j++)
3381             if (argv[i][j] == ',')
3382               {
3383                 add_preprocessor_option (argv[i] + prev, j - prev);
3384                 prev = j + 1;
3385               }
3386
3387           /* Record the part after the last comma.  */
3388           add_preprocessor_option (argv[i] + prev, j - prev);
3389         }
3390       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3391         /* The +e options to the C++ front-end.  */
3392         n_switches++;
3393       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3394         {
3395           int j;
3396           /* Split the argument at commas.  */
3397           for (j = 3; argv[i][j]; j++)
3398             n_infiles += (argv[i][j] == ',');
3399         }
3400       else if (strcmp (argv[i], "-Xlinker") == 0)
3401         {
3402           if (i + 1 == argc)
3403             fatal ("argument to `-Xlinker' is missing");
3404
3405           n_infiles++;
3406           i++;
3407         }
3408       else if (strcmp (argv[i], "-l") == 0)
3409         {
3410           if (i + 1 == argc)
3411             fatal ("argument to `-l' is missing");
3412
3413           n_infiles++;
3414           i++;
3415         }
3416       else if (strncmp (argv[i], "-l", 2) == 0)
3417         n_infiles++;
3418       else if (strcmp (argv[i], "-save-temps") == 0)
3419         {
3420           save_temps_flag = 1;
3421           n_switches++;
3422         }
3423       else if (strcmp (argv[i], "-specs") == 0)
3424         {
3425           struct user_specs *user = (struct user_specs *)
3426             xmalloc (sizeof (struct user_specs));
3427           if (++i >= argc)
3428             fatal ("argument to `-specs' is missing");
3429
3430           user->next = (struct user_specs *) 0;
3431           user->filename = argv[i];
3432           if (user_specs_tail)
3433             user_specs_tail->next = user;
3434           else
3435             user_specs_head = user;
3436           user_specs_tail = user;
3437         }
3438       else if (strncmp (argv[i], "-specs=", 7) == 0)
3439         {
3440           struct user_specs *user = (struct user_specs *)
3441             xmalloc (sizeof (struct user_specs));
3442           if (strlen (argv[i]) == 7)
3443             fatal ("argument to `-specs=' is missing");
3444
3445           user->next = (struct user_specs *) 0;
3446           user->filename = argv[i] + 7;
3447           if (user_specs_tail)
3448             user_specs_tail->next = user;
3449           else
3450             user_specs_head = user;
3451           user_specs_tail = user;
3452         }
3453       else if (strcmp (argv[i], "-time") == 0)
3454         report_times = 1;
3455       else if (argv[i][0] == '-' && argv[i][1] != 0)
3456         {
3457           const char *p = &argv[i][1];
3458           int c = *p;
3459
3460           switch (c)
3461             {
3462             case 'b':
3463               n_switches++;
3464               if (p[1] == 0 && i + 1 == argc)
3465                 fatal ("argument to `-b' is missing");
3466               if (p[1] == 0)
3467                 spec_machine = argv[++i];
3468               else
3469                 spec_machine = p + 1;
3470
3471               warn_std_ptr = &warn_std;
3472               break;
3473
3474             case 'B':
3475               {
3476                 const char *value;
3477                 int len;
3478
3479                 if (p[1] == 0 && i + 1 == argc)
3480                   fatal ("argument to `-B' is missing");
3481                 if (p[1] == 0)
3482                   value = argv[++i];
3483                 else
3484                   value = p + 1;
3485
3486                 len = strlen (value);
3487
3488                 /* Catch the case where the user has forgotten to append a
3489                    directory separator to the path.  Note, they may be using
3490                    -B to add an executable name prefix, eg "i386-elf-", in
3491                    order to distinguish between multiple installations of
3492                    GCC in the same directory.  Hence we must check to see
3493                    if appending a directory separator actually makes a
3494                    valid directory name.  */
3495                 if (! IS_DIR_SEPARATOR (value [len - 1])
3496                     && is_directory (value, "", 0))
3497                   {
3498                     char *tmp = xmalloc (len + 2);
3499                     strcpy (tmp, value);
3500                     tmp[len] = DIR_SEPARATOR;
3501                     tmp[++ len] = 0;
3502                     value = tmp;
3503                   }
3504                 
3505                 /* As a kludge, if the arg is "[foo/]stageN/", just
3506                    add "[foo/]include" to the include prefix.  */
3507                 if ((len == 7
3508                      || (len > 7
3509                          && (IS_DIR_SEPARATOR (value[len - 8]))))
3510                     && strncmp (value + len - 7, "stage", 5) == 0
3511                     && ISDIGIT (value[len - 2])
3512                     && (IS_DIR_SEPARATOR (value[len - 1])))
3513                   {
3514                     if (len == 7)
3515                       add_prefix (&include_prefixes, "include", NULL,
3516                                   PREFIX_PRIORITY_B_OPT, 0, NULL);
3517                     else
3518                       {
3519                         char * string = xmalloc (len + 1);
3520
3521                         strncpy (string, value, len - 7);
3522                         strcpy (string + len - 7, "include");
3523                         add_prefix (&include_prefixes, string, NULL,
3524                                     PREFIX_PRIORITY_B_OPT, 0, NULL);
3525                       }
3526                   }
3527
3528                 add_prefix (&exec_prefixes, value, NULL,
3529                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3530                 add_prefix (&startfile_prefixes, value, NULL,
3531                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3532                 add_prefix (&include_prefixes, concat (value, "include", NULL),
3533                             NULL, PREFIX_PRIORITY_B_OPT, 0, NULL);
3534                 n_switches++;
3535               }
3536               break;
3537
3538             case 'v':   /* Print our subcommands and print versions.  */
3539               n_switches++;
3540               /* If they do anything other than exactly `-v', don't set
3541                  verbose_flag; rather, continue on to give the error.  */
3542               if (p[1] != 0)
3543                 break;
3544               verbose_flag++;
3545               break;
3546
3547             case 'V':
3548               n_switches++;
3549               if (p[1] == 0 && i + 1 == argc)
3550                 fatal ("argument to `-V' is missing");
3551               if (p[1] == 0)
3552                 spec_version = argv[++i];
3553               else
3554                 spec_version = p + 1;
3555               compiler_version = spec_version;
3556               warn_std_ptr = &warn_std;
3557
3558               /* Validate the version number.  Use the same checks
3559                  done when inserting it into a spec.
3560
3561                  The format of the version string is
3562                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
3563               {
3564                 const char *v = compiler_version;
3565
3566                 /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
3567                 while (! ISDIGIT (*v))
3568                   v++;
3569
3570                 if (v > compiler_version && v[-1] != '-')
3571                   fatal ("invalid version number format");
3572
3573                 /* Set V after the first period.  */
3574                 while (ISDIGIT (*v))
3575                   v++;
3576
3577                 if (*v != '.')
3578                   fatal ("invalid version number format");
3579
3580                 v++;
3581                 while (ISDIGIT (*v))
3582                   v++;
3583
3584                 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3585                   fatal ("invalid version number format");
3586               }
3587               break;
3588
3589             case 'S':
3590             case 'c':
3591               if (p[1] == 0)
3592                 {
3593                   have_c = 1;
3594                   n_switches++;
3595                   break;
3596                 }
3597               goto normal_switch;
3598
3599             case 'o':
3600               have_o = 1;
3601 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3602               if (! have_c)
3603                 {
3604                   int skip;
3605
3606                   /* Forward scan, just in case -S or -c is specified
3607                      after -o.  */
3608                   int j = i + 1;
3609                   if (p[1] == 0)
3610                     ++j;
3611                   while (j < argc)
3612                     {
3613                       if (argv[j][0] == '-')
3614                         {
3615                           if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3616                               && argv[j][2] == 0)
3617                             {
3618                               have_c = 1;
3619                               break;
3620                             }
3621                           else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
3622                             j += skip - (argv[j][2] != 0);
3623                           else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
3624                             j += skip;
3625                         }
3626                       j++;
3627                     }
3628                 }
3629 #endif
3630 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3631               if (p[1] == 0)
3632                 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
3633               else
3634                 argv[i] = convert_filename (argv[i], ! have_c, 0);
3635 #endif
3636               goto normal_switch;
3637
3638             default:
3639             normal_switch:
3640
3641 #ifdef MODIFY_TARGET_NAME
3642               is_modify_target_name = 0;
3643
3644               for (j = 0;
3645                    j < sizeof modify_target / sizeof modify_target[0]; j++)
3646                 if (! strcmp (argv[i], modify_target[j].sw))
3647                   {
3648                     char *new_name
3649                       = (char *) xmalloc (strlen (modify_target[j].str)
3650                                           + strlen (spec_machine));
3651                     const char *p, *r;
3652                     char *q;
3653                     int made_addition = 0;
3654
3655                     is_modify_target_name = 1;
3656                     for (p = spec_machine, q = new_name; *p != 0; )
3657                       {
3658                         if (modify_target[j].add_del == DELETE
3659                             && (! strncmp (q, modify_target[j].str,
3660                                            strlen (modify_target[j].str))))
3661                           p += strlen (modify_target[j].str);
3662                         else if (modify_target[j].add_del == ADD
3663                                  && ! made_addition && *p == '-')
3664                           {
3665                             for (r = modify_target[j].str; *r != 0; )
3666                               *q++ = *r++;
3667                             made_addition = 1;
3668                           }
3669
3670                         *q++ = *p++;
3671                       }
3672
3673                     spec_machine = new_name;
3674                   }
3675
3676               if (is_modify_target_name)
3677                 break;
3678 #endif                
3679
3680               n_switches++;
3681
3682               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3683                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3684               else if (WORD_SWITCH_TAKES_ARG (p))
3685                 i += WORD_SWITCH_TAKES_ARG (p);
3686             }
3687         }
3688       else
3689         {
3690           n_infiles++;
3691           lang_n_infiles++;
3692         }
3693     }
3694
3695   if (have_c && have_o && lang_n_infiles > 1)
3696     fatal ("cannot specify -o with -c or -S and multiple compilations");
3697
3698   /* Set up the search paths before we go looking for config files.  */
3699
3700   /* These come before the md prefixes so that we will find gcc's subcommands
3701      (such as cpp) rather than those of the host system.  */
3702   /* Use 2 as fourth arg meaning try just the machine as a suffix,
3703      as well as trying the machine and the version.  */
3704 #ifndef OS2
3705   add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3706               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3707   add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3708               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3709   add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3710               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3711 #endif
3712
3713   add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3714               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3715   add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3716               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3717
3718   tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3719                            dir_separator_str, NULL);
3720
3721   /* If tooldir is relative, base it on exec_prefixes.  A relative
3722      tooldir lets us move the installed tree as a unit.
3723
3724      If GCC_EXEC_PREFIX is defined, then we want to add two relative
3725      directories, so that we can search both the user specified directory
3726      and the standard place.  */
3727
3728   if (!IS_ABSOLUTE_PATHNAME (tooldir_prefix))
3729     {
3730       if (gcc_exec_prefix)
3731         {
3732           char *gcc_exec_tooldir_prefix
3733             = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3734                       spec_version, dir_separator_str, tooldir_prefix, NULL);
3735
3736           add_prefix (&exec_prefixes,
3737                       concat (gcc_exec_tooldir_prefix, "bin",
3738                               dir_separator_str, NULL),
3739                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
3740           add_prefix (&startfile_prefixes,
3741                       concat (gcc_exec_tooldir_prefix, "lib",
3742                               dir_separator_str, NULL),
3743                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
3744         }
3745
3746       tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3747                                dir_separator_str, spec_version,
3748                                dir_separator_str, tooldir_prefix, NULL);
3749     }
3750
3751   add_prefix (&exec_prefixes,
3752               concat (tooldir_prefix, "bin", dir_separator_str, NULL),
3753               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
3754   add_prefix (&startfile_prefixes,
3755               concat (tooldir_prefix, "lib", dir_separator_str, NULL),
3756               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
3757
3758   /* More prefixes are enabled in main, after we read the specs file
3759      and determine whether this is cross-compilation or not.  */
3760
3761   /* Then create the space for the vectors and scan again.  */
3762
3763   switches = ((struct switchstr *)
3764               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3765   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3766   n_switches = 0;
3767   n_infiles = 0;
3768   last_language_n_infiles = -1;
3769
3770   /* This, time, copy the text of each switch and store a pointer
3771      to the copy in the vector of switches.
3772      Store all the infiles in their vector.  */
3773
3774   for (i = 1; i < argc; i++)
3775     {
3776       /* Just skip the switches that were handled by the preceding loop.  */
3777 #ifdef MODIFY_TARGET_NAME
3778       is_modify_target_name = 0;
3779
3780       for (j = 0; j < sizeof modify_target / sizeof modify_target[0]; j++)
3781         if (! strcmp (argv[i], modify_target[j].sw))
3782           is_modify_target_name = 1;
3783
3784       if (is_modify_target_name)
3785         ;
3786       else
3787 #endif
3788       if (! strncmp (argv[i], "-Wa,", 4))
3789         ;
3790       else if (! strncmp (argv[i], "-Wp,", 4))
3791         ;
3792       else if (! strcmp (argv[i], "-pass-exit-codes"))
3793         ;
3794       else if (! strcmp (argv[i], "-print-search-dirs"))
3795         ;
3796       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3797         ;
3798       else if (! strncmp (argv[i], "-print-file-name=", 17))
3799         ;
3800       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3801         ;
3802       else if (! strcmp (argv[i], "-print-multi-lib"))
3803         ;
3804       else if (! strcmp (argv[i], "-print-multi-directory"))
3805         ;
3806       else if (! strcmp (argv[i], "-ftarget-help"))
3807         ;
3808       else if (! strcmp (argv[i], "-fhelp"))
3809         ;
3810       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3811         {
3812           /* Compensate for the +e options to the C++ front-end;
3813              they're there simply for cfront call-compatibility.  We do
3814              some magic in default_compilers to pass them down properly.
3815              Note we deliberately start at the `+' here, to avoid passing
3816              -e0 or -e1 down into the linker.  */
3817           switches[n_switches].part1 = &argv[i][0];
3818           switches[n_switches].args = 0;
3819           switches[n_switches].live_cond = SWITCH_OK;
3820           switches[n_switches].validated = 0;
3821           n_switches++;
3822         }
3823       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3824         {
3825           int prev, j;
3826           /* Split the argument at commas.  */
3827           prev = 4;
3828           for (j = 4; argv[i][j]; j++)
3829             if (argv[i][j] == ',')
3830               {
3831                 infiles[n_infiles].language = "*";
3832                 infiles[n_infiles++].name
3833                   = save_string (argv[i] + prev, j - prev);
3834                 prev = j + 1;
3835               }
3836           /* Record the part after the last comma.  */
3837           infiles[n_infiles].language = "*";
3838           infiles[n_infiles++].name = argv[i] + prev;
3839         }
3840       else if (strcmp (argv[i], "-Xlinker") == 0)
3841         {
3842           infiles[n_infiles].language = "*";
3843           infiles[n_infiles++].name = argv[++i];
3844         }
3845       else if (strcmp (argv[i], "-l") == 0)
3846         { /* POSIX allows separation of -l and the lib arg;
3847              canonicalize by concatenating -l with its arg */
3848           infiles[n_infiles].language = "*";
3849           infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
3850         }
3851       else if (strncmp (argv[i], "-l", 2) == 0)
3852         {
3853           infiles[n_infiles].language = "*";
3854           infiles[n_infiles++].name = argv[i];
3855         }
3856       else if (strcmp (argv[i], "-specs") == 0)
3857         i++;
3858       else if (strncmp (argv[i], "-specs=", 7) == 0)
3859         ;
3860       else if (strcmp (argv[i], "-time") == 0)
3861         ;
3862       else if ((save_temps_flag || report_times)
3863                && strcmp (argv[i], "-pipe") == 0)
3864         {
3865           /* -save-temps overrides -pipe, so that temp files are produced */
3866           if (save_temps_flag)
3867             error ("warning: -pipe ignored because -save-temps specified");
3868           /* -time overrides -pipe because we can't get correct stats when
3869              multiple children are running at once.  */
3870           else if (report_times)
3871             error ("warning: -pipe ignored because -time specified");
3872         }
3873       else if (argv[i][0] == '-' && argv[i][1] != 0)
3874         {
3875           const char *p = &argv[i][1];
3876           int c = *p;
3877
3878           if (c == 'x')
3879             {
3880               if (p[1] == 0 && i + 1 == argc)
3881                 fatal ("argument to `-x' is missing");
3882               if (p[1] == 0)
3883                 spec_lang = argv[++i];
3884               else
3885                 spec_lang = p + 1;
3886               if (! strcmp (spec_lang, "none"))
3887                 /* Suppress the warning if -xnone comes after the last input
3888                    file, because alternate command interfaces like g++ might
3889                    find it useful to place -xnone after each input file.  */
3890                 spec_lang = 0;
3891               else
3892                 last_language_n_infiles = n_infiles;
3893               continue;
3894             }
3895           switches[n_switches].part1 = p;
3896           /* Deal with option arguments in separate argv elements.  */
3897           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
3898               || WORD_SWITCH_TAKES_ARG (p))
3899             {
3900               int j = 0;
3901               int n_args = WORD_SWITCH_TAKES_ARG (p);
3902
3903               if (n_args == 0)
3904                 {
3905                   /* Count only the option arguments in separate argv elements.  */
3906                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3907                 }
3908               if (i + n_args >= argc)
3909                 fatal ("argument to `-%s' is missing", p);
3910               switches[n_switches].args
3911                 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
3912               while (j < n_args)
3913                 switches[n_switches].args[j++] = argv[++i];
3914               /* Null-terminate the vector.  */
3915               switches[n_switches].args[j] = 0;
3916             }
3917           else if (strchr (switches_need_spaces, c))
3918             {
3919               /* On some systems, ld cannot handle some options without
3920                  a space.  So split the option from its argument.  */
3921               char *part1 = (char *) xmalloc (2);
3922               part1[0] = c;
3923               part1[1] = '\0';
3924
3925               switches[n_switches].part1 = part1;
3926               switches[n_switches].args
3927                 = (const char **) xmalloc (2 * sizeof (const char *));
3928               switches[n_switches].args[0] = xstrdup (p+1);
3929               switches[n_switches].args[1] = 0;
3930             }
3931           else
3932             switches[n_switches].args = 0;
3933
3934           switches[n_switches].live_cond = SWITCH_OK;
3935           switches[n_switches].validated = 0;
3936           switches[n_switches].ordering = 0;
3937           /* These are always valid, since gcc.c itself understands it.  */
3938           if (!strcmp (p, "save-temps")
3939               || !strcmp (p, "static-libgcc")
3940               || !strcmp (p, "shared-libgcc"))
3941             switches[n_switches].validated = 1;
3942           else
3943             {
3944               char ch = switches[n_switches].part1[0];
3945               if (ch == 'V' || ch == 'b' || ch == 'B')
3946                 switches[n_switches].validated = 1;
3947             }
3948           n_switches++;
3949         }
3950       else
3951         {
3952 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3953           argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
3954 #endif
3955
3956           if (strcmp (argv[i], "-") != 0 && access (argv[i], F_OK) < 0)
3957             {
3958               perror_with_name (argv[i]);
3959               error_count++;
3960             }
3961           else
3962             {
3963               infiles[n_infiles].language = spec_lang;
3964               infiles[n_infiles++].name = argv[i];
3965             }
3966         }
3967     }
3968
3969   if (n_infiles == last_language_n_infiles && spec_lang != 0)
3970     error ("warning: `-x %s' after last input file has no effect", spec_lang);
3971
3972   /* Ensure we only invoke each subprocess once.  */
3973   if (target_help_flag || print_help_list)
3974     {
3975       n_infiles = 1;
3976
3977       /* Create a dummy input file, so that we can pass --target-help on to
3978          the various sub-processes.  */
3979       infiles[0].language = "c";
3980       infiles[0].name   = "help-dummy";
3981
3982       if (target_help_flag)
3983         {
3984           switches[n_switches].part1     = "--target-help";
3985           switches[n_switches].args      = 0;
3986           switches[n_switches].live_cond = SWITCH_OK;
3987           switches[n_switches].validated = 0;
3988
3989           n_switches++;
3990         }
3991
3992       if (print_help_list)
3993         {
3994           switches[n_switches].part1     = "--help";
3995           switches[n_switches].args      = 0;
3996           switches[n_switches].live_cond = SWITCH_OK;
3997           switches[n_switches].validated = 0;
3998
3999           n_switches++;
4000         }
4001     }
4002
4003   switches[n_switches].part1 = 0;
4004   infiles[n_infiles].name = 0;
4005 }
4006
4007 /* Store switches not filtered out by %{<S} in spec in COLLECT_GCC_OPTIONS
4008    and place that in the environment.  */
4009
4010 static void
4011 set_collect_gcc_options ()
4012 {
4013   int i;
4014   int first_time;
4015
4016   /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4017      the compiler.  */
4018   obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4019                 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4020
4021   first_time = TRUE;
4022   for (i = 0; (int) i < n_switches; i++)
4023     {
4024       const char *const *args;
4025       const char *p, *q;
4026       if (!first_time)
4027         obstack_grow (&collect_obstack, " ", 1);
4028
4029       first_time = FALSE;
4030
4031       /* Ignore elided switches.  */
4032       if (switches[i].live_cond == SWITCH_IGNORE)
4033         continue;
4034
4035       obstack_grow (&collect_obstack, "'-", 2);
4036       q = switches[i].part1;
4037       while ((p = strchr (q, '\'')))
4038         {
4039           obstack_grow (&collect_obstack, q, p - q);
4040           obstack_grow (&collect_obstack, "'\\''", 4);
4041           q = ++p;
4042         }
4043       obstack_grow (&collect_obstack, q, strlen (q));
4044       obstack_grow (&collect_obstack, "'", 1);
4045
4046       for (args = switches[i].args; args && *args; args++)
4047         {
4048           obstack_grow (&collect_obstack, " '", 2);
4049           q = *args;
4050           while ((p = strchr (q, '\'')))
4051             {
4052               obstack_grow (&collect_obstack, q, p - q);
4053               obstack_grow (&collect_obstack, "'\\''", 4);
4054               q = ++p;
4055             }
4056           obstack_grow (&collect_obstack, q, strlen (q));
4057           obstack_grow (&collect_obstack, "'", 1);
4058         }
4059     }
4060   obstack_grow (&collect_obstack, "\0", 1);
4061   putenv (obstack_finish (&collect_obstack));
4062 }
4063 \f
4064 /* Process a spec string, accumulating and running commands.  */
4065
4066 /* These variables describe the input file name.
4067    input_file_number is the index on outfiles of this file,
4068    so that the output file name can be stored for later use by %o.
4069    input_basename is the start of the part of the input file
4070    sans all directory names, and basename_length is the number
4071    of characters starting there excluding the suffix .c or whatever.  */
4072
4073 const char *input_filename;
4074 static int input_file_number;
4075 size_t input_filename_length;
4076 static int basename_length;
4077 static int suffixed_basename_length;
4078 static const char *input_basename;
4079 static const char *input_suffix;
4080
4081 /* The compiler used to process the current input file.  */
4082 static struct compiler *input_file_compiler;
4083
4084 /* These are variables used within do_spec and do_spec_1.  */
4085
4086 /* Nonzero if an arg has been started and not yet terminated
4087    (with space, tab or newline).  */
4088 static int arg_going;
4089
4090 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4091    is a temporary file name.  */
4092 static int delete_this_arg;
4093
4094 /* Nonzero means %w has been seen; the next arg to be terminated
4095    is the output file name of this compilation.  */
4096 static int this_is_output_file;
4097
4098 /* Nonzero means %s has been seen; the next arg to be terminated
4099    is the name of a library file and we should try the standard
4100    search dirs for it.  */
4101 static int this_is_library_file;
4102
4103 /* Nonzero means that the input of this command is coming from a pipe.  */
4104 static int input_from_pipe;
4105
4106 /* Nonnull means substitute this for any suffix when outputting a switches
4107    arguments.  */
4108 static const char *suffix_subst;
4109
4110 /* Process the spec SPEC and run the commands specified therein.
4111    Returns 0 if the spec is successfully processed; -1 if failed.  */
4112
4113 int
4114 do_spec (spec)
4115      const char *spec;
4116 {
4117   int value;
4118
4119   clear_args ();
4120   arg_going = 0;
4121   delete_this_arg = 0;
4122   this_is_output_file = 0;
4123   this_is_library_file = 0;
4124   input_from_pipe = 0;
4125   suffix_subst = NULL;
4126
4127   value = do_spec_1 (spec, 0, NULL);
4128
4129   /* Force out any unfinished command.
4130      If -pipe, this forces out the last command if it ended in `|'.  */
4131   if (value == 0)
4132     {
4133       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4134         argbuf_index--;
4135
4136       set_collect_gcc_options ();
4137
4138       if (argbuf_index > 0)
4139         value = execute ();
4140     }
4141
4142   return value;
4143 }
4144
4145 /* Process the sub-spec SPEC as a portion of a larger spec.
4146    This is like processing a whole spec except that we do
4147    not initialize at the beginning and we do not supply a
4148    newline by default at the end.
4149    INSWITCH nonzero means don't process %-sequences in SPEC;
4150    in this case, % is treated as an ordinary character.
4151    This is used while substituting switches.
4152    INSWITCH nonzero also causes SPC not to terminate an argument.
4153
4154    Value is zero unless a line was finished
4155    and the command on that line reported an error.  */
4156
4157 static int
4158 do_spec_1 (spec, inswitch, soft_matched_part)
4159      const char *spec;
4160      int inswitch;
4161      const char *soft_matched_part;
4162 {
4163   const char *p = spec;
4164   int c;
4165   int i;
4166   const char *string;
4167   int value;
4168
4169   while ((c = *p++))
4170     /* If substituting a switch, treat all chars like letters.
4171        Otherwise, NL, SPC, TAB and % are special.  */
4172     switch (inswitch ? 'a' : c)
4173       {
4174       case '\n':
4175         /* End of line: finish any pending argument,
4176            then run the pending command if one has been started.  */
4177         if (arg_going)
4178           {
4179             obstack_1grow (&obstack, 0);
4180             string = obstack_finish (&obstack);
4181             if (this_is_library_file)
4182               string = find_file (string);
4183             store_arg (string, delete_this_arg, this_is_output_file);
4184             if (this_is_output_file)
4185               outfiles[input_file_number] = string;
4186           }
4187         arg_going = 0;
4188
4189         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4190           {
4191             for (i = 0; i < n_switches; i++)
4192               if (!strcmp (switches[i].part1, "pipe"))
4193                 break;
4194
4195             /* A `|' before the newline means use a pipe here,
4196                but only if -pipe was specified.
4197                Otherwise, execute now and don't pass the `|' as an arg.  */
4198             if (i < n_switches)
4199               {
4200                 input_from_pipe = 1;
4201                 switches[i].validated = 1;
4202                 break;
4203               }
4204             else
4205               argbuf_index--;
4206           }
4207
4208         set_collect_gcc_options ();
4209
4210         if (argbuf_index > 0)
4211           {
4212             value = execute ();
4213             if (value)
4214               return value;
4215           }
4216         /* Reinitialize for a new command, and for a new argument.  */
4217         clear_args ();
4218         arg_going = 0;
4219         delete_this_arg = 0;
4220         this_is_output_file = 0;
4221         this_is_library_file = 0;
4222         input_from_pipe = 0;
4223         break;
4224
4225       case '|':
4226         /* End any pending argument.  */
4227         if (arg_going)
4228           {
4229             obstack_1grow (&obstack, 0);
4230             string = obstack_finish (&obstack);
4231             if (this_is_library_file)
4232               string = find_file (string);
4233             store_arg (string, delete_this_arg, this_is_output_file);
4234             if (this_is_output_file)
4235               outfiles[input_file_number] = string;
4236           }
4237
4238         /* Use pipe */
4239         obstack_1grow (&obstack, c);
4240         arg_going = 1;
4241         break;
4242
4243       case '\t':
4244       case ' ':
4245         /* Space or tab ends an argument if one is pending.  */
4246         if (arg_going)
4247           {
4248             obstack_1grow (&obstack, 0);
4249             string = obstack_finish (&obstack);
4250             if (this_is_library_file)
4251               string = find_file (string);
4252             store_arg (string, delete_this_arg, this_is_output_file);
4253             if (this_is_output_file)
4254               outfiles[input_file_number] = string;
4255           }
4256         /* Reinitialize for a new argument.  */
4257         arg_going = 0;
4258         delete_this_arg = 0;
4259         this_is_output_file = 0;
4260         this_is_library_file = 0;
4261         break;
4262
4263       case '%':
4264         switch (c = *p++)
4265           {
4266           case 0:
4267             fatal ("invalid specification!  Bug in cc");
4268
4269           case 'b':
4270             obstack_grow (&obstack, input_basename, basename_length);
4271             arg_going = 1;
4272             break;
4273
4274           case 'B':
4275             obstack_grow (&obstack, input_basename, suffixed_basename_length);
4276             arg_going = 1;
4277             break;
4278
4279           case 'd':
4280             delete_this_arg = 2;
4281             break;
4282
4283           /* Dump out the directories specified with LIBRARY_PATH,
4284              followed by the absolute directories
4285              that we search for startfiles.  */
4286           case 'D':
4287             {
4288               struct prefix_list *pl = startfile_prefixes.plist;
4289               size_t bufsize = 100;
4290               char *buffer = (char *) xmalloc (bufsize);
4291               int idx;
4292
4293               for (; pl; pl = pl->next)
4294                 {
4295 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4296                   /* Used on systems which record the specified -L dirs
4297                      and use them to search for dynamic linking.  */
4298                   /* Relative directories always come from -B,
4299                      and it is better not to use them for searching
4300                      at run time.  In particular, stage1 loses.  */
4301                   if (!IS_ABSOLUTE_PATHNAME (pl->prefix))
4302                     continue;
4303 #endif
4304                   /* Try subdirectory if there is one.  */
4305                   if (multilib_dir != NULL)
4306                     {
4307                       if (machine_suffix)
4308                         {
4309                           if (strlen (pl->prefix) + strlen (machine_suffix)
4310                               >= bufsize)
4311                             bufsize = (strlen (pl->prefix)
4312                                        + strlen (machine_suffix)) * 2 + 1;
4313                           buffer = (char *) xrealloc (buffer, bufsize);
4314                           strcpy (buffer, pl->prefix);
4315                           strcat (buffer, machine_suffix);
4316                           if (is_directory (buffer, multilib_dir, 1))
4317                             {
4318                               do_spec_1 ("-L", 0, NULL);
4319 #ifdef SPACE_AFTER_L_OPTION
4320                               do_spec_1 (" ", 0, NULL);
4321 #endif
4322                               do_spec_1 (buffer, 1, NULL);
4323                               do_spec_1 (multilib_dir, 1, NULL);
4324                               /* Make this a separate argument.  */
4325                               do_spec_1 (" ", 0, NULL);
4326                             }
4327                         }
4328                       if (!pl->require_machine_suffix)
4329                         {
4330                           if (is_directory (pl->prefix, multilib_dir, 1))
4331                             {
4332                               do_spec_1 ("-L", 0, NULL);
4333 #ifdef SPACE_AFTER_L_OPTION
4334                               do_spec_1 (" ", 0, NULL);
4335 #endif
4336                               do_spec_1 (pl->prefix, 1, NULL);
4337                               do_spec_1 (multilib_dir, 1, NULL);
4338                               /* Make this a separate argument.  */
4339                               do_spec_1 (" ", 0, NULL);
4340                             }
4341                         }
4342                     }
4343                   if (machine_suffix)
4344                     {
4345                       if (is_directory (pl->prefix, machine_suffix, 1))
4346                         {
4347                           do_spec_1 ("-L", 0, NULL);
4348 #ifdef SPACE_AFTER_L_OPTION
4349                           do_spec_1 (" ", 0, NULL);
4350 #endif
4351                           do_spec_1 (pl->prefix, 1, NULL);
4352                           /* Remove slash from machine_suffix.  */
4353                           if (strlen (machine_suffix) >= bufsize)
4354                             bufsize = strlen (machine_suffix) * 2 + 1;
4355                           buffer = (char *) xrealloc (buffer, bufsize);
4356                           strcpy (buffer, machine_suffix);
4357                           idx = strlen (buffer);
4358                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4359                             buffer[idx - 1] = 0;
4360                           do_spec_1 (buffer, 1, NULL);
4361                           /* Make this a separate argument.  */
4362                           do_spec_1 (" ", 0, NULL);
4363                         }
4364                     }
4365                   if (!pl->require_machine_suffix)
4366                     {
4367                       if (is_directory (pl->prefix, "", 1))
4368                         {
4369                           do_spec_1 ("-L", 0, NULL);
4370 #ifdef SPACE_AFTER_L_OPTION
4371                           do_spec_1 (" ", 0, NULL);
4372 #endif
4373                           /* Remove slash from pl->prefix.  */
4374                           if (strlen (pl->prefix) >= bufsize)
4375                             bufsize = strlen (pl->prefix) * 2 + 1;
4376                           buffer = (char *) xrealloc (buffer, bufsize);
4377                           strcpy (buffer, pl->prefix);
4378                           idx = strlen (buffer);
4379                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4380                             buffer[idx - 1] = 0;
4381                           do_spec_1 (buffer, 1, NULL);
4382                           /* Make this a separate argument.  */
4383                           do_spec_1 (" ", 0, NULL);
4384                         }
4385                     }
4386                 }
4387               free (buffer);
4388             }
4389             break;
4390
4391           case 'e':
4392             /* %efoo means report an error with `foo' as error message
4393                and don't execute any more commands for this file.  */
4394             {
4395               const char *q = p;
4396               char *buf;
4397               while (*p != 0 && *p != '\n')
4398                 p++;
4399               buf = (char *) alloca (p - q + 1);
4400               strncpy (buf, q, p - q);
4401               buf[p - q] = 0;
4402               error ("%s", buf);
4403               return -1;
4404             }
4405             break;
4406           case 'n':
4407             /* %nfoo means report an notice with `foo' on stderr.  */
4408             {
4409               const char *q = p;
4410               char *buf;
4411               while (*p != 0 && *p != '\n')
4412                 p++;
4413               buf = (char *) alloca (p - q + 1);
4414               strncpy (buf, q, p - q);
4415               buf[p - q] = 0;
4416               notice ("%s\n", buf);
4417               if (*p)
4418                 p++;
4419             }
4420             break;
4421
4422           case 'j':
4423             {
4424               struct stat st;
4425
4426               /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined,
4427                  and it is not a directory, and it is writable, use it.
4428                  Otherwise, fall through and treat this like any other
4429                  temporary file.  */
4430
4431               if ((!save_temps_flag)
4432                   && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4433                   && (access (HOST_BIT_BUCKET, W_OK) == 0))
4434                 {
4435                   obstack_grow (&obstack, HOST_BIT_BUCKET,
4436                                 strlen (HOST_BIT_BUCKET));
4437                   delete_this_arg = 0;
4438                   arg_going = 1;
4439                   break;
4440                 }
4441             }
4442           case 'g':
4443           case 'u':
4444           case 'U':
4445             if (save_temps_flag)
4446               {
4447                 obstack_grow (&obstack, input_basename, basename_length);
4448                 delete_this_arg = 0;
4449               }
4450             else
4451               {
4452                 struct temp_name *t;
4453                 int suffix_length;
4454                 const char *suffix = p;
4455                 char *saved_suffix = NULL;
4456
4457                 while (*p == '.' || ISALPHA ((unsigned char) *p))
4458                   p++;
4459                 suffix_length = p - suffix;
4460                 if (p[0] == '%' && p[1] == 'O')
4461                   {
4462                     p += 2;
4463                     /* We don't support extra suffix characters after %O.  */
4464                     if (*p == '.' || ISALPHA ((unsigned char) *p))
4465                       abort ();
4466                     if (suffix_length == 0)
4467                       suffix = TARGET_OBJECT_SUFFIX;
4468                     else
4469                       {
4470                         saved_suffix
4471                           = (char *) xmalloc (suffix_length
4472                                               + strlen (TARGET_OBJECT_SUFFIX));
4473                         strncpy (saved_suffix, suffix, suffix_length);
4474                         strcpy (saved_suffix + suffix_length,
4475                                 TARGET_OBJECT_SUFFIX);
4476                       }
4477                     suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4478                   }
4479
4480                 /* See if we already have an association of %g/%u/%U and
4481                    suffix.  */
4482                 for (t = temp_names; t; t = t->next)
4483                   if (t->length == suffix_length
4484                       && strncmp (t->suffix, suffix, suffix_length) == 0
4485                       && t->unique == (c != 'g'))
4486                     break;
4487
4488                 /* Make a new association if needed.  %u and %j
4489                    require one.  */
4490                 if (t == 0 || c == 'u' || c == 'j')
4491                   {
4492                     if (t == 0)
4493                       {
4494                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4495                         t->next = temp_names;
4496                         temp_names = t;
4497                       }
4498                     t->length = suffix_length;
4499                     if (saved_suffix)
4500                       {
4501                         t->suffix = saved_suffix;
4502                         saved_suffix = NULL;
4503                       }
4504                     else
4505                       t->suffix = save_string (suffix, suffix_length);
4506                     t->unique = (c != 'g');
4507                     temp_filename = make_temp_file (t->suffix);
4508                     temp_filename_length = strlen (temp_filename);
4509                     t->filename = temp_filename;
4510                     t->filename_length = temp_filename_length;
4511                   }
4512
4513                 if (saved_suffix)
4514                   free (saved_suffix);
4515
4516                 obstack_grow (&obstack, t->filename, t->filename_length);
4517                 delete_this_arg = 1;
4518               }
4519             arg_going = 1;
4520             break;
4521
4522           case 'i':
4523             obstack_grow (&obstack, input_filename, input_filename_length);
4524             arg_going = 1;
4525             break;
4526
4527           case 'I':
4528             {
4529               struct prefix_list *pl = include_prefixes.plist;
4530
4531               if (gcc_exec_prefix)
4532                 {
4533                   do_spec_1 ("-iprefix", 1, NULL);
4534                   /* Make this a separate argument.  */
4535                   do_spec_1 (" ", 0, NULL);
4536                   do_spec_1 (gcc_exec_prefix, 1, NULL);
4537                   do_spec_1 (" ", 0, NULL);
4538                 }
4539
4540               for (; pl; pl = pl->next)
4541                 {
4542                   do_spec_1 ("-isystem", 1, NULL);
4543                   /* Make this a separate argument.  */
4544                   do_spec_1 (" ", 0, NULL);
4545                   do_spec_1 (pl->prefix, 1, NULL);
4546                   do_spec_1 (" ", 0, NULL);
4547                 }
4548             }
4549             break;
4550
4551           case 'o':
4552             {
4553               int max = n_infiles;
4554               max += lang_specific_extra_outfiles;
4555
4556               for (i = 0; i < max; i++)
4557                 if (outfiles[i])
4558                   store_arg (outfiles[i], 0, 0);
4559               break;
4560             }
4561
4562           case 'O':
4563             obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4564             arg_going = 1;
4565             break;
4566
4567           case 's':
4568             this_is_library_file = 1;
4569             break;
4570
4571           case 'w':
4572             this_is_output_file = 1;
4573             break;
4574
4575           case 'W':
4576             {
4577               int cur_index = argbuf_index;
4578               /* Handle the {...} following the %W.  */
4579               if (*p != '{')
4580                 abort ();
4581               p = handle_braces (p + 1);
4582               if (p == 0)
4583                 return -1;
4584               /* If any args were output, mark the last one for deletion
4585                  on failure.  */
4586               if (argbuf_index != cur_index)
4587                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4588               break;
4589             }
4590
4591           /* %x{OPTION} records OPTION for %X to output.  */
4592           case 'x':
4593             {
4594               const char *p1 = p;
4595               char *string;
4596
4597               /* Skip past the option value and make a copy.  */
4598               if (*p != '{')
4599                 abort ();
4600               while (*p++ != '}')
4601                 ;
4602               string = save_string (p1 + 1, p - p1 - 2);
4603
4604               /* See if we already recorded this option.  */
4605               for (i = 0; i < n_linker_options; i++)
4606                 if (! strcmp (string, linker_options[i]))
4607                   {
4608                     free (string);
4609                     return 0;
4610                   }
4611
4612               /* This option is new; add it.  */
4613               add_linker_option (string, strlen (string));
4614             }
4615             break;
4616
4617           /* Dump out the options accumulated previously using %x.  */
4618           case 'X':
4619             for (i = 0; i < n_linker_options; i++)
4620               {
4621                 do_spec_1 (linker_options[i], 1, NULL);
4622                 /* Make each accumulated option a separate argument.  */
4623                 do_spec_1 (" ", 0, NULL);
4624               }
4625             break;
4626
4627           /* Dump out the options accumulated previously using -Wa,.  */
4628           case 'Y':
4629             for (i = 0; i < n_assembler_options; i++)
4630               {
4631                 do_spec_1 (assembler_options[i], 1, NULL);
4632                 /* Make each accumulated option a separate argument.  */
4633                 do_spec_1 (" ", 0, NULL);
4634               }
4635             break;
4636
4637           /* Dump out the options accumulated previously using -Wp,.  */
4638           case 'Z':
4639             for (i = 0; i < n_preprocessor_options; i++)
4640               {
4641                 do_spec_1 (preprocessor_options[i], 1, NULL);
4642                 /* Make each accumulated option a separate argument.  */
4643                 do_spec_1 (" ", 0, NULL);
4644               }
4645             break;
4646
4647             /* Here are digits and numbers that just process
4648                a certain constant string as a spec.  */
4649
4650           case '1':
4651             value = do_spec_1 (cc1_spec, 0, NULL);
4652             if (value != 0)
4653               return value;
4654             break;
4655
4656           case '2':
4657             value = do_spec_1 (cc1plus_spec, 0, NULL);
4658             if (value != 0)
4659               return value;
4660             break;
4661
4662           case 'a':
4663             value = do_spec_1 (asm_spec, 0, NULL);
4664             if (value != 0)
4665               return value;
4666             break;
4667
4668           case 'A':
4669             value = do_spec_1 (asm_final_spec, 0, NULL);
4670             if (value != 0)
4671               return value;
4672             break;
4673
4674           case 'c':
4675             value = do_spec_1 (signed_char_spec, 0, NULL);
4676             if (value != 0)
4677               return value;
4678             break;
4679
4680           case 'C':
4681             {
4682               const char *const spec
4683                 = (input_file_compiler->cpp_spec 
4684                    ? input_file_compiler->cpp_spec 
4685                    : cpp_spec);
4686               value = do_spec_1 (spec, 0, NULL);
4687               if (value != 0)
4688                 return value;
4689             }
4690             break;
4691
4692           case 'E':
4693             value = do_spec_1 (endfile_spec, 0, NULL);
4694             if (value != 0)
4695               return value;
4696             break;
4697
4698           case 'l':
4699             value = do_spec_1 (link_spec, 0, NULL);
4700             if (value != 0)
4701               return value;
4702             break;
4703
4704           case 'L':
4705             value = do_spec_1 (lib_spec, 0, NULL);
4706             if (value != 0)
4707               return value;
4708             break;
4709
4710           case 'G':
4711             value = do_spec_1 (libgcc_spec, 0, NULL);
4712             if (value != 0)
4713               return value;
4714             break;
4715
4716           case 'M':
4717             if (multilib_dir && strcmp (multilib_dir, ".") != 0)
4718               {
4719                 char *p;
4720                 const char *q;
4721                 size_t len;
4722
4723                 len = strlen (multilib_dir);
4724                 obstack_blank (&obstack, len + 1);
4725                 p = obstack_next_free (&obstack) - (len + 1);
4726
4727                 *p++ = '_';
4728                 for (q = multilib_dir; *q ; ++q, ++p)
4729                   *p = (IS_DIR_SEPARATOR (*q) ? '_' : *q);
4730               }
4731             break;
4732
4733           case 'p':
4734             {
4735               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4736               char *buf = x;
4737               const char *y;
4738
4739               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
4740               y = cpp_predefines;
4741               while (*y != 0)
4742                 {
4743                   if (! strncmp (y, "-D", 2))
4744                     /* Copy the whole option.  */
4745                     while (*y && *y != ' ' && *y != '\t')
4746                       *x++ = *y++;
4747                   else if (*y == ' ' || *y == '\t')
4748                     /* Copy whitespace to the result.  */
4749                     *x++ = *y++;
4750                   /* Don't copy other options.  */
4751                   else
4752                     y++;
4753                 }
4754
4755               *x = 0;
4756
4757               value = do_spec_1 (buf, 0, NULL);
4758               if (value != 0)
4759                 return value;
4760             }
4761             break;
4762
4763           case 'P':
4764             {
4765               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4766               char *buf = x;
4767               const char *y;
4768
4769               /* Copy all of CPP_PREDEFINES into BUF,
4770                  but force them all into the reserved name space if they
4771                  aren't already there.  The reserved name space is all
4772                  identifiers beginning with two underscores or with one
4773                  underscore and a capital letter.  We do the forcing by
4774                  adding up to two underscores to the beginning and end
4775                  of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4776                  become __mips__.  */
4777               y = cpp_predefines;
4778               while (*y != 0)
4779                 {
4780                   if (! strncmp (y, "-D", 2))
4781                     {
4782                       int flag = 0;
4783
4784                       *x++ = *y++;
4785                       *x++ = *y++;
4786
4787                       if (*y != '_'
4788                           || (*(y + 1) != '_'
4789                               && ! ISUPPER ((unsigned char) *(y + 1))))
4790                         {
4791                           /* Stick __ at front of macro name.  */
4792                           if (*y != '_')
4793                             *x++ = '_';
4794                           *x++ = '_';
4795                           /* Arrange to stick __ at the end as well.  */
4796                           flag = 1;
4797                         }
4798
4799                       /* Copy the macro name.  */
4800                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
4801                         *x++ = *y++;
4802
4803                       if (flag)
4804                         {
4805                           if (x[-1] != '_')
4806                             {
4807                               if (x[-2] != '_')
4808                                 *x++ = '_';
4809                               *x++ = '_';
4810                             }
4811                         }
4812
4813                       /* Copy the value given, if any.  */
4814                       while (*y && *y != ' ' && *y != '\t')
4815                         *x++ = *y++;
4816                     }
4817                   else if (*y == ' ' || *y == '\t')
4818                     /* Copy whitespace to the result.  */
4819                     *x++ = *y++;
4820                   /* Don't copy -A options  */
4821                   else
4822                     y++;
4823                 }
4824               *x++ = ' ';
4825
4826               /* Copy all of CPP_PREDEFINES into BUF,
4827                  but put __ after every -D.  */
4828               y = cpp_predefines;
4829               while (*y != 0)
4830                 {
4831                   if (! strncmp (y, "-D", 2))
4832                     {
4833                       y += 2;
4834
4835                       if (*y != '_'
4836                           || (*(y + 1) != '_'
4837                               && ! ISUPPER ((unsigned char) *(y + 1))))
4838                         {
4839                           /* Stick -D__ at front of macro name.  */
4840                           *x++ = '-';
4841                           *x++ = 'D';
4842                           if (*y != '_')
4843                             *x++ = '_';
4844                           *x++ = '_';
4845
4846                           /* Copy the macro name.  */
4847                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
4848                             *x++ = *y++;
4849
4850                           /* Copy the value given, if any.  */
4851                           while (*y && *y != ' ' && *y != '\t')
4852                             *x++ = *y++;
4853                         }
4854                       else
4855                         {
4856                           /* Do not copy this macro - we have just done it before */
4857                           while (*y && *y != ' ' && *y != '\t')
4858                             y++;
4859                         }
4860                     }
4861                   else if (*y == ' ' || *y == '\t')
4862                     /* Copy whitespace to the result.  */
4863                     *x++ = *y++;
4864                   /* Don't copy -A options.  */
4865                   else
4866                     y++;
4867                 }
4868               *x++ = ' ';
4869
4870               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4871               y = cpp_predefines;
4872               while (*y != 0)
4873                 {
4874                   if (! strncmp (y, "-A", 2))
4875                     /* Copy the whole option.  */
4876                     while (*y && *y != ' ' && *y != '\t')
4877                       *x++ = *y++;
4878                   else if (*y == ' ' || *y == '\t')
4879                     /* Copy whitespace to the result.  */
4880                     *x++ = *y++;
4881                   /* Don't copy other options.  */
4882                   else
4883                     y++;
4884                 }
4885
4886               *x = 0;
4887
4888               value = do_spec_1 (buf, 0, NULL);
4889               if (value != 0)
4890                 return value;
4891             }
4892             break;
4893
4894           case 'S':
4895             value = do_spec_1 (startfile_spec, 0, NULL);
4896             if (value != 0)
4897               return value;
4898             break;
4899
4900             /* Here we define characters other than letters and digits.  */
4901
4902           case '{':
4903             p = handle_braces (p);
4904             if (p == 0)
4905               return -1;
4906             break;
4907
4908           case '%':
4909             obstack_1grow (&obstack, '%');
4910             break;
4911
4912          case '.':
4913            {
4914              unsigned len = 0;
4915
4916              while (p[len] && p[len] != ' ' && p[len] != '%')
4917                len++;
4918              suffix_subst = save_string (p - 1, len + 1);
4919              p += len;
4920            }
4921            break;
4922           
4923           case '*':
4924             if (soft_matched_part)
4925               {
4926                 do_spec_1 (soft_matched_part, 1, NULL);
4927                 do_spec_1 (" ", 0, NULL);
4928               }
4929             else
4930               /* Catch the case where a spec string contains something like
4931                  '%{foo:%*}'.  ie there is no * in the pattern on the left
4932                  hand side of the :.  */
4933               error ("spec failure: '%%*' has not been initialised by pattern match");
4934             break;
4935
4936             /* Process a string found as the value of a spec given by name.
4937                This feature allows individual machine descriptions
4938                to add and use their own specs.
4939                %[...] modifies -D options the way %P does;
4940                %(...) uses the spec unmodified.  */
4941           case '[':
4942             error ("warning: use of obsolete %%[ operator in specs");
4943           case '(':
4944             {
4945               const char *name = p;
4946               struct spec_list *sl;
4947               int len;
4948
4949               /* The string after the S/P is the name of a spec that is to be
4950                  processed.  */
4951               while (*p && *p != ')' && *p != ']')
4952                 p++;
4953
4954               /* See if it's in the list.  */
4955               for (len = p - name, sl = specs; sl; sl = sl->next)
4956                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4957                   {
4958                     name = *(sl->ptr_spec);
4959 #ifdef DEBUG_SPECS
4960                     notice ("Processing spec %c%s%c, which is '%s'\n",
4961                             c, sl->name, (c == '(') ? ')' : ']', name);
4962 #endif
4963                     break;
4964                   }
4965
4966               if (sl)
4967                 {
4968                   if (c == '(')
4969                     {
4970                       value = do_spec_1 (name, 0, NULL);
4971                       if (value != 0)
4972                         return value;
4973                     }
4974                   else
4975                     {
4976                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4977                       char *buf = x;
4978                       const char *y = name;
4979                       int flag = 0;
4980
4981                       /* Copy all of NAME into BUF, but put __ after
4982                          every -D and at the end of each arg.  */
4983                       while (1)
4984                         {
4985                           if (! strncmp (y, "-D", 2))
4986                             {
4987                               *x++ = '-';
4988                               *x++ = 'D';
4989                               *x++ = '_';
4990                               *x++ = '_';
4991                               y += 2;
4992                               flag = 1;
4993                               continue;
4994                             }
4995                           else if (flag
4996                                    && (*y == ' ' || *y == '\t' || *y == '='
4997                                        || *y == '}' || *y == 0))
4998                             {
4999                               *x++ = '_';
5000                               *x++ = '_';
5001                               flag = 0;
5002                             }
5003                           if (*y == 0)
5004                             break;
5005                           else
5006                             *x++ = *y++;
5007                         }
5008                       *x = 0;
5009
5010                       value = do_spec_1 (buf, 0, NULL);
5011                       if (value != 0)
5012                         return value;
5013                     }
5014                 }
5015
5016               /* Discard the closing paren or bracket.  */
5017               if (*p)
5018                 p++;
5019             }
5020             break;
5021
5022           case 'v':
5023             {
5024               int c1 = *p++;  /* Select first or second version number.  */
5025               const char *v = compiler_version;
5026               const char *q;
5027               static const char zeroc = '0';
5028
5029               /* The format of the version string is
5030                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
5031
5032               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
5033               while (! ISDIGIT (*v))
5034                 v++;
5035               if (v > compiler_version && v[-1] != '-')
5036                 abort ();
5037
5038               /* If desired, advance to second version number.  */
5039               if (c1 >= '2')
5040                 {
5041                   /* Set V after the first period.  */
5042                   while (ISDIGIT (*v))
5043                     v++;
5044                   if (*v != '.')
5045                     abort ();
5046                   v++;
5047                 }
5048
5049               /* If desired, advance to third version number.
5050                  But don't complain if it's not present */
5051               if (c1 == '3')
5052                 {
5053                   /* Set V after the second period.  */
5054                   while (ISDIGIT (*v))
5055                     v++;
5056                   if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
5057                     abort ();
5058                   if (*v != 0)
5059                     v++;
5060                 }
5061
5062               /* Set Q at the next period or at the end.  */
5063               q = v;
5064               while (ISDIGIT (*q))
5065                 q++;
5066               if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
5067                 abort ();
5068
5069               if (q > v)
5070                 /* Put that part into the command.  */
5071                 obstack_grow (&obstack, v, q - v);
5072               else
5073                 /* Default to "0" */
5074                 obstack_grow (&obstack, &zeroc, 1);
5075               arg_going = 1;
5076             }
5077             break;
5078
5079           case '|':
5080             if (input_from_pipe)
5081               do_spec_1 ("-", 0, NULL);
5082             break;
5083
5084           default:
5085             error ("spec failure: unrecognised spec option '%c'", c);
5086             break;
5087           }
5088         break;
5089
5090       case '\\':
5091         /* Backslash: treat next character as ordinary.  */
5092         c = *p++;
5093
5094         /* fall through */
5095       default:
5096         /* Ordinary character: put it into the current argument.  */
5097         obstack_1grow (&obstack, c);
5098         arg_going = 1;
5099       }
5100
5101   /* End of string.  */
5102   return 0;
5103 }
5104
5105 /* Return 0 if we call do_spec_1 and that returns -1.  */
5106
5107 static const char *
5108 handle_braces (p)
5109      const char *p;
5110 {
5111   const char *filter, *body = NULL, *endbody = NULL;
5112   int pipe_p = 0;
5113   int true_once = 0;    /* If, in %{a|b:d}, at least one of a,b was seen.  */
5114   int negate;
5115   int suffix;
5116   int include_blanks = 1;
5117   int elide_switch = 0;
5118   int ordered = 0;
5119
5120   if (*p == '^')
5121     {
5122       /* A '^' after the open-brace means to not give blanks before args.  */
5123       include_blanks = 0;
5124       ++p;
5125     }
5126
5127   if (*p == '|')
5128     {
5129       /* A `|' after the open-brace means,
5130          if the test fails, output a single minus sign rather than nothing.
5131          This is used in %{|!pipe:...}.  */
5132       pipe_p = 1;
5133       ++p;
5134     }
5135
5136   if (*p == '<')
5137     {
5138       /* A `<' after the open-brace means that the switch should be
5139          removed from the command-line.  */
5140       elide_switch = 1;
5141       ++p;
5142     }
5143
5144 next_member:
5145   negate = suffix = 0;
5146
5147   if (*p == '!')
5148     /* A `!' after the open-brace negates the condition:
5149        succeed if the specified switch is not present.  */
5150     negate = 1, ++p;
5151
5152   if (*p == '.')
5153     /* A `.' after the open-brace means test against the current suffix.  */
5154     {
5155       if (pipe_p)
5156         abort ();
5157
5158       suffix = 1;
5159       ++p;
5160     }
5161
5162   if (elide_switch && (negate || pipe_p || suffix))
5163     {
5164       /* It doesn't make sense to mix elision with other flags.  We
5165          could fatal() here, but the standard seems to be to abort.  */
5166       abort ();
5167     }
5168
5169  next_ampersand:
5170   filter = p;
5171   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
5172     p++;
5173
5174   if (*p == '|' && (pipe_p || ordered))
5175     abort ();
5176
5177   if (!body)
5178     {
5179       if (*p != '}' && *p != '&')
5180         {
5181           int count = 1;
5182           const char *q = p;
5183
5184           while (*q++ != ':')
5185             continue;
5186           body = q;
5187
5188           while (count > 0)
5189             {
5190               if (*q == '{')
5191                 count++;
5192               else if (*q == '}')
5193                 count--;
5194               else if (*q == 0)
5195                 fatal ("mismatched braces in specs");
5196               q++;
5197             }
5198           endbody = q;
5199         }
5200       else
5201         body = p, endbody = p + 1;
5202     }
5203
5204   if (suffix)
5205     {
5206       int found = (input_suffix != 0
5207                    && (long) strlen (input_suffix) == (long) (p - filter)
5208                    && strncmp (input_suffix, filter, p - filter) == 0);
5209
5210       if (body[0] == '}')
5211         abort ();
5212
5213       if (negate != found
5214           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL) < 0)
5215         return 0;
5216     }
5217   else if (p[-1] == '*' && (p[0] == '}' || p[0] == '&'))
5218     {
5219       /* Substitute all matching switches as separate args.  */
5220       int i;
5221
5222       for (i = 0; i < n_switches; i++)
5223         if (!strncmp (switches[i].part1, filter, p - 1 - filter)
5224             && check_live_switch (i, p - 1 - filter))
5225           {
5226             if (elide_switch)
5227               {
5228                 switches[i].live_cond = SWITCH_IGNORE;
5229                 switches[i].validated = 1;
5230               }
5231             else
5232               ordered = 1, switches[i].ordering = 1;
5233           }
5234     }
5235   else
5236     {
5237       /* Test for presence of the specified switch.  */
5238       int i;
5239       int present = 0;
5240
5241       /* If name specified ends in *, as in {x*:...},
5242          check for %* and handle that case.  */
5243       if (p[-1] == '*' && !negate)
5244         {
5245           int substitution;
5246           const char *r = body;
5247
5248           /* First see whether we have %*.  */
5249           substitution = 0;
5250           while (r < endbody)
5251             {
5252               if (*r == '%' && r[1] == '*')
5253                 substitution = 1;
5254               r++;
5255             }
5256           /* If we do, handle that case.  */
5257           if (substitution)
5258             {
5259               /* Substitute all matching switches as separate args.
5260                  But do this by substituting for %*
5261                  in the text that follows the colon.  */
5262
5263               unsigned hard_match_len = p - filter - 1;
5264               char *string = save_string (body, endbody - body - 1);
5265
5266               for (i = 0; i < n_switches; i++)
5267                 if (!strncmp (switches[i].part1, filter, hard_match_len)
5268                     && check_live_switch (i, -1))
5269                   {
5270                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
5271                     /* Pass any arguments this switch has.  */
5272                     give_switch (i, 1, 1);
5273                     suffix_subst = NULL;
5274                   }
5275
5276               /* We didn't match.  Try again.  */
5277               if (*p++ == '|')
5278                 goto next_member;
5279               return endbody;
5280             }
5281         }
5282
5283       /* If name specified ends in *, as in {x*:...},
5284          check for presence of any switch name starting with x.  */
5285       if (p[-1] == '*')
5286         {
5287           for (i = 0; i < n_switches; i++)
5288             {
5289               unsigned hard_match_len = p - filter - 1;
5290
5291               if (!strncmp (switches[i].part1, filter, hard_match_len)
5292                   && check_live_switch (i, hard_match_len))
5293                 {
5294                   present = 1;
5295                   break;
5296                 }
5297             }
5298         }
5299       /* Otherwise, check for presence of exact name specified.  */
5300       else
5301         {
5302           for (i = 0; i < n_switches; i++)
5303             {
5304               if (!strncmp (switches[i].part1, filter, p - filter)
5305                   && switches[i].part1[p - filter] == 0
5306                   && check_live_switch (i, -1))
5307                 {
5308                   present = 1;
5309                   break;
5310                 }
5311             }
5312         }
5313
5314       /* If it is as desired (present for %{s...}, absent for %{!s...})
5315          then substitute either the switch or the specified
5316          conditional text.  */
5317       if (present != negate)
5318         {
5319           if (elide_switch)
5320             {
5321               switches[i].live_cond = SWITCH_IGNORE;
5322               switches[i].validated = 1;
5323             }
5324           else if (ordered || *p == '&')
5325             ordered = 1, switches[i].ordering = 1;
5326           else if (*p == '}')
5327             give_switch (i, 0, include_blanks);
5328           else
5329             /* Even if many alternatives are matched, only output once.  */
5330             true_once = 1;
5331         }
5332       else if (pipe_p)
5333         {
5334           /* Here if a %{|...} conditional fails: output a minus sign,
5335              which means "standard output" or "standard input".  */
5336           do_spec_1 ("-", 0, NULL);
5337           return endbody;
5338         }
5339     }
5340
5341   /* We didn't match; try again.  */
5342   if (*p++ == '|')
5343     goto next_member;
5344
5345   if (p[-1] == '&')
5346     {
5347       body = 0;
5348       goto next_ampersand;
5349     }
5350
5351   if (ordered)
5352     {
5353       int i;
5354       /* Doing this set of switches later preserves their command-line
5355          ordering.  This is needed for e.g. -U, -D and -A.  */
5356       for (i = 0; i < n_switches; i++)
5357         if (switches[i].ordering == 1)
5358           {
5359             switches[i].ordering = 0;
5360             give_switch (i, 0, include_blanks);
5361           }
5362     }
5363   /* Process the spec just once, regardless of match count.  */
5364   else if (true_once)
5365     {
5366       if (do_spec_1 (save_string (body, endbody - body - 1),
5367                      0, NULL) < 0)
5368         return 0;
5369     }
5370
5371   return endbody;
5372 }
5373 \f
5374 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5375    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
5376    spec, or -1 if either exact match or %* is used.
5377
5378    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
5379    whose value does not begin with "no-" is obsoleted by the same value
5380    with the "no-", similarly for a switch with the "no-" prefix.  */
5381
5382 static int
5383 check_live_switch (switchnum, prefix_length)
5384      int switchnum;
5385      int prefix_length;
5386 {
5387   const char *name = switches[switchnum].part1;
5388   int i;
5389
5390   /* In the common case of {<at-most-one-letter>*}, a negating
5391      switch would always match, so ignore that case.  We will just
5392      send the conflicting switches to the compiler phase.  */
5393   if (prefix_length >= 0 && prefix_length <= 1)
5394     return 1;
5395
5396   /* If we already processed this switch and determined if it was
5397      live or not, return our past determination.  */
5398   if (switches[switchnum].live_cond != 0)
5399     return switches[switchnum].live_cond > 0;
5400
5401   /* Now search for duplicate in a manner that depends on the name.  */
5402   switch (*name)
5403     {
5404     case 'O':
5405       for (i = switchnum + 1; i < n_switches; i++)
5406         if (switches[i].part1[0] == 'O')
5407           {
5408             switches[switchnum].validated = 1;
5409             switches[switchnum].live_cond = SWITCH_FALSE;
5410             return 0;
5411           }
5412       break;
5413
5414     case 'W':  case 'f':  case 'm':
5415       if (! strncmp (name + 1, "no-", 3))
5416         {
5417           /* We have Xno-YYY, search for XYYY.  */
5418           for (i = switchnum + 1; i < n_switches; i++)
5419             if (switches[i].part1[0] == name[0]
5420                 && ! strcmp (&switches[i].part1[1], &name[4]))
5421               {
5422                 switches[switchnum].validated = 1;
5423                 switches[switchnum].live_cond = SWITCH_FALSE;
5424                 return 0;
5425               }
5426         }
5427       else
5428         {
5429           /* We have XYYY, search for Xno-YYY.  */
5430           for (i = switchnum + 1; i < n_switches; i++)
5431             if (switches[i].part1[0] == name[0]
5432                 && switches[i].part1[1] == 'n'
5433                 && switches[i].part1[2] == 'o'
5434                 && switches[i].part1[3] == '-'
5435                 && !strcmp (&switches[i].part1[4], &name[1]))
5436               {
5437                 switches[switchnum].validated = 1;
5438                 switches[switchnum].live_cond = SWITCH_FALSE;
5439                 return 0;
5440               }
5441         }
5442       break;
5443     }
5444
5445   /* Otherwise the switch is live.  */
5446   switches[switchnum].live_cond = SWITCH_LIVE;
5447   return 1;
5448 }
5449 \f
5450 /* Pass a switch to the current accumulating command
5451    in the same form that we received it.
5452    SWITCHNUM identifies the switch; it is an index into
5453    the vector of switches gcc received, which is `switches'.
5454    This cannot fail since it never finishes a command line.
5455
5456    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
5457
5458    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
5459    of the switch.  */
5460
5461 static void
5462 give_switch (switchnum, omit_first_word, include_blanks)
5463      int switchnum;
5464      int omit_first_word;
5465      int include_blanks;
5466 {
5467   if (switches[switchnum].live_cond == SWITCH_IGNORE)
5468     return;
5469
5470   if (!omit_first_word)
5471     {
5472       do_spec_1 ("-", 0, NULL);
5473       do_spec_1 (switches[switchnum].part1, 1, NULL);
5474     }
5475
5476   if (switches[switchnum].args != 0)
5477     {
5478       const char **p;
5479       for (p = switches[switchnum].args; *p; p++)
5480         {
5481           const char *arg = *p;
5482
5483           if (include_blanks)
5484             do_spec_1 (" ", 0, NULL);
5485           if (suffix_subst)
5486             {
5487               unsigned length = strlen (arg);
5488               int dot = 0;
5489
5490               while (length-- && !IS_DIR_SEPARATOR (arg[length]))
5491                 if (arg[length] == '.')
5492                   {
5493                     ((char *)arg)[length] = 0;
5494                     dot = 1;
5495                     break;
5496                   }
5497               do_spec_1 (arg, 1, NULL);
5498               if (dot)
5499                 ((char *)arg)[length] = '.';
5500               do_spec_1 (suffix_subst, 1, NULL);
5501             }
5502           else
5503             do_spec_1 (arg, 1, NULL);
5504         }
5505     }
5506
5507   do_spec_1 (" ", 0, NULL);
5508   switches[switchnum].validated = 1;
5509 }
5510 \f
5511 /* Search for a file named NAME trying various prefixes including the
5512    user's -B prefix and some standard ones.
5513    Return the absolute file name found.  If nothing is found, return NAME.  */
5514
5515 static const char *
5516 find_file (name)
5517      const char *name;
5518 {
5519   char *newname;
5520
5521   /* Try multilib_dir if it is defined.  */
5522   if (multilib_dir != NULL)
5523     {
5524       const char *const try = ACONCAT ((multilib_dir, dir_separator_str, name, NULL));
5525
5526       newname = find_a_file (&startfile_prefixes, try, R_OK);
5527
5528       /* If we don't find it in the multi library dir, then fall
5529          through and look for it in the normal places.  */
5530       if (newname != NULL)
5531         return newname;
5532     }
5533
5534   newname = find_a_file (&startfile_prefixes, name, R_OK);
5535   return newname ? newname : name;
5536 }
5537
5538 /* Determine whether a directory exists.  If LINKER, return 0 for
5539    certain fixed names not needed by the linker.  If not LINKER, it is
5540    only important to return 0 if the host machine has a small ARG_MAX
5541    limit.  */
5542
5543 static int
5544 is_directory (path1, path2, linker)
5545      const char *path1;
5546      const char *path2;
5547      int linker;
5548 {
5549   int len1 = strlen (path1);
5550   int len2 = strlen (path2);
5551   char *path = (char *) alloca (3 + len1 + len2);
5552   char *cp;
5553   struct stat st;
5554
5555 #ifndef SMALL_ARG_MAX
5556   if (! linker)
5557     return 1;
5558 #endif
5559
5560   /* Construct the path from the two parts.  Ensure the string ends with "/.".
5561      The resulting path will be a directory even if the given path is a
5562      symbolic link.  */
5563   memcpy (path, path1, len1);
5564   memcpy (path + len1, path2, len2);
5565   cp = path + len1 + len2;
5566   if (!IS_DIR_SEPARATOR (cp[-1]))
5567     *cp++ = DIR_SEPARATOR;
5568   *cp++ = '.';
5569   *cp = '\0';
5570
5571   /* Exclude directories that the linker is known to search.  */
5572   if (linker
5573       && ((cp - path == 6
5574            && strcmp (path, concat (dir_separator_str, "lib",
5575                                     dir_separator_str, ".", NULL)) == 0)
5576           || (cp - path == 10
5577               && strcmp (path, concat (dir_separator_str, "usr",
5578                                        dir_separator_str, "lib",
5579                                        dir_separator_str, ".", NULL)) == 0)))
5580     return 0;
5581
5582   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5583 }
5584
5585 /* Set up the various global variables to indicate that we're processing
5586    the input file named FILENAME.  */
5587
5588 void
5589 set_input (filename)
5590      const char *filename;
5591 {
5592   const char *p;
5593
5594   input_filename = filename;
5595   input_filename_length = strlen (input_filename);
5596
5597   input_basename = input_filename;
5598 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5599   /* Skip drive name so 'x:foo' is handled properly.  */
5600   if (input_basename[1] == ':')
5601     input_basename += 2;
5602 #endif
5603   for (p = input_basename; *p; p++)
5604     if (IS_DIR_SEPARATOR (*p))
5605       input_basename = p + 1;
5606
5607   /* Find a suffix starting with the last period,
5608      and set basename_length to exclude that suffix.  */
5609   basename_length = strlen (input_basename);
5610   suffixed_basename_length = basename_length;
5611   p = input_basename + basename_length;
5612   while (p != input_basename && *p != '.')
5613     --p;
5614   if (*p == '.' && p != input_basename)
5615     {
5616       basename_length = p - input_basename;
5617       input_suffix = p + 1;
5618     }
5619   else
5620     input_suffix = "";
5621 }
5622 \f
5623 /* On fatal signals, delete all the temporary files.  */
5624
5625 static void
5626 fatal_error (signum)
5627      int signum;
5628 {
5629   signal (signum, SIG_DFL);
5630   delete_failure_queue ();
5631   delete_temp_files ();
5632   /* Get the same signal again, this time not handled,
5633      so its normal effect occurs.  */
5634   kill (getpid (), signum);
5635 }
5636
5637 extern int main PARAMS ((int, const char *const *));
5638
5639 int
5640 main (argc, argv)
5641      int argc;
5642      const char *const *argv;
5643 {
5644   size_t i;
5645   int value;
5646   int linker_was_run = 0;
5647   char *explicit_link_files;
5648   char *specs_file;
5649   const char *p;
5650   struct user_specs *uptr;
5651
5652   p = argv[0] + strlen (argv[0]);
5653   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5654     --p;
5655   programname = p;
5656
5657   xmalloc_set_program_name (programname);
5658
5659 #ifdef GCC_DRIVER_HOST_INITIALIZATION
5660   /* Perform host dependent initialization when needed.  */
5661   GCC_DRIVER_HOST_INITIALIZATION;
5662 #endif
5663
5664   gcc_init_libintl ();
5665
5666   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5667     signal (SIGINT, fatal_error);
5668 #ifdef SIGHUP
5669   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5670     signal (SIGHUP, fatal_error);
5671 #endif
5672   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5673     signal (SIGTERM, fatal_error);
5674 #ifdef SIGPIPE
5675   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5676     signal (SIGPIPE, fatal_error);
5677 #endif
5678 #ifdef SIGCHLD
5679   /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
5680      receive the signal.  A different setting is inheritable */
5681   signal (SIGCHLD, SIG_DFL);
5682 #endif
5683
5684   argbuf_length = 10;
5685   argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
5686
5687   obstack_init (&obstack);
5688
5689   /* Build multilib_select, et. al from the separate lines that make up each
5690      multilib selection.  */
5691   {
5692     const char *const *q = multilib_raw;
5693     int need_space;
5694
5695     obstack_init (&multilib_obstack);
5696     while ((p = *q++) != (char *) 0)
5697       obstack_grow (&multilib_obstack, p, strlen (p));
5698
5699     obstack_1grow (&multilib_obstack, 0);
5700     multilib_select = obstack_finish (&multilib_obstack);
5701
5702     q = multilib_matches_raw;
5703     while ((p = *q++) != (char *) 0)
5704       obstack_grow (&multilib_obstack, p, strlen (p));
5705
5706     obstack_1grow (&multilib_obstack, 0);
5707     multilib_matches = obstack_finish (&multilib_obstack);
5708
5709     q = multilib_exclusions_raw;
5710     while ((p = *q++) != (char *) 0)
5711       obstack_grow (&multilib_obstack, p, strlen (p));
5712
5713     obstack_1grow (&multilib_obstack, 0);
5714     multilib_exclusions = obstack_finish (&multilib_obstack);
5715
5716     need_space = FALSE;
5717     for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
5718       {
5719         if (need_space)
5720           obstack_1grow (&multilib_obstack, ' ');
5721         obstack_grow (&multilib_obstack,
5722                       multilib_defaults_raw[i],
5723                       strlen (multilib_defaults_raw[i]));
5724         need_space = TRUE;
5725       }
5726
5727     obstack_1grow (&multilib_obstack, 0);
5728     multilib_defaults = obstack_finish (&multilib_obstack);
5729   }
5730
5731   /* Set up to remember the pathname of gcc and any options
5732      needed for collect.  We use argv[0] instead of programname because
5733      we need the complete pathname.  */
5734   obstack_init (&collect_obstack);
5735   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
5736   obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
5737   putenv (obstack_finish (&collect_obstack));
5738
5739 #ifdef INIT_ENVIRONMENT
5740   /* Set up any other necessary machine specific environment variables.  */
5741   putenv (INIT_ENVIRONMENT);
5742 #endif
5743
5744   /* Make a table of what switches there are (switches, n_switches).
5745      Make a table of specified input files (infiles, n_infiles).
5746      Decode switches that are handled locally.  */
5747
5748   process_command (argc, argv);
5749
5750   /* Initialize the vector of specs to just the default.
5751      This means one element containing 0s, as a terminator.  */
5752
5753   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
5754   memcpy ((char *) compilers, (char *) default_compilers,
5755           sizeof default_compilers);
5756   n_compilers = n_default_compilers;
5757
5758   /* Read specs from a file if there is one.  */
5759
5760   machine_suffix = concat (spec_machine, dir_separator_str,
5761                            spec_version, dir_separator_str, NULL);
5762   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
5763
5764   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
5765   /* Read the specs file unless it is a default one.  */
5766   if (specs_file != 0 && strcmp (specs_file, "specs"))
5767     read_specs (specs_file, TRUE);
5768   else
5769     init_spec ();
5770
5771   /* We need to check standard_exec_prefix/just_machine_suffix/specs
5772      for any override of as, ld and libraries.  */
5773   specs_file = (char *) alloca (strlen (standard_exec_prefix)
5774                                 + strlen (just_machine_suffix)
5775                                 + sizeof ("specs"));
5776
5777   strcpy (specs_file, standard_exec_prefix);
5778   strcat (specs_file, just_machine_suffix);
5779   strcat (specs_file, "specs");
5780   if (access (specs_file, R_OK) == 0)
5781     read_specs (specs_file, TRUE);
5782
5783   /* If not cross-compiling, look for startfiles in the standard places.  */
5784   if (*cross_compile == '0')
5785     {
5786       if (*md_exec_prefix)
5787         {
5788           add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
5789                       PREFIX_PRIORITY_LAST, 0, NULL);
5790           add_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
5791                       PREFIX_PRIORITY_LAST, 0, NULL);
5792         }
5793
5794       if (*md_startfile_prefix)
5795         add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5796                     PREFIX_PRIORITY_LAST, 0, NULL);
5797
5798       if (*md_startfile_prefix_1)
5799         add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5800                     PREFIX_PRIORITY_LAST, 0, NULL);
5801
5802       /* If standard_startfile_prefix is relative, base it on
5803          standard_exec_prefix.  This lets us move the installed tree
5804          as a unit.  If GCC_EXEC_PREFIX is defined, base
5805          standard_startfile_prefix on that as well.  */
5806       if (IS_ABSOLUTE_PATHNAME (standard_startfile_prefix))
5807         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5808                     PREFIX_PRIORITY_LAST, 0, NULL);
5809       else
5810         {
5811           if (gcc_exec_prefix)
5812             add_prefix (&startfile_prefixes,
5813                         concat (gcc_exec_prefix, machine_suffix,
5814                                 standard_startfile_prefix, NULL),
5815                         NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5816           add_prefix (&startfile_prefixes,
5817                       concat (standard_exec_prefix,
5818                               machine_suffix,
5819                               standard_startfile_prefix, NULL),
5820                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5821         }
5822
5823       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5824                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5825       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5826                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5827 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
5828       add_prefix (&startfile_prefixes, "./", NULL,
5829                   PREFIX_PRIORITY_LAST, 1, NULL);
5830 #endif
5831     }
5832   else
5833     {
5834       if (!IS_ABSOLUTE_PATHNAME (standard_startfile_prefix)
5835           && gcc_exec_prefix)
5836         add_prefix (&startfile_prefixes,
5837                     concat (gcc_exec_prefix, machine_suffix,
5838                             standard_startfile_prefix, NULL),
5839                     "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5840     }
5841
5842   /* Process any user specified specs in the order given on the command
5843      line.  */
5844   for (uptr = user_specs_head; uptr; uptr = uptr->next)
5845     {
5846       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5847       read_specs (filename ? filename : uptr->filename, FALSE);
5848     }
5849
5850   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
5851   if (gcc_exec_prefix)
5852     gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
5853                               spec_version, dir_separator_str, NULL);
5854
5855   /* Now we have the specs.
5856      Set the `valid' bits for switches that match anything in any spec.  */
5857
5858   validate_all_switches ();
5859
5860   /* Now that we have the switches and the specs, set
5861      the subdirectory based on the options.  */
5862   set_multilib_dir ();
5863
5864   /* Warn about any switches that no pass was interested in.  */
5865
5866   for (i = 0; (int) i < n_switches; i++)
5867     if (! switches[i].validated)
5868       error ("unrecognized option `-%s'", switches[i].part1);
5869
5870   /* Obey some of the options.  */
5871
5872   if (print_search_dirs)
5873     {
5874       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5875       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5876       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
5877       return (0);
5878     }
5879
5880   if (print_file_name)
5881     {
5882       printf ("%s\n", find_file (print_file_name));
5883       return (0);
5884     }
5885
5886   if (print_prog_name)
5887     {
5888       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
5889       printf ("%s\n", (newname ? newname : print_prog_name));
5890       return (0);
5891     }
5892
5893   if (print_multi_lib)
5894     {
5895       print_multilib_info ();
5896       return (0);
5897     }
5898
5899   if (print_multi_directory)
5900     {
5901       if (multilib_dir == NULL)
5902         printf (".\n");
5903       else
5904         printf ("%s\n", multilib_dir);
5905       return (0);
5906     }
5907
5908   if (target_help_flag)
5909    {
5910       /* Print if any target specific options.*/
5911
5912       /* We do not exit here. Instead we have created a fake input file
5913          called 'target-dummy' which needs to be compiled, and we pass this
5914          on to the various sub-processes, along with the --target-help
5915          switch.  */
5916     }
5917
5918   if (print_help_list)
5919     {
5920       display_help ();
5921
5922       if (! verbose_flag)
5923         {
5924           printf (_("\nFor bug reporting instructions, please see:\n"));
5925           printf ("%s.\n", GCCBUGURL);
5926
5927           return (0);
5928         }
5929
5930       /* We do not exit here.  Instead we have created a fake input file
5931          called 'help-dummy' which needs to be compiled, and we pass this
5932          on the various sub-processes, along with the --help switch.  */
5933     }
5934
5935   if (verbose_flag)
5936     {
5937       int n;
5938       const char *thrmod;
5939
5940       notice ("Configured with: %s\n", configuration_arguments);
5941
5942 #ifdef THREAD_MODEL_SPEC
5943       /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
5944          but there's no point in doing all this processing just to get
5945          thread_model back.  */
5946       obstack_init (&obstack);
5947       do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
5948       obstack_1grow (&obstack, '\0');
5949       thrmod = obstack_finish (&obstack);
5950 #else
5951       thrmod = thread_model;
5952 #endif
5953
5954       notice ("Thread model: %s\n", thrmod);
5955
5956       /* compiler_version is truncated at the first space when initialized
5957          from version string, so truncate version_string at the first space
5958          before comparing.  */
5959       for (n = 0; version_string[n]; n++)
5960         if (version_string[n] == ' ')
5961           break;
5962
5963       if (! strncmp (version_string, compiler_version, n)
5964           && compiler_version[n] == 0)
5965         notice ("gcc version %s\n", version_string);
5966       else
5967         notice ("gcc driver version %s executing gcc version %s\n",
5968                 version_string, compiler_version);
5969
5970       if (n_infiles == 0)
5971         return (0);
5972     }
5973
5974   if (n_infiles == added_libraries)
5975     fatal ("no input files");
5976
5977   /* Make a place to record the compiler output file names
5978      that correspond to the input files.  */
5979
5980   i = n_infiles;
5981   i += lang_specific_extra_outfiles;
5982   outfiles = (const char **) xcalloc (i, sizeof (char *));
5983
5984   /* Record which files were specified explicitly as link input.  */
5985
5986   explicit_link_files = xcalloc (1, n_infiles);
5987
5988   for (i = 0; (int) i < n_infiles; i++)
5989     {
5990       int this_file_error = 0;
5991
5992       /* Tell do_spec what to substitute for %i.  */
5993
5994       input_file_number = i;
5995       set_input (infiles[i].name);
5996
5997       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5998
5999       outfiles[i] = input_filename;
6000
6001       /* Figure out which compiler from the file's suffix.  */
6002
6003       input_file_compiler
6004         = lookup_compiler (infiles[i].name, input_filename_length,
6005                            infiles[i].language);
6006       
6007       if (input_file_compiler)
6008         {
6009           /* Ok, we found an applicable compiler.  Run its spec.  */
6010
6011           if (input_file_compiler->spec[0] == '#')
6012             {
6013               error ("%s: %s compiler not installed on this system",
6014                      input_filename, &input_file_compiler->spec[1]);
6015               this_file_error = 1;
6016             }
6017           else
6018             {
6019               value = do_spec (input_file_compiler->spec);
6020               if (value < 0)
6021                 this_file_error = 1;
6022             }
6023         }
6024
6025       /* If this file's name does not contain a recognized suffix,
6026          record it as explicit linker input.  */
6027
6028       else
6029         explicit_link_files[i] = 1;
6030
6031       /* Clear the delete-on-failure queue, deleting the files in it
6032          if this compilation failed.  */
6033
6034       if (this_file_error)
6035         {
6036           delete_failure_queue ();
6037           error_count++;
6038         }
6039       /* If this compilation succeeded, don't delete those files later.  */
6040       clear_failure_queue ();
6041     }
6042
6043   /* Reset the output file name to the first input file name, for use
6044      with %b in LINK_SPEC on a target that prefers not to emit a.out
6045      by default.  */
6046   if (n_infiles > 0)
6047     set_input (infiles[0].name);
6048
6049   if (error_count == 0)
6050     {
6051       /* Make sure INPUT_FILE_NUMBER points to first available open
6052          slot.  */
6053       input_file_number = n_infiles;
6054       if (lang_specific_pre_link ())
6055         error_count++;
6056     }
6057
6058   /* Run ld to link all the compiler output files.  */
6059
6060   if (error_count == 0)
6061     {
6062       int tmp = execution_count;
6063
6064       /* We'll use ld if we can't find collect2.  */
6065       if (! strcmp (linker_name_spec, "collect2"))
6066         {
6067           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
6068           if (s == NULL)
6069             linker_name_spec = "ld";
6070         }
6071       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
6072          for collect.  */
6073       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
6074       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
6075
6076       value = do_spec (link_command_spec);
6077       if (value < 0)
6078         error_count = 1;
6079       linker_was_run = (tmp != execution_count);
6080     }
6081
6082   /* If options said don't run linker,
6083      complain about input files to be given to the linker.  */
6084
6085   if (! linker_was_run && error_count == 0)
6086     for (i = 0; (int) i < n_infiles; i++)
6087       if (explicit_link_files[i])
6088         error ("%s: linker input file unused because linking not done",
6089                outfiles[i]);
6090
6091   /* Delete some or all of the temporary files we made.  */
6092
6093   if (error_count)
6094     delete_failure_queue ();
6095   delete_temp_files ();
6096
6097   if (print_help_list)
6098     {
6099       printf (("\nFor bug reporting instructions, please see:\n"));
6100       printf ("%s\n", GCCBUGURL);
6101     }
6102
6103   return (signal_count != 0 ? 2
6104           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
6105           : 0);
6106 }
6107
6108 /* Find the proper compilation spec for the file name NAME,
6109    whose length is LENGTH.  LANGUAGE is the specified language,
6110    or 0 if this file is to be passed to the linker.  */
6111
6112 static struct compiler *
6113 lookup_compiler (name, length, language)
6114      const char *name;
6115      size_t length;
6116      const char *language;
6117 {
6118   struct compiler *cp;
6119
6120   /* If this was specified by the user to be a linker input, indicate that.  */
6121   if (language != 0 && language[0] == '*')
6122     return 0;
6123
6124   /* Otherwise, look for the language, if one is spec'd.  */
6125   if (language != 0)
6126     {
6127       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6128         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
6129           return cp;
6130
6131       error ("language %s not recognized", language);
6132       return 0;
6133     }
6134
6135   /* Look for a suffix.  */
6136   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6137     {
6138       if (/* The suffix `-' matches only the file name `-'.  */
6139           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6140           || (strlen (cp->suffix) < length
6141               /* See if the suffix matches the end of NAME.  */
6142               && !strcmp (cp->suffix,
6143                           name + length - strlen (cp->suffix))
6144          ))
6145         break;
6146     }
6147
6148 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6149   /* look again, but case-insensitively this time.  */
6150   if (cp < compilers)
6151     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6152       {
6153         if (/* The suffix `-' matches only the file name `-'.  */
6154             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6155             || (strlen (cp->suffix) < length
6156                 /* See if the suffix matches the end of NAME.  */
6157                 && ((!strcmp (cp->suffix,
6158                              name + length - strlen (cp->suffix))
6159                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
6160                     && !strcasecmp (cp->suffix,
6161                                     name + length - strlen (cp->suffix)))
6162            ))
6163           break;
6164       }
6165 #endif
6166
6167   if (cp >= compilers)
6168     {
6169       if (cp->spec[0] != '@')
6170         /* A non-alias entry: return it.  */
6171         return cp;
6172
6173       /* An alias entry maps a suffix to a language.
6174          Search for the language; pass 0 for NAME and LENGTH
6175          to avoid infinite recursion if language not found.  */
6176       return lookup_compiler (NULL, 0, cp->spec + 1);
6177     }
6178   return 0;
6179 }
6180 \f
6181 static char *
6182 save_string (s, len)
6183      const char *s;
6184      int len;
6185 {
6186   char *result = xmalloc (len + 1);
6187
6188   memcpy (result, s, len);
6189   result[len] = 0;
6190   return result;
6191 }
6192
6193 void
6194 pfatal_with_name (name)
6195      const char *name;
6196 {
6197   perror_with_name (name);
6198   delete_temp_files ();
6199   exit (1);
6200 }
6201
6202 static void
6203 perror_with_name (name)
6204      const char *name;
6205 {
6206   error ("%s: %s", name, xstrerror (errno));
6207 }
6208
6209 static void
6210 pfatal_pexecute (errmsg_fmt, errmsg_arg)
6211      const char *errmsg_fmt;
6212      const char *errmsg_arg;
6213 {
6214   if (errmsg_arg)
6215     {
6216       int save_errno = errno;
6217
6218       /* Space for trailing '\0' is in %s.  */
6219       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
6220       sprintf (msg, errmsg_fmt, errmsg_arg);
6221       errmsg_fmt = msg;
6222
6223       errno = save_errno;
6224     }
6225
6226   pfatal_with_name (errmsg_fmt);
6227 }
6228
6229 /* Output an error message and exit */
6230
6231 void
6232 fancy_abort ()
6233 {
6234   fatal ("internal gcc abort");
6235 }
6236 \f
6237 /* Output an error message and exit */
6238
6239 void
6240 fatal VPARAMS ((const char *msgid, ...))
6241 {
6242   VA_OPEN (ap, msgid);
6243   VA_FIXEDARG (ap, const char *, msgid);
6244
6245   fprintf (stderr, "%s: ", programname);
6246   vfprintf (stderr, _(msgid), ap);
6247   VA_CLOSE (ap);
6248   fprintf (stderr, "\n");
6249   delete_temp_files ();
6250   exit (1);
6251 }
6252
6253 void
6254 error VPARAMS ((const char *msgid, ...))
6255 {
6256   VA_OPEN (ap, msgid);
6257   VA_FIXEDARG (ap, const char *, msgid);
6258
6259   fprintf (stderr, "%s: ", programname);
6260   vfprintf (stderr, _(msgid), ap);
6261   VA_CLOSE (ap);
6262
6263   fprintf (stderr, "\n");
6264 }
6265
6266 static void
6267 notice VPARAMS ((const char *msgid, ...))
6268 {
6269   VA_OPEN (ap, msgid);
6270   VA_FIXEDARG (ap, const char *, msgid);
6271
6272   vfprintf (stderr, _(msgid), ap);
6273   VA_CLOSE (ap);
6274 }
6275 \f
6276 static void
6277 validate_all_switches ()
6278 {
6279   struct compiler *comp;
6280   const char *p;
6281   char c;
6282   struct spec_list *spec;
6283
6284   for (comp = compilers; comp->spec; comp++)
6285     {
6286       p = comp->spec;
6287       while ((c = *p++))
6288         if (c == '%' && *p == '{')
6289           /* We have a switch spec.  */
6290           validate_switches (p + 1);
6291     }
6292
6293   /* Look through the linked list of specs read from the specs file.  */
6294   for (spec = specs; spec; spec = spec->next)
6295     {
6296       p = *(spec->ptr_spec);
6297       while ((c = *p++))
6298         if (c == '%' && *p == '{')
6299           /* We have a switch spec.  */
6300           validate_switches (p + 1);
6301     }
6302
6303   p = link_command_spec;
6304   while ((c = *p++))
6305     if (c == '%' && *p == '{')
6306       /* We have a switch spec.  */
6307       validate_switches (p + 1);
6308 }
6309
6310 /* Look at the switch-name that comes after START
6311    and mark as valid all supplied switches that match it.  */
6312
6313 static void
6314 validate_switches (start)
6315      const char *start;
6316 {
6317   const char *p = start;
6318   const char *filter;
6319   int i;
6320   int suffix;
6321
6322   if (*p == '|')
6323     ++p;
6324
6325 next_member:
6326   if (*p == '!')
6327     ++p;
6328
6329   suffix = 0;
6330   if (*p == '.')
6331     suffix = 1, ++p;
6332
6333   filter = p;
6334   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
6335     p++;
6336
6337   if (suffix)
6338     ;
6339   else if (p[-1] == '*')
6340     {
6341       /* Mark all matching switches as valid.  */
6342       for (i = 0; i < n_switches; i++)
6343         if (!strncmp (switches[i].part1, filter, p - filter - 1))
6344           switches[i].validated = 1;
6345     }
6346   else
6347     {
6348       /* Mark an exact matching switch as valid.  */
6349       for (i = 0; i < n_switches; i++)
6350         {
6351           if (!strncmp (switches[i].part1, filter, p - filter)
6352               && switches[i].part1[p - filter] == 0)
6353             switches[i].validated = 1;
6354         }
6355     }
6356
6357   if (*p++ == '|' || p[-1] == '&')
6358     goto next_member;
6359 }
6360 \f
6361 /* Check whether a particular argument was used.  The first time we
6362    canonicalize the switches to keep only the ones we care about.  */
6363
6364 static int
6365 used_arg (p, len)
6366      const char *p;
6367      int len;
6368 {
6369   struct mswitchstr
6370   {
6371     const char *str;
6372     const char *replace;
6373     int len;
6374     int rep_len;
6375   };
6376
6377   static struct mswitchstr *mswitches;
6378   static int n_mswitches;
6379   int i, j;
6380
6381   if (!mswitches)
6382     {
6383       struct mswitchstr *matches;
6384       const char *q;
6385       int cnt = 0;
6386
6387       /* Break multilib_matches into the component strings of string
6388          and replacement string.  */
6389       for (q = multilib_matches; *q != '\0'; q++)
6390         if (*q == ';')
6391           cnt++;
6392
6393       matches =
6394         (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
6395       i = 0;
6396       q = multilib_matches;
6397       while (*q != '\0')
6398         {
6399           matches[i].str = q;
6400           while (*q != ' ')
6401             {
6402               if (*q == '\0')
6403                 abort ();
6404               q++;
6405             }
6406           matches[i].len = q - matches[i].str;
6407
6408           matches[i].replace = ++q;
6409           while (*q != ';' && *q != '\0')
6410             {
6411               if (*q == ' ')
6412                 abort ();
6413               q++;
6414             }
6415           matches[i].rep_len = q - matches[i].replace;
6416           i++;
6417           if (*q == ';')
6418             q++;
6419         }
6420
6421       /* Now build a list of the replacement string for switches that we care
6422          about.  Make sure we allocate at least one entry.  This prevents
6423          xmalloc from calling fatal, and prevents us from re-executing this
6424          block of code.  */
6425       mswitches
6426         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
6427                                          * (n_switches ? n_switches : 1));
6428       for (i = 0; i < n_switches; i++)
6429         {
6430           int xlen = strlen (switches[i].part1);
6431           for (j = 0; j < cnt; j++)
6432             if (xlen == matches[j].len
6433                 && ! strncmp (switches[i].part1, matches[j].str, xlen))
6434               {
6435                 mswitches[n_mswitches].str = matches[j].replace;
6436                 mswitches[n_mswitches].len = matches[j].rep_len;
6437                 mswitches[n_mswitches].replace = (char *) 0;
6438                 mswitches[n_mswitches].rep_len = 0;
6439                 n_mswitches++;
6440                 break;
6441               }
6442         }
6443     }
6444
6445   for (i = 0; i < n_mswitches; i++)
6446     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
6447       return 1;
6448
6449   return 0;
6450 }
6451
6452 static int
6453 default_arg (p, len)
6454      const char *p;
6455      int len;
6456 {
6457   const char *start, *end;
6458
6459   for (start = multilib_defaults; *start != '\0'; start = end + 1)
6460     {
6461       while (*start == ' ' || *start == '\t')
6462         start++;
6463
6464       if (*start == '\0')
6465         break;
6466
6467       for (end = start + 1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
6468         ;
6469
6470       if ((end - start) == len && strncmp (p, start, len) == 0)
6471         return 1;
6472
6473       if (*end == '\0')
6474         break;
6475     }
6476
6477   return 0;
6478 }
6479
6480 /* Work out the subdirectory to use based on the options. The format of
6481    multilib_select is a list of elements. Each element is a subdirectory
6482    name followed by a list of options followed by a semicolon. The format
6483    of multilib_exclusions is the same, but without the preceding
6484    directory. First gcc will check the exclusions, if none of the options
6485    beginning with an exclamation point are present, and all of the other
6486    options are present, then we will ignore this completely. Passing
6487    that, gcc will consider each multilib_select in turn using the same
6488    rules for matching the options. If a match is found, that subdirectory
6489    will be used.  */
6490
6491 static void
6492 set_multilib_dir ()
6493 {
6494   const char *p;
6495   unsigned int this_path_len;
6496   const char *this_path, *this_arg;
6497   int not_arg;
6498   int ok;
6499
6500   p = multilib_exclusions;
6501   while (*p != '\0')
6502     {
6503       /* Ignore newlines.  */
6504       if (*p == '\n')
6505         {
6506           ++p;
6507           continue;
6508         }
6509
6510       /* Check the arguments.  */
6511       ok = 1;
6512       while (*p != ';')
6513         {
6514           if (*p == '\0')
6515             abort ();
6516
6517           if (! ok)
6518             {
6519               ++p;
6520               continue;
6521             }
6522
6523           this_arg = p;
6524           while (*p != ' ' && *p != ';')
6525             {
6526               if (*p == '\0')
6527                 abort ();
6528               ++p;
6529             }
6530
6531           if (*this_arg != '!')
6532             not_arg = 0;
6533           else
6534             {
6535               not_arg = 1;
6536               ++this_arg;
6537             }
6538
6539           ok = used_arg (this_arg, p - this_arg);
6540           if (not_arg)
6541             ok = ! ok;
6542
6543           if (*p == ' ')
6544             ++p;
6545         }
6546
6547       if (ok)
6548         return;
6549
6550       ++p;
6551     }
6552
6553   p = multilib_select;
6554   while (*p != '\0')
6555     {
6556       /* Ignore newlines.  */
6557       if (*p == '\n')
6558         {
6559           ++p;
6560           continue;
6561         }
6562
6563       /* Get the initial path.  */
6564       this_path = p;
6565       while (*p != ' ')
6566         {
6567           if (*p == '\0')
6568             abort ();
6569           ++p;
6570         }
6571       this_path_len = p - this_path;
6572
6573       /* Check the arguments.  */
6574       ok = 1;
6575       ++p;
6576       while (*p != ';')
6577         {
6578           if (*p == '\0')
6579             abort ();
6580
6581           if (! ok)
6582             {
6583               ++p;
6584               continue;
6585             }
6586
6587           this_arg = p;
6588           while (*p != ' ' && *p != ';')
6589             {
6590               if (*p == '\0')
6591                 abort ();
6592               ++p;
6593             }
6594
6595           if (*this_arg != '!')
6596             not_arg = 0;
6597           else
6598             {
6599               not_arg = 1;
6600               ++this_arg;
6601             }
6602
6603           /* If this is a default argument, we can just ignore it.
6604              This is true even if this_arg begins with '!'.  Beginning
6605              with '!' does not mean that this argument is necessarily
6606              inappropriate for this library: it merely means that
6607              there is a more specific library which uses this
6608              argument.  If this argument is a default, we need not
6609              consider that more specific library.  */
6610           if (! default_arg (this_arg, p - this_arg))
6611             {
6612               ok = used_arg (this_arg, p - this_arg);
6613               if (not_arg)
6614                 ok = ! ok;
6615             }
6616
6617           if (*p == ' ')
6618             ++p;
6619         }
6620
6621       if (ok)
6622         {
6623           if (this_path_len != 1
6624               || this_path[0] != '.')
6625             {
6626               char *new_multilib_dir = xmalloc (this_path_len + 1);
6627               strncpy (new_multilib_dir, this_path, this_path_len);
6628               new_multilib_dir[this_path_len] = '\0';
6629               multilib_dir = new_multilib_dir;
6630             }
6631           break;
6632         }
6633
6634       ++p;
6635     }
6636 }
6637
6638 /* Print out the multiple library subdirectory selection
6639    information.  This prints out a series of lines.  Each line looks
6640    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6641    required.  Only the desired options are printed out, the negative
6642    matches.  The options are print without a leading dash.  There are
6643    no spaces to make it easy to use the information in the shell.
6644    Each subdirectory is printed only once.  This assumes the ordering
6645    generated by the genmultilib script. Also, we leave out ones that match
6646    the exclusions.  */
6647
6648 static void
6649 print_multilib_info ()
6650 {
6651   const char *p = multilib_select;
6652   const char *last_path = 0, *this_path;
6653   int skip;
6654   unsigned int last_path_len = 0;
6655
6656   while (*p != '\0')
6657     {
6658       skip = 0;
6659       /* Ignore newlines.  */
6660       if (*p == '\n')
6661         {
6662           ++p;
6663           continue;
6664         }
6665
6666       /* Get the initial path.  */
6667       this_path = p;
6668       while (*p != ' ')
6669         {
6670           if (*p == '\0')
6671             abort ();
6672           ++p;
6673         }
6674
6675       /* Check for matches with the multilib_exclusions. We don't bother
6676          with the '!' in either list. If any of the exclusion rules match
6677          all of its options with the select rule, we skip it.  */
6678       {
6679         const char *e = multilib_exclusions;
6680         const char *this_arg;
6681
6682         while (*e != '\0')
6683           {
6684             int m = 1;
6685             /* Ignore newlines.  */
6686             if (*e == '\n')
6687               {
6688                 ++e;
6689                 continue;
6690               }
6691
6692             /* Check the arguments.  */
6693             while (*e != ';')
6694               {
6695                 const char *q;
6696                 int mp = 0;
6697
6698                 if (*e == '\0')
6699                   abort ();
6700
6701                 if (! m)
6702                   {
6703                     ++e;
6704                     continue;
6705                   }
6706
6707                 this_arg = e;
6708
6709                 while (*e != ' ' && *e != ';')
6710                   {
6711                     if (*e == '\0')
6712                       abort ();
6713                     ++e;
6714                   }
6715
6716                 q = p + 1;
6717                 while (*q != ';')
6718                   {
6719                     const char *arg;
6720                     int len = e - this_arg;
6721
6722                     if (*q == '\0')
6723                       abort ();
6724
6725                     arg = q;
6726
6727                     while (*q != ' ' && *q != ';')
6728                       {
6729                         if (*q == '\0')
6730                           abort ();
6731                         ++q;
6732                       }
6733
6734                     if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6735                         default_arg (this_arg, e - this_arg))
6736                       {
6737                         mp = 1;
6738                         break;
6739                       }
6740
6741                     if (*q == ' ')
6742                       ++q;
6743                   }
6744
6745                 if (! mp)
6746                   m = 0;
6747
6748                 if (*e == ' ')
6749                   ++e;
6750               }
6751
6752             if (m)
6753               {
6754                 skip = 1;
6755                 break;
6756               }
6757
6758             if (*e != '\0')
6759               ++e;
6760           }
6761       }
6762
6763       if (! skip)
6764         {
6765           /* If this is a duplicate, skip it.  */
6766           skip = (last_path != 0 && (unsigned int) (p - this_path) == last_path_len
6767                   && ! strncmp (last_path, this_path, last_path_len));
6768
6769           last_path = this_path;
6770           last_path_len = p - this_path;
6771         }
6772
6773       /* If this directory requires any default arguments, we can skip
6774          it.  We will already have printed a directory identical to
6775          this one which does not require that default argument.  */
6776       if (! skip)
6777         {
6778           const char *q;
6779
6780           q = p + 1;
6781           while (*q != ';')
6782             {
6783               const char *arg;
6784
6785               if (*q == '\0')
6786                 abort ();
6787
6788               if (*q == '!')
6789                 arg = NULL;
6790               else
6791                 arg = q;
6792
6793               while (*q != ' ' && *q != ';')
6794                 {
6795                   if (*q == '\0')
6796                     abort ();
6797                   ++q;
6798                 }
6799
6800               if (arg != NULL
6801                   && default_arg (arg, q - arg))
6802                 {
6803                   skip = 1;
6804                   break;
6805                 }
6806
6807               if (*q == ' ')
6808                 ++q;
6809             }
6810         }
6811
6812       if (! skip)
6813         {
6814           const char *p1;
6815
6816           for (p1 = last_path; p1 < p; p1++)
6817             putchar (*p1);
6818           putchar (';');
6819         }
6820
6821       ++p;
6822       while (*p != ';')
6823         {
6824           int use_arg;
6825
6826           if (*p == '\0')
6827             abort ();
6828
6829           if (skip)
6830             {
6831               ++p;
6832               continue;
6833             }
6834
6835           use_arg = *p != '!';
6836
6837           if (use_arg)
6838             putchar ('@');
6839
6840           while (*p != ' ' && *p != ';')
6841             {
6842               if (*p == '\0')
6843                 abort ();
6844               if (use_arg)
6845                 putchar (*p);
6846               ++p;
6847             }
6848
6849           if (*p == ' ')
6850             ++p;
6851         }
6852
6853       if (! skip)
6854         {
6855           /* If there are extra options, print them now.  */
6856           if (multilib_extra && *multilib_extra)
6857             {
6858               int print_at = TRUE;
6859               const char *q;
6860
6861               for (q = multilib_extra; *q != '\0'; q++)
6862                 {
6863                   if (*q == ' ')
6864                     print_at = TRUE;
6865                   else
6866                     {
6867                       if (print_at)
6868                         putchar ('@');
6869                       putchar (*q);
6870                       print_at = FALSE;
6871                     }
6872                 }
6873             }
6874
6875           putchar ('\n');
6876         }
6877
6878       ++p;
6879     }
6880 }