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