OSDN Git Service

* gcc.dg/altivec-16.c: Use cleanup-saved-temps.
[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   bool multilib_p = false;
4385
4386   /* Used on systems which record the specified -L dirs
4387      and use them to search for dynamic linking.  */
4388   /* Relative directories always come from -B,
4389      and it is better not to use them for searching
4390      at run time.  In particular, stage1 loses.  */
4391   if (omit_if_relative
4392       && !IS_ABSOLUTE_PATH (pl->prefix))
4393     return;
4394
4395   /* Try subdirectory if there is one.  */
4396   if (machine_suffix && dir_for_machine_suffix)
4397     {
4398       if (strlen (pl->prefix) + strlen (machine_suffix)
4399           >= bufsize)
4400         bufsize = (strlen (pl->prefix)
4401                   + strlen (machine_suffix)) * 2 + 1;
4402       buffer = xrealloc (buffer, bufsize);
4403       strcpy (buffer, pl->prefix);
4404       strcat (buffer, machine_suffix);
4405       if (is_directory (buffer, dir_for_machine_suffix, 1))
4406         {
4407           multilib_p = true;
4408           do_spec_1 (option, separate_options, NULL);
4409           if (separate_options)
4410             do_spec_1 (" ", 0, NULL);
4411           do_spec_1 (buffer, 1, NULL);
4412           do_spec_1 (dir_for_machine_suffix, 1, NULL);
4413           /* Make this a separate argument.  */
4414           do_spec_1 (" ", 0, NULL);
4415         }
4416     }
4417   if (!pl->require_machine_suffix && dir_for_no_suffix)
4418     {
4419       if (is_directory (pl->prefix, dir_for_no_suffix, 1))
4420         {
4421           multilib_p = true;
4422           do_spec_1 (option, separate_options, NULL);
4423           if (separate_options)
4424             do_spec_1 (" ", 0, NULL);
4425           do_spec_1 (pl->prefix, 1, NULL);
4426           do_spec_1 (dir_for_no_suffix, 1, NULL);
4427           /* Make this a separate argument.  */
4428           do_spec_1 (" ", 0, NULL);
4429         }
4430     }
4431
4432   if (only_subdir || multilib_p)
4433     return;
4434
4435   if (machine_suffix)
4436     {
4437       if (is_directory (pl->prefix, machine_suffix, 1))
4438         {
4439           do_spec_1 (option, separate_options, NULL);
4440           if (separate_options)
4441             do_spec_1 (" ", 0, NULL);
4442           do_spec_1 (pl->prefix, 1, NULL);
4443           /* Remove slash from machine_suffix.  */
4444           if (strlen (machine_suffix) >= bufsize)
4445             bufsize = strlen (machine_suffix) * 2 + 1;
4446           buffer = xrealloc (buffer, bufsize);
4447           strcpy (buffer, machine_suffix);
4448           idx = strlen (buffer);
4449           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4450             buffer[idx - 1] = 0;
4451           do_spec_1 (buffer, 1, NULL);
4452           /* Make this a separate argument.  */
4453           do_spec_1 (" ", 0, NULL);
4454         }
4455     }
4456   if (!pl->require_machine_suffix)
4457     {
4458       if (is_directory (pl->prefix, "", 1))
4459         {
4460           do_spec_1 (option, separate_options, NULL);
4461           if (separate_options)
4462             do_spec_1 (" ", 0, NULL);
4463           /* Remove slash from pl->prefix.  */
4464           if (strlen (pl->prefix) >= bufsize)
4465             bufsize = strlen (pl->prefix) * 2 + 1;
4466           buffer = xrealloc (buffer, bufsize);
4467           strcpy (buffer, pl->prefix);
4468           idx = strlen (buffer);
4469           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4470             buffer[idx - 1] = 0;
4471           do_spec_1 (buffer, 1, NULL);
4472           /* Make this a separate argument.  */
4473           do_spec_1 (" ", 0, NULL);
4474         }
4475     }
4476 }
4477
4478 /* Process the sub-spec SPEC as a portion of a larger spec.
4479    This is like processing a whole spec except that we do
4480    not initialize at the beginning and we do not supply a
4481    newline by default at the end.
4482    INSWITCH nonzero means don't process %-sequences in SPEC;
4483    in this case, % is treated as an ordinary character.
4484    This is used while substituting switches.
4485    INSWITCH nonzero also causes SPC not to terminate an argument.
4486
4487    Value is zero unless a line was finished
4488    and the command on that line reported an error.  */
4489
4490 static int
4491 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4492 {
4493   const char *p = spec;
4494   int c;
4495   int i;
4496   const char *string;
4497   int value;
4498
4499   while ((c = *p++))
4500     /* If substituting a switch, treat all chars like letters.
4501        Otherwise, NL, SPC, TAB and % are special.  */
4502     switch (inswitch ? 'a' : c)
4503       {
4504       case '\n':
4505         /* End of line: finish any pending argument,
4506            then run the pending command if one has been started.  */
4507         if (arg_going)
4508           {
4509             obstack_1grow (&obstack, 0);
4510             string = obstack_finish (&obstack);
4511             if (this_is_library_file)
4512               string = find_file (string);
4513             store_arg (string, delete_this_arg, this_is_output_file);
4514             if (this_is_output_file)
4515               outfiles[input_file_number] = string;
4516           }
4517         arg_going = 0;
4518
4519         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4520           {
4521             /* A `|' before the newline means use a pipe here,
4522                but only if -pipe was specified.
4523                Otherwise, execute now and don't pass the `|' as an arg.  */
4524             if (use_pipes)
4525               {
4526                 input_from_pipe = 1;
4527                 break;
4528               }
4529             else
4530               argbuf_index--;
4531           }
4532
4533         set_collect_gcc_options ();
4534
4535         if (argbuf_index > 0)
4536           {
4537             value = execute ();
4538             if (value)
4539               return value;
4540           }
4541         /* Reinitialize for a new command, and for a new argument.  */
4542         clear_args ();
4543         arg_going = 0;
4544         delete_this_arg = 0;
4545         this_is_output_file = 0;
4546         this_is_library_file = 0;
4547         input_from_pipe = 0;
4548         break;
4549
4550       case '|':
4551         /* End any pending argument.  */
4552         if (arg_going)
4553           {
4554             obstack_1grow (&obstack, 0);
4555             string = obstack_finish (&obstack);
4556             if (this_is_library_file)
4557               string = find_file (string);
4558             store_arg (string, delete_this_arg, this_is_output_file);
4559             if (this_is_output_file)
4560               outfiles[input_file_number] = string;
4561           }
4562
4563         /* Use pipe */
4564         obstack_1grow (&obstack, c);
4565         arg_going = 1;
4566         break;
4567
4568       case '\t':
4569       case ' ':
4570         /* Space or tab ends an argument if one is pending.  */
4571         if (arg_going)
4572           {
4573             obstack_1grow (&obstack, 0);
4574             string = obstack_finish (&obstack);
4575             if (this_is_library_file)
4576               string = find_file (string);
4577             store_arg (string, delete_this_arg, this_is_output_file);
4578             if (this_is_output_file)
4579               outfiles[input_file_number] = string;
4580           }
4581         /* Reinitialize for a new argument.  */
4582         arg_going = 0;
4583         delete_this_arg = 0;
4584         this_is_output_file = 0;
4585         this_is_library_file = 0;
4586         break;
4587
4588       case '%':
4589         switch (c = *p++)
4590           {
4591           case 0:
4592             fatal ("spec '%s' invalid", spec);
4593
4594           case 'b':
4595             obstack_grow (&obstack, input_basename, basename_length);
4596             arg_going = 1;
4597             break;
4598
4599           case 'B':
4600             obstack_grow (&obstack, input_basename, suffixed_basename_length);
4601             arg_going = 1;
4602             break;
4603
4604           case 'd':
4605             delete_this_arg = 2;
4606             break;
4607
4608           /* Dump out the directories specified with LIBRARY_PATH,
4609              followed by the absolute directories
4610              that we search for startfiles.  */
4611           case 'D':
4612             {
4613               struct prefix_list *pl = startfile_prefixes.plist;
4614
4615               for (; pl; pl = pl->next)
4616                 {
4617                   const char *no_suffix_multilib_dir;
4618
4619                   no_suffix_multilib_dir = pl->os_multilib ? multilib_os_dir
4620                                            : multilib_dir;
4621                   /* Do not separate options, include non-multilibbed variant.  */
4622                   do_spec_path (pl, "-L",
4623 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4624                                 1,
4625 #else
4626                                 0,
4627 #endif
4628                                 0, 0, multilib_dir, no_suffix_multilib_dir);
4629                 }
4630             }
4631             break;
4632
4633           case 'e':
4634             /* %efoo means report an error with `foo' as error message
4635                and don't execute any more commands for this file.  */
4636             {
4637               const char *q = p;
4638               char *buf;
4639               while (*p != 0 && *p != '\n')
4640                 p++;
4641               buf = alloca (p - q + 1);
4642               strncpy (buf, q, p - q);
4643               buf[p - q] = 0;
4644               error ("%s", buf);
4645               return -1;
4646             }
4647             break;
4648           case 'n':
4649             /* %nfoo means report a notice with `foo' on stderr.  */
4650             {
4651               const char *q = p;
4652               char *buf;
4653               while (*p != 0 && *p != '\n')
4654                 p++;
4655               buf = alloca (p - q + 1);
4656               strncpy (buf, q, p - q);
4657               buf[p - q] = 0;
4658               notice ("%s\n", buf);
4659               if (*p)
4660                 p++;
4661             }
4662             break;
4663
4664           case 'j':
4665             {
4666               struct stat st;
4667
4668               /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4669                  defined, and it is not a directory, and it is
4670                  writable, use it.  Otherwise, treat this like any
4671                  other temporary file.  */
4672
4673               if ((!save_temps_flag)
4674                   && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4675                   && (access (HOST_BIT_BUCKET, W_OK) == 0))
4676                 {
4677                   obstack_grow (&obstack, HOST_BIT_BUCKET,
4678                                 strlen (HOST_BIT_BUCKET));
4679                   delete_this_arg = 0;
4680                   arg_going = 1;
4681                   break;
4682                 }
4683             }
4684             goto create_temp_file;
4685           case '|':
4686             if (use_pipes)
4687               {
4688                 obstack_1grow (&obstack, '-');
4689                 delete_this_arg = 0;
4690                 arg_going = 1;
4691
4692                 /* consume suffix */
4693                 while (*p == '.' || ISALPHA ((unsigned char) *p))
4694                   p++;
4695                 if (p[0] == '%' && p[1] == 'O')
4696                   p += 2;
4697
4698                 break;
4699               }
4700             goto create_temp_file;
4701           case 'm':
4702             if (use_pipes)
4703               {
4704                 /* consume suffix */
4705                 while (*p == '.' || ISALPHA ((unsigned char) *p))
4706                   p++;
4707                 if (p[0] == '%' && p[1] == 'O')
4708                   p += 2;
4709
4710                 break;
4711               }
4712             goto create_temp_file;
4713           case 'g':
4714           case 'u':
4715           case 'U':
4716           create_temp_file:
4717               {
4718                 struct temp_name *t;
4719                 int suffix_length;
4720                 const char *suffix = p;
4721                 char *saved_suffix = NULL;
4722
4723                 while (*p == '.' || ISALPHA ((unsigned char) *p))
4724                   p++;
4725                 suffix_length = p - suffix;
4726                 if (p[0] == '%' && p[1] == 'O')
4727                   {
4728                     p += 2;
4729                     /* We don't support extra suffix characters after %O.  */
4730                     if (*p == '.' || ISALPHA ((unsigned char) *p))
4731                       fatal ("spec '%s' has invalid '%%0%c'", spec, *p);
4732                     if (suffix_length == 0)
4733                       suffix = TARGET_OBJECT_SUFFIX;
4734                     else
4735                       {
4736                         saved_suffix
4737                           = xmalloc (suffix_length
4738                                      + strlen (TARGET_OBJECT_SUFFIX));
4739                         strncpy (saved_suffix, suffix, suffix_length);
4740                         strcpy (saved_suffix + suffix_length,
4741                                 TARGET_OBJECT_SUFFIX);
4742                       }
4743                     suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4744                   }
4745
4746                 /* If the input_filename has the same suffix specified
4747                    for the %g, %u, or %U, and -save-temps is specified,
4748                    we could end up using that file as an intermediate
4749                    thus clobbering the user's source file (.e.g.,
4750                    gcc -save-temps foo.s would clobber foo.s with the
4751                    output of cpp0).  So check for this condition and
4752                    generate a temp file as the intermediate.  */
4753
4754                 if (save_temps_flag)
4755                   {
4756                     temp_filename_length = basename_length + suffix_length;
4757                     temp_filename = alloca (temp_filename_length + 1);
4758                     strncpy ((char *) temp_filename, input_basename, basename_length);
4759                     strncpy ((char *) temp_filename + basename_length, suffix,
4760                              suffix_length);
4761                     *((char *) temp_filename + temp_filename_length) = '\0';
4762                     if (strcmp (temp_filename, input_filename) != 0)
4763                       {
4764 #ifndef HOST_LACKS_INODE_NUMBERS
4765                         struct stat st_temp;
4766
4767                         /* Note, set_input() resets input_stat_set to 0.  */
4768                         if (input_stat_set == 0)
4769                           {
4770                             input_stat_set = stat (input_filename, &input_stat);
4771                             if (input_stat_set >= 0)
4772                               input_stat_set = 1;
4773                           }
4774
4775                         /* If we have the stat for the input_filename
4776                            and we can do the stat for the temp_filename
4777                            then the they could still refer to the same
4778                            file if st_dev/st_ino's are the same.  */
4779                         if (input_stat_set != 1
4780                             || stat (temp_filename, &st_temp) < 0
4781                             || input_stat.st_dev != st_temp.st_dev
4782                             || input_stat.st_ino != st_temp.st_ino)
4783 #else
4784                         /* Just compare canonical pathnames.  */
4785                         char* input_realname = lrealpath (input_filename);
4786                         char* temp_realname = lrealpath (temp_filename);
4787                         bool files_differ = strcmp (input_realname, temp_realname);
4788                         free (input_realname);
4789                         free (temp_realname);
4790                         if (files_differ)       
4791 #endif
4792                           {
4793                             temp_filename = save_string (temp_filename,
4794                                                          temp_filename_length + 1);
4795                             obstack_grow (&obstack, temp_filename,
4796                                                     temp_filename_length);
4797                             arg_going = 1;
4798                             delete_this_arg = 0;
4799                             break;
4800                           }
4801                       }
4802                   }
4803
4804                 /* See if we already have an association of %g/%u/%U and
4805                    suffix.  */
4806                 for (t = temp_names; t; t = t->next)
4807                   if (t->length == suffix_length
4808                       && strncmp (t->suffix, suffix, suffix_length) == 0
4809                       && t->unique == (c == 'u' || c == 'U' || c == 'j'))
4810                     break;
4811
4812                 /* Make a new association if needed.  %u and %j
4813                    require one.  */
4814                 if (t == 0 || c == 'u' || c == 'j')
4815                   {
4816                     if (t == 0)
4817                       {
4818                         t = xmalloc (sizeof (struct temp_name));
4819                         t->next = temp_names;
4820                         temp_names = t;
4821                       }
4822                     t->length = suffix_length;
4823                     if (saved_suffix)
4824                       {
4825                         t->suffix = saved_suffix;
4826                         saved_suffix = NULL;
4827                       }
4828                     else
4829                       t->suffix = save_string (suffix, suffix_length);
4830                     t->unique = (c == 'u' || c == 'U' || c == 'j');
4831                     temp_filename = make_temp_file (t->suffix);
4832                     temp_filename_length = strlen (temp_filename);
4833                     t->filename = temp_filename;
4834                     t->filename_length = temp_filename_length;
4835                   }
4836
4837                 if (saved_suffix)
4838                   free (saved_suffix);
4839
4840                 obstack_grow (&obstack, t->filename, t->filename_length);
4841                 delete_this_arg = 1;
4842               }
4843             arg_going = 1;
4844             break;
4845
4846           case 'i':
4847             if (combine_inputs)
4848               {
4849                 for (i = 0; (int) i < n_infiles; i++)
4850                   if ((!infiles[i].language) || (infiles[i].language[0] != '*'))
4851                     if (infiles[i].incompiler == input_file_compiler)
4852                       {
4853                         store_arg (infiles[i].name, 0, 0);
4854                         infiles[i].compiled = true;
4855                       }
4856               }
4857             else
4858               {
4859                 obstack_grow (&obstack, input_filename, input_filename_length);
4860                 arg_going = 1;
4861               }
4862             break;
4863
4864           case 'I':
4865             {
4866               struct prefix_list *pl = include_prefixes.plist;
4867
4868               if (gcc_exec_prefix)
4869                 {
4870                   do_spec_1 ("-iprefix", 1, NULL);
4871                   /* Make this a separate argument.  */
4872                   do_spec_1 (" ", 0, NULL);
4873                   do_spec_1 (gcc_exec_prefix, 1, NULL);
4874                   do_spec_1 (" ", 0, NULL);
4875                 }
4876
4877               if (target_system_root_changed ||
4878                   (target_system_root && target_sysroot_hdrs_suffix))
4879                 {
4880                   do_spec_1 ("-isysroot", 1, NULL);
4881                   /* Make this a separate argument.  */
4882                   do_spec_1 (" ", 0, NULL);
4883                   do_spec_1 (target_system_root, 1, NULL);
4884                   if (target_sysroot_hdrs_suffix)
4885                     do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
4886                   do_spec_1 (" ", 0, NULL);
4887                 }
4888
4889               for (; pl; pl = pl->next)
4890                 /* Separate options, don't include non-suffixed variant.  */
4891                 do_spec_path (pl, "-isystem", 0, 1, 1, "include", "include");
4892             }
4893             break;
4894
4895           case 'o':
4896             {
4897               int max = n_infiles;
4898               max += lang_specific_extra_outfiles;
4899
4900               for (i = 0; i < max; i++)
4901                 if (outfiles[i])
4902                   store_arg (outfiles[i], 0, 0);
4903               break;
4904             }
4905
4906           case 'O':
4907             obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4908             arg_going = 1;
4909             break;
4910
4911           case 's':
4912             this_is_library_file = 1;
4913             break;
4914
4915           case 'V':
4916             outfiles[input_file_number] = NULL;
4917             break;
4918
4919           case 'w':
4920             this_is_output_file = 1;
4921             break;
4922
4923           case 'W':
4924             {
4925               int cur_index = argbuf_index;
4926               /* Handle the {...} following the %W.  */
4927               if (*p != '{')
4928                 fatal ("spec '%s' has invalid '%%W%c", spec, *p);
4929               p = handle_braces (p + 1);
4930               if (p == 0)
4931                 return -1;
4932               /* End any pending argument.  */
4933               if (arg_going)
4934                 {
4935                   obstack_1grow (&obstack, 0);
4936                   string = obstack_finish (&obstack);
4937                   if (this_is_library_file)
4938                     string = find_file (string);
4939                   store_arg (string, delete_this_arg, this_is_output_file);
4940                   if (this_is_output_file)
4941                     outfiles[input_file_number] = string;
4942                   arg_going = 0;
4943                 }
4944               /* If any args were output, mark the last one for deletion
4945                  on failure.  */
4946               if (argbuf_index != cur_index)
4947                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4948               break;
4949             }
4950
4951           /* %x{OPTION} records OPTION for %X to output.  */
4952           case 'x':
4953             {
4954               const char *p1 = p;
4955               char *string;
4956
4957               /* Skip past the option value and make a copy.  */
4958               if (*p != '{')
4959                 fatal ("spec '%s' has invalid '%%x%c'", spec, *p);
4960               while (*p++ != '}')
4961                 ;
4962               string = save_string (p1 + 1, p - p1 - 2);
4963
4964               /* See if we already recorded this option.  */
4965               for (i = 0; i < n_linker_options; i++)
4966                 if (! strcmp (string, linker_options[i]))
4967                   {
4968                     free (string);
4969                     return 0;
4970                   }
4971
4972               /* This option is new; add it.  */
4973               add_linker_option (string, strlen (string));
4974             }
4975             break;
4976
4977           /* Dump out the options accumulated previously using %x.  */
4978           case 'X':
4979             for (i = 0; i < n_linker_options; i++)
4980               {
4981                 do_spec_1 (linker_options[i], 1, NULL);
4982                 /* Make each accumulated option a separate argument.  */
4983                 do_spec_1 (" ", 0, NULL);
4984               }
4985             break;
4986
4987           /* Dump out the options accumulated previously using -Wa,.  */
4988           case 'Y':
4989             for (i = 0; i < n_assembler_options; i++)
4990               {
4991                 do_spec_1 (assembler_options[i], 1, NULL);
4992                 /* Make each accumulated option a separate argument.  */
4993                 do_spec_1 (" ", 0, NULL);
4994               }
4995             break;
4996
4997           /* Dump out the options accumulated previously using -Wp,.  */
4998           case 'Z':
4999             for (i = 0; i < n_preprocessor_options; i++)
5000               {
5001                 do_spec_1 (preprocessor_options[i], 1, NULL);
5002                 /* Make each accumulated option a separate argument.  */
5003                 do_spec_1 (" ", 0, NULL);
5004               }
5005             break;
5006
5007             /* Here are digits and numbers that just process
5008                a certain constant string as a spec.  */
5009
5010           case '1':
5011             value = do_spec_1 (cc1_spec, 0, NULL);
5012             if (value != 0)
5013               return value;
5014             break;
5015
5016           case '2':
5017             value = do_spec_1 (cc1plus_spec, 0, NULL);
5018             if (value != 0)
5019               return value;
5020             break;
5021
5022           case 'a':
5023             value = do_spec_1 (asm_spec, 0, NULL);
5024             if (value != 0)
5025               return value;
5026             break;
5027
5028           case 'A':
5029             value = do_spec_1 (asm_final_spec, 0, NULL);
5030             if (value != 0)
5031               return value;
5032             break;
5033
5034           case 'C':
5035             {
5036               const char *const spec
5037                 = (input_file_compiler->cpp_spec
5038                    ? input_file_compiler->cpp_spec
5039                    : cpp_spec);
5040               value = do_spec_1 (spec, 0, NULL);
5041               if (value != 0)
5042                 return value;
5043             }
5044             break;
5045
5046           case 'E':
5047             value = do_spec_1 (endfile_spec, 0, NULL);
5048             if (value != 0)
5049               return value;
5050             break;
5051
5052           case 'l':
5053             value = do_spec_1 (link_spec, 0, NULL);
5054             if (value != 0)
5055               return value;
5056             break;
5057
5058           case 'L':
5059             value = do_spec_1 (lib_spec, 0, NULL);
5060             if (value != 0)
5061               return value;
5062             break;
5063
5064           case 'G':
5065             value = do_spec_1 (libgcc_spec, 0, NULL);
5066             if (value != 0)
5067               return value;
5068             break;
5069
5070           case 'R':
5071             /* We assume there is a directory
5072                separator at the end of this string.  */
5073             if (target_system_root)
5074               {
5075                 obstack_grow (&obstack, target_system_root,
5076                               strlen (target_system_root));
5077                 if (target_sysroot_suffix)
5078                   obstack_grow (&obstack, target_sysroot_suffix,
5079                                 strlen (target_sysroot_suffix));
5080               }
5081             break;
5082
5083           case 'S':
5084             value = do_spec_1 (startfile_spec, 0, NULL);
5085             if (value != 0)
5086               return value;
5087             break;
5088
5089             /* Here we define characters other than letters and digits.  */
5090
5091           case '{':
5092             p = handle_braces (p);
5093             if (p == 0)
5094               return -1;
5095             break;
5096
5097           case ':':
5098             p = handle_spec_function (p);
5099             if (p == 0)
5100               return -1;
5101             break;
5102
5103           case '%':
5104             obstack_1grow (&obstack, '%');
5105             break;
5106
5107           case '.':
5108             {
5109               unsigned len = 0;
5110
5111               while (p[len] && p[len] != ' ' && p[len] != '%')
5112                 len++;
5113               suffix_subst = save_string (p - 1, len + 1);
5114               p += len;
5115             }
5116            break;
5117
5118            /* Henceforth ignore the option(s) matching the pattern
5119               after the %<.  */
5120           case '<':
5121             {
5122               unsigned len = 0;
5123               int have_wildcard = 0;
5124               int i;
5125
5126               while (p[len] && p[len] != ' ' && p[len] != '\t')
5127                 len++;
5128
5129               if (p[len-1] == '*')
5130                 have_wildcard = 1;
5131
5132               for (i = 0; i < n_switches; i++)
5133                 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5134                     && (have_wildcard || switches[i].part1[len] == '\0'))
5135                   {
5136                     switches[i].live_cond = SWITCH_IGNORE;
5137                     switches[i].validated = 1;
5138                   }
5139
5140               p += len;
5141             }
5142             break;
5143
5144           case '*':
5145             if (soft_matched_part)
5146               {
5147                 do_spec_1 (soft_matched_part, 1, NULL);
5148                 do_spec_1 (" ", 0, NULL);
5149               }
5150             else
5151               /* Catch the case where a spec string contains something like
5152                  '%{foo:%*}'.  i.e. there is no * in the pattern on the left
5153                  hand side of the :.  */
5154               error ("spec failure: '%%*' has not been initialized by pattern match");
5155             break;
5156
5157             /* Process a string found as the value of a spec given by name.
5158                This feature allows individual machine descriptions
5159                to add and use their own specs.
5160                %[...] modifies -D options the way %P does;
5161                %(...) uses the spec unmodified.  */
5162           case '[':
5163             error ("warning: use of obsolete %%[ operator in specs");
5164           case '(':
5165             {
5166               const char *name = p;
5167               struct spec_list *sl;
5168               int len;
5169
5170               /* The string after the S/P is the name of a spec that is to be
5171                  processed.  */
5172               while (*p && *p != ')' && *p != ']')
5173                 p++;
5174
5175               /* See if it's in the list.  */
5176               for (len = p - name, sl = specs; sl; sl = sl->next)
5177                 if (sl->name_len == len && !strncmp (sl->name, name, len))
5178                   {
5179                     name = *(sl->ptr_spec);
5180 #ifdef DEBUG_SPECS
5181                     notice ("Processing spec %c%s%c, which is '%s'\n",
5182                             c, sl->name, (c == '(') ? ')' : ']', name);
5183 #endif
5184                     break;
5185                   }
5186
5187               if (sl)
5188                 {
5189                   if (c == '(')
5190                     {
5191                       value = do_spec_1 (name, 0, NULL);
5192                       if (value != 0)
5193                         return value;
5194                     }
5195                   else
5196                     {
5197                       char *x = alloca (strlen (name) * 2 + 1);
5198                       char *buf = x;
5199                       const char *y = name;
5200                       int flag = 0;
5201
5202                       /* Copy all of NAME into BUF, but put __ after
5203                          every -D and at the end of each arg.  */
5204                       while (1)
5205                         {
5206                           if (! strncmp (y, "-D", 2))
5207                             {
5208                               *x++ = '-';
5209                               *x++ = 'D';
5210                               *x++ = '_';
5211                               *x++ = '_';
5212                               y += 2;
5213                               flag = 1;
5214                               continue;
5215                             }
5216                           else if (flag
5217                                    && (*y == ' ' || *y == '\t' || *y == '='
5218                                        || *y == '}' || *y == 0))
5219                             {
5220                               *x++ = '_';
5221                               *x++ = '_';
5222                               flag = 0;
5223                             }
5224                           if (*y == 0)
5225                             break;
5226                           else
5227                             *x++ = *y++;
5228                         }
5229                       *x = 0;
5230
5231                       value = do_spec_1 (buf, 0, NULL);
5232                       if (value != 0)
5233                         return value;
5234                     }
5235                 }
5236
5237               /* Discard the closing paren or bracket.  */
5238               if (*p)
5239                 p++;
5240             }
5241             break;
5242
5243           default:
5244             error ("spec failure: unrecognized spec option '%c'", c);
5245             break;
5246           }
5247         break;
5248
5249       case '\\':
5250         /* Backslash: treat next character as ordinary.  */
5251         c = *p++;
5252
5253         /* Fall through.  */
5254       default:
5255         /* Ordinary character: put it into the current argument.  */
5256         obstack_1grow (&obstack, c);
5257         arg_going = 1;
5258       }
5259
5260   /* End of string.  If we are processing a spec function, we need to
5261      end any pending argument.  */
5262   if (processing_spec_function && arg_going)
5263     {
5264       obstack_1grow (&obstack, 0);
5265       string = obstack_finish (&obstack);
5266       if (this_is_library_file)
5267         string = find_file (string);
5268       store_arg (string, delete_this_arg, this_is_output_file);
5269       if (this_is_output_file)
5270         outfiles[input_file_number] = string;
5271       arg_going = 0;
5272     }
5273
5274   return 0;
5275 }
5276
5277 /* Look up a spec function.  */
5278
5279 static const struct spec_function *
5280 lookup_spec_function (const char *name)
5281 {
5282   static const struct spec_function * const spec_function_tables[] =
5283   {
5284     static_spec_functions,
5285     lang_specific_spec_functions,
5286   };
5287   const struct spec_function *sf;
5288   unsigned int i;
5289
5290   for (i = 0; i < ARRAY_SIZE (spec_function_tables); i++)
5291     {
5292       for (sf = spec_function_tables[i]; sf->name != NULL; sf++)
5293         if (strcmp (sf->name, name) == 0)
5294           return sf;
5295     }
5296
5297   return NULL;
5298 }
5299
5300 /* Evaluate a spec function.  */
5301
5302 static const char *
5303 eval_spec_function (const char *func, const char *args)
5304 {
5305   const struct spec_function *sf;
5306   const char *funcval;
5307
5308   /* Saved spec processing context.  */
5309   int save_argbuf_index;
5310   int save_argbuf_length;
5311   const char **save_argbuf;
5312
5313   int save_arg_going;
5314   int save_delete_this_arg;
5315   int save_this_is_output_file;
5316   int save_this_is_library_file;
5317   int save_input_from_pipe;
5318   const char *save_suffix_subst;
5319
5320
5321   sf = lookup_spec_function (func);
5322   if (sf == NULL)
5323     fatal ("unknown spec function '%s'", func);
5324
5325   /* Push the spec processing context.  */
5326   save_argbuf_index = argbuf_index;
5327   save_argbuf_length = argbuf_length;
5328   save_argbuf = argbuf;
5329
5330   save_arg_going = arg_going;
5331   save_delete_this_arg = delete_this_arg;
5332   save_this_is_output_file = this_is_output_file;
5333   save_this_is_library_file = this_is_library_file;
5334   save_input_from_pipe = input_from_pipe;
5335   save_suffix_subst = suffix_subst;
5336
5337   /* Create a new spec processing context, and build the function
5338      arguments.  */
5339
5340   alloc_args ();
5341   if (do_spec_2 (args) < 0)
5342     fatal ("error in args to spec function '%s'", func);
5343
5344   /* argbuf_index is an index for the next argument to be inserted, and
5345      so contains the count of the args already inserted.  */
5346
5347   funcval = (*sf->func) (argbuf_index, argbuf);
5348
5349   /* Pop the spec processing context.  */
5350   argbuf_index = save_argbuf_index;
5351   argbuf_length = save_argbuf_length;
5352   free (argbuf);
5353   argbuf = save_argbuf;
5354
5355   arg_going = save_arg_going;
5356   delete_this_arg = save_delete_this_arg;
5357   this_is_output_file = save_this_is_output_file;
5358   this_is_library_file = save_this_is_library_file;
5359   input_from_pipe = save_input_from_pipe;
5360   suffix_subst = save_suffix_subst;
5361
5362   return funcval;
5363 }
5364
5365 /* Handle a spec function call of the form:
5366
5367    %:function(args)
5368
5369    ARGS is processed as a spec in a separate context and split into an
5370    argument vector in the normal fashion.  The function returns a string
5371    containing a spec which we then process in the caller's context, or
5372    NULL if no processing is required.  */
5373
5374 static const char *
5375 handle_spec_function (const char *p)
5376 {
5377   char *func, *args;
5378   const char *endp, *funcval;
5379   int count;
5380
5381   processing_spec_function++;
5382
5383   /* Get the function name.  */
5384   for (endp = p; *endp != '\0'; endp++)
5385     {
5386       if (*endp == '(')         /* ) */
5387         break;
5388       /* Only allow [A-Za-z0-9], -, and _ in function names.  */
5389       if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5390         fatal ("malformed spec function name");
5391     }
5392   if (*endp != '(')             /* ) */
5393     fatal ("no arguments for spec function");
5394   func = save_string (p, endp - p);
5395   p = ++endp;
5396
5397   /* Get the arguments.  */
5398   for (count = 0; *endp != '\0'; endp++)
5399     {
5400       /* ( */
5401       if (*endp == ')')
5402         {
5403           if (count == 0)
5404             break;
5405           count--;
5406         }
5407       else if (*endp == '(')    /* ) */
5408         count++;
5409     }
5410   /* ( */
5411   if (*endp != ')')
5412     fatal ("malformed spec function arguments");
5413   args = save_string (p, endp - p);
5414   p = ++endp;
5415
5416   /* p now points to just past the end of the spec function expression.  */
5417
5418   funcval = eval_spec_function (func, args);
5419   if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5420     p = NULL;
5421
5422   free (func);
5423   free (args);
5424
5425   processing_spec_function--;
5426
5427   return p;
5428 }
5429
5430 /* Inline subroutine of handle_braces.  Returns true if the current
5431    input suffix matches the atom bracketed by ATOM and END_ATOM.  */
5432 static inline bool
5433 input_suffix_matches (const char *atom, const char *end_atom)
5434 {
5435   /* We special case the semantics of {.s:...} and {.S:...} and their
5436      negative variants.  Instead of testing the input filename suffix,
5437      we test whether the input source file is an assembler file or an
5438      assembler-with-cpp file respectively.  This allows us to correctly
5439      handle the -x command line option.  */
5440
5441   if (atom + 1 == end_atom
5442       && input_file_compiler
5443       && input_file_compiler->suffix)
5444     {
5445       if (*atom == 's')
5446         return !strcmp (input_file_compiler->suffix, "@assembler");
5447       if (*atom == 'S')
5448         return !strcmp (input_file_compiler->suffix, "@assembler-with-cpp");
5449     }
5450
5451   return (input_suffix
5452           && !strncmp (input_suffix, atom, end_atom - atom)
5453           && input_suffix[end_atom - atom] == '\0');
5454 }
5455
5456 /* Inline subroutine of handle_braces.  Returns true if a switch
5457    matching the atom bracketed by ATOM and END_ATOM appeared on the
5458    command line.  */
5459 static inline bool
5460 switch_matches (const char *atom, const char *end_atom, int starred)
5461 {
5462   int i;
5463   int len = end_atom - atom;
5464   int plen = starred ? len : -1;
5465
5466   for (i = 0; i < n_switches; i++)
5467     if (!strncmp (switches[i].part1, atom, len)
5468         && (starred || switches[i].part1[len] == '\0')
5469         && check_live_switch (i, plen))
5470       return true;
5471
5472   return false;
5473 }
5474
5475 /* Inline subroutine of handle_braces.  Mark all of the switches which
5476    match ATOM (extends to END_ATOM; STARRED indicates whether there
5477    was a star after the atom) for later processing.  */
5478 static inline void
5479 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5480 {
5481   int i;
5482   int len = end_atom - atom;
5483   int plen = starred ? len : -1;
5484
5485   for (i = 0; i < n_switches; i++)
5486     if (!strncmp (switches[i].part1, atom, len)
5487         && (starred || switches[i].part1[len] == '\0')
5488         && check_live_switch (i, plen))
5489       switches[i].ordering = 1;
5490 }
5491
5492 /* Inline subroutine of handle_braces.  Process all the currently
5493    marked switches through give_switch, and clear the marks.  */
5494 static inline void
5495 process_marked_switches (void)
5496 {
5497   int i;
5498
5499   for (i = 0; i < n_switches; i++)
5500     if (switches[i].ordering == 1)
5501       {
5502         switches[i].ordering = 0;
5503         give_switch (i, 0);
5504       }
5505 }
5506
5507 /* Handle a %{ ... } construct.  P points just inside the leading {.
5508    Returns a pointer one past the end of the brace block, or 0
5509    if we call do_spec_1 and that returns -1.  */
5510
5511 static const char *
5512 handle_braces (const char *p)
5513 {
5514   const char *atom, *end_atom;
5515   const char *d_atom = NULL, *d_end_atom = NULL;
5516   const char *orig = p;
5517
5518   bool a_is_suffix;
5519   bool a_is_starred;
5520   bool a_is_negated;
5521   bool a_matched;
5522
5523   bool a_must_be_last = false;
5524   bool ordered_set    = false;
5525   bool disjunct_set   = false;
5526   bool disj_matched   = false;
5527   bool disj_starred   = true;
5528   bool n_way_choice   = false;
5529   bool n_way_matched  = false;
5530
5531 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
5532
5533   do
5534     {
5535       if (a_must_be_last)
5536         goto invalid;
5537
5538       /* Scan one "atom" (S in the description above of %{}, possibly
5539          with !, ., or * modifiers).  */
5540       a_matched = a_is_suffix = a_is_starred = a_is_negated = false;
5541
5542       SKIP_WHITE();
5543       if (*p == '!')
5544         p++, a_is_negated = true;
5545
5546       SKIP_WHITE();
5547       if (*p == '.')
5548         p++, a_is_suffix = true;
5549
5550       atom = p;
5551       while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
5552              || *p == ',' || *p == '.' || *p == '@')
5553         p++;
5554       end_atom = p;
5555
5556       if (*p == '*')
5557         p++, a_is_starred = 1;
5558
5559       SKIP_WHITE();
5560       switch (*p)
5561         {
5562         case '&': case '}':
5563           /* Substitute the switch(es) indicated by the current atom.  */
5564           ordered_set = true;
5565           if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
5566               || atom == end_atom)
5567             goto invalid;
5568
5569           mark_matching_switches (atom, end_atom, a_is_starred);
5570
5571           if (*p == '}')
5572             process_marked_switches ();
5573           break;
5574
5575         case '|': case ':':
5576           /* Substitute some text if the current atom appears as a switch
5577              or suffix.  */
5578           disjunct_set = true;
5579           if (ordered_set)
5580             goto invalid;
5581
5582           if (atom == end_atom)
5583             {
5584               if (!n_way_choice || disj_matched || *p == '|'
5585                   || a_is_negated || a_is_suffix || a_is_starred)
5586                 goto invalid;
5587
5588               /* An empty term may appear as the last choice of an
5589                  N-way choice set; it means "otherwise".  */
5590               a_must_be_last = true;
5591               disj_matched = !n_way_matched;
5592               disj_starred = false;
5593             }
5594           else
5595             {
5596                if (a_is_suffix && a_is_starred)
5597                  goto invalid;
5598
5599                if (!a_is_starred)
5600                  disj_starred = false;
5601
5602                /* Don't bother testing this atom if we already have a
5603                   match.  */
5604                if (!disj_matched && !n_way_matched)
5605                  {
5606                    if (a_is_suffix)
5607                      a_matched = input_suffix_matches (atom, end_atom);
5608                    else
5609                      a_matched = switch_matches (atom, end_atom, a_is_starred);
5610
5611                    if (a_matched != a_is_negated)
5612                      {
5613                        disj_matched = true;
5614                        d_atom = atom;
5615                        d_end_atom = end_atom;
5616                      }
5617                  }
5618             }
5619
5620           if (*p == ':')
5621             {
5622               /* Found the body, that is, the text to substitute if the
5623                  current disjunction matches.  */
5624               p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
5625                                       disj_matched && !n_way_matched);
5626               if (p == 0)
5627                 return 0;
5628
5629               /* If we have an N-way choice, reset state for the next
5630                  disjunction.  */
5631               if (*p == ';')
5632                 {
5633                   n_way_choice = true;
5634                   n_way_matched |= disj_matched;
5635                   disj_matched = false;
5636                   disj_starred = true;
5637                   d_atom = d_end_atom = NULL;
5638                 }
5639             }
5640           break;
5641
5642         default:
5643           goto invalid;
5644         }
5645     }
5646   while (*p++ != '}');
5647
5648   return p;
5649   
5650  invalid:
5651   fatal ("braced spec '%s' is invalid at '%c'", orig, *p);
5652   
5653 #undef SKIP_WHITE
5654 }
5655
5656 /* Subroutine of handle_braces.  Scan and process a brace substitution body
5657    (X in the description of %{} syntax).  P points one past the colon;
5658    ATOM and END_ATOM bracket the first atom which was found to be true
5659    (present) in the current disjunction; STARRED indicates whether all
5660    the atoms in the current disjunction were starred (for syntax validation);
5661    MATCHED indicates whether the disjunction matched or not, and therefore
5662    whether or not the body is to be processed through do_spec_1 or just
5663    skipped.  Returns a pointer to the closing } or ;, or 0 if do_spec_1
5664    returns -1.  */
5665
5666 static const char *
5667 process_brace_body (const char *p, const char *atom, const char *end_atom,
5668                     int starred, int matched)
5669 {
5670   const char *body, *end_body;
5671   unsigned int nesting_level;
5672   bool have_subst     = false;
5673
5674   /* Locate the closing } or ;, honoring nested braces.
5675      Trim trailing whitespace.  */
5676   body = p;
5677   nesting_level = 1;
5678   for (;;)
5679     {
5680       if (*p == '{')
5681         nesting_level++;
5682       else if (*p == '}')
5683         {
5684           if (!--nesting_level)
5685             break;
5686         }
5687       else if (*p == ';' && nesting_level == 1)
5688         break;
5689       else if (*p == '%' && p[1] == '*' && nesting_level == 1)
5690         have_subst = true;
5691       else if (*p == '\0')
5692         goto invalid;
5693       p++;
5694     }
5695
5696   end_body = p;
5697   while (end_body[-1] == ' ' || end_body[-1] == '\t')
5698     end_body--;
5699
5700   if (have_subst && !starred)
5701     goto invalid;
5702
5703   if (matched)
5704     {
5705       /* Copy the substitution body to permanent storage and execute it.
5706          If have_subst is false, this is a simple matter of running the
5707          body through do_spec_1...  */
5708       char *string = save_string (body, end_body - body);
5709       if (!have_subst)
5710         {
5711           if (do_spec_1 (string, 0, NULL) < 0)
5712             return 0;
5713         }
5714       else
5715         {
5716           /* ... but if have_subst is true, we have to process the
5717              body once for each matching switch, with %* set to the
5718              variant part of the switch.  */
5719           unsigned int hard_match_len = end_atom - atom;
5720           int i;
5721
5722           for (i = 0; i < n_switches; i++)
5723             if (!strncmp (switches[i].part1, atom, hard_match_len)
5724                 && check_live_switch (i, hard_match_len))
5725               {
5726                 if (do_spec_1 (string, 0,
5727                                &switches[i].part1[hard_match_len]) < 0)
5728                   return 0;
5729                 /* Pass any arguments this switch has.  */
5730                 give_switch (i, 1);
5731                 suffix_subst = NULL;
5732               }
5733         }
5734     }
5735
5736   return p;
5737
5738  invalid:
5739   fatal ("braced spec body '%s' is invalid", body);
5740 }
5741 \f
5742 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5743    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
5744    spec, or -1 if either exact match or %* is used.
5745
5746    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
5747    whose value does not begin with "no-" is obsoleted by the same value
5748    with the "no-", similarly for a switch with the "no-" prefix.  */
5749
5750 static int
5751 check_live_switch (int switchnum, int prefix_length)
5752 {
5753   const char *name = switches[switchnum].part1;
5754   int i;
5755
5756   /* In the common case of {<at-most-one-letter>*}, a negating
5757      switch would always match, so ignore that case.  We will just
5758      send the conflicting switches to the compiler phase.  */
5759   if (prefix_length >= 0 && prefix_length <= 1)
5760     return 1;
5761
5762   /* If we already processed this switch and determined if it was
5763      live or not, return our past determination.  */
5764   if (switches[switchnum].live_cond != 0)
5765     return switches[switchnum].live_cond > 0;
5766
5767   /* Now search for duplicate in a manner that depends on the name.  */
5768   switch (*name)
5769     {
5770     case 'O':
5771       for (i = switchnum + 1; i < n_switches; i++)
5772         if (switches[i].part1[0] == 'O')
5773           {
5774             switches[switchnum].validated = 1;
5775             switches[switchnum].live_cond = SWITCH_FALSE;
5776             return 0;
5777           }
5778       break;
5779
5780     case 'W':  case 'f':  case 'm':
5781       if (! strncmp (name + 1, "no-", 3))
5782         {
5783           /* We have Xno-YYY, search for XYYY.  */
5784           for (i = switchnum + 1; i < n_switches; i++)
5785             if (switches[i].part1[0] == name[0]
5786                 && ! strcmp (&switches[i].part1[1], &name[4]))
5787               {
5788                 switches[switchnum].validated = 1;
5789                 switches[switchnum].live_cond = SWITCH_FALSE;
5790                 return 0;
5791               }
5792         }
5793       else
5794         {
5795           /* We have XYYY, search for Xno-YYY.  */
5796           for (i = switchnum + 1; i < n_switches; i++)
5797             if (switches[i].part1[0] == name[0]
5798                 && switches[i].part1[1] == 'n'
5799                 && switches[i].part1[2] == 'o'
5800                 && switches[i].part1[3] == '-'
5801                 && !strcmp (&switches[i].part1[4], &name[1]))
5802               {
5803                 switches[switchnum].validated = 1;
5804                 switches[switchnum].live_cond = SWITCH_FALSE;
5805                 return 0;
5806               }
5807         }
5808       break;
5809     }
5810
5811   /* Otherwise the switch is live.  */
5812   switches[switchnum].live_cond = SWITCH_LIVE;
5813   return 1;
5814 }
5815 \f
5816 /* Pass a switch to the current accumulating command
5817    in the same form that we received it.
5818    SWITCHNUM identifies the switch; it is an index into
5819    the vector of switches gcc received, which is `switches'.
5820    This cannot fail since it never finishes a command line.
5821
5822    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
5823
5824 static void
5825 give_switch (int switchnum, int omit_first_word)
5826 {
5827   if (switches[switchnum].live_cond == SWITCH_IGNORE)
5828     return;
5829
5830   if (!omit_first_word)
5831     {
5832       do_spec_1 ("-", 0, NULL);
5833       do_spec_1 (switches[switchnum].part1, 1, NULL);
5834     }
5835
5836   if (switches[switchnum].args != 0)
5837     {
5838       const char **p;
5839       for (p = switches[switchnum].args; *p; p++)
5840         {
5841           const char *arg = *p;
5842
5843           do_spec_1 (" ", 0, NULL);
5844           if (suffix_subst)
5845             {
5846               unsigned length = strlen (arg);
5847               int dot = 0;
5848
5849               while (length-- && !IS_DIR_SEPARATOR (arg[length]))
5850                 if (arg[length] == '.')
5851                   {
5852                     ((char *)arg)[length] = 0;
5853                     dot = 1;
5854                     break;
5855                   }
5856               do_spec_1 (arg, 1, NULL);
5857               if (dot)
5858                 ((char *)arg)[length] = '.';
5859               do_spec_1 (suffix_subst, 1, NULL);
5860             }
5861           else
5862             do_spec_1 (arg, 1, NULL);
5863         }
5864     }
5865
5866   do_spec_1 (" ", 0, NULL);
5867   switches[switchnum].validated = 1;
5868 }
5869 \f
5870 /* Search for a file named NAME trying various prefixes including the
5871    user's -B prefix and some standard ones.
5872    Return the absolute file name found.  If nothing is found, return NAME.  */
5873
5874 static const char *
5875 find_file (const char *name)
5876 {
5877   char *newname;
5878
5879   /* Try multilib_dir if it is defined.  */
5880   if (multilib_os_dir != NULL)
5881     {
5882       newname = find_a_file (&startfile_prefixes, name, R_OK, 1);
5883
5884       /* If we don't find it in the multi library dir, then fall
5885          through and look for it in the normal places.  */
5886       if (newname != NULL)
5887         return newname;
5888     }
5889
5890   newname = find_a_file (&startfile_prefixes, name, R_OK, 0);
5891   return newname ? newname : name;
5892 }
5893
5894 /* Determine whether a directory exists.  If LINKER, return 0 for
5895    certain fixed names not needed by the linker.  If not LINKER, it is
5896    only important to return 0 if the host machine has a small ARG_MAX
5897    limit.  */
5898
5899 static int
5900 is_directory (const char *path1, const char *path2, int linker)
5901 {
5902   int len1 = strlen (path1);
5903   int len2 = strlen (path2);
5904   char *path = alloca (3 + len1 + len2);
5905   char *cp;
5906   struct stat st;
5907
5908 #ifndef SMALL_ARG_MAX
5909   if (! linker)
5910     return 1;
5911 #endif
5912
5913   /* Construct the path from the two parts.  Ensure the string ends with "/.".
5914      The resulting path will be a directory even if the given path is a
5915      symbolic link.  */
5916   memcpy (path, path1, len1);
5917   memcpy (path + len1, path2, len2);
5918   cp = path + len1 + len2;
5919   if (!IS_DIR_SEPARATOR (cp[-1]))
5920     *cp++ = DIR_SEPARATOR;
5921   *cp++ = '.';
5922   *cp = '\0';
5923
5924   /* Exclude directories that the linker is known to search.  */
5925   if (linker
5926       && ((cp - path == 6
5927            && strcmp (path, concat (dir_separator_str, "lib",
5928                                     dir_separator_str, ".", NULL)) == 0)
5929           || (cp - path == 10
5930               && strcmp (path, concat (dir_separator_str, "usr",
5931                                        dir_separator_str, "lib",
5932                                        dir_separator_str, ".", NULL)) == 0)))
5933     return 0;
5934
5935   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5936 }
5937
5938 /* Set up the various global variables to indicate that we're processing
5939    the input file named FILENAME.  */
5940
5941 void
5942 set_input (const char *filename)
5943 {
5944   const char *p;
5945
5946   input_filename = filename;
5947   input_filename_length = strlen (input_filename);
5948
5949   input_basename = input_filename;
5950 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5951   /* Skip drive name so 'x:foo' is handled properly.  */
5952   if (input_basename[1] == ':')
5953     input_basename += 2;
5954 #endif
5955   for (p = input_basename; *p; p++)
5956     if (IS_DIR_SEPARATOR (*p))
5957       input_basename = p + 1;
5958
5959   /* Find a suffix starting with the last period,
5960      and set basename_length to exclude that suffix.  */
5961   basename_length = strlen (input_basename);
5962   suffixed_basename_length = basename_length;
5963   p = input_basename + basename_length;
5964   while (p != input_basename && *p != '.')
5965     --p;
5966   if (*p == '.' && p != input_basename)
5967     {
5968       basename_length = p - input_basename;
5969       input_suffix = p + 1;
5970     }
5971   else
5972     input_suffix = "";
5973
5974   /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
5975      we will need to do a stat on the input_filename.  The
5976      INPUT_STAT_SET signals that the stat is needed.  */
5977   input_stat_set = 0;
5978 }
5979 \f
5980 /* On fatal signals, delete all the temporary files.  */
5981
5982 static void
5983 fatal_error (int signum)
5984 {
5985   signal (signum, SIG_DFL);
5986   delete_failure_queue ();
5987   delete_temp_files ();
5988   /* Get the same signal again, this time not handled,
5989      so its normal effect occurs.  */
5990   kill (getpid (), signum);
5991 }
5992
5993 extern int main (int, const char **);
5994
5995 int
5996 main (int argc, const char **argv)
5997 {
5998   size_t i;
5999   int value;
6000   int linker_was_run = 0;
6001   int lang_n_infiles = 0;
6002   int num_linker_inputs = 0;
6003   char *explicit_link_files;
6004   char *specs_file;
6005   const char *p;
6006   struct user_specs *uptr;
6007
6008   p = argv[0] + strlen (argv[0]);
6009   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6010     --p;
6011   programname = p;
6012
6013   xmalloc_set_program_name (programname);
6014
6015 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6016   /* Perform host dependent initialization when needed.  */
6017   GCC_DRIVER_HOST_INITIALIZATION;
6018 #endif
6019
6020   gcc_init_libintl ();
6021
6022   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6023     signal (SIGINT, fatal_error);
6024 #ifdef SIGHUP
6025   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6026     signal (SIGHUP, fatal_error);
6027 #endif
6028   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6029     signal (SIGTERM, fatal_error);
6030 #ifdef SIGPIPE
6031   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6032     signal (SIGPIPE, fatal_error);
6033 #endif
6034 #ifdef SIGCHLD
6035   /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6036      receive the signal.  A different setting is inheritable */
6037   signal (SIGCHLD, SIG_DFL);
6038 #endif
6039
6040   /* Allocate the argument vector.  */
6041   alloc_args ();
6042
6043   obstack_init (&obstack);
6044
6045   /* Build multilib_select, et. al from the separate lines that make up each
6046      multilib selection.  */
6047   {
6048     const char *const *q = multilib_raw;
6049     int need_space;
6050
6051     obstack_init (&multilib_obstack);
6052     while ((p = *q++) != (char *) 0)
6053       obstack_grow (&multilib_obstack, p, strlen (p));
6054
6055     obstack_1grow (&multilib_obstack, 0);
6056     multilib_select = obstack_finish (&multilib_obstack);
6057
6058     q = multilib_matches_raw;
6059     while ((p = *q++) != (char *) 0)
6060       obstack_grow (&multilib_obstack, p, strlen (p));
6061
6062     obstack_1grow (&multilib_obstack, 0);
6063     multilib_matches = obstack_finish (&multilib_obstack);
6064
6065     q = multilib_exclusions_raw;
6066     while ((p = *q++) != (char *) 0)
6067       obstack_grow (&multilib_obstack, p, strlen (p));
6068
6069     obstack_1grow (&multilib_obstack, 0);
6070     multilib_exclusions = obstack_finish (&multilib_obstack);
6071
6072     need_space = FALSE;
6073     for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6074       {
6075         if (need_space)
6076           obstack_1grow (&multilib_obstack, ' ');
6077         obstack_grow (&multilib_obstack,
6078                       multilib_defaults_raw[i],
6079                       strlen (multilib_defaults_raw[i]));
6080         need_space = TRUE;
6081       }
6082
6083     obstack_1grow (&multilib_obstack, 0);
6084     multilib_defaults = obstack_finish (&multilib_obstack);
6085   }
6086
6087   /* Set up to remember the pathname of gcc and any options
6088      needed for collect.  We use argv[0] instead of programname because
6089      we need the complete pathname.  */
6090   obstack_init (&collect_obstack);
6091   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6092   obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6093   putenv (obstack_finish (&collect_obstack));
6094
6095 #ifdef INIT_ENVIRONMENT
6096   /* Set up any other necessary machine specific environment variables.  */
6097   putenv (INIT_ENVIRONMENT);
6098 #endif
6099
6100   /* Make a table of what switches there are (switches, n_switches).
6101      Make a table of specified input files (infiles, n_infiles).
6102      Decode switches that are handled locally.  */
6103
6104   process_command (argc, argv);
6105
6106   /* Initialize the vector of specs to just the default.
6107      This means one element containing 0s, as a terminator.  */
6108
6109   compilers = xmalloc (sizeof default_compilers);
6110   memcpy (compilers, default_compilers, sizeof default_compilers);
6111   n_compilers = n_default_compilers;
6112
6113   /* Read specs from a file if there is one.  */
6114
6115   machine_suffix = concat (spec_machine, dir_separator_str,
6116                            spec_version, dir_separator_str, NULL);
6117   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6118
6119   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, 0);
6120   /* Read the specs file unless it is a default one.  */
6121   if (specs_file != 0 && strcmp (specs_file, "specs"))
6122     read_specs (specs_file, TRUE);
6123   else
6124     init_spec ();
6125
6126   /* We need to check standard_exec_prefix/just_machine_suffix/specs
6127      for any override of as, ld and libraries.  */
6128   specs_file = alloca (strlen (standard_exec_prefix)
6129                        + strlen (just_machine_suffix) + sizeof ("specs"));
6130
6131   strcpy (specs_file, standard_exec_prefix);
6132   strcat (specs_file, just_machine_suffix);
6133   strcat (specs_file, "specs");
6134   if (access (specs_file, R_OK) == 0)
6135     read_specs (specs_file, TRUE);
6136
6137   /* Process any configure-time defaults specified for the command line
6138      options, via OPTION_DEFAULT_SPECS.  */
6139   for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6140     do_option_spec (option_default_specs[i].name,
6141                     option_default_specs[i].spec);
6142
6143   /* Process DRIVER_SELF_SPECS, adding any new options to the end
6144      of the command line.  */
6145
6146   for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6147     do_self_spec (driver_self_specs[i]);
6148
6149   /* If not cross-compiling, look for executables in the standard
6150      places.  */
6151   if (*cross_compile == '0')
6152     {
6153       if (*md_exec_prefix)
6154         {
6155           add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6156                       PREFIX_PRIORITY_LAST, 0, 0);
6157         }
6158     }
6159
6160   /* Process sysroot_suffix_spec.  */
6161   if (*sysroot_suffix_spec != 0
6162       && do_spec_2 (sysroot_suffix_spec) == 0)
6163     {
6164       if (argbuf_index > 1)
6165         error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC.");
6166       else if (argbuf_index == 1)
6167         target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6168     }
6169
6170   /* Process sysroot_hdrs_suffix_spec.  */
6171   if (*sysroot_hdrs_suffix_spec != 0
6172       && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6173     {
6174       if (argbuf_index > 1)
6175         error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC.");
6176       else if (argbuf_index == 1)
6177         target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6178     }
6179
6180   /* Look for startfiles in the standard places.  */
6181   if (*startfile_prefix_spec != 0
6182       && do_spec_2 (startfile_prefix_spec) == 0
6183       && do_spec_1 (" ", 0, NULL) == 0)
6184     {
6185       int ndx;
6186       for (ndx = 0; ndx < argbuf_index; ndx++)
6187         add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6188                               PREFIX_PRIORITY_LAST, 0, 1);
6189     }
6190   /* We should eventually get rid of all these and stick to
6191      startfile_prefix_spec exclusively.  */
6192   else if (*cross_compile == '0' || target_system_root)
6193     {
6194       if (*md_startfile_prefix)
6195         add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6196                               "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6197
6198       if (*md_startfile_prefix_1)
6199         add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6200                               "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6201
6202       /* If standard_startfile_prefix is relative, base it on
6203          standard_exec_prefix.  This lets us move the installed tree
6204          as a unit.  If GCC_EXEC_PREFIX is defined, base
6205          standard_startfile_prefix on that as well.
6206
6207          If the prefix is relative, only search it for native compilers;
6208          otherwise we will search a directory containing host libraries.  */
6209       if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6210         add_sysrooted_prefix (&startfile_prefixes,
6211                               standard_startfile_prefix, "BINUTILS",
6212                               PREFIX_PRIORITY_LAST, 0, 1);
6213       else if (*cross_compile == '0')
6214         {
6215           if (gcc_exec_prefix)
6216             add_prefix (&startfile_prefixes,
6217                         concat (gcc_exec_prefix, machine_suffix,
6218                                 standard_startfile_prefix, NULL),
6219                         NULL, PREFIX_PRIORITY_LAST, 0, 1);
6220           add_prefix (&startfile_prefixes,
6221                       concat (standard_exec_prefix,
6222                               machine_suffix,
6223                               standard_startfile_prefix, NULL),
6224                       NULL, PREFIX_PRIORITY_LAST, 0, 1);
6225         }
6226
6227       if (*standard_startfile_prefix_1)
6228         add_sysrooted_prefix (&startfile_prefixes,
6229                               standard_startfile_prefix_1, "BINUTILS",
6230                               PREFIX_PRIORITY_LAST, 0, 1);
6231       if (*standard_startfile_prefix_2)
6232         add_sysrooted_prefix (&startfile_prefixes,
6233                               standard_startfile_prefix_2, "BINUTILS",
6234                               PREFIX_PRIORITY_LAST, 0, 1);
6235     }
6236
6237   /* Process any user specified specs in the order given on the command
6238      line.  */
6239   for (uptr = user_specs_head; uptr; uptr = uptr->next)
6240     {
6241       char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6242                                     R_OK, 0);
6243       read_specs (filename ? filename : uptr->filename, FALSE);
6244     }
6245
6246   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
6247   if (gcc_exec_prefix)
6248     gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6249                               spec_version, dir_separator_str, NULL);
6250
6251   /* Now we have the specs.
6252      Set the `valid' bits for switches that match anything in any spec.  */
6253
6254   validate_all_switches ();
6255
6256   /* Now that we have the switches and the specs, set
6257      the subdirectory based on the options.  */
6258   set_multilib_dir ();
6259
6260   /* Warn about any switches that no pass was interested in.  */
6261
6262   for (i = 0; (int) i < n_switches; i++)
6263     if (! switches[i].validated)
6264       error ("unrecognized option '-%s'", switches[i].part1);
6265
6266   /* Obey some of the options.  */
6267
6268   if (print_search_dirs)
6269     {
6270       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
6271       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
6272       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
6273       return (0);
6274     }
6275
6276   if (print_file_name)
6277     {
6278       printf ("%s\n", find_file (print_file_name));
6279       return (0);
6280     }
6281
6282   if (print_prog_name)
6283     {
6284       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6285       printf ("%s\n", (newname ? newname : print_prog_name));
6286       return (0);
6287     }
6288
6289   if (print_multi_lib)
6290     {
6291       print_multilib_info ();
6292       return (0);
6293     }
6294
6295   if (print_multi_directory)
6296     {
6297       if (multilib_dir == NULL)
6298         printf (".\n");
6299       else
6300         printf ("%s\n", multilib_dir);
6301       return (0);
6302     }
6303
6304   if (print_multi_os_directory)
6305     {
6306       if (multilib_os_dir == NULL)
6307         printf (".\n");
6308       else
6309         printf ("%s\n", multilib_os_dir);
6310       return (0);
6311     }
6312
6313   if (target_help_flag)
6314    {
6315       /* Print if any target specific options.  */
6316
6317       /* We do not exit here. Instead we have created a fake input file
6318          called 'target-dummy' which needs to be compiled, and we pass this
6319          on to the various sub-processes, along with the --target-help
6320          switch.  */
6321     }
6322
6323   if (print_help_list)
6324     {
6325       display_help ();
6326
6327       if (! verbose_flag)
6328         {
6329           printf (_("\nFor bug reporting instructions, please see:\n"));
6330           printf ("%s.\n", bug_report_url);
6331
6332           return (0);
6333         }
6334
6335       /* We do not exit here.  Instead we have created a fake input file
6336          called 'help-dummy' which needs to be compiled, and we pass this
6337          on the various sub-processes, along with the --help switch.  */
6338     }
6339
6340   if (verbose_flag)
6341     {
6342       int n;
6343       const char *thrmod;
6344
6345       notice ("Target: %s\n", spec_machine);
6346       notice ("Configured with: %s\n", configuration_arguments);
6347
6348 #ifdef THREAD_MODEL_SPEC
6349       /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6350          but there's no point in doing all this processing just to get
6351          thread_model back.  */
6352       obstack_init (&obstack);
6353       do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6354       obstack_1grow (&obstack, '\0');
6355       thrmod = obstack_finish (&obstack);
6356 #else
6357       thrmod = thread_model;
6358 #endif
6359
6360       notice ("Thread model: %s\n", thrmod);
6361
6362       /* compiler_version is truncated at the first space when initialized
6363          from version string, so truncate version_string at the first space
6364          before comparing.  */
6365       for (n = 0; version_string[n]; n++)
6366         if (version_string[n] == ' ')
6367           break;
6368
6369       if (! strncmp (version_string, compiler_version, n)
6370           && compiler_version[n] == 0)
6371         notice ("gcc version %s\n", version_string);
6372       else
6373         notice ("gcc driver version %s executing gcc version %s\n",
6374                 version_string, compiler_version);
6375
6376       if (n_infiles == 0)
6377         return (0);
6378     }
6379
6380   if (n_infiles == added_libraries)
6381     fatal ("no input files");
6382
6383   /* Make a place to record the compiler output file names
6384      that correspond to the input files.  */
6385
6386   i = n_infiles;
6387   i += lang_specific_extra_outfiles;
6388   outfiles = xcalloc (i, sizeof (char *));
6389
6390   /* Record which files were specified explicitly as link input.  */
6391
6392   explicit_link_files = xcalloc (1, n_infiles);
6393
6394   if (combine_flag)
6395     combine_inputs = true;
6396   else
6397     combine_inputs = false;
6398
6399   for (i = 0; (int) i < n_infiles; i++)
6400     {
6401       const char *name = infiles[i].name;
6402       struct compiler *compiler = lookup_compiler (name, 
6403                                                    strlen (name), 
6404                                                    infiles[i].language);
6405       
6406       if (compiler && !(compiler->combinable))
6407         combine_inputs = false;
6408       
6409       if (lang_n_infiles > 0 && compiler != input_file_compiler
6410           && infiles[i].language && infiles[i].language[0] != '*')
6411         infiles[i].incompiler = compiler;
6412       else if (compiler)
6413         {
6414           lang_n_infiles++;
6415           input_file_compiler = compiler;
6416           infiles[i].incompiler = compiler;
6417         }
6418       else
6419         {
6420           /* Since there is no compiler for this input file, assume it is a
6421              linker file.  */
6422           explicit_link_files[i] = 1;
6423           infiles[i].incompiler = NULL;
6424         }
6425       infiles[i].compiled = false;
6426       infiles[i].preprocessed = false;
6427     }
6428   
6429   if (combine_flag && save_temps_flag)
6430     {
6431       bool save_combine_inputs = combine_inputs;
6432       /* Must do a separate pre-processing pass for C & Objective-C files, to
6433          obtain individual .i files.  */
6434
6435       combine_inputs = false;
6436       for (i = 0; (int) i < n_infiles; i++)
6437         {
6438           int this_file_error = 0;
6439           
6440           input_file_number = i;
6441           set_input (infiles[i].name);
6442           if (infiles[i].incompiler
6443               && (infiles[i].incompiler)->needs_preprocessing)
6444             input_file_compiler = infiles[i].incompiler;
6445           else
6446             continue;
6447
6448           if (input_file_compiler)
6449             {
6450               if (input_file_compiler->spec[0] == '#')
6451                 {
6452                   error ("%s: %s compiler not installed on this system",
6453                          input_filename, &input_file_compiler->spec[1]);
6454                   this_file_error = 1;
6455                 }
6456               else
6457                 {
6458                   value = do_spec (input_file_compiler->spec);
6459                   infiles[i].preprocessed = true;
6460                   if (!have_o_argbuf_index)
6461                     fatal ("spec '%s' is invalid", input_file_compiler->spec);
6462                   infiles[i].name = argbuf[have_o_argbuf_index];
6463                   infiles[i].incompiler
6464                     = lookup_compiler (infiles[i].name,
6465                                        strlen (infiles[i].name),
6466                                        infiles[i].language);
6467
6468                   if (value < 0)
6469                     this_file_error = 1;
6470                 }
6471             }
6472
6473           if (this_file_error)
6474             {
6475               delete_failure_queue ();
6476               error_count++;
6477               break;
6478             }
6479           clear_failure_queue ();
6480         }
6481       combine_inputs = save_combine_inputs;
6482     }
6483
6484   for (i = 0; (int) i < n_infiles; i++)
6485     {
6486       int this_file_error = 0;
6487
6488       /* Tell do_spec what to substitute for %i.  */
6489
6490       input_file_number = i;
6491       set_input (infiles[i].name);
6492
6493       if (infiles[i].compiled)
6494         continue;
6495
6496       /* Use the same thing in %o, unless cp->spec says otherwise.  */
6497
6498       outfiles[i] = input_filename;
6499
6500       /* Figure out which compiler from the file's suffix.  */
6501
6502       if (! combine_inputs)
6503         input_file_compiler
6504           = lookup_compiler (infiles[i].name, input_filename_length,
6505                              infiles[i].language);
6506       else
6507         input_file_compiler = infiles[i].incompiler;
6508
6509       if (input_file_compiler)
6510         {
6511           /* Ok, we found an applicable compiler.  Run its spec.  */
6512
6513           if (input_file_compiler->spec[0] == '#')
6514             {
6515               error ("%s: %s compiler not installed on this system",
6516                      input_filename, &input_file_compiler->spec[1]);
6517               this_file_error = 1;
6518             }
6519           else
6520             {
6521               value = do_spec (input_file_compiler->spec);
6522               infiles[i].compiled = true;
6523               if (value < 0)
6524                 this_file_error = 1;
6525             }
6526         }
6527
6528       /* If this file's name does not contain a recognized suffix,
6529          record it as explicit linker input.  */
6530
6531       else
6532         explicit_link_files[i] = 1;
6533
6534       /* Clear the delete-on-failure queue, deleting the files in it
6535          if this compilation failed.  */
6536
6537       if (this_file_error)
6538         {
6539           delete_failure_queue ();
6540           error_count++;
6541         }
6542       /* If this compilation succeeded, don't delete those files later.  */
6543       clear_failure_queue ();
6544     }
6545
6546   /* Reset the output file name to the first input file name, for use
6547      with %b in LINK_SPEC on a target that prefers not to emit a.out
6548      by default.  */
6549   if (n_infiles > 0)
6550     set_input (infiles[0].name);
6551
6552   if (error_count == 0)
6553     {
6554       /* Make sure INPUT_FILE_NUMBER points to first available open
6555          slot.  */
6556       input_file_number = n_infiles;
6557       if (lang_specific_pre_link ())
6558         error_count++;
6559     }
6560
6561   /* Determine if there are any linker input files.  */
6562   num_linker_inputs = 0;
6563   for (i = 0; (int) i < n_infiles; i++)
6564     if (explicit_link_files[i] || outfiles[i] != NULL)
6565       num_linker_inputs++;
6566
6567   /* Run ld to link all the compiler output files.  */
6568
6569   if (num_linker_inputs > 0 && error_count == 0)
6570     {
6571       int tmp = execution_count;
6572
6573       /* We'll use ld if we can't find collect2.  */
6574       if (! strcmp (linker_name_spec, "collect2"))
6575         {
6576           char *s = find_a_file (&exec_prefixes, "collect2", X_OK, 0);
6577           if (s == NULL)
6578             linker_name_spec = "ld";
6579         }
6580       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
6581          for collect.  */
6582       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
6583       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
6584
6585       value = do_spec (link_command_spec);
6586       if (value < 0)
6587         error_count = 1;
6588       linker_was_run = (tmp != execution_count);
6589     }
6590
6591   /* If options said don't run linker,
6592      complain about input files to be given to the linker.  */
6593
6594   if (! linker_was_run && error_count == 0)
6595     for (i = 0; (int) i < n_infiles; i++)
6596       if (explicit_link_files[i])
6597         error ("%s: linker input file unused because linking not done",
6598                outfiles[i]);
6599
6600   /* Delete some or all of the temporary files we made.  */
6601
6602   if (error_count)
6603     delete_failure_queue ();
6604   delete_temp_files ();
6605
6606   if (print_help_list)
6607     {
6608       printf (("\nFor bug reporting instructions, please see:\n"));
6609       printf ("%s\n", bug_report_url);
6610     }
6611
6612   return (signal_count != 0 ? 2
6613           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
6614           : 0);
6615 }
6616
6617 /* Find the proper compilation spec for the file name NAME,
6618    whose length is LENGTH.  LANGUAGE is the specified language,
6619    or 0 if this file is to be passed to the linker.  */
6620
6621 static struct compiler *
6622 lookup_compiler (const char *name, size_t length, const char *language)
6623 {
6624   struct compiler *cp;
6625
6626   /* If this was specified by the user to be a linker input, indicate that.  */
6627   if (language != 0 && language[0] == '*')
6628     return 0;
6629
6630   /* Otherwise, look for the language, if one is spec'd.  */
6631   if (language != 0)
6632     {
6633       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6634         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
6635           return cp;
6636
6637       error ("language %s not recognized", language);
6638       return 0;
6639     }
6640
6641   /* Look for a suffix.  */
6642   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6643     {
6644       if (/* The suffix `-' matches only the file name `-'.  */
6645           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6646           || (strlen (cp->suffix) < length
6647               /* See if the suffix matches the end of NAME.  */
6648               && !strcmp (cp->suffix,
6649                           name + length - strlen (cp->suffix))
6650          ))
6651         break;
6652     }
6653
6654 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6655   /* Look again, but case-insensitively this time.  */
6656   if (cp < compilers)
6657     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6658       {
6659         if (/* The suffix `-' matches only the file name `-'.  */
6660             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6661             || (strlen (cp->suffix) < length
6662                 /* See if the suffix matches the end of NAME.  */
6663                 && ((!strcmp (cp->suffix,
6664                              name + length - strlen (cp->suffix))
6665                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
6666                     && !strcasecmp (cp->suffix,
6667                                     name + length - strlen (cp->suffix)))
6668            ))
6669           break;
6670       }
6671 #endif
6672
6673   if (cp >= compilers)
6674     {
6675       if (cp->spec[0] != '@')
6676         /* A non-alias entry: return it.  */
6677         return cp;
6678
6679       /* An alias entry maps a suffix to a language.
6680          Search for the language; pass 0 for NAME and LENGTH
6681          to avoid infinite recursion if language not found.  */
6682       return lookup_compiler (NULL, 0, cp->spec + 1);
6683     }
6684   return 0;
6685 }
6686 \f
6687 static char *
6688 save_string (const char *s, int len)
6689 {
6690   char *result = xmalloc (len + 1);
6691
6692   memcpy (result, s, len);
6693   result[len] = 0;
6694   return result;
6695 }
6696
6697 void
6698 pfatal_with_name (const char *name)
6699 {
6700   perror_with_name (name);
6701   delete_temp_files ();
6702   exit (1);
6703 }
6704
6705 static void
6706 perror_with_name (const char *name)
6707 {
6708   error ("%s: %s", name, xstrerror (errno));
6709 }
6710
6711 static void
6712 pfatal_pexecute (const char *errmsg_fmt, const char *errmsg_arg)
6713 {
6714   if (errmsg_arg)
6715     {
6716       int save_errno = errno;
6717
6718       /* Space for trailing '\0' is in %s.  */
6719       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
6720       sprintf (msg, errmsg_fmt, errmsg_arg);
6721       errmsg_fmt = msg;
6722
6723       errno = save_errno;
6724     }
6725
6726   pfatal_with_name (errmsg_fmt);
6727 }
6728
6729 /* Output an error message and exit.  */
6730
6731 void
6732 fancy_abort (const char *file, int line, const char *func)
6733 {
6734   fatal ("internal gcc abort in %s, at %s:%d", func, file, line);
6735 }
6736 \f
6737 /* Output an error message and exit.  */
6738
6739 void
6740 fatal (const char *msgid, ...)
6741 {
6742   va_list ap;
6743
6744   va_start (ap, msgid);
6745
6746   fprintf (stderr, "%s: ", programname);
6747   vfprintf (stderr, _(msgid), ap);
6748   va_end (ap);
6749   fprintf (stderr, "\n");
6750   delete_temp_files ();
6751   exit (1);
6752 }
6753
6754 void
6755 error (const char *msgid, ...)
6756 {
6757   va_list ap;
6758
6759   va_start (ap, msgid);
6760   fprintf (stderr, "%s: ", programname);
6761   vfprintf (stderr, _(msgid), ap);
6762   va_end (ap);
6763
6764   fprintf (stderr, "\n");
6765 }
6766
6767 static void
6768 notice (const char *msgid, ...)
6769 {
6770   va_list ap;
6771
6772   va_start (ap, msgid);
6773   vfprintf (stderr, _(msgid), ap);
6774   va_end (ap);
6775 }
6776 \f
6777 static inline void
6778 validate_switches_from_spec (const char *spec)
6779 {
6780   const char *p = spec;
6781   char c;
6782   while ((c = *p++))
6783     if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
6784       /* We have a switch spec.  */
6785       p = validate_switches (p + 1);
6786 }
6787
6788 static void
6789 validate_all_switches (void)
6790 {
6791   struct compiler *comp;
6792   struct spec_list *spec;
6793
6794   for (comp = compilers; comp->spec; comp++)
6795     validate_switches_from_spec (comp->spec);
6796
6797   /* Look through the linked list of specs read from the specs file.  */
6798   for (spec = specs; spec; spec = spec->next)
6799     validate_switches_from_spec (*spec->ptr_spec);
6800
6801   validate_switches_from_spec (link_command_spec);
6802 }
6803
6804 /* Look at the switch-name that comes after START
6805    and mark as valid all supplied switches that match it.  */
6806
6807 static const char *
6808 validate_switches (const char *start)
6809 {
6810   const char *p = start;
6811   const char *atom;
6812   size_t len;
6813   int i;
6814   bool suffix = false;
6815   bool starred = false;
6816
6817 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6818
6819 next_member:
6820   SKIP_WHITE ();
6821
6822   if (*p == '!')
6823     p++;
6824
6825   SKIP_WHITE ();
6826   if (*p == '.')
6827     suffix = true, p++;
6828
6829   atom = p;
6830   while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
6831          || *p == ',' || *p == '.' || *p == '@')
6832     p++;
6833   len = p - atom;
6834
6835   if (*p == '*')
6836     starred = true, p++;
6837
6838   SKIP_WHITE ();
6839
6840   if (!suffix)
6841     {
6842       /* Mark all matching switches as valid.  */
6843       for (i = 0; i < n_switches; i++)
6844         if (!strncmp (switches[i].part1, atom, len)
6845             && (starred || switches[i].part1[len] == 0))
6846           switches[i].validated = 1;
6847     }
6848
6849   if (*p) p++;
6850   if (*p && (p[-1] == '|' || p[-1] == '&'))
6851     goto next_member;
6852
6853   if (*p && p[-1] == ':')
6854     {
6855       while (*p && *p != ';' && *p != '}')
6856         {
6857           if (*p == '%')
6858             {
6859               p++;
6860               if (*p == '{' || *p == '<')
6861                 p = validate_switches (p+1);
6862               else if (p[0] == 'W' && p[1] == '{')
6863                 p = validate_switches (p+2);
6864             }
6865           else
6866             p++;
6867         }
6868
6869       if (*p) p++;
6870       if (*p && p[-1] == ';')
6871         goto next_member;
6872     }
6873
6874   return p;
6875 #undef SKIP_WHITE
6876 }
6877 \f
6878 struct mdswitchstr
6879 {
6880   const char *str;
6881   int len;
6882 };
6883
6884 static struct mdswitchstr *mdswitches;
6885 static int n_mdswitches;
6886
6887 /* Check whether a particular argument was used.  The first time we
6888    canonicalize the switches to keep only the ones we care about.  */
6889
6890 static int
6891 used_arg (const char *p, int len)
6892 {
6893   struct mswitchstr
6894   {
6895     const char *str;
6896     const char *replace;
6897     int len;
6898     int rep_len;
6899   };
6900
6901   static struct mswitchstr *mswitches;
6902   static int n_mswitches;
6903   int i, j;
6904
6905   if (!mswitches)
6906     {
6907       struct mswitchstr *matches;
6908       const char *q;
6909       int cnt = 0;
6910
6911       /* Break multilib_matches into the component strings of string
6912          and replacement string.  */
6913       for (q = multilib_matches; *q != '\0'; q++)
6914         if (*q == ';')
6915           cnt++;
6916
6917       matches = alloca ((sizeof (struct mswitchstr)) * cnt);
6918       i = 0;
6919       q = multilib_matches;
6920       while (*q != '\0')
6921         {
6922           matches[i].str = q;
6923           while (*q != ' ')
6924             {
6925               if (*q == '\0')
6926                 {
6927                 invalid_matches:
6928                   fatal ("multilib spec '%s' is invalid", multilib_matches);
6929                 }
6930               q++;
6931             }
6932           matches[i].len = q - matches[i].str;
6933
6934           matches[i].replace = ++q;
6935           while (*q != ';' && *q != '\0')
6936             {
6937               if (*q == ' ')
6938                 goto invalid_matches;
6939               q++;
6940             }
6941           matches[i].rep_len = q - matches[i].replace;
6942           i++;
6943           if (*q == ';')
6944             q++;
6945         }
6946
6947       /* Now build a list of the replacement string for switches that we care
6948          about.  Make sure we allocate at least one entry.  This prevents
6949          xmalloc from calling fatal, and prevents us from re-executing this
6950          block of code.  */
6951       mswitches
6952         = xmalloc (sizeof (struct mswitchstr)
6953                    * (n_mdswitches + (n_switches ? n_switches : 1)));
6954       for (i = 0; i < n_switches; i++)
6955         if (switches[i].live_cond != SWITCH_IGNORE)
6956           {
6957             int xlen = strlen (switches[i].part1);
6958             for (j = 0; j < cnt; j++)
6959               if (xlen == matches[j].len
6960                   && ! strncmp (switches[i].part1, matches[j].str, xlen))
6961                 {
6962                   mswitches[n_mswitches].str = matches[j].replace;
6963                   mswitches[n_mswitches].len = matches[j].rep_len;
6964                   mswitches[n_mswitches].replace = (char *) 0;
6965                   mswitches[n_mswitches].rep_len = 0;
6966                   n_mswitches++;
6967                   break;
6968                 }
6969           }
6970
6971       /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
6972          on the command line nor any options mutually incompatible with
6973          them.  */
6974       for (i = 0; i < n_mdswitches; i++)
6975         {
6976           const char *r;
6977
6978           for (q = multilib_options; *q != '\0'; q++)
6979             {
6980               while (*q == ' ')
6981                 q++;
6982
6983               r = q;
6984               while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
6985                      || strchr (" /", q[mdswitches[i].len]) == NULL)
6986                 {
6987                   while (*q != ' ' && *q != '/' && *q != '\0')
6988                     q++;
6989                   if (*q != '/')
6990                     break;
6991                   q++;
6992                 }
6993
6994               if (*q != ' ' && *q != '\0')
6995                 {
6996                   while (*r != ' ' && *r != '\0')
6997                     {
6998                       q = r;
6999                       while (*q != ' ' && *q != '/' && *q != '\0')
7000                         q++;
7001
7002                       if (used_arg (r, q - r))
7003                         break;
7004
7005                       if (*q != '/')
7006                         {
7007                           mswitches[n_mswitches].str = mdswitches[i].str;
7008                           mswitches[n_mswitches].len = mdswitches[i].len;
7009                           mswitches[n_mswitches].replace = (char *) 0;
7010                           mswitches[n_mswitches].rep_len = 0;
7011                           n_mswitches++;
7012                           break;
7013                         }
7014
7015                       r = q + 1;
7016                     }
7017                   break;
7018                 }
7019             }
7020         }
7021     }
7022
7023   for (i = 0; i < n_mswitches; i++)
7024     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7025       return 1;
7026
7027   return 0;
7028 }
7029
7030 static int
7031 default_arg (const char *p, int len)
7032 {
7033   int i;
7034
7035   for (i = 0; i < n_mdswitches; i++)
7036     if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7037       return 1;
7038
7039   return 0;
7040 }
7041
7042 /* Work out the subdirectory to use based on the options. The format of
7043    multilib_select is a list of elements. Each element is a subdirectory
7044    name followed by a list of options followed by a semicolon. The format
7045    of multilib_exclusions is the same, but without the preceding
7046    directory. First gcc will check the exclusions, if none of the options
7047    beginning with an exclamation point are present, and all of the other
7048    options are present, then we will ignore this completely. Passing
7049    that, gcc will consider each multilib_select in turn using the same
7050    rules for matching the options. If a match is found, that subdirectory
7051    will be used.  */
7052
7053 static void
7054 set_multilib_dir (void)
7055 {
7056   const char *p;
7057   unsigned int this_path_len;
7058   const char *this_path, *this_arg;
7059   const char *start, *end;
7060   int not_arg;
7061   int ok, ndfltok, first;
7062
7063   n_mdswitches = 0;
7064   start = multilib_defaults;
7065   while (*start == ' ' || *start == '\t')
7066     start++;
7067   while (*start != '\0')
7068     {
7069       n_mdswitches++;
7070       while (*start != ' ' && *start != '\t' && *start != '\0')
7071         start++;
7072       while (*start == ' ' || *start == '\t')
7073         start++;
7074     }
7075
7076   if (n_mdswitches)
7077     {
7078       int i = 0;
7079
7080       mdswitches = xmalloc (sizeof (struct mdswitchstr) * n_mdswitches);
7081       for (start = multilib_defaults; *start != '\0'; start = end + 1)
7082         {
7083           while (*start == ' ' || *start == '\t')
7084             start++;
7085
7086           if (*start == '\0')
7087             break;
7088
7089           for (end = start + 1;
7090                *end != ' ' && *end != '\t' && *end != '\0'; end++)
7091             ;
7092
7093           obstack_grow (&multilib_obstack, start, end - start);
7094           obstack_1grow (&multilib_obstack, 0);
7095           mdswitches[i].str = obstack_finish (&multilib_obstack);
7096           mdswitches[i++].len = end - start;
7097
7098           if (*end == '\0')
7099             break;
7100         }
7101     }
7102
7103   p = multilib_exclusions;
7104   while (*p != '\0')
7105     {
7106       /* Ignore newlines.  */
7107       if (*p == '\n')
7108         {
7109           ++p;
7110           continue;
7111         }
7112
7113       /* Check the arguments.  */
7114       ok = 1;
7115       while (*p != ';')
7116         {
7117           if (*p == '\0')
7118             {
7119             invalid_exclusions:
7120               fatal ("multilib exclusions '%s' is invalid",
7121                      multilib_exclusions);
7122             }
7123
7124           if (! ok)
7125             {
7126               ++p;
7127               continue;
7128             }
7129
7130           this_arg = p;
7131           while (*p != ' ' && *p != ';')
7132             {
7133               if (*p == '\0')
7134                 goto invalid_exclusions;
7135               ++p;
7136             }
7137
7138           if (*this_arg != '!')
7139             not_arg = 0;
7140           else
7141             {
7142               not_arg = 1;
7143               ++this_arg;
7144             }
7145
7146           ok = used_arg (this_arg, p - this_arg);
7147           if (not_arg)
7148             ok = ! ok;
7149
7150           if (*p == ' ')
7151             ++p;
7152         }
7153
7154       if (ok)
7155         return;
7156
7157       ++p;
7158     }
7159
7160   first = 1;
7161   p = multilib_select;
7162   while (*p != '\0')
7163     {
7164       /* Ignore newlines.  */
7165       if (*p == '\n')
7166         {
7167           ++p;
7168           continue;
7169         }
7170
7171       /* Get the initial path.  */
7172       this_path = p;
7173       while (*p != ' ')
7174         {
7175           if (*p == '\0')
7176             {
7177             invalid_select:
7178               fatal ("multilib select '%s' is invalid",
7179                      multilib_select);
7180             }
7181           ++p;
7182         }
7183       this_path_len = p - this_path;
7184
7185       /* Check the arguments.  */
7186       ok = 1;
7187       ndfltok = 1;
7188       ++p;
7189       while (*p != ';')
7190         {
7191           if (*p == '\0')
7192             goto invalid_select;
7193
7194           if (! ok)
7195             {
7196               ++p;
7197               continue;
7198             }
7199
7200           this_arg = p;
7201           while (*p != ' ' && *p != ';')
7202             {
7203               if (*p == '\0')
7204                 goto invalid_select;
7205               ++p;
7206             }
7207
7208           if (*this_arg != '!')
7209             not_arg = 0;
7210           else
7211             {
7212               not_arg = 1;
7213               ++this_arg;
7214             }
7215
7216           /* If this is a default argument, we can just ignore it.
7217              This is true even if this_arg begins with '!'.  Beginning
7218              with '!' does not mean that this argument is necessarily
7219              inappropriate for this library: it merely means that
7220              there is a more specific library which uses this
7221              argument.  If this argument is a default, we need not
7222              consider that more specific library.  */
7223           ok = used_arg (this_arg, p - this_arg);
7224           if (not_arg)
7225             ok = ! ok;
7226
7227           if (! ok)
7228             ndfltok = 0;
7229
7230           if (default_arg (this_arg, p - this_arg))
7231             ok = 1;
7232
7233           if (*p == ' ')
7234             ++p;
7235         }
7236
7237       if (ok && first)
7238         {
7239           if (this_path_len != 1
7240               || this_path[0] != '.')
7241             {
7242               char *new_multilib_dir = xmalloc (this_path_len + 1);
7243               char *q;
7244
7245               strncpy (new_multilib_dir, this_path, this_path_len);
7246               new_multilib_dir[this_path_len] = '\0';
7247               q = strchr (new_multilib_dir, ':');
7248               if (q != NULL)
7249                 *q = '\0';
7250               multilib_dir = new_multilib_dir;
7251             }
7252           first = 0;
7253         }
7254
7255       if (ndfltok)
7256         {
7257           const char *q = this_path, *end = this_path + this_path_len;
7258
7259           while (q < end && *q != ':')
7260             q++;
7261           if (q < end)
7262             {
7263               char *new_multilib_os_dir = xmalloc (end - q);
7264               memcpy (new_multilib_os_dir, q + 1, end - q - 1);
7265               new_multilib_os_dir[end - q - 1] = '\0';
7266               multilib_os_dir = new_multilib_os_dir;
7267               break;
7268             }
7269         }
7270
7271       ++p;
7272     }
7273
7274   if (multilib_dir == NULL && multilib_os_dir != NULL
7275       && strcmp (multilib_os_dir, ".") == 0)
7276     {
7277       free ((char *) multilib_os_dir);
7278       multilib_os_dir = NULL;
7279     }
7280   else if (multilib_dir != NULL && multilib_os_dir == NULL)
7281     multilib_os_dir = multilib_dir;
7282 }
7283
7284 /* Print out the multiple library subdirectory selection
7285    information.  This prints out a series of lines.  Each line looks
7286    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
7287    required.  Only the desired options are printed out, the negative
7288    matches.  The options are print without a leading dash.  There are
7289    no spaces to make it easy to use the information in the shell.
7290    Each subdirectory is printed only once.  This assumes the ordering
7291    generated by the genmultilib script. Also, we leave out ones that match
7292    the exclusions.  */
7293
7294 static void
7295 print_multilib_info (void)
7296 {
7297   const char *p = multilib_select;
7298   const char *last_path = 0, *this_path;
7299   int skip;
7300   unsigned int last_path_len = 0;
7301
7302   while (*p != '\0')
7303     {
7304       skip = 0;
7305       /* Ignore newlines.  */
7306       if (*p == '\n')
7307         {
7308           ++p;
7309           continue;
7310         }
7311
7312       /* Get the initial path.  */
7313       this_path = p;
7314       while (*p != ' ')
7315         {
7316           if (*p == '\0')
7317             {
7318             invalid_select:
7319               fatal ("multilib select '%s' is invalid", multilib_select);
7320             }
7321           
7322           ++p;
7323         }
7324
7325       /* When --disable-multilib was used but target defines
7326          MULTILIB_OSDIRNAMES, entries starting with .: are there just
7327          to find multilib_os_dir, so skip them from output.  */
7328       if (this_path[0] == '.' && this_path[1] == ':')
7329         skip = 1;
7330
7331       /* Check for matches with the multilib_exclusions. We don't bother
7332          with the '!' in either list. If any of the exclusion rules match
7333          all of its options with the select rule, we skip it.  */
7334       {
7335         const char *e = multilib_exclusions;
7336         const char *this_arg;
7337
7338         while (*e != '\0')
7339           {
7340             int m = 1;
7341             /* Ignore newlines.  */
7342             if (*e == '\n')
7343               {
7344                 ++e;
7345                 continue;
7346               }
7347
7348             /* Check the arguments.  */
7349             while (*e != ';')
7350               {
7351                 const char *q;
7352                 int mp = 0;
7353
7354                 if (*e == '\0')
7355                   {
7356                   invalid_exclusion:
7357                     fatal ("multilib exclusion '%s' is invalid",
7358                            multilib_exclusions);
7359                   }
7360
7361                 if (! m)
7362                   {
7363                     ++e;
7364                     continue;
7365                   }
7366
7367                 this_arg = e;
7368
7369                 while (*e != ' ' && *e != ';')
7370                   {
7371                     if (*e == '\0')
7372                       goto invalid_exclusion;
7373                     ++e;
7374                   }
7375
7376                 q = p + 1;
7377                 while (*q != ';')
7378                   {
7379                     const char *arg;
7380                     int len = e - this_arg;
7381
7382                     if (*q == '\0')
7383                       goto invalid_select;
7384
7385                     arg = q;
7386
7387                     while (*q != ' ' && *q != ';')
7388                       {
7389                         if (*q == '\0')
7390                           goto invalid_select;
7391                         ++q;
7392                       }
7393
7394                     if (! strncmp (arg, this_arg,
7395                                    (len < q - arg) ? q - arg : len)
7396                         || default_arg (this_arg, e - this_arg))
7397                       {
7398                         mp = 1;
7399                         break;
7400                       }
7401
7402                     if (*q == ' ')
7403                       ++q;
7404                   }
7405
7406                 if (! mp)
7407                   m = 0;
7408
7409                 if (*e == ' ')
7410                   ++e;
7411               }
7412
7413             if (m)
7414               {
7415                 skip = 1;
7416                 break;
7417               }
7418
7419             if (*e != '\0')
7420               ++e;
7421           }
7422       }
7423
7424       if (! skip)
7425         {
7426           /* If this is a duplicate, skip it.  */
7427           skip = (last_path != 0
7428                   && (unsigned int) (p - this_path) == last_path_len
7429                   && ! strncmp (last_path, this_path, last_path_len));
7430
7431           last_path = this_path;
7432           last_path_len = p - this_path;
7433         }
7434
7435       /* If this directory requires any default arguments, we can skip
7436          it.  We will already have printed a directory identical to
7437          this one which does not require that default argument.  */
7438       if (! skip)
7439         {
7440           const char *q;
7441
7442           q = p + 1;
7443           while (*q != ';')
7444             {
7445               const char *arg;
7446
7447               if (*q == '\0')
7448                 goto invalid_select;
7449
7450               if (*q == '!')
7451                 arg = NULL;
7452               else
7453                 arg = q;
7454
7455               while (*q != ' ' && *q != ';')
7456                 {
7457                   if (*q == '\0')
7458                     goto invalid_select;
7459                   ++q;
7460                 }
7461
7462               if (arg != NULL
7463                   && default_arg (arg, q - arg))
7464                 {
7465                   skip = 1;
7466                   break;
7467                 }
7468
7469               if (*q == ' ')
7470                 ++q;
7471             }
7472         }
7473
7474       if (! skip)
7475         {
7476           const char *p1;
7477
7478           for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
7479             putchar (*p1);
7480           putchar (';');
7481         }
7482
7483       ++p;
7484       while (*p != ';')
7485         {
7486           int use_arg;
7487
7488           if (*p == '\0')
7489             goto invalid_select;
7490
7491           if (skip)
7492             {
7493               ++p;
7494               continue;
7495             }
7496
7497           use_arg = *p != '!';
7498
7499           if (use_arg)
7500             putchar ('@');
7501
7502           while (*p != ' ' && *p != ';')
7503             {
7504               if (*p == '\0')
7505                 goto invalid_select;
7506               if (use_arg)
7507                 putchar (*p);
7508               ++p;
7509             }
7510
7511           if (*p == ' ')
7512             ++p;
7513         }
7514
7515       if (! skip)
7516         {
7517           /* If there are extra options, print them now.  */
7518           if (multilib_extra && *multilib_extra)
7519             {
7520               int print_at = TRUE;
7521               const char *q;
7522
7523               for (q = multilib_extra; *q != '\0'; q++)
7524                 {
7525                   if (*q == ' ')
7526                     print_at = TRUE;
7527                   else
7528                     {
7529                       if (print_at)
7530                         putchar ('@');
7531                       putchar (*q);
7532                       print_at = FALSE;
7533                     }
7534                 }
7535             }
7536
7537           putchar ('\n');
7538         }
7539
7540       ++p;
7541     }
7542 }
7543 \f
7544 /* if-exists built-in spec function.
7545
7546    Checks to see if the file specified by the absolute pathname in
7547    ARGS exists.  Returns that pathname if found.
7548
7549    The usual use for this function is to check for a library file
7550    (whose name has been expanded with %s).  */
7551
7552 static const char *
7553 if_exists_spec_function (int argc, const char **argv)
7554 {
7555   /* Must have only one argument.  */
7556   if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7557     return argv[0];
7558
7559   return NULL;
7560 }
7561
7562 /* if-exists-else built-in spec function.
7563
7564    This is like if-exists, but takes an additional argument which
7565    is returned if the first argument does not exist.  */
7566
7567 static const char *
7568 if_exists_else_spec_function (int argc, const char **argv)
7569 {
7570   /* Must have exactly two arguments.  */
7571   if (argc != 2)
7572     return NULL;
7573
7574   if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7575     return argv[0];
7576
7577   return argv[1];
7578 }
7579
7580 /* replace-outfile built-in spec function.
7581    This looks for the first argument in the outfiles array's name and replaces it
7582    with the second argument.  */
7583
7584 static const char *
7585 replace_outfile_spec_function (int argc, const char **argv)
7586 {
7587   int i;
7588   /* Must have exactly two arguments.  */
7589   if (argc != 2)
7590     abort ();
7591   
7592   for (i = 0; i < n_infiles; i++)
7593     {
7594       if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
7595         outfiles[i] = xstrdup (argv[1]);
7596     }
7597   return NULL;
7598 }
7599