OSDN Git Service

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