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