OSDN Git Service

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