1/* Compiler driver program that can handle many languages.
2   Copyright (C) 1987-2020 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3.  If not see
18<http://www.gnu.org/licenses/>.  */
19
20/* This program is the user interface to the C compiler and possibly to
21other compilers.  It is used because compilation is a complicated procedure
22which involves running several programs and passing temporary files between
23them, forwarding the users switches to those programs selectively,
24and deleting the temporary files at the end.
25
26CC recognizes how to compile each input file by suffixes in the file names.
27Once it knows which kind of compilation to perform, the procedure for
28compilation is specified by a string called a "spec".  */
29
30#define INCLUDE_STRING
31#include "config.h"
32#include "system.h"
33#include "coretypes.h"
34#include "multilib.h" /* before tm.h */
35#include "tm.h"
36#include "xregex.h"
37#include "obstack.h"
38#include "intl.h"
39#include "prefix.h"
40#include "opt-suggestions.h"
41#include "gcc.h"
42#include "diagnostic.h"
43#include "flags.h"
44#include "opts.h"
45#include "filenames.h"
46#include "spellcheck.h"
47#include "opts-jobserver.h"
48
49
50
51/* Manage the manipulation of env vars.
52
53   We poison "getenv" and "putenv", so that all enviroment-handling is
54   done through this class.  Note that poisoning happens in the
55   preprocessor at the identifier level, and doesn't distinguish between
56     env.getenv ();
57   and
58     getenv ();
59   Hence we need to use "get" for the accessor method, not "getenv".  */
60
61struct env_manager
62{
63 public:
64  void init (bool can_restore, bool debug);
65  const char *get (const char *name);
66  void xput (const char *string);
67  void restore ();
68
69 private:
70  bool m_can_restore;
71  bool m_debug;
72  struct kv
73  {
74    char *m_key;
75    char *m_value;
76  };
77  vec<kv> m_keys;
78
79};
80
81/* The singleton instance of class env_manager.  */
82
83static env_manager env;
84
85/* Initializer for class env_manager.
86
87   We can't do this as a constructor since we have a statically
88   allocated instance ("env" above).  */
89
90void
91env_manager::init (bool can_restore, bool debug)
92{
93  m_can_restore = can_restore;
94  m_debug = debug;
95}
96
97/* Get the value of NAME within the environment.  Essentially
98   a wrapper for ::getenv, but adding logging, and the possibility
99   of caching results.  */
100
101const char *
102env_manager::get (const char *name)
103{
104  const char *result = ::getenv (name);
105  if (m_debug)
106    fprintf (stderr, "env_manager::getenv (%s) -> %s\n", name, result);
107  return result;
108}
109
110/* Put the given KEY=VALUE entry STRING into the environment.
111   If the env_manager was initialized with CAN_RESTORE set, then
112   also record the old value of KEY within the environment, so that it
113   can be later restored.  */
114
115void
116env_manager::xput (const char *string)
117{
118  if (m_debug)
119    fprintf (stderr, "env_manager::xput (%s)\n", string);
120  if (verbose_flag)
121    fnotice (stderr, "%s\n", string);
122
123  if (m_can_restore)
124    {
125      char *equals = strchr (const_cast <char *> (string), '=');
126      gcc_assert (equals);
127
128      struct kv kv;
129      kv.m_key = xstrndup (string, equals - string);
130      const char *cur_value = ::getenv (kv.m_key);
131      if (m_debug)
132	fprintf (stderr, "saving old value: %s\n",cur_value);
133      kv.m_value = cur_value ? xstrdup (cur_value) : NULL;
134      m_keys.safe_push (kv);
135    }
136
137  ::putenv (CONST_CAST (char *, string));
138}
139
140/* Undo any xputenv changes made since last restore.
141   Can only be called if the env_manager was initialized with
142   CAN_RESTORE enabled.  */
143
144void
145env_manager::restore ()
146{
147  unsigned int i;
148  struct kv *item;
149
150  gcc_assert (m_can_restore);
151
152  FOR_EACH_VEC_ELT_REVERSE (m_keys, i, item)
153    {
154      if (m_debug)
155	printf ("restoring saved key: %s value: %s\n", item->m_key, item->m_value);
156      if (item->m_value)
157	::setenv (item->m_key, item->m_value, 1);
158      else
159	::unsetenv (item->m_key);
160      free (item->m_key);
161      free (item->m_value);
162    }
163
164  m_keys.truncate (0);
165}
166
167/* Forbid other uses of getenv and putenv.  */
168#if (GCC_VERSION >= 3000)
169#pragma GCC poison getenv putenv
170#endif
171
172
173
174/* By default there is no special suffix for target executables.  */
175#ifdef TARGET_EXECUTABLE_SUFFIX
176#define HAVE_TARGET_EXECUTABLE_SUFFIX
177#else
178#define TARGET_EXECUTABLE_SUFFIX ""
179#endif
180
181/* By default there is no special suffix for host executables.  */
182#ifdef HOST_EXECUTABLE_SUFFIX
183#define HAVE_HOST_EXECUTABLE_SUFFIX
184#else
185#define HOST_EXECUTABLE_SUFFIX ""
186#endif
187
188/* By default, the suffix for target object files is ".o".  */
189#ifdef TARGET_OBJECT_SUFFIX
190#define HAVE_TARGET_OBJECT_SUFFIX
191#else
192#define TARGET_OBJECT_SUFFIX ".o"
193#endif
194
195static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
196
197/* Most every one is fine with LIBRARY_PATH.  For some, it conflicts.  */
198#ifndef LIBRARY_PATH_ENV
199#define LIBRARY_PATH_ENV "LIBRARY_PATH"
200#endif
201
202/* If a stage of compilation returns an exit status >= 1,
203   compilation of that file ceases.  */
204
205#define MIN_FATAL_STATUS 1
206
207/* Flag set by cppspec.c to 1.  */
208int is_cpp_driver;
209
210/* Flag set to nonzero if an @file argument has been supplied to gcc.  */
211static bool at_file_supplied;
212
213/* Definition of string containing the arguments given to configure.  */
214#include "configargs.h"
215
216/* Flag saying to print the command line options understood by gcc and its
217   sub-processes.  */
218
219static int print_help_list;
220
221/* Flag saying to print the version of gcc and its sub-processes.  */
222
223static int print_version;
224
225/* Flag that stores string prefix for which we provide bash completion.  */
226
227static const char *completion = NULL;
228
229/* Flag indicating whether we should ONLY print the command and
230   arguments (like verbose_flag) without executing the command.
231   Displayed arguments are quoted so that the generated command
232   line is suitable for execution.  This is intended for use in
233   shell scripts to capture the driver-generated command line.  */
234static int verbose_only_flag;
235
236/* Flag indicating how to print command line options of sub-processes.  */
237
238static int print_subprocess_help;
239
240/* Linker suffix passed to -fuse-ld=... */
241static const char *use_ld;
242
243/* Whether we should report subprocess execution times to a file.  */
244
245FILE *report_times_to_file = NULL;
246
247/* Nonzero means place this string before uses of /, so that include
248   and library files can be found in an alternate location.  */
249
250#ifdef TARGET_SYSTEM_ROOT
251#define DEFAULT_TARGET_SYSTEM_ROOT (TARGET_SYSTEM_ROOT)
252#else
253#define DEFAULT_TARGET_SYSTEM_ROOT (0)
254#endif
255static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
256
257/* Nonzero means pass the updated target_system_root to the compiler.  */
258
259static int target_system_root_changed;
260
261/* Nonzero means append this string to target_system_root.  */
262
263static const char *target_sysroot_suffix = 0;
264
265/* Nonzero means append this string to target_system_root for headers.  */
266
267static const char *target_sysroot_hdrs_suffix = 0;
268
269/* Nonzero means write "temp" files in source directory
270   and use the source file's name in them, and don't delete them.  */
271
272static enum save_temps {
273  SAVE_TEMPS_NONE,		/* no -save-temps */
274  SAVE_TEMPS_CWD,		/* -save-temps in current directory */
275  SAVE_TEMPS_OBJ		/* -save-temps in object directory */
276} save_temps_flag;
277
278/* Output file to use to get the object directory for -save-temps=obj  */
279static char *save_temps_prefix = 0;
280static size_t save_temps_length = 0;
281
282/* The compiler version.  */
283
284static const char *compiler_version;
285
286/* The target version.  */
287
288static const char *const spec_version = DEFAULT_TARGET_VERSION;
289
290/* The target machine.  */
291
292static const char *spec_machine = DEFAULT_TARGET_MACHINE;
293static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
294
295/* List of offload targets.  Separated by colon.  Empty string for
296   -foffload=disable.  */
297
298static char *offload_targets = NULL;
299
300/* Nonzero if cross-compiling.
301   When -b is used, the value comes from the `specs' file.  */
302
303#ifdef CROSS_DIRECTORY_STRUCTURE
304static const char *cross_compile = "1";
305#else
306static const char *cross_compile = "0";
307#endif
308
309/* Greatest exit code of sub-processes that has been encountered up to
310   now.  */
311static int greatest_status = 1;
312
313/* This is the obstack which we use to allocate many strings.  */
314
315static struct obstack obstack;
316
317/* This is the obstack to build an environment variable to pass to
318   collect2 that describes all of the relevant switches of what to
319   pass the compiler in building the list of pointers to constructors
320   and destructors.  */
321
322static struct obstack collect_obstack;
323
324/* Forward declaration for prototypes.  */
325struct path_prefix;
326struct prefix_list;
327
328static void init_spec (void);
329static void store_arg (const char *, int, int);
330static void insert_wrapper (const char *);
331static char *load_specs (const char *);
332static void read_specs (const char *, bool, bool);
333static void set_spec (const char *, const char *, bool);
334static struct compiler *lookup_compiler (const char *, size_t, const char *);
335static char *build_search_list (const struct path_prefix *, const char *,
336				bool, bool);
337static void xputenv (const char *);
338static void putenv_from_prefixes (const struct path_prefix *, const char *,
339				  bool);
340static int access_check (const char *, int);
341static char *find_a_file (const struct path_prefix *, const char *, int, bool);
342static void add_prefix (struct path_prefix *, const char *, const char *,
343			int, int, int);
344static void add_sysrooted_prefix (struct path_prefix *, const char *,
345				  const char *, int, int, int);
346static char *skip_whitespace (char *);
347static void delete_if_ordinary (const char *);
348static void delete_temp_files (void);
349static void delete_failure_queue (void);
350static void clear_failure_queue (void);
351static int check_live_switch (int, int);
352static const char *handle_braces (const char *);
353static inline bool input_suffix_matches (const char *, const char *);
354static inline bool switch_matches (const char *, const char *, int);
355static inline void mark_matching_switches (const char *, const char *, int);
356static inline void process_marked_switches (void);
357static const char *process_brace_body (const char *, const char *, const char *, int, int);
358static const struct spec_function *lookup_spec_function (const char *);
359static const char *eval_spec_function (const char *, const char *, const char *);
360static const char *handle_spec_function (const char *, bool *, const char *);
361static char *save_string (const char *, int);
362static void set_collect_gcc_options (void);
363static int do_spec_1 (const char *, int, const char *);
364static int do_spec_2 (const char *, const char *);
365static void do_option_spec (const char *, const char *);
366static void do_self_spec (const char *);
367static const char *find_file (const char *);
368static int is_directory (const char *, bool);
369static const char *validate_switches (const char *, bool);
370static void validate_all_switches (void);
371static inline void validate_switches_from_spec (const char *, bool);
372static void give_switch (int, int);
373static int default_arg (const char *, int);
374static void set_multilib_dir (void);
375static void print_multilib_info (void);
376static void display_help (void);
377static void add_preprocessor_option (const char *, int);
378static void add_assembler_option (const char *, int);
379static void add_linker_option (const char *, int);
380static void process_command (unsigned int, struct cl_decoded_option *);
381static int execute (void);
382static void alloc_args (void);
383static void clear_args (void);
384static void fatal_signal (int);
385#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
386static void init_gcc_specs (struct obstack *, const char *, const char *,
387			    const char *);
388#endif
389#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
390static const char *convert_filename (const char *, int, int);
391#endif
392
393static void try_generate_repro (const char **argv);
394static const char *getenv_spec_function (int, const char **);
395static const char *if_exists_spec_function (int, const char **);
396static const char *if_exists_else_spec_function (int, const char **);
397static const char *sanitize_spec_function (int, const char **);
398static const char *replace_outfile_spec_function (int, const char **);
399static const char *remove_outfile_spec_function (int, const char **);
400static const char *version_compare_spec_function (int, const char **);
401static const char *include_spec_function (int, const char **);
402static const char *find_file_spec_function (int, const char **);
403static const char *find_plugindir_spec_function (int, const char **);
404static const char *print_asm_header_spec_function (int, const char **);
405static const char *compare_debug_dump_opt_spec_function (int, const char **);
406static const char *compare_debug_self_opt_spec_function (int, const char **);
407static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
408static const char *pass_through_libs_spec_func (int, const char **);
409static const char *replace_extension_spec_func (int, const char **);
410static const char *greater_than_spec_func (int, const char **);
411static const char *debug_level_greater_than_spec_func (int, const char **);
412static const char *find_fortran_preinclude_file (int, const char **);
413static char *convert_white_space (char *);
414
415/* The Specs Language
416
417Specs are strings containing lines, each of which (if not blank)
418is made up of a program name, and arguments separated by spaces.
419The program name must be exact and start from root, since no path
420is searched and it is unreliable to depend on the current working directory.
421Redirection of input or output is not supported; the subprograms must
422accept filenames saying what files to read and write.
423
424In addition, the specs can contain %-sequences to substitute variable text
425or for conditional text.  Here is a table of all defined %-sequences.
426Note that spaces are not generated automatically around the results of
427expanding these sequences; therefore, you can concatenate them together
428or with constant text in a single argument.
429
430 %%	substitute one % into the program name or argument.
431 %i     substitute the name of the input file being processed.
432 %b     substitute the basename of the input file being processed.
433	This is the substring up to (and not including) the last period
434	and not including the directory unless -save-temps was specified
435	to put temporaries in a different location.
436 %B	same as %b, but include the file suffix (text after the last period).
437 %gSUFFIX
438	substitute a file name that has suffix SUFFIX and is chosen
439	once per compilation, and mark the argument a la %d.  To reduce
440	exposure to denial-of-service attacks, the file name is now
441	chosen in a way that is hard to predict even when previously
442	chosen file names are known.  For example, `%g.s ... %g.o ... %g.s'
443	might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'.  SUFFIX matches
444	the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
445	had been pre-processed.  Previously, %g was simply substituted
446	with a file name chosen once per compilation, without regard
447	to any appended suffix (which was therefore treated just like
448	ordinary text), making such attacks more likely to succeed.
449 %|SUFFIX
450	like %g, but if -pipe is in effect, expands simply to "-".
451 %mSUFFIX
452        like %g, but if -pipe is in effect, expands to nothing.  (We have both
453	%| and %m to accommodate differences between system assemblers; see
454	the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
455 %uSUFFIX
456	like %g, but generates a new temporary file name even if %uSUFFIX
457	was already seen.
458 %USUFFIX
459	substitutes the last file name generated with %uSUFFIX, generating a
460	new one if there is no such last file name.  In the absence of any
461	%uSUFFIX, this is just like %gSUFFIX, except they don't share
462	the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
463	would involve the generation of two distinct file names, one
464	for each `%g.s' and another for each `%U.s'.  Previously, %U was
465	simply substituted with a file name chosen for the previous %u,
466	without regard to any appended suffix.
467 %jSUFFIX
468        substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
469        writable, and if save-temps is off; otherwise, substitute the name
470        of a temporary file, just like %u.  This temporary file is not
471        meant for communication between processes, but rather as a junk
472        disposal mechanism.
473 %.SUFFIX
474        substitutes .SUFFIX for the suffixes of a matched switch's args when
475        it is subsequently output with %*. SUFFIX is terminated by the next
476        space or %.
477 %d	marks the argument containing or following the %d as a
478	temporary file name, so that file will be deleted if GCC exits
479	successfully.  Unlike %g, this contributes no text to the argument.
480 %w	marks the argument containing or following the %w as the
481	"output file" of this compilation.  This puts the argument
482	into the sequence of arguments that %o will substitute later.
483 %V	indicates that this compilation produces no "output file".
484 %W{...}
485	like %{...} but marks the last argument supplied within as a file
486	to be deleted on failure.
487 %@{...}
488	like %{...} but puts the result into a FILE and substitutes @FILE
489	if an @file argument has been supplied.
490 %o	substitutes the names of all the output files, with spaces
491	automatically placed around them.  You should write spaces
492	around the %o as well or the results are undefined.
493	%o is for use in the specs for running the linker.
494	Input files whose names have no recognized suffix are not compiled
495	at all, but they are included among the output files, so they will
496	be linked.
497 %O	substitutes the suffix for object files.  Note that this is
498        handled specially when it immediately follows %g, %u, or %U
499	(with or without a suffix argument) because of the need for
500	those to form complete file names.  The handling is such that
501	%O is treated exactly as if it had already been substituted,
502	except that %g, %u, and %U do not currently support additional
503	SUFFIX characters following %O as they would following, for
504	example, `.o'.
505 %I	Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
506	(made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
507	and -B options) and -imultilib as necessary.
508 %s     current argument is the name of a library or startup file of some sort.
509        Search for that file in a standard list of directories
510	and substitute the full name found.
511 %eSTR  Print STR as an error message.  STR is terminated by a newline.
512        Use this when inconsistent options are detected.
513 %nSTR  Print STR as a notice.  STR is terminated by a newline.
514 %x{OPTION}	Accumulate an option for %X.
515 %X	Output the accumulated linker options specified by compilations.
516 %Y	Output the accumulated assembler options specified by compilations.
517 %Z	Output the accumulated preprocessor options specified by compilations.
518 %a     process ASM_SPEC as a spec.
519        This allows config.h to specify part of the spec for running as.
520 %A	process ASM_FINAL_SPEC as a spec.  A capital A is actually
521	used here.  This can be used to run a post-processor after the
522	assembler has done its job.
523 %D	Dump out a -L option for each directory in startfile_prefixes.
524	If multilib_dir is set, extra entries are generated with it affixed.
525 %l     process LINK_SPEC as a spec.
526 %L     process LIB_SPEC as a spec.
527 %M     Output multilib_os_dir.
528 %G     process LIBGCC_SPEC as a spec.
529 %R     Output the concatenation of target_system_root and
530        target_sysroot_suffix.
531 %S     process STARTFILE_SPEC as a spec.  A capital S is actually used here.
532 %E     process ENDFILE_SPEC as a spec.  A capital E is actually used here.
533 %C     process CPP_SPEC as a spec.
534 %1	process CC1_SPEC as a spec.
535 %2	process CC1PLUS_SPEC as a spec.
536 %*	substitute the variable part of a matched option.  (See below.)
537	Note that each comma in the substituted string is replaced by
538	a single space.  A space is appended after the last substition
539	unless there is more text in current sequence.
540 %<S    remove all occurrences of -S from the command line.
541        Note - this command is position dependent.  % commands in the
542        spec string before this one will see -S, % commands in the
543        spec string after this one will not.
544 %>S	Similar to "%<S", but keep it in the GCC command line.
545 %<S*	remove all occurrences of all switches beginning with -S from the
546        command line.
547 %:function(args)
548	Call the named function FUNCTION, passing it ARGS.  ARGS is
549	first processed as a nested spec string, then split into an
550	argument vector in the usual fashion.  The function returns
551	a string which is processed as if it had appeared literally
552	as part of the current spec.
553 %{S}   substitutes the -S switch, if that switch was given to GCC.
554	If that switch was not specified, this substitutes nothing.
555	Here S is a metasyntactic variable.
556 %{S*}  substitutes all the switches specified to GCC whose names start
557	with -S.  This is used for -o, -I, etc; switches that take
558	arguments.  GCC considers `-o foo' as being one switch whose
559	name starts with `o'.  %{o*} would substitute this text,
560	including the space; thus, two arguments would be generated.
561 %{S*&T*} likewise, but preserve order of S and T options (the order
562	of S and T in the spec is not significant).  Can be any number
563	of ampersand-separated variables; for each the wild card is
564	optional.  Useful for CPP as %{D*&U*&A*}.
565
566 %{S:X}   substitutes X, if the -S switch was given to GCC.
567 %{!S:X}  substitutes X, if the -S switch was NOT given to GCC.
568 %{S*:X}  substitutes X if one or more switches whose names start
569          with -S was given to GCC.  Normally X is substituted only
570          once, no matter how many such switches appeared.  However,
571          if %* appears somewhere in X, then X will be substituted
572          once for each matching switch, with the %* replaced by the
573          part of that switch that matched the '*'.  A space will be
574	  appended after the last substition unless there is more
575	  text in current sequence.
576 %{.S:X}  substitutes X, if processing a file with suffix S.
577 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
578 %{,S:X}  substitutes X, if processing a file which will use spec S.
579 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
580
581 %{S|T:X} substitutes X if either -S or -T was given to GCC.  This may be
582	  combined with '!', '.', ',', and '*' as above binding stronger
583	  than the OR.
584	  If %* appears in X, all of the alternatives must be starred, and
585	  only the first matching alternative is substituted.
586 %{%:function(args):X}
587	  Call function named FUNCTION with args ARGS.  If the function
588	  returns non-NULL, then X is substituted, if it returns
589	  NULL, it isn't substituted.
590 %{S:X;   if S was given to GCC, substitutes X;
591   T:Y;   else if T was given to GCC, substitutes Y;
592    :D}   else substitutes D.  There can be as many clauses as you need.
593          This may be combined with '.', '!', ',', '|', and '*' as above.
594
595 %(Spec) processes a specification defined in a specs file as *Spec:
596
597The switch matching text S in a %{S}, %{S:X}, or similar construct can use
598a backslash to ignore the special meaning of the character following it,
599thus allowing literal matching of a character that is otherwise specially
600treated.  For example, %{std=iso9899\:1999:X} substitutes X if the
601-std=iso9899:1999 option is given.
602
603The conditional text X in a %{S:X} or similar construct may contain
604other nested % constructs or spaces, or even newlines.  They are
605processed as usual, as described above.  Trailing white space in X is
606ignored.  White space may also appear anywhere on the left side of the
607colon in these constructs, except between . or * and the corresponding
608word.
609
610The -O, -f, -g, -m, and -W switches are handled specifically in these
611constructs.  If another value of -O or the negated form of a -f, -m, or
612-W switch is found later in the command line, the earlier switch
613value is ignored, except with {S*} where S is just one letter; this
614passes all matching options.
615
616The character | at the beginning of the predicate text is used to indicate
617that a command should be piped to the following command, but only if -pipe
618is specified.
619
620Note that it is built into GCC which switches take arguments and which
621do not.  You might think it would be useful to generalize this to
622allow each compiler's spec to say which switches take arguments.  But
623this cannot be done in a consistent fashion.  GCC cannot even decide
624which input files have been specified without knowing which switches
625take arguments, and it must know which input files to compile in order
626to tell which compilers to run.
627
628GCC also knows implicitly that arguments starting in `-l' are to be
629treated as compiler output files, and passed to the linker in their
630proper position among the other output files.  */
631
632/* Define the macros used for specs %a, %l, %L, %S, %C, %1.  */
633
634/* config.h can define ASM_SPEC to provide extra args to the assembler
635   or extra switch-translations.  */
636#ifndef ASM_SPEC
637#define ASM_SPEC ""
638#endif
639
640/* config.h can define ASM_FINAL_SPEC to run a post processor after
641   the assembler has run.  */
642#ifndef ASM_FINAL_SPEC
643#define ASM_FINAL_SPEC \
644  "%{gsplit-dwarf: \n\
645       objcopy --extract-dwo \
646	 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
647	 %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo} \n\
648       objcopy --strip-dwo \
649	 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
650    }"
651#endif
652
653/* config.h can define CPP_SPEC to provide extra args to the C preprocessor
654   or extra switch-translations.  */
655#ifndef CPP_SPEC
656#define CPP_SPEC ""
657#endif
658
659/* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
660   or extra switch-translations.  */
661#ifndef CC1_SPEC
662#define CC1_SPEC ""
663#endif
664
665/* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
666   or extra switch-translations.  */
667#ifndef CC1PLUS_SPEC
668#define CC1PLUS_SPEC ""
669#endif
670
671/* config.h can define LINK_SPEC to provide extra args to the linker
672   or extra switch-translations.  */
673#ifndef LINK_SPEC
674#define LINK_SPEC ""
675#endif
676
677/* config.h can define LIB_SPEC to override the default libraries.  */
678#ifndef LIB_SPEC
679#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
680#endif
681
682/* When using -fsplit-stack we need to wrap pthread_create, in order
683   to initialize the stack guard.  We always use wrapping, rather than
684   shared library ordering, and we keep the wrapper function in
685   libgcc.  This is not yet a real spec, though it could become one;
686   it is currently just stuffed into LINK_SPEC.  FIXME: This wrapping
687   only works with GNU ld and gold.  */
688#ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
689#define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
690#else
691#define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
692#endif
693
694#ifndef LIBASAN_SPEC
695#define STATIC_LIBASAN_LIBS \
696  " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
697#ifdef LIBASAN_EARLY_SPEC
698#define LIBASAN_SPEC STATIC_LIBASAN_LIBS
699#elif defined(HAVE_LD_STATIC_DYNAMIC)
700#define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
701		     "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
702		     STATIC_LIBASAN_LIBS
703#else
704#define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
705#endif
706#endif
707
708#ifndef LIBASAN_EARLY_SPEC
709#define LIBASAN_EARLY_SPEC ""
710#endif
711
712#ifndef LIBTSAN_SPEC
713#define STATIC_LIBTSAN_LIBS \
714  " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
715#ifdef LIBTSAN_EARLY_SPEC
716#define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
717#elif defined(HAVE_LD_STATIC_DYNAMIC)
718#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
719		     "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
720		     STATIC_LIBTSAN_LIBS
721#else
722#define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
723#endif
724#endif
725
726#ifndef LIBTSAN_EARLY_SPEC
727#define LIBTSAN_EARLY_SPEC ""
728#endif
729
730#ifndef LIBLSAN_SPEC
731#define STATIC_LIBLSAN_LIBS \
732  " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
733#ifdef LIBLSAN_EARLY_SPEC
734#define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
735#elif defined(HAVE_LD_STATIC_DYNAMIC)
736#define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
737		     "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
738		     STATIC_LIBLSAN_LIBS
739#else
740#define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
741#endif
742#endif
743
744#ifndef LIBLSAN_EARLY_SPEC
745#define LIBLSAN_EARLY_SPEC ""
746#endif
747
748#ifndef LIBUBSAN_SPEC
749#define STATIC_LIBUBSAN_LIBS \
750  " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
751#ifdef HAVE_LD_STATIC_DYNAMIC
752#define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
753		     "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
754		     STATIC_LIBUBSAN_LIBS
755#else
756#define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
757#endif
758#endif
759
760/* Linker options for compressed debug sections.  */
761#if HAVE_LD_COMPRESS_DEBUG == 0
762/* No linker support.  */
763#define LINK_COMPRESS_DEBUG_SPEC \
764	" %{gz*:%e-gz is not supported in this configuration} "
765#elif HAVE_LD_COMPRESS_DEBUG == 1
766/* GNU style on input, GNU ld options.  Reject, not useful.  */
767#define LINK_COMPRESS_DEBUG_SPEC \
768	" %{gz*:%e-gz is not supported in this configuration} "
769#elif HAVE_LD_COMPRESS_DEBUG == 2
770/* GNU style, GNU gold options.  */
771#define LINK_COMPRESS_DEBUG_SPEC \
772	" %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
773	" %{gz=none:"        LD_COMPRESS_DEBUG_OPTION "=none}" \
774	" %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
775#elif HAVE_LD_COMPRESS_DEBUG == 3
776/* ELF gABI style.  */
777#define LINK_COMPRESS_DEBUG_SPEC \
778	" %{gz|gz=zlib:"  LD_COMPRESS_DEBUG_OPTION "=zlib}" \
779	" %{gz=none:"	  LD_COMPRESS_DEBUG_OPTION "=none}" \
780	" %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
781#else
782#error Unknown value for HAVE_LD_COMPRESS_DEBUG.
783#endif
784
785/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
786   included.  */
787#ifndef LIBGCC_SPEC
788#if defined(REAL_LIBGCC_SPEC)
789#define LIBGCC_SPEC REAL_LIBGCC_SPEC
790#elif defined(LINK_LIBGCC_SPECIAL_1)
791/* Have gcc do the search for libgcc.a.  */
792#define LIBGCC_SPEC "libgcc.a%s"
793#else
794#define LIBGCC_SPEC "-lgcc"
795#endif
796#endif
797
798/* config.h can define STARTFILE_SPEC to override the default crt0 files.  */
799#ifndef STARTFILE_SPEC
800#define STARTFILE_SPEC  \
801  "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
802#endif
803
804/* config.h can define ENDFILE_SPEC to override the default crtn files.  */
805#ifndef ENDFILE_SPEC
806#define ENDFILE_SPEC ""
807#endif
808
809#ifndef LINKER_NAME
810#define LINKER_NAME "collect2"
811#endif
812
813#ifdef HAVE_AS_DEBUG_PREFIX_MAP
814#define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
815#else
816#define ASM_MAP ""
817#endif
818
819/* Assembler options for compressed debug sections.  */
820#if HAVE_LD_COMPRESS_DEBUG < 2
821/* Reject if the linker cannot write compressed debug sections.  */
822#define ASM_COMPRESS_DEBUG_SPEC \
823	" %{gz*:%e-gz is not supported in this configuration} "
824#else /* HAVE_LD_COMPRESS_DEBUG >= 2 */
825#if HAVE_AS_COMPRESS_DEBUG == 0
826/* No assembler support.  Ignore silently.  */
827#define ASM_COMPRESS_DEBUG_SPEC \
828	" %{gz*:} "
829#elif HAVE_AS_COMPRESS_DEBUG == 1
830/* GNU style, GNU as options.  */
831#define ASM_COMPRESS_DEBUG_SPEC \
832	" %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "}" \
833	" %{gz=none:"        AS_NO_COMPRESS_DEBUG_OPTION "}" \
834	" %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
835#elif HAVE_AS_COMPRESS_DEBUG == 2
836/* ELF gABI style.  */
837#define ASM_COMPRESS_DEBUG_SPEC \
838	" %{gz|gz=zlib:"  AS_COMPRESS_DEBUG_OPTION "=zlib}" \
839	" %{gz=none:"	  AS_COMPRESS_DEBUG_OPTION "=none}" \
840	" %{gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
841#else
842#error Unknown value for HAVE_AS_COMPRESS_DEBUG.
843#endif
844#endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */
845
846/* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
847   to the assembler.  */
848#ifndef ASM_DEBUG_SPEC
849# if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
850     && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
851#  define ASM_DEBUG_SPEC						\
852      (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG				\
853       ? "%{%:debug-level-gt(0):"					\
854	 "%{gdwarf*:--gdwarf2}%{!gdwarf*:%{g*:--gstabs}}}" ASM_MAP	\
855       : "%{%:debug-level-gt(0):"					\
856	 "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
857# else
858#  if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
859#   define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):--gstabs}}" ASM_MAP
860#  endif
861#  if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
862#   define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):--gdwarf2}}" ASM_MAP
863#  endif
864# endif
865#endif
866#ifndef ASM_DEBUG_SPEC
867# define ASM_DEBUG_SPEC ""
868#endif
869
870/* Here is the spec for running the linker, after compiling all files.  */
871
872/* This is overridable by the target in case they need to specify the
873   -lgcc and -lc order specially, yet not require them to override all
874   of LINK_COMMAND_SPEC.  */
875#ifndef LINK_GCC_C_SEQUENCE_SPEC
876#define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
877#endif
878
879#ifndef LINK_SSP_SPEC
880#ifdef TARGET_LIBC_PROVIDES_SSP
881#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
882		       "|fstack-protector-strong|fstack-protector-explicit:}"
883#else
884#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
885		       "|fstack-protector-strong|fstack-protector-explicit" \
886		       ":-lssp_nonshared -lssp}"
887#endif
888#endif
889
890#ifdef ENABLE_DEFAULT_PIE
891#define PIE_SPEC		"!no-pie"
892#define NO_FPIE1_SPEC		"fno-pie"
893#define FPIE1_SPEC		NO_FPIE1_SPEC ":;"
894#define NO_FPIE2_SPEC		"fno-PIE"
895#define FPIE2_SPEC		NO_FPIE2_SPEC ":;"
896#define NO_FPIE_SPEC		NO_FPIE1_SPEC "|" NO_FPIE2_SPEC
897#define FPIE_SPEC		NO_FPIE_SPEC ":;"
898#define NO_FPIC1_SPEC		"fno-pic"
899#define FPIC1_SPEC		NO_FPIC1_SPEC ":;"
900#define NO_FPIC2_SPEC		"fno-PIC"
901#define FPIC2_SPEC		NO_FPIC2_SPEC ":;"
902#define NO_FPIC_SPEC		NO_FPIC1_SPEC "|" NO_FPIC2_SPEC
903#define FPIC_SPEC		NO_FPIC_SPEC ":;"
904#define NO_FPIE1_AND_FPIC1_SPEC	NO_FPIE1_SPEC "|" NO_FPIC1_SPEC
905#define FPIE1_OR_FPIC1_SPEC	NO_FPIE1_AND_FPIC1_SPEC ":;"
906#define NO_FPIE2_AND_FPIC2_SPEC	NO_FPIE2_SPEC "|" NO_FPIC2_SPEC
907#define FPIE2_OR_FPIC2_SPEC	NO_FPIE2_AND_FPIC2_SPEC ":;"
908#define NO_FPIE_AND_FPIC_SPEC	NO_FPIE_SPEC "|" NO_FPIC_SPEC
909#define FPIE_OR_FPIC_SPEC	NO_FPIE_AND_FPIC_SPEC ":;"
910#else
911#define PIE_SPEC		"pie"
912#define FPIE1_SPEC		"fpie"
913#define NO_FPIE1_SPEC		FPIE1_SPEC ":;"
914#define FPIE2_SPEC		"fPIE"
915#define NO_FPIE2_SPEC		FPIE2_SPEC ":;"
916#define FPIE_SPEC		FPIE1_SPEC "|" FPIE2_SPEC
917#define NO_FPIE_SPEC		FPIE_SPEC ":;"
918#define FPIC1_SPEC		"fpic"
919#define NO_FPIC1_SPEC		FPIC1_SPEC ":;"
920#define FPIC2_SPEC		"fPIC"
921#define NO_FPIC2_SPEC		FPIC2_SPEC ":;"
922#define FPIC_SPEC		FPIC1_SPEC "|" FPIC2_SPEC
923#define NO_FPIC_SPEC		FPIC_SPEC ":;"
924#define FPIE1_OR_FPIC1_SPEC	FPIE1_SPEC "|" FPIC1_SPEC
925#define NO_FPIE1_AND_FPIC1_SPEC	FPIE1_OR_FPIC1_SPEC ":;"
926#define FPIE2_OR_FPIC2_SPEC	FPIE2_SPEC "|" FPIC2_SPEC
927#define NO_FPIE2_AND_FPIC2_SPEC	FPIE1_OR_FPIC2_SPEC ":;"
928#define FPIE_OR_FPIC_SPEC	FPIE_SPEC "|" FPIC_SPEC
929#define NO_FPIE_AND_FPIC_SPEC	FPIE_OR_FPIC_SPEC ":;"
930#endif
931
932#ifndef LINK_PIE_SPEC
933#ifdef HAVE_LD_PIE
934#ifndef LD_PIE_SPEC
935#define LD_PIE_SPEC "-pie"
936#endif
937#else
938#define LD_PIE_SPEC ""
939#endif
940#define LINK_PIE_SPEC "%{static|shared|r:;" PIE_SPEC ":" LD_PIE_SPEC "} "
941#endif
942
943#ifndef LINK_BUILDID_SPEC
944# if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
945#  define LINK_BUILDID_SPEC "%{!r:--build-id} "
946# endif
947#endif
948
949/* Conditional to test whether the LTO plugin is used or not.
950   FIXME: For slim LTO we will need to enable plugin unconditionally.  This
951   still cause problems with PLUGIN_LD != LD and when plugin is built but
952   not useable.  For GCC 4.6 we don't support slim LTO and thus we can enable
953   plugin only when LTO is enabled.  We still honor explicit
954   -fuse-linker-plugin if the linker used understands -plugin.  */
955
956/* The linker has some plugin support.  */
957#if HAVE_LTO_PLUGIN > 0
958/* The linker used has full plugin support, use LTO plugin by default.  */
959#if HAVE_LTO_PLUGIN == 2
960#define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
961#define PLUGIN_COND_CLOSE "}"
962#else
963/* The linker used has limited plugin support, use LTO plugin with explicit
964   -fuse-linker-plugin.  */
965#define PLUGIN_COND "fuse-linker-plugin"
966#define PLUGIN_COND_CLOSE ""
967#endif
968#define LINK_PLUGIN_SPEC \
969    "%{" PLUGIN_COND": \
970    -plugin %(linker_plugin_file) \
971    -plugin-opt=%(lto_wrapper) \
972    -plugin-opt=-fresolution=%u.res \
973    %{flinker-output=*:-plugin-opt=-linker-output-known} \
974    %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
975    }" PLUGIN_COND_CLOSE
976#else
977/* The linker used doesn't support -plugin, reject -fuse-linker-plugin.  */
978#define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
979    %e-fuse-linker-plugin is not supported in this configuration}"
980#endif
981
982/* Linker command line options for -fsanitize= early on the command line.  */
983#ifndef SANITIZER_EARLY_SPEC
984#define SANITIZER_EARLY_SPEC "\
985%{!shared:%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
986    %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
987    %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}}"
988#endif
989
990/* Linker command line options for -fsanitize= late on the command line.  */
991#ifndef SANITIZER_SPEC
992#define SANITIZER_SPEC "\
993%{!shared:%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
994    %{static:%ecannot specify -static with -fsanitize=address}}\
995    %{%:sanitize(thread):" LIBTSAN_SPEC "\
996    %{static:%ecannot specify -static with -fsanitize=thread}}\
997    %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
998    %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}}"
999#endif
1000
1001#ifndef POST_LINK_SPEC
1002#define POST_LINK_SPEC ""
1003#endif
1004
1005/*  This is the spec to use, once the code for creating the vtable
1006    verification runtime library, libvtv.so, has been created.  Currently
1007    the vtable verification runtime functions are in libstdc++, so we use
1008    the spec just below this one.  */
1009#ifndef VTABLE_VERIFICATION_SPEC
1010#if ENABLE_VTABLE_VERIFY
1011#define VTABLE_VERIFICATION_SPEC "\
1012%{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1013    %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1014#else
1015#define VTABLE_VERIFICATION_SPEC "\
1016%{fvtable-verify=none:} \
1017%{fvtable-verify=std: \
1018  %e-fvtable-verify=std is not supported in this configuration} \
1019%{fvtable-verify=preinit: \
1020  %e-fvtable-verify=preinit is not supported in this configuration}"
1021#endif
1022#endif
1023
1024/* -u* was put back because both BSD and SysV seem to support it.  */
1025/* %{static|no-pie|static-pie:} simply prevents an error message:
1026   1. If the target machine doesn't handle -static.
1027   2. If PIE isn't enabled by default.
1028   3. If the target machine doesn't handle -static-pie.
1029 */
1030/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1031   scripts which exist in user specified directories, or in standard
1032   directories.  */
1033/* We pass any -flto flags on to the linker, which is expected
1034   to understand them.  In practice, this means it had better be collect2.  */
1035/* %{e*} includes -export-dynamic; see comment in common.opt.  */
1036#ifndef LINK_COMMAND_SPEC
1037#define LINK_COMMAND_SPEC "\
1038%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1039    %(linker) " \
1040    LINK_PLUGIN_SPEC \
1041   "%{flto|flto=*:%<fcompare-debug*} \
1042    %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
1043   "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
1044   "%X %{o*} %{e*} %{N} %{n} %{r}\
1045    %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1046    %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
1047    VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
1048    %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1049	%:include(libgomp.spec)%(link_gomp)}\
1050    %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1051    %(mflib) " STACK_SPLIT_SPEC "\
1052    %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
1053    %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1054    %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*}  \n%(post_link) }}}}}}"
1055#endif
1056
1057#ifndef LINK_LIBGCC_SPEC
1058/* Generate -L options for startfile prefix list.  */
1059# define LINK_LIBGCC_SPEC "%D"
1060#endif
1061
1062#ifndef STARTFILE_PREFIX_SPEC
1063# define STARTFILE_PREFIX_SPEC ""
1064#endif
1065
1066#ifndef SYSROOT_SPEC
1067# define SYSROOT_SPEC "--sysroot=%R"
1068#endif
1069
1070#ifndef SYSROOT_SUFFIX_SPEC
1071# define SYSROOT_SUFFIX_SPEC ""
1072#endif
1073
1074#ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1075# define SYSROOT_HEADERS_SUFFIX_SPEC ""
1076#endif
1077
1078static const char *asm_debug = ASM_DEBUG_SPEC;
1079static const char *cpp_spec = CPP_SPEC;
1080static const char *cc1_spec = CC1_SPEC;
1081static const char *cc1plus_spec = CC1PLUS_SPEC;
1082static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
1083static const char *link_ssp_spec = LINK_SSP_SPEC;
1084static const char *asm_spec = ASM_SPEC;
1085static const char *asm_final_spec = ASM_FINAL_SPEC;
1086static const char *link_spec = LINK_SPEC;
1087static const char *lib_spec = LIB_SPEC;
1088static const char *link_gomp_spec = "";
1089static const char *libgcc_spec = LIBGCC_SPEC;
1090static const char *endfile_spec = ENDFILE_SPEC;
1091static const char *startfile_spec = STARTFILE_SPEC;
1092static const char *linker_name_spec = LINKER_NAME;
1093static const char *linker_plugin_file_spec = "";
1094static const char *lto_wrapper_spec = "";
1095static const char *lto_gcc_spec = "";
1096static const char *post_link_spec = POST_LINK_SPEC;
1097static const char *link_command_spec = LINK_COMMAND_SPEC;
1098static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
1099static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
1100static const char *sysroot_spec = SYSROOT_SPEC;
1101static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
1102static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
1103static const char *self_spec = "";
1104
1105/* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1106   There should be no need to override these in target dependent files,
1107   but we need to copy them to the specs file so that newer versions
1108   of the GCC driver can correctly drive older tool chains with the
1109   appropriate -B options.  */
1110
1111/* When cpplib handles traditional preprocessing, get rid of this, and
1112   call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1113   that we default the front end language better.  */
1114static const char *trad_capable_cpp =
1115"cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1116
1117/* We don't wrap .d files in %W{} since a missing .d file, and
1118   therefore no dependency entry, confuses make into thinking a .o
1119   file that happens to exist is up-to-date.  */
1120static const char *cpp_unique_options =
1121"%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1122 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1123 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1124 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1125 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1126 %{remap} %{g3|ggdb3|gstabs3|gxcoff3|gvms3:-dD}\
1127 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1128 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1129 %{E|M|MM:%W{o*}}";
1130
1131/* This contains cpp options which are common with cc1_options and are passed
1132   only when preprocessing only to avoid duplication.  We pass the cc1 spec
1133   options to the preprocessor so that it the cc1 spec may manipulate
1134   options used to set target flags.  Those special target flags settings may
1135   in turn cause preprocessor symbols to be defined specially.  */
1136static const char *cpp_options =
1137"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1138 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1139 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1140 %{undef} %{save-temps*:-fpch-preprocess}";
1141
1142/* This contains cpp options which are not passed when the preprocessor
1143   output will be used by another program.  */
1144static const char *cpp_debug_options = "%{d*}";
1145
1146/* NB: This is shared amongst all front-ends, except for Ada.  */
1147static const char *cc1_options =
1148"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1149 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1150 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
1151 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
1152 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
1153 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1154 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1155 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1156 %{-target-help:--target-help}\
1157 %{-version:--version}\
1158 %{-help=*:--help=%*}\
1159 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
1160 %{fsyntax-only:-o %j} %{-param*}\
1161 %{coverage:-fprofile-arcs -ftest-coverage}\
1162 %{fprofile-arcs|fprofile-generate*|coverage:\
1163   %{!fprofile-update=single:\
1164     %{pthread:-fprofile-update=prefer-atomic}}}";
1165
1166static const char *asm_options =
1167"%{-target-help:%:print-asm-header()} "
1168#if HAVE_GNU_AS
1169/* If GNU AS is used, then convert -w (no warnings), -I, and -v
1170   to the assembler equivalents.  */
1171"%{v} %{w:-W} %{I*} "
1172#endif
1173ASM_COMPRESS_DEBUG_SPEC
1174"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1175
1176static const char *invoke_as =
1177#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1178"%{!fwpa*:\
1179   %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1180   %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1181  }";
1182#else
1183"%{!fwpa*:\
1184   %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1185   %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1186  }";
1187#endif
1188
1189/* Some compilers have limits on line lengths, and the multilib_select
1190   and/or multilib_matches strings can be very long, so we build them at
1191   run time.  */
1192static struct obstack multilib_obstack;
1193static const char *multilib_select;
1194static const char *multilib_matches;
1195static const char *multilib_defaults;
1196static const char *multilib_exclusions;
1197static const char *multilib_reuse;
1198
1199/* Check whether a particular argument is a default argument.  */
1200
1201#ifndef MULTILIB_DEFAULTS
1202#define MULTILIB_DEFAULTS { "" }
1203#endif
1204
1205static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
1206
1207#ifndef DRIVER_SELF_SPECS
1208#define DRIVER_SELF_SPECS ""
1209#endif
1210
1211/* Linking to libgomp implies pthreads.  This is particularly important
1212   for targets that use different start files and suchlike.  */
1213#ifndef GOMP_SELF_SPECS
1214#define GOMP_SELF_SPECS \
1215  "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1216  "-pthread}"
1217#endif
1218
1219/* Likewise for -fgnu-tm.  */
1220#ifndef GTM_SELF_SPECS
1221#define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1222#endif
1223
1224static const char *const driver_self_specs[] = {
1225  "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1226  DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS
1227};
1228
1229#ifndef OPTION_DEFAULT_SPECS
1230#define OPTION_DEFAULT_SPECS { "", "" }
1231#endif
1232
1233struct default_spec
1234{
1235  const char *name;
1236  const char *spec;
1237};
1238
1239static const struct default_spec
1240  option_default_specs[] = { OPTION_DEFAULT_SPECS };
1241
1242struct user_specs
1243{
1244  struct user_specs *next;
1245  const char *filename;
1246};
1247
1248static struct user_specs *user_specs_head, *user_specs_tail;
1249
1250
1251/* Record the mapping from file suffixes for compilation specs.  */
1252
1253struct compiler
1254{
1255  const char *suffix;		/* Use this compiler for input files
1256				   whose names end in this suffix.  */
1257
1258  const char *spec;		/* To use this compiler, run this spec.  */
1259
1260  const char *cpp_spec;         /* If non-NULL, substitute this spec
1261				   for `%C', rather than the usual
1262				   cpp_spec.  */
1263  int combinable;               /* If nonzero, compiler can deal with
1264				    multiple source files at once (IMA).  */
1265  int needs_preprocessing;       /* If nonzero, source files need to
1266				    be run through a preprocessor.  */
1267};
1268
1269/* Pointer to a vector of `struct compiler' that gives the spec for
1270   compiling a file, based on its suffix.
1271   A file that does not end in any of these suffixes will be passed
1272   unchanged to the loader and nothing else will be done to it.
1273
1274   An entry containing two 0s is used to terminate the vector.
1275
1276   If multiple entries match a file, the last matching one is used.  */
1277
1278static struct compiler *compilers;
1279
1280/* Number of entries in `compilers', not counting the null terminator.  */
1281
1282static int n_compilers;
1283
1284/* The default list of file name suffixes and their compilation specs.  */
1285
1286static const struct compiler default_compilers[] =
1287{
1288  /* Add lists of suffixes of known languages here.  If those languages
1289     were not present when we built the driver, we will hit these copies
1290     and be given a more meaningful error than "file not used since
1291     linking is not done".  */
1292  {".m",  "#Objective-C", 0, 0, 0}, {".mi",  "#Objective-C", 0, 0, 0},
1293  {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1294  {".mii", "#Objective-C++", 0, 0, 0},
1295  {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1296  {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1297  {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1298  {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1299  {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1300  {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1301  {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1302  {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1303  {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1304  {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1305  {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1306  {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1307  {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1308  {".r", "#Ratfor", 0, 0, 0},
1309  {".go", "#Go", 0, 1, 0},
1310  {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1311  /* Next come the entries for C.  */
1312  {".c", "@c", 0, 0, 1},
1313  {"@c",
1314   /* cc1 has an integrated ISO C preprocessor.  We should invoke the
1315      external preprocessor if -save-temps is given.  */
1316     "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1317      %{!E:%{!M:%{!MM:\
1318          %{traditional:\
1319%eGNU C no longer supports -traditional without -E}\
1320      %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1321	  %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1322	    cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1323	  %(cc1_options)}\
1324      %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1325	  cc1 %(cpp_unique_options) %(cc1_options)}}}\
1326      %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1327  {"-",
1328   "%{!E:%e-E or -x required when input is from standard input}\
1329    %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1330  {".h", "@c-header", 0, 0, 0},
1331  {"@c-header",
1332   /* cc1 has an integrated ISO C preprocessor.  We should invoke the
1333      external preprocessor if -save-temps is given.  */
1334     "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1335      %{!E:%{!M:%{!MM:\
1336	  %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1337		%(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1338		    cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1339			%(cc1_options)\
1340			%{!fsyntax-only:%{!S:-o %g.s} \
1341			    %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1342					       %W{o*:--output-pch=%*}}%V}}\
1343	  %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1344		cc1 %(cpp_unique_options) %(cc1_options)\
1345		    %{!fsyntax-only:%{!S:-o %g.s} \
1346		        %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1347					   %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
1348  {".i", "@cpp-output", 0, 0, 0},
1349  {"@cpp-output",
1350   "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1351  {".s", "@assembler", 0, 0, 0},
1352  {"@assembler",
1353   "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1354  {".sx", "@assembler-with-cpp", 0, 0, 0},
1355  {".S", "@assembler-with-cpp", 0, 0, 0},
1356  {"@assembler-with-cpp",
1357#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1358   "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1359      %{E|M|MM:%(cpp_debug_options)}\
1360      %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1361       as %(asm_debug) %(asm_options) %|.s %A }}}}"
1362#else
1363   "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1364      %{E|M|MM:%(cpp_debug_options)}\
1365      %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1366       as %(asm_debug) %(asm_options) %m.s %A }}}}"
1367#endif
1368   , 0, 0, 0},
1369
1370#include "specs.h"
1371  /* Mark end of table.  */
1372  {0, 0, 0, 0, 0}
1373};
1374
1375/* Number of elements in default_compilers, not counting the terminator.  */
1376
1377static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1378
1379typedef char *char_p; /* For DEF_VEC_P.  */
1380
1381/* A vector of options to give to the linker.
1382   These options are accumulated by %x,
1383   and substituted into the linker command with %X.  */
1384static vec<char_p> linker_options;
1385
1386/* A vector of options to give to the assembler.
1387   These options are accumulated by -Wa,
1388   and substituted into the assembler command with %Y.  */
1389static vec<char_p> assembler_options;
1390
1391/* A vector of options to give to the preprocessor.
1392   These options are accumulated by -Wp,
1393   and substituted into the preprocessor command with %Z.  */
1394static vec<char_p> preprocessor_options;
1395
1396static char *
1397skip_whitespace (char *p)
1398{
1399  while (1)
1400    {
1401      /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1402	 be considered whitespace.  */
1403      if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1404	return p + 1;
1405      else if (*p == '\n' || *p == ' ' || *p == '\t')
1406	p++;
1407      else if (*p == '#')
1408	{
1409	  while (*p != '\n')
1410	    p++;
1411	  p++;
1412	}
1413      else
1414	break;
1415    }
1416
1417  return p;
1418}
1419/* Structures to keep track of prefixes to try when looking for files.  */
1420
1421struct prefix_list
1422{
1423  const char *prefix;	      /* String to prepend to the path.  */
1424  struct prefix_list *next;   /* Next in linked list.  */
1425  int require_machine_suffix; /* Don't use without machine_suffix.  */
1426  /* 2 means try both machine_suffix and just_machine_suffix.  */
1427  int priority;		      /* Sort key - priority within list.  */
1428  int os_multilib;	      /* 1 if OS multilib scheme should be used,
1429				 0 for GCC multilib scheme.  */
1430};
1431
1432struct path_prefix
1433{
1434  struct prefix_list *plist;  /* List of prefixes to try */
1435  int max_len;                /* Max length of a prefix in PLIST */
1436  const char *name;           /* Name of this list (used in config stuff) */
1437};
1438
1439/* List of prefixes to try when looking for executables.  */
1440
1441static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1442
1443/* List of prefixes to try when looking for startup (crt0) files.  */
1444
1445static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1446
1447/* List of prefixes to try when looking for include files.  */
1448
1449static struct path_prefix include_prefixes = { 0, 0, "include" };
1450
1451/* Suffix to attach to directories searched for commands.
1452   This looks like `MACHINE/VERSION/'.  */
1453
1454static const char *machine_suffix = 0;
1455
1456/* Suffix to attach to directories searched for commands.
1457   This is just `MACHINE/'.  */
1458
1459static const char *just_machine_suffix = 0;
1460
1461/* Adjusted value of GCC_EXEC_PREFIX envvar.  */
1462
1463static const char *gcc_exec_prefix;
1464
1465/* Adjusted value of standard_libexec_prefix.  */
1466
1467static const char *gcc_libexec_prefix;
1468
1469/* Default prefixes to attach to command names.  */
1470
1471#ifndef STANDARD_STARTFILE_PREFIX_1
1472#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1473#endif
1474#ifndef STANDARD_STARTFILE_PREFIX_2
1475#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1476#endif
1477
1478#ifdef CROSS_DIRECTORY_STRUCTURE  /* Don't use these prefixes for a cross compiler.  */
1479#undef MD_EXEC_PREFIX
1480#undef MD_STARTFILE_PREFIX
1481#undef MD_STARTFILE_PREFIX_1
1482#endif
1483
1484/* If no prefixes defined, use the null string, which will disable them.  */
1485#ifndef MD_EXEC_PREFIX
1486#define MD_EXEC_PREFIX ""
1487#endif
1488#ifndef MD_STARTFILE_PREFIX
1489#define MD_STARTFILE_PREFIX ""
1490#endif
1491#ifndef MD_STARTFILE_PREFIX_1
1492#define MD_STARTFILE_PREFIX_1 ""
1493#endif
1494
1495/* These directories are locations set at configure-time based on the
1496   --prefix option provided to configure.  Their initializers are
1497   defined in Makefile.in.  These paths are not *directly* used when
1498   gcc_exec_prefix is set because, in that case, we know where the
1499   compiler has been installed, and use paths relative to that
1500   location instead.  */
1501static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1502static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1503static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1504static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1505
1506/* For native compilers, these are well-known paths containing
1507   components that may be provided by the system.  For cross
1508   compilers, these paths are not used.  */
1509static const char *md_exec_prefix = MD_EXEC_PREFIX;
1510static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1511static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1512static const char *const standard_startfile_prefix_1
1513  = STANDARD_STARTFILE_PREFIX_1;
1514static const char *const standard_startfile_prefix_2
1515  = STANDARD_STARTFILE_PREFIX_2;
1516
1517/* A relative path to be used in finding the location of tools
1518   relative to the driver.  */
1519static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1520
1521/* A prefix to be used when this is an accelerator compiler.  */
1522static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
1523
1524/* Subdirectory to use for locating libraries.  Set by
1525   set_multilib_dir based on the compilation options.  */
1526
1527static const char *multilib_dir;
1528
1529/* Subdirectory to use for locating libraries in OS conventions.  Set by
1530   set_multilib_dir based on the compilation options.  */
1531
1532static const char *multilib_os_dir;
1533
1534/* Subdirectory to use for locating libraries in multiarch conventions.  Set by
1535   set_multilib_dir based on the compilation options.  */
1536
1537static const char *multiarch_dir;
1538
1539/* Structure to keep track of the specs that have been defined so far.
1540   These are accessed using %(specname) in a compiler or link
1541   spec.  */
1542
1543struct spec_list
1544{
1545				/* The following 2 fields must be first */
1546				/* to allow EXTRA_SPECS to be initialized */
1547  const char *name;		/* name of the spec.  */
1548  const char *ptr;		/* available ptr if no static pointer */
1549
1550				/* The following fields are not initialized */
1551				/* by EXTRA_SPECS */
1552  const char **ptr_spec;	/* pointer to the spec itself.  */
1553  struct spec_list *next;	/* Next spec in linked list.  */
1554  int name_len;			/* length of the name */
1555  bool user_p;			/* whether string come from file spec.  */
1556  bool alloc_p;			/* whether string was allocated */
1557  const char *default_ptr;	/* The default value of *ptr_spec.  */
1558};
1559
1560#define INIT_STATIC_SPEC(NAME,PTR) \
1561  { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1562    *PTR }
1563
1564/* List of statically defined specs.  */
1565static struct spec_list static_specs[] =
1566{
1567  INIT_STATIC_SPEC ("asm",			&asm_spec),
1568  INIT_STATIC_SPEC ("asm_debug",		&asm_debug),
1569  INIT_STATIC_SPEC ("asm_final",		&asm_final_spec),
1570  INIT_STATIC_SPEC ("asm_options",		&asm_options),
1571  INIT_STATIC_SPEC ("invoke_as",		&invoke_as),
1572  INIT_STATIC_SPEC ("cpp",			&cpp_spec),
1573  INIT_STATIC_SPEC ("cpp_options",		&cpp_options),
1574  INIT_STATIC_SPEC ("cpp_debug_options",	&cpp_debug_options),
1575  INIT_STATIC_SPEC ("cpp_unique_options",	&cpp_unique_options),
1576  INIT_STATIC_SPEC ("trad_capable_cpp",		&trad_capable_cpp),
1577  INIT_STATIC_SPEC ("cc1",			&cc1_spec),
1578  INIT_STATIC_SPEC ("cc1_options",		&cc1_options),
1579  INIT_STATIC_SPEC ("cc1plus",			&cc1plus_spec),
1580  INIT_STATIC_SPEC ("link_gcc_c_sequence",	&link_gcc_c_sequence_spec),
1581  INIT_STATIC_SPEC ("link_ssp",			&link_ssp_spec),
1582  INIT_STATIC_SPEC ("endfile",			&endfile_spec),
1583  INIT_STATIC_SPEC ("link",			&link_spec),
1584  INIT_STATIC_SPEC ("lib",			&lib_spec),
1585  INIT_STATIC_SPEC ("link_gomp",		&link_gomp_spec),
1586  INIT_STATIC_SPEC ("libgcc",			&libgcc_spec),
1587  INIT_STATIC_SPEC ("startfile",		&startfile_spec),
1588  INIT_STATIC_SPEC ("cross_compile",		&cross_compile),
1589  INIT_STATIC_SPEC ("version",			&compiler_version),
1590  INIT_STATIC_SPEC ("multilib",			&multilib_select),
1591  INIT_STATIC_SPEC ("multilib_defaults",	&multilib_defaults),
1592  INIT_STATIC_SPEC ("multilib_extra",		&multilib_extra),
1593  INIT_STATIC_SPEC ("multilib_matches",		&multilib_matches),
1594  INIT_STATIC_SPEC ("multilib_exclusions",	&multilib_exclusions),
1595  INIT_STATIC_SPEC ("multilib_options",		&multilib_options),
1596  INIT_STATIC_SPEC ("multilib_reuse",		&multilib_reuse),
1597  INIT_STATIC_SPEC ("linker",			&linker_name_spec),
1598  INIT_STATIC_SPEC ("linker_plugin_file",	&linker_plugin_file_spec),
1599  INIT_STATIC_SPEC ("lto_wrapper",		&lto_wrapper_spec),
1600  INIT_STATIC_SPEC ("lto_gcc",			&lto_gcc_spec),
1601  INIT_STATIC_SPEC ("post_link",		&post_link_spec),
1602  INIT_STATIC_SPEC ("link_libgcc",		&link_libgcc_spec),
1603  INIT_STATIC_SPEC ("md_exec_prefix",		&md_exec_prefix),
1604  INIT_STATIC_SPEC ("md_startfile_prefix",	&md_startfile_prefix),
1605  INIT_STATIC_SPEC ("md_startfile_prefix_1",	&md_startfile_prefix_1),
1606  INIT_STATIC_SPEC ("startfile_prefix_spec",	&startfile_prefix_spec),
1607  INIT_STATIC_SPEC ("sysroot_spec",             &sysroot_spec),
1608  INIT_STATIC_SPEC ("sysroot_suffix_spec",	&sysroot_suffix_spec),
1609  INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec",	&sysroot_hdrs_suffix_spec),
1610  INIT_STATIC_SPEC ("self_spec",		&self_spec),
1611};
1612
1613#ifdef EXTRA_SPECS		/* additional specs needed */
1614/* Structure to keep track of just the first two args of a spec_list.
1615   That is all that the EXTRA_SPECS macro gives us.  */
1616struct spec_list_1
1617{
1618  const char *const name;
1619  const char *const ptr;
1620};
1621
1622static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1623static struct spec_list *extra_specs = (struct spec_list *) 0;
1624#endif
1625
1626/* List of dynamically allocates specs that have been defined so far.  */
1627
1628static struct spec_list *specs = (struct spec_list *) 0;
1629
1630/* List of static spec functions.  */
1631
1632static const struct spec_function static_spec_functions[] =
1633{
1634  { "getenv",                   getenv_spec_function },
1635  { "if-exists",		if_exists_spec_function },
1636  { "if-exists-else",		if_exists_else_spec_function },
1637  { "sanitize",			sanitize_spec_function },
1638  { "replace-outfile",		replace_outfile_spec_function },
1639  { "remove-outfile",		remove_outfile_spec_function },
1640  { "version-compare",		version_compare_spec_function },
1641  { "include",			include_spec_function },
1642  { "find-file",		find_file_spec_function },
1643  { "find-plugindir",		find_plugindir_spec_function },
1644  { "print-asm-header",		print_asm_header_spec_function },
1645  { "compare-debug-dump-opt",	compare_debug_dump_opt_spec_function },
1646  { "compare-debug-self-opt",	compare_debug_self_opt_spec_function },
1647  { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1648  { "pass-through-libs",	pass_through_libs_spec_func },
1649  { "replace-extension",	replace_extension_spec_func },
1650  { "gt",			greater_than_spec_func },
1651  { "debug-level-gt",		debug_level_greater_than_spec_func },
1652  { "fortran-preinclude-file",	find_fortran_preinclude_file},
1653#ifdef EXTRA_SPEC_FUNCTIONS
1654  EXTRA_SPEC_FUNCTIONS
1655#endif
1656  { 0, 0 }
1657};
1658
1659static int processing_spec_function;
1660
1661/* Add appropriate libgcc specs to OBSTACK, taking into account
1662   various permutations of -shared-libgcc, -shared, and such.  */
1663
1664#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1665
1666#ifndef USE_LD_AS_NEEDED
1667#define USE_LD_AS_NEEDED 0
1668#endif
1669
1670static void
1671init_gcc_specs (struct obstack *obstack, const char *shared_name,
1672		const char *static_name, const char *eh_name)
1673{
1674  char *buf;
1675
1676#if USE_LD_AS_NEEDED
1677  buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
1678		"%{!static:%{!static-libgcc:%{!static-pie:"
1679		"%{!shared-libgcc:",
1680		static_name, " " LD_AS_NEEDED_OPTION " ",
1681		shared_name, " " LD_NO_AS_NEEDED_OPTION
1682		"}"
1683		"%{shared-libgcc:",
1684		shared_name, "%{!shared: ", static_name, "}"
1685		"}}"
1686#else
1687  buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1688		"%{!static:%{!static-libgcc:"
1689		"%{!shared:"
1690		"%{!shared-libgcc:", static_name, " ", eh_name, "}"
1691		"%{shared-libgcc:", shared_name, " ", static_name, "}"
1692		"}"
1693#ifdef LINK_EH_SPEC
1694		"%{shared:"
1695		"%{shared-libgcc:", shared_name, "}"
1696		"%{!shared-libgcc:", static_name, "}"
1697		"}"
1698#else
1699		"%{shared:", shared_name, "}"
1700#endif
1701#endif
1702		"}}", NULL);
1703
1704  obstack_grow (obstack, buf, strlen (buf));
1705  free (buf);
1706}
1707#endif /* ENABLE_SHARED_LIBGCC */
1708
1709/* Initialize the specs lookup routines.  */
1710
1711static void
1712init_spec (void)
1713{
1714  struct spec_list *next = (struct spec_list *) 0;
1715  struct spec_list *sl   = (struct spec_list *) 0;
1716  int i;
1717
1718  if (specs)
1719    return;			/* Already initialized.  */
1720
1721  if (verbose_flag)
1722    fnotice (stderr, "Using built-in specs.\n");
1723
1724#ifdef EXTRA_SPECS
1725  extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1726
1727  for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1728    {
1729      sl = &extra_specs[i];
1730      sl->name = extra_specs_1[i].name;
1731      sl->ptr = extra_specs_1[i].ptr;
1732      sl->next = next;
1733      sl->name_len = strlen (sl->name);
1734      sl->ptr_spec = &sl->ptr;
1735      gcc_assert (sl->ptr_spec != NULL);
1736      sl->default_ptr = sl->ptr;
1737      next = sl;
1738    }
1739#endif
1740
1741  for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1742    {
1743      sl = &static_specs[i];
1744      sl->next = next;
1745      next = sl;
1746    }
1747
1748#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1749  /* ??? If neither -shared-libgcc nor --static-libgcc was
1750     seen, then we should be making an educated guess.  Some proposed
1751     heuristics for ELF include:
1752
1753	(1) If "-Wl,--export-dynamic", then it's a fair bet that the
1754	    program will be doing dynamic loading, which will likely
1755	    need the shared libgcc.
1756
1757	(2) If "-ldl", then it's also a fair bet that we're doing
1758	    dynamic loading.
1759
1760	(3) For each ET_DYN we're linking against (either through -lfoo
1761	    or /some/path/foo.so), check to see whether it or one of
1762	    its dependencies depends on a shared libgcc.
1763
1764	(4) If "-shared"
1765
1766	    If the runtime is fixed to look for program headers instead
1767	    of calling __register_frame_info at all, for each object,
1768	    use the shared libgcc if any EH symbol referenced.
1769
1770	    If crtstuff is fixed to not invoke __register_frame_info
1771	    automatically, for each object, use the shared libgcc if
1772	    any non-empty unwind section found.
1773
1774     Doing any of this probably requires invoking an external program to
1775     do the actual object file scanning.  */
1776  {
1777    const char *p = libgcc_spec;
1778    int in_sep = 1;
1779
1780    /* Transform the extant libgcc_spec into one that uses the shared libgcc
1781       when given the proper command line arguments.  */
1782    while (*p)
1783      {
1784	if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1785	  {
1786	    init_gcc_specs (&obstack,
1787			    "-lgcc_s"
1788#ifdef USE_LIBUNWIND_EXCEPTIONS
1789			    " -lunwind"
1790#endif
1791			    ,
1792			    "-lgcc",
1793			    "-lgcc_eh"
1794#ifdef USE_LIBUNWIND_EXCEPTIONS
1795# ifdef HAVE_LD_STATIC_DYNAMIC
1796			    " %{!static:%{!static-pie:" LD_STATIC_OPTION "}} -lunwind"
1797			    " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION "}}"
1798# else
1799			    " -lunwind"
1800# endif
1801#endif
1802			    );
1803
1804	    p += 5;
1805	    in_sep = 0;
1806	  }
1807	else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1808	  {
1809	    /* Ug.  We don't know shared library extensions.  Hope that
1810	       systems that use this form don't do shared libraries.  */
1811	    init_gcc_specs (&obstack,
1812			    "-lgcc_s",
1813			    "libgcc.a%s",
1814			    "libgcc_eh.a%s"
1815#ifdef USE_LIBUNWIND_EXCEPTIONS
1816			    " -lunwind"
1817#endif
1818			    );
1819	    p += 10;
1820	    in_sep = 0;
1821	  }
1822	else
1823	  {
1824	    obstack_1grow (&obstack, *p);
1825	    in_sep = (*p == ' ');
1826	    p += 1;
1827	  }
1828      }
1829
1830    obstack_1grow (&obstack, '\0');
1831    libgcc_spec = XOBFINISH (&obstack, const char *);
1832  }
1833#endif
1834#ifdef USE_AS_TRADITIONAL_FORMAT
1835  /* Prepend "--traditional-format" to whatever asm_spec we had before.  */
1836  {
1837    static const char tf[] = "--traditional-format ";
1838    obstack_grow (&obstack, tf, sizeof (tf) - 1);
1839    obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1840    asm_spec = XOBFINISH (&obstack, const char *);
1841  }
1842#endif
1843
1844#if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1845    defined LINKER_HASH_STYLE
1846# ifdef LINK_BUILDID_SPEC
1847  /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before.  */
1848  obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
1849# endif
1850# ifdef LINK_EH_SPEC
1851  /* Prepend LINK_EH_SPEC to whatever link_spec we had before.  */
1852  obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
1853# endif
1854# ifdef LINKER_HASH_STYLE
1855  /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1856     before.  */
1857  {
1858    static const char hash_style[] = "--hash-style=";
1859    obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1860    obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
1861    obstack_1grow (&obstack, ' ');
1862  }
1863# endif
1864  obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1865  link_spec = XOBFINISH (&obstack, const char *);
1866#endif
1867
1868  specs = sl;
1869}
1870
1871/* Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
1872   removed; If the spec starts with a + then SPEC is added to the end of the
1873   current spec.  */
1874
1875static void
1876set_spec (const char *name, const char *spec, bool user_p)
1877{
1878  struct spec_list *sl;
1879  const char *old_spec;
1880  int name_len = strlen (name);
1881  int i;
1882
1883  /* If this is the first call, initialize the statically allocated specs.  */
1884  if (!specs)
1885    {
1886      struct spec_list *next = (struct spec_list *) 0;
1887      for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1888	{
1889	  sl = &static_specs[i];
1890	  sl->next = next;
1891	  next = sl;
1892	}
1893      specs = sl;
1894    }
1895
1896  /* See if the spec already exists.  */
1897  for (sl = specs; sl; sl = sl->next)
1898    if (name_len == sl->name_len && !strcmp (sl->name, name))
1899      break;
1900
1901  if (!sl)
1902    {
1903      /* Not found - make it.  */
1904      sl = XNEW (struct spec_list);
1905      sl->name = xstrdup (name);
1906      sl->name_len = name_len;
1907      sl->ptr_spec = &sl->ptr;
1908      sl->alloc_p = 0;
1909      *(sl->ptr_spec) = "";
1910      sl->next = specs;
1911      sl->default_ptr = NULL;
1912      specs = sl;
1913    }
1914
1915  old_spec = *(sl->ptr_spec);
1916  *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1917		     ? concat (old_spec, spec + 1, NULL)
1918		     : xstrdup (spec));
1919
1920#ifdef DEBUG_SPECS
1921  if (verbose_flag)
1922    fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1923#endif
1924
1925  /* Free the old spec.  */
1926  if (old_spec && sl->alloc_p)
1927    free (CONST_CAST (char *, old_spec));
1928
1929  sl->user_p = user_p;
1930  sl->alloc_p = true;
1931}
1932
1933/* Accumulate a command (program name and args), and run it.  */
1934
1935typedef const char *const_char_p; /* For DEF_VEC_P.  */
1936
1937/* Vector of pointers to arguments in the current line of specifications.  */
1938static vec<const_char_p> argbuf;
1939
1940/* Likewise, but for the current @file.  */
1941static vec<const_char_p> at_file_argbuf;
1942
1943/* Whether an @file is currently open.  */
1944static bool in_at_file = false;
1945
1946/* Were the options -c, -S or -E passed.  */
1947static int have_c = 0;
1948
1949/* Was the option -o passed.  */
1950static int have_o = 0;
1951
1952/* Was the option -E passed.  */
1953static int have_E = 0;
1954
1955/* Pointer to output file name passed in with -o. */
1956static const char *output_file = 0;
1957
1958/* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1959   temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
1960   it here.  */
1961
1962static struct temp_name {
1963  const char *suffix;	/* suffix associated with the code.  */
1964  int length;		/* strlen (suffix).  */
1965  int unique;		/* Indicates whether %g or %u/%U was used.  */
1966  const char *filename;	/* associated filename.  */
1967  int filename_length;	/* strlen (filename).  */
1968  struct temp_name *next;
1969} *temp_names;
1970
1971/* Number of commands executed so far.  */
1972
1973static int execution_count;
1974
1975/* Number of commands that exited with a signal.  */
1976
1977static int signal_count;
1978
1979/* Allocate the argument vector.  */
1980
1981static void
1982alloc_args (void)
1983{
1984  argbuf.create (10);
1985  at_file_argbuf.create (10);
1986}
1987
1988/* Clear out the vector of arguments (after a command is executed).  */
1989
1990static void
1991clear_args (void)
1992{
1993  argbuf.truncate (0);
1994  at_file_argbuf.truncate (0);
1995}
1996
1997/* Add one argument to the vector at the end.
1998   This is done when a space is seen or at the end of the line.
1999   If DELETE_ALWAYS is nonzero, the arg is a filename
2000    and the file should be deleted eventually.
2001   If DELETE_FAILURE is nonzero, the arg is a filename
2002    and the file should be deleted if this compilation fails.  */
2003
2004static void
2005store_arg (const char *arg, int delete_always, int delete_failure)
2006{
2007  if (in_at_file)
2008    at_file_argbuf.safe_push (arg);
2009  else
2010    argbuf.safe_push (arg);
2011
2012  if (delete_always || delete_failure)
2013    {
2014      const char *p;
2015      /* If the temporary file we should delete is specified as
2016	 part of a joined argument extract the filename.  */
2017      if (arg[0] == '-'
2018	  && (p = strrchr (arg, '=')))
2019	arg = p + 1;
2020      record_temp_file (arg, delete_always, delete_failure);
2021    }
2022}
2023
2024/* Open a temporary @file into which subsequent arguments will be stored.  */
2025
2026static void
2027open_at_file (void)
2028{
2029   if (in_at_file)
2030     fatal_error (input_location, "cannot open nested response file");
2031   else
2032     in_at_file = true;
2033}
2034
2035/* Close the temporary @file and add @file to the argument list.  */
2036
2037static void
2038close_at_file (void)
2039{
2040  if (!in_at_file)
2041    fatal_error (input_location, "cannot close nonexistent response file");
2042
2043  in_at_file = false;
2044
2045  const unsigned int n_args = at_file_argbuf.length ();
2046  if (n_args == 0)
2047    return;
2048
2049  char **argv = (char **) alloca (sizeof (char *) * (n_args + 1));
2050  char *temp_file = make_temp_file ("");
2051  char *at_argument = concat ("@", temp_file, NULL);
2052  FILE *f = fopen (temp_file, "w");
2053  int status;
2054  unsigned int i;
2055
2056  /* Copy the strings over.  */
2057  for (i = 0; i < n_args; i++)
2058    argv[i] = CONST_CAST (char *, at_file_argbuf[i]);
2059  argv[i] = NULL;
2060
2061  at_file_argbuf.truncate (0);
2062
2063  if (f == NULL)
2064    fatal_error (input_location, "could not open temporary response file %s",
2065		 temp_file);
2066
2067  status = writeargv (argv, f);
2068
2069  if (status)
2070    fatal_error (input_location,
2071		 "could not write to temporary response file %s",
2072		 temp_file);
2073
2074  status = fclose (f);
2075
2076  if (status == EOF)
2077    fatal_error (input_location, "could not close temporary response file %s",
2078		 temp_file);
2079
2080  store_arg (at_argument, 0, 0);
2081
2082  record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
2083}
2084
2085/* Load specs from a file name named FILENAME, replacing occurrences of
2086   various different types of line-endings, \r\n, \n\r and just \r, with
2087   a single \n.  */
2088
2089static char *
2090load_specs (const char *filename)
2091{
2092  int desc;
2093  int readlen;
2094  struct stat statbuf;
2095  char *buffer;
2096  char *buffer_p;
2097  char *specs;
2098  char *specs_p;
2099
2100  if (verbose_flag)
2101    fnotice (stderr, "Reading specs from %s\n", filename);
2102
2103  /* Open and stat the file.  */
2104  desc = open (filename, O_RDONLY, 0);
2105  if (desc < 0)
2106    {
2107    failed:
2108      /* This leaves DESC open, but the OS will save us.  */
2109      fatal_error (input_location, "cannot read spec file %qs: %m", filename);
2110    }
2111
2112  if (stat (filename, &statbuf) < 0)
2113    goto failed;
2114
2115  /* Read contents of file into BUFFER.  */
2116  buffer = XNEWVEC (char, statbuf.st_size + 1);
2117  readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2118  if (readlen < 0)
2119    goto failed;
2120  buffer[readlen] = 0;
2121  close (desc);
2122
2123  specs = XNEWVEC (char, readlen + 1);
2124  specs_p = specs;
2125  for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2126    {
2127      int skip = 0;
2128      char c = *buffer_p;
2129      if (c == '\r')
2130	{
2131	  if (buffer_p > buffer && *(buffer_p - 1) == '\n')	/* \n\r */
2132	    skip = 1;
2133	  else if (*(buffer_p + 1) == '\n')			/* \r\n */
2134	    skip = 1;
2135	  else							/* \r */
2136	    c = '\n';
2137	}
2138      if (! skip)
2139	*specs_p++ = c;
2140    }
2141  *specs_p = '\0';
2142
2143  free (buffer);
2144  return (specs);
2145}
2146
2147/* Read compilation specs from a file named FILENAME,
2148   replacing the default ones.
2149
2150   A suffix which starts with `*' is a definition for
2151   one of the machine-specific sub-specs.  The "suffix" should be
2152   *asm, *cc1, *cpp, *link, *startfile, etc.
2153   The corresponding spec is stored in asm_spec, etc.,
2154   rather than in the `compilers' vector.
2155
2156   Anything invalid in the file is a fatal error.  */
2157
2158static void
2159read_specs (const char *filename, bool main_p, bool user_p)
2160{
2161  char *buffer;
2162  char *p;
2163
2164  buffer = load_specs (filename);
2165
2166  /* Scan BUFFER for specs, putting them in the vector.  */
2167  p = buffer;
2168  while (1)
2169    {
2170      char *suffix;
2171      char *spec;
2172      char *in, *out, *p1, *p2, *p3;
2173
2174      /* Advance P in BUFFER to the next nonblank nocomment line.  */
2175      p = skip_whitespace (p);
2176      if (*p == 0)
2177	break;
2178
2179      /* Is this a special command that starts with '%'? */
2180      /* Don't allow this for the main specs file, since it would
2181	 encourage people to overwrite it.  */
2182      if (*p == '%' && !main_p)
2183	{
2184	  p1 = p;
2185	  while (*p && *p != '\n')
2186	    p++;
2187
2188	  /* Skip '\n'.  */
2189	  p++;
2190
2191	  if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2192	      && (p1[sizeof "%include" - 1] == ' '
2193		  || p1[sizeof "%include" - 1] == '\t'))
2194	    {
2195	      char *new_filename;
2196
2197	      p1 += sizeof ("%include");
2198	      while (*p1 == ' ' || *p1 == '\t')
2199		p1++;
2200
2201	      if (*p1++ != '<' || p[-2] != '>')
2202		fatal_error (input_location,
2203			     "specs %%include syntax malformed after "
2204			     "%ld characters",
2205			     (long) (p1 - buffer + 1));
2206
2207	      p[-2] = '\0';
2208	      new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2209	      read_specs (new_filename ? new_filename : p1, false, user_p);
2210	      continue;
2211	    }
2212	  else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2213		   && (p1[sizeof "%include_noerr" - 1] == ' '
2214		       || p1[sizeof "%include_noerr" - 1] == '\t'))
2215	    {
2216	      char *new_filename;
2217
2218	      p1 += sizeof "%include_noerr";
2219	      while (*p1 == ' ' || *p1 == '\t')
2220		p1++;
2221
2222	      if (*p1++ != '<' || p[-2] != '>')
2223		fatal_error (input_location,
2224			     "specs %%include syntax malformed after "
2225			     "%ld characters",
2226			     (long) (p1 - buffer + 1));
2227
2228	      p[-2] = '\0';
2229	      new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2230	      if (new_filename)
2231		read_specs (new_filename, false, user_p);
2232	      else if (verbose_flag)
2233		fnotice (stderr, "could not find specs file %s\n", p1);
2234	      continue;
2235	    }
2236	  else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2237		   && (p1[sizeof "%rename" - 1] == ' '
2238		       || p1[sizeof "%rename" - 1] == '\t'))
2239	    {
2240	      int name_len;
2241	      struct spec_list *sl;
2242	      struct spec_list *newsl;
2243
2244	      /* Get original name.  */
2245	      p1 += sizeof "%rename";
2246	      while (*p1 == ' ' || *p1 == '\t')
2247		p1++;
2248
2249	      if (! ISALPHA ((unsigned char) *p1))
2250		fatal_error (input_location,
2251			     "specs %%rename syntax malformed after "
2252			     "%ld characters",
2253			     (long) (p1 - buffer));
2254
2255	      p2 = p1;
2256	      while (*p2 && !ISSPACE ((unsigned char) *p2))
2257		p2++;
2258
2259	      if (*p2 != ' ' && *p2 != '\t')
2260		fatal_error (input_location,
2261			     "specs %%rename syntax malformed after "
2262			     "%ld characters",
2263			     (long) (p2 - buffer));
2264
2265	      name_len = p2 - p1;
2266	      *p2++ = '\0';
2267	      while (*p2 == ' ' || *p2 == '\t')
2268		p2++;
2269
2270	      if (! ISALPHA ((unsigned char) *p2))
2271		fatal_error (input_location,
2272			     "specs %%rename syntax malformed after "
2273			     "%ld characters",
2274			     (long) (p2 - buffer));
2275
2276	      /* Get new spec name.  */
2277	      p3 = p2;
2278	      while (*p3 && !ISSPACE ((unsigned char) *p3))
2279		p3++;
2280
2281	      if (p3 != p - 1)
2282		fatal_error (input_location,
2283			     "specs %%rename syntax malformed after "
2284			     "%ld characters",
2285			     (long) (p3 - buffer));
2286	      *p3 = '\0';
2287
2288	      for (sl = specs; sl; sl = sl->next)
2289		if (name_len == sl->name_len && !strcmp (sl->name, p1))
2290		  break;
2291
2292	      if (!sl)
2293		fatal_error (input_location,
2294			     "specs %s spec was not found to be renamed", p1);
2295
2296	      if (strcmp (p1, p2) == 0)
2297		continue;
2298
2299	      for (newsl = specs; newsl; newsl = newsl->next)
2300		if (strcmp (newsl->name, p2) == 0)
2301		  fatal_error (input_location,
2302			       "%s: attempt to rename spec %qs to "
2303			       "already defined spec %qs",
2304		    filename, p1, p2);
2305
2306	      if (verbose_flag)
2307		{
2308		  fnotice (stderr, "rename spec %s to %s\n", p1, p2);
2309#ifdef DEBUG_SPECS
2310		  fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2311#endif
2312		}
2313
2314	      set_spec (p2, *(sl->ptr_spec), user_p);
2315	      if (sl->alloc_p)
2316		free (CONST_CAST (char *, *(sl->ptr_spec)));
2317
2318	      *(sl->ptr_spec) = "";
2319	      sl->alloc_p = 0;
2320	      continue;
2321	    }
2322	  else
2323	    fatal_error (input_location,
2324			 "specs unknown %% command after %ld characters",
2325			 (long) (p1 - buffer));
2326	}
2327
2328      /* Find the colon that should end the suffix.  */
2329      p1 = p;
2330      while (*p1 && *p1 != ':' && *p1 != '\n')
2331	p1++;
2332
2333      /* The colon shouldn't be missing.  */
2334      if (*p1 != ':')
2335	fatal_error (input_location,
2336		     "specs file malformed after %ld characters",
2337		     (long) (p1 - buffer));
2338
2339      /* Skip back over trailing whitespace.  */
2340      p2 = p1;
2341      while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2342	p2--;
2343
2344      /* Copy the suffix to a string.  */
2345      suffix = save_string (p, p2 - p);
2346      /* Find the next line.  */
2347      p = skip_whitespace (p1 + 1);
2348      if (p[1] == 0)
2349	fatal_error (input_location,
2350		     "specs file malformed after %ld characters",
2351		     (long) (p - buffer));
2352
2353      p1 = p;
2354      /* Find next blank line or end of string.  */
2355      while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2356	p1++;
2357
2358      /* Specs end at the blank line and do not include the newline.  */
2359      spec = save_string (p, p1 - p);
2360      p = p1;
2361
2362      /* Delete backslash-newline sequences from the spec.  */
2363      in = spec;
2364      out = spec;
2365      while (*in != 0)
2366	{
2367	  if (in[0] == '\\' && in[1] == '\n')
2368	    in += 2;
2369	  else if (in[0] == '#')
2370	    while (*in && *in != '\n')
2371	      in++;
2372
2373	  else
2374	    *out++ = *in++;
2375	}
2376      *out = 0;
2377
2378      if (suffix[0] == '*')
2379	{
2380	  if (! strcmp (suffix, "*link_command"))
2381	    link_command_spec = spec;
2382	  else
2383	    {
2384	      set_spec (suffix + 1, spec, user_p);
2385	      free (spec);
2386	    }
2387	}
2388      else
2389	{
2390	  /* Add this pair to the vector.  */
2391	  compilers
2392	    = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2393
2394	  compilers[n_compilers].suffix = suffix;
2395	  compilers[n_compilers].spec = spec;
2396	  n_compilers++;
2397	  memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2398	}
2399
2400      if (*suffix == 0)
2401	link_command_spec = spec;
2402    }
2403
2404  if (link_command_spec == 0)
2405    fatal_error (input_location, "spec file has no spec for linking");
2406
2407  XDELETEVEC (buffer);
2408}
2409
2410/* Record the names of temporary files we tell compilers to write,
2411   and delete them at the end of the run.  */
2412
2413/* This is the common prefix we use to make temp file names.
2414   It is chosen once for each run of this program.
2415   It is substituted into a spec by %g or %j.
2416   Thus, all temp file names contain this prefix.
2417   In practice, all temp file names start with this prefix.
2418
2419   This prefix comes from the envvar TMPDIR if it is defined;
2420   otherwise, from the P_tmpdir macro if that is defined;
2421   otherwise, in /usr/tmp or /tmp;
2422   or finally the current directory if all else fails.  */
2423
2424static const char *temp_filename;
2425
2426/* Length of the prefix.  */
2427
2428static int temp_filename_length;
2429
2430/* Define the list of temporary files to delete.  */
2431
2432struct temp_file
2433{
2434  const char *name;
2435  struct temp_file *next;
2436};
2437
2438/* Queue of files to delete on success or failure of compilation.  */
2439static struct temp_file *always_delete_queue;
2440/* Queue of files to delete on failure of compilation.  */
2441static struct temp_file *failure_delete_queue;
2442
2443/* Record FILENAME as a file to be deleted automatically.
2444   ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2445   otherwise delete it in any case.
2446   FAIL_DELETE nonzero means delete it if a compilation step fails;
2447   otherwise delete it in any case.  */
2448
2449void
2450record_temp_file (const char *filename, int always_delete, int fail_delete)
2451{
2452  char *const name = xstrdup (filename);
2453
2454  if (always_delete)
2455    {
2456      struct temp_file *temp;
2457      for (temp = always_delete_queue; temp; temp = temp->next)
2458	if (! filename_cmp (name, temp->name))
2459	  {
2460	    free (name);
2461	    goto already1;
2462	  }
2463
2464      temp = XNEW (struct temp_file);
2465      temp->next = always_delete_queue;
2466      temp->name = name;
2467      always_delete_queue = temp;
2468
2469    already1:;
2470    }
2471
2472  if (fail_delete)
2473    {
2474      struct temp_file *temp;
2475      for (temp = failure_delete_queue; temp; temp = temp->next)
2476	if (! filename_cmp (name, temp->name))
2477	  {
2478	    free (name);
2479	    goto already2;
2480	  }
2481
2482      temp = XNEW (struct temp_file);
2483      temp->next = failure_delete_queue;
2484      temp->name = name;
2485      failure_delete_queue = temp;
2486
2487    already2:;
2488    }
2489}
2490
2491/* Delete all the temporary files whose names we previously recorded.  */
2492
2493#ifndef DELETE_IF_ORDINARY
2494#define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG)        \
2495do                                                      \
2496  {                                                     \
2497    if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode))  \
2498      if (unlink (NAME) < 0)                            \
2499	if (VERBOSE_FLAG)                               \
2500	  error ("%s: %m", (NAME));			\
2501  } while (0)
2502#endif
2503
2504static void
2505delete_if_ordinary (const char *name)
2506{
2507  struct stat st;
2508#ifdef DEBUG
2509  int i, c;
2510
2511  printf ("Delete %s? (y or n) ", name);
2512  fflush (stdout);
2513  i = getchar ();
2514  if (i != '\n')
2515    while ((c = getchar ()) != '\n' && c != EOF)
2516      ;
2517
2518  if (i == 'y' || i == 'Y')
2519#endif /* DEBUG */
2520  DELETE_IF_ORDINARY (name, st, verbose_flag);
2521}
2522
2523static void
2524delete_temp_files (void)
2525{
2526  struct temp_file *temp;
2527
2528  for (temp = always_delete_queue; temp; temp = temp->next)
2529    delete_if_ordinary (temp->name);
2530  always_delete_queue = 0;
2531}
2532
2533/* Delete all the files to be deleted on error.  */
2534
2535static void
2536delete_failure_queue (void)
2537{
2538  struct temp_file *temp;
2539
2540  for (temp = failure_delete_queue; temp; temp = temp->next)
2541    delete_if_ordinary (temp->name);
2542}
2543
2544static void
2545clear_failure_queue (void)
2546{
2547  failure_delete_queue = 0;
2548}
2549
2550/* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2551   returns non-NULL.
2552   If DO_MULTI is true iterate over the paths twice, first with multilib
2553   suffix then without, otherwise iterate over the paths once without
2554   adding a multilib suffix.  When DO_MULTI is true, some attempt is made
2555   to avoid visiting the same path twice, but we could do better.  For
2556   instance, /usr/lib/../lib is considered different from /usr/lib.
2557   At least EXTRA_SPACE chars past the end of the path passed to
2558   CALLBACK are available for use by the callback.
2559   CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2560
2561   Returns the value returned by CALLBACK.  */
2562
2563static void *
2564for_each_path (const struct path_prefix *paths,
2565	       bool do_multi,
2566	       size_t extra_space,
2567	       void *(*callback) (char *, void *),
2568	       void *callback_info)
2569{
2570  struct prefix_list *pl;
2571  const char *multi_dir = NULL;
2572  const char *multi_os_dir = NULL;
2573  const char *multiarch_suffix = NULL;
2574  const char *multi_suffix;
2575  const char *just_multi_suffix;
2576  char *path = NULL;
2577  void *ret = NULL;
2578  bool skip_multi_dir = false;
2579  bool skip_multi_os_dir = false;
2580
2581  multi_suffix = machine_suffix;
2582  just_multi_suffix = just_machine_suffix;
2583  if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2584    {
2585      multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2586      multi_suffix = concat (multi_suffix, multi_dir, NULL);
2587      just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2588    }
2589  if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2590    multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2591  if (multiarch_dir)
2592    multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
2593
2594  while (1)
2595    {
2596      size_t multi_dir_len = 0;
2597      size_t multi_os_dir_len = 0;
2598      size_t multiarch_len = 0;
2599      size_t suffix_len;
2600      size_t just_suffix_len;
2601      size_t len;
2602
2603      if (multi_dir)
2604	multi_dir_len = strlen (multi_dir);
2605      if (multi_os_dir)
2606	multi_os_dir_len = strlen (multi_os_dir);
2607      if (multiarch_suffix)
2608	multiarch_len = strlen (multiarch_suffix);
2609      suffix_len = strlen (multi_suffix);
2610      just_suffix_len = strlen (just_multi_suffix);
2611
2612      if (path == NULL)
2613	{
2614	  len = paths->max_len + extra_space + 1;
2615	  len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
2616	  path = XNEWVEC (char, len);
2617	}
2618
2619      for (pl = paths->plist; pl != 0; pl = pl->next)
2620	{
2621	  len = strlen (pl->prefix);
2622	  memcpy (path, pl->prefix, len);
2623
2624	  /* Look first in MACHINE/VERSION subdirectory.  */
2625	  if (!skip_multi_dir)
2626	    {
2627	      memcpy (path + len, multi_suffix, suffix_len + 1);
2628	      ret = callback (path, callback_info);
2629	      if (ret)
2630		break;
2631	    }
2632
2633	  /* Some paths are tried with just the machine (ie. target)
2634	     subdir.  This is used for finding as, ld, etc.  */
2635	  if (!skip_multi_dir
2636	      && pl->require_machine_suffix == 2)
2637	    {
2638	      memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2639	      ret = callback (path, callback_info);
2640	      if (ret)
2641		break;
2642	    }
2643
2644	  /* Now try the multiarch path.  */
2645	  if (!skip_multi_dir
2646	      && !pl->require_machine_suffix && multiarch_dir)
2647	    {
2648	      memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2649	      ret = callback (path, callback_info);
2650	      if (ret)
2651		break;
2652	    }
2653
2654	  /* Now try the base path.  */
2655	  if (!pl->require_machine_suffix
2656	      && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2657	    {
2658	      const char *this_multi;
2659	      size_t this_multi_len;
2660
2661	      if (pl->os_multilib)
2662		{
2663		  this_multi = multi_os_dir;
2664		  this_multi_len = multi_os_dir_len;
2665		}
2666	      else
2667		{
2668		  this_multi = multi_dir;
2669		  this_multi_len = multi_dir_len;
2670		}
2671
2672	      if (this_multi_len)
2673		memcpy (path + len, this_multi, this_multi_len + 1);
2674	      else
2675		path[len] = '\0';
2676
2677	      ret = callback (path, callback_info);
2678	      if (ret)
2679		break;
2680	    }
2681	}
2682      if (pl)
2683	break;
2684
2685      if (multi_dir == NULL && multi_os_dir == NULL)
2686	break;
2687
2688      /* Run through the paths again, this time without multilibs.
2689	 Don't repeat any we have already seen.  */
2690      if (multi_dir)
2691	{
2692	  free (CONST_CAST (char *, multi_dir));
2693	  multi_dir = NULL;
2694	  free (CONST_CAST (char *, multi_suffix));
2695	  multi_suffix = machine_suffix;
2696	  free (CONST_CAST (char *, just_multi_suffix));
2697	  just_multi_suffix = just_machine_suffix;
2698	}
2699      else
2700	skip_multi_dir = true;
2701      if (multi_os_dir)
2702	{
2703	  free (CONST_CAST (char *, multi_os_dir));
2704	  multi_os_dir = NULL;
2705	}
2706      else
2707	skip_multi_os_dir = true;
2708    }
2709
2710  if (multi_dir)
2711    {
2712      free (CONST_CAST (char *, multi_dir));
2713      free (CONST_CAST (char *, multi_suffix));
2714      free (CONST_CAST (char *, just_multi_suffix));
2715    }
2716  if (multi_os_dir)
2717    free (CONST_CAST (char *, multi_os_dir));
2718  if (ret != path)
2719    free (path);
2720  return ret;
2721}
2722
2723/* Callback for build_search_list.  Adds path to obstack being built.  */
2724
2725struct add_to_obstack_info {
2726  struct obstack *ob;
2727  bool check_dir;
2728  bool first_time;
2729};
2730
2731static void *
2732add_to_obstack (char *path, void *data)
2733{
2734  struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2735
2736  if (info->check_dir && !is_directory (path, false))
2737    return NULL;
2738
2739  if (!info->first_time)
2740    obstack_1grow (info->ob, PATH_SEPARATOR);
2741
2742  obstack_grow (info->ob, path, strlen (path));
2743
2744  info->first_time = false;
2745  return NULL;
2746}
2747
2748/* Add or change the value of an environment variable, outputting the
2749   change to standard error if in verbose mode.  */
2750static void
2751xputenv (const char *string)
2752{
2753  env.xput (string);
2754}
2755
2756/* Build a list of search directories from PATHS.
2757   PREFIX is a string to prepend to the list.
2758   If CHECK_DIR_P is true we ensure the directory exists.
2759   If DO_MULTI is true, multilib paths are output first, then
2760   non-multilib paths.
2761   This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2762   It is also used by the --print-search-dirs flag.  */
2763
2764static char *
2765build_search_list (const struct path_prefix *paths, const char *prefix,
2766		   bool check_dir, bool do_multi)
2767{
2768  struct add_to_obstack_info info;
2769
2770  info.ob = &collect_obstack;
2771  info.check_dir = check_dir;
2772  info.first_time = true;
2773
2774  obstack_grow (&collect_obstack, prefix, strlen (prefix));
2775  obstack_1grow (&collect_obstack, '=');
2776
2777  for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2778
2779  obstack_1grow (&collect_obstack, '\0');
2780  return XOBFINISH (&collect_obstack, char *);
2781}
2782
2783/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2784   for collect.  */
2785
2786static void
2787putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2788		      bool do_multi)
2789{
2790  xputenv (build_search_list (paths, env_var, true, do_multi));
2791}
2792
2793/* Check whether NAME can be accessed in MODE.  This is like access,
2794   except that it never considers directories to be executable.  */
2795
2796static int
2797access_check (const char *name, int mode)
2798{
2799  if (mode == X_OK)
2800    {
2801      struct stat st;
2802
2803      if (stat (name, &st) < 0
2804	  || S_ISDIR (st.st_mode))
2805	return -1;
2806    }
2807
2808  return access (name, mode);
2809}
2810
2811/* Callback for find_a_file.  Appends the file name to the directory
2812   path.  If the resulting file exists in the right mode, return the
2813   full pathname to the file.  */
2814
2815struct file_at_path_info {
2816  const char *name;
2817  const char *suffix;
2818  int name_len;
2819  int suffix_len;
2820  int mode;
2821};
2822
2823static void *
2824file_at_path (char *path, void *data)
2825{
2826  struct file_at_path_info *info = (struct file_at_path_info *) data;
2827  size_t len = strlen (path);
2828
2829  memcpy (path + len, info->name, info->name_len);
2830  len += info->name_len;
2831
2832  /* Some systems have a suffix for executable files.
2833     So try appending that first.  */
2834  if (info->suffix_len)
2835    {
2836      memcpy (path + len, info->suffix, info->suffix_len + 1);
2837      if (access_check (path, info->mode) == 0)
2838	return path;
2839    }
2840
2841  path[len] = '\0';
2842  if (access_check (path, info->mode) == 0)
2843    return path;
2844
2845  return NULL;
2846}
2847
2848/* Search for NAME using the prefix list PREFIXES.  MODE is passed to
2849   access to check permissions.  If DO_MULTI is true, search multilib
2850   paths then non-multilib paths, otherwise do not search multilib paths.
2851   Return 0 if not found, otherwise return its name, allocated with malloc.  */
2852
2853static char *
2854find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2855	     bool do_multi)
2856{
2857  struct file_at_path_info info;
2858
2859#ifdef DEFAULT_ASSEMBLER
2860  if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2861    return xstrdup (DEFAULT_ASSEMBLER);
2862#endif
2863
2864#ifdef DEFAULT_LINKER
2865  if (! strcmp (name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2866    return xstrdup (DEFAULT_LINKER);
2867#endif
2868
2869#ifdef DEFAULT_DSYMUTIL
2870  if (! strcmp (name, "dsymutil") && access (DEFAULT_DSYMUTIL, mode) == 0)
2871    return xstrdup (DEFAULT_DSYMUTIL);
2872#endif
2873
2874  /* Determine the filename to execute (special case for absolute paths).  */
2875
2876  if (IS_ABSOLUTE_PATH (name))
2877    {
2878      if (access (name, mode) == 0)
2879	return xstrdup (name);
2880
2881      return NULL;
2882    }
2883
2884  info.name = name;
2885  info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2886  info.name_len = strlen (info.name);
2887  info.suffix_len = strlen (info.suffix);
2888  info.mode = mode;
2889
2890  return (char*) for_each_path (pprefix, do_multi,
2891				info.name_len + info.suffix_len,
2892				file_at_path, &info);
2893}
2894
2895/* Ranking of prefixes in the sort list. -B prefixes are put before
2896   all others.  */
2897
2898enum path_prefix_priority
2899{
2900  PREFIX_PRIORITY_B_OPT,
2901  PREFIX_PRIORITY_LAST
2902};
2903
2904/* Add an entry for PREFIX in PLIST.  The PLIST is kept in ascending
2905   order according to PRIORITY.  Within each PRIORITY, new entries are
2906   appended.
2907
2908   If WARN is nonzero, we will warn if no file is found
2909   through this prefix.  WARN should point to an int
2910   which will be set to 1 if this entry is used.
2911
2912   COMPONENT is the value to be passed to update_path.
2913
2914   REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2915   the complete value of machine_suffix.
2916   2 means try both machine_suffix and just_machine_suffix.  */
2917
2918static void
2919add_prefix (struct path_prefix *pprefix, const char *prefix,
2920	    const char *component, /* enum prefix_priority */ int priority,
2921	    int require_machine_suffix, int os_multilib)
2922{
2923  struct prefix_list *pl, **prev;
2924  int len;
2925
2926  for (prev = &pprefix->plist;
2927       (*prev) != NULL && (*prev)->priority <= priority;
2928       prev = &(*prev)->next)
2929    ;
2930
2931  /* Keep track of the longest prefix.  */
2932
2933  prefix = update_path (prefix, component);
2934  len = strlen (prefix);
2935  if (len > pprefix->max_len)
2936    pprefix->max_len = len;
2937
2938  pl = XNEW (struct prefix_list);
2939  pl->prefix = prefix;
2940  pl->require_machine_suffix = require_machine_suffix;
2941  pl->priority = priority;
2942  pl->os_multilib = os_multilib;
2943
2944  /* Insert after PREV.  */
2945  pl->next = (*prev);
2946  (*prev) = pl;
2947}
2948
2949/* Same as add_prefix, but prepending target_system_root to prefix.  */
2950/* The target_system_root prefix has been relocated by gcc_exec_prefix.  */
2951static void
2952add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2953		      const char *component,
2954		      /* enum prefix_priority */ int priority,
2955		      int require_machine_suffix, int os_multilib)
2956{
2957  if (!IS_ABSOLUTE_PATH (prefix))
2958    fatal_error (input_location, "system path %qs is not absolute", prefix);
2959
2960  if (target_system_root)
2961    {
2962      char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2963      size_t sysroot_len = strlen (target_system_root);
2964
2965      if (sysroot_len > 0
2966	  && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2967	sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2968
2969      if (target_sysroot_suffix)
2970	prefix = concat (sysroot_no_trailing_dir_separator,
2971			 target_sysroot_suffix, prefix, NULL);
2972      else
2973	prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
2974
2975      free (sysroot_no_trailing_dir_separator);
2976
2977      /* We have to override this because GCC's notion of sysroot
2978	 moves along with GCC.  */
2979      component = "GCC";
2980    }
2981
2982  add_prefix (pprefix, prefix, component, priority,
2983	      require_machine_suffix, os_multilib);
2984}
2985
2986/* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix.  */
2987
2988static void
2989add_sysrooted_hdrs_prefix (struct path_prefix *pprefix, const char *prefix,
2990			   const char *component,
2991			   /* enum prefix_priority */ int priority,
2992			   int require_machine_suffix, int os_multilib)
2993{
2994  if (!IS_ABSOLUTE_PATH (prefix))
2995    fatal_error (input_location, "system path %qs is not absolute", prefix);
2996
2997  if (target_system_root)
2998    {
2999      char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
3000      size_t sysroot_len = strlen (target_system_root);
3001
3002      if (sysroot_len > 0
3003	  && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
3004	sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3005
3006      if (target_sysroot_hdrs_suffix)
3007	prefix = concat (sysroot_no_trailing_dir_separator,
3008			 target_sysroot_hdrs_suffix, prefix, NULL);
3009      else
3010	prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
3011
3012      free (sysroot_no_trailing_dir_separator);
3013
3014      /* We have to override this because GCC's notion of sysroot
3015	 moves along with GCC.  */
3016      component = "GCC";
3017    }
3018
3019  add_prefix (pprefix, prefix, component, priority,
3020	      require_machine_suffix, os_multilib);
3021}
3022
3023
3024/* Execute the command specified by the arguments on the current line of spec.
3025   When using pipes, this includes several piped-together commands
3026   with `|' between them.
3027
3028   Return 0 if successful, -1 if failed.  */
3029
3030static int
3031execute (void)
3032{
3033  int i;
3034  int n_commands;		/* # of command.  */
3035  char *string;
3036  struct pex_obj *pex;
3037  struct command
3038  {
3039    const char *prog;		/* program name.  */
3040    const char **argv;		/* vector of args.  */
3041  };
3042  const char *arg;
3043
3044  struct command *commands;	/* each command buffer with above info.  */
3045
3046  gcc_assert (!processing_spec_function);
3047
3048  if (wrapper_string)
3049    {
3050      string = find_a_file (&exec_prefixes,
3051			    argbuf[0], X_OK, false);
3052      if (string)
3053	argbuf[0] = string;
3054      insert_wrapper (wrapper_string);
3055    }
3056
3057  /* Count # of piped commands.  */
3058  for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3059    if (strcmp (arg, "|") == 0)
3060      n_commands++;
3061
3062  /* Get storage for each command.  */
3063  commands = (struct command *) alloca (n_commands * sizeof (struct command));
3064
3065  /* Split argbuf into its separate piped processes,
3066     and record info about each one.
3067     Also search for the programs that are to be run.  */
3068
3069  argbuf.safe_push (0);
3070
3071  commands[0].prog = argbuf[0]; /* first command.  */
3072  commands[0].argv = argbuf.address ();
3073
3074  if (!wrapper_string)
3075    {
3076      string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
3077      if (string)
3078	commands[0].argv[0] = string;
3079    }
3080
3081  for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3082    if (arg && strcmp (arg, "|") == 0)
3083      {				/* each command.  */
3084#if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3085	fatal_error (input_location, "%<-pipe%> not supported");
3086#endif
3087	argbuf[i] = 0; /* Termination of command args.  */
3088	commands[n_commands].prog = argbuf[i + 1];
3089	commands[n_commands].argv
3090	  = &(argbuf.address ())[i + 1];
3091	string = find_a_file (&exec_prefixes, commands[n_commands].prog,
3092			      X_OK, false);
3093	if (string)
3094	  commands[n_commands].argv[0] = string;
3095	n_commands++;
3096      }
3097
3098  /* If -v, print what we are about to do, and maybe query.  */
3099
3100  if (verbose_flag)
3101    {
3102      /* For help listings, put a blank line between sub-processes.  */
3103      if (print_help_list)
3104	fputc ('\n', stderr);
3105
3106      /* Print each piped command as a separate line.  */
3107      for (i = 0; i < n_commands; i++)
3108	{
3109	  const char *const *j;
3110
3111	  if (verbose_only_flag)
3112	    {
3113	      for (j = commands[i].argv; *j; j++)
3114		{
3115		  const char *p;
3116		  for (p = *j; *p; ++p)
3117		    if (!ISALNUM ((unsigned char) *p)
3118			&& *p != '_' && *p != '/' && *p != '-' && *p != '.')
3119		      break;
3120		  if (*p || !*j)
3121		    {
3122		      fprintf (stderr, " \"");
3123		      for (p = *j; *p; ++p)
3124			{
3125			  if (*p == '"' || *p == '\\' || *p == '$')
3126			    fputc ('\\', stderr);
3127			  fputc (*p, stderr);
3128			}
3129		      fputc ('"', stderr);
3130		    }
3131		  /* If it's empty, print "".  */
3132		  else if (!**j)
3133		    fprintf (stderr, " \"\"");
3134		  else
3135		    fprintf (stderr, " %s", *j);
3136		}
3137	    }
3138	  else
3139	    for (j = commands[i].argv; *j; j++)
3140	      /* If it's empty, print "".  */
3141	      if (!**j)
3142		fprintf (stderr, " \"\"");
3143	      else
3144		fprintf (stderr, " %s", *j);
3145
3146	  /* Print a pipe symbol after all but the last command.  */
3147	  if (i + 1 != n_commands)
3148	    fprintf (stderr, " |");
3149	  fprintf (stderr, "\n");
3150	}
3151      fflush (stderr);
3152      if (verbose_only_flag != 0)
3153        {
3154	  /* verbose_only_flag should act as if the spec was
3155	     executed, so increment execution_count before
3156	     returning.  This prevents spurious warnings about
3157	     unused linker input files, etc.  */
3158	  execution_count++;
3159	  return 0;
3160        }
3161#ifdef DEBUG
3162      fnotice (stderr, "\nGo ahead? (y or n) ");
3163      fflush (stderr);
3164      i = getchar ();
3165      if (i != '\n')
3166	while (getchar () != '\n')
3167	  ;
3168
3169      if (i != 'y' && i != 'Y')
3170	return 0;
3171#endif /* DEBUG */
3172    }
3173
3174#ifdef ENABLE_VALGRIND_CHECKING
3175  /* Run the each command through valgrind.  To simplify prepending the
3176     path to valgrind and the option "-q" (for quiet operation unless
3177     something triggers), we allocate a separate argv array.  */
3178
3179  for (i = 0; i < n_commands; i++)
3180    {
3181      const char **argv;
3182      int argc;
3183      int j;
3184
3185      for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3186	;
3187
3188      argv = XALLOCAVEC (const char *, argc + 3);
3189
3190      argv[0] = VALGRIND_PATH;
3191      argv[1] = "-q";
3192      for (j = 2; j < argc + 2; j++)
3193	argv[j] = commands[i].argv[j - 2];
3194      argv[j] = NULL;
3195
3196      commands[i].argv = argv;
3197      commands[i].prog = argv[0];
3198    }
3199#endif
3200
3201  /* Run each piped subprocess.  */
3202
3203  pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3204				   ? PEX_RECORD_TIMES : 0),
3205		  progname, temp_filename);
3206  if (pex == NULL)
3207    fatal_error (input_location, "%<pex_init%> failed: %m");
3208
3209  for (i = 0; i < n_commands; i++)
3210    {
3211      const char *errmsg;
3212      int err;
3213      const char *string = commands[i].argv[0];
3214
3215      errmsg = pex_run (pex,
3216			((i + 1 == n_commands ? PEX_LAST : 0)
3217			 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3218			string, CONST_CAST (char **, commands[i].argv),
3219			NULL, NULL, &err);
3220      if (errmsg != NULL)
3221	{
3222	  errno = err;
3223	  fatal_error (input_location,
3224		       err ? G_("cannot execute %qs: %s: %m")
3225		       : G_("cannot execute %qs: %s"),
3226		       string, errmsg);
3227	}
3228
3229      if (i && string != commands[i].prog)
3230	free (CONST_CAST (char *, string));
3231    }
3232
3233  execution_count++;
3234
3235  /* Wait for all the subprocesses to finish.  */
3236
3237  {
3238    int *statuses;
3239    struct pex_time *times = NULL;
3240    int ret_code = 0;
3241
3242    statuses = (int *) alloca (n_commands * sizeof (int));
3243    if (!pex_get_status (pex, n_commands, statuses))
3244      fatal_error (input_location, "failed to get exit status: %m");
3245
3246    if (report_times || report_times_to_file)
3247      {
3248	times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
3249	if (!pex_get_times (pex, n_commands, times))
3250	  fatal_error (input_location, "failed to get process times: %m");
3251      }
3252
3253    pex_free (pex);
3254
3255    for (i = 0; i < n_commands; ++i)
3256      {
3257	int status = statuses[i];
3258
3259	if (WIFSIGNALED (status))
3260	  switch (WTERMSIG (status))
3261	    {
3262	    case SIGINT:
3263	    case SIGTERM:
3264	      /* SIGQUIT and SIGKILL are not available on MinGW.  */
3265#ifdef SIGQUIT
3266	    case SIGQUIT:
3267#endif
3268#ifdef SIGKILL
3269	    case SIGKILL:
3270#endif
3271	      /* The user (or environment) did something to the
3272		 inferior.  Making this an ICE confuses the user into
3273		 thinking there's a compiler bug.  Much more likely is
3274		 the user or OOM killer nuked it.  */
3275	      fatal_error (input_location,
3276			   "%s signal terminated program %s",
3277			   strsignal (WTERMSIG (status)),
3278			   commands[i].prog);
3279	      break;
3280
3281#ifdef SIGPIPE
3282	    case SIGPIPE:
3283	      /* SIGPIPE is a special case.  It happens in -pipe mode
3284		 when the compiler dies before the preprocessor is
3285		 done, or the assembler dies before the compiler is
3286		 done.  There's generally been an error already, and
3287		 this is just fallout.  So don't generate another
3288		 error unless we would otherwise have succeeded.  */
3289	      if (signal_count || greatest_status >= MIN_FATAL_STATUS)
3290		{
3291		  signal_count++;
3292		  ret_code = -1;
3293		  break;
3294		}
3295#endif
3296	      /* FALLTHROUGH */
3297
3298	    default:
3299	      /* The inferior failed to catch the signal.  */
3300	      internal_error_no_backtrace ("%s signal terminated program %s",
3301					   strsignal (WTERMSIG (status)),
3302					   commands[i].prog);
3303	    }
3304	else if (WIFEXITED (status)
3305		 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3306	  {
3307	    /* For ICEs in cc1, cc1obj, cc1plus see if it is
3308	       reproducible or not.  */
3309	    const char *p;
3310	    if (flag_report_bug
3311		&& WEXITSTATUS (status) == ICE_EXIT_CODE
3312		&& i == 0
3313		&& (p = strrchr (commands[0].argv[0], DIR_SEPARATOR))
3314		&& ! strncmp (p + 1, "cc1", 3))
3315	      try_generate_repro (commands[0].argv);
3316	    if (WEXITSTATUS (status) > greatest_status)
3317	      greatest_status = WEXITSTATUS (status);
3318	    ret_code = -1;
3319	  }
3320
3321	if (report_times || report_times_to_file)
3322	  {
3323	    struct pex_time *pt = &times[i];
3324	    double ut, st;
3325
3326	    ut = ((double) pt->user_seconds
3327		  + (double) pt->user_microseconds / 1.0e6);
3328	    st = ((double) pt->system_seconds
3329		  + (double) pt->system_microseconds / 1.0e6);
3330
3331	    if (ut + st != 0)
3332	      {
3333		if (report_times)
3334		  fnotice (stderr, "# %s %.2f %.2f\n",
3335			   commands[i].prog, ut, st);
3336
3337		if (report_times_to_file)
3338		  {
3339		    int c = 0;
3340		    const char *const *j;
3341
3342		    fprintf (report_times_to_file, "%g %g", ut, st);
3343
3344		    for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3345		      {
3346			const char *p;
3347			for (p = *j; *p; ++p)
3348			  if (*p == '"' || *p == '\\' || *p == '$'
3349			      || ISSPACE (*p))
3350			    break;
3351
3352			if (*p)
3353			  {
3354			    fprintf (report_times_to_file, " \"");
3355			    for (p = *j; *p; ++p)
3356			      {
3357				if (*p == '"' || *p == '\\' || *p == '$')
3358				  fputc ('\\', report_times_to_file);
3359				fputc (*p, report_times_to_file);
3360			      }
3361			    fputc ('"', report_times_to_file);
3362			  }
3363			else
3364			  fprintf (report_times_to_file, " %s", *j);
3365		      }
3366
3367		    fputc ('\n', report_times_to_file);
3368		  }
3369	      }
3370	  }
3371      }
3372
3373   if (commands[0].argv[0] != commands[0].prog)
3374     free (CONST_CAST (char *, commands[0].argv[0]));
3375
3376    return ret_code;
3377  }
3378}
3379
3380/* Find all the switches given to us
3381   and make a vector describing them.
3382   The elements of the vector are strings, one per switch given.
3383   If a switch uses following arguments, then the `part1' field
3384   is the switch itself and the `args' field
3385   is a null-terminated vector containing the following arguments.
3386   Bits in the `live_cond' field are:
3387   SWITCH_LIVE to indicate this switch is true in a conditional spec.
3388   SWITCH_FALSE to indicate this switch is overridden by a later switch.
3389   SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3390   SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored.
3391   SWITCH_KEEP_FOR_GCC to indicate that this switch, otherwise ignored,
3392   should be included in COLLECT_GCC_OPTIONS.
3393   in all do_spec calls afterwards.  Used for %<S from self specs.
3394   The `known' field describes whether this is an internal switch.
3395   The `validated' field describes whether any spec has looked at this switch;
3396   if it remains false at the end of the run, the switch must be meaningless.
3397   The `ordering' field is used to temporarily mark switches that have to be
3398   kept in a specific order.  */
3399
3400#define SWITCH_LIVE    			(1 << 0)
3401#define SWITCH_FALSE   			(1 << 1)
3402#define SWITCH_IGNORE			(1 << 2)
3403#define SWITCH_IGNORE_PERMANENTLY	(1 << 3)
3404#define SWITCH_KEEP_FOR_GCC		(1 << 4)
3405
3406struct switchstr
3407{
3408  const char *part1;
3409  const char **args;
3410  unsigned int live_cond;
3411  bool known;
3412  bool validated;
3413  bool ordering;
3414};
3415
3416static struct switchstr *switches;
3417
3418static int n_switches;
3419
3420static int n_switches_alloc;
3421
3422/* Set to zero if -fcompare-debug is disabled, positive if it's
3423   enabled and we're running the first compilation, negative if it's
3424   enabled and we're running the second compilation.  For most of the
3425   time, it's in the range -1..1, but it can be temporarily set to 2
3426   or 3 to indicate that the -fcompare-debug flags didn't come from
3427   the command-line, but rather from the GCC_COMPARE_DEBUG environment
3428   variable, until a synthesized -fcompare-debug flag is added to the
3429   command line.  */
3430int compare_debug;
3431
3432/* Set to nonzero if we've seen the -fcompare-debug-second flag.  */
3433int compare_debug_second;
3434
3435/* Set to the flags that should be passed to the second compilation in
3436   a -fcompare-debug compilation.  */
3437const char *compare_debug_opt;
3438
3439static struct switchstr *switches_debug_check[2];
3440
3441static int n_switches_debug_check[2];
3442
3443static int n_switches_alloc_debug_check[2];
3444
3445static char *debug_check_temp_file[2];
3446
3447/* Language is one of three things:
3448
3449   1) The name of a real programming language.
3450   2) NULL, indicating that no one has figured out
3451   what it is yet.
3452   3) '*', indicating that the file should be passed
3453   to the linker.  */
3454struct infile
3455{
3456  const char *name;
3457  const char *language;
3458  struct compiler *incompiler;
3459  bool compiled;
3460  bool preprocessed;
3461};
3462
3463/* Also a vector of input files specified.  */
3464
3465static struct infile *infiles;
3466
3467int n_infiles;
3468
3469static int n_infiles_alloc;
3470
3471/* True if undefined environment variables encountered during spec processing
3472   are ok to ignore, typically when we're running for --help or --version.  */
3473
3474static bool spec_undefvar_allowed;
3475
3476/* True if multiple input files are being compiled to a single
3477   assembly file.  */
3478
3479static bool combine_inputs;
3480
3481/* This counts the number of libraries added by lang_specific_driver, so that
3482   we can tell if there were any user supplied any files or libraries.  */
3483
3484static int added_libraries;
3485
3486/* And a vector of corresponding output files is made up later.  */
3487
3488const char **outfiles;
3489
3490#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3491
3492/* Convert NAME to a new name if it is the standard suffix.  DO_EXE
3493   is true if we should look for an executable suffix.  DO_OBJ
3494   is true if we should look for an object suffix.  */
3495
3496static const char *
3497convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3498		  int do_obj ATTRIBUTE_UNUSED)
3499{
3500#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3501  int i;
3502#endif
3503  int len;
3504
3505  if (name == NULL)
3506    return NULL;
3507
3508  len = strlen (name);
3509
3510#ifdef HAVE_TARGET_OBJECT_SUFFIX
3511  /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj".  */
3512  if (do_obj && len > 2
3513      && name[len - 2] == '.'
3514      && name[len - 1] == 'o')
3515    {
3516      obstack_grow (&obstack, name, len - 2);
3517      obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3518      name = XOBFINISH (&obstack, const char *);
3519    }
3520#endif
3521
3522#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3523  /* If there is no filetype, make it the executable suffix (which includes
3524     the ".").  But don't get confused if we have just "-o".  */
3525  if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3526    return name;
3527
3528  for (i = len - 1; i >= 0; i--)
3529    if (IS_DIR_SEPARATOR (name[i]))
3530      break;
3531
3532  for (i++; i < len; i++)
3533    if (name[i] == '.')
3534      return name;
3535
3536  obstack_grow (&obstack, name, len);
3537  obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3538		 strlen (TARGET_EXECUTABLE_SUFFIX));
3539  name = XOBFINISH (&obstack, const char *);
3540#endif
3541
3542  return name;
3543}
3544#endif
3545
3546/* Display the command line switches accepted by gcc.  */
3547static void
3548display_help (void)
3549{
3550  printf (_("Usage: %s [options] file...\n"), progname);
3551  fputs (_("Options:\n"), stdout);
3552
3553  fputs (_("  -pass-exit-codes         Exit with highest error code from a phase.\n"), stdout);
3554  fputs (_("  --help                   Display this information.\n"), stdout);
3555  fputs (_("  --target-help            Display target specific command line options.\n"), stdout);
3556  fputs (_("  --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"), stdout);
3557  fputs (_("                           Display specific types of command line options.\n"), stdout);
3558  if (! verbose_flag)
3559    fputs (_("  (Use '-v --help' to display command line options of sub-processes).\n"), stdout);
3560  fputs (_("  --version                Display compiler version information.\n"), stdout);
3561  fputs (_("  -dumpspecs               Display all of the built in spec strings.\n"), stdout);
3562  fputs (_("  -dumpversion             Display the version of the compiler.\n"), stdout);
3563  fputs (_("  -dumpmachine             Display the compiler's target processor.\n"), stdout);
3564  fputs (_("  -print-search-dirs       Display the directories in the compiler's search path.\n"), stdout);
3565  fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library.\n"), stdout);
3566  fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>.\n"), stdout);
3567  fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>.\n"), stdout);
3568  fputs (_("\
3569  -print-multiarch         Display the target's normalized GNU triplet, used as\n\
3570                           a component in the library path.\n"), stdout);
3571  fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc.\n"), stdout);
3572  fputs (_("\
3573  -print-multi-lib         Display the mapping between command line options and\n\
3574                           multiple library search directories.\n"), stdout);
3575  fputs (_("  -print-multi-os-directory Display the relative path to OS libraries.\n"), stdout);
3576  fputs (_("  -print-sysroot           Display the target libraries directory.\n"), stdout);
3577  fputs (_("  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"), stdout);
3578  fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler.\n"), stdout);
3579  fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor.\n"), stdout);
3580  fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker.\n"), stdout);
3581  fputs (_("  -Xassembler <arg>        Pass <arg> on to the assembler.\n"), stdout);
3582  fputs (_("  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor.\n"), stdout);
3583  fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker.\n"), stdout);
3584  fputs (_("  -save-temps              Do not delete intermediate files.\n"), stdout);
3585  fputs (_("  -save-temps=<arg>        Do not delete intermediate files.\n"), stdout);
3586  fputs (_("\
3587  -no-canonical-prefixes   Do not canonicalize paths when building relative\n\
3588                           prefixes to other gcc components.\n"), stdout);
3589  fputs (_("  -pipe                    Use pipes rather than intermediate files.\n"), stdout);
3590  fputs (_("  -time                    Time the execution of each subprocess.\n"), stdout);
3591  fputs (_("  -specs=<file>            Override built-in specs with the contents of <file>.\n"), stdout);
3592  fputs (_("  -std=<standard>          Assume that the input sources are for <standard>.\n"), stdout);
3593  fputs (_("\
3594  --sysroot=<directory>    Use <directory> as the root directory for headers\n\
3595                           and libraries.\n"), stdout);
3596  fputs (_("  -B <directory>           Add <directory> to the compiler's search paths.\n"), stdout);
3597  fputs (_("  -v                       Display the programs invoked by the compiler.\n"), stdout);
3598  fputs (_("  -###                     Like -v but options quoted and commands not executed.\n"), stdout);
3599  fputs (_("  -E                       Preprocess only; do not compile, assemble or link.\n"), stdout);
3600  fputs (_("  -S                       Compile only; do not assemble or link.\n"), stdout);
3601  fputs (_("  -c                       Compile and assemble, but do not link.\n"), stdout);
3602  fputs (_("  -o <file>                Place the output into <file>.\n"), stdout);
3603  fputs (_("  -pie                     Create a dynamically linked position independent\n\
3604                           executable.\n"), stdout);
3605  fputs (_("  -shared                  Create a shared library.\n"), stdout);
3606  fputs (_("\
3607  -x <language>            Specify the language of the following input files.\n\
3608                           Permissible languages include: c c++ assembler none\n\
3609                           'none' means revert to the default behavior of\n\
3610                           guessing the language based on the file's extension.\n\
3611"), stdout);
3612
3613  printf (_("\
3614\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3615 passed on to the various sub-processes invoked by %s.  In order to pass\n\
3616 other options on to these processes the -W<letter> options must be used.\n\
3617"), progname);
3618
3619  /* The rest of the options are displayed by invocations of the various
3620     sub-processes.  */
3621}
3622
3623static void
3624add_preprocessor_option (const char *option, int len)
3625{
3626  preprocessor_options.safe_push (save_string (option, len));
3627}
3628
3629static void
3630add_assembler_option (const char *option, int len)
3631{
3632  assembler_options.safe_push (save_string (option, len));
3633}
3634
3635static void
3636add_linker_option (const char *option, int len)
3637{
3638  linker_options.safe_push (save_string (option, len));
3639}
3640
3641/* Allocate space for an input file in infiles.  */
3642
3643static void
3644alloc_infile (void)
3645{
3646  if (n_infiles_alloc == 0)
3647    {
3648      n_infiles_alloc = 16;
3649      infiles = XNEWVEC (struct infile, n_infiles_alloc);
3650    }
3651  else if (n_infiles_alloc == n_infiles)
3652    {
3653      n_infiles_alloc *= 2;
3654      infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3655    }
3656}
3657
3658/* Store an input file with the given NAME and LANGUAGE in
3659   infiles.  */
3660
3661static void
3662add_infile (const char *name, const char *language)
3663{
3664  alloc_infile ();
3665  infiles[n_infiles].name = name;
3666  infiles[n_infiles++].language = language;
3667}
3668
3669/* Allocate space for a switch in switches.  */
3670
3671static void
3672alloc_switch (void)
3673{
3674  if (n_switches_alloc == 0)
3675    {
3676      n_switches_alloc = 16;
3677      switches = XNEWVEC (struct switchstr, n_switches_alloc);
3678    }
3679  else if (n_switches_alloc == n_switches)
3680    {
3681      n_switches_alloc *= 2;
3682      switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3683    }
3684}
3685
3686/* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3687   as validated if VALIDATED and KNOWN if it is an internal switch.  */
3688
3689static void
3690save_switch (const char *opt, size_t n_args, const char *const *args,
3691	     bool validated, bool known)
3692{
3693  alloc_switch ();
3694  switches[n_switches].part1 = opt + 1;
3695  if (n_args == 0)
3696    switches[n_switches].args = 0;
3697  else
3698    {
3699      switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3700      memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3701      switches[n_switches].args[n_args] = NULL;
3702    }
3703
3704  switches[n_switches].live_cond = 0;
3705  switches[n_switches].validated = validated;
3706  switches[n_switches].known = known;
3707  switches[n_switches].ordering = 0;
3708  n_switches++;
3709}
3710
3711/* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3712   not set already.  */
3713
3714static void
3715set_source_date_epoch_envvar ()
3716{
3717  /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3718     of 64 bit integers.  */
3719  char source_date_epoch[21];
3720  time_t tt;
3721
3722  errno = 0;
3723  tt = time (NULL);
3724  if (tt < (time_t) 0 || errno != 0)
3725    tt = (time_t) 0;
3726
3727  snprintf (source_date_epoch, 21, "%llu", (unsigned long long) tt);
3728  /* Using setenv instead of xputenv because we want the variable to remain
3729     after finalizing so that it's still set in the second run when using
3730     -fcompare-debug.  */
3731  setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0);
3732}
3733
3734/* Handle an option DECODED that is unknown to the option-processing
3735   machinery.  */
3736
3737static bool
3738driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3739{
3740  const char *opt = decoded->arg;
3741  if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3742      && !(decoded->errors & CL_ERR_NEGATIVE))
3743    {
3744      /* Leave unknown -Wno-* options for the compiler proper, to be
3745	 diagnosed only if there are warnings.  */
3746      save_switch (decoded->canonical_option[0],
3747		   decoded->canonical_option_num_elements - 1,
3748		   &decoded->canonical_option[1], false, true);
3749      return false;
3750    }
3751  if (decoded->opt_index == OPT_SPECIAL_unknown)
3752    {
3753      /* Give it a chance to define it a spec file.  */
3754      save_switch (decoded->canonical_option[0],
3755		   decoded->canonical_option_num_elements - 1,
3756		   &decoded->canonical_option[1], false, false);
3757      return false;
3758    }
3759  else
3760    return true;
3761}
3762
3763/* Handle an option DECODED that is not marked as CL_DRIVER.
3764   LANG_MASK will always be CL_DRIVER.  */
3765
3766static void
3767driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3768			    unsigned int lang_mask ATTRIBUTE_UNUSED)
3769{
3770  /* At this point, non-driver options are accepted (and expected to
3771     be passed down by specs) unless marked to be rejected by the
3772     driver.  Options to be rejected by the driver but accepted by the
3773     compilers proper are treated just like completely unknown
3774     options.  */
3775  const struct cl_option *option = &cl_options[decoded->opt_index];
3776
3777  if (option->cl_reject_driver)
3778    error ("unrecognized command-line option %qs",
3779	   decoded->orig_option_with_args_text);
3780  else
3781    save_switch (decoded->canonical_option[0],
3782		 decoded->canonical_option_num_elements - 1,
3783		 &decoded->canonical_option[1], false, true);
3784}
3785
3786static const char *spec_lang = 0;
3787static int last_language_n_infiles;
3788
3789/* Parse -foffload option argument.  */
3790
3791static void
3792handle_foffload_option (const char *arg)
3793{
3794  const char *c, *cur, *n, *next, *end;
3795  char *target;
3796
3797  /* If option argument starts with '-' then no target is specified and we
3798     do not need to parse it.  */
3799  if (arg[0] == '-')
3800    return;
3801
3802  end = strchr (arg, '=');
3803  if (end == NULL)
3804    end = strchr (arg, '\0');
3805  cur = arg;
3806
3807  while (cur < end)
3808    {
3809      next = strchr (cur, ',');
3810      if (next == NULL)
3811	next = end;
3812      next = (next > end) ? end : next;
3813
3814      target = XNEWVEC (char, next - cur + 1);
3815      memcpy (target, cur, next - cur);
3816      target[next - cur] = '\0';
3817
3818      /* If 'disable' is passed to the option, stop parsing the option and clean
3819         the list of offload targets.  */
3820      if (strcmp (target, "disable") == 0)
3821	{
3822	  free (offload_targets);
3823	  offload_targets = xstrdup ("");
3824	  break;
3825	}
3826
3827      /* Check that GCC is configured to support the offload target.  */
3828      c = OFFLOAD_TARGETS;
3829      while (c)
3830	{
3831	  n = strchr (c, ',');
3832	  if (n == NULL)
3833	    n = strchr (c, '\0');
3834
3835	  if (next - cur == n - c && strncmp (target, c, n - c) == 0)
3836	    break;
3837
3838	  c = *n ? n + 1 : NULL;
3839	}
3840
3841      if (!c)
3842	fatal_error (input_location,
3843		     "GCC is not configured to support %s as offload target",
3844		     target);
3845
3846      if (!offload_targets)
3847	{
3848	  offload_targets = target;
3849	  target = NULL;
3850	}
3851      else
3852	{
3853	  /* Check that the target hasn't already presented in the list.  */
3854	  c = offload_targets;
3855	  do
3856	    {
3857	      n = strchr (c, ':');
3858	      if (n == NULL)
3859		n = strchr (c, '\0');
3860
3861	      if (next - cur == n - c && strncmp (c, target, n - c) == 0)
3862		break;
3863
3864	      c = n + 1;
3865	    }
3866	  while (*n);
3867
3868	  /* If duplicate is not found, append the target to the list.  */
3869	  if (c > n)
3870	    {
3871	      size_t offload_targets_len = strlen (offload_targets);
3872	      offload_targets
3873		= XRESIZEVEC (char, offload_targets,
3874			      offload_targets_len + 1 + next - cur + 1);
3875	      offload_targets[offload_targets_len++] = ':';
3876	      memcpy (offload_targets + offload_targets_len, target, next - cur + 1);
3877	    }
3878	}
3879
3880      cur = next + 1;
3881      XDELETEVEC (target);
3882    }
3883}
3884
3885/* Handle a driver option; arguments and return value as for
3886   handle_option.  */
3887
3888static bool
3889driver_handle_option (struct gcc_options *opts,
3890		      struct gcc_options *opts_set,
3891		      const struct cl_decoded_option *decoded,
3892		      unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
3893		      location_t loc,
3894		      const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
3895		      diagnostic_context *dc,
3896		      void (*) (void))
3897{
3898  size_t opt_index = decoded->opt_index;
3899  const char *arg = decoded->arg;
3900  const char *compare_debug_replacement_opt;
3901  int value = decoded->value;
3902  bool validated = false;
3903  bool do_save = true;
3904
3905  gcc_assert (opts == &global_options);
3906  gcc_assert (opts_set == &global_options_set);
3907  gcc_assert (kind == DK_UNSPECIFIED);
3908  gcc_assert (loc == UNKNOWN_LOCATION);
3909  gcc_assert (dc == global_dc);
3910
3911  switch (opt_index)
3912    {
3913    case OPT_dumpspecs:
3914      {
3915	struct spec_list *sl;
3916	init_spec ();
3917	for (sl = specs; sl; sl = sl->next)
3918	  printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3919	if (link_command_spec)
3920	  printf ("*link_command:\n%s\n\n", link_command_spec);
3921	exit (0);
3922      }
3923
3924    case OPT_dumpversion:
3925      printf ("%s\n", spec_version);
3926      exit (0);
3927
3928    case OPT_dumpmachine:
3929      printf ("%s\n", spec_machine);
3930      exit (0);
3931
3932    case OPT_dumpfullversion:
3933      printf ("%s\n", BASEVER);
3934      exit (0);
3935
3936    case OPT__version:
3937      print_version = 1;
3938
3939      /* CPP driver cannot obtain switch from cc1_options.  */
3940      if (is_cpp_driver)
3941	add_preprocessor_option ("--version", strlen ("--version"));
3942      add_assembler_option ("--version", strlen ("--version"));
3943      add_linker_option ("--version", strlen ("--version"));
3944      break;
3945
3946    case OPT__completion_:
3947      validated = true;
3948      completion = decoded->arg;
3949      break;
3950
3951    case OPT__help:
3952      print_help_list = 1;
3953
3954      /* CPP driver cannot obtain switch from cc1_options.  */
3955      if (is_cpp_driver)
3956	add_preprocessor_option ("--help", 6);
3957      add_assembler_option ("--help", 6);
3958      add_linker_option ("--help", 6);
3959      break;
3960
3961    case OPT__help_:
3962      print_subprocess_help = 2;
3963      break;
3964
3965    case OPT__target_help:
3966      print_subprocess_help = 1;
3967
3968      /* CPP driver cannot obtain switch from cc1_options.  */
3969      if (is_cpp_driver)
3970	add_preprocessor_option ("--target-help", 13);
3971      add_assembler_option ("--target-help", 13);
3972      add_linker_option ("--target-help", 13);
3973      break;
3974
3975    case OPT__no_sysroot_suffix:
3976    case OPT_pass_exit_codes:
3977    case OPT_print_search_dirs:
3978    case OPT_print_file_name_:
3979    case OPT_print_prog_name_:
3980    case OPT_print_multi_lib:
3981    case OPT_print_multi_directory:
3982    case OPT_print_sysroot:
3983    case OPT_print_multi_os_directory:
3984    case OPT_print_multiarch:
3985    case OPT_print_sysroot_headers_suffix:
3986    case OPT_time:
3987    case OPT_wrapper:
3988      /* These options set the variables specified in common.opt
3989	 automatically, and do not need to be saved for spec
3990	 processing.  */
3991      do_save = false;
3992      break;
3993
3994    case OPT_print_libgcc_file_name:
3995      print_file_name = "libgcc.a";
3996      do_save = false;
3997      break;
3998
3999    case OPT_fuse_ld_bfd:
4000       use_ld = ".bfd";
4001       break;
4002
4003    case OPT_fuse_ld_gold:
4004       use_ld = ".gold";
4005       break;
4006
4007    case OPT_fcompare_debug_second:
4008      compare_debug_second = 1;
4009      break;
4010
4011    case OPT_fcompare_debug:
4012      switch (value)
4013	{
4014	case 0:
4015	  compare_debug_replacement_opt = "-fcompare-debug=";
4016	  arg = "";
4017	  goto compare_debug_with_arg;
4018
4019	case 1:
4020	  compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
4021	  arg = "-gtoggle";
4022	  goto compare_debug_with_arg;
4023
4024	default:
4025	  gcc_unreachable ();
4026	}
4027      break;
4028
4029    case OPT_fcompare_debug_:
4030      compare_debug_replacement_opt = decoded->canonical_option[0];
4031    compare_debug_with_arg:
4032      gcc_assert (decoded->canonical_option_num_elements == 1);
4033      gcc_assert (arg != NULL);
4034      if (*arg)
4035	compare_debug = 1;
4036      else
4037	compare_debug = -1;
4038      if (compare_debug < 0)
4039	compare_debug_opt = NULL;
4040      else
4041	compare_debug_opt = arg;
4042      save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
4043      set_source_date_epoch_envvar ();
4044      return true;
4045
4046    case OPT_fdiagnostics_color_:
4047      diagnostic_color_init (dc, value);
4048      break;
4049
4050    case OPT_fdiagnostics_urls_:
4051      diagnostic_urls_init (dc, value);
4052      break;
4053
4054    case OPT_fdiagnostics_format_:
4055      diagnostic_output_format_init (dc,
4056				     (enum diagnostics_output_format)value);
4057      break;
4058
4059    case OPT_Wa_:
4060      {
4061	int prev, j;
4062	/* Pass the rest of this option to the assembler.  */
4063
4064	/* Split the argument at commas.  */
4065	prev = 0;
4066	for (j = 0; arg[j]; j++)
4067	  if (arg[j] == ',')
4068	    {
4069	      add_assembler_option (arg + prev, j - prev);
4070	      prev = j + 1;
4071	    }
4072
4073	/* Record the part after the last comma.  */
4074	add_assembler_option (arg + prev, j - prev);
4075      }
4076      do_save = false;
4077      break;
4078
4079    case OPT_Wp_:
4080      {
4081	int prev, j;
4082	/* Pass the rest of this option to the preprocessor.  */
4083
4084	/* Split the argument at commas.  */
4085	prev = 0;
4086	for (j = 0; arg[j]; j++)
4087	  if (arg[j] == ',')
4088	    {
4089	      add_preprocessor_option (arg + prev, j - prev);
4090	      prev = j + 1;
4091	    }
4092
4093	/* Record the part after the last comma.  */
4094	add_preprocessor_option (arg + prev, j - prev);
4095      }
4096      do_save = false;
4097      break;
4098
4099    case OPT_Wl_:
4100      {
4101	int prev, j;
4102	/* Split the argument at commas.  */
4103	prev = 0;
4104	for (j = 0; arg[j]; j++)
4105	  if (arg[j] == ',')
4106	    {
4107	      add_infile (save_string (arg + prev, j - prev), "*");
4108	      prev = j + 1;
4109	    }
4110	/* Record the part after the last comma.  */
4111	add_infile (arg + prev, "*");
4112      }
4113      do_save = false;
4114      break;
4115
4116    case OPT_Xlinker:
4117      add_infile (arg, "*");
4118      do_save = false;
4119      break;
4120
4121    case OPT_Xpreprocessor:
4122      add_preprocessor_option (arg, strlen (arg));
4123      do_save = false;
4124      break;
4125
4126    case OPT_Xassembler:
4127      add_assembler_option (arg, strlen (arg));
4128      do_save = false;
4129      break;
4130
4131    case OPT_l:
4132      /* POSIX allows separation of -l and the lib arg; canonicalize
4133	 by concatenating -l with its arg */
4134      add_infile (concat ("-l", arg, NULL), "*");
4135      do_save = false;
4136      break;
4137
4138    case OPT_L:
4139      /* Similarly, canonicalize -L for linkers that may not accept
4140	 separate arguments.  */
4141      save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
4142      return true;
4143
4144    case OPT_F:
4145      /* Likewise -F.  */
4146      save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
4147      return true;
4148
4149    case OPT_save_temps:
4150      save_temps_flag = SAVE_TEMPS_CWD;
4151      validated = true;
4152      break;
4153
4154    case OPT_save_temps_:
4155      if (strcmp (arg, "cwd") == 0)
4156	save_temps_flag = SAVE_TEMPS_CWD;
4157      else if (strcmp (arg, "obj") == 0
4158	       || strcmp (arg, "object") == 0)
4159	save_temps_flag = SAVE_TEMPS_OBJ;
4160      else
4161	fatal_error (input_location, "%qs is an unknown %<-save-temps%> option",
4162		     decoded->orig_option_with_args_text);
4163      break;
4164
4165    case OPT_no_canonical_prefixes:
4166      /* Already handled as a special case, so ignored here.  */
4167      do_save = false;
4168      break;
4169
4170    case OPT_pipe:
4171      validated = true;
4172      /* These options set the variables specified in common.opt
4173	 automatically, but do need to be saved for spec
4174	 processing.  */
4175      break;
4176
4177    case OPT_specs_:
4178      {
4179	struct user_specs *user = XNEW (struct user_specs);
4180
4181	user->next = (struct user_specs *) 0;
4182	user->filename = arg;
4183	if (user_specs_tail)
4184	  user_specs_tail->next = user;
4185	else
4186	  user_specs_head = user;
4187	user_specs_tail = user;
4188      }
4189      validated = true;
4190      break;
4191
4192    case OPT__sysroot_:
4193      target_system_root = arg;
4194      target_system_root_changed = 1;
4195      do_save = false;
4196      break;
4197
4198    case OPT_time_:
4199      if (report_times_to_file)
4200	fclose (report_times_to_file);
4201      report_times_to_file = fopen (arg, "a");
4202      do_save = false;
4203      break;
4204
4205    case OPT____:
4206      /* "-###"
4207	 This is similar to -v except that there is no execution
4208	 of the commands and the echoed arguments are quoted.  It
4209	 is intended for use in shell scripts to capture the
4210	 driver-generated command line.  */
4211      verbose_only_flag++;
4212      verbose_flag = 1;
4213      do_save = false;
4214      break;
4215
4216    case OPT_B:
4217      {
4218	size_t len = strlen (arg);
4219
4220	/* Catch the case where the user has forgotten to append a
4221	   directory separator to the path.  Note, they may be using
4222	   -B to add an executable name prefix, eg "i386-elf-", in
4223	   order to distinguish between multiple installations of
4224	   GCC in the same directory.  Hence we must check to see
4225	   if appending a directory separator actually makes a
4226	   valid directory name.  */
4227	if (!IS_DIR_SEPARATOR (arg[len - 1])
4228	    && is_directory (arg, false))
4229	  {
4230	    char *tmp = XNEWVEC (char, len + 2);
4231	    strcpy (tmp, arg);
4232	    tmp[len] = DIR_SEPARATOR;
4233	    tmp[++len] = 0;
4234	    arg = tmp;
4235	  }
4236
4237	add_prefix (&exec_prefixes, arg, NULL,
4238		    PREFIX_PRIORITY_B_OPT, 0, 0);
4239	add_prefix (&startfile_prefixes, arg, NULL,
4240		    PREFIX_PRIORITY_B_OPT, 0, 0);
4241	add_prefix (&include_prefixes, arg, NULL,
4242		    PREFIX_PRIORITY_B_OPT, 0, 0);
4243      }
4244      validated = true;
4245      break;
4246
4247    case OPT_E:
4248      have_E = true;
4249      break;
4250
4251    case OPT_x:
4252      spec_lang = arg;
4253      if (!strcmp (spec_lang, "none"))
4254	/* Suppress the warning if -xnone comes after the last input
4255	   file, because alternate command interfaces like g++ might
4256	   find it useful to place -xnone after each input file.  */
4257	spec_lang = 0;
4258      else
4259	last_language_n_infiles = n_infiles;
4260      do_save = false;
4261      break;
4262
4263    case OPT_o:
4264      have_o = 1;
4265#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4266      arg = convert_filename (arg, ! have_c, 0);
4267#endif
4268      output_file = arg;
4269      /* Save the output name in case -save-temps=obj was used.  */
4270      save_temps_prefix = xstrdup (arg);
4271      /* On some systems, ld cannot handle "-o" without a space.  So
4272	 split the option from its argument.  */
4273      save_switch ("-o", 1, &arg, validated, true);
4274      return true;
4275
4276#ifdef ENABLE_DEFAULT_PIE
4277    case OPT_pie:
4278      /* -pie is turned on by default.  */
4279#endif
4280
4281    case OPT_static_libgcc:
4282    case OPT_shared_libgcc:
4283    case OPT_static_libgfortran:
4284    case OPT_static_libstdc__:
4285      /* These are always valid, since gcc.c itself understands the
4286	 first two, gfortranspec.c understands -static-libgfortran and
4287	 g++spec.c understands -static-libstdc++ */
4288      validated = true;
4289      break;
4290
4291    case OPT_fwpa:
4292      flag_wpa = "";
4293      break;
4294
4295    case OPT_foffload_:
4296      handle_foffload_option (arg);
4297      break;
4298
4299    default:
4300      /* Various driver options need no special processing at this
4301	 point, having been handled in a prescan above or being
4302	 handled by specs.  */
4303      break;
4304    }
4305
4306  if (do_save)
4307    save_switch (decoded->canonical_option[0],
4308		 decoded->canonical_option_num_elements - 1,
4309		 &decoded->canonical_option[1], validated, true);
4310  return true;
4311}
4312
4313/* Put the driver's standard set of option handlers in *HANDLERS.  */
4314
4315static void
4316set_option_handlers (struct cl_option_handlers *handlers)
4317{
4318  handlers->unknown_option_callback = driver_unknown_option_callback;
4319  handlers->wrong_lang_callback = driver_wrong_lang_callback;
4320  handlers->num_handlers = 3;
4321  handlers->handlers[0].handler = driver_handle_option;
4322  handlers->handlers[0].mask = CL_DRIVER;
4323  handlers->handlers[1].handler = common_handle_option;
4324  handlers->handlers[1].mask = CL_COMMON;
4325  handlers->handlers[2].handler = target_handle_option;
4326  handlers->handlers[2].mask = CL_TARGET;
4327}
4328
4329/* Create the vector `switches' and its contents.
4330   Store its length in `n_switches'.  */
4331
4332static void
4333process_command (unsigned int decoded_options_count,
4334		 struct cl_decoded_option *decoded_options)
4335{
4336  const char *temp;
4337  char *temp1;
4338  char *tooldir_prefix, *tooldir_prefix2;
4339  char *(*get_relative_prefix) (const char *, const char *,
4340				const char *) = NULL;
4341  struct cl_option_handlers handlers;
4342  unsigned int j;
4343
4344  gcc_exec_prefix = env.get ("GCC_EXEC_PREFIX");
4345
4346  n_switches = 0;
4347  n_infiles = 0;
4348  added_libraries = 0;
4349
4350  /* Figure compiler version from version string.  */
4351
4352  compiler_version = temp1 = xstrdup (version_string);
4353
4354  for (; *temp1; ++temp1)
4355    {
4356      if (*temp1 == ' ')
4357	{
4358	  *temp1 = '\0';
4359	  break;
4360	}
4361    }
4362
4363  /* Handle any -no-canonical-prefixes flag early, to assign the function
4364     that builds relative prefixes.  This function creates default search
4365     paths that are needed later in normal option handling.  */
4366
4367  for (j = 1; j < decoded_options_count; j++)
4368    {
4369      if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
4370	{
4371	  get_relative_prefix = make_relative_prefix_ignore_links;
4372	  break;
4373	}
4374    }
4375  if (! get_relative_prefix)
4376    get_relative_prefix = make_relative_prefix;
4377
4378  /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
4379     see if we can create it from the pathname specified in
4380     decoded_options[0].arg.  */
4381
4382  gcc_libexec_prefix = standard_libexec_prefix;
4383#ifndef VMS
4384  /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
4385  if (!gcc_exec_prefix)
4386    {
4387#ifdef NETBSD_NATIVE
4388      add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4389		  PREFIX_PRIORITY_LAST, 0, 0);
4390#else
4391      gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
4392					     standard_bindir_prefix,
4393					     standard_exec_prefix);
4394      gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
4395					     standard_bindir_prefix,
4396					     standard_libexec_prefix);
4397      if (gcc_exec_prefix)
4398	xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
4399#endif
4400    }
4401  else
4402    {
4403      /* make_relative_prefix requires a program name, but
4404	 GCC_EXEC_PREFIX is typically a directory name with a trailing
4405	 / (which is ignored by make_relative_prefix), so append a
4406	 program name.  */
4407      char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
4408      gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
4409						standard_exec_prefix,
4410						standard_libexec_prefix);
4411
4412      /* The path is unrelocated, so fallback to the original setting.  */
4413      if (!gcc_libexec_prefix)
4414	gcc_libexec_prefix = standard_libexec_prefix;
4415
4416      free (tmp_prefix);
4417    }
4418#else
4419#endif
4420  /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4421     is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4422     or an automatically created GCC_EXEC_PREFIX from
4423     decoded_options[0].arg.  */
4424
4425  /* Do language-specific adjustment/addition of flags.  */
4426  lang_specific_driver (&decoded_options, &decoded_options_count,
4427			&added_libraries);
4428
4429  if (gcc_exec_prefix)
4430    {
4431      int len = strlen (gcc_exec_prefix);
4432
4433      if (len > (int) sizeof ("/lib/gcc/") - 1
4434	  && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
4435	{
4436	  temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
4437	  if (IS_DIR_SEPARATOR (*temp)
4438	      && filename_ncmp (temp + 1, "lib", 3) == 0
4439	      && IS_DIR_SEPARATOR (temp[4])
4440	      && filename_ncmp (temp + 5, "gcc", 3) == 0)
4441	    len -= sizeof ("/lib/gcc/") - 1;
4442	}
4443
4444      set_std_prefix (gcc_exec_prefix, len);
4445      add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
4446		  PREFIX_PRIORITY_LAST, 0, 0);
4447      add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
4448		  PREFIX_PRIORITY_LAST, 0, 0);
4449    }
4450
4451  /* COMPILER_PATH and LIBRARY_PATH have values
4452     that are lists of directory names with colons.  */
4453
4454  temp = env.get ("COMPILER_PATH");
4455  if (temp)
4456    {
4457      const char *startp, *endp;
4458      char *nstore = (char *) alloca (strlen (temp) + 3);
4459
4460      startp = endp = temp;
4461      while (1)
4462	{
4463	  if (*endp == PATH_SEPARATOR || *endp == 0)
4464	    {
4465	      strncpy (nstore, startp, endp - startp);
4466	      if (endp == startp)
4467		strcpy (nstore, concat (".", dir_separator_str, NULL));
4468	      else if (!IS_DIR_SEPARATOR (endp[-1]))
4469		{
4470		  nstore[endp - startp] = DIR_SEPARATOR;
4471		  nstore[endp - startp + 1] = 0;
4472		}
4473	      else
4474		nstore[endp - startp] = 0;
4475	      add_prefix (&exec_prefixes, nstore, 0,
4476			  PREFIX_PRIORITY_LAST, 0, 0);
4477	      add_prefix (&include_prefixes, nstore, 0,
4478			  PREFIX_PRIORITY_LAST, 0, 0);
4479	      if (*endp == 0)
4480		break;
4481	      endp = startp = endp + 1;
4482	    }
4483	  else
4484	    endp++;
4485	}
4486    }
4487
4488  temp = env.get (LIBRARY_PATH_ENV);
4489  if (temp && *cross_compile == '0')
4490    {
4491      const char *startp, *endp;
4492      char *nstore = (char *) alloca (strlen (temp) + 3);
4493
4494      startp = endp = temp;
4495      while (1)
4496	{
4497	  if (*endp == PATH_SEPARATOR || *endp == 0)
4498	    {
4499	      strncpy (nstore, startp, endp - startp);
4500	      if (endp == startp)
4501		strcpy (nstore, concat (".", dir_separator_str, NULL));
4502	      else if (!IS_DIR_SEPARATOR (endp[-1]))
4503		{
4504		  nstore[endp - startp] = DIR_SEPARATOR;
4505		  nstore[endp - startp + 1] = 0;
4506		}
4507	      else
4508		nstore[endp - startp] = 0;
4509	      add_prefix (&startfile_prefixes, nstore, NULL,
4510			  PREFIX_PRIORITY_LAST, 0, 1);
4511	      if (*endp == 0)
4512		break;
4513	      endp = startp = endp + 1;
4514	    }
4515	  else
4516	    endp++;
4517	}
4518    }
4519
4520  /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
4521  temp = env.get ("LPATH");
4522  if (temp && *cross_compile == '0')
4523    {
4524      const char *startp, *endp;
4525      char *nstore = (char *) alloca (strlen (temp) + 3);
4526
4527      startp = endp = temp;
4528      while (1)
4529	{
4530	  if (*endp == PATH_SEPARATOR || *endp == 0)
4531	    {
4532	      strncpy (nstore, startp, endp - startp);
4533	      if (endp == startp)
4534		strcpy (nstore, concat (".", dir_separator_str, NULL));
4535	      else if (!IS_DIR_SEPARATOR (endp[-1]))
4536		{
4537		  nstore[endp - startp] = DIR_SEPARATOR;
4538		  nstore[endp - startp + 1] = 0;
4539		}
4540	      else
4541		nstore[endp - startp] = 0;
4542	      add_prefix (&startfile_prefixes, nstore, NULL,
4543			  PREFIX_PRIORITY_LAST, 0, 1);
4544	      if (*endp == 0)
4545		break;
4546	      endp = startp = endp + 1;
4547	    }
4548	  else
4549	    endp++;
4550	}
4551    }
4552
4553  /* Process the options and store input files and switches in their
4554     vectors.  */
4555
4556  last_language_n_infiles = -1;
4557
4558  set_option_handlers (&handlers);
4559
4560  for (j = 1; j < decoded_options_count; j++)
4561    {
4562      switch (decoded_options[j].opt_index)
4563	{
4564	case OPT_S:
4565	case OPT_c:
4566	case OPT_E:
4567	  have_c = 1;
4568	  break;
4569	}
4570      if (have_c)
4571	break;
4572    }
4573
4574  for (j = 1; j < decoded_options_count; j++)
4575    {
4576      if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4577	{
4578	  const char *arg = decoded_options[j].arg;
4579          const char *p = strrchr (arg, '@');
4580          char *fname;
4581	  long offset;
4582	  int consumed;
4583#ifdef HAVE_TARGET_OBJECT_SUFFIX
4584	  arg = convert_filename (arg, 0, access (arg, F_OK));
4585#endif
4586	  /* For LTO static archive support we handle input file
4587	     specifications that are composed of a filename and
4588	     an offset like FNAME@OFFSET.  */
4589	  if (p
4590	      && p != arg
4591	      && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4592	      && strlen (p) == (unsigned int)consumed)
4593	    {
4594              fname = (char *)xmalloc (p - arg + 1);
4595              memcpy (fname, arg, p - arg);
4596              fname[p - arg] = '\0';
4597	      /* Only accept non-stdin and existing FNAME parts, otherwise
4598		 try with the full name.  */
4599	      if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4600		{
4601		  free (fname);
4602		  fname = xstrdup (arg);
4603		}
4604	    }
4605	  else
4606	    fname = xstrdup (arg);
4607
4608          if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4609	    {
4610	      bool resp = fname[0] == '@' && access (fname + 1, F_OK) < 0;
4611	      error ("%s: %m", fname + resp);
4612	    }
4613          else
4614	    add_infile (arg, spec_lang);
4615
4616          free (fname);
4617	  continue;
4618	}
4619
4620      read_cmdline_option (&global_options, &global_options_set,
4621			   decoded_options + j, UNKNOWN_LOCATION,
4622			   CL_DRIVER, &handlers, global_dc);
4623    }
4624
4625  /* If the user didn't specify any, default to all configured offload
4626     targets.  */
4627  if (ENABLE_OFFLOADING && offload_targets == NULL)
4628    handle_foffload_option (OFFLOAD_TARGETS);
4629
4630  if (output_file
4631      && strcmp (output_file, "-") != 0
4632      && strcmp (output_file, HOST_BIT_BUCKET) != 0)
4633    {
4634      int i;
4635      for (i = 0; i < n_infiles; i++)
4636	if ((!infiles[i].language || infiles[i].language[0] != '*')
4637	    && canonical_filename_eq (infiles[i].name, output_file))
4638	  fatal_error (input_location,
4639		       "input file %qs is the same as output file",
4640		       output_file);
4641    }
4642
4643  if (output_file != NULL && output_file[0] == '\0')
4644    fatal_error (input_location, "output filename may not be empty");
4645
4646  /* If -save-temps=obj and -o name, create the prefix to use for %b.
4647     Otherwise just make -save-temps=obj the same as -save-temps=cwd.  */
4648  if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4649    {
4650      save_temps_length = strlen (save_temps_prefix);
4651      temp = strrchr (lbasename (save_temps_prefix), '.');
4652      if (temp)
4653	{
4654	  save_temps_length -= strlen (temp);
4655	  save_temps_prefix[save_temps_length] = '\0';
4656	}
4657
4658    }
4659  else if (save_temps_prefix != NULL)
4660    {
4661      free (save_temps_prefix);
4662      save_temps_prefix = NULL;
4663    }
4664
4665  if (save_temps_flag && use_pipes)
4666    {
4667      /* -save-temps overrides -pipe, so that temp files are produced */
4668      if (save_temps_flag)
4669	warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
4670      use_pipes = 0;
4671    }
4672
4673  if (!compare_debug)
4674    {
4675      const char *gcd = env.get ("GCC_COMPARE_DEBUG");
4676
4677      if (gcd && gcd[0] == '-')
4678	{
4679	  compare_debug = 2;
4680	  compare_debug_opt = gcd;
4681	}
4682      else if (gcd && *gcd && strcmp (gcd, "0"))
4683	{
4684	  compare_debug = 3;
4685	  compare_debug_opt = "-gtoggle";
4686	}
4687    }
4688  else if (compare_debug < 0)
4689    {
4690      compare_debug = 0;
4691      gcc_assert (!compare_debug_opt);
4692    }
4693
4694  /* Set up the search paths.  We add directories that we expect to
4695     contain GNU Toolchain components before directories specified by
4696     the machine description so that we will find GNU components (like
4697     the GNU assembler) before those of the host system.  */
4698
4699  /* If we don't know where the toolchain has been installed, use the
4700     configured-in locations.  */
4701  if (!gcc_exec_prefix)
4702    {
4703#ifndef OS2
4704      add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4705		  PREFIX_PRIORITY_LAST, 1, 0);
4706      add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4707		  PREFIX_PRIORITY_LAST, 2, 0);
4708      add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4709		  PREFIX_PRIORITY_LAST, 2, 0);
4710#endif
4711      add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4712		  PREFIX_PRIORITY_LAST, 1, 0);
4713    }
4714
4715  gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4716  tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
4717			    dir_separator_str, NULL);
4718
4719  /* Look for tools relative to the location from which the driver is
4720     running, or, if that is not available, the configured prefix.  */
4721  tooldir_prefix
4722    = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4723	      spec_host_machine, dir_separator_str, spec_version,
4724	      accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL);
4725  free (tooldir_prefix2);
4726
4727  add_prefix (&exec_prefixes,
4728	      concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4729	      "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4730  add_prefix (&startfile_prefixes,
4731	      concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4732	      "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4733  free (tooldir_prefix);
4734
4735#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4736  /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4737     then consider it to relocate with the rest of the GCC installation
4738     if GCC_EXEC_PREFIX is set.
4739     ``make_relative_prefix'' is not compiled for VMS, so don't call it.  */
4740  if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4741    {
4742      char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
4743					      standard_bindir_prefix,
4744					      target_system_root);
4745      if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4746	{
4747	  target_system_root = tmp_prefix;
4748	  target_system_root_changed = 1;
4749	}
4750    }
4751#endif
4752
4753  /* More prefixes are enabled in main, after we read the specs file
4754     and determine whether this is cross-compilation or not.  */
4755
4756  if (n_infiles != 0 && n_infiles == last_language_n_infiles && spec_lang != 0)
4757    warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4758
4759  /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4760     environment variable.  */
4761  if (compare_debug == 2 || compare_debug == 3)
4762    {
4763      const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4764      save_switch (opt, 0, NULL, false, true);
4765      compare_debug = 1;
4766    }
4767
4768  /* Ensure we only invoke each subprocess once.  */
4769  if (n_infiles == 0
4770      && (print_subprocess_help || print_help_list || print_version))
4771    {
4772      /* Create a dummy input file, so that we can pass
4773	 the help option on to the various sub-processes.  */
4774      add_infile ("help-dummy", "c");
4775    }
4776
4777  /* Decide if undefined variable references are allowed in specs.  */
4778
4779  /* -v alone is safe. --version and --help alone or together are safe.  Note
4780     that -v would make them unsafe, as they'd then be run for subprocesses as
4781     well, the location of which might depend on variables possibly coming
4782     from self-specs.  Note also that the command name is counted in
4783     decoded_options_count.  */
4784
4785  unsigned help_version_count = 0;
4786
4787  if (print_version)
4788    help_version_count++;
4789
4790  if (print_help_list)
4791    help_version_count++;
4792
4793  spec_undefvar_allowed =
4794    ((verbose_flag && decoded_options_count == 2)
4795     || help_version_count == decoded_options_count - 1);
4796
4797  alloc_switch ();
4798  switches[n_switches].part1 = 0;
4799  alloc_infile ();
4800  infiles[n_infiles].name = 0;
4801}
4802
4803/* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4804   and place that in the environment.  */
4805
4806static void
4807set_collect_gcc_options (void)
4808{
4809  int i;
4810  int first_time;
4811
4812  /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4813     the compiler.  */
4814  obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4815		sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4816
4817  first_time = TRUE;
4818  for (i = 0; (int) i < n_switches; i++)
4819    {
4820      const char *const *args;
4821      const char *p, *q;
4822      if (!first_time)
4823	obstack_grow (&collect_obstack, " ", 1);
4824
4825      first_time = FALSE;
4826
4827      /* Ignore elided switches.  */
4828      if ((switches[i].live_cond
4829	   & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4830	  == SWITCH_IGNORE)
4831	continue;
4832
4833      obstack_grow (&collect_obstack, "'-", 2);
4834      q = switches[i].part1;
4835      while ((p = strchr (q, '\'')))
4836	{
4837	  obstack_grow (&collect_obstack, q, p - q);
4838	  obstack_grow (&collect_obstack, "'\\''", 4);
4839	  q = ++p;
4840	}
4841      obstack_grow (&collect_obstack, q, strlen (q));
4842      obstack_grow (&collect_obstack, "'", 1);
4843
4844      for (args = switches[i].args; args && *args; args++)
4845	{
4846	  obstack_grow (&collect_obstack, " '", 2);
4847	  q = *args;
4848	  while ((p = strchr (q, '\'')))
4849	    {
4850	      obstack_grow (&collect_obstack, q, p - q);
4851	      obstack_grow (&collect_obstack, "'\\''", 4);
4852	      q = ++p;
4853	    }
4854	  obstack_grow (&collect_obstack, q, strlen (q));
4855	  obstack_grow (&collect_obstack, "'", 1);
4856	}
4857    }
4858  obstack_grow (&collect_obstack, "\0", 1);
4859  xputenv (XOBFINISH (&collect_obstack, char *));
4860}
4861
4862/* Process a spec string, accumulating and running commands.  */
4863
4864/* These variables describe the input file name.
4865   input_file_number is the index on outfiles of this file,
4866   so that the output file name can be stored for later use by %o.
4867   input_basename is the start of the part of the input file
4868   sans all directory names, and basename_length is the number
4869   of characters starting there excluding the suffix .c or whatever.  */
4870
4871static const char *gcc_input_filename;
4872static int input_file_number;
4873size_t input_filename_length;
4874static int basename_length;
4875static int suffixed_basename_length;
4876static const char *input_basename;
4877static const char *input_suffix;
4878#ifndef HOST_LACKS_INODE_NUMBERS
4879static struct stat input_stat;
4880#endif
4881static int input_stat_set;
4882
4883/* The compiler used to process the current input file.  */
4884static struct compiler *input_file_compiler;
4885
4886/* These are variables used within do_spec and do_spec_1.  */
4887
4888/* Nonzero if an arg has been started and not yet terminated
4889   (with space, tab or newline).  */
4890static int arg_going;
4891
4892/* Nonzero means %d or %g has been seen; the next arg to be terminated
4893   is a temporary file name.  */
4894static int delete_this_arg;
4895
4896/* Nonzero means %w has been seen; the next arg to be terminated
4897   is the output file name of this compilation.  */
4898static int this_is_output_file;
4899
4900/* Nonzero means %s has been seen; the next arg to be terminated
4901   is the name of a library file and we should try the standard
4902   search dirs for it.  */
4903static int this_is_library_file;
4904
4905/* Nonzero means %T has been seen; the next arg to be terminated
4906   is the name of a linker script and we should try all of the
4907   standard search dirs for it.  If it is found insert a --script
4908   command line switch and then substitute the full path in place,
4909   otherwise generate an error message.  */
4910static int this_is_linker_script;
4911
4912/* Nonzero means that the input of this command is coming from a pipe.  */
4913static int input_from_pipe;
4914
4915/* Nonnull means substitute this for any suffix when outputting a switches
4916   arguments.  */
4917static const char *suffix_subst;
4918
4919/* If there is an argument being accumulated, terminate it and store it.  */
4920
4921static void
4922end_going_arg (void)
4923{
4924  if (arg_going)
4925    {
4926      const char *string;
4927
4928      obstack_1grow (&obstack, 0);
4929      string = XOBFINISH (&obstack, const char *);
4930      if (this_is_library_file)
4931	string = find_file (string);
4932      if (this_is_linker_script)
4933	{
4934	  char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4935
4936	  if (full_script_path == NULL)
4937	    {
4938	      error ("unable to locate default linker script %qs in the library search paths", string);
4939	      /* Script was not found on search path.  */
4940	      return;
4941	    }
4942	  store_arg ("--script", false, false);
4943	  string = full_script_path;
4944	}
4945      store_arg (string, delete_this_arg, this_is_output_file);
4946      if (this_is_output_file)
4947	outfiles[input_file_number] = string;
4948      arg_going = 0;
4949    }
4950}
4951
4952
4953/* Parse the WRAPPER string which is a comma separated list of the command line
4954   and insert them into the beginning of argbuf.  */
4955
4956static void
4957insert_wrapper (const char *wrapper)
4958{
4959  int n = 0;
4960  int i;
4961  char *buf = xstrdup (wrapper);
4962  char *p = buf;
4963  unsigned int old_length = argbuf.length ();
4964
4965  do
4966    {
4967      n++;
4968      while (*p == ',')
4969        p++;
4970    }
4971  while ((p = strchr (p, ',')) != NULL);
4972
4973  argbuf.safe_grow (old_length + n);
4974  memmove (argbuf.address () + n,
4975	   argbuf.address (),
4976	   old_length * sizeof (const_char_p));
4977
4978  i = 0;
4979  p = buf;
4980  do
4981    {
4982      while (*p == ',')
4983        {
4984          *p = 0;
4985          p++;
4986        }
4987      argbuf[i] = p;
4988      i++;
4989    }
4990  while ((p = strchr (p, ',')) != NULL);
4991  gcc_assert (i == n);
4992}
4993
4994/* Process the spec SPEC and run the commands specified therein.
4995   Returns 0 if the spec is successfully processed; -1 if failed.  */
4996
4997int
4998do_spec (const char *spec)
4999{
5000  int value;
5001
5002  value = do_spec_2 (spec, NULL);
5003
5004  /* Force out any unfinished command.
5005     If -pipe, this forces out the last command if it ended in `|'.  */
5006  if (value == 0)
5007    {
5008      if (argbuf.length () > 0
5009	  && !strcmp (argbuf.last (), "|"))
5010	argbuf.pop ();
5011
5012      set_collect_gcc_options ();
5013
5014      if (argbuf.length () > 0)
5015	value = execute ();
5016    }
5017
5018  return value;
5019}
5020
5021/* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
5022   of a matched * pattern which may be re-injected by way of %*.  */
5023
5024static int
5025do_spec_2 (const char *spec, const char *soft_matched_part)
5026{
5027  int result;
5028
5029  clear_args ();
5030  arg_going = 0;
5031  delete_this_arg = 0;
5032  this_is_output_file = 0;
5033  this_is_library_file = 0;
5034  this_is_linker_script = 0;
5035  input_from_pipe = 0;
5036  suffix_subst = NULL;
5037
5038  result = do_spec_1 (spec, 0, soft_matched_part);
5039
5040  end_going_arg ();
5041
5042  return result;
5043}
5044
5045/* Process the given spec string and add any new options to the end
5046   of the switches/n_switches array.  */
5047
5048static void
5049do_option_spec (const char *name, const char *spec)
5050{
5051  unsigned int i, value_count, value_len;
5052  const char *p, *q, *value;
5053  char *tmp_spec, *tmp_spec_p;
5054
5055  if (configure_default_options[0].name == NULL)
5056    return;
5057
5058  for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
5059    if (strcmp (configure_default_options[i].name, name) == 0)
5060      break;
5061  if (i == ARRAY_SIZE (configure_default_options))
5062    return;
5063
5064  value = configure_default_options[i].value;
5065  value_len = strlen (value);
5066
5067  /* Compute the size of the final spec.  */
5068  value_count = 0;
5069  p = spec;
5070  while ((p = strstr (p, "%(VALUE)")) != NULL)
5071    {
5072      p ++;
5073      value_count ++;
5074    }
5075
5076  /* Replace each %(VALUE) by the specified value.  */
5077  tmp_spec = (char *) alloca (strlen (spec) + 1
5078		     + value_count * (value_len - strlen ("%(VALUE)")));
5079  tmp_spec_p = tmp_spec;
5080  q = spec;
5081  while ((p = strstr (q, "%(VALUE)")) != NULL)
5082    {
5083      memcpy (tmp_spec_p, q, p - q);
5084      tmp_spec_p = tmp_spec_p + (p - q);
5085      memcpy (tmp_spec_p, value, value_len);
5086      tmp_spec_p += value_len;
5087      q = p + strlen ("%(VALUE)");
5088    }
5089  strcpy (tmp_spec_p, q);
5090
5091  do_self_spec (tmp_spec);
5092}
5093
5094/* Process the given spec string and add any new options to the end
5095   of the switches/n_switches array.  */
5096
5097static void
5098do_self_spec (const char *spec)
5099{
5100  int i;
5101
5102  do_spec_2 (spec, NULL);
5103  do_spec_1 (" ", 0, NULL);
5104
5105  /* Mark %<S switches processed by do_self_spec to be ignored permanently.
5106     do_self_specs adds the replacements to switches array, so it shouldn't
5107     be processed afterwards.  */
5108  for (i = 0; i < n_switches; i++)
5109    if ((switches[i].live_cond & SWITCH_IGNORE))
5110      switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
5111
5112  if (argbuf.length () > 0)
5113    {
5114      const char **argbuf_copy;
5115      struct cl_decoded_option *decoded_options;
5116      struct cl_option_handlers handlers;
5117      unsigned int decoded_options_count;
5118      unsigned int j;
5119
5120      /* Create a copy of argbuf with a dummy argv[0] entry for
5121	 decode_cmdline_options_to_array.  */
5122      argbuf_copy = XNEWVEC (const char *,
5123			     argbuf.length () + 1);
5124      argbuf_copy[0] = "";
5125      memcpy (argbuf_copy + 1, argbuf.address (),
5126	      argbuf.length () * sizeof (const char *));
5127
5128      decode_cmdline_options_to_array (argbuf.length () + 1,
5129				       argbuf_copy,
5130				       CL_DRIVER, &decoded_options,
5131				       &decoded_options_count);
5132      free (argbuf_copy);
5133
5134      set_option_handlers (&handlers);
5135
5136      for (j = 1; j < decoded_options_count; j++)
5137	{
5138	  switch (decoded_options[j].opt_index)
5139	    {
5140	    case OPT_SPECIAL_input_file:
5141	      /* Specs should only generate options, not input
5142		 files.  */
5143	      if (strcmp (decoded_options[j].arg, "-") != 0)
5144		fatal_error (input_location,
5145			     "switch %qs does not start with %<-%>",
5146			     decoded_options[j].arg);
5147	      else
5148		fatal_error (input_location,
5149			     "spec-generated switch is just %<-%>");
5150	      break;
5151
5152	    case OPT_fcompare_debug_second:
5153	    case OPT_fcompare_debug:
5154	    case OPT_fcompare_debug_:
5155	    case OPT_o:
5156	      /* Avoid duplicate processing of some options from
5157		 compare-debug specs; just save them here.  */
5158	      save_switch (decoded_options[j].canonical_option[0],
5159			   (decoded_options[j].canonical_option_num_elements
5160			    - 1),
5161			   &decoded_options[j].canonical_option[1], false, true);
5162	      break;
5163
5164	    default:
5165	      read_cmdline_option (&global_options, &global_options_set,
5166				   decoded_options + j, UNKNOWN_LOCATION,
5167				   CL_DRIVER, &handlers, global_dc);
5168	      break;
5169	    }
5170	}
5171
5172      free (decoded_options);
5173
5174      alloc_switch ();
5175      switches[n_switches].part1 = 0;
5176    }
5177}
5178
5179/* Callback for processing %D and %I specs.  */
5180
5181struct spec_path_info {
5182  const char *option;
5183  const char *append;
5184  size_t append_len;
5185  bool omit_relative;
5186  bool separate_options;
5187};
5188
5189static void *
5190spec_path (char *path, void *data)
5191{
5192  struct spec_path_info *info = (struct spec_path_info *) data;
5193  size_t len = 0;
5194  char save = 0;
5195
5196  if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
5197    return NULL;
5198
5199  if (info->append_len != 0)
5200    {
5201      len = strlen (path);
5202      memcpy (path + len, info->append, info->append_len + 1);
5203    }
5204
5205  if (!is_directory (path, true))
5206    return NULL;
5207
5208  do_spec_1 (info->option, 1, NULL);
5209  if (info->separate_options)
5210    do_spec_1 (" ", 0, NULL);
5211
5212  if (info->append_len == 0)
5213    {
5214      len = strlen (path);
5215      save = path[len - 1];
5216      if (IS_DIR_SEPARATOR (path[len - 1]))
5217	path[len - 1] = '\0';
5218    }
5219
5220  do_spec_1 (path, 1, NULL);
5221  do_spec_1 (" ", 0, NULL);
5222
5223  /* Must not damage the original path.  */
5224  if (info->append_len == 0)
5225    path[len - 1] = save;
5226
5227  return NULL;
5228}
5229
5230/* True if we should compile INFILE. */
5231
5232static bool
5233compile_input_file_p (struct infile *infile)
5234{
5235  if ((!infile->language) || (infile->language[0] != '*'))
5236    if (infile->incompiler == input_file_compiler)
5237      return true;
5238  return false;
5239}
5240
5241/* Process each member of VEC as a spec.  */
5242
5243static void
5244do_specs_vec (vec<char_p> vec)
5245{
5246  unsigned ix;
5247  char *opt;
5248
5249  FOR_EACH_VEC_ELT (vec, ix, opt)
5250    {
5251      do_spec_1 (opt, 1, NULL);
5252      /* Make each accumulated option a separate argument.  */
5253      do_spec_1 (" ", 0, NULL);
5254    }
5255}
5256
5257/* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS.  */
5258
5259static void
5260putenv_COLLECT_AS_OPTIONS (vec<char_p> vec)
5261{
5262  if (vec.is_empty ())
5263     return;
5264
5265  obstack_init (&collect_obstack);
5266  obstack_grow (&collect_obstack, "COLLECT_AS_OPTIONS=",
5267		strlen ("COLLECT_AS_OPTIONS="));
5268
5269  char *opt;
5270  unsigned ix;
5271
5272  FOR_EACH_VEC_ELT (vec, ix, opt)
5273    {
5274      obstack_1grow (&collect_obstack, '\'');
5275      obstack_grow (&collect_obstack, opt, strlen (opt));
5276      obstack_1grow (&collect_obstack, '\'');
5277      if (ix < vec.length () - 1)
5278	obstack_1grow(&collect_obstack, ' ');
5279    }
5280
5281  obstack_1grow (&collect_obstack, '\0');
5282  xputenv (XOBFINISH (&collect_obstack, char *));
5283}
5284
5285/* Process the sub-spec SPEC as a portion of a larger spec.
5286   This is like processing a whole spec except that we do
5287   not initialize at the beginning and we do not supply a
5288   newline by default at the end.
5289   INSWITCH nonzero means don't process %-sequences in SPEC;
5290   in this case, % is treated as an ordinary character.
5291   This is used while substituting switches.
5292   INSWITCH nonzero also causes SPC not to terminate an argument.
5293
5294   Value is zero unless a line was finished
5295   and the command on that line reported an error.  */
5296
5297static int
5298do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
5299{
5300  const char *p = spec;
5301  int c;
5302  int i;
5303  int value;
5304
5305  /* If it's an empty string argument to a switch, keep it as is.  */
5306  if (inswitch && !*p)
5307    arg_going = 1;
5308
5309  while ((c = *p++))
5310    /* If substituting a switch, treat all chars like letters.
5311       Otherwise, NL, SPC, TAB and % are special.  */
5312    switch (inswitch ? 'a' : c)
5313      {
5314      case '\n':
5315	end_going_arg ();
5316
5317	if (argbuf.length () > 0
5318	    && !strcmp (argbuf.last (), "|"))
5319	  {
5320	    /* A `|' before the newline means use a pipe here,
5321	       but only if -pipe was specified.
5322	       Otherwise, execute now and don't pass the `|' as an arg.  */
5323	    if (use_pipes)
5324	      {
5325		input_from_pipe = 1;
5326		break;
5327	      }
5328	    else
5329	      argbuf.pop ();
5330	  }
5331
5332	set_collect_gcc_options ();
5333
5334	if (argbuf.length () > 0)
5335	  {
5336	    value = execute ();
5337	    if (value)
5338	      return value;
5339	  }
5340	/* Reinitialize for a new command, and for a new argument.  */
5341	clear_args ();
5342	arg_going = 0;
5343	delete_this_arg = 0;
5344	this_is_output_file = 0;
5345	this_is_library_file = 0;
5346	this_is_linker_script = 0;
5347	input_from_pipe = 0;
5348	break;
5349
5350      case '|':
5351	end_going_arg ();
5352
5353	/* Use pipe */
5354	obstack_1grow (&obstack, c);
5355	arg_going = 1;
5356	break;
5357
5358      case '\t':
5359      case ' ':
5360	end_going_arg ();
5361
5362	/* Reinitialize for a new argument.  */
5363	delete_this_arg = 0;
5364	this_is_output_file = 0;
5365	this_is_library_file = 0;
5366	this_is_linker_script = 0;
5367	break;
5368
5369      case '%':
5370	switch (c = *p++)
5371	  {
5372	  case 0:
5373	    fatal_error (input_location, "spec %qs invalid", spec);
5374
5375	  case 'b':
5376	    if (save_temps_length)
5377	      obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5378	    else
5379	      obstack_grow (&obstack, input_basename, basename_length);
5380	    if (compare_debug < 0)
5381	      obstack_grow (&obstack, ".gk", 3);
5382	    arg_going = 1;
5383	    break;
5384
5385	  case 'B':
5386	    if (save_temps_length)
5387	      obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5388	    else
5389	      obstack_grow (&obstack, input_basename, suffixed_basename_length);
5390	    if (compare_debug < 0)
5391	      obstack_grow (&obstack, ".gk", 3);
5392	    arg_going = 1;
5393	    break;
5394
5395	  case 'd':
5396	    delete_this_arg = 2;
5397	    break;
5398
5399	  /* Dump out the directories specified with LIBRARY_PATH,
5400	     followed by the absolute directories
5401	     that we search for startfiles.  */
5402	  case 'D':
5403	    {
5404	      struct spec_path_info info;
5405
5406	      info.option = "-L";
5407	      info.append_len = 0;
5408#ifdef RELATIVE_PREFIX_NOT_LINKDIR
5409	      /* Used on systems which record the specified -L dirs
5410		 and use them to search for dynamic linking.
5411		 Relative directories always come from -B,
5412		 and it is better not to use them for searching
5413		 at run time.  In particular, stage1 loses.  */
5414	      info.omit_relative = true;
5415#else
5416	      info.omit_relative = false;
5417#endif
5418	      info.separate_options = false;
5419
5420	      for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5421	    }
5422	    break;
5423
5424	  case 'e':
5425	    /* %efoo means report an error with `foo' as error message
5426	       and don't execute any more commands for this file.  */
5427	    {
5428	      const char *q = p;
5429	      char *buf;
5430	      while (*p != 0 && *p != '\n')
5431		p++;
5432	      buf = (char *) alloca (p - q + 1);
5433	      strncpy (buf, q, p - q);
5434	      buf[p - q] = 0;
5435	      error ("%s", _(buf));
5436	      return -1;
5437	    }
5438	    break;
5439	  case 'n':
5440	    /* %nfoo means report a notice with `foo' on stderr.  */
5441	    {
5442	      const char *q = p;
5443	      char *buf;
5444	      while (*p != 0 && *p != '\n')
5445		p++;
5446	      buf = (char *) alloca (p - q + 1);
5447	      strncpy (buf, q, p - q);
5448	      buf[p - q] = 0;
5449	      inform (UNKNOWN_LOCATION, "%s", _(buf));
5450	      if (*p)
5451		p++;
5452	    }
5453	    break;
5454
5455	  case 'j':
5456	    {
5457	      struct stat st;
5458
5459	      /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
5460		 defined, and it is not a directory, and it is
5461		 writable, use it.  Otherwise, treat this like any
5462		 other temporary file.  */
5463
5464	      if ((!save_temps_flag)
5465		  && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
5466		  && (access (HOST_BIT_BUCKET, W_OK) == 0))
5467		{
5468		  obstack_grow (&obstack, HOST_BIT_BUCKET,
5469				strlen (HOST_BIT_BUCKET));
5470		  delete_this_arg = 0;
5471		  arg_going = 1;
5472		  break;
5473		}
5474	    }
5475	    goto create_temp_file;
5476	  case '|':
5477	    if (use_pipes)
5478	      {
5479		obstack_1grow (&obstack, '-');
5480		delete_this_arg = 0;
5481		arg_going = 1;
5482
5483		/* consume suffix */
5484		while (*p == '.' || ISALNUM ((unsigned char) *p))
5485		  p++;
5486		if (p[0] == '%' && p[1] == 'O')
5487		  p += 2;
5488
5489		break;
5490	      }
5491	    goto create_temp_file;
5492	  case 'm':
5493	    if (use_pipes)
5494	      {
5495		/* consume suffix */
5496		while (*p == '.' || ISALNUM ((unsigned char) *p))
5497		  p++;
5498		if (p[0] == '%' && p[1] == 'O')
5499		  p += 2;
5500
5501		break;
5502	      }
5503	    goto create_temp_file;
5504	  case 'g':
5505	  case 'u':
5506	  case 'U':
5507	  create_temp_file:
5508	      {
5509		struct temp_name *t;
5510		int suffix_length;
5511		const char *suffix = p;
5512		char *saved_suffix = NULL;
5513
5514		while (*p == '.' || ISALNUM ((unsigned char) *p))
5515		  p++;
5516		suffix_length = p - suffix;
5517		if (p[0] == '%' && p[1] == 'O')
5518		  {
5519		    p += 2;
5520		    /* We don't support extra suffix characters after %O.  */
5521		    if (*p == '.' || ISALNUM ((unsigned char) *p))
5522		      fatal_error (input_location,
5523				   "spec %qs has invalid %<%%0%c%>", spec, *p);
5524		    if (suffix_length == 0)
5525		      suffix = TARGET_OBJECT_SUFFIX;
5526		    else
5527		      {
5528			saved_suffix
5529			  = XNEWVEC (char, suffix_length
5530				     + strlen (TARGET_OBJECT_SUFFIX) + 1);
5531			strncpy (saved_suffix, suffix, suffix_length);
5532			strcpy (saved_suffix + suffix_length,
5533				TARGET_OBJECT_SUFFIX);
5534		      }
5535		    suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5536		  }
5537
5538		if (compare_debug < 0)
5539		  {
5540		    suffix = concat (".gk", suffix, NULL);
5541		    suffix_length += 3;
5542		  }
5543
5544		/* If -save-temps=obj and -o were specified, use that for the
5545		   temp file.  */
5546		if (save_temps_length)
5547		  {
5548		    char *tmp;
5549		    temp_filename_length
5550		      = save_temps_length + suffix_length + 1;
5551		    tmp = (char *) alloca (temp_filename_length);
5552		    memcpy (tmp, save_temps_prefix, save_temps_length);
5553		    memcpy (tmp + save_temps_length, suffix, suffix_length);
5554		    tmp[save_temps_length + suffix_length] = '\0';
5555		    temp_filename = save_string (tmp, save_temps_length
5556						      + suffix_length);
5557		    obstack_grow (&obstack, temp_filename,
5558				  temp_filename_length);
5559		    arg_going = 1;
5560		    delete_this_arg = 0;
5561		    break;
5562		  }
5563
5564		/* If the gcc_input_filename has the same suffix specified
5565		   for the %g, %u, or %U, and -save-temps is specified,
5566		   we could end up using that file as an intermediate
5567		   thus clobbering the user's source file (.e.g.,
5568		   gcc -save-temps foo.s would clobber foo.s with the
5569		   output of cpp0).  So check for this condition and
5570		   generate a temp file as the intermediate.  */
5571
5572		if (save_temps_flag)
5573		  {
5574		    char *tmp;
5575		    temp_filename_length = basename_length + suffix_length + 1;
5576		    tmp = (char *) alloca (temp_filename_length);
5577		    memcpy (tmp, input_basename, basename_length);
5578		    memcpy (tmp + basename_length, suffix, suffix_length);
5579		    tmp[basename_length + suffix_length] = '\0';
5580		    temp_filename = tmp;
5581
5582		    if (filename_cmp (temp_filename, gcc_input_filename) != 0)
5583		      {
5584#ifndef HOST_LACKS_INODE_NUMBERS
5585			struct stat st_temp;
5586
5587			/* Note, set_input() resets input_stat_set to 0.  */
5588			if (input_stat_set == 0)
5589			  {
5590			    input_stat_set = stat (gcc_input_filename,
5591						   &input_stat);
5592			    if (input_stat_set >= 0)
5593			      input_stat_set = 1;
5594			  }
5595
5596			/* If we have the stat for the gcc_input_filename
5597			   and we can do the stat for the temp_filename
5598			   then the they could still refer to the same
5599			   file if st_dev/st_ino's are the same.  */
5600			if (input_stat_set != 1
5601			    || stat (temp_filename, &st_temp) < 0
5602			    || input_stat.st_dev != st_temp.st_dev
5603			    || input_stat.st_ino != st_temp.st_ino)
5604#else
5605			/* Just compare canonical pathnames.  */
5606			char* input_realname = lrealpath (gcc_input_filename);
5607			char* temp_realname = lrealpath (temp_filename);
5608			bool files_differ = filename_cmp (input_realname, temp_realname);
5609			free (input_realname);
5610			free (temp_realname);
5611			if (files_differ)
5612#endif
5613			  {
5614			    temp_filename
5615			      = save_string (temp_filename,
5616					     temp_filename_length - 1);
5617			    obstack_grow (&obstack, temp_filename,
5618						    temp_filename_length);
5619			    arg_going = 1;
5620			    delete_this_arg = 0;
5621			    break;
5622			  }
5623		      }
5624		  }
5625
5626		/* See if we already have an association of %g/%u/%U and
5627		   suffix.  */
5628		for (t = temp_names; t; t = t->next)
5629		  if (t->length == suffix_length
5630		      && strncmp (t->suffix, suffix, suffix_length) == 0
5631		      && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5632		    break;
5633
5634		/* Make a new association if needed.  %u and %j
5635		   require one.  */
5636		if (t == 0 || c == 'u' || c == 'j')
5637		  {
5638		    if (t == 0)
5639		      {
5640			t = XNEW (struct temp_name);
5641			t->next = temp_names;
5642			temp_names = t;
5643		      }
5644		    t->length = suffix_length;
5645		    if (saved_suffix)
5646		      {
5647			t->suffix = saved_suffix;
5648			saved_suffix = NULL;
5649		      }
5650		    else
5651		      t->suffix = save_string (suffix, suffix_length);
5652		    t->unique = (c == 'u' || c == 'U' || c == 'j');
5653		    temp_filename = make_temp_file (t->suffix);
5654		    temp_filename_length = strlen (temp_filename);
5655		    t->filename = temp_filename;
5656		    t->filename_length = temp_filename_length;
5657		  }
5658
5659		free (saved_suffix);
5660
5661		obstack_grow (&obstack, t->filename, t->filename_length);
5662		delete_this_arg = 1;
5663	      }
5664	    arg_going = 1;
5665	    break;
5666
5667	  case 'i':
5668	    if (combine_inputs)
5669	      {
5670		/* We are going to expand `%i' into `@FILE', where FILE
5671		   is a newly-created temporary filename.  The filenames
5672		   that would usually be expanded in place of %o will be
5673		   written to the temporary file.  */
5674		if (at_file_supplied)
5675		  open_at_file ();
5676
5677		for (i = 0; (int) i < n_infiles; i++)
5678		  if (compile_input_file_p (&infiles[i]))
5679		    {
5680		      store_arg (infiles[i].name, 0, 0);
5681		      infiles[i].compiled = true;
5682		    }
5683
5684		if (at_file_supplied)
5685		  close_at_file ();
5686	      }
5687	    else
5688	      {
5689		obstack_grow (&obstack, gcc_input_filename,
5690			      input_filename_length);
5691		arg_going = 1;
5692	      }
5693	    break;
5694
5695	  case 'I':
5696	    {
5697	      struct spec_path_info info;
5698
5699	      if (multilib_dir)
5700		{
5701		  do_spec_1 ("-imultilib", 1, NULL);
5702		  /* Make this a separate argument.  */
5703		  do_spec_1 (" ", 0, NULL);
5704		  do_spec_1 (multilib_dir, 1, NULL);
5705		  do_spec_1 (" ", 0, NULL);
5706		}
5707
5708	      if (multiarch_dir)
5709		{
5710		  do_spec_1 ("-imultiarch", 1, NULL);
5711		  /* Make this a separate argument.  */
5712		  do_spec_1 (" ", 0, NULL);
5713		  do_spec_1 (multiarch_dir, 1, NULL);
5714		  do_spec_1 (" ", 0, NULL);
5715		}
5716
5717	      if (gcc_exec_prefix)
5718		{
5719		  do_spec_1 ("-iprefix", 1, NULL);
5720		  /* Make this a separate argument.  */
5721		  do_spec_1 (" ", 0, NULL);
5722		  do_spec_1 (gcc_exec_prefix, 1, NULL);
5723		  do_spec_1 (" ", 0, NULL);
5724		}
5725
5726	      if (target_system_root_changed ||
5727		  (target_system_root && target_sysroot_hdrs_suffix))
5728		{
5729		  do_spec_1 ("-isysroot", 1, NULL);
5730		  /* Make this a separate argument.  */
5731		  do_spec_1 (" ", 0, NULL);
5732		  do_spec_1 (target_system_root, 1, NULL);
5733		  if (target_sysroot_hdrs_suffix)
5734		    do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5735		  do_spec_1 (" ", 0, NULL);
5736		}
5737
5738	      info.option = "-isystem";
5739	      info.append = "include";
5740	      info.append_len = strlen (info.append);
5741	      info.omit_relative = false;
5742	      info.separate_options = true;
5743
5744	      for_each_path (&include_prefixes, false, info.append_len,
5745			     spec_path, &info);
5746
5747	      info.append = "include-fixed";
5748	      if (*sysroot_hdrs_suffix_spec)
5749		info.append = concat (info.append, dir_separator_str,
5750				      multilib_dir, NULL);
5751	      info.append_len = strlen (info.append);
5752	      for_each_path (&include_prefixes, false, info.append_len,
5753			     spec_path, &info);
5754	    }
5755	    break;
5756
5757	  case 'o':
5758	    /* We are going to expand `%o' into `@FILE', where FILE
5759	       is a newly-created temporary filename.  The filenames
5760	       that would usually be expanded in place of %o will be
5761	       written to the temporary file.  */
5762	    if (at_file_supplied)
5763	      open_at_file ();
5764
5765	    for (i = 0; i < n_infiles + lang_specific_extra_outfiles; i++)
5766	      if (outfiles[i])
5767		store_arg (outfiles[i], 0, 0);
5768
5769	    if (at_file_supplied)
5770	      close_at_file ();
5771	    break;
5772
5773	  case 'O':
5774	    obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5775	    arg_going = 1;
5776	    break;
5777
5778	  case 's':
5779	    this_is_library_file = 1;
5780	    break;
5781
5782	  case 'T':
5783	    this_is_linker_script = 1;
5784	    break;
5785
5786	  case 'V':
5787	    outfiles[input_file_number] = NULL;
5788	    break;
5789
5790	  case 'w':
5791	    this_is_output_file = 1;
5792	    break;
5793
5794	  case 'W':
5795	    {
5796	      unsigned int cur_index = argbuf.length ();
5797	      /* Handle the {...} following the %W.  */
5798	      if (*p != '{')
5799		fatal_error (input_location,
5800			     "spec %qs has invalid %<%%W%c%>", spec, *p);
5801	      p = handle_braces (p + 1);
5802	      if (p == 0)
5803		return -1;
5804	      end_going_arg ();
5805	      /* If any args were output, mark the last one for deletion
5806		 on failure.  */
5807	      if (argbuf.length () != cur_index)
5808		record_temp_file (argbuf.last (), 0, 1);
5809	      break;
5810	    }
5811
5812	  case '@':
5813	    /* Handle the {...} following the %@.  */
5814	    if (*p != '{')
5815	      fatal_error (input_location,
5816			   "spec %qs has invalid %<%%@%c%>", spec, *p);
5817	    if (at_file_supplied)
5818	      open_at_file ();
5819	    p = handle_braces (p + 1);
5820	    if (at_file_supplied)
5821	      close_at_file ();
5822	    if (p == 0)
5823	      return -1;
5824	    break;
5825
5826	  /* %x{OPTION} records OPTION for %X to output.  */
5827	  case 'x':
5828	    {
5829	      const char *p1 = p;
5830	      char *string;
5831	      char *opt;
5832	      unsigned ix;
5833
5834	      /* Skip past the option value and make a copy.  */
5835	      if (*p != '{')
5836		fatal_error (input_location,
5837			     "spec %qs has invalid %<%%x%c%>", spec, *p);
5838	      while (*p++ != '}')
5839		;
5840	      string = save_string (p1 + 1, p - p1 - 2);
5841
5842	      /* See if we already recorded this option.  */
5843	      FOR_EACH_VEC_ELT (linker_options, ix, opt)
5844		if (! strcmp (string, opt))
5845		  {
5846		    free (string);
5847		    return 0;
5848		  }
5849
5850	      /* This option is new; add it.  */
5851	      add_linker_option (string, strlen (string));
5852	      free (string);
5853	    }
5854	    break;
5855
5856	  /* Dump out the options accumulated previously using %x.  */
5857	  case 'X':
5858	    do_specs_vec (linker_options);
5859	    break;
5860
5861	  /* Dump out the options accumulated previously using -Wa,.  */
5862	  case 'Y':
5863	    do_specs_vec (assembler_options);
5864	    break;
5865
5866	  /* Dump out the options accumulated previously using -Wp,.  */
5867	  case 'Z':
5868	    do_specs_vec (preprocessor_options);
5869	    break;
5870
5871	    /* Here are digits and numbers that just process
5872	       a certain constant string as a spec.  */
5873
5874	  case '1':
5875	    value = do_spec_1 (cc1_spec, 0, NULL);
5876	    if (value != 0)
5877	      return value;
5878	    break;
5879
5880	  case '2':
5881	    value = do_spec_1 (cc1plus_spec, 0, NULL);
5882	    if (value != 0)
5883	      return value;
5884	    break;
5885
5886	  case 'a':
5887	    value = do_spec_1 (asm_spec, 0, NULL);
5888	    if (value != 0)
5889	      return value;
5890	    break;
5891
5892	  case 'A':
5893	    value = do_spec_1 (asm_final_spec, 0, NULL);
5894	    if (value != 0)
5895	      return value;
5896	    break;
5897
5898	  case 'C':
5899	    {
5900	      const char *const spec
5901		= (input_file_compiler->cpp_spec
5902		   ? input_file_compiler->cpp_spec
5903		   : cpp_spec);
5904	      value = do_spec_1 (spec, 0, NULL);
5905	      if (value != 0)
5906		return value;
5907	    }
5908	    break;
5909
5910	  case 'E':
5911	    value = do_spec_1 (endfile_spec, 0, NULL);
5912	    if (value != 0)
5913	      return value;
5914	    break;
5915
5916	  case 'l':
5917	    value = do_spec_1 (link_spec, 0, NULL);
5918	    if (value != 0)
5919	      return value;
5920	    break;
5921
5922	  case 'L':
5923	    value = do_spec_1 (lib_spec, 0, NULL);
5924	    if (value != 0)
5925	      return value;
5926	    break;
5927
5928	  case 'M':
5929	    if (multilib_os_dir == NULL)
5930	      obstack_1grow (&obstack, '.');
5931	    else
5932	      obstack_grow (&obstack, multilib_os_dir,
5933			    strlen (multilib_os_dir));
5934	    break;
5935
5936	  case 'G':
5937	    value = do_spec_1 (libgcc_spec, 0, NULL);
5938	    if (value != 0)
5939	      return value;
5940	    break;
5941
5942	  case 'R':
5943	    /* We assume there is a directory
5944	       separator at the end of this string.  */
5945	    if (target_system_root)
5946	      {
5947	        obstack_grow (&obstack, target_system_root,
5948			      strlen (target_system_root));
5949		if (target_sysroot_suffix)
5950		  obstack_grow (&obstack, target_sysroot_suffix,
5951				strlen (target_sysroot_suffix));
5952	      }
5953	    break;
5954
5955	  case 'S':
5956	    value = do_spec_1 (startfile_spec, 0, NULL);
5957	    if (value != 0)
5958	      return value;
5959	    break;
5960
5961	    /* Here we define characters other than letters and digits.  */
5962
5963	  case '{':
5964	    p = handle_braces (p);
5965	    if (p == 0)
5966	      return -1;
5967	    break;
5968
5969	  case ':':
5970	    p = handle_spec_function (p, NULL, soft_matched_part);
5971	    if (p == 0)
5972	      return -1;
5973	    break;
5974
5975	  case '%':
5976	    obstack_1grow (&obstack, '%');
5977	    break;
5978
5979	  case '.':
5980	    {
5981	      unsigned len = 0;
5982
5983	      while (p[len] && p[len] != ' ' && p[len] != '%')
5984		len++;
5985	      suffix_subst = save_string (p - 1, len + 1);
5986	      p += len;
5987	    }
5988	   break;
5989
5990	   /* Henceforth ignore the option(s) matching the pattern
5991	      after the %<.  */
5992	  case '<':
5993	  case '>':
5994	    {
5995	      unsigned len = 0;
5996	      int have_wildcard = 0;
5997	      int i;
5998	      int switch_option;
5999
6000	      if (c == '>')
6001		switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
6002	      else
6003		switch_option = SWITCH_IGNORE;
6004
6005	      while (p[len] && p[len] != ' ' && p[len] != '\t')
6006		len++;
6007
6008	      if (p[len-1] == '*')
6009		have_wildcard = 1;
6010
6011	      for (i = 0; i < n_switches; i++)
6012		if (!strncmp (switches[i].part1, p, len - have_wildcard)
6013		    && (have_wildcard || switches[i].part1[len] == '\0'))
6014		  {
6015		    switches[i].live_cond |= switch_option;
6016		    /* User switch be validated from validate_all_switches.
6017		       when the definition is seen from the spec file.
6018		       If not defined anywhere, will be rejected.  */
6019		    if (switches[i].known)
6020		      switches[i].validated = true;
6021		  }
6022
6023	      p += len;
6024	    }
6025	    break;
6026
6027	  case '*':
6028	    if (soft_matched_part)
6029	      {
6030		if (soft_matched_part[0])
6031		  do_spec_1 (soft_matched_part, 1, NULL);
6032		/* Only insert a space after the substitution if it is at the
6033		   end of the current sequence.  So if:
6034
6035		     "%{foo=*:bar%*}%{foo=*:one%*two}"
6036
6037		   matches -foo=hello then it will produce:
6038
6039		     barhello onehellotwo
6040		*/
6041		if (*p == 0 || *p == '}')
6042		  do_spec_1 (" ", 0, NULL);
6043	      }
6044	    else
6045	      /* Catch the case where a spec string contains something like
6046		 '%{foo:%*}'.  i.e. there is no * in the pattern on the left
6047		 hand side of the :.  */
6048	      error ("spec failure: %<%%*%> has not been initialized by pattern match");
6049	    break;
6050
6051	    /* Process a string found as the value of a spec given by name.
6052	       This feature allows individual machine descriptions
6053	       to add and use their own specs.  */
6054	  case '(':
6055	    {
6056	      const char *name = p;
6057	      struct spec_list *sl;
6058	      int len;
6059
6060	      /* The string after the S/P is the name of a spec that is to be
6061		 processed.  */
6062	      while (*p && *p != ')')
6063		p++;
6064
6065	      /* See if it's in the list.  */
6066	      for (len = p - name, sl = specs; sl; sl = sl->next)
6067		if (sl->name_len == len && !strncmp (sl->name, name, len))
6068		  {
6069		    name = *(sl->ptr_spec);
6070#ifdef DEBUG_SPECS
6071		    fnotice (stderr, "Processing spec (%s), which is '%s'\n",
6072			     sl->name, name);
6073#endif
6074		    break;
6075		  }
6076
6077	      if (sl)
6078		{
6079		  value = do_spec_1 (name, 0, NULL);
6080		  if (value != 0)
6081		    return value;
6082		}
6083
6084	      /* Discard the closing paren.  */
6085	      if (*p)
6086		p++;
6087	    }
6088	    break;
6089
6090	  default:
6091	    error ("spec failure: unrecognized spec option %qc", c);
6092	    break;
6093	  }
6094	break;
6095
6096      case '\\':
6097	/* Backslash: treat next character as ordinary.  */
6098	c = *p++;
6099
6100	/* Fall through.  */
6101      default:
6102	/* Ordinary character: put it into the current argument.  */
6103	obstack_1grow (&obstack, c);
6104	arg_going = 1;
6105      }
6106
6107  /* End of string.  If we are processing a spec function, we need to
6108     end any pending argument.  */
6109  if (processing_spec_function)
6110    end_going_arg ();
6111
6112  return 0;
6113}
6114
6115/* Look up a spec function.  */
6116
6117static const struct spec_function *
6118lookup_spec_function (const char *name)
6119{
6120  const struct spec_function *sf;
6121
6122  for (sf = static_spec_functions; sf->name != NULL; sf++)
6123    if (strcmp (sf->name, name) == 0)
6124      return sf;
6125
6126  return NULL;
6127}
6128
6129/* Evaluate a spec function.  */
6130
6131static const char *
6132eval_spec_function (const char *func, const char *args,
6133		    const char *soft_matched_part)
6134{
6135  const struct spec_function *sf;
6136  const char *funcval;
6137
6138  /* Saved spec processing context.  */
6139  vec<const_char_p> save_argbuf;
6140
6141  int save_arg_going;
6142  int save_delete_this_arg;
6143  int save_this_is_output_file;
6144  int save_this_is_library_file;
6145  int save_input_from_pipe;
6146  int save_this_is_linker_script;
6147  const char *save_suffix_subst;
6148
6149  int save_growing_size;
6150  void *save_growing_value = NULL;
6151
6152  sf = lookup_spec_function (func);
6153  if (sf == NULL)
6154    fatal_error (input_location, "unknown spec function %qs", func);
6155
6156  /* Push the spec processing context.  */
6157  save_argbuf = argbuf;
6158
6159  save_arg_going = arg_going;
6160  save_delete_this_arg = delete_this_arg;
6161  save_this_is_output_file = this_is_output_file;
6162  save_this_is_library_file = this_is_library_file;
6163  save_this_is_linker_script = this_is_linker_script;
6164  save_input_from_pipe = input_from_pipe;
6165  save_suffix_subst = suffix_subst;
6166
6167  /* If we have some object growing now, finalize it so the args and function
6168     eval proceed from a cleared context.  This is needed to prevent the first
6169     constructed arg from mistakenly including the growing value.  We'll push
6170     this value back on the obstack once the function evaluation is done, to
6171     restore a consistent processing context for our caller.  This is fine as
6172     the address of growing objects isn't guaranteed to remain stable until
6173     they are finalized, and we expect this situation to be rare enough for
6174     the extra copy not to be an issue.  */
6175  save_growing_size = obstack_object_size (&obstack);
6176  if (save_growing_size > 0)
6177    save_growing_value = obstack_finish (&obstack);
6178
6179  /* Create a new spec processing context, and build the function
6180     arguments.  */
6181
6182  alloc_args ();
6183  if (do_spec_2 (args, soft_matched_part) < 0)
6184    fatal_error (input_location, "error in arguments to spec function %qs",
6185		 func);
6186
6187  /* argbuf_index is an index for the next argument to be inserted, and
6188     so contains the count of the args already inserted.  */
6189
6190  funcval = (*sf->func) (argbuf.length (),
6191			 argbuf.address ());
6192
6193  /* Pop the spec processing context.  */
6194  argbuf.release ();
6195  argbuf = save_argbuf;
6196
6197  arg_going = save_arg_going;
6198  delete_this_arg = save_delete_this_arg;
6199  this_is_output_file = save_this_is_output_file;
6200  this_is_library_file = save_this_is_library_file;
6201  this_is_linker_script = save_this_is_linker_script;
6202  input_from_pipe = save_input_from_pipe;
6203  suffix_subst = save_suffix_subst;
6204
6205  if (save_growing_size > 0)
6206    obstack_grow (&obstack, save_growing_value, save_growing_size);
6207
6208  return funcval;
6209}
6210
6211/* Handle a spec function call of the form:
6212
6213   %:function(args)
6214
6215   ARGS is processed as a spec in a separate context and split into an
6216   argument vector in the normal fashion.  The function returns a string
6217   containing a spec which we then process in the caller's context, or
6218   NULL if no processing is required.
6219
6220   If RETVAL_NONNULL is not NULL, then store a bool whether function
6221   returned non-NULL.
6222
6223   SOFT_MATCHED_PART holds the current value of a matched * pattern, which
6224   may be re-expanded with a %* as part of the function arguments.  */
6225
6226static const char *
6227handle_spec_function (const char *p, bool *retval_nonnull,
6228		      const char *soft_matched_part)
6229{
6230  char *func, *args;
6231  const char *endp, *funcval;
6232  int count;
6233
6234  processing_spec_function++;
6235
6236  /* Get the function name.  */
6237  for (endp = p; *endp != '\0'; endp++)
6238    {
6239      if (*endp == '(')		/* ) */
6240        break;
6241      /* Only allow [A-Za-z0-9], -, and _ in function names.  */
6242      if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
6243	fatal_error (input_location, "malformed spec function name");
6244    }
6245  if (*endp != '(')		/* ) */
6246    fatal_error (input_location, "no arguments for spec function");
6247  func = save_string (p, endp - p);
6248  p = ++endp;
6249
6250  /* Get the arguments.  */
6251  for (count = 0; *endp != '\0'; endp++)
6252    {
6253      /* ( */
6254      if (*endp == ')')
6255	{
6256	  if (count == 0)
6257	    break;
6258	  count--;
6259	}
6260      else if (*endp == '(')	/* ) */
6261	count++;
6262    }
6263  /* ( */
6264  if (*endp != ')')
6265    fatal_error (input_location, "malformed spec function arguments");
6266  args = save_string (p, endp - p);
6267  p = ++endp;
6268
6269  /* p now points to just past the end of the spec function expression.  */
6270
6271  funcval = eval_spec_function (func, args, soft_matched_part);
6272  if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
6273    p = NULL;
6274  if (retval_nonnull)
6275    *retval_nonnull = funcval != NULL;
6276
6277  free (func);
6278  free (args);
6279
6280  processing_spec_function--;
6281
6282  return p;
6283}
6284
6285/* Inline subroutine of handle_braces.  Returns true if the current
6286   input suffix matches the atom bracketed by ATOM and END_ATOM.  */
6287static inline bool
6288input_suffix_matches (const char *atom, const char *end_atom)
6289{
6290  return (input_suffix
6291	  && !strncmp (input_suffix, atom, end_atom - atom)
6292	  && input_suffix[end_atom - atom] == '\0');
6293}
6294
6295/* Subroutine of handle_braces.  Returns true if the current
6296   input file's spec name matches the atom bracketed by ATOM and END_ATOM.  */
6297static bool
6298input_spec_matches (const char *atom, const char *end_atom)
6299{
6300  return (input_file_compiler
6301	  && input_file_compiler->suffix
6302	  && input_file_compiler->suffix[0] != '\0'
6303	  && !strncmp (input_file_compiler->suffix + 1, atom,
6304		       end_atom - atom)
6305	  && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
6306}
6307
6308/* Subroutine of handle_braces.  Returns true if a switch
6309   matching the atom bracketed by ATOM and END_ATOM appeared on the
6310   command line.  */
6311static bool
6312switch_matches (const char *atom, const char *end_atom, int starred)
6313{
6314  int i;
6315  int len = end_atom - atom;
6316  int plen = starred ? len : -1;
6317
6318  for (i = 0; i < n_switches; i++)
6319    if (!strncmp (switches[i].part1, atom, len)
6320	&& (starred || switches[i].part1[len] == '\0')
6321	&& check_live_switch (i, plen))
6322      return true;
6323
6324    /* Check if a switch with separated form matching the atom.
6325       We check -D and -U switches. */
6326    else if (switches[i].args != 0)
6327      {
6328	if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
6329	    && *switches[i].part1 == atom[0])
6330	  {
6331	    if (!strncmp (switches[i].args[0], &atom[1], len - 1)
6332		&& (starred || (switches[i].part1[1] == '\0'
6333				&& switches[i].args[0][len - 1] == '\0'))
6334		&& check_live_switch (i, (starred ? 1 : -1)))
6335	      return true;
6336	  }
6337      }
6338
6339  return false;
6340}
6341
6342/* Inline subroutine of handle_braces.  Mark all of the switches which
6343   match ATOM (extends to END_ATOM; STARRED indicates whether there
6344   was a star after the atom) for later processing.  */
6345static inline void
6346mark_matching_switches (const char *atom, const char *end_atom, int starred)
6347{
6348  int i;
6349  int len = end_atom - atom;
6350  int plen = starred ? len : -1;
6351
6352  for (i = 0; i < n_switches; i++)
6353    if (!strncmp (switches[i].part1, atom, len)
6354	&& (starred || switches[i].part1[len] == '\0')
6355	&& check_live_switch (i, plen))
6356      switches[i].ordering = 1;
6357}
6358
6359/* Inline subroutine of handle_braces.  Process all the currently
6360   marked switches through give_switch, and clear the marks.  */
6361static inline void
6362process_marked_switches (void)
6363{
6364  int i;
6365
6366  for (i = 0; i < n_switches; i++)
6367    if (switches[i].ordering == 1)
6368      {
6369	switches[i].ordering = 0;
6370	give_switch (i, 0);
6371      }
6372}
6373
6374/* Handle a %{ ... } construct.  P points just inside the leading {.
6375   Returns a pointer one past the end of the brace block, or 0
6376   if we call do_spec_1 and that returns -1.  */
6377
6378static const char *
6379handle_braces (const char *p)
6380{
6381  const char *atom, *end_atom;
6382  const char *d_atom = NULL, *d_end_atom = NULL;
6383  char *esc_buf = NULL, *d_esc_buf = NULL;
6384  int esc;
6385  const char *orig = p;
6386
6387  bool a_is_suffix;
6388  bool a_is_spectype;
6389  bool a_is_starred;
6390  bool a_is_negated;
6391  bool a_matched;
6392
6393  bool a_must_be_last = false;
6394  bool ordered_set    = false;
6395  bool disjunct_set   = false;
6396  bool disj_matched   = false;
6397  bool disj_starred   = true;
6398  bool n_way_choice   = false;
6399  bool n_way_matched  = false;
6400
6401#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6402
6403  do
6404    {
6405      if (a_must_be_last)
6406	goto invalid;
6407
6408      /* Scan one "atom" (S in the description above of %{}, possibly
6409	 with '!', '.', '@', ',', or '*' modifiers).  */
6410      a_matched = false;
6411      a_is_suffix = false;
6412      a_is_starred = false;
6413      a_is_negated = false;
6414      a_is_spectype = false;
6415
6416      SKIP_WHITE ();
6417      if (*p == '!')
6418	p++, a_is_negated = true;
6419
6420      SKIP_WHITE ();
6421      if (*p == '%' && p[1] == ':')
6422	{
6423	  atom = NULL;
6424	  end_atom = NULL;
6425	  p = handle_spec_function (p + 2, &a_matched, NULL);
6426	}
6427      else
6428	{
6429	  if (*p == '.')
6430	    p++, a_is_suffix = true;
6431	  else if (*p == ',')
6432	    p++, a_is_spectype = true;
6433
6434	  atom = p;
6435	  esc = 0;
6436	  while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
6437		 || *p == ',' || *p == '.' || *p == '@' || *p == '\\')
6438	    {
6439	      if (*p == '\\')
6440		{
6441		  p++;
6442		  if (!*p)
6443		    fatal_error (input_location,
6444				 "braced spec %qs ends in escape", orig);
6445		  esc++;
6446		}
6447	      p++;
6448	    }
6449	  end_atom = p;
6450
6451	  if (esc)
6452	    {
6453	      const char *ap;
6454	      char *ep;
6455
6456	      if (esc_buf && esc_buf != d_esc_buf)
6457		free (esc_buf);
6458	      esc_buf = NULL;
6459	      ep = esc_buf = (char *) xmalloc (end_atom - atom - esc + 1);
6460	      for (ap = atom; ap != end_atom; ap++, ep++)
6461		{
6462		  if (*ap == '\\')
6463		    ap++;
6464		  *ep = *ap;
6465		}
6466	      *ep = '\0';
6467	      atom = esc_buf;
6468	      end_atom = ep;
6469	    }
6470
6471	  if (*p == '*')
6472	    p++, a_is_starred = 1;
6473	}
6474
6475      SKIP_WHITE ();
6476      switch (*p)
6477	{
6478	case '&': case '}':
6479	  /* Substitute the switch(es) indicated by the current atom.  */
6480	  ordered_set = true;
6481	  if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
6482	      || a_is_spectype || atom == end_atom)
6483	    goto invalid;
6484
6485	  mark_matching_switches (atom, end_atom, a_is_starred);
6486
6487	  if (*p == '}')
6488	    process_marked_switches ();
6489	  break;
6490
6491	case '|': case ':':
6492	  /* Substitute some text if the current atom appears as a switch
6493	     or suffix.  */
6494	  disjunct_set = true;
6495	  if (ordered_set)
6496	    goto invalid;
6497
6498	  if (atom && atom == end_atom)
6499	    {
6500	      if (!n_way_choice || disj_matched || *p == '|'
6501		  || a_is_negated || a_is_suffix || a_is_spectype
6502		  || a_is_starred)
6503		goto invalid;
6504
6505	      /* An empty term may appear as the last choice of an
6506		 N-way choice set; it means "otherwise".  */
6507	      a_must_be_last = true;
6508	      disj_matched = !n_way_matched;
6509	      disj_starred = false;
6510	    }
6511	  else
6512	    {
6513	      if ((a_is_suffix || a_is_spectype) && a_is_starred)
6514		goto invalid;
6515
6516	      if (!a_is_starred)
6517		disj_starred = false;
6518
6519	      /* Don't bother testing this atom if we already have a
6520		 match.  */
6521	      if (!disj_matched && !n_way_matched)
6522		{
6523		  if (atom == NULL)
6524		    /* a_matched is already set by handle_spec_function.  */;
6525		  else if (a_is_suffix)
6526		    a_matched = input_suffix_matches (atom, end_atom);
6527		  else if (a_is_spectype)
6528		    a_matched = input_spec_matches (atom, end_atom);
6529		  else
6530		    a_matched = switch_matches (atom, end_atom, a_is_starred);
6531
6532		  if (a_matched != a_is_negated)
6533		    {
6534		      disj_matched = true;
6535		      d_atom = atom;
6536		      d_end_atom = end_atom;
6537		      d_esc_buf = esc_buf;
6538		    }
6539		}
6540	    }
6541
6542	  if (*p == ':')
6543	    {
6544	      /* Found the body, that is, the text to substitute if the
6545		 current disjunction matches.  */
6546	      p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
6547				      disj_matched && !n_way_matched);
6548	      if (p == 0)
6549		goto done;
6550
6551	      /* If we have an N-way choice, reset state for the next
6552		 disjunction.  */
6553	      if (*p == ';')
6554		{
6555		  n_way_choice = true;
6556		  n_way_matched |= disj_matched;
6557		  disj_matched = false;
6558		  disj_starred = true;
6559		  d_atom = d_end_atom = NULL;
6560		}
6561	    }
6562	  break;
6563
6564	default:
6565	  goto invalid;
6566	}
6567    }
6568  while (*p++ != '}');
6569
6570 done:
6571  if (d_esc_buf && d_esc_buf != esc_buf)
6572    free (d_esc_buf);
6573  if (esc_buf)
6574    free (esc_buf);
6575
6576  return p;
6577
6578 invalid:
6579  fatal_error (input_location, "braced spec %qs is invalid at %qc", orig, *p);
6580
6581#undef SKIP_WHITE
6582}
6583
6584/* Subroutine of handle_braces.  Scan and process a brace substitution body
6585   (X in the description of %{} syntax).  P points one past the colon;
6586   ATOM and END_ATOM bracket the first atom which was found to be true
6587   (present) in the current disjunction; STARRED indicates whether all
6588   the atoms in the current disjunction were starred (for syntax validation);
6589   MATCHED indicates whether the disjunction matched or not, and therefore
6590   whether or not the body is to be processed through do_spec_1 or just
6591   skipped.  Returns a pointer to the closing } or ;, or 0 if do_spec_1
6592   returns -1.  */
6593
6594static const char *
6595process_brace_body (const char *p, const char *atom, const char *end_atom,
6596		    int starred, int matched)
6597{
6598  const char *body, *end_body;
6599  unsigned int nesting_level;
6600  bool have_subst     = false;
6601
6602  /* Locate the closing } or ;, honoring nested braces.
6603     Trim trailing whitespace.  */
6604  body = p;
6605  nesting_level = 1;
6606  for (;;)
6607    {
6608      if (*p == '{')
6609	nesting_level++;
6610      else if (*p == '}')
6611	{
6612	  if (!--nesting_level)
6613	    break;
6614	}
6615      else if (*p == ';' && nesting_level == 1)
6616	break;
6617      else if (*p == '%' && p[1] == '*' && nesting_level == 1)
6618	have_subst = true;
6619      else if (*p == '\0')
6620	goto invalid;
6621      p++;
6622    }
6623
6624  end_body = p;
6625  while (end_body[-1] == ' ' || end_body[-1] == '\t')
6626    end_body--;
6627
6628  if (have_subst && !starred)
6629    goto invalid;
6630
6631  if (matched)
6632    {
6633      /* Copy the substitution body to permanent storage and execute it.
6634	 If have_subst is false, this is a simple matter of running the
6635	 body through do_spec_1...  */
6636      char *string = save_string (body, end_body - body);
6637      if (!have_subst)
6638	{
6639	  if (do_spec_1 (string, 0, NULL) < 0)
6640	    {
6641	      free (string);
6642	      return 0;
6643	    }
6644	}
6645      else
6646	{
6647	  /* ... but if have_subst is true, we have to process the
6648	     body once for each matching switch, with %* set to the
6649	     variant part of the switch.  */
6650	  unsigned int hard_match_len = end_atom - atom;
6651	  int i;
6652
6653	  for (i = 0; i < n_switches; i++)
6654	    if (!strncmp (switches[i].part1, atom, hard_match_len)
6655		&& check_live_switch (i, hard_match_len))
6656	      {
6657		if (do_spec_1 (string, 0,
6658			       &switches[i].part1[hard_match_len]) < 0)
6659		  {
6660		    free (string);
6661		    return 0;
6662		  }
6663		/* Pass any arguments this switch has.  */
6664		give_switch (i, 1);
6665		suffix_subst = NULL;
6666	      }
6667	}
6668      free (string);
6669    }
6670
6671  return p;
6672
6673 invalid:
6674  fatal_error (input_location, "braced spec body %qs is invalid", body);
6675}
6676
6677/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6678   on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
6679   spec, or -1 if either exact match or %* is used.
6680
6681   A -O switch is obsoleted by a later -O switch.  A -f, -g, -m, or -W switch
6682   whose value does not begin with "no-" is obsoleted by the same value
6683   with the "no-", similarly for a switch with the "no-" prefix.  */
6684
6685static int
6686check_live_switch (int switchnum, int prefix_length)
6687{
6688  const char *name = switches[switchnum].part1;
6689  int i;
6690
6691  /* If we already processed this switch and determined if it was
6692     live or not, return our past determination.  */
6693  if (switches[switchnum].live_cond != 0)
6694    return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6695	    && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
6696	    && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6697	       == 0);
6698
6699  /* In the common case of {<at-most-one-letter>*}, a negating
6700     switch would always match, so ignore that case.  We will just
6701     send the conflicting switches to the compiler phase.  */
6702  if (prefix_length >= 0 && prefix_length <= 1)
6703    return 1;
6704
6705  /* Now search for duplicate in a manner that depends on the name.  */
6706  switch (*name)
6707    {
6708    case 'O':
6709      for (i = switchnum + 1; i < n_switches; i++)
6710	if (switches[i].part1[0] == 'O')
6711	  {
6712	    switches[switchnum].validated = true;
6713	    switches[switchnum].live_cond = SWITCH_FALSE;
6714	    return 0;
6715	  }
6716      break;
6717
6718    case 'W':  case 'f':  case 'm': case 'g':
6719      if (! strncmp (name + 1, "no-", 3))
6720	{
6721	  /* We have Xno-YYY, search for XYYY.  */
6722	  for (i = switchnum + 1; i < n_switches; i++)
6723	    if (switches[i].part1[0] == name[0]
6724		&& ! strcmp (&switches[i].part1[1], &name[4]))
6725	      {
6726		/* --specs are validated with the validate_switches mechanism.  */
6727		if (switches[switchnum].known)
6728		  switches[switchnum].validated = true;
6729		switches[switchnum].live_cond = SWITCH_FALSE;
6730		return 0;
6731	      }
6732	}
6733      else
6734	{
6735	  /* We have XYYY, search for Xno-YYY.  */
6736	  for (i = switchnum + 1; i < n_switches; i++)
6737	    if (switches[i].part1[0] == name[0]
6738		&& switches[i].part1[1] == 'n'
6739		&& switches[i].part1[2] == 'o'
6740		&& switches[i].part1[3] == '-'
6741		&& !strcmp (&switches[i].part1[4], &name[1]))
6742	      {
6743		/* --specs are validated with the validate_switches mechanism.  */
6744		if (switches[switchnum].known)
6745		  switches[switchnum].validated = true;
6746		switches[switchnum].live_cond = SWITCH_FALSE;
6747		return 0;
6748	      }
6749	}
6750      break;
6751    }
6752
6753  /* Otherwise the switch is live.  */
6754  switches[switchnum].live_cond |= SWITCH_LIVE;
6755  return 1;
6756}
6757
6758/* Pass a switch to the current accumulating command
6759   in the same form that we received it.
6760   SWITCHNUM identifies the switch; it is an index into
6761   the vector of switches gcc received, which is `switches'.
6762   This cannot fail since it never finishes a command line.
6763
6764   If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
6765
6766static void
6767give_switch (int switchnum, int omit_first_word)
6768{
6769  if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6770    return;
6771
6772  if (!omit_first_word)
6773    {
6774      do_spec_1 ("-", 0, NULL);
6775      do_spec_1 (switches[switchnum].part1, 1, NULL);
6776    }
6777
6778  if (switches[switchnum].args != 0)
6779    {
6780      const char **p;
6781      for (p = switches[switchnum].args; *p; p++)
6782	{
6783	  const char *arg = *p;
6784
6785	  do_spec_1 (" ", 0, NULL);
6786	  if (suffix_subst)
6787	    {
6788	      unsigned length = strlen (arg);
6789	      int dot = 0;
6790
6791	      while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6792		if (arg[length] == '.')
6793		  {
6794		    (CONST_CAST (char *, arg))[length] = 0;
6795		    dot = 1;
6796		    break;
6797		  }
6798	      do_spec_1 (arg, 1, NULL);
6799	      if (dot)
6800		(CONST_CAST (char *, arg))[length] = '.';
6801	      do_spec_1 (suffix_subst, 1, NULL);
6802	    }
6803	  else
6804	    do_spec_1 (arg, 1, NULL);
6805	}
6806    }
6807
6808  do_spec_1 (" ", 0, NULL);
6809  switches[switchnum].validated = true;
6810}
6811
6812/* Print GCC configuration (e.g. version, thread model, target,
6813   configuration_arguments) to a given FILE.  */
6814
6815static void
6816print_configuration (FILE *file)
6817{
6818  int n;
6819  const char *thrmod;
6820
6821  fnotice (file, "Target: %s\n", spec_machine);
6822  fnotice (file, "Configured with: %s\n", configuration_arguments);
6823
6824#ifdef THREAD_MODEL_SPEC
6825  /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6826  but there's no point in doing all this processing just to get
6827  thread_model back.  */
6828  obstack_init (&obstack);
6829  do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6830  obstack_1grow (&obstack, '\0');
6831  thrmod = XOBFINISH (&obstack, const char *);
6832#else
6833  thrmod = thread_model;
6834#endif
6835
6836  fnotice (file, "Thread model: %s\n", thrmod);
6837  fnotice (file, "Supported LTO compression algorithms: zlib");
6838#ifdef HAVE_ZSTD_H
6839  fnotice (file, " zstd");
6840#endif
6841  fnotice (file, "\n");
6842
6843  /* compiler_version is truncated at the first space when initialized
6844  from version string, so truncate version_string at the first space
6845  before comparing.  */
6846  for (n = 0; version_string[n]; n++)
6847    if (version_string[n] == ' ')
6848      break;
6849
6850  if (! strncmp (version_string, compiler_version, n)
6851      && compiler_version[n] == 0)
6852    fnotice (file, "gcc version %s %s\n", version_string,
6853	     pkgversion_string);
6854  else
6855    fnotice (file, "gcc driver version %s %sexecuting gcc version %s\n",
6856	     version_string, pkgversion_string, compiler_version);
6857
6858}
6859
6860#define RETRY_ICE_ATTEMPTS 3
6861
6862/* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise.  */
6863
6864static bool
6865files_equal_p (char *file1, char *file2)
6866{
6867  struct stat st1, st2;
6868  off_t n, len;
6869  int fd1, fd2;
6870  const int bufsize = 8192;
6871  char *buf = XNEWVEC (char, bufsize);
6872
6873  fd1 = open (file1, O_RDONLY);
6874  fd2 = open (file2, O_RDONLY);
6875
6876  if (fd1 < 0 || fd2 < 0)
6877    goto error;
6878
6879  if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
6880    goto error;
6881
6882  if (st1.st_size != st2.st_size)
6883    goto error;
6884
6885  for (n = st1.st_size; n; n -= len)
6886    {
6887      len = n;
6888      if ((int) len > bufsize / 2)
6889	len = bufsize / 2;
6890
6891      if (read (fd1, buf, len) != (int) len
6892	  || read (fd2, buf + bufsize / 2, len) != (int) len)
6893	{
6894	  goto error;
6895	}
6896
6897      if (memcmp (buf, buf + bufsize / 2, len) != 0)
6898	goto error;
6899    }
6900
6901  free (buf);
6902  close (fd1);
6903  close (fd2);
6904
6905  return 1;
6906
6907error:
6908  free (buf);
6909  close (fd1);
6910  close (fd2);
6911  return 0;
6912}
6913
6914/* Check that compiler's output doesn't differ across runs.
6915   TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
6916   stdout and stderr for each compiler run.  Return true if all of
6917   TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent.  */
6918
6919static bool
6920check_repro (char **temp_stdout_files, char **temp_stderr_files)
6921{
6922  int i;
6923  for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
6924    {
6925     if (!files_equal_p (temp_stdout_files[i], temp_stdout_files[i + 1])
6926	 || !files_equal_p (temp_stderr_files[i], temp_stderr_files[i + 1]))
6927       {
6928	 fnotice (stderr, "The bug is not reproducible, so it is"
6929		  " likely a hardware or OS problem.\n");
6930	 break;
6931       }
6932    }
6933  return i == RETRY_ICE_ATTEMPTS - 2;
6934}
6935
6936enum attempt_status {
6937  ATTEMPT_STATUS_FAIL_TO_RUN,
6938  ATTEMPT_STATUS_SUCCESS,
6939  ATTEMPT_STATUS_ICE
6940};
6941
6942
6943/* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
6944   to OUT_TEMP and stderr to ERR_TEMP.  If APPEND is TRUE, append to OUT_TEMP
6945   and ERR_TEMP instead of truncating.  If EMIT_SYSTEM_INFO is TRUE, also write
6946   GCC configuration into to ERR_TEMP.  Return ATTEMPT_STATUS_FAIL_TO_RUN if
6947   compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
6948   ATTEMPT_STATUS_SUCCESS otherwise.  */
6949
6950static enum attempt_status
6951run_attempt (const char **new_argv, const char *out_temp,
6952	     const char *err_temp, int emit_system_info, int append)
6953{
6954
6955  if (emit_system_info)
6956    {
6957      FILE *file_out = fopen (err_temp, "a");
6958      print_configuration (file_out);
6959      fputs ("\n", file_out);
6960      fclose (file_out);
6961    }
6962
6963  int exit_status;
6964  const char *errmsg;
6965  struct pex_obj *pex;
6966  int err;
6967  int pex_flags = PEX_USE_PIPES | PEX_LAST;
6968  enum attempt_status status = ATTEMPT_STATUS_FAIL_TO_RUN;
6969
6970  if (append)
6971    pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
6972
6973  pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
6974  if (!pex)
6975    fatal_error (input_location, "%<pex_init%> failed: %m");
6976
6977  errmsg = pex_run (pex, pex_flags, new_argv[0],
6978		    CONST_CAST2 (char *const *, const char **, &new_argv[1]),
6979		    out_temp, err_temp, &err);
6980  if (errmsg != NULL)
6981    {
6982      errno = err;
6983      fatal_error (input_location,
6984		   err ? G_ ("cannot execute %qs: %s: %m")
6985		   : G_ ("cannot execute %qs: %s"),
6986		   new_argv[0], errmsg);
6987    }
6988
6989  if (!pex_get_status (pex, 1, &exit_status))
6990    goto out;
6991
6992  switch (WEXITSTATUS (exit_status))
6993    {
6994      case ICE_EXIT_CODE:
6995	status = ATTEMPT_STATUS_ICE;
6996	break;
6997
6998      case SUCCESS_EXIT_CODE:
6999	status = ATTEMPT_STATUS_SUCCESS;
7000	break;
7001
7002      default:
7003	;
7004    }
7005
7006out:
7007  pex_free (pex);
7008  return status;
7009}
7010
7011/* This routine reads lines from IN file, adds C++ style comments
7012   at the begining of each line and writes result into OUT.  */
7013
7014static void
7015insert_comments (const char *file_in, const char *file_out)
7016{
7017  FILE *in = fopen (file_in, "rb");
7018  FILE *out = fopen (file_out, "wb");
7019  char line[256];
7020
7021  bool add_comment = true;
7022  while (fgets (line, sizeof (line), in))
7023    {
7024      if (add_comment)
7025	fputs ("// ", out);
7026      fputs (line, out);
7027      add_comment = strchr (line, '\n') != NULL;
7028    }
7029
7030  fclose (in);
7031  fclose (out);
7032}
7033
7034/* This routine adds preprocessed source code into the given ERR_FILE.
7035   To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
7036   add information in report file.  RUN_ATTEMPT should return
7037   ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report.  */
7038
7039static void
7040do_report_bug (const char **new_argv, const int nargs,
7041	       char **out_file, char **err_file)
7042{
7043  int i, status;
7044  int fd = open (*out_file, O_RDWR | O_APPEND);
7045  if (fd < 0)
7046    return;
7047  write (fd, "\n//", 3);
7048  for (i = 0; i < nargs; i++)
7049    {
7050      write (fd, " ", 1);
7051      write (fd, new_argv[i], strlen (new_argv[i]));
7052    }
7053  write (fd, "\n\n", 2);
7054  close (fd);
7055  new_argv[nargs] = "-E";
7056  new_argv[nargs + 1] = NULL;
7057
7058  status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
7059
7060  if (status == ATTEMPT_STATUS_SUCCESS)
7061    {
7062      fnotice (stderr, "Preprocessed source stored into %s file,"
7063	       " please attach this to your bugreport.\n", *out_file);
7064      /* Make sure it is not deleted.  */
7065      free (*out_file);
7066      *out_file = NULL;
7067    }
7068}
7069
7070/* Try to reproduce ICE.  If bug is reproducible, generate report .err file
7071   containing GCC configuration, backtrace, compiler's command line options
7072   and preprocessed source code.  */
7073
7074static void
7075try_generate_repro (const char **argv)
7076{
7077  int i, nargs, out_arg = -1, quiet = 0, attempt;
7078  const char **new_argv;
7079  char *temp_files[RETRY_ICE_ATTEMPTS * 2];
7080  char **temp_stdout_files = &temp_files[0];
7081  char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
7082
7083  if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
7084    return;
7085
7086  for (nargs = 0; argv[nargs] != NULL; ++nargs)
7087    /* Only retry compiler ICEs, not preprocessor ones.  */
7088    if (! strcmp (argv[nargs], "-E"))
7089      return;
7090    else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
7091      {
7092	if (out_arg == -1)
7093	  out_arg = nargs;
7094	else
7095	  return;
7096      }
7097    /* If the compiler is going to output any time information,
7098       it might varry between invocations.  */
7099    else if (! strcmp (argv[nargs], "-quiet"))
7100      quiet = 1;
7101    else if (! strcmp (argv[nargs], "-ftime-report"))
7102      return;
7103
7104  if (out_arg == -1 || !quiet)
7105    return;
7106
7107  memset (temp_files, '\0', sizeof (temp_files));
7108  new_argv = XALLOCAVEC (const char *, nargs + 4);
7109  memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
7110  new_argv[nargs++] = "-frandom-seed=0";
7111  new_argv[nargs++] = "-fdump-noaddr";
7112  new_argv[nargs] = NULL;
7113  if (new_argv[out_arg][2] == '\0')
7114    new_argv[out_arg + 1] = "-";
7115  else
7116    new_argv[out_arg] = "-o-";
7117
7118  int status;
7119  for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
7120    {
7121      int emit_system_info = 0;
7122      int append = 0;
7123      temp_stdout_files[attempt] = make_temp_file (".out");
7124      temp_stderr_files[attempt] = make_temp_file (".err");
7125
7126      if (attempt == RETRY_ICE_ATTEMPTS - 1)
7127	{
7128	  append = 1;
7129	  emit_system_info = 1;
7130	}
7131
7132      status = run_attempt (new_argv, temp_stdout_files[attempt],
7133			    temp_stderr_files[attempt], emit_system_info,
7134			    append);
7135
7136      if (status != ATTEMPT_STATUS_ICE)
7137	{
7138	  fnotice (stderr, "The bug is not reproducible, so it is"
7139		   " likely a hardware or OS problem.\n");
7140	  goto out;
7141	}
7142    }
7143
7144  if (!check_repro (temp_stdout_files, temp_stderr_files))
7145    goto out;
7146
7147  {
7148    /* Insert commented out backtrace into report file.  */
7149    char **stderr_commented = &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1];
7150    insert_comments (temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
7151		     *stderr_commented);
7152
7153    /* In final attempt we append compiler options and preprocesssed code to last
7154       generated .out file with configuration and backtrace.  */
7155    char **err = &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1];
7156    do_report_bug (new_argv, nargs, stderr_commented, err);
7157  }
7158
7159out:
7160  for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
7161    if (temp_files[i])
7162      {
7163	unlink (temp_stdout_files[i]);
7164	free (temp_stdout_files[i]);
7165      }
7166}
7167
7168/* Search for a file named NAME trying various prefixes including the
7169   user's -B prefix and some standard ones.
7170   Return the absolute file name found.  If nothing is found, return NAME.  */
7171
7172static const char *
7173find_file (const char *name)
7174{
7175  char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
7176  return newname ? newname : name;
7177}
7178
7179/* Determine whether a directory exists.  If LINKER, return 0 for
7180   certain fixed names not needed by the linker.  */
7181
7182static int
7183is_directory (const char *path1, bool linker)
7184{
7185  int len1;
7186  char *path;
7187  char *cp;
7188  struct stat st;
7189
7190  /* Ensure the string ends with "/.".  The resulting path will be a
7191     directory even if the given path is a symbolic link.  */
7192  len1 = strlen (path1);
7193  path = (char *) alloca (3 + len1);
7194  memcpy (path, path1, len1);
7195  cp = path + len1;
7196  if (!IS_DIR_SEPARATOR (cp[-1]))
7197    *cp++ = DIR_SEPARATOR;
7198  *cp++ = '.';
7199  *cp = '\0';
7200
7201  /* Exclude directories that the linker is known to search.  */
7202  if (linker
7203      && IS_DIR_SEPARATOR (path[0])
7204      && ((cp - path == 6
7205	   && filename_ncmp (path + 1, "lib", 3) == 0)
7206	  || (cp - path == 10
7207	      && filename_ncmp (path + 1, "usr", 3) == 0
7208	      && IS_DIR_SEPARATOR (path[4])
7209	      && filename_ncmp (path + 5, "lib", 3) == 0)))
7210    return 0;
7211
7212  return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
7213}
7214
7215/* Set up the various global variables to indicate that we're processing
7216   the input file named FILENAME.  */
7217
7218void
7219set_input (const char *filename)
7220{
7221  const char *p;
7222
7223  gcc_input_filename = filename;
7224  input_filename_length = strlen (gcc_input_filename);
7225  input_basename = lbasename (gcc_input_filename);
7226
7227  /* Find a suffix starting with the last period,
7228     and set basename_length to exclude that suffix.  */
7229  basename_length = strlen (input_basename);
7230  suffixed_basename_length = basename_length;
7231  p = input_basename + basename_length;
7232  while (p != input_basename && *p != '.')
7233    --p;
7234  if (*p == '.' && p != input_basename)
7235    {
7236      basename_length = p - input_basename;
7237      input_suffix = p + 1;
7238    }
7239  else
7240    input_suffix = "";
7241
7242  /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
7243     we will need to do a stat on the gcc_input_filename.  The
7244     INPUT_STAT_SET signals that the stat is needed.  */
7245  input_stat_set = 0;
7246}
7247
7248/* On fatal signals, delete all the temporary files.  */
7249
7250static void
7251fatal_signal (int signum)
7252{
7253  signal (signum, SIG_DFL);
7254  delete_failure_queue ();
7255  delete_temp_files ();
7256  /* Get the same signal again, this time not handled,
7257     so its normal effect occurs.  */
7258  kill (getpid (), signum);
7259}
7260
7261/* Compare the contents of the two files named CMPFILE[0] and
7262   CMPFILE[1].  Return zero if they're identical, nonzero
7263   otherwise.  */
7264
7265static int
7266compare_files (char *cmpfile[])
7267{
7268  int ret = 0;
7269  FILE *temp[2] = { NULL, NULL };
7270  int i;
7271
7272#if HAVE_MMAP_FILE
7273  {
7274    size_t length[2];
7275    void *map[2] = { NULL, NULL };
7276
7277    for (i = 0; i < 2; i++)
7278      {
7279	struct stat st;
7280
7281	if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
7282	  {
7283	    error ("%s: could not determine length of compare-debug file %s",
7284		   gcc_input_filename, cmpfile[i]);
7285	    ret = 1;
7286	    break;
7287	  }
7288
7289	length[i] = st.st_size;
7290      }
7291
7292    if (!ret && length[0] != length[1])
7293      {
7294	error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename);
7295	ret = 1;
7296      }
7297
7298    if (!ret)
7299      for (i = 0; i < 2; i++)
7300	{
7301	  int fd = open (cmpfile[i], O_RDONLY);
7302	  if (fd < 0)
7303	    {
7304	      error ("%s: could not open compare-debug file %s",
7305		     gcc_input_filename, cmpfile[i]);
7306	      ret = 1;
7307	      break;
7308	    }
7309
7310	  map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
7311	  close (fd);
7312
7313	  if (map[i] == (void *) MAP_FAILED)
7314	    {
7315	      ret = -1;
7316	      break;
7317	    }
7318	}
7319
7320    if (!ret)
7321      {
7322	if (memcmp (map[0], map[1], length[0]) != 0)
7323	  {
7324	    error ("%s: %<-fcompare-debug%> failure", gcc_input_filename);
7325	    ret = 1;
7326	  }
7327      }
7328
7329    for (i = 0; i < 2; i++)
7330      if (map[i])
7331	munmap ((caddr_t) map[i], length[i]);
7332
7333    if (ret >= 0)
7334      return ret;
7335
7336    ret = 0;
7337  }
7338#endif
7339
7340  for (i = 0; i < 2; i++)
7341    {
7342      temp[i] = fopen (cmpfile[i], "r");
7343      if (!temp[i])
7344	{
7345	  error ("%s: could not open compare-debug file %s",
7346		 gcc_input_filename, cmpfile[i]);
7347	  ret = 1;
7348	  break;
7349	}
7350    }
7351
7352  if (!ret && temp[0] && temp[1])
7353    for (;;)
7354      {
7355	int c0, c1;
7356	c0 = fgetc (temp[0]);
7357	c1 = fgetc (temp[1]);
7358
7359	if (c0 != c1)
7360	  {
7361	    error ("%s: %<-fcompare-debug%> failure",
7362		   gcc_input_filename);
7363	    ret = 1;
7364	    break;
7365	  }
7366
7367	if (c0 == EOF)
7368	  break;
7369      }
7370
7371  for (i = 1; i >= 0; i--)
7372    {
7373      if (temp[i])
7374	fclose (temp[i]);
7375    }
7376
7377  return ret;
7378}
7379
7380driver::driver (bool can_finalize, bool debug) :
7381  explicit_link_files (NULL),
7382  decoded_options (NULL)
7383{
7384  env.init (can_finalize, debug);
7385}
7386
7387driver::~driver ()
7388{
7389  XDELETEVEC (explicit_link_files);
7390  XDELETEVEC (decoded_options);
7391}
7392
7393/* driver::main is implemented as a series of driver:: method calls.  */
7394
7395int
7396driver::main (int argc, char **argv)
7397{
7398  bool early_exit;
7399
7400  set_progname (argv[0]);
7401  expand_at_files (&argc, &argv);
7402  decode_argv (argc, const_cast <const char **> (argv));
7403  global_initializations ();
7404  build_multilib_strings ();
7405  set_up_specs ();
7406  putenv_COLLECT_AS_OPTIONS (assembler_options);
7407  putenv_COLLECT_GCC (argv[0]);
7408  maybe_putenv_COLLECT_LTO_WRAPPER ();
7409  maybe_putenv_OFFLOAD_TARGETS ();
7410  handle_unrecognized_options ();
7411
7412  if (completion)
7413    {
7414      m_option_proposer.suggest_completion (completion);
7415      return 0;
7416    }
7417
7418  if (!maybe_print_and_exit ())
7419    return 0;
7420
7421  early_exit = prepare_infiles ();
7422  if (early_exit)
7423    return get_exit_code ();
7424
7425  do_spec_on_infiles ();
7426  maybe_run_linker (argv[0]);
7427  final_actions ();
7428  return get_exit_code ();
7429}
7430
7431/* Locate the final component of argv[0] after any leading path, and set
7432   the program name accordingly.  */
7433
7434void
7435driver::set_progname (const char *argv0) const
7436{
7437  const char *p = argv0 + strlen (argv0);
7438  while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
7439    --p;
7440  progname = p;
7441
7442  xmalloc_set_program_name (progname);
7443}
7444
7445/* Expand any @ files within the command-line args,
7446   setting at_file_supplied if any were expanded.  */
7447
7448void
7449driver::expand_at_files (int *argc, char ***argv) const
7450{
7451  char **old_argv = *argv;
7452
7453  expandargv (argc, argv);
7454
7455  /* Determine if any expansions were made.  */
7456  if (*argv != old_argv)
7457    at_file_supplied = true;
7458}
7459
7460/* Decode the command-line arguments from argc/argv into the
7461   decoded_options array.  */
7462
7463void
7464driver::decode_argv (int argc, const char **argv)
7465{
7466  init_opts_obstack ();
7467  init_options_struct (&global_options, &global_options_set);
7468
7469  decode_cmdline_options_to_array (argc, argv,
7470				   CL_DRIVER,
7471				   &decoded_options, &decoded_options_count);
7472}
7473
7474/* Perform various initializations and setup.  */
7475
7476void
7477driver::global_initializations ()
7478{
7479  /* Unlock the stdio streams.  */
7480  unlock_std_streams ();
7481
7482  gcc_init_libintl ();
7483
7484  diagnostic_initialize (global_dc, 0);
7485  diagnostic_color_init (global_dc);
7486  diagnostic_urls_init (global_dc);
7487
7488#ifdef GCC_DRIVER_HOST_INITIALIZATION
7489  /* Perform host dependent initialization when needed.  */
7490  GCC_DRIVER_HOST_INITIALIZATION;
7491#endif
7492
7493  if (atexit (delete_temp_files) != 0)
7494    fatal_error (input_location, "atexit failed");
7495
7496  if (signal (SIGINT, SIG_IGN) != SIG_IGN)
7497    signal (SIGINT, fatal_signal);
7498#ifdef SIGHUP
7499  if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
7500    signal (SIGHUP, fatal_signal);
7501#endif
7502  if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
7503    signal (SIGTERM, fatal_signal);
7504#ifdef SIGPIPE
7505  if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
7506    signal (SIGPIPE, fatal_signal);
7507#endif
7508#ifdef SIGCHLD
7509  /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
7510     receive the signal.  A different setting is inheritable */
7511  signal (SIGCHLD, SIG_DFL);
7512#endif
7513
7514  /* Parsing and gimplification sometimes need quite large stack.
7515     Increase stack size limits if possible.  */
7516  stack_limit_increase (64 * 1024 * 1024);
7517
7518  /* Allocate the argument vector.  */
7519  alloc_args ();
7520
7521  obstack_init (&obstack);
7522}
7523
7524/* Build multilib_select, et. al from the separate lines that make up each
7525   multilib selection.  */
7526
7527void
7528driver::build_multilib_strings () const
7529{
7530  {
7531    const char *p;
7532    const char *const *q = multilib_raw;
7533    int need_space;
7534
7535    obstack_init (&multilib_obstack);
7536    while ((p = *q++) != (char *) 0)
7537      obstack_grow (&multilib_obstack, p, strlen (p));
7538
7539    obstack_1grow (&multilib_obstack, 0);
7540    multilib_select = XOBFINISH (&multilib_obstack, const char *);
7541
7542    q = multilib_matches_raw;
7543    while ((p = *q++) != (char *) 0)
7544      obstack_grow (&multilib_obstack, p, strlen (p));
7545
7546    obstack_1grow (&multilib_obstack, 0);
7547    multilib_matches = XOBFINISH (&multilib_obstack, const char *);
7548
7549    q = multilib_exclusions_raw;
7550    while ((p = *q++) != (char *) 0)
7551      obstack_grow (&multilib_obstack, p, strlen (p));
7552
7553    obstack_1grow (&multilib_obstack, 0);
7554    multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
7555
7556    q = multilib_reuse_raw;
7557    while ((p = *q++) != (char *) 0)
7558      obstack_grow (&multilib_obstack, p, strlen (p));
7559
7560    obstack_1grow (&multilib_obstack, 0);
7561    multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
7562
7563    need_space = FALSE;
7564    for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
7565      {
7566	if (need_space)
7567	  obstack_1grow (&multilib_obstack, ' ');
7568	obstack_grow (&multilib_obstack,
7569		      multilib_defaults_raw[i],
7570		      strlen (multilib_defaults_raw[i]));
7571	need_space = TRUE;
7572      }
7573
7574    obstack_1grow (&multilib_obstack, 0);
7575    multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
7576  }
7577}
7578
7579/* Set up the spec-handling machinery.  */
7580
7581void
7582driver::set_up_specs () const
7583{
7584  const char *spec_machine_suffix;
7585  char *specs_file;
7586  size_t i;
7587
7588#ifdef INIT_ENVIRONMENT
7589  /* Set up any other necessary machine specific environment variables.  */
7590  xputenv (INIT_ENVIRONMENT);
7591#endif
7592
7593  /* Make a table of what switches there are (switches, n_switches).
7594     Make a table of specified input files (infiles, n_infiles).
7595     Decode switches that are handled locally.  */
7596
7597  process_command (decoded_options_count, decoded_options);
7598
7599  /* Initialize the vector of specs to just the default.
7600     This means one element containing 0s, as a terminator.  */
7601
7602  compilers = XNEWVAR (struct compiler, sizeof default_compilers);
7603  memcpy (compilers, default_compilers, sizeof default_compilers);
7604  n_compilers = n_default_compilers;
7605
7606  /* Read specs from a file if there is one.  */
7607
7608  machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
7609			   accel_dir_suffix, dir_separator_str, NULL);
7610  just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
7611
7612  specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
7613  /* Read the specs file unless it is a default one.  */
7614  if (specs_file != 0 && strcmp (specs_file, "specs"))
7615    read_specs (specs_file, true, false);
7616  else
7617    init_spec ();
7618
7619#ifdef ACCEL_COMPILER
7620  spec_machine_suffix = machine_suffix;
7621#else
7622  spec_machine_suffix = just_machine_suffix;
7623#endif
7624
7625#ifndef NETBSD_NATIVE
7626  /* We need to check standard_exec_prefix/spec_machine_suffix/specs
7627     for any override of as, ld and libraries.  */
7628  specs_file = (char *) alloca (strlen (standard_exec_prefix)
7629		       + strlen (spec_machine_suffix) + sizeof ("specs"));
7630  strcpy (specs_file, standard_exec_prefix);
7631  strcat (specs_file, spec_machine_suffix);
7632  strcat (specs_file, "specs");
7633  if (access (specs_file, R_OK) == 0)
7634    read_specs (specs_file, true, false);
7635#endif
7636
7637  /* Process any configure-time defaults specified for the command line
7638     options, via OPTION_DEFAULT_SPECS.  */
7639  for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
7640    do_option_spec (option_default_specs[i].name,
7641		    option_default_specs[i].spec);
7642
7643  /* Process DRIVER_SELF_SPECS, adding any new options to the end
7644     of the command line.  */
7645
7646  for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
7647    do_self_spec (driver_self_specs[i]);
7648
7649  /* If not cross-compiling, look for executables in the standard
7650     places.  */
7651  if (*cross_compile == '0')
7652    {
7653      if (*md_exec_prefix)
7654	{
7655	  add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
7656		      PREFIX_PRIORITY_LAST, 0, 0);
7657	}
7658    }
7659
7660  /* Process sysroot_suffix_spec.  */
7661  if (*sysroot_suffix_spec != 0
7662      && !no_sysroot_suffix
7663      && do_spec_2 (sysroot_suffix_spec, NULL) == 0)
7664    {
7665      if (argbuf.length () > 1)
7666	error ("spec failure: more than one argument to "
7667	       "%<SYSROOT_SUFFIX_SPEC%>");
7668      else if (argbuf.length () == 1)
7669        target_sysroot_suffix = xstrdup (argbuf.last ());
7670    }
7671
7672#ifdef HAVE_LD_SYSROOT
7673  /* Pass the --sysroot option to the linker, if it supports that.  If
7674     there is a sysroot_suffix_spec, it has already been processed by
7675     this point, so target_system_root really is the system root we
7676     should be using.  */
7677  if (target_system_root)
7678    {
7679      obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
7680      obstack_grow0 (&obstack, link_spec, strlen (link_spec));
7681      set_spec ("link", XOBFINISH (&obstack, const char *), false);
7682    }
7683#endif
7684
7685  /* Process sysroot_hdrs_suffix_spec.  */
7686  if (*sysroot_hdrs_suffix_spec != 0
7687      && !no_sysroot_suffix
7688      && do_spec_2 (sysroot_hdrs_suffix_spec, NULL) == 0)
7689    {
7690      if (argbuf.length () > 1)
7691	error ("spec failure: more than one argument "
7692	       "to %<SYSROOT_HEADERS_SUFFIX_SPEC%>");
7693      else if (argbuf.length () == 1)
7694        target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
7695    }
7696
7697  /* Look for startfiles in the standard places.  */
7698  if (*startfile_prefix_spec != 0
7699      && do_spec_2 (startfile_prefix_spec, NULL) == 0
7700      && do_spec_1 (" ", 0, NULL) == 0)
7701    {
7702      const char *arg;
7703      int ndx;
7704      FOR_EACH_VEC_ELT (argbuf, ndx, arg)
7705	add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
7706			      PREFIX_PRIORITY_LAST, 0, 1);
7707    }
7708  /* We should eventually get rid of all these and stick to
7709     startfile_prefix_spec exclusively.  */
7710  else if (*cross_compile == '0' || target_system_root)
7711    {
7712      if (*md_startfile_prefix)
7713	add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
7714			      "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7715
7716      if (*md_startfile_prefix_1)
7717	add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
7718			      "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7719
7720      /* If standard_startfile_prefix is relative, base it on
7721	 standard_exec_prefix.  This lets us move the installed tree
7722	 as a unit.  If GCC_EXEC_PREFIX is defined, base
7723	 standard_startfile_prefix on that as well.
7724
7725         If the prefix is relative, only search it for native compilers;
7726         otherwise we will search a directory containing host libraries.  */
7727      if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
7728	add_sysrooted_prefix (&startfile_prefixes,
7729			      standard_startfile_prefix, "BINUTILS",
7730			      PREFIX_PRIORITY_LAST, 0, 1);
7731      else if (*cross_compile == '0')
7732	{
7733#if !defined(NETBSD_NATIVE) && !defined(NETBSD_TOOLS)
7734	  add_prefix (&startfile_prefixes,
7735		      concat (gcc_exec_prefix
7736			      ? gcc_exec_prefix : standard_exec_prefix,
7737			      machine_suffix,
7738			      standard_startfile_prefix, NULL),
7739		      NULL, PREFIX_PRIORITY_LAST, 0, 1);
7740#endif /* NETBSD_NATIVE */
7741	}
7742
7743#if !defined(NETBSD_NATIVE) && !defined(NETBSD_TOOLS)
7744      /* Sysrooted prefixes are relocated because target_system_root is
7745	 also relocated by gcc_exec_prefix.  */
7746      if (*standard_startfile_prefix_1)
7747 	add_sysrooted_prefix (&startfile_prefixes,
7748			      standard_startfile_prefix_1, "BINUTILS",
7749			      PREFIX_PRIORITY_LAST, 0, 1);
7750      if (*standard_startfile_prefix_2)
7751	add_sysrooted_prefix (&startfile_prefixes,
7752			      standard_startfile_prefix_2, "BINUTILS",
7753			      PREFIX_PRIORITY_LAST, 0, 1);
7754#endif /* NETBSD_NATIVE */
7755    }
7756
7757  /* Process any user specified specs in the order given on the command
7758     line.  */
7759  for (struct user_specs *uptr = user_specs_head; uptr; uptr = uptr->next)
7760    {
7761      char *filename = find_a_file (&startfile_prefixes, uptr->filename,
7762				    R_OK, true);
7763      read_specs (filename ? filename : uptr->filename, false, true);
7764    }
7765
7766  /* Process any user self specs.  */
7767  {
7768    struct spec_list *sl;
7769    for (sl = specs; sl; sl = sl->next)
7770      if (sl->name_len == sizeof "self_spec" - 1
7771	  && !strcmp (sl->name, "self_spec"))
7772	do_self_spec (*sl->ptr_spec);
7773  }
7774
7775  if (compare_debug)
7776    {
7777      enum save_temps save;
7778
7779      if (!compare_debug_second)
7780	{
7781	  n_switches_debug_check[1] = n_switches;
7782	  n_switches_alloc_debug_check[1] = n_switches_alloc;
7783	  switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
7784					     n_switches_alloc);
7785
7786	  do_self_spec ("%:compare-debug-self-opt()");
7787	  n_switches_debug_check[0] = n_switches;
7788	  n_switches_alloc_debug_check[0] = n_switches_alloc;
7789	  switches_debug_check[0] = switches;
7790
7791	  n_switches = n_switches_debug_check[1];
7792	  n_switches_alloc = n_switches_alloc_debug_check[1];
7793	  switches = switches_debug_check[1];
7794	}
7795
7796      /* Avoid crash when computing %j in this early.  */
7797      save = save_temps_flag;
7798      save_temps_flag = SAVE_TEMPS_NONE;
7799
7800      compare_debug = -compare_debug;
7801      do_self_spec ("%:compare-debug-self-opt()");
7802
7803      save_temps_flag = save;
7804
7805      if (!compare_debug_second)
7806	{
7807	  n_switches_debug_check[1] = n_switches;
7808	  n_switches_alloc_debug_check[1] = n_switches_alloc;
7809	  switches_debug_check[1] = switches;
7810	  compare_debug = -compare_debug;
7811	  n_switches = n_switches_debug_check[0];
7812	  n_switches_alloc = n_switches_debug_check[0];
7813	  switches = switches_debug_check[0];
7814	}
7815    }
7816
7817
7818  /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
7819  if (gcc_exec_prefix)
7820    gcc_exec_prefix = concat (gcc_exec_prefix, spec_host_machine,
7821			      dir_separator_str, spec_version,
7822			      accel_dir_suffix, dir_separator_str, NULL);
7823
7824  /* Now we have the specs.
7825     Set the `valid' bits for switches that match anything in any spec.  */
7826
7827  validate_all_switches ();
7828
7829  /* Now that we have the switches and the specs, set
7830     the subdirectory based on the options.  */
7831  set_multilib_dir ();
7832}
7833
7834/* Set up to remember the pathname of gcc and any options
7835   needed for collect.  We use argv[0] instead of progname because
7836   we need the complete pathname.  */
7837
7838void
7839driver::putenv_COLLECT_GCC (const char *argv0) const
7840{
7841  obstack_init (&collect_obstack);
7842  obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
7843  obstack_grow (&collect_obstack, argv0, strlen (argv0) + 1);
7844  xputenv (XOBFINISH (&collect_obstack, char *));
7845}
7846
7847/* Set up to remember the pathname of the lto wrapper. */
7848
7849void
7850driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
7851{
7852  char *lto_wrapper_file;
7853
7854  if (have_c)
7855    lto_wrapper_file = NULL;
7856  else
7857    lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
7858				    X_OK, false);
7859  if (lto_wrapper_file)
7860    {
7861      lto_wrapper_file = convert_white_space (lto_wrapper_file);
7862      lto_wrapper_spec = lto_wrapper_file;
7863      obstack_init (&collect_obstack);
7864      obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
7865		    sizeof ("COLLECT_LTO_WRAPPER=") - 1);
7866      obstack_grow (&collect_obstack, lto_wrapper_spec,
7867		    strlen (lto_wrapper_spec) + 1);
7868      xputenv (XOBFINISH (&collect_obstack, char *));
7869    }
7870
7871}
7872
7873/* Set up to remember the names of offload targets.  */
7874
7875void
7876driver::maybe_putenv_OFFLOAD_TARGETS () const
7877{
7878  if (offload_targets && offload_targets[0] != '\0')
7879    {
7880      obstack_grow (&collect_obstack, "OFFLOAD_TARGET_NAMES=",
7881		    sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
7882      obstack_grow (&collect_obstack, offload_targets,
7883		    strlen (offload_targets) + 1);
7884      xputenv (XOBFINISH (&collect_obstack, char *));
7885    }
7886
7887  free (offload_targets);
7888  offload_targets = NULL;
7889}
7890
7891/* Reject switches that no pass was interested in.  */
7892
7893void
7894driver::handle_unrecognized_options ()
7895{
7896  for (size_t i = 0; (int) i < n_switches; i++)
7897    if (! switches[i].validated)
7898      {
7899	const char *hint = m_option_proposer.suggest_option (switches[i].part1);
7900	if (hint)
7901	  error ("unrecognized command-line option %<-%s%>;"
7902		 " did you mean %<-%s%>?",
7903		 switches[i].part1, hint);
7904	else
7905	  error ("unrecognized command-line option %<-%s%>",
7906		 switches[i].part1);
7907      }
7908}
7909
7910/* Handle the various -print-* options, returning 0 if the driver
7911   should exit, or nonzero if the driver should continue.  */
7912
7913int
7914driver::maybe_print_and_exit () const
7915{
7916  if (print_search_dirs)
7917    {
7918      printf (_("install: %s%s\n"),
7919	      gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
7920	      gcc_exec_prefix ? "" : machine_suffix);
7921      printf (_("programs: %s\n"),
7922	      build_search_list (&exec_prefixes, "", false, false));
7923      printf (_("libraries: %s\n"),
7924	      build_search_list (&startfile_prefixes, "", false, true));
7925      return (0);
7926    }
7927
7928  if (print_file_name)
7929    {
7930      printf ("%s\n", find_file (print_file_name));
7931      return (0);
7932    }
7933
7934  if (print_prog_name)
7935    {
7936      if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
7937	{
7938	  /* Append USE_LD to the default linker.  */
7939#ifdef DEFAULT_LINKER
7940	  char *ld;
7941# ifdef HAVE_HOST_EXECUTABLE_SUFFIX
7942	  int len = (sizeof (DEFAULT_LINKER)
7943		     - sizeof (HOST_EXECUTABLE_SUFFIX));
7944	  ld = NULL;
7945	  if (len > 0)
7946	    {
7947	      char *default_linker = xstrdup (DEFAULT_LINKER);
7948	      /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
7949		 HOST_EXECUTABLE_SUFFIX.  */
7950	      if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
7951		{
7952		  default_linker[len] = '\0';
7953		  ld = concat (default_linker, use_ld,
7954			       HOST_EXECUTABLE_SUFFIX, NULL);
7955		}
7956	    }
7957	  if (ld == NULL)
7958# endif
7959	  ld = concat (DEFAULT_LINKER, use_ld, NULL);
7960	  if (access (ld, X_OK) == 0)
7961	    {
7962	      printf ("%s\n", ld);
7963	      return (0);
7964	    }
7965#endif
7966	  print_prog_name = concat (print_prog_name, use_ld, NULL);
7967	}
7968      char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
7969      printf ("%s\n", (newname ? newname : print_prog_name));
7970      return (0);
7971    }
7972
7973  if (print_multi_lib)
7974    {
7975      print_multilib_info ();
7976      return (0);
7977    }
7978
7979  if (print_multi_directory)
7980    {
7981      if (multilib_dir == NULL)
7982	printf (".\n");
7983      else
7984	printf ("%s\n", multilib_dir);
7985      return (0);
7986    }
7987
7988  if (print_multiarch)
7989    {
7990      if (multiarch_dir == NULL)
7991	printf ("\n");
7992      else
7993	printf ("%s\n", multiarch_dir);
7994      return (0);
7995    }
7996
7997  if (print_sysroot)
7998    {
7999      if (target_system_root)
8000	{
8001          if (target_sysroot_suffix)
8002	    printf ("%s%s\n", target_system_root, target_sysroot_suffix);
8003          else
8004	    printf ("%s\n", target_system_root);
8005	}
8006      return (0);
8007    }
8008
8009  if (print_multi_os_directory)
8010    {
8011      if (multilib_os_dir == NULL)
8012	printf (".\n");
8013      else
8014	printf ("%s\n", multilib_os_dir);
8015      return (0);
8016    }
8017
8018  if (print_sysroot_headers_suffix)
8019    {
8020      if (*sysroot_hdrs_suffix_spec)
8021	{
8022	  printf("%s\n", (target_sysroot_hdrs_suffix
8023			  ? target_sysroot_hdrs_suffix
8024			  : ""));
8025	  return (0);
8026	}
8027      else
8028	/* The error status indicates that only one set of fixed
8029	   headers should be built.  */
8030	fatal_error (input_location,
8031		     "not configured with sysroot headers suffix");
8032    }
8033
8034  if (print_help_list)
8035    {
8036      display_help ();
8037
8038      if (! verbose_flag)
8039	{
8040	  printf (_("\nFor bug reporting instructions, please see:\n"));
8041	  printf ("%s.\n", bug_report_url);
8042
8043	  return (0);
8044	}
8045
8046      /* We do not exit here.  Instead we have created a fake input file
8047	 called 'help-dummy' which needs to be compiled, and we pass this
8048	 on the various sub-processes, along with the --help switch.
8049	 Ensure their output appears after ours.  */
8050      fputc ('\n', stdout);
8051      fflush (stdout);
8052    }
8053
8054  if (print_version)
8055    {
8056      printf (_("%s %s%s\n"), progname, pkgversion_string,
8057	      version_string);
8058      printf ("Copyright %s 2020 Free Software Foundation, Inc.\n",
8059	      _("(C)"));
8060      fputs (_("This is free software; see the source for copying conditions.  There is NO\n\
8061warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
8062	     stdout);
8063      if (! verbose_flag)
8064	return 0;
8065
8066      /* We do not exit here. We use the same mechanism of --help to print
8067	 the version of the sub-processes. */
8068      fputc ('\n', stdout);
8069      fflush (stdout);
8070    }
8071
8072  if (verbose_flag)
8073    {
8074      print_configuration (stderr);
8075      if (n_infiles == 0)
8076	return (0);
8077    }
8078
8079  return 1;
8080}
8081
8082/* Figure out what to do with each input file.
8083   Return true if we need to exit early from "main", false otherwise.  */
8084
8085bool
8086driver::prepare_infiles ()
8087{
8088  size_t i;
8089  int lang_n_infiles = 0;
8090
8091  if (n_infiles == added_libraries)
8092    fatal_error (input_location, "no input files");
8093
8094  if (seen_error ())
8095    /* Early exit needed from main.  */
8096    return true;
8097
8098  /* Make a place to record the compiler output file names
8099     that correspond to the input files.  */
8100
8101  i = n_infiles;
8102  i += lang_specific_extra_outfiles;
8103  outfiles = XCNEWVEC (const char *, i);
8104
8105  /* Record which files were specified explicitly as link input.  */
8106
8107  explicit_link_files = XCNEWVEC (char, n_infiles);
8108
8109  combine_inputs = have_o || flag_wpa;
8110
8111  for (i = 0; (int) i < n_infiles; i++)
8112    {
8113      const char *name = infiles[i].name;
8114      struct compiler *compiler = lookup_compiler (name,
8115						   strlen (name),
8116						   infiles[i].language);
8117
8118      if (compiler && !(compiler->combinable))
8119	combine_inputs = false;
8120
8121      if (lang_n_infiles > 0 && compiler != input_file_compiler
8122	  && infiles[i].language && infiles[i].language[0] != '*')
8123	infiles[i].incompiler = compiler;
8124      else if (compiler)
8125	{
8126	  lang_n_infiles++;
8127	  input_file_compiler = compiler;
8128	  infiles[i].incompiler = compiler;
8129	}
8130      else
8131	{
8132	  /* Since there is no compiler for this input file, assume it is a
8133	     linker file.  */
8134	  explicit_link_files[i] = 1;
8135	  infiles[i].incompiler = NULL;
8136	}
8137      infiles[i].compiled = false;
8138      infiles[i].preprocessed = false;
8139    }
8140
8141  if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
8142    fatal_error (input_location,
8143		 "cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> "
8144		 "with multiple files");
8145
8146  /* No early exit needed from main; we can continue.  */
8147  return false;
8148}
8149
8150/* Run the spec machinery on each input file.  */
8151
8152void
8153driver::do_spec_on_infiles () const
8154{
8155  size_t i;
8156
8157  for (i = 0; (int) i < n_infiles; i++)
8158    {
8159      int this_file_error = 0;
8160
8161      /* Tell do_spec what to substitute for %i.  */
8162
8163      input_file_number = i;
8164      set_input (infiles[i].name);
8165
8166      if (infiles[i].compiled)
8167	continue;
8168
8169      /* Use the same thing in %o, unless cp->spec says otherwise.  */
8170
8171      outfiles[i] = gcc_input_filename;
8172
8173      /* Figure out which compiler from the file's suffix.  */
8174
8175      input_file_compiler
8176	= lookup_compiler (infiles[i].name, input_filename_length,
8177			   infiles[i].language);
8178
8179      if (input_file_compiler)
8180	{
8181	  /* Ok, we found an applicable compiler.  Run its spec.  */
8182
8183	  if (input_file_compiler->spec[0] == '#')
8184	    {
8185	      error ("%s: %s compiler not installed on this system",
8186		     gcc_input_filename, &input_file_compiler->spec[1]);
8187	      this_file_error = 1;
8188	    }
8189	  else
8190	    {
8191	      int value;
8192
8193	      if (compare_debug)
8194		{
8195		  free (debug_check_temp_file[0]);
8196		  debug_check_temp_file[0] = NULL;
8197
8198		  free (debug_check_temp_file[1]);
8199		  debug_check_temp_file[1] = NULL;
8200		}
8201
8202	      value = do_spec (input_file_compiler->spec);
8203	      infiles[i].compiled = true;
8204	      if (value < 0)
8205		this_file_error = 1;
8206	      else if (compare_debug && debug_check_temp_file[0])
8207		{
8208		  if (verbose_flag)
8209		    inform (UNKNOWN_LOCATION,
8210			    "recompiling with %<-fcompare-debug%>");
8211
8212		  compare_debug = -compare_debug;
8213		  n_switches = n_switches_debug_check[1];
8214		  n_switches_alloc = n_switches_alloc_debug_check[1];
8215		  switches = switches_debug_check[1];
8216
8217		  value = do_spec (input_file_compiler->spec);
8218
8219		  compare_debug = -compare_debug;
8220		  n_switches = n_switches_debug_check[0];
8221		  n_switches_alloc = n_switches_alloc_debug_check[0];
8222		  switches = switches_debug_check[0];
8223
8224		  if (value < 0)
8225		    {
8226		      error ("during %<-fcompare-debug%> recompilation");
8227		      this_file_error = 1;
8228		    }
8229
8230		  gcc_assert (debug_check_temp_file[1]
8231			      && filename_cmp (debug_check_temp_file[0],
8232					       debug_check_temp_file[1]));
8233
8234		  if (verbose_flag)
8235		    inform (UNKNOWN_LOCATION, "comparing final insns dumps");
8236
8237		  if (compare_files (debug_check_temp_file))
8238		    this_file_error = 1;
8239		}
8240
8241	      if (compare_debug)
8242		{
8243		  free (debug_check_temp_file[0]);
8244		  debug_check_temp_file[0] = NULL;
8245
8246		  free (debug_check_temp_file[1]);
8247		  debug_check_temp_file[1] = NULL;
8248		}
8249	    }
8250	}
8251
8252      /* If this file's name does not contain a recognized suffix,
8253	 record it as explicit linker input.  */
8254
8255      else
8256	explicit_link_files[i] = 1;
8257
8258      /* Clear the delete-on-failure queue, deleting the files in it
8259	 if this compilation failed.  */
8260
8261      if (this_file_error)
8262	{
8263	  delete_failure_queue ();
8264	  errorcount++;
8265	}
8266      /* If this compilation succeeded, don't delete those files later.  */
8267      clear_failure_queue ();
8268    }
8269
8270  /* Reset the input file name to the first compile/object file name, for use
8271     with %b in LINK_SPEC. We use the first input file that we can find
8272     a compiler to compile it instead of using infiles.language since for
8273     languages other than C we use aliases that we then lookup later.  */
8274  if (n_infiles > 0)
8275    {
8276      int i;
8277
8278      for (i = 0; i < n_infiles ; i++)
8279	if (infiles[i].incompiler
8280	    || (infiles[i].language && infiles[i].language[0] != '*'))
8281	  {
8282	    set_input (infiles[i].name);
8283	    break;
8284	  }
8285    }
8286
8287  if (!seen_error ())
8288    {
8289      /* Make sure INPUT_FILE_NUMBER points to first available open
8290	 slot.  */
8291      input_file_number = n_infiles;
8292      if (lang_specific_pre_link ())
8293	errorcount++;
8294    }
8295}
8296
8297/* If we have to run the linker, do it now.  */
8298
8299void
8300driver::maybe_run_linker (const char *argv0) const
8301{
8302  size_t i;
8303  int linker_was_run = 0;
8304  int num_linker_inputs;
8305
8306  /* Determine if there are any linker input files.  */
8307  num_linker_inputs = 0;
8308  for (i = 0; (int) i < n_infiles; i++)
8309    if (explicit_link_files[i] || outfiles[i] != NULL)
8310      num_linker_inputs++;
8311
8312  /* Run ld to link all the compiler output files.  */
8313
8314  if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
8315    {
8316      int tmp = execution_count;
8317
8318      detect_jobserver ();
8319
8320      if (! have_c)
8321	{
8322#if HAVE_LTO_PLUGIN > 0
8323#if HAVE_LTO_PLUGIN == 2
8324	  const char *fno_use_linker_plugin = "fno-use-linker-plugin";
8325#else
8326	  const char *fuse_linker_plugin = "fuse-linker-plugin";
8327#endif
8328#endif
8329
8330	  /* We'll use ld if we can't find collect2.  */
8331	  if (! strcmp (linker_name_spec, "collect2"))
8332	    {
8333	      char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
8334	      if (s == NULL)
8335		linker_name_spec = "ld";
8336	    }
8337
8338#if HAVE_LTO_PLUGIN > 0
8339#if HAVE_LTO_PLUGIN == 2
8340	  if (!switch_matches (fno_use_linker_plugin,
8341			       fno_use_linker_plugin
8342			       + strlen (fno_use_linker_plugin), 0))
8343#else
8344	  if (switch_matches (fuse_linker_plugin,
8345			      fuse_linker_plugin
8346			      + strlen (fuse_linker_plugin), 0))
8347#endif
8348	    {
8349	      char *temp_spec = find_a_file (&exec_prefixes,
8350					     LTOPLUGINSONAME, R_OK,
8351					     false);
8352	      if (!temp_spec)
8353		fatal_error (input_location,
8354			     "%<-fuse-linker-plugin%>, but %s not found",
8355			     LTOPLUGINSONAME);
8356	      linker_plugin_file_spec = convert_white_space (temp_spec);
8357	    }
8358#endif
8359	  lto_gcc_spec = argv0;
8360	}
8361
8362      /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
8363	 for collect.  */
8364      putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
8365      putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
8366
8367      if (print_subprocess_help == 1)
8368	{
8369	  printf (_("\nLinker options\n==============\n\n"));
8370	  printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
8371		    " to the linker.\n\n"));
8372	  fflush (stdout);
8373	}
8374      int value = do_spec (link_command_spec);
8375      if (value < 0)
8376	errorcount = 1;
8377      linker_was_run = (tmp != execution_count);
8378    }
8379
8380  /* If options said don't run linker,
8381     complain about input files to be given to the linker.  */
8382
8383  if (! linker_was_run && !seen_error ())
8384    for (i = 0; (int) i < n_infiles; i++)
8385      if (explicit_link_files[i]
8386	  && !(infiles[i].language && infiles[i].language[0] == '*'))
8387	warning (0, "%s: linker input file unused because linking not done",
8388		 outfiles[i]);
8389}
8390
8391/* The end of "main".  */
8392
8393void
8394driver::final_actions () const
8395{
8396  /* Delete some or all of the temporary files we made.  */
8397
8398  if (seen_error ())
8399    delete_failure_queue ();
8400  delete_temp_files ();
8401
8402  if (print_help_list)
8403    {
8404      printf (("\nFor bug reporting instructions, please see:\n"));
8405      printf ("%s\n", bug_report_url);
8406    }
8407}
8408
8409/* Detect whether jobserver is active and working.  If not drop
8410   --jobserver-auth from MAKEFLAGS.  */
8411
8412void
8413driver::detect_jobserver () const
8414{
8415  jobserver_info jinfo;
8416  if (!jinfo.is_active && !jinfo.skipped_makeflags.empty ())
8417    xputenv (xstrdup (jinfo.skipped_makeflags.c_str ()));
8418}
8419
8420/* Determine what the exit code of the driver should be.  */
8421
8422int
8423driver::get_exit_code () const
8424{
8425  return (signal_count != 0 ? 2
8426	  : seen_error () ? (pass_exit_codes ? greatest_status : 1)
8427	  : 0);
8428}
8429
8430/* Find the proper compilation spec for the file name NAME,
8431   whose length is LENGTH.  LANGUAGE is the specified language,
8432   or 0 if this file is to be passed to the linker.  */
8433
8434static struct compiler *
8435lookup_compiler (const char *name, size_t length, const char *language)
8436{
8437  struct compiler *cp;
8438
8439  /* If this was specified by the user to be a linker input, indicate that.  */
8440  if (language != 0 && language[0] == '*')
8441    return 0;
8442
8443  /* Otherwise, look for the language, if one is spec'd.  */
8444  if (language != 0)
8445    {
8446      for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8447	if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
8448	  {
8449	    if (name != NULL && strcmp (name, "-") == 0
8450		&& (strcmp (cp->suffix, "@c-header") == 0
8451		    || strcmp (cp->suffix, "@c++-header") == 0)
8452		&& !have_E)
8453	      fatal_error (input_location,
8454			   "cannot use %<-%> as input filename for a "
8455			   "precompiled header");
8456
8457	    return cp;
8458	  }
8459
8460      error ("language %s not recognized", language);
8461      return 0;
8462    }
8463
8464  /* Look for a suffix.  */
8465  for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8466    {
8467      if (/* The suffix `-' matches only the file name `-'.  */
8468	  (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
8469	  || (strlen (cp->suffix) < length
8470	      /* See if the suffix matches the end of NAME.  */
8471	      && !strcmp (cp->suffix,
8472			  name + length - strlen (cp->suffix))
8473	 ))
8474	break;
8475    }
8476
8477#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
8478  /* Look again, but case-insensitively this time.  */
8479  if (cp < compilers)
8480    for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8481      {
8482	if (/* The suffix `-' matches only the file name `-'.  */
8483	    (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
8484	    || (strlen (cp->suffix) < length
8485		/* See if the suffix matches the end of NAME.  */
8486		&& ((!strcmp (cp->suffix,
8487			     name + length - strlen (cp->suffix))
8488		     || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
8489		    && !strcasecmp (cp->suffix,
8490				    name + length - strlen (cp->suffix)))
8491	   ))
8492	  break;
8493      }
8494#endif
8495
8496  if (cp >= compilers)
8497    {
8498      if (cp->spec[0] != '@')
8499	/* A non-alias entry: return it.  */
8500	return cp;
8501
8502      /* An alias entry maps a suffix to a language.
8503	 Search for the language; pass 0 for NAME and LENGTH
8504	 to avoid infinite recursion if language not found.  */
8505      return lookup_compiler (NULL, 0, cp->spec + 1);
8506    }
8507  return 0;
8508}
8509
8510static char *
8511save_string (const char *s, int len)
8512{
8513  char *result = XNEWVEC (char, len + 1);
8514
8515  gcc_checking_assert (strlen (s) >= (unsigned int) len);
8516  memcpy (result, s, len);
8517  result[len] = 0;
8518  return result;
8519}
8520
8521
8522static inline void
8523validate_switches_from_spec (const char *spec, bool user)
8524{
8525  const char *p = spec;
8526  char c;
8527  while ((c = *p++))
8528    if (c == '%'
8529	&& (*p == '{'
8530	    || *p == '<'
8531	    || (*p == 'W' && *++p == '{')
8532	    || (*p == '@' && *++p == '{')))
8533      /* We have a switch spec.  */
8534      p = validate_switches (p + 1, user);
8535}
8536
8537static void
8538validate_all_switches (void)
8539{
8540  struct compiler *comp;
8541  struct spec_list *spec;
8542
8543  for (comp = compilers; comp->spec; comp++)
8544    validate_switches_from_spec (comp->spec, false);
8545
8546  /* Look through the linked list of specs read from the specs file.  */
8547  for (spec = specs; spec; spec = spec->next)
8548    validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
8549
8550  validate_switches_from_spec (link_command_spec, false);
8551}
8552
8553/* Look at the switch-name that comes after START
8554   and mark as valid all supplied switches that match it.  */
8555
8556static const char *
8557validate_switches (const char *start, bool user_spec)
8558{
8559  const char *p = start;
8560  const char *atom;
8561  size_t len;
8562  int i;
8563  bool suffix = false;
8564  bool starred = false;
8565
8566#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
8567
8568next_member:
8569  SKIP_WHITE ();
8570
8571  if (*p == '!')
8572    p++;
8573
8574  SKIP_WHITE ();
8575  if (*p == '.' || *p == ',')
8576    suffix = true, p++;
8577
8578  atom = p;
8579  while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
8580	 || *p == ',' || *p == '.' || *p == '@')
8581    p++;
8582  len = p - atom;
8583
8584  if (*p == '*')
8585    starred = true, p++;
8586
8587  SKIP_WHITE ();
8588
8589  if (!suffix)
8590    {
8591      /* Mark all matching switches as valid.  */
8592      for (i = 0; i < n_switches; i++)
8593	if (!strncmp (switches[i].part1, atom, len)
8594	    && (starred || switches[i].part1[len] == '\0')
8595	    && (switches[i].known || user_spec))
8596	      switches[i].validated = true;
8597    }
8598
8599  if (*p) p++;
8600  if (*p && (p[-1] == '|' || p[-1] == '&'))
8601    goto next_member;
8602
8603  if (*p && p[-1] == ':')
8604    {
8605      while (*p && *p != ';' && *p != '}')
8606	{
8607	  if (*p == '%')
8608	    {
8609	      p++;
8610	      if (*p == '{' || *p == '<')
8611		p = validate_switches (p+1, user_spec);
8612	      else if (p[0] == 'W' && p[1] == '{')
8613		p = validate_switches (p+2, user_spec);
8614	      else if (p[0] == '@' && p[1] == '{')
8615		p = validate_switches (p+2, user_spec);
8616	    }
8617	  else
8618	    p++;
8619	}
8620
8621      if (*p) p++;
8622      if (*p && p[-1] == ';')
8623	goto next_member;
8624    }
8625
8626  return p;
8627#undef SKIP_WHITE
8628}
8629
8630struct mdswitchstr
8631{
8632  const char *str;
8633  int len;
8634};
8635
8636static struct mdswitchstr *mdswitches;
8637static int n_mdswitches;
8638
8639/* Check whether a particular argument was used.  The first time we
8640   canonicalize the switches to keep only the ones we care about.  */
8641
8642struct used_arg_t
8643{
8644 public:
8645  int operator () (const char *p, int len);
8646  void finalize ();
8647
8648 private:
8649  struct mswitchstr
8650  {
8651    const char *str;
8652    const char *replace;
8653    int len;
8654    int rep_len;
8655  };
8656
8657  mswitchstr *mswitches;
8658  int n_mswitches;
8659
8660};
8661
8662used_arg_t used_arg;
8663
8664int
8665used_arg_t::operator () (const char *p, int len)
8666{
8667  int i, j;
8668
8669  if (!mswitches)
8670    {
8671      struct mswitchstr *matches;
8672      const char *q;
8673      int cnt = 0;
8674
8675      /* Break multilib_matches into the component strings of string
8676         and replacement string.  */
8677      for (q = multilib_matches; *q != '\0'; q++)
8678	if (*q == ';')
8679	  cnt++;
8680
8681      matches
8682	= (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
8683      i = 0;
8684      q = multilib_matches;
8685      while (*q != '\0')
8686	{
8687	  matches[i].str = q;
8688	  while (*q != ' ')
8689	    {
8690	      if (*q == '\0')
8691		{
8692		invalid_matches:
8693		  fatal_error (input_location, "multilib spec %qs is invalid",
8694			       multilib_matches);
8695		}
8696	      q++;
8697	    }
8698	  matches[i].len = q - matches[i].str;
8699
8700	  matches[i].replace = ++q;
8701	  while (*q != ';' && *q != '\0')
8702	    {
8703	      if (*q == ' ')
8704		goto invalid_matches;
8705	      q++;
8706	    }
8707	  matches[i].rep_len = q - matches[i].replace;
8708	  i++;
8709	  if (*q == ';')
8710	    q++;
8711	}
8712
8713      /* Now build a list of the replacement string for switches that we care
8714	 about.  Make sure we allocate at least one entry.  This prevents
8715	 xmalloc from calling fatal, and prevents us from re-executing this
8716	 block of code.  */
8717      mswitches
8718	= XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
8719      for (i = 0; i < n_switches; i++)
8720	if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
8721	  {
8722	    int xlen = strlen (switches[i].part1);
8723	    for (j = 0; j < cnt; j++)
8724	      if (xlen == matches[j].len
8725		  && ! strncmp (switches[i].part1, matches[j].str, xlen))
8726		{
8727		  mswitches[n_mswitches].str = matches[j].replace;
8728		  mswitches[n_mswitches].len = matches[j].rep_len;
8729		  mswitches[n_mswitches].replace = (char *) 0;
8730		  mswitches[n_mswitches].rep_len = 0;
8731		  n_mswitches++;
8732		  break;
8733		}
8734	  }
8735
8736      /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
8737	 on the command line nor any options mutually incompatible with
8738	 them.  */
8739      for (i = 0; i < n_mdswitches; i++)
8740	{
8741	  const char *r;
8742
8743	  for (q = multilib_options; *q != '\0'; *q && q++)
8744	    {
8745	      while (*q == ' ')
8746		q++;
8747
8748	      r = q;
8749	      while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
8750		     || strchr (" /", q[mdswitches[i].len]) == NULL)
8751		{
8752		  while (*q != ' ' && *q != '/' && *q != '\0')
8753		    q++;
8754		  if (*q != '/')
8755		    break;
8756		  q++;
8757		}
8758
8759	      if (*q != ' ' && *q != '\0')
8760		{
8761		  while (*r != ' ' && *r != '\0')
8762		    {
8763		      q = r;
8764		      while (*q != ' ' && *q != '/' && *q != '\0')
8765			q++;
8766
8767		      if (used_arg (r, q - r))
8768			break;
8769
8770		      if (*q != '/')
8771			{
8772			  mswitches[n_mswitches].str = mdswitches[i].str;
8773			  mswitches[n_mswitches].len = mdswitches[i].len;
8774			  mswitches[n_mswitches].replace = (char *) 0;
8775			  mswitches[n_mswitches].rep_len = 0;
8776			  n_mswitches++;
8777			  break;
8778			}
8779
8780		      r = q + 1;
8781		    }
8782		  break;
8783		}
8784	    }
8785	}
8786    }
8787
8788  for (i = 0; i < n_mswitches; i++)
8789    if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
8790      return 1;
8791
8792  return 0;
8793}
8794
8795void used_arg_t::finalize ()
8796{
8797  XDELETEVEC (mswitches);
8798  mswitches = NULL;
8799  n_mswitches = 0;
8800}
8801
8802
8803static int
8804default_arg (const char *p, int len)
8805{
8806  int i;
8807
8808  for (i = 0; i < n_mdswitches; i++)
8809    if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
8810      return 1;
8811
8812  return 0;
8813}
8814
8815/* Work out the subdirectory to use based on the options. The format of
8816   multilib_select is a list of elements. Each element is a subdirectory
8817   name followed by a list of options followed by a semicolon. The format
8818   of multilib_exclusions is the same, but without the preceding
8819   directory. First gcc will check the exclusions, if none of the options
8820   beginning with an exclamation point are present, and all of the other
8821   options are present, then we will ignore this completely. Passing
8822   that, gcc will consider each multilib_select in turn using the same
8823   rules for matching the options. If a match is found, that subdirectory
8824   will be used.
8825   A subdirectory name is optionally followed by a colon and the corresponding
8826   multiarch name.  */
8827
8828static void
8829set_multilib_dir (void)
8830{
8831  const char *p;
8832  unsigned int this_path_len;
8833  const char *this_path, *this_arg;
8834  const char *start, *end;
8835  int not_arg;
8836  int ok, ndfltok, first;
8837
8838  n_mdswitches = 0;
8839  start = multilib_defaults;
8840  while (*start == ' ' || *start == '\t')
8841    start++;
8842  while (*start != '\0')
8843    {
8844      n_mdswitches++;
8845      while (*start != ' ' && *start != '\t' && *start != '\0')
8846	start++;
8847      while (*start == ' ' || *start == '\t')
8848        start++;
8849    }
8850
8851  if (n_mdswitches)
8852    {
8853      int i = 0;
8854
8855      mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
8856      for (start = multilib_defaults; *start != '\0'; start = end + 1)
8857	{
8858	  while (*start == ' ' || *start == '\t')
8859	    start++;
8860
8861	  if (*start == '\0')
8862	    break;
8863
8864	  for (end = start + 1;
8865	       *end != ' ' && *end != '\t' && *end != '\0'; end++)
8866	    ;
8867
8868	  obstack_grow (&multilib_obstack, start, end - start);
8869	  obstack_1grow (&multilib_obstack, 0);
8870	  mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
8871	  mdswitches[i++].len = end - start;
8872
8873	  if (*end == '\0')
8874	    break;
8875	}
8876    }
8877
8878  p = multilib_exclusions;
8879  while (*p != '\0')
8880    {
8881      /* Ignore newlines.  */
8882      if (*p == '\n')
8883	{
8884	  ++p;
8885	  continue;
8886	}
8887
8888      /* Check the arguments.  */
8889      ok = 1;
8890      while (*p != ';')
8891	{
8892	  if (*p == '\0')
8893	    {
8894	    invalid_exclusions:
8895	      fatal_error (input_location, "multilib exclusions %qs is invalid",
8896			   multilib_exclusions);
8897	    }
8898
8899	  if (! ok)
8900	    {
8901	      ++p;
8902	      continue;
8903	    }
8904
8905	  this_arg = p;
8906	  while (*p != ' ' && *p != ';')
8907	    {
8908	      if (*p == '\0')
8909		goto invalid_exclusions;
8910	      ++p;
8911	    }
8912
8913	  if (*this_arg != '!')
8914	    not_arg = 0;
8915	  else
8916	    {
8917	      not_arg = 1;
8918	      ++this_arg;
8919	    }
8920
8921	  ok = used_arg (this_arg, p - this_arg);
8922	  if (not_arg)
8923	    ok = ! ok;
8924
8925	  if (*p == ' ')
8926	    ++p;
8927	}
8928
8929      if (ok)
8930	return;
8931
8932      ++p;
8933    }
8934
8935  first = 1;
8936  p = multilib_select;
8937
8938  /* Append multilib reuse rules if any.  With those rules, we can reuse
8939     one multilib for certain different options sets.  */
8940  if (strlen (multilib_reuse) > 0)
8941    p = concat (p, multilib_reuse, NULL);
8942
8943  while (*p != '\0')
8944    {
8945      /* Ignore newlines.  */
8946      if (*p == '\n')
8947	{
8948	  ++p;
8949	  continue;
8950	}
8951
8952      /* Get the initial path.  */
8953      this_path = p;
8954      while (*p != ' ')
8955	{
8956	  if (*p == '\0')
8957	    {
8958	    invalid_select:
8959	      fatal_error (input_location, "multilib select %qs %qs is invalid",
8960			   multilib_select, multilib_reuse);
8961	    }
8962	  ++p;
8963	}
8964      this_path_len = p - this_path;
8965
8966      /* Check the arguments.  */
8967      ok = 1;
8968      ndfltok = 1;
8969      ++p;
8970      while (*p != ';')
8971	{
8972	  if (*p == '\0')
8973	    goto invalid_select;
8974
8975	  if (! ok)
8976	    {
8977	      ++p;
8978	      continue;
8979	    }
8980
8981	  this_arg = p;
8982	  while (*p != ' ' && *p != ';')
8983	    {
8984	      if (*p == '\0')
8985		goto invalid_select;
8986	      ++p;
8987	    }
8988
8989	  if (*this_arg != '!')
8990	    not_arg = 0;
8991	  else
8992	    {
8993	      not_arg = 1;
8994	      ++this_arg;
8995	    }
8996
8997	  /* If this is a default argument, we can just ignore it.
8998	     This is true even if this_arg begins with '!'.  Beginning
8999	     with '!' does not mean that this argument is necessarily
9000	     inappropriate for this library: it merely means that
9001	     there is a more specific library which uses this
9002	     argument.  If this argument is a default, we need not
9003	     consider that more specific library.  */
9004	  ok = used_arg (this_arg, p - this_arg);
9005	  if (not_arg)
9006	    ok = ! ok;
9007
9008	  if (! ok)
9009	    ndfltok = 0;
9010
9011	  if (default_arg (this_arg, p - this_arg))
9012	    ok = 1;
9013
9014	  if (*p == ' ')
9015	    ++p;
9016	}
9017
9018      if (ok && first)
9019	{
9020	  if (this_path_len != 1
9021	      || this_path[0] != '.')
9022	    {
9023	      char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
9024	      char *q;
9025
9026	      strncpy (new_multilib_dir, this_path, this_path_len);
9027	      new_multilib_dir[this_path_len] = '\0';
9028	      q = strchr (new_multilib_dir, ':');
9029	      if (q != NULL)
9030		*q = '\0';
9031	      multilib_dir = new_multilib_dir;
9032	    }
9033	  first = 0;
9034	}
9035
9036      if (ndfltok)
9037	{
9038	  const char *q = this_path, *end = this_path + this_path_len;
9039
9040	  while (q < end && *q != ':')
9041	    q++;
9042	  if (q < end)
9043	    {
9044	      const char *q2 = q + 1, *ml_end = end;
9045	      char *new_multilib_os_dir;
9046
9047	      while (q2 < end && *q2 != ':')
9048		q2++;
9049	      if (*q2 == ':')
9050		ml_end = q2;
9051	      if (ml_end - q == 1)
9052		multilib_os_dir = xstrdup (".");
9053	      else
9054		{
9055		  new_multilib_os_dir = XNEWVEC (char, ml_end - q);
9056		  memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
9057		  new_multilib_os_dir[ml_end - q - 1] = '\0';
9058		  multilib_os_dir = new_multilib_os_dir;
9059		}
9060
9061	      if (q2 < end && *q2 == ':')
9062		{
9063		  char *new_multiarch_dir = XNEWVEC (char, end - q2);
9064		  memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
9065		  new_multiarch_dir[end - q2 - 1] = '\0';
9066		  multiarch_dir = new_multiarch_dir;
9067		}
9068	      break;
9069	    }
9070	}
9071
9072      ++p;
9073    }
9074
9075  if (multilib_dir == NULL && multilib_os_dir != NULL
9076      && strcmp (multilib_os_dir, ".") == 0)
9077    {
9078      free (CONST_CAST (char *, multilib_os_dir));
9079      multilib_os_dir = NULL;
9080    }
9081  else if (multilib_dir != NULL && multilib_os_dir == NULL)
9082    multilib_os_dir = multilib_dir;
9083}
9084
9085/* Print out the multiple library subdirectory selection
9086   information.  This prints out a series of lines.  Each line looks
9087   like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
9088   required.  Only the desired options are printed out, the negative
9089   matches.  The options are print without a leading dash.  There are
9090   no spaces to make it easy to use the information in the shell.
9091   Each subdirectory is printed only once.  This assumes the ordering
9092   generated by the genmultilib script. Also, we leave out ones that match
9093   the exclusions.  */
9094
9095static void
9096print_multilib_info (void)
9097{
9098  const char *p = multilib_select;
9099  const char *last_path = 0, *this_path;
9100  int skip;
9101  unsigned int last_path_len = 0;
9102
9103  while (*p != '\0')
9104    {
9105      skip = 0;
9106      /* Ignore newlines.  */
9107      if (*p == '\n')
9108	{
9109	  ++p;
9110	  continue;
9111	}
9112
9113      /* Get the initial path.  */
9114      this_path = p;
9115      while (*p != ' ')
9116	{
9117	  if (*p == '\0')
9118	    {
9119	    invalid_select:
9120	      fatal_error (input_location,
9121			   "multilib select %qs is invalid", multilib_select);
9122	    }
9123
9124	  ++p;
9125	}
9126
9127      /* When --disable-multilib was used but target defines
9128	 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
9129         with .:: for multiarch configurations) are there just to find
9130         multilib_os_dir, so skip them from output.  */
9131      if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
9132	skip = 1;
9133
9134      /* Check for matches with the multilib_exclusions. We don't bother
9135         with the '!' in either list. If any of the exclusion rules match
9136         all of its options with the select rule, we skip it.  */
9137      {
9138	const char *e = multilib_exclusions;
9139	const char *this_arg;
9140
9141	while (*e != '\0')
9142	  {
9143	    int m = 1;
9144	    /* Ignore newlines.  */
9145	    if (*e == '\n')
9146	      {
9147		++e;
9148		continue;
9149	      }
9150
9151	    /* Check the arguments.  */
9152	    while (*e != ';')
9153	      {
9154		const char *q;
9155		int mp = 0;
9156
9157		if (*e == '\0')
9158		  {
9159		  invalid_exclusion:
9160		    fatal_error (input_location,
9161				 "multilib exclusion %qs is invalid",
9162				 multilib_exclusions);
9163		  }
9164
9165		if (! m)
9166		  {
9167		    ++e;
9168		    continue;
9169		  }
9170
9171		this_arg = e;
9172
9173		while (*e != ' ' && *e != ';')
9174		  {
9175		    if (*e == '\0')
9176		      goto invalid_exclusion;
9177		    ++e;
9178		  }
9179
9180		q = p + 1;
9181		while (*q != ';')
9182		  {
9183		    const char *arg;
9184		    int len = e - this_arg;
9185
9186		    if (*q == '\0')
9187		      goto invalid_select;
9188
9189		    arg = q;
9190
9191		    while (*q != ' ' && *q != ';')
9192		      {
9193			if (*q == '\0')
9194			  goto invalid_select;
9195			++q;
9196		      }
9197
9198		    if (! strncmp (arg, this_arg,
9199				   (len < q - arg) ? q - arg : len)
9200			|| default_arg (this_arg, e - this_arg))
9201		      {
9202			mp = 1;
9203			break;
9204		      }
9205
9206		    if (*q == ' ')
9207		      ++q;
9208		  }
9209
9210		if (! mp)
9211		  m = 0;
9212
9213		if (*e == ' ')
9214		  ++e;
9215	      }
9216
9217	    if (m)
9218	      {
9219		skip = 1;
9220		break;
9221	      }
9222
9223	    if (*e != '\0')
9224	      ++e;
9225	  }
9226      }
9227
9228      if (! skip)
9229	{
9230	  /* If this is a duplicate, skip it.  */
9231	  skip = (last_path != 0
9232		  && (unsigned int) (p - this_path) == last_path_len
9233		  && ! filename_ncmp (last_path, this_path, last_path_len));
9234
9235	  last_path = this_path;
9236	  last_path_len = p - this_path;
9237	}
9238
9239      /* If this directory requires any default arguments, we can skip
9240	 it.  We will already have printed a directory identical to
9241	 this one which does not require that default argument.  */
9242      if (! skip)
9243	{
9244	  const char *q;
9245
9246	  q = p + 1;
9247	  while (*q != ';')
9248	    {
9249	      const char *arg;
9250
9251	      if (*q == '\0')
9252		goto invalid_select;
9253
9254	      if (*q == '!')
9255		arg = NULL;
9256	      else
9257		arg = q;
9258
9259	      while (*q != ' ' && *q != ';')
9260		{
9261		  if (*q == '\0')
9262		    goto invalid_select;
9263		  ++q;
9264		}
9265
9266	      if (arg != NULL
9267		  && default_arg (arg, q - arg))
9268		{
9269		  skip = 1;
9270		  break;
9271		}
9272
9273	      if (*q == ' ')
9274		++q;
9275	    }
9276	}
9277
9278      if (! skip)
9279	{
9280	  const char *p1;
9281
9282	  for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
9283	    putchar (*p1);
9284	  putchar (';');
9285	}
9286
9287      ++p;
9288      while (*p != ';')
9289	{
9290	  int use_arg;
9291
9292	  if (*p == '\0')
9293	    goto invalid_select;
9294
9295	  if (skip)
9296	    {
9297	      ++p;
9298	      continue;
9299	    }
9300
9301	  use_arg = *p != '!';
9302
9303	  if (use_arg)
9304	    putchar ('@');
9305
9306	  while (*p != ' ' && *p != ';')
9307	    {
9308	      if (*p == '\0')
9309		goto invalid_select;
9310	      if (use_arg)
9311		putchar (*p);
9312	      ++p;
9313	    }
9314
9315	  if (*p == ' ')
9316	    ++p;
9317	}
9318
9319      if (! skip)
9320	{
9321	  /* If there are extra options, print them now.  */
9322	  if (multilib_extra && *multilib_extra)
9323	    {
9324	      int print_at = TRUE;
9325	      const char *q;
9326
9327	      for (q = multilib_extra; *q != '\0'; q++)
9328		{
9329		  if (*q == ' ')
9330		    print_at = TRUE;
9331		  else
9332		    {
9333		      if (print_at)
9334			putchar ('@');
9335		      putchar (*q);
9336		      print_at = FALSE;
9337		    }
9338		}
9339	    }
9340
9341	  putchar ('\n');
9342	}
9343
9344      ++p;
9345    }
9346}
9347
9348/* getenv built-in spec function.
9349
9350   Returns the value of the environment variable given by its first argument,
9351   concatenated with the second argument.  If the variable is not defined, a
9352   fatal error is issued unless such undefs are internally allowed, in which
9353   case the variable name prefixed by a '/' is used as the variable value.
9354
9355   The leading '/' allows using the result at a spot where a full path would
9356   normally be expected and when the actual value doesn't really matter since
9357   undef vars are allowed.  */
9358
9359static const char *
9360getenv_spec_function (int argc, const char **argv)
9361{
9362  const char *value;
9363  const char *varname;
9364
9365  char *result;
9366  char *ptr;
9367  size_t len;
9368
9369  if (argc != 2)
9370    return NULL;
9371
9372  varname = argv[0];
9373  value = env.get (varname);
9374
9375  /* If the variable isn't defined and this is allowed, craft our expected
9376     return value.  Assume variable names used in specs strings don't contain
9377     any active spec character so don't need escaping.  */
9378  if (!value && spec_undefvar_allowed)
9379    {
9380      result = XNEWVAR (char, strlen(varname) + 2);
9381      sprintf (result, "/%s", varname);
9382      return result;
9383    }
9384
9385  if (!value)
9386    fatal_error (input_location,
9387		 "environment variable %qs not defined", varname);
9388
9389  /* We have to escape every character of the environment variable so
9390     they are not interpreted as active spec characters.  A
9391     particularly painful case is when we are reading a variable
9392     holding a windows path complete with \ separators.  */
9393  len = strlen (value) * 2 + strlen (argv[1]) + 1;
9394  result = XNEWVAR (char, len);
9395  for (ptr = result; *value; ptr += 2)
9396    {
9397      ptr[0] = '\\';
9398      ptr[1] = *value++;
9399    }
9400
9401  strcpy (ptr, argv[1]);
9402
9403  return result;
9404}
9405
9406/* if-exists built-in spec function.
9407
9408   Checks to see if the file specified by the absolute pathname in
9409   ARGS exists.  Returns that pathname if found.
9410
9411   The usual use for this function is to check for a library file
9412   (whose name has been expanded with %s).  */
9413
9414static const char *
9415if_exists_spec_function (int argc, const char **argv)
9416{
9417  /* Must have only one argument.  */
9418  if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
9419    return argv[0];
9420
9421  return NULL;
9422}
9423
9424/* if-exists-else built-in spec function.
9425
9426   This is like if-exists, but takes an additional argument which
9427   is returned if the first argument does not exist.  */
9428
9429static const char *
9430if_exists_else_spec_function (int argc, const char **argv)
9431{
9432  /* Must have exactly two arguments.  */
9433  if (argc != 2)
9434    return NULL;
9435
9436  if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
9437    return argv[0];
9438
9439  return argv[1];
9440}
9441
9442/* sanitize built-in spec function.
9443
9444   This returns non-NULL, if sanitizing address, thread or
9445   any of the undefined behavior sanitizers.  */
9446
9447static const char *
9448sanitize_spec_function (int argc, const char **argv)
9449{
9450  if (argc != 1)
9451    return NULL;
9452
9453  if (strcmp (argv[0], "address") == 0)
9454    return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
9455  if (strcmp (argv[0], "kernel-address") == 0)
9456    return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
9457  if (strcmp (argv[0], "thread") == 0)
9458    return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
9459  if (strcmp (argv[0], "undefined") == 0)
9460    return ((flag_sanitize
9461	     & (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT))
9462	    && !flag_sanitize_undefined_trap_on_error) ? "" : NULL;
9463  if (strcmp (argv[0], "leak") == 0)
9464    return ((flag_sanitize
9465	     & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
9466	    == SANITIZE_LEAK) ? "" : NULL;
9467  return NULL;
9468}
9469
9470/* replace-outfile built-in spec function.
9471
9472   This looks for the first argument in the outfiles array's name and
9473   replaces it with the second argument.  */
9474
9475static const char *
9476replace_outfile_spec_function (int argc, const char **argv)
9477{
9478  int i;
9479  /* Must have exactly two arguments.  */
9480  if (argc != 2)
9481    abort ();
9482
9483  for (i = 0; i < n_infiles; i++)
9484    {
9485      if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
9486	outfiles[i] = xstrdup (argv[1]);
9487    }
9488  return NULL;
9489}
9490
9491/* remove-outfile built-in spec function.
9492 *
9493 *    This looks for the first argument in the outfiles array's name and
9494 *       removes it.  */
9495
9496static const char *
9497remove_outfile_spec_function (int argc, const char **argv)
9498{
9499  int i;
9500  /* Must have exactly one argument.  */
9501  if (argc != 1)
9502    abort ();
9503
9504  for (i = 0; i < n_infiles; i++)
9505    {
9506      if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
9507        outfiles[i] = NULL;
9508    }
9509  return NULL;
9510}
9511
9512/* Given two version numbers, compares the two numbers.
9513   A version number must match the regular expression
9514   ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
9515*/
9516static int
9517compare_version_strings (const char *v1, const char *v2)
9518{
9519  int rresult;
9520  regex_t r;
9521
9522  if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
9523	       REG_EXTENDED | REG_NOSUB) != 0)
9524    abort ();
9525  rresult = regexec (&r, v1, 0, NULL, 0);
9526  if (rresult == REG_NOMATCH)
9527    fatal_error (input_location, "invalid version number %qs", v1);
9528  else if (rresult != 0)
9529    abort ();
9530  rresult = regexec (&r, v2, 0, NULL, 0);
9531  if (rresult == REG_NOMATCH)
9532    fatal_error (input_location, "invalid version number %qs", v2);
9533  else if (rresult != 0)
9534    abort ();
9535
9536  return strverscmp (v1, v2);
9537}
9538
9539
9540/* version_compare built-in spec function.
9541
9542   This takes an argument of the following form:
9543
9544   <comparison-op> <arg1> [<arg2>] <switch> <result>
9545
9546   and produces "result" if the comparison evaluates to true,
9547   and nothing if it doesn't.
9548
9549   The supported <comparison-op> values are:
9550
9551   >=  true if switch is a later (or same) version than arg1
9552   !>  opposite of >=
9553   <   true if switch is an earlier version than arg1
9554   !<  opposite of <
9555   ><  true if switch is arg1 or later, and earlier than arg2
9556   <>  true if switch is earlier than arg1 or is arg2 or later
9557
9558   If the switch is not present, the condition is false unless
9559   the first character of the <comparison-op> is '!'.
9560
9561   For example,
9562   %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
9563   adds -lmx if -mmacosx-version-min=10.3.9 was passed.  */
9564
9565static const char *
9566version_compare_spec_function (int argc, const char **argv)
9567{
9568  int comp1, comp2;
9569  size_t switch_len;
9570  const char *switch_value = NULL;
9571  int nargs = 1, i;
9572  bool result;
9573
9574  if (argc < 3)
9575    fatal_error (input_location, "too few arguments to %%:version-compare");
9576  if (argv[0][0] == '\0')
9577    abort ();
9578  if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
9579    nargs = 2;
9580  if (argc != nargs + 3)
9581    fatal_error (input_location, "too many arguments to %%:version-compare");
9582
9583  switch_len = strlen (argv[nargs + 1]);
9584  for (i = 0; i < n_switches; i++)
9585    if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
9586	&& check_live_switch (i, switch_len))
9587      switch_value = switches[i].part1 + switch_len;
9588
9589  if (switch_value == NULL)
9590    comp1 = comp2 = -1;
9591  else
9592    {
9593      comp1 = compare_version_strings (switch_value, argv[1]);
9594      if (nargs == 2)
9595	comp2 = compare_version_strings (switch_value, argv[2]);
9596      else
9597	comp2 = -1;  /* This value unused.  */
9598    }
9599
9600  switch (argv[0][0] << 8 | argv[0][1])
9601    {
9602    case '>' << 8 | '=':
9603      result = comp1 >= 0;
9604      break;
9605    case '!' << 8 | '<':
9606      result = comp1 >= 0 || switch_value == NULL;
9607      break;
9608    case '<' << 8:
9609      result = comp1 < 0;
9610      break;
9611    case '!' << 8 | '>':
9612      result = comp1 < 0 || switch_value == NULL;
9613      break;
9614    case '>' << 8 | '<':
9615      result = comp1 >= 0 && comp2 < 0;
9616      break;
9617    case '<' << 8 | '>':
9618      result = comp1 < 0 || comp2 >= 0;
9619      break;
9620
9621    default:
9622      fatal_error (input_location,
9623		   "unknown operator %qs in %%:version-compare", argv[0]);
9624    }
9625  if (! result)
9626    return NULL;
9627
9628  return argv[nargs + 2];
9629}
9630
9631/* %:include builtin spec function.  This differs from %include in that it
9632   can be nested inside a spec, and thus be conditionalized.  It takes
9633   one argument, the filename, and looks for it in the startfile path.
9634   The result is always NULL, i.e. an empty expansion.  */
9635
9636static const char *
9637include_spec_function (int argc, const char **argv)
9638{
9639  char *file;
9640
9641  if (argc != 1)
9642    abort ();
9643
9644  file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
9645  read_specs (file ? file : argv[0], false, false);
9646
9647  return NULL;
9648}
9649
9650/* %:find-file spec function.  This function replaces its argument by
9651    the file found through find_file, that is the -print-file-name gcc
9652    program option. */
9653static const char *
9654find_file_spec_function (int argc, const char **argv)
9655{
9656  const char *file;
9657
9658  if (argc != 1)
9659    abort ();
9660
9661  file = find_file (argv[0]);
9662  return file;
9663}
9664
9665
9666/* %:find-plugindir spec function.  This function replaces its argument
9667    by the -iplugindir=<dir> option.  `dir' is found through find_file, that
9668    is the -print-file-name gcc program option. */
9669static const char *
9670find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
9671{
9672  const char *option;
9673
9674  if (argc != 0)
9675    abort ();
9676
9677  option = concat ("-iplugindir=", find_file ("plugin"), NULL);
9678  return option;
9679}
9680
9681
9682/* %:print-asm-header spec function.  Print a banner to say that the
9683   following output is from the assembler.  */
9684
9685static const char *
9686print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
9687				const char **argv ATTRIBUTE_UNUSED)
9688{
9689  printf (_("Assembler options\n=================\n\n"));
9690  printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
9691  fflush (stdout);
9692  return NULL;
9693}
9694
9695/* Get a random number for -frandom-seed */
9696
9697static unsigned HOST_WIDE_INT
9698get_random_number (void)
9699{
9700  unsigned HOST_WIDE_INT ret = 0;
9701  int fd;
9702
9703  fd = open ("/dev/urandom", O_RDONLY);
9704  if (fd >= 0)
9705    {
9706      read (fd, &ret, sizeof (HOST_WIDE_INT));
9707      close (fd);
9708      if (ret)
9709        return ret;
9710    }
9711
9712  /* Get some more or less random data.  */
9713#ifdef HAVE_GETTIMEOFDAY
9714  {
9715    struct timeval tv;
9716
9717    gettimeofday (&tv, NULL);
9718    ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
9719  }
9720#else
9721  {
9722    time_t now = time (NULL);
9723
9724    if (now != (time_t)-1)
9725      ret = (unsigned) now;
9726  }
9727#endif
9728
9729  return ret ^ getpid ();
9730}
9731
9732/* %:compare-debug-dump-opt spec function.  Save the last argument,
9733   expected to be the last -fdump-final-insns option, or generate a
9734   temporary.  */
9735
9736static const char *
9737compare_debug_dump_opt_spec_function (int arg,
9738				      const char **argv ATTRIBUTE_UNUSED)
9739{
9740  char *ret;
9741  char *name;
9742  int which;
9743  static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
9744
9745  if (arg != 0)
9746    fatal_error (input_location,
9747		 "too many arguments to %%:compare-debug-dump-opt");
9748
9749  do_spec_2 ("%{fdump-final-insns=*:%*}", NULL);
9750  do_spec_1 (" ", 0, NULL);
9751
9752  if (argbuf.length () > 0
9753      && strcmp (argv[argbuf.length () - 1], "."))
9754    {
9755      if (!compare_debug)
9756	return NULL;
9757
9758      name = xstrdup (argv[argbuf.length () - 1]);
9759      ret = NULL;
9760    }
9761  else
9762    {
9763      const char *ext = NULL;
9764
9765      if (argbuf.length () > 0)
9766	{
9767	  do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}", NULL);
9768	  ext = ".gkd";
9769	}
9770      else if (!compare_debug)
9771	return NULL;
9772      else
9773	do_spec_2 ("%g.gkd", NULL);
9774
9775      do_spec_1 (" ", 0, NULL);
9776
9777      gcc_assert (argbuf.length () > 0);
9778
9779      name = concat (argbuf.last (), ext, NULL);
9780
9781      ret = concat ("-fdump-final-insns=", name, NULL);
9782    }
9783
9784  which = compare_debug < 0;
9785  debug_check_temp_file[which] = name;
9786
9787  if (!which)
9788    {
9789      unsigned HOST_WIDE_INT value = get_random_number ();
9790
9791      sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
9792    }
9793
9794  if (*random_seed)
9795    {
9796      char *tmp = ret;
9797      ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
9798		    ret, NULL);
9799      free (tmp);
9800    }
9801
9802  if (which)
9803    *random_seed = 0;
9804
9805  return ret;
9806}
9807
9808static const char *debug_auxbase_opt;
9809
9810/* %:compare-debug-self-opt spec function.  Expands to the options
9811    that are to be passed in the second compilation of
9812    compare-debug.  */
9813
9814static const char *
9815compare_debug_self_opt_spec_function (int arg,
9816				      const char **argv ATTRIBUTE_UNUSED)
9817{
9818  if (arg != 0)
9819    fatal_error (input_location,
9820		 "too many arguments to %%:compare-debug-self-opt");
9821
9822  if (compare_debug >= 0)
9823    return NULL;
9824
9825  do_spec_2 ("%{c|S:%{o*:%*}}", NULL);
9826  do_spec_1 (" ", 0, NULL);
9827
9828  if (argbuf.length () > 0)
9829    debug_auxbase_opt = concat ("-auxbase-strip ",
9830				argbuf.last (),
9831				NULL);
9832  else
9833    debug_auxbase_opt = NULL;
9834
9835  return concat ("\
9836%<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
9837%<fdump-final-insns=* -w -S -o %j \
9838%{!fcompare-debug-second:-fcompare-debug-second} \
9839", compare_debug_opt, NULL);
9840}
9841
9842/* %:compare-debug-auxbase-opt spec function.  Expands to the auxbase
9843    options that are to be passed in the second compilation of
9844    compare-debug.  It expects, as an argument, the basename of the
9845    current input file name, with the .gk suffix appended to it.  */
9846
9847static const char *
9848compare_debug_auxbase_opt_spec_function (int arg,
9849					 const char **argv)
9850{
9851  char *name;
9852  int len;
9853
9854  if (arg == 0)
9855    fatal_error (input_location,
9856		 "too few arguments to %%:compare-debug-auxbase-opt");
9857
9858  if (arg != 1)
9859    fatal_error (input_location,
9860		 "too many arguments to %%:compare-debug-auxbase-opt");
9861
9862  if (compare_debug >= 0)
9863    return NULL;
9864
9865  len = strlen (argv[0]);
9866  if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
9867    fatal_error (input_location, "argument to %%:compare-debug-auxbase-opt "
9868		 "does not end in %<.gk%>");
9869
9870  if (debug_auxbase_opt)
9871    return debug_auxbase_opt;
9872
9873#define OPT "-auxbase "
9874
9875  len -= 3;
9876  name = (char*) xmalloc (sizeof (OPT) + len);
9877  memcpy (name, OPT, sizeof (OPT) - 1);
9878  memcpy (name + sizeof (OPT) - 1, argv[0], len);
9879  name[sizeof (OPT) - 1 + len] = '\0';
9880
9881#undef OPT
9882
9883  return name;
9884}
9885
9886/* %:pass-through-libs spec function.  Finds all -l options and input
9887   file names in the lib spec passed to it, and makes a list of them
9888   prepended with the plugin option to cause them to be passed through
9889   to the final link after all the new object files have been added.  */
9890
9891const char *
9892pass_through_libs_spec_func (int argc, const char **argv)
9893{
9894  char *prepended = xstrdup (" ");
9895  int n;
9896  /* Shlemiel the painter's algorithm.  Innately horrible, but at least
9897     we know that there will never be more than a handful of strings to
9898     concat, and it's only once per run, so it's not worth optimising.  */
9899  for (n = 0; n < argc; n++)
9900    {
9901      char *old = prepended;
9902      /* Anything that isn't an option is a full path to an output
9903         file; pass it through if it ends in '.a'.  Among options,
9904	 pass only -l.  */
9905      if (argv[n][0] == '-' && argv[n][1] == 'l')
9906	{
9907	  const char *lopt = argv[n] + 2;
9908	  /* Handle both joined and non-joined -l options.  If for any
9909	     reason there's a trailing -l with no joined or following
9910	     arg just discard it.  */
9911	  if (!*lopt && ++n >= argc)
9912	    break;
9913	  else if (!*lopt)
9914	    lopt = argv[n];
9915	  prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
9916		lopt, " ", NULL);
9917	}
9918      else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
9919	{
9920	  prepended = concat (prepended, "-plugin-opt=-pass-through=",
9921		argv[n], " ", NULL);
9922	}
9923      if (prepended != old)
9924	free (old);
9925    }
9926  return prepended;
9927}
9928
9929/* %:replace-extension spec function.  Replaces the extension of the
9930   first argument with the second argument.  */
9931
9932const char *
9933replace_extension_spec_func (int argc, const char **argv)
9934{
9935  char *name;
9936  char *p;
9937  char *result;
9938  int i;
9939
9940  if (argc != 2)
9941    fatal_error (input_location, "too few arguments to %%:replace-extension");
9942
9943  name = xstrdup (argv[0]);
9944
9945  for (i = strlen (name) - 1; i >= 0; i--)
9946    if (IS_DIR_SEPARATOR (name[i]))
9947      break;
9948
9949  p = strrchr (name + i + 1, '.');
9950  if (p != NULL)
9951      *p = '\0';
9952
9953  result = concat (name, argv[1], NULL);
9954
9955  free (name);
9956  return result;
9957}
9958
9959/* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
9960   Otherwise, return NULL.  */
9961
9962static const char *
9963greater_than_spec_func (int argc, const char **argv)
9964{
9965  char *converted;
9966
9967  if (argc == 1)
9968    return NULL;
9969
9970  gcc_assert (argc >= 2);
9971
9972  long arg = strtol (argv[argc - 2], &converted, 10);
9973  gcc_assert (converted != argv[argc - 2]);
9974
9975  long lim = strtol (argv[argc - 1], &converted, 10);
9976  gcc_assert (converted != argv[argc - 1]);
9977
9978  if (arg > lim)
9979    return "";
9980
9981  return NULL;
9982}
9983
9984/* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
9985   Otherwise, return NULL.  */
9986
9987static const char *
9988debug_level_greater_than_spec_func (int argc, const char **argv)
9989{
9990  char *converted;
9991
9992  if (argc != 1)
9993    fatal_error (input_location,
9994		 "wrong number of arguments to %%:debug-level-gt");
9995
9996  long arg = strtol (argv[0], &converted, 10);
9997  gcc_assert (converted != argv[0]);
9998
9999  if (debug_info_level > arg)
10000    return "";
10001
10002  return NULL;
10003}
10004
10005static void
10006path_prefix_reset (path_prefix *prefix)
10007{
10008  struct prefix_list *iter, *next;
10009  iter = prefix->plist;
10010  while (iter)
10011    {
10012      next = iter->next;
10013      free (const_cast <char *> (iter->prefix));
10014      XDELETE (iter);
10015      iter = next;
10016    }
10017  prefix->plist = 0;
10018  prefix->max_len = 0;
10019}
10020
10021/* The function takes 3 arguments: OPTION name, file name and location
10022   where we search for Fortran modules.
10023   When the FILE is found by find_file, return OPTION=path_to_file.  */
10024
10025static const char *
10026find_fortran_preinclude_file (int argc, const char **argv)
10027{
10028  char *result = NULL;
10029  if (argc != 3)
10030    return NULL;
10031
10032  struct path_prefix prefixes = { 0, 0, "preinclude" };
10033
10034  /* Search first for 'finclude' folder location for a header file
10035     installed by the compiler (similar to omp_lib.h).  */
10036  add_prefix (&prefixes, argv[2], NULL, 0, 0, 0);
10037#ifdef TOOL_INCLUDE_DIR
10038  /* Then search: <prefix>/<target>/<include>/finclude */
10039  add_prefix (&prefixes, TOOL_INCLUDE_DIR "/finclude/",
10040	      NULL, 0, 0, 0);
10041#endif
10042#ifdef NATIVE_SYSTEM_HEADER_DIR
10043  /* Then search: <sysroot>/usr/include/finclude/<multilib> */
10044  add_sysrooted_hdrs_prefix (&prefixes, NATIVE_SYSTEM_HEADER_DIR "/finclude/",
10045			     NULL, 0, 0, 0);
10046#endif
10047
10048  const char *path = find_a_file (&include_prefixes, argv[1], R_OK, false);
10049  if (path != NULL)
10050    result = concat (argv[0], path, NULL);
10051  else
10052    {
10053      path = find_a_file (&prefixes, argv[1], R_OK, false);
10054      if (path != NULL)
10055	result = concat (argv[0], path, NULL);
10056    }
10057
10058  path_prefix_reset (&prefixes);
10059  return result;
10060}
10061
10062
10063/* Insert backslash before spaces in ORIG (usually a file path), to
10064   avoid being broken by spec parser.
10065
10066   This function is needed as do_spec_1 treats white space (' ' and '\t')
10067   as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
10068   the file name should be treated as a single argument rather than being
10069   broken into multiple. Solution is to insert '\\' before the space in a
10070   file name.
10071
10072   This function converts and only converts all occurrence of ' '
10073   to '\\' + ' ' and '\t' to '\\' + '\t'.  For example:
10074   "a b"  -> "a\\ b"
10075   "a  b" -> "a\\ \\ b"
10076   "a\tb" -> "a\\\tb"
10077   "a\\ b" -> "a\\\\ b"
10078
10079   orig: input null-terminating string that was allocated by xalloc. The
10080   memory it points to might be freed in this function. Behavior undefined
10081   if ORIG wasn't xalloced or was freed already at entry.
10082
10083   Return: ORIG if no conversion needed. Otherwise a newly allocated string
10084   that was converted from ORIG.  */
10085
10086static char *
10087convert_white_space (char *orig)
10088{
10089  int len, number_of_space = 0;
10090
10091  for (len = 0; orig[len]; len++)
10092    if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
10093
10094  if (number_of_space)
10095    {
10096      char *new_spec = (char *) xmalloc (len + number_of_space + 1);
10097      int j, k;
10098      for (j = 0, k = 0; j <= len; j++, k++)
10099	{
10100	  if (orig[j] == ' ' || orig[j] == '\t')
10101	    new_spec[k++] = '\\';
10102	  new_spec[k] = orig[j];
10103	}
10104      free (orig);
10105      return new_spec;
10106  }
10107  else
10108    return orig;
10109}
10110
10111/* Restore all state within gcc.c to the initial state, so that the driver
10112   code can be safely re-run in-process.
10113
10114   Many const char * variables are referenced by static specs (see
10115   INIT_STATIC_SPEC above).  These variables are restored to their default
10116   values by a simple loop over the static specs.
10117
10118   For other variables, we directly restore them all to their initial
10119   values (often implicitly 0).
10120
10121   Free the various obstacks in this file, along with "opts_obstack"
10122   from opts.c.
10123
10124   This function also restores any environment variables that were changed.  */
10125
10126void
10127driver::finalize ()
10128{
10129  env.restore ();
10130  diagnostic_finish (global_dc);
10131
10132  is_cpp_driver = 0;
10133  at_file_supplied = 0;
10134  print_help_list = 0;
10135  print_version = 0;
10136  verbose_only_flag = 0;
10137  print_subprocess_help = 0;
10138  use_ld = NULL;
10139  report_times_to_file = NULL;
10140  target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
10141  target_system_root_changed = 0;
10142  target_sysroot_suffix = 0;
10143  target_sysroot_hdrs_suffix = 0;
10144  save_temps_flag = SAVE_TEMPS_NONE;
10145  save_temps_prefix = 0;
10146  save_temps_length = 0;
10147  spec_machine = DEFAULT_TARGET_MACHINE;
10148  greatest_status = 1;
10149
10150  obstack_free (&obstack, NULL);
10151  obstack_free (&opts_obstack, NULL); /* in opts.c */
10152  obstack_free (&collect_obstack, NULL);
10153
10154  link_command_spec = LINK_COMMAND_SPEC;
10155
10156  obstack_free (&multilib_obstack, NULL);
10157
10158  user_specs_head = NULL;
10159  user_specs_tail = NULL;
10160
10161  /* Within the "compilers" vec, the fields "suffix" and "spec" were
10162     statically allocated for the default compilers, but dynamically
10163     allocated for additional compilers.  Delete them for the latter. */
10164  for (int i = n_default_compilers; i < n_compilers; i++)
10165    {
10166      free (const_cast <char *> (compilers[i].suffix));
10167      free (const_cast <char *> (compilers[i].spec));
10168    }
10169  XDELETEVEC (compilers);
10170  compilers = NULL;
10171  n_compilers = 0;
10172
10173  linker_options.truncate (0);
10174  assembler_options.truncate (0);
10175  preprocessor_options.truncate (0);
10176
10177  path_prefix_reset (&exec_prefixes);
10178  path_prefix_reset (&startfile_prefixes);
10179  path_prefix_reset (&include_prefixes);
10180
10181  machine_suffix = 0;
10182  just_machine_suffix = 0;
10183  gcc_exec_prefix = 0;
10184  gcc_libexec_prefix = 0;
10185  md_exec_prefix = MD_EXEC_PREFIX;
10186  md_startfile_prefix = MD_STARTFILE_PREFIX;
10187  md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
10188  multilib_dir = 0;
10189  multilib_os_dir = 0;
10190  multiarch_dir = 0;
10191
10192  /* Free any specs dynamically-allocated by set_spec.
10193     These will be at the head of the list, before the
10194     statically-allocated ones.  */
10195  if (specs)
10196    {
10197      while (specs != static_specs)
10198	{
10199	  spec_list *next = specs->next;
10200	  free (const_cast <char *> (specs->name));
10201	  XDELETE (specs);
10202	  specs = next;
10203	}
10204      specs = 0;
10205    }
10206  for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
10207    {
10208      spec_list *sl = &static_specs[i];
10209      if (sl->alloc_p)
10210	{
10211	  if (0)
10212	    free (const_cast <char *> (*(sl->ptr_spec)));
10213	  sl->alloc_p = false;
10214	}
10215      *(sl->ptr_spec) = sl->default_ptr;
10216    }
10217#ifdef EXTRA_SPECS
10218  extra_specs = NULL;
10219#endif
10220
10221  processing_spec_function = 0;
10222
10223  clear_args ();
10224
10225  have_c = 0;
10226  have_o = 0;
10227
10228  temp_names = NULL;
10229  execution_count = 0;
10230  signal_count = 0;
10231
10232  temp_filename = NULL;
10233  temp_filename_length = 0;
10234  always_delete_queue = NULL;
10235  failure_delete_queue = NULL;
10236
10237  XDELETEVEC (switches);
10238  switches = NULL;
10239  n_switches = 0;
10240  n_switches_alloc = 0;
10241
10242  compare_debug = 0;
10243  compare_debug_second = 0;
10244  compare_debug_opt = NULL;
10245  for (int i = 0; i < 2; i++)
10246    {
10247      switches_debug_check[i] = NULL;
10248      n_switches_debug_check[i] = 0;
10249      n_switches_alloc_debug_check[i] = 0;
10250      debug_check_temp_file[i] = NULL;
10251    }
10252
10253  XDELETEVEC (infiles);
10254  infiles = NULL;
10255  n_infiles = 0;
10256  n_infiles_alloc = 0;
10257
10258  combine_inputs = false;
10259  added_libraries = 0;
10260  XDELETEVEC (outfiles);
10261  outfiles = NULL;
10262  spec_lang = 0;
10263  last_language_n_infiles = 0;
10264  gcc_input_filename = NULL;
10265  input_file_number = 0;
10266  input_filename_length = 0;
10267  basename_length = 0;
10268  suffixed_basename_length = 0;
10269  input_basename = NULL;
10270  input_suffix = NULL;
10271  /* We don't need to purge "input_stat", just to unset "input_stat_set".  */
10272  input_stat_set = 0;
10273  input_file_compiler = NULL;
10274  arg_going = 0;
10275  delete_this_arg = 0;
10276  this_is_output_file = 0;
10277  this_is_library_file = 0;
10278  this_is_linker_script = 0;
10279  input_from_pipe = 0;
10280  suffix_subst = NULL;
10281
10282  mdswitches = NULL;
10283  n_mdswitches = 0;
10284
10285  debug_auxbase_opt = NULL;
10286
10287  used_arg.finalize ();
10288}
10289
10290/* PR jit/64810.
10291   Targets can provide configure-time default options in
10292   OPTION_DEFAULT_SPECS.  The jit needs to access these, but
10293   they are expressed in the spec language.
10294
10295   Run just enough of the driver to be able to expand these
10296   specs, and then call the callback CB on each
10297   such option.  The options strings are *without* a leading
10298   '-' character e.g. ("march=x86-64").  Finally, clean up.  */
10299
10300void
10301driver_get_configure_time_options (void (*cb) (const char *option,
10302					       void *user_data),
10303				   void *user_data)
10304{
10305  size_t i;
10306
10307  obstack_init (&obstack);
10308  init_opts_obstack ();
10309  n_switches = 0;
10310
10311  for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
10312    do_option_spec (option_default_specs[i].name,
10313		    option_default_specs[i].spec);
10314
10315  for (i = 0; (int) i < n_switches; i++)
10316    {
10317      gcc_assert (switches[i].part1);
10318      (*cb) (switches[i].part1, user_data);
10319    }
10320
10321  obstack_free (&opts_obstack, NULL);
10322  obstack_free (&obstack, NULL);
10323  n_switches = 0;
10324}
10325