OSDN Git Service

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