OSDN Git Service

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