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