OSDN Git Service

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