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