c++: throw and private destructor [PR109172]
[official-gcc.git] / gcc / gcc.cc
blob16bb07f2cdc5edf0a25ce1bd221d417d6bc41d3c
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
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.
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". */
30 #define INCLUDE_STRING
31 #include "config.h"
32 #include "system.h"
33 #include "coretypes.h"
34 #include "multilib.h" /* before tm.h */
35 #include "tm.h"
36 #include "xregex.h"
37 #include "obstack.h"
38 #include "intl.h"
39 #include "prefix.h"
40 #include "opt-suggestions.h"
41 #include "gcc.h"
42 #include "diagnostic.h"
43 #include "flags.h"
44 #include "opts.h"
45 #include "filenames.h"
46 #include "spellcheck.h"
47 #include "opts-jobserver.h"
48 #include "common/common-target.h"
52 /* Manage the manipulation of env vars.
54 We poison "getenv" and "putenv", so that all enviroment-handling is
55 done through this class. Note that poisoning happens in the
56 preprocessor at the identifier level, and doesn't distinguish between
57 env.getenv ();
58 and
59 getenv ();
60 Hence we need to use "get" for the accessor method, not "getenv". */
62 struct env_manager
64 public:
65 void init (bool can_restore, bool debug);
66 const char *get (const char *name);
67 void xput (const char *string);
68 void restore ();
70 private:
71 bool m_can_restore;
72 bool m_debug;
73 struct kv
75 char *m_key;
76 char *m_value;
78 vec<kv> m_keys;
82 /* The singleton instance of class env_manager. */
84 static env_manager env;
86 /* Initializer for class env_manager.
88 We can't do this as a constructor since we have a statically
89 allocated instance ("env" above). */
91 void
92 env_manager::init (bool can_restore, bool debug)
94 m_can_restore = can_restore;
95 m_debug = debug;
98 /* Get the value of NAME within the environment. Essentially
99 a wrapper for ::getenv, but adding logging, and the possibility
100 of caching results. */
102 const char *
103 env_manager::get (const char *name)
105 const char *result = ::getenv (name);
106 if (m_debug)
107 fprintf (stderr, "env_manager::getenv (%s) -> %s\n", name, result);
108 return result;
111 /* Put the given KEY=VALUE entry STRING into the environment.
112 If the env_manager was initialized with CAN_RESTORE set, then
113 also record the old value of KEY within the environment, so that it
114 can be later restored. */
116 void
117 env_manager::xput (const char *string)
119 if (m_debug)
120 fprintf (stderr, "env_manager::xput (%s)\n", string);
121 if (verbose_flag)
122 fnotice (stderr, "%s\n", string);
124 if (m_can_restore)
126 char *equals = strchr (const_cast <char *> (string), '=');
127 gcc_assert (equals);
129 struct kv kv;
130 kv.m_key = xstrndup (string, equals - string);
131 const char *cur_value = ::getenv (kv.m_key);
132 if (m_debug)
133 fprintf (stderr, "saving old value: %s\n",cur_value);
134 kv.m_value = cur_value ? xstrdup (cur_value) : NULL;
135 m_keys.safe_push (kv);
138 ::putenv (CONST_CAST (char *, string));
141 /* Undo any xputenv changes made since last restore.
142 Can only be called if the env_manager was initialized with
143 CAN_RESTORE enabled. */
145 void
146 env_manager::restore ()
148 unsigned int i;
149 struct kv *item;
151 gcc_assert (m_can_restore);
153 FOR_EACH_VEC_ELT_REVERSE (m_keys, i, item)
155 if (m_debug)
156 printf ("restoring saved key: %s value: %s\n", item->m_key, item->m_value);
157 if (item->m_value)
158 ::setenv (item->m_key, item->m_value, 1);
159 else
160 ::unsetenv (item->m_key);
161 free (item->m_key);
162 free (item->m_value);
165 m_keys.truncate (0);
168 /* Forbid other uses of getenv and putenv. */
169 #if (GCC_VERSION >= 3000)
170 #pragma GCC poison getenv putenv
171 #endif
175 /* By default there is no special suffix for target executables. */
176 #ifdef TARGET_EXECUTABLE_SUFFIX
177 #define HAVE_TARGET_EXECUTABLE_SUFFIX
178 #else
179 #define TARGET_EXECUTABLE_SUFFIX ""
180 #endif
182 /* By default there is no special suffix for host executables. */
183 #ifdef HOST_EXECUTABLE_SUFFIX
184 #define HAVE_HOST_EXECUTABLE_SUFFIX
185 #else
186 #define HOST_EXECUTABLE_SUFFIX ""
187 #endif
189 /* By default, the suffix for target object files is ".o". */
190 #ifdef TARGET_OBJECT_SUFFIX
191 #define HAVE_TARGET_OBJECT_SUFFIX
192 #else
193 #define TARGET_OBJECT_SUFFIX ".o"
194 #endif
196 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
198 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
199 #ifndef LIBRARY_PATH_ENV
200 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
201 #endif
203 /* If a stage of compilation returns an exit status >= 1,
204 compilation of that file ceases. */
206 #define MIN_FATAL_STATUS 1
208 /* Flag set by cppspec.cc to 1. */
209 int is_cpp_driver;
211 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
212 static bool at_file_supplied;
214 /* Definition of string containing the arguments given to configure. */
215 #include "configargs.h"
217 /* Flag saying to print the command line options understood by gcc and its
218 sub-processes. */
220 static int print_help_list;
222 /* Flag saying to print the version of gcc and its sub-processes. */
224 static int print_version;
226 /* Flag that stores string prefix for which we provide bash completion. */
228 static const char *completion = NULL;
230 /* Flag indicating whether we should ONLY print the command and
231 arguments (like verbose_flag) without executing the command.
232 Displayed arguments are quoted so that the generated command
233 line is suitable for execution. This is intended for use in
234 shell scripts to capture the driver-generated command line. */
235 static int verbose_only_flag;
237 /* Flag indicating how to print command line options of sub-processes. */
239 static int print_subprocess_help;
241 /* Linker suffix passed to -fuse-ld=... */
242 static const char *use_ld;
244 /* Whether we should report subprocess execution times to a file. */
246 FILE *report_times_to_file = NULL;
248 /* Nonzero means place this string before uses of /, so that include
249 and library files can be found in an alternate location. */
251 #ifdef TARGET_SYSTEM_ROOT
252 #define DEFAULT_TARGET_SYSTEM_ROOT (TARGET_SYSTEM_ROOT)
253 #else
254 #define DEFAULT_TARGET_SYSTEM_ROOT (0)
255 #endif
256 static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
258 /* Nonzero means pass the updated target_system_root to the compiler. */
260 static int target_system_root_changed;
262 /* Nonzero means append this string to target_system_root. */
264 static const char *target_sysroot_suffix = 0;
266 /* Nonzero means append this string to target_system_root for headers. */
268 static const char *target_sysroot_hdrs_suffix = 0;
270 /* Nonzero means write "temp" files in source directory
271 and use the source file's name in them, and don't delete them. */
273 static enum save_temps {
274 SAVE_TEMPS_NONE, /* no -save-temps */
275 SAVE_TEMPS_CWD, /* -save-temps in current directory */
276 SAVE_TEMPS_DUMP, /* -save-temps in dumpdir */
277 SAVE_TEMPS_OBJ /* -save-temps in object directory */
278 } save_temps_flag;
280 /* Set this iff the dumppfx implied by a -save-temps=* option is to
281 override a -dumpdir option, if any. */
282 static bool save_temps_overrides_dumpdir = false;
284 /* -dumpdir, -dumpbase and -dumpbase-ext flags passed in, possibly
285 rearranged as they are to be passed down, e.g., dumpbase and
286 dumpbase_ext may be cleared if integrated with dumpdir or
287 dropped. */
288 static char *dumpdir, *dumpbase, *dumpbase_ext;
290 /* Usually the length of the string in dumpdir. However, during
291 linking, it may be shortened to omit a driver-added trailing dash,
292 by then replaced with a trailing period, that is still to be passed
293 to sub-processes in -dumpdir, but not to be generally used in spec
294 filename expansions. See maybe_run_linker. */
295 static size_t dumpdir_length = 0;
297 /* Set if the last character in dumpdir is (or was) a dash that the
298 driver added to dumpdir after dumpbase or linker output name. */
299 static bool dumpdir_trailing_dash_added = false;
301 /* Basename of dump and aux outputs, computed from dumpbase (given or
302 derived from output name), to override input_basename in non-%w %b
303 et al. */
304 static char *outbase;
305 static size_t outbase_length = 0;
307 /* The compiler version. */
309 static const char *compiler_version;
311 /* The target version. */
313 static const char *const spec_version = DEFAULT_TARGET_VERSION;
315 /* The target machine. */
317 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
318 static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
320 /* List of offload targets. Separated by colon. Empty string for
321 -foffload=disable. */
323 static char *offload_targets = NULL;
325 #if OFFLOAD_DEFAULTED
326 /* Set to true if -foffload has not been used and offload_targets
327 is set to the configured in default. */
328 static bool offload_targets_default;
329 #endif
331 /* Nonzero if cross-compiling.
332 When -b is used, the value comes from the `specs' file. */
334 #ifdef CROSS_DIRECTORY_STRUCTURE
335 static const char *cross_compile = "1";
336 #else
337 static const char *cross_compile = "0";
338 #endif
340 /* Greatest exit code of sub-processes that has been encountered up to
341 now. */
342 static int greatest_status = 1;
344 /* This is the obstack which we use to allocate many strings. */
346 static struct obstack obstack;
348 /* This is the obstack to build an environment variable to pass to
349 collect2 that describes all of the relevant switches of what to
350 pass the compiler in building the list of pointers to constructors
351 and destructors. */
353 static struct obstack collect_obstack;
355 /* Forward declaration for prototypes. */
356 struct path_prefix;
357 struct prefix_list;
359 static void init_spec (void);
360 static void store_arg (const char *, int, int);
361 static void insert_wrapper (const char *);
362 static char *load_specs (const char *);
363 static void read_specs (const char *, bool, bool);
364 static void set_spec (const char *, const char *, bool);
365 static struct compiler *lookup_compiler (const char *, size_t, const char *);
366 static char *build_search_list (const struct path_prefix *, const char *,
367 bool, bool);
368 static void xputenv (const char *);
369 static void putenv_from_prefixes (const struct path_prefix *, const char *,
370 bool);
371 static int access_check (const char *, int);
372 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
373 static char *find_a_program (const char *);
374 static void add_prefix (struct path_prefix *, const char *, const char *,
375 int, int, int);
376 static void add_sysrooted_prefix (struct path_prefix *, const char *,
377 const char *, int, int, int);
378 static char *skip_whitespace (char *);
379 static void delete_if_ordinary (const char *);
380 static void delete_temp_files (void);
381 static void delete_failure_queue (void);
382 static void clear_failure_queue (void);
383 static int check_live_switch (int, int);
384 static const char *handle_braces (const char *);
385 static inline bool input_suffix_matches (const char *, const char *);
386 static inline bool switch_matches (const char *, const char *, int);
387 static inline void mark_matching_switches (const char *, const char *, int);
388 static inline void process_marked_switches (void);
389 static const char *process_brace_body (const char *, const char *, const char *, int, int);
390 static const struct spec_function *lookup_spec_function (const char *);
391 static const char *eval_spec_function (const char *, const char *, const char *);
392 static const char *handle_spec_function (const char *, bool *, const char *);
393 static char *save_string (const char *, int);
394 static void set_collect_gcc_options (void);
395 static int do_spec_1 (const char *, int, const char *);
396 static int do_spec_2 (const char *, const char *);
397 static void do_option_spec (const char *, const char *);
398 static void do_self_spec (const char *);
399 static const char *find_file (const char *);
400 static int is_directory (const char *, bool);
401 static const char *validate_switches (const char *, bool, bool);
402 static void validate_all_switches (void);
403 static inline void validate_switches_from_spec (const char *, bool);
404 static void give_switch (int, int);
405 static int default_arg (const char *, int);
406 static void set_multilib_dir (void);
407 static void print_multilib_info (void);
408 static void display_help (void);
409 static void add_preprocessor_option (const char *, int);
410 static void add_assembler_option (const char *, int);
411 static void add_linker_option (const char *, int);
412 static void process_command (unsigned int, struct cl_decoded_option *);
413 static int execute (void);
414 static void alloc_args (void);
415 static void clear_args (void);
416 static void fatal_signal (int);
417 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
418 static void init_gcc_specs (struct obstack *, const char *, const char *,
419 const char *);
420 #endif
421 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
422 static const char *convert_filename (const char *, int, int);
423 #endif
425 static void try_generate_repro (const char **argv);
426 static const char *getenv_spec_function (int, const char **);
427 static const char *if_exists_spec_function (int, const char **);
428 static const char *if_exists_else_spec_function (int, const char **);
429 static const char *if_exists_then_else_spec_function (int, const char **);
430 static const char *sanitize_spec_function (int, const char **);
431 static const char *replace_outfile_spec_function (int, const char **);
432 static const char *remove_outfile_spec_function (int, const char **);
433 static const char *version_compare_spec_function (int, const char **);
434 static const char *include_spec_function (int, const char **);
435 static const char *find_file_spec_function (int, const char **);
436 static const char *find_plugindir_spec_function (int, const char **);
437 static const char *print_asm_header_spec_function (int, const char **);
438 static const char *compare_debug_dump_opt_spec_function (int, const char **);
439 static const char *compare_debug_self_opt_spec_function (int, const char **);
440 static const char *pass_through_libs_spec_func (int, const char **);
441 static const char *dumps_spec_func (int, const char **);
442 static const char *greater_than_spec_func (int, const char **);
443 static const char *debug_level_greater_than_spec_func (int, const char **);
444 static const char *dwarf_version_greater_than_spec_func (int, const char **);
445 static const char *find_fortran_preinclude_file (int, const char **);
446 static char *convert_white_space (char *);
447 static char *quote_spec (char *);
448 static char *quote_spec_arg (char *);
449 static bool not_actual_file_p (const char *);
452 /* The Specs Language
454 Specs are strings containing lines, each of which (if not blank)
455 is made up of a program name, and arguments separated by spaces.
456 The program name must be exact and start from root, since no path
457 is searched and it is unreliable to depend on the current working directory.
458 Redirection of input or output is not supported; the subprograms must
459 accept filenames saying what files to read and write.
461 In addition, the specs can contain %-sequences to substitute variable text
462 or for conditional text. Here is a table of all defined %-sequences.
463 Note that spaces are not generated automatically around the results of
464 expanding these sequences; therefore, you can concatenate them together
465 or with constant text in a single argument.
467 %% substitute one % into the program name or argument.
468 %" substitute an empty argument.
469 %i substitute the name of the input file being processed.
470 %b substitute the basename for outputs related with the input file
471 being processed. This is often a substring of the input file name,
472 up to (and not including) the last period but, unless %w is active,
473 it is affected by the directory selected by -save-temps=*, by
474 -dumpdir, and, in case of multiple compilations, even by -dumpbase
475 and -dumpbase-ext and, in case of linking, by the linker output
476 name. When %w is active, it derives the main output name only from
477 the input file base name; when it is not, it names aux/dump output
478 file.
479 %B same as %b, but include the input file suffix (text after the last
480 period).
481 %gSUFFIX
482 substitute a file name that has suffix SUFFIX and is chosen
483 once per compilation, and mark the argument a la %d. To reduce
484 exposure to denial-of-service attacks, the file name is now
485 chosen in a way that is hard to predict even when previously
486 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
487 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
488 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
489 had been pre-processed. Previously, %g was simply substituted
490 with a file name chosen once per compilation, without regard
491 to any appended suffix (which was therefore treated just like
492 ordinary text), making such attacks more likely to succeed.
493 %|SUFFIX
494 like %g, but if -pipe is in effect, expands simply to "-".
495 %mSUFFIX
496 like %g, but if -pipe is in effect, expands to nothing. (We have both
497 %| and %m to accommodate differences between system assemblers; see
498 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
499 %uSUFFIX
500 like %g, but generates a new temporary file name even if %uSUFFIX
501 was already seen.
502 %USUFFIX
503 substitutes the last file name generated with %uSUFFIX, generating a
504 new one if there is no such last file name. In the absence of any
505 %uSUFFIX, this is just like %gSUFFIX, except they don't share
506 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
507 would involve the generation of two distinct file names, one
508 for each `%g.s' and another for each `%U.s'. Previously, %U was
509 simply substituted with a file name chosen for the previous %u,
510 without regard to any appended suffix.
511 %jSUFFIX
512 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
513 writable, and if save-temps is off; otherwise, substitute the name
514 of a temporary file, just like %u. This temporary file is not
515 meant for communication between processes, but rather as a junk
516 disposal mechanism.
517 %.SUFFIX
518 substitutes .SUFFIX for the suffixes of a matched switch's args when
519 it is subsequently output with %*. SUFFIX is terminated by the next
520 space or %.
521 %d marks the argument containing or following the %d as a
522 temporary file name, so that file will be deleted if GCC exits
523 successfully. Unlike %g, this contributes no text to the argument.
524 %w marks the argument containing or following the %w as the
525 "output file" of this compilation. This puts the argument
526 into the sequence of arguments that %o will substitute later.
527 %V indicates that this compilation produces no "output file".
528 %W{...}
529 like %{...} but marks the last argument supplied within as a file
530 to be deleted on failure.
531 %@{...}
532 like %{...} but puts the result into a FILE and substitutes @FILE
533 if an @file argument has been supplied.
534 %o substitutes the names of all the output files, with spaces
535 automatically placed around them. You should write spaces
536 around the %o as well or the results are undefined.
537 %o is for use in the specs for running the linker.
538 Input files whose names have no recognized suffix are not compiled
539 at all, but they are included among the output files, so they will
540 be linked.
541 %O substitutes the suffix for object files. Note that this is
542 handled specially when it immediately follows %g, %u, or %U
543 (with or without a suffix argument) because of the need for
544 those to form complete file names. The handling is such that
545 %O is treated exactly as if it had already been substituted,
546 except that %g, %u, and %U do not currently support additional
547 SUFFIX characters following %O as they would following, for
548 example, `.o'.
549 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
550 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
551 and -B options) and -imultilib as necessary.
552 %s current argument is the name of a library or startup file of some sort.
553 Search for that file in a standard list of directories
554 and substitute the full name found.
555 %T current argument is the name of a linker script.
556 Search for that file in the current list of directories to scan for
557 libraries. If the file is located, insert a --script option into the
558 command line followed by the full path name found. If the file is
559 not found then generate an error message.
560 Note: the current working directory is not searched.
561 %eSTR Print STR as an error message. STR is terminated by a newline.
562 Use this when inconsistent options are detected.
563 %nSTR Print STR as a notice. STR is terminated by a newline.
564 %x{OPTION} Accumulate an option for %X.
565 %X Output the accumulated linker options specified by compilations.
566 %Y Output the accumulated assembler options specified by compilations.
567 %Z Output the accumulated preprocessor options specified by compilations.
568 %a process ASM_SPEC as a spec.
569 This allows config.h to specify part of the spec for running as.
570 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
571 used here. This can be used to run a post-processor after the
572 assembler has done its job.
573 %D Dump out a -L option for each directory in startfile_prefixes.
574 If multilib_dir is set, extra entries are generated with it affixed.
575 %l process LINK_SPEC as a spec.
576 %L process LIB_SPEC as a spec.
577 %M Output multilib_os_dir.
578 %G process LIBGCC_SPEC as a spec.
579 %R Output the concatenation of target_system_root and
580 target_sysroot_suffix.
581 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
582 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
583 %C process CPP_SPEC as a spec.
584 %1 process CC1_SPEC as a spec.
585 %2 process CC1PLUS_SPEC as a spec.
586 %* substitute the variable part of a matched option. (See below.)
587 Note that each comma in the substituted string is replaced by
588 a single space. A space is appended after the last substition
589 unless there is more text in current sequence.
590 %<S remove all occurrences of -S from the command line.
591 Note - this command is position dependent. % commands in the
592 spec string before this one will see -S, % commands in the
593 spec string after this one will not.
594 %>S Similar to "%<S", but keep it in the GCC command line.
595 %<S* remove all occurrences of all switches beginning with -S from the
596 command line.
597 %:function(args)
598 Call the named function FUNCTION, passing it ARGS. ARGS is
599 first processed as a nested spec string, then split into an
600 argument vector in the usual fashion. The function returns
601 a string which is processed as if it had appeared literally
602 as part of the current spec.
603 %{S} substitutes the -S switch, if that switch was given to GCC.
604 If that switch was not specified, this substitutes nothing.
605 Here S is a metasyntactic variable.
606 %{S*} substitutes all the switches specified to GCC whose names start
607 with -S. This is used for -o, -I, etc; switches that take
608 arguments. GCC considers `-o foo' as being one switch whose
609 name starts with `o'. %{o*} would substitute this text,
610 including the space; thus, two arguments would be generated.
611 %{S*&T*} likewise, but preserve order of S and T options (the order
612 of S and T in the spec is not significant). Can be any number
613 of ampersand-separated variables; for each the wild card is
614 optional. Useful for CPP as %{D*&U*&A*}.
616 %{S:X} substitutes X, if the -S switch was given to GCC.
617 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
618 %{S*:X} substitutes X if one or more switches whose names start
619 with -S was given to GCC. Normally X is substituted only
620 once, no matter how many such switches appeared. However,
621 if %* appears somewhere in X, then X will be substituted
622 once for each matching switch, with the %* replaced by the
623 part of that switch that matched the '*'. A space will be
624 appended after the last substition unless there is more
625 text in current sequence.
626 %{.S:X} substitutes X, if processing a file with suffix S.
627 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
628 %{,S:X} substitutes X, if processing a file which will use spec S.
629 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
631 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
632 combined with '!', '.', ',', and '*' as above binding stronger
633 than the OR.
634 If %* appears in X, all of the alternatives must be starred, and
635 only the first matching alternative is substituted.
636 %{%:function(args):X}
637 Call function named FUNCTION with args ARGS. If the function
638 returns non-NULL, then X is substituted, if it returns
639 NULL, it isn't substituted.
640 %{S:X; if S was given to GCC, substitutes X;
641 T:Y; else if T was given to GCC, substitutes Y;
642 :D} else substitutes D. There can be as many clauses as you need.
643 This may be combined with '.', '!', ',', '|', and '*' as above.
645 %(Spec) processes a specification defined in a specs file as *Spec:
647 The switch matching text S in a %{S}, %{S:X}, or similar construct can use
648 a backslash to ignore the special meaning of the character following it,
649 thus allowing literal matching of a character that is otherwise specially
650 treated. For example, %{std=iso9899\:1999:X} substitutes X if the
651 -std=iso9899:1999 option is given.
653 The conditional text X in a %{S:X} or similar construct may contain
654 other nested % constructs or spaces, or even newlines. They are
655 processed as usual, as described above. Trailing white space in X is
656 ignored. White space may also appear anywhere on the left side of the
657 colon in these constructs, except between . or * and the corresponding
658 word.
660 The -O, -f, -g, -m, and -W switches are handled specifically in these
661 constructs. If another value of -O or the negated form of a -f, -m, or
662 -W switch is found later in the command line, the earlier switch
663 value is ignored, except with {S*} where S is just one letter; this
664 passes all matching options.
666 The character | at the beginning of the predicate text is used to indicate
667 that a command should be piped to the following command, but only if -pipe
668 is specified.
670 Note that it is built into GCC which switches take arguments and which
671 do not. You might think it would be useful to generalize this to
672 allow each compiler's spec to say which switches take arguments. But
673 this cannot be done in a consistent fashion. GCC cannot even decide
674 which input files have been specified without knowing which switches
675 take arguments, and it must know which input files to compile in order
676 to tell which compilers to run.
678 GCC also knows implicitly that arguments starting in `-l' are to be
679 treated as compiler output files, and passed to the linker in their
680 proper position among the other output files. */
682 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
684 /* config.h can define ASM_SPEC to provide extra args to the assembler
685 or extra switch-translations. */
686 #ifndef ASM_SPEC
687 #define ASM_SPEC ""
688 #endif
690 /* config.h can define ASM_FINAL_SPEC to run a post processor after
691 the assembler has run. */
692 #ifndef ASM_FINAL_SPEC
693 #define ASM_FINAL_SPEC \
694 "%{gsplit-dwarf: \n\
695 objcopy --extract-dwo \
696 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
697 %b.dwo \n\
698 objcopy --strip-dwo \
699 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
701 #endif
703 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
704 or extra switch-translations. */
705 #ifndef CPP_SPEC
706 #define CPP_SPEC ""
707 #endif
709 /* Operating systems can define OS_CC1_SPEC to provide extra args to cc1 and
710 cc1plus or extra switch-translations. The OS_CC1_SPEC is appended
711 to CC1_SPEC in the initialization of cc1_spec. */
712 #ifndef OS_CC1_SPEC
713 #define OS_CC1_SPEC ""
714 #endif
716 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
717 or extra switch-translations. */
718 #ifndef CC1_SPEC
719 #define CC1_SPEC ""
720 #endif
722 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
723 or extra switch-translations. */
724 #ifndef CC1PLUS_SPEC
725 #define CC1PLUS_SPEC ""
726 #endif
728 /* config.h can define LINK_SPEC to provide extra args to the linker
729 or extra switch-translations. */
730 #ifndef LINK_SPEC
731 #define LINK_SPEC ""
732 #endif
734 /* config.h can define LIB_SPEC to override the default libraries. */
735 #ifndef LIB_SPEC
736 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
737 #endif
739 /* When using -fsplit-stack we need to wrap pthread_create, in order
740 to initialize the stack guard. We always use wrapping, rather than
741 shared library ordering, and we keep the wrapper function in
742 libgcc. This is not yet a real spec, though it could become one;
743 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
744 only works with GNU ld and gold. */
745 #ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
746 #define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
747 #else
748 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
749 #endif
751 #ifndef LIBASAN_SPEC
752 #define STATIC_LIBASAN_LIBS \
753 " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
754 #ifdef LIBASAN_EARLY_SPEC
755 #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
756 #elif defined(HAVE_LD_STATIC_DYNAMIC)
757 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
758 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
759 STATIC_LIBASAN_LIBS
760 #else
761 #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
762 #endif
763 #endif
765 #ifndef LIBASAN_EARLY_SPEC
766 #define LIBASAN_EARLY_SPEC ""
767 #endif
769 #ifndef LIBHWASAN_SPEC
770 #define STATIC_LIBHWASAN_LIBS \
771 " %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
772 #ifdef LIBHWASAN_EARLY_SPEC
773 #define LIBHWASAN_SPEC STATIC_LIBHWASAN_LIBS
774 #elif defined(HAVE_LD_STATIC_DYNAMIC)
775 #define LIBHWASAN_SPEC "%{static-libhwasan:" LD_STATIC_OPTION \
776 "} -lhwasan %{static-libhwasan:" LD_DYNAMIC_OPTION "}" \
777 STATIC_LIBHWASAN_LIBS
778 #else
779 #define LIBHWASAN_SPEC "-lhwasan" STATIC_LIBHWASAN_LIBS
780 #endif
781 #endif
783 #ifndef LIBHWASAN_EARLY_SPEC
784 #define LIBHWASAN_EARLY_SPEC ""
785 #endif
787 #ifndef LIBTSAN_SPEC
788 #define STATIC_LIBTSAN_LIBS \
789 " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
790 #ifdef LIBTSAN_EARLY_SPEC
791 #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
792 #elif defined(HAVE_LD_STATIC_DYNAMIC)
793 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
794 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
795 STATIC_LIBTSAN_LIBS
796 #else
797 #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
798 #endif
799 #endif
801 #ifndef LIBTSAN_EARLY_SPEC
802 #define LIBTSAN_EARLY_SPEC ""
803 #endif
805 #ifndef LIBLSAN_SPEC
806 #define STATIC_LIBLSAN_LIBS \
807 " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
808 #ifdef LIBLSAN_EARLY_SPEC
809 #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
810 #elif defined(HAVE_LD_STATIC_DYNAMIC)
811 #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
812 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
813 STATIC_LIBLSAN_LIBS
814 #else
815 #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
816 #endif
817 #endif
819 #ifndef LIBLSAN_EARLY_SPEC
820 #define LIBLSAN_EARLY_SPEC ""
821 #endif
823 #ifndef LIBUBSAN_SPEC
824 #define STATIC_LIBUBSAN_LIBS \
825 " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
826 #ifdef HAVE_LD_STATIC_DYNAMIC
827 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
828 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
829 STATIC_LIBUBSAN_LIBS
830 #else
831 #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
832 #endif
833 #endif
835 /* Linker options for compressed debug sections. */
836 #if HAVE_LD_COMPRESS_DEBUG == 0
837 /* No linker support. */
838 #define LINK_COMPRESS_DEBUG_SPEC \
839 " %{gz*:%e-gz is not supported in this configuration} "
840 #elif HAVE_LD_COMPRESS_DEBUG == 1
841 /* ELF gABI style. */
842 #define LINK_COMPRESS_DEBUG_SPEC \
843 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
844 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
845 " %{gz=zstd:%e-gz=zstd is not supported in this configuration} " \
846 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
847 #elif HAVE_LD_COMPRESS_DEBUG == 2
848 /* ELF gABI style and ZSTD. */
849 #define LINK_COMPRESS_DEBUG_SPEC \
850 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
851 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
852 " %{gz=zstd:" LD_COMPRESS_DEBUG_OPTION "=zstd}" \
853 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
854 #else
855 #error Unknown value for HAVE_LD_COMPRESS_DEBUG.
856 #endif
858 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
859 included. */
860 #ifndef LIBGCC_SPEC
861 #if defined(REAL_LIBGCC_SPEC)
862 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
863 #elif defined(LINK_LIBGCC_SPECIAL_1)
864 /* Have gcc do the search for libgcc.a. */
865 #define LIBGCC_SPEC "libgcc.a%s"
866 #else
867 #define LIBGCC_SPEC "-lgcc"
868 #endif
869 #endif
871 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
872 #ifndef STARTFILE_SPEC
873 #define STARTFILE_SPEC \
874 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
875 #endif
877 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
878 #ifndef ENDFILE_SPEC
879 #define ENDFILE_SPEC ""
880 #endif
882 #ifndef LINKER_NAME
883 #define LINKER_NAME "collect2"
884 #endif
886 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
887 #define ASM_MAP " %{ffile-prefix-map=*:--debug-prefix-map %*} %{fdebug-prefix-map=*:--debug-prefix-map %*}"
888 #else
889 #define ASM_MAP ""
890 #endif
892 /* Assembler options for compressed debug sections. */
893 #if HAVE_LD_COMPRESS_DEBUG == 0
894 /* Reject if the linker cannot write compressed debug sections. */
895 #define ASM_COMPRESS_DEBUG_SPEC \
896 " %{gz*:%e-gz is not supported in this configuration} "
897 #else /* HAVE_LD_COMPRESS_DEBUG >= 1 */
898 #if HAVE_AS_COMPRESS_DEBUG == 0
899 /* No assembler support. Ignore silently. */
900 #define ASM_COMPRESS_DEBUG_SPEC \
901 " %{gz*:} "
902 #elif HAVE_AS_COMPRESS_DEBUG == 1
903 /* ELF gABI style. */
904 #define ASM_COMPRESS_DEBUG_SPEC \
905 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
906 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
907 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
908 #elif HAVE_AS_COMPRESS_DEBUG == 2
909 /* ELF gABI style and ZSTD. */
910 #define ASM_COMPRESS_DEBUG_SPEC \
911 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
912 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
913 " %{gz=zstd:" AS_COMPRESS_DEBUG_OPTION "=zstd}" \
914 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
915 #else
916 #error Unknown value for HAVE_AS_COMPRESS_DEBUG.
917 #endif
918 #endif /* HAVE_LD_COMPRESS_DEBUG >= 1 */
920 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
921 to the assembler, when compiling assembly sources only. */
922 #ifndef ASM_DEBUG_SPEC
923 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
924 /* If --gdwarf-N is supported and as can handle even compiler generated
925 .debug_line with it, supply --gdwarf-N in ASM_DEBUG_OPTION_SPEC rather
926 than in ASM_DEBUG_SPEC, so that it applies to both .s and .c etc.
927 compilations. */
928 # define ASM_DEBUG_DWARF_OPTION ""
929 # elif defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && !defined(HAVE_LD_BROKEN_PE_DWARF5)
930 # define ASM_DEBUG_DWARF_OPTION "%{%:dwarf-version-gt(4):--gdwarf-5;" \
931 "%:dwarf-version-gt(3):--gdwarf-4;" \
932 "%:dwarf-version-gt(2):--gdwarf-3;" \
933 ":--gdwarf2}"
934 # else
935 # define ASM_DEBUG_DWARF_OPTION "--gdwarf2"
936 # endif
937 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
938 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):" \
939 ASM_DEBUG_DWARF_OPTION "}}" ASM_MAP
940 # endif
941 # endif
942 #ifndef ASM_DEBUG_SPEC
943 # define ASM_DEBUG_SPEC ""
944 #endif
946 /* Define ASM_DEBUG_OPTION_SPEC to be a spec suitable for translating '-g'
947 to the assembler when compiling all sources. */
948 #ifndef ASM_DEBUG_OPTION_SPEC
949 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
950 # define ASM_DEBUG_OPTION_DWARF_OPT \
951 "%{%:dwarf-version-gt(4):--gdwarf-5 ;" \
952 "%:dwarf-version-gt(3):--gdwarf-4 ;" \
953 "%:dwarf-version-gt(2):--gdwarf-3 ;" \
954 ":--gdwarf2 }"
955 # if defined(DWARF2_DEBUGGING_INFO)
956 # define ASM_DEBUG_OPTION_SPEC "%{g*:%{%:debug-level-gt(0):" \
957 ASM_DEBUG_OPTION_DWARF_OPT "}}"
958 # endif
959 # endif
960 #endif
961 #ifndef ASM_DEBUG_OPTION_SPEC
962 # define ASM_DEBUG_OPTION_SPEC ""
963 #endif
965 /* Here is the spec for running the linker, after compiling all files. */
967 /* This is overridable by the target in case they need to specify the
968 -lgcc and -lc order specially, yet not require them to override all
969 of LINK_COMMAND_SPEC. */
970 #ifndef LINK_GCC_C_SEQUENCE_SPEC
971 #define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
972 #endif
974 #ifndef LINK_SSP_SPEC
975 #ifdef TARGET_LIBC_PROVIDES_SSP
976 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
977 "|fstack-protector-strong|fstack-protector-explicit:}"
978 #else
979 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
980 "|fstack-protector-strong|fstack-protector-explicit" \
981 ":-lssp_nonshared -lssp}"
982 #endif
983 #endif
985 #ifdef ENABLE_DEFAULT_PIE
986 #define PIE_SPEC "!no-pie"
987 #define NO_FPIE1_SPEC "fno-pie"
988 #define FPIE1_SPEC NO_FPIE1_SPEC ":;"
989 #define NO_FPIE2_SPEC "fno-PIE"
990 #define FPIE2_SPEC NO_FPIE2_SPEC ":;"
991 #define NO_FPIE_SPEC NO_FPIE1_SPEC "|" NO_FPIE2_SPEC
992 #define FPIE_SPEC NO_FPIE_SPEC ":;"
993 #define NO_FPIC1_SPEC "fno-pic"
994 #define FPIC1_SPEC NO_FPIC1_SPEC ":;"
995 #define NO_FPIC2_SPEC "fno-PIC"
996 #define FPIC2_SPEC NO_FPIC2_SPEC ":;"
997 #define NO_FPIC_SPEC NO_FPIC1_SPEC "|" NO_FPIC2_SPEC
998 #define FPIC_SPEC NO_FPIC_SPEC ":;"
999 #define NO_FPIE1_AND_FPIC1_SPEC NO_FPIE1_SPEC "|" NO_FPIC1_SPEC
1000 #define FPIE1_OR_FPIC1_SPEC NO_FPIE1_AND_FPIC1_SPEC ":;"
1001 #define NO_FPIE2_AND_FPIC2_SPEC NO_FPIE2_SPEC "|" NO_FPIC2_SPEC
1002 #define FPIE2_OR_FPIC2_SPEC NO_FPIE2_AND_FPIC2_SPEC ":;"
1003 #define NO_FPIE_AND_FPIC_SPEC NO_FPIE_SPEC "|" NO_FPIC_SPEC
1004 #define FPIE_OR_FPIC_SPEC NO_FPIE_AND_FPIC_SPEC ":;"
1005 #else
1006 #define PIE_SPEC "pie"
1007 #define FPIE1_SPEC "fpie"
1008 #define NO_FPIE1_SPEC FPIE1_SPEC ":;"
1009 #define FPIE2_SPEC "fPIE"
1010 #define NO_FPIE2_SPEC FPIE2_SPEC ":;"
1011 #define FPIE_SPEC FPIE1_SPEC "|" FPIE2_SPEC
1012 #define NO_FPIE_SPEC FPIE_SPEC ":;"
1013 #define FPIC1_SPEC "fpic"
1014 #define NO_FPIC1_SPEC FPIC1_SPEC ":;"
1015 #define FPIC2_SPEC "fPIC"
1016 #define NO_FPIC2_SPEC FPIC2_SPEC ":;"
1017 #define FPIC_SPEC FPIC1_SPEC "|" FPIC2_SPEC
1018 #define NO_FPIC_SPEC FPIC_SPEC ":;"
1019 #define FPIE1_OR_FPIC1_SPEC FPIE1_SPEC "|" FPIC1_SPEC
1020 #define NO_FPIE1_AND_FPIC1_SPEC FPIE1_OR_FPIC1_SPEC ":;"
1021 #define FPIE2_OR_FPIC2_SPEC FPIE2_SPEC "|" FPIC2_SPEC
1022 #define NO_FPIE2_AND_FPIC2_SPEC FPIE1_OR_FPIC2_SPEC ":;"
1023 #define FPIE_OR_FPIC_SPEC FPIE_SPEC "|" FPIC_SPEC
1024 #define NO_FPIE_AND_FPIC_SPEC FPIE_OR_FPIC_SPEC ":;"
1025 #endif
1027 #ifndef LINK_PIE_SPEC
1028 #ifdef HAVE_LD_PIE
1029 #ifndef LD_PIE_SPEC
1030 #define LD_PIE_SPEC "-pie"
1031 #endif
1032 #else
1033 #define LD_PIE_SPEC ""
1034 #endif
1035 #define LINK_PIE_SPEC "%{static|shared|r:;" PIE_SPEC ":" LD_PIE_SPEC "} "
1036 #endif
1038 #ifndef LINK_BUILDID_SPEC
1039 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
1040 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
1041 # endif
1042 #endif
1044 #ifndef LTO_PLUGIN_SPEC
1045 #define LTO_PLUGIN_SPEC ""
1046 #endif
1048 /* Conditional to test whether the LTO plugin is used or not.
1049 FIXME: For slim LTO we will need to enable plugin unconditionally. This
1050 still cause problems with PLUGIN_LD != LD and when plugin is built but
1051 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
1052 plugin only when LTO is enabled. We still honor explicit
1053 -fuse-linker-plugin if the linker used understands -plugin. */
1055 /* The linker has some plugin support. */
1056 #if HAVE_LTO_PLUGIN > 0
1057 /* The linker used has full plugin support, use LTO plugin by default. */
1058 #if HAVE_LTO_PLUGIN == 2
1059 #define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
1060 #define PLUGIN_COND_CLOSE "}"
1061 #else
1062 /* The linker used has limited plugin support, use LTO plugin with explicit
1063 -fuse-linker-plugin. */
1064 #define PLUGIN_COND "fuse-linker-plugin"
1065 #define PLUGIN_COND_CLOSE ""
1066 #endif
1067 #define LINK_PLUGIN_SPEC \
1068 "%{" PLUGIN_COND": \
1069 -plugin %(linker_plugin_file) \
1070 -plugin-opt=%(lto_wrapper) \
1071 -plugin-opt=-fresolution=%u.res \
1072 " LTO_PLUGIN_SPEC "\
1073 %{flinker-output=*:-plugin-opt=-linker-output-known} \
1074 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
1075 }" PLUGIN_COND_CLOSE
1076 #else
1077 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
1078 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
1079 %e-fuse-linker-plugin is not supported in this configuration}"
1080 #endif
1082 /* Linker command line options for -fsanitize= early on the command line. */
1083 #ifndef SANITIZER_EARLY_SPEC
1084 #define SANITIZER_EARLY_SPEC "\
1085 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
1086 %{%:sanitize(hwaddress):" LIBHWASAN_EARLY_SPEC "} \
1087 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
1088 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}"
1089 #endif
1091 /* Linker command line options for -fsanitize= late on the command line. */
1092 #ifndef SANITIZER_SPEC
1093 #define SANITIZER_SPEC "\
1094 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
1095 %{static:%ecannot specify -static with -fsanitize=address}}\
1096 %{%:sanitize(hwaddress):" LIBHWASAN_SPEC "\
1097 %{static:%ecannot specify -static with -fsanitize=hwaddress}}\
1098 %{%:sanitize(thread):" LIBTSAN_SPEC "\
1099 %{static:%ecannot specify -static with -fsanitize=thread}}\
1100 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
1101 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}"
1102 #endif
1104 #ifndef POST_LINK_SPEC
1105 #define POST_LINK_SPEC ""
1106 #endif
1108 /* This is the spec to use, once the code for creating the vtable
1109 verification runtime library, libvtv.so, has been created. Currently
1110 the vtable verification runtime functions are in libstdc++, so we use
1111 the spec just below this one. */
1112 #ifndef VTABLE_VERIFICATION_SPEC
1113 #if ENABLE_VTABLE_VERIFY
1114 #define VTABLE_VERIFICATION_SPEC "\
1115 %{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1116 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1117 #else
1118 #define VTABLE_VERIFICATION_SPEC "\
1119 %{fvtable-verify=none:} \
1120 %{fvtable-verify=std: \
1121 %e-fvtable-verify=std is not supported in this configuration} \
1122 %{fvtable-verify=preinit: \
1123 %e-fvtable-verify=preinit is not supported in this configuration}"
1124 #endif
1125 #endif
1127 /* -u* was put back because both BSD and SysV seem to support it. */
1128 /* %{static|no-pie|static-pie:} simply prevents an error message:
1129 1. If the target machine doesn't handle -static.
1130 2. If PIE isn't enabled by default.
1131 3. If the target machine doesn't handle -static-pie.
1133 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1134 scripts which exist in user specified directories, or in standard
1135 directories. */
1136 /* We pass any -flto flags on to the linker, which is expected
1137 to understand them. In practice, this means it had better be collect2. */
1138 /* %{e*} includes -export-dynamic; see comment in common.opt. */
1139 #ifndef LINK_COMMAND_SPEC
1140 #define LINK_COMMAND_SPEC "\
1141 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1142 %(linker) " \
1143 LINK_PLUGIN_SPEC \
1144 "%{flto|flto=*:%<fcompare-debug*} \
1145 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
1146 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
1147 "%X %{o*} %{e*} %{N} %{n} %{r}\
1148 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1149 %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
1150 VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
1151 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1152 %:include(libgomp.spec)%(link_gomp)}\
1153 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1154 %(mflib) " STACK_SPLIT_SPEC "\
1155 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
1156 %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1157 %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1158 #endif
1160 #ifndef LINK_LIBGCC_SPEC
1161 /* Generate -L options for startfile prefix list. */
1162 # define LINK_LIBGCC_SPEC "%D"
1163 #endif
1165 #ifndef STARTFILE_PREFIX_SPEC
1166 # define STARTFILE_PREFIX_SPEC ""
1167 #endif
1169 #ifndef SYSROOT_SPEC
1170 # define SYSROOT_SPEC "--sysroot=%R"
1171 #endif
1173 #ifndef SYSROOT_SUFFIX_SPEC
1174 # define SYSROOT_SUFFIX_SPEC ""
1175 #endif
1177 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1178 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
1179 #endif
1181 static const char *asm_debug = ASM_DEBUG_SPEC;
1182 static const char *asm_debug_option = ASM_DEBUG_OPTION_SPEC;
1183 static const char *cpp_spec = CPP_SPEC;
1184 static const char *cc1_spec = CC1_SPEC OS_CC1_SPEC;
1185 static const char *cc1plus_spec = CC1PLUS_SPEC;
1186 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
1187 static const char *link_ssp_spec = LINK_SSP_SPEC;
1188 static const char *asm_spec = ASM_SPEC;
1189 static const char *asm_final_spec = ASM_FINAL_SPEC;
1190 static const char *link_spec = LINK_SPEC;
1191 static const char *lib_spec = LIB_SPEC;
1192 static const char *link_gomp_spec = "";
1193 static const char *libgcc_spec = LIBGCC_SPEC;
1194 static const char *endfile_spec = ENDFILE_SPEC;
1195 static const char *startfile_spec = STARTFILE_SPEC;
1196 static const char *linker_name_spec = LINKER_NAME;
1197 static const char *linker_plugin_file_spec = "";
1198 static const char *lto_wrapper_spec = "";
1199 static const char *lto_gcc_spec = "";
1200 static const char *post_link_spec = POST_LINK_SPEC;
1201 static const char *link_command_spec = LINK_COMMAND_SPEC;
1202 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
1203 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
1204 static const char *sysroot_spec = SYSROOT_SPEC;
1205 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
1206 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
1207 static const char *self_spec = "";
1209 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1210 There should be no need to override these in target dependent files,
1211 but we need to copy them to the specs file so that newer versions
1212 of the GCC driver can correctly drive older tool chains with the
1213 appropriate -B options. */
1215 /* When cpplib handles traditional preprocessing, get rid of this, and
1216 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1217 that we default the front end language better. */
1218 static const char *trad_capable_cpp =
1219 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1221 /* We don't wrap .d files in %W{} since a missing .d file, and
1222 therefore no dependency entry, confuses make into thinking a .o
1223 file that happens to exist is up-to-date. */
1224 static const char *cpp_unique_options =
1225 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1226 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1227 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1228 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1229 %{Mmodules} %{Mno-modules}\
1230 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1231 %{remap} %{%:debug-level-gt(2):-dD}\
1232 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1233 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1234 %{E|M|MM:%W{o*}}";
1236 /* This contains cpp options which are common with cc1_options and are passed
1237 only when preprocessing only to avoid duplication. We pass the cc1 spec
1238 options to the preprocessor so that it the cc1 spec may manipulate
1239 options used to set target flags. Those special target flags settings may
1240 in turn cause preprocessor symbols to be defined specially. */
1241 static const char *cpp_options =
1242 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1243 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1244 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1245 %{undef} %{save-temps*:-fpch-preprocess}";
1247 /* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
1249 Make it easy for a language to override the argument for the
1250 %:dumps specs function call. */
1251 #define DUMPS_OPTIONS(EXTS) \
1252 "%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps(" EXTS ")"
1254 /* This contains cpp options which are not passed when the preprocessor
1255 output will be used by another program. */
1256 static const char *cpp_debug_options = DUMPS_OPTIONS ("");
1258 /* NB: This is shared amongst all front-ends, except for Ada. */
1259 static const char *cc1_options =
1260 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1261 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1262 %1 %{!Q:-quiet} %(cpp_debug_options) %{m*} %{aux-info*}\
1263 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1264 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1265 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1266 %{-target-help:--target-help}\
1267 %{-version:--version}\
1268 %{-help=*:--help=%*}\
1269 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %w%b.s}}}\
1270 %{fsyntax-only:-o %j} %{-param*}\
1271 %{coverage:-fprofile-arcs -ftest-coverage}\
1272 %{fprofile-arcs|fprofile-generate*|coverage:\
1273 %{!fprofile-update=single:\
1274 %{pthread:-fprofile-update=prefer-atomic}}}";
1276 static const char *asm_options =
1277 "%{-target-help:%:print-asm-header()} "
1278 #if HAVE_GNU_AS
1279 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
1280 to the assembler equivalents. */
1281 "%{v} %{w:-W} %{I*} "
1282 #endif
1283 "%(asm_debug_option)"
1284 ASM_COMPRESS_DEBUG_SPEC
1285 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1287 static const char *invoke_as =
1288 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1289 "%{!fwpa*:\
1290 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1291 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1293 #else
1294 "%{!fwpa*:\
1295 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1296 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1298 #endif
1300 /* Some compilers have limits on line lengths, and the multilib_select
1301 and/or multilib_matches strings can be very long, so we build them at
1302 run time. */
1303 static struct obstack multilib_obstack;
1304 static const char *multilib_select;
1305 static const char *multilib_matches;
1306 static const char *multilib_defaults;
1307 static const char *multilib_exclusions;
1308 static const char *multilib_reuse;
1310 /* Check whether a particular argument is a default argument. */
1312 #ifndef MULTILIB_DEFAULTS
1313 #define MULTILIB_DEFAULTS { "" }
1314 #endif
1316 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
1318 #ifndef DRIVER_SELF_SPECS
1319 #define DRIVER_SELF_SPECS ""
1320 #endif
1322 /* Linking to libgomp implies pthreads. This is particularly important
1323 for targets that use different start files and suchlike. */
1324 #ifndef GOMP_SELF_SPECS
1325 #define GOMP_SELF_SPECS \
1326 "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1327 "-pthread}"
1328 #endif
1330 /* Likewise for -fgnu-tm. */
1331 #ifndef GTM_SELF_SPECS
1332 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1333 #endif
1335 static const char *const driver_self_specs[] = {
1336 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1337 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS,
1338 /* This discards -fmultiflags at the end of self specs processing in the
1339 driver, so that it is effectively Ignored, without actually marking it as
1340 Ignored, which would get it discarded before self specs could remap it. */
1341 "%<fmultiflags"
1344 #ifndef OPTION_DEFAULT_SPECS
1345 #define OPTION_DEFAULT_SPECS { "", "" }
1346 #endif
1348 struct default_spec
1350 const char *name;
1351 const char *spec;
1354 static const struct default_spec
1355 option_default_specs[] = { OPTION_DEFAULT_SPECS };
1357 struct user_specs
1359 struct user_specs *next;
1360 const char *filename;
1363 static struct user_specs *user_specs_head, *user_specs_tail;
1366 /* Record the mapping from file suffixes for compilation specs. */
1368 struct compiler
1370 const char *suffix; /* Use this compiler for input files
1371 whose names end in this suffix. */
1373 const char *spec; /* To use this compiler, run this spec. */
1375 const char *cpp_spec; /* If non-NULL, substitute this spec
1376 for `%C', rather than the usual
1377 cpp_spec. */
1378 int combinable; /* If nonzero, compiler can deal with
1379 multiple source files at once (IMA). */
1380 int needs_preprocessing; /* If nonzero, source files need to
1381 be run through a preprocessor. */
1384 /* Pointer to a vector of `struct compiler' that gives the spec for
1385 compiling a file, based on its suffix.
1386 A file that does not end in any of these suffixes will be passed
1387 unchanged to the loader and nothing else will be done to it.
1389 An entry containing two 0s is used to terminate the vector.
1391 If multiple entries match a file, the last matching one is used. */
1393 static struct compiler *compilers;
1395 /* Number of entries in `compilers', not counting the null terminator. */
1397 static int n_compilers;
1399 /* The default list of file name suffixes and their compilation specs. */
1401 static const struct compiler default_compilers[] =
1403 /* Add lists of suffixes of known languages here. If those languages
1404 were not present when we built the driver, we will hit these copies
1405 and be given a more meaningful error than "file not used since
1406 linking is not done". */
1407 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1408 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1409 {".mii", "#Objective-C++", 0, 0, 0},
1410 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1411 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1412 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1413 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1414 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1415 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1416 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1417 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1418 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1419 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1420 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1421 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1422 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1423 {".r", "#Ratfor", 0, 0, 0},
1424 {".go", "#Go", 0, 1, 0},
1425 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1426 {".mod", "#Modula-2", 0, 0, 0}, {".m2i", "#Modula-2", 0, 0, 0},
1427 /* Next come the entries for C. */
1428 {".c", "@c", 0, 0, 1},
1429 {"@c",
1430 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1431 external preprocessor if -save-temps is given. */
1432 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1433 %{!E:%{!M:%{!MM:\
1434 %{traditional:\
1435 %eGNU C no longer supports -traditional without -E}\
1436 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1437 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1438 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1439 %(cc1_options)}\
1440 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1441 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1442 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1443 {"-",
1444 "%{!E:%e-E or -x required when input is from standard input}\
1445 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1446 {".h", "@c-header", 0, 0, 0},
1447 {"@c-header",
1448 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1449 external preprocessor if -save-temps is given. */
1450 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1451 %{!E:%{!M:%{!MM:\
1452 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1453 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1454 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1455 %(cc1_options)\
1456 %{!fsyntax-only:%{!S:-o %g.s} \
1457 %{!fdump-ada-spec*:%{!o*:--output-pch %i.gch}\
1458 %W{o*:--output-pch %*}}%V}}\
1459 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1460 cc1 %(cpp_unique_options) %(cc1_options)\
1461 %{!fsyntax-only:%{!S:-o %g.s} \
1462 %{!fdump-ada-spec*:%{!o*:--output-pch %i.gch}\
1463 %W{o*:--output-pch %*}}%V}}}}}}}", 0, 0, 0},
1464 {".i", "@cpp-output", 0, 0, 0},
1465 {"@cpp-output",
1466 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1467 {".s", "@assembler", 0, 0, 0},
1468 {"@assembler",
1469 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1470 {".sx", "@assembler-with-cpp", 0, 0, 0},
1471 {".S", "@assembler-with-cpp", 0, 0, 0},
1472 {"@assembler-with-cpp",
1473 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1474 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1475 %{E|M|MM:%(cpp_debug_options)}\
1476 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1477 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1478 #else
1479 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1480 %{E|M|MM:%(cpp_debug_options)}\
1481 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1482 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1483 #endif
1484 , 0, 0, 0},
1486 #include "specs.h"
1487 /* Mark end of table. */
1488 {0, 0, 0, 0, 0}
1491 /* Number of elements in default_compilers, not counting the terminator. */
1493 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1495 typedef char *char_p; /* For DEF_VEC_P. */
1497 /* A vector of options to give to the linker.
1498 These options are accumulated by %x,
1499 and substituted into the linker command with %X. */
1500 static vec<char_p> linker_options;
1502 /* A vector of options to give to the assembler.
1503 These options are accumulated by -Wa,
1504 and substituted into the assembler command with %Y. */
1505 static vec<char_p> assembler_options;
1507 /* A vector of options to give to the preprocessor.
1508 These options are accumulated by -Wp,
1509 and substituted into the preprocessor command with %Z. */
1510 static vec<char_p> preprocessor_options;
1512 static char *
1513 skip_whitespace (char *p)
1515 while (1)
1517 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1518 be considered whitespace. */
1519 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1520 return p + 1;
1521 else if (*p == '\n' || *p == ' ' || *p == '\t')
1522 p++;
1523 else if (*p == '#')
1525 while (*p != '\n')
1526 p++;
1527 p++;
1529 else
1530 break;
1533 return p;
1535 /* Structures to keep track of prefixes to try when looking for files. */
1537 struct prefix_list
1539 const char *prefix; /* String to prepend to the path. */
1540 struct prefix_list *next; /* Next in linked list. */
1541 int require_machine_suffix; /* Don't use without machine_suffix. */
1542 /* 2 means try both machine_suffix and just_machine_suffix. */
1543 int priority; /* Sort key - priority within list. */
1544 int os_multilib; /* 1 if OS multilib scheme should be used,
1545 0 for GCC multilib scheme. */
1548 struct path_prefix
1550 struct prefix_list *plist; /* List of prefixes to try */
1551 int max_len; /* Max length of a prefix in PLIST */
1552 const char *name; /* Name of this list (used in config stuff) */
1555 /* List of prefixes to try when looking for executables. */
1557 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1559 /* List of prefixes to try when looking for startup (crt0) files. */
1561 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1563 /* List of prefixes to try when looking for include files. */
1565 static struct path_prefix include_prefixes = { 0, 0, "include" };
1567 /* Suffix to attach to directories searched for commands.
1568 This looks like `MACHINE/VERSION/'. */
1570 static const char *machine_suffix = 0;
1572 /* Suffix to attach to directories searched for commands.
1573 This is just `MACHINE/'. */
1575 static const char *just_machine_suffix = 0;
1577 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1579 static const char *gcc_exec_prefix;
1581 /* Adjusted value of standard_libexec_prefix. */
1583 static const char *gcc_libexec_prefix;
1585 /* Default prefixes to attach to command names. */
1587 #ifndef STANDARD_STARTFILE_PREFIX_1
1588 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1589 #endif
1590 #ifndef STANDARD_STARTFILE_PREFIX_2
1591 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1592 #endif
1594 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1595 #undef MD_EXEC_PREFIX
1596 #undef MD_STARTFILE_PREFIX
1597 #undef MD_STARTFILE_PREFIX_1
1598 #endif
1600 /* If no prefixes defined, use the null string, which will disable them. */
1601 #ifndef MD_EXEC_PREFIX
1602 #define MD_EXEC_PREFIX ""
1603 #endif
1604 #ifndef MD_STARTFILE_PREFIX
1605 #define MD_STARTFILE_PREFIX ""
1606 #endif
1607 #ifndef MD_STARTFILE_PREFIX_1
1608 #define MD_STARTFILE_PREFIX_1 ""
1609 #endif
1611 /* These directories are locations set at configure-time based on the
1612 --prefix option provided to configure. Their initializers are
1613 defined in Makefile.in. These paths are not *directly* used when
1614 gcc_exec_prefix is set because, in that case, we know where the
1615 compiler has been installed, and use paths relative to that
1616 location instead. */
1617 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1618 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1619 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1620 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1622 /* For native compilers, these are well-known paths containing
1623 components that may be provided by the system. For cross
1624 compilers, these paths are not used. */
1625 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1626 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1627 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1628 static const char *const standard_startfile_prefix_1
1629 = STANDARD_STARTFILE_PREFIX_1;
1630 static const char *const standard_startfile_prefix_2
1631 = STANDARD_STARTFILE_PREFIX_2;
1633 /* A relative path to be used in finding the location of tools
1634 relative to the driver. */
1635 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1637 /* A prefix to be used when this is an accelerator compiler. */
1638 static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
1640 /* Subdirectory to use for locating libraries. Set by
1641 set_multilib_dir based on the compilation options. */
1643 static const char *multilib_dir;
1645 /* Subdirectory to use for locating libraries in OS conventions. Set by
1646 set_multilib_dir based on the compilation options. */
1648 static const char *multilib_os_dir;
1650 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1651 set_multilib_dir based on the compilation options. */
1653 static const char *multiarch_dir;
1655 /* Structure to keep track of the specs that have been defined so far.
1656 These are accessed using %(specname) in a compiler or link
1657 spec. */
1659 struct spec_list
1661 /* The following 2 fields must be first */
1662 /* to allow EXTRA_SPECS to be initialized */
1663 const char *name; /* name of the spec. */
1664 const char *ptr; /* available ptr if no static pointer */
1666 /* The following fields are not initialized */
1667 /* by EXTRA_SPECS */
1668 const char **ptr_spec; /* pointer to the spec itself. */
1669 struct spec_list *next; /* Next spec in linked list. */
1670 int name_len; /* length of the name */
1671 bool user_p; /* whether string come from file spec. */
1672 bool alloc_p; /* whether string was allocated */
1673 const char *default_ptr; /* The default value of *ptr_spec. */
1676 #define INIT_STATIC_SPEC(NAME,PTR) \
1677 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1678 *PTR }
1680 /* List of statically defined specs. */
1681 static struct spec_list static_specs[] =
1683 INIT_STATIC_SPEC ("asm", &asm_spec),
1684 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1685 INIT_STATIC_SPEC ("asm_debug_option", &asm_debug_option),
1686 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1687 INIT_STATIC_SPEC ("asm_options", &asm_options),
1688 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1689 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1690 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1691 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1692 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1693 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1694 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1695 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1696 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1697 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1698 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1699 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1700 INIT_STATIC_SPEC ("link", &link_spec),
1701 INIT_STATIC_SPEC ("lib", &lib_spec),
1702 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1703 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1704 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1705 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1706 INIT_STATIC_SPEC ("version", &compiler_version),
1707 INIT_STATIC_SPEC ("multilib", &multilib_select),
1708 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1709 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1710 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1711 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1712 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1713 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
1714 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1715 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1716 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1717 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1718 INIT_STATIC_SPEC ("post_link", &post_link_spec),
1719 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1720 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1721 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1722 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1723 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1724 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1725 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1726 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1727 INIT_STATIC_SPEC ("self_spec", &self_spec),
1730 #ifdef EXTRA_SPECS /* additional specs needed */
1731 /* Structure to keep track of just the first two args of a spec_list.
1732 That is all that the EXTRA_SPECS macro gives us. */
1733 struct spec_list_1
1735 const char *const name;
1736 const char *const ptr;
1739 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1740 static struct spec_list *extra_specs = (struct spec_list *) 0;
1741 #endif
1743 /* List of dynamically allocates specs that have been defined so far. */
1745 static struct spec_list *specs = (struct spec_list *) 0;
1747 /* List of static spec functions. */
1749 static const struct spec_function static_spec_functions[] =
1751 { "getenv", getenv_spec_function },
1752 { "if-exists", if_exists_spec_function },
1753 { "if-exists-else", if_exists_else_spec_function },
1754 { "if-exists-then-else", if_exists_then_else_spec_function },
1755 { "sanitize", sanitize_spec_function },
1756 { "replace-outfile", replace_outfile_spec_function },
1757 { "remove-outfile", remove_outfile_spec_function },
1758 { "version-compare", version_compare_spec_function },
1759 { "include", include_spec_function },
1760 { "find-file", find_file_spec_function },
1761 { "find-plugindir", find_plugindir_spec_function },
1762 { "print-asm-header", print_asm_header_spec_function },
1763 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1764 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1765 { "pass-through-libs", pass_through_libs_spec_func },
1766 { "dumps", dumps_spec_func },
1767 { "gt", greater_than_spec_func },
1768 { "debug-level-gt", debug_level_greater_than_spec_func },
1769 { "dwarf-version-gt", dwarf_version_greater_than_spec_func },
1770 { "fortran-preinclude-file", find_fortran_preinclude_file},
1771 #ifdef EXTRA_SPEC_FUNCTIONS
1772 EXTRA_SPEC_FUNCTIONS
1773 #endif
1774 { 0, 0 }
1777 static int processing_spec_function;
1779 /* Add appropriate libgcc specs to OBSTACK, taking into account
1780 various permutations of -shared-libgcc, -shared, and such. */
1782 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1784 #ifndef USE_LD_AS_NEEDED
1785 #define USE_LD_AS_NEEDED 0
1786 #endif
1788 static void
1789 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1790 const char *static_name, const char *eh_name)
1792 char *buf;
1794 #if USE_LD_AS_NEEDED
1795 buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
1796 "%{!static:%{!static-libgcc:%{!static-pie:"
1797 "%{!shared-libgcc:",
1798 static_name, " " LD_AS_NEEDED_OPTION " ",
1799 shared_name, " " LD_NO_AS_NEEDED_OPTION
1801 "%{shared-libgcc:",
1802 shared_name, "%{!shared: ", static_name, "}"
1803 "}}"
1804 #else
1805 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1806 "%{!static:%{!static-libgcc:"
1807 "%{!shared:"
1808 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1809 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1811 #ifdef LINK_EH_SPEC
1812 "%{shared:"
1813 "%{shared-libgcc:", shared_name, "}"
1814 "%{!shared-libgcc:", static_name, "}"
1816 #else
1817 "%{shared:", shared_name, "}"
1818 #endif
1819 #endif
1820 "}}", NULL);
1822 obstack_grow (obstack, buf, strlen (buf));
1823 free (buf);
1825 #endif /* ENABLE_SHARED_LIBGCC */
1827 /* Initialize the specs lookup routines. */
1829 static void
1830 init_spec (void)
1832 struct spec_list *next = (struct spec_list *) 0;
1833 struct spec_list *sl = (struct spec_list *) 0;
1834 int i;
1836 if (specs)
1837 return; /* Already initialized. */
1839 if (verbose_flag)
1840 fnotice (stderr, "Using built-in specs.\n");
1842 #ifdef EXTRA_SPECS
1843 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1845 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1847 sl = &extra_specs[i];
1848 sl->name = extra_specs_1[i].name;
1849 sl->ptr = extra_specs_1[i].ptr;
1850 sl->next = next;
1851 sl->name_len = strlen (sl->name);
1852 sl->ptr_spec = &sl->ptr;
1853 gcc_assert (sl->ptr_spec != NULL);
1854 sl->default_ptr = sl->ptr;
1855 next = sl;
1857 #endif
1859 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1861 sl = &static_specs[i];
1862 sl->next = next;
1863 next = sl;
1866 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1867 /* ??? If neither -shared-libgcc nor --static-libgcc was
1868 seen, then we should be making an educated guess. Some proposed
1869 heuristics for ELF include:
1871 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1872 program will be doing dynamic loading, which will likely
1873 need the shared libgcc.
1875 (2) If "-ldl", then it's also a fair bet that we're doing
1876 dynamic loading.
1878 (3) For each ET_DYN we're linking against (either through -lfoo
1879 or /some/path/foo.so), check to see whether it or one of
1880 its dependencies depends on a shared libgcc.
1882 (4) If "-shared"
1884 If the runtime is fixed to look for program headers instead
1885 of calling __register_frame_info at all, for each object,
1886 use the shared libgcc if any EH symbol referenced.
1888 If crtstuff is fixed to not invoke __register_frame_info
1889 automatically, for each object, use the shared libgcc if
1890 any non-empty unwind section found.
1892 Doing any of this probably requires invoking an external program to
1893 do the actual object file scanning. */
1895 const char *p = libgcc_spec;
1896 int in_sep = 1;
1898 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1899 when given the proper command line arguments. */
1900 while (*p)
1902 if (in_sep && *p == '-' && startswith (p, "-lgcc"))
1904 init_gcc_specs (&obstack,
1905 "-lgcc_s"
1906 #ifdef USE_LIBUNWIND_EXCEPTIONS
1907 " -lunwind"
1908 #endif
1910 "-lgcc",
1911 "-lgcc_eh"
1912 #ifdef USE_LIBUNWIND_EXCEPTIONS
1913 # ifdef HAVE_LD_STATIC_DYNAMIC
1914 " %{!static:%{!static-pie:" LD_STATIC_OPTION "}} -lunwind"
1915 " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION "}}"
1916 # else
1917 " -lunwind"
1918 # endif
1919 #endif
1922 p += 5;
1923 in_sep = 0;
1925 else if (in_sep && *p == 'l' && startswith (p, "libgcc.a%s"))
1927 /* Ug. We don't know shared library extensions. Hope that
1928 systems that use this form don't do shared libraries. */
1929 init_gcc_specs (&obstack,
1930 "-lgcc_s",
1931 "libgcc.a%s",
1932 "libgcc_eh.a%s"
1933 #ifdef USE_LIBUNWIND_EXCEPTIONS
1934 " -lunwind"
1935 #endif
1937 p += 10;
1938 in_sep = 0;
1940 else
1942 obstack_1grow (&obstack, *p);
1943 in_sep = (*p == ' ');
1944 p += 1;
1948 obstack_1grow (&obstack, '\0');
1949 libgcc_spec = XOBFINISH (&obstack, const char *);
1951 #endif
1952 #ifdef USE_AS_TRADITIONAL_FORMAT
1953 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1955 static const char tf[] = "--traditional-format ";
1956 obstack_grow (&obstack, tf, sizeof (tf) - 1);
1957 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1958 asm_spec = XOBFINISH (&obstack, const char *);
1960 #endif
1962 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1963 defined LINKER_HASH_STYLE
1964 # ifdef LINK_BUILDID_SPEC
1965 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1966 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
1967 # endif
1968 # ifdef LINK_EH_SPEC
1969 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1970 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
1971 # endif
1972 # ifdef LINKER_HASH_STYLE
1973 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1974 before. */
1976 static const char hash_style[] = "--hash-style=";
1977 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1978 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
1979 obstack_1grow (&obstack, ' ');
1981 # endif
1982 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1983 link_spec = XOBFINISH (&obstack, const char *);
1984 #endif
1986 specs = sl;
1989 /* Update the entry for SPEC in the static_specs table to point to VALUE,
1990 ensuring that we free the previous value if necessary. Set alloc_p for the
1991 entry to ALLOC_P: this determines whether we take ownership of VALUE (i.e.
1992 whether we need to free it later on). */
1993 static void
1994 set_static_spec (const char **spec, const char *value, bool alloc_p)
1996 struct spec_list *sl = NULL;
1998 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
2000 if (static_specs[i].ptr_spec == spec)
2002 sl = static_specs + i;
2003 break;
2007 gcc_assert (sl);
2009 if (sl->alloc_p)
2011 const char *old = *spec;
2012 free (const_cast <char *> (old));
2015 *spec = value;
2016 sl->alloc_p = alloc_p;
2019 /* Update a static spec to a new string, taking ownership of that
2020 string's memory. */
2021 static void set_static_spec_owned (const char **spec, const char *val)
2023 return set_static_spec (spec, val, true);
2026 /* Update a static spec to point to a new value, but don't take
2027 ownership of (i.e. don't free) that string. */
2028 static void set_static_spec_shared (const char **spec, const char *val)
2030 return set_static_spec (spec, val, false);
2034 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
2035 removed; If the spec starts with a + then SPEC is added to the end of the
2036 current spec. */
2038 static void
2039 set_spec (const char *name, const char *spec, bool user_p)
2041 struct spec_list *sl;
2042 const char *old_spec;
2043 int name_len = strlen (name);
2044 int i;
2046 /* If this is the first call, initialize the statically allocated specs. */
2047 if (!specs)
2049 struct spec_list *next = (struct spec_list *) 0;
2050 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
2052 sl = &static_specs[i];
2053 sl->next = next;
2054 next = sl;
2056 specs = sl;
2059 /* See if the spec already exists. */
2060 for (sl = specs; sl; sl = sl->next)
2061 if (name_len == sl->name_len && !strcmp (sl->name, name))
2062 break;
2064 if (!sl)
2066 /* Not found - make it. */
2067 sl = XNEW (struct spec_list);
2068 sl->name = xstrdup (name);
2069 sl->name_len = name_len;
2070 sl->ptr_spec = &sl->ptr;
2071 sl->alloc_p = 0;
2072 *(sl->ptr_spec) = "";
2073 sl->next = specs;
2074 sl->default_ptr = NULL;
2075 specs = sl;
2078 old_spec = *(sl->ptr_spec);
2079 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
2080 ? concat (old_spec, spec + 1, NULL)
2081 : xstrdup (spec));
2083 #ifdef DEBUG_SPECS
2084 if (verbose_flag)
2085 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
2086 #endif
2088 /* Free the old spec. */
2089 if (old_spec && sl->alloc_p)
2090 free (CONST_CAST (char *, old_spec));
2092 sl->user_p = user_p;
2093 sl->alloc_p = true;
2096 /* Accumulate a command (program name and args), and run it. */
2098 typedef const char *const_char_p; /* For DEF_VEC_P. */
2100 /* Vector of pointers to arguments in the current line of specifications. */
2101 static vec<const_char_p> argbuf;
2103 /* Likewise, but for the current @file. */
2104 static vec<const_char_p> at_file_argbuf;
2106 /* Whether an @file is currently open. */
2107 static bool in_at_file = false;
2109 /* Were the options -c, -S or -E passed. */
2110 static int have_c = 0;
2112 /* Was the option -o passed. */
2113 static int have_o = 0;
2115 /* Was the option -E passed. */
2116 static int have_E = 0;
2118 /* Pointer to output file name passed in with -o. */
2119 static const char *output_file = 0;
2121 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
2122 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
2123 it here. */
2125 static struct temp_name {
2126 const char *suffix; /* suffix associated with the code. */
2127 int length; /* strlen (suffix). */
2128 int unique; /* Indicates whether %g or %u/%U was used. */
2129 const char *filename; /* associated filename. */
2130 int filename_length; /* strlen (filename). */
2131 struct temp_name *next;
2132 } *temp_names;
2134 /* Number of commands executed so far. */
2136 static int execution_count;
2138 /* Number of commands that exited with a signal. */
2140 static int signal_count;
2142 /* Allocate the argument vector. */
2144 static void
2145 alloc_args (void)
2147 argbuf.create (10);
2148 at_file_argbuf.create (10);
2151 /* Clear out the vector of arguments (after a command is executed). */
2153 static void
2154 clear_args (void)
2156 argbuf.truncate (0);
2157 at_file_argbuf.truncate (0);
2160 /* Add one argument to the vector at the end.
2161 This is done when a space is seen or at the end of the line.
2162 If DELETE_ALWAYS is nonzero, the arg is a filename
2163 and the file should be deleted eventually.
2164 If DELETE_FAILURE is nonzero, the arg is a filename
2165 and the file should be deleted if this compilation fails. */
2167 static void
2168 store_arg (const char *arg, int delete_always, int delete_failure)
2170 if (in_at_file)
2171 at_file_argbuf.safe_push (arg);
2172 else
2173 argbuf.safe_push (arg);
2175 if (delete_always || delete_failure)
2177 const char *p;
2178 /* If the temporary file we should delete is specified as
2179 part of a joined argument extract the filename. */
2180 if (arg[0] == '-'
2181 && (p = strrchr (arg, '=')))
2182 arg = p + 1;
2183 record_temp_file (arg, delete_always, delete_failure);
2187 /* Open a temporary @file into which subsequent arguments will be stored. */
2189 static void
2190 open_at_file (void)
2192 if (in_at_file)
2193 fatal_error (input_location, "cannot open nested response file");
2194 else
2195 in_at_file = true;
2198 /* Create a temporary @file name. */
2200 static char *make_at_file (void)
2202 static int fileno = 0;
2203 char filename[20];
2204 const char *base, *ext;
2206 if (!save_temps_flag)
2207 return make_temp_file ("");
2209 base = dumpbase;
2210 if (!(base && *base))
2211 base = dumpdir;
2212 if (!(base && *base))
2213 base = "a";
2215 sprintf (filename, ".args.%d", fileno++);
2216 ext = filename;
2218 if (base == dumpdir && dumpdir_trailing_dash_added)
2219 ext++;
2221 return concat (base, ext, NULL);
2224 /* Close the temporary @file and add @file to the argument list. */
2226 static void
2227 close_at_file (void)
2229 if (!in_at_file)
2230 fatal_error (input_location, "cannot close nonexistent response file");
2232 in_at_file = false;
2234 const unsigned int n_args = at_file_argbuf.length ();
2235 if (n_args == 0)
2236 return;
2238 char **argv = XALLOCAVEC (char *, n_args + 1);
2239 char *temp_file = make_at_file ();
2240 char *at_argument = concat ("@", temp_file, NULL);
2241 FILE *f = fopen (temp_file, "w");
2242 int status;
2243 unsigned int i;
2245 /* Copy the strings over. */
2246 for (i = 0; i < n_args; i++)
2247 argv[i] = CONST_CAST (char *, at_file_argbuf[i]);
2248 argv[i] = NULL;
2250 at_file_argbuf.truncate (0);
2252 if (f == NULL)
2253 fatal_error (input_location, "could not open temporary response file %s",
2254 temp_file);
2256 status = writeargv (argv, f);
2258 if (status)
2259 fatal_error (input_location,
2260 "could not write to temporary response file %s",
2261 temp_file);
2263 status = fclose (f);
2265 if (status == EOF)
2266 fatal_error (input_location, "could not close temporary response file %s",
2267 temp_file);
2269 store_arg (at_argument, 0, 0);
2271 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
2274 /* Load specs from a file name named FILENAME, replacing occurrences of
2275 various different types of line-endings, \r\n, \n\r and just \r, with
2276 a single \n. */
2278 static char *
2279 load_specs (const char *filename)
2281 int desc;
2282 int readlen;
2283 struct stat statbuf;
2284 char *buffer;
2285 char *buffer_p;
2286 char *specs;
2287 char *specs_p;
2289 if (verbose_flag)
2290 fnotice (stderr, "Reading specs from %s\n", filename);
2292 /* Open and stat the file. */
2293 desc = open (filename, O_RDONLY, 0);
2294 if (desc < 0)
2296 failed:
2297 /* This leaves DESC open, but the OS will save us. */
2298 fatal_error (input_location, "cannot read spec file %qs: %m", filename);
2301 if (stat (filename, &statbuf) < 0)
2302 goto failed;
2304 /* Read contents of file into BUFFER. */
2305 buffer = XNEWVEC (char, statbuf.st_size + 1);
2306 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2307 if (readlen < 0)
2308 goto failed;
2309 buffer[readlen] = 0;
2310 close (desc);
2312 specs = XNEWVEC (char, readlen + 1);
2313 specs_p = specs;
2314 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2316 int skip = 0;
2317 char c = *buffer_p;
2318 if (c == '\r')
2320 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2321 skip = 1;
2322 else if (*(buffer_p + 1) == '\n') /* \r\n */
2323 skip = 1;
2324 else /* \r */
2325 c = '\n';
2327 if (! skip)
2328 *specs_p++ = c;
2330 *specs_p = '\0';
2332 free (buffer);
2333 return (specs);
2336 /* Read compilation specs from a file named FILENAME,
2337 replacing the default ones.
2339 A suffix which starts with `*' is a definition for
2340 one of the machine-specific sub-specs. The "suffix" should be
2341 *asm, *cc1, *cpp, *link, *startfile, etc.
2342 The corresponding spec is stored in asm_spec, etc.,
2343 rather than in the `compilers' vector.
2345 Anything invalid in the file is a fatal error. */
2347 static void
2348 read_specs (const char *filename, bool main_p, bool user_p)
2350 char *buffer;
2351 char *p;
2353 buffer = load_specs (filename);
2355 /* Scan BUFFER for specs, putting them in the vector. */
2356 p = buffer;
2357 while (1)
2359 char *suffix;
2360 char *spec;
2361 char *in, *out, *p1, *p2, *p3;
2363 /* Advance P in BUFFER to the next nonblank nocomment line. */
2364 p = skip_whitespace (p);
2365 if (*p == 0)
2366 break;
2368 /* Is this a special command that starts with '%'? */
2369 /* Don't allow this for the main specs file, since it would
2370 encourage people to overwrite it. */
2371 if (*p == '%' && !main_p)
2373 p1 = p;
2374 while (*p && *p != '\n')
2375 p++;
2377 /* Skip '\n'. */
2378 p++;
2380 if (startswith (p1, "%include")
2381 && (p1[sizeof "%include" - 1] == ' '
2382 || p1[sizeof "%include" - 1] == '\t'))
2384 char *new_filename;
2386 p1 += sizeof ("%include");
2387 while (*p1 == ' ' || *p1 == '\t')
2388 p1++;
2390 if (*p1++ != '<' || p[-2] != '>')
2391 fatal_error (input_location,
2392 "specs %%include syntax malformed after "
2393 "%ld characters",
2394 (long) (p1 - buffer + 1));
2396 p[-2] = '\0';
2397 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2398 read_specs (new_filename ? new_filename : p1, false, user_p);
2399 continue;
2401 else if (startswith (p1, "%include_noerr")
2402 && (p1[sizeof "%include_noerr" - 1] == ' '
2403 || p1[sizeof "%include_noerr" - 1] == '\t'))
2405 char *new_filename;
2407 p1 += sizeof "%include_noerr";
2408 while (*p1 == ' ' || *p1 == '\t')
2409 p1++;
2411 if (*p1++ != '<' || p[-2] != '>')
2412 fatal_error (input_location,
2413 "specs %%include syntax malformed after "
2414 "%ld characters",
2415 (long) (p1 - buffer + 1));
2417 p[-2] = '\0';
2418 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2419 if (new_filename)
2420 read_specs (new_filename, false, user_p);
2421 else if (verbose_flag)
2422 fnotice (stderr, "could not find specs file %s\n", p1);
2423 continue;
2425 else if (startswith (p1, "%rename")
2426 && (p1[sizeof "%rename" - 1] == ' '
2427 || p1[sizeof "%rename" - 1] == '\t'))
2429 int name_len;
2430 struct spec_list *sl;
2431 struct spec_list *newsl;
2433 /* Get original name. */
2434 p1 += sizeof "%rename";
2435 while (*p1 == ' ' || *p1 == '\t')
2436 p1++;
2438 if (! ISALPHA ((unsigned char) *p1))
2439 fatal_error (input_location,
2440 "specs %%rename syntax malformed after "
2441 "%ld characters",
2442 (long) (p1 - buffer));
2444 p2 = p1;
2445 while (*p2 && !ISSPACE ((unsigned char) *p2))
2446 p2++;
2448 if (*p2 != ' ' && *p2 != '\t')
2449 fatal_error (input_location,
2450 "specs %%rename syntax malformed after "
2451 "%ld characters",
2452 (long) (p2 - buffer));
2454 name_len = p2 - p1;
2455 *p2++ = '\0';
2456 while (*p2 == ' ' || *p2 == '\t')
2457 p2++;
2459 if (! ISALPHA ((unsigned char) *p2))
2460 fatal_error (input_location,
2461 "specs %%rename syntax malformed after "
2462 "%ld characters",
2463 (long) (p2 - buffer));
2465 /* Get new spec name. */
2466 p3 = p2;
2467 while (*p3 && !ISSPACE ((unsigned char) *p3))
2468 p3++;
2470 if (p3 != p - 1)
2471 fatal_error (input_location,
2472 "specs %%rename syntax malformed after "
2473 "%ld characters",
2474 (long) (p3 - buffer));
2475 *p3 = '\0';
2477 for (sl = specs; sl; sl = sl->next)
2478 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2479 break;
2481 if (!sl)
2482 fatal_error (input_location,
2483 "specs %s spec was not found to be renamed", p1);
2485 if (strcmp (p1, p2) == 0)
2486 continue;
2488 for (newsl = specs; newsl; newsl = newsl->next)
2489 if (strcmp (newsl->name, p2) == 0)
2490 fatal_error (input_location,
2491 "%s: attempt to rename spec %qs to "
2492 "already defined spec %qs",
2493 filename, p1, p2);
2495 if (verbose_flag)
2497 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
2498 #ifdef DEBUG_SPECS
2499 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2500 #endif
2503 set_spec (p2, *(sl->ptr_spec), user_p);
2504 if (sl->alloc_p)
2505 free (CONST_CAST (char *, *(sl->ptr_spec)));
2507 *(sl->ptr_spec) = "";
2508 sl->alloc_p = 0;
2509 continue;
2511 else
2512 fatal_error (input_location,
2513 "specs unknown %% command after %ld characters",
2514 (long) (p1 - buffer));
2517 /* Find the colon that should end the suffix. */
2518 p1 = p;
2519 while (*p1 && *p1 != ':' && *p1 != '\n')
2520 p1++;
2522 /* The colon shouldn't be missing. */
2523 if (*p1 != ':')
2524 fatal_error (input_location,
2525 "specs file malformed after %ld characters",
2526 (long) (p1 - buffer));
2528 /* Skip back over trailing whitespace. */
2529 p2 = p1;
2530 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2531 p2--;
2533 /* Copy the suffix to a string. */
2534 suffix = save_string (p, p2 - p);
2535 /* Find the next line. */
2536 p = skip_whitespace (p1 + 1);
2537 if (p[1] == 0)
2538 fatal_error (input_location,
2539 "specs file malformed after %ld characters",
2540 (long) (p - buffer));
2542 p1 = p;
2543 /* Find next blank line or end of string. */
2544 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2545 p1++;
2547 /* Specs end at the blank line and do not include the newline. */
2548 spec = save_string (p, p1 - p);
2549 p = p1;
2551 /* Delete backslash-newline sequences from the spec. */
2552 in = spec;
2553 out = spec;
2554 while (*in != 0)
2556 if (in[0] == '\\' && in[1] == '\n')
2557 in += 2;
2558 else if (in[0] == '#')
2559 while (*in && *in != '\n')
2560 in++;
2562 else
2563 *out++ = *in++;
2565 *out = 0;
2567 if (suffix[0] == '*')
2569 if (! strcmp (suffix, "*link_command"))
2570 link_command_spec = spec;
2571 else
2573 set_spec (suffix + 1, spec, user_p);
2574 free (spec);
2577 else
2579 /* Add this pair to the vector. */
2580 compilers
2581 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2583 compilers[n_compilers].suffix = suffix;
2584 compilers[n_compilers].spec = spec;
2585 n_compilers++;
2586 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2589 if (*suffix == 0)
2590 link_command_spec = spec;
2593 if (link_command_spec == 0)
2594 fatal_error (input_location, "spec file has no spec for linking");
2596 XDELETEVEC (buffer);
2599 /* Record the names of temporary files we tell compilers to write,
2600 and delete them at the end of the run. */
2602 /* This is the common prefix we use to make temp file names.
2603 It is chosen once for each run of this program.
2604 It is substituted into a spec by %g or %j.
2605 Thus, all temp file names contain this prefix.
2606 In practice, all temp file names start with this prefix.
2608 This prefix comes from the envvar TMPDIR if it is defined;
2609 otherwise, from the P_tmpdir macro if that is defined;
2610 otherwise, in /usr/tmp or /tmp;
2611 or finally the current directory if all else fails. */
2613 static const char *temp_filename;
2615 /* Length of the prefix. */
2617 static int temp_filename_length;
2619 /* Define the list of temporary files to delete. */
2621 struct temp_file
2623 const char *name;
2624 struct temp_file *next;
2627 /* Queue of files to delete on success or failure of compilation. */
2628 static struct temp_file *always_delete_queue;
2629 /* Queue of files to delete on failure of compilation. */
2630 static struct temp_file *failure_delete_queue;
2632 /* Record FILENAME as a file to be deleted automatically.
2633 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2634 otherwise delete it in any case.
2635 FAIL_DELETE nonzero means delete it if a compilation step fails;
2636 otherwise delete it in any case. */
2638 void
2639 record_temp_file (const char *filename, int always_delete, int fail_delete)
2641 char *const name = xstrdup (filename);
2643 if (always_delete)
2645 struct temp_file *temp;
2646 for (temp = always_delete_queue; temp; temp = temp->next)
2647 if (! filename_cmp (name, temp->name))
2649 free (name);
2650 goto already1;
2653 temp = XNEW (struct temp_file);
2654 temp->next = always_delete_queue;
2655 temp->name = name;
2656 always_delete_queue = temp;
2658 already1:;
2661 if (fail_delete)
2663 struct temp_file *temp;
2664 for (temp = failure_delete_queue; temp; temp = temp->next)
2665 if (! filename_cmp (name, temp->name))
2667 free (name);
2668 goto already2;
2671 temp = XNEW (struct temp_file);
2672 temp->next = failure_delete_queue;
2673 temp->name = name;
2674 failure_delete_queue = temp;
2676 already2:;
2680 /* Delete all the temporary files whose names we previously recorded. */
2682 #ifndef DELETE_IF_ORDINARY
2683 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2684 do \
2686 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2687 if (unlink (NAME) < 0) \
2688 if (VERBOSE_FLAG) \
2689 error ("%s: %m", (NAME)); \
2690 } while (0)
2691 #endif
2693 static void
2694 delete_if_ordinary (const char *name)
2696 struct stat st;
2697 #ifdef DEBUG
2698 int i, c;
2700 printf ("Delete %s? (y or n) ", name);
2701 fflush (stdout);
2702 i = getchar ();
2703 if (i != '\n')
2704 while ((c = getchar ()) != '\n' && c != EOF)
2707 if (i == 'y' || i == 'Y')
2708 #endif /* DEBUG */
2709 DELETE_IF_ORDINARY (name, st, verbose_flag);
2712 static void
2713 delete_temp_files (void)
2715 struct temp_file *temp;
2717 for (temp = always_delete_queue; temp; temp = temp->next)
2718 delete_if_ordinary (temp->name);
2719 always_delete_queue = 0;
2722 /* Delete all the files to be deleted on error. */
2724 static void
2725 delete_failure_queue (void)
2727 struct temp_file *temp;
2729 for (temp = failure_delete_queue; temp; temp = temp->next)
2730 delete_if_ordinary (temp->name);
2733 static void
2734 clear_failure_queue (void)
2736 failure_delete_queue = 0;
2739 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2740 returns non-NULL.
2741 If DO_MULTI is true iterate over the paths twice, first with multilib
2742 suffix then without, otherwise iterate over the paths once without
2743 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2744 to avoid visiting the same path twice, but we could do better. For
2745 instance, /usr/lib/../lib is considered different from /usr/lib.
2746 At least EXTRA_SPACE chars past the end of the path passed to
2747 CALLBACK are available for use by the callback.
2748 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2750 Returns the value returned by CALLBACK. */
2752 static void *
2753 for_each_path (const struct path_prefix *paths,
2754 bool do_multi,
2755 size_t extra_space,
2756 void *(*callback) (char *, void *),
2757 void *callback_info)
2759 struct prefix_list *pl;
2760 const char *multi_dir = NULL;
2761 const char *multi_os_dir = NULL;
2762 const char *multiarch_suffix = NULL;
2763 const char *multi_suffix;
2764 const char *just_multi_suffix;
2765 char *path = NULL;
2766 void *ret = NULL;
2767 bool skip_multi_dir = false;
2768 bool skip_multi_os_dir = false;
2770 multi_suffix = machine_suffix;
2771 just_multi_suffix = just_machine_suffix;
2772 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2774 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2775 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2776 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2778 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2779 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2780 if (multiarch_dir)
2781 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
2783 while (1)
2785 size_t multi_dir_len = 0;
2786 size_t multi_os_dir_len = 0;
2787 size_t multiarch_len = 0;
2788 size_t suffix_len;
2789 size_t just_suffix_len;
2790 size_t len;
2792 if (multi_dir)
2793 multi_dir_len = strlen (multi_dir);
2794 if (multi_os_dir)
2795 multi_os_dir_len = strlen (multi_os_dir);
2796 if (multiarch_suffix)
2797 multiarch_len = strlen (multiarch_suffix);
2798 suffix_len = strlen (multi_suffix);
2799 just_suffix_len = strlen (just_multi_suffix);
2801 if (path == NULL)
2803 len = paths->max_len + extra_space + 1;
2804 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
2805 path = XNEWVEC (char, len);
2808 for (pl = paths->plist; pl != 0; pl = pl->next)
2810 len = strlen (pl->prefix);
2811 memcpy (path, pl->prefix, len);
2813 /* Look first in MACHINE/VERSION subdirectory. */
2814 if (!skip_multi_dir)
2816 memcpy (path + len, multi_suffix, suffix_len + 1);
2817 ret = callback (path, callback_info);
2818 if (ret)
2819 break;
2822 /* Some paths are tried with just the machine (ie. target)
2823 subdir. This is used for finding as, ld, etc. */
2824 if (!skip_multi_dir
2825 && pl->require_machine_suffix == 2)
2827 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2828 ret = callback (path, callback_info);
2829 if (ret)
2830 break;
2833 /* Now try the multiarch path. */
2834 if (!skip_multi_dir
2835 && !pl->require_machine_suffix && multiarch_dir)
2837 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2838 ret = callback (path, callback_info);
2839 if (ret)
2840 break;
2843 /* Now try the base path. */
2844 if (!pl->require_machine_suffix
2845 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2847 const char *this_multi;
2848 size_t this_multi_len;
2850 if (pl->os_multilib)
2852 this_multi = multi_os_dir;
2853 this_multi_len = multi_os_dir_len;
2855 else
2857 this_multi = multi_dir;
2858 this_multi_len = multi_dir_len;
2861 if (this_multi_len)
2862 memcpy (path + len, this_multi, this_multi_len + 1);
2863 else
2864 path[len] = '\0';
2866 ret = callback (path, callback_info);
2867 if (ret)
2868 break;
2871 if (pl)
2872 break;
2874 if (multi_dir == NULL && multi_os_dir == NULL)
2875 break;
2877 /* Run through the paths again, this time without multilibs.
2878 Don't repeat any we have already seen. */
2879 if (multi_dir)
2881 free (CONST_CAST (char *, multi_dir));
2882 multi_dir = NULL;
2883 free (CONST_CAST (char *, multi_suffix));
2884 multi_suffix = machine_suffix;
2885 free (CONST_CAST (char *, just_multi_suffix));
2886 just_multi_suffix = just_machine_suffix;
2888 else
2889 skip_multi_dir = true;
2890 if (multi_os_dir)
2892 free (CONST_CAST (char *, multi_os_dir));
2893 multi_os_dir = NULL;
2895 else
2896 skip_multi_os_dir = true;
2899 if (multi_dir)
2901 free (CONST_CAST (char *, multi_dir));
2902 free (CONST_CAST (char *, multi_suffix));
2903 free (CONST_CAST (char *, just_multi_suffix));
2905 if (multi_os_dir)
2906 free (CONST_CAST (char *, multi_os_dir));
2907 if (ret != path)
2908 free (path);
2909 return ret;
2912 /* Callback for build_search_list. Adds path to obstack being built. */
2914 struct add_to_obstack_info {
2915 struct obstack *ob;
2916 bool check_dir;
2917 bool first_time;
2920 static void *
2921 add_to_obstack (char *path, void *data)
2923 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2925 if (info->check_dir && !is_directory (path, false))
2926 return NULL;
2928 if (!info->first_time)
2929 obstack_1grow (info->ob, PATH_SEPARATOR);
2931 obstack_grow (info->ob, path, strlen (path));
2933 info->first_time = false;
2934 return NULL;
2937 /* Add or change the value of an environment variable, outputting the
2938 change to standard error if in verbose mode. */
2939 static void
2940 xputenv (const char *string)
2942 env.xput (string);
2945 /* Build a list of search directories from PATHS.
2946 PREFIX is a string to prepend to the list.
2947 If CHECK_DIR_P is true we ensure the directory exists.
2948 If DO_MULTI is true, multilib paths are output first, then
2949 non-multilib paths.
2950 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2951 It is also used by the --print-search-dirs flag. */
2953 static char *
2954 build_search_list (const struct path_prefix *paths, const char *prefix,
2955 bool check_dir, bool do_multi)
2957 struct add_to_obstack_info info;
2959 info.ob = &collect_obstack;
2960 info.check_dir = check_dir;
2961 info.first_time = true;
2963 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2964 obstack_1grow (&collect_obstack, '=');
2966 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2968 obstack_1grow (&collect_obstack, '\0');
2969 return XOBFINISH (&collect_obstack, char *);
2972 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2973 for collect. */
2975 static void
2976 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2977 bool do_multi)
2979 xputenv (build_search_list (paths, env_var, true, do_multi));
2982 /* Check whether NAME can be accessed in MODE. This is like access,
2983 except that it never considers directories to be executable. */
2985 static int
2986 access_check (const char *name, int mode)
2988 if (mode == X_OK)
2990 struct stat st;
2992 if (stat (name, &st) < 0
2993 || S_ISDIR (st.st_mode))
2994 return -1;
2997 return access (name, mode);
3000 /* Callback for find_a_file. Appends the file name to the directory
3001 path. If the resulting file exists in the right mode, return the
3002 full pathname to the file. */
3004 struct file_at_path_info {
3005 const char *name;
3006 const char *suffix;
3007 int name_len;
3008 int suffix_len;
3009 int mode;
3012 static void *
3013 file_at_path (char *path, void *data)
3015 struct file_at_path_info *info = (struct file_at_path_info *) data;
3016 size_t len = strlen (path);
3018 memcpy (path + len, info->name, info->name_len);
3019 len += info->name_len;
3021 /* Some systems have a suffix for executable files.
3022 So try appending that first. */
3023 if (info->suffix_len)
3025 memcpy (path + len, info->suffix, info->suffix_len + 1);
3026 if (access_check (path, info->mode) == 0)
3027 return path;
3030 path[len] = '\0';
3031 if (access_check (path, info->mode) == 0)
3032 return path;
3034 return NULL;
3037 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
3038 access to check permissions. If DO_MULTI is true, search multilib
3039 paths then non-multilib paths, otherwise do not search multilib paths.
3040 Return 0 if not found, otherwise return its name, allocated with malloc. */
3042 static char *
3043 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
3044 bool do_multi)
3046 struct file_at_path_info info;
3048 /* Find the filename in question (special case for absolute paths). */
3050 if (IS_ABSOLUTE_PATH (name))
3052 if (access (name, mode) == 0)
3053 return xstrdup (name);
3055 return NULL;
3058 info.name = name;
3059 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
3060 info.name_len = strlen (info.name);
3061 info.suffix_len = strlen (info.suffix);
3062 info.mode = mode;
3064 return (char*) for_each_path (pprefix, do_multi,
3065 info.name_len + info.suffix_len,
3066 file_at_path, &info);
3069 /* Specialization of find_a_file for programs that also takes into account
3070 configure-specified default programs. */
3072 static char*
3073 find_a_program (const char *name)
3075 /* Do not search if default matches query. */
3077 #ifdef DEFAULT_ASSEMBLER
3078 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, X_OK) == 0)
3079 return xstrdup (DEFAULT_ASSEMBLER);
3080 #endif
3082 #ifdef DEFAULT_LINKER
3083 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, X_OK) == 0)
3084 return xstrdup (DEFAULT_LINKER);
3085 #endif
3087 #ifdef DEFAULT_DSYMUTIL
3088 if (! strcmp (name, "dsymutil") && access (DEFAULT_DSYMUTIL, X_OK) == 0)
3089 return xstrdup (DEFAULT_DSYMUTIL);
3090 #endif
3092 return find_a_file (&exec_prefixes, name, X_OK, false);
3095 /* Ranking of prefixes in the sort list. -B prefixes are put before
3096 all others. */
3098 enum path_prefix_priority
3100 PREFIX_PRIORITY_B_OPT,
3101 PREFIX_PRIORITY_LAST
3104 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
3105 order according to PRIORITY. Within each PRIORITY, new entries are
3106 appended.
3108 If WARN is nonzero, we will warn if no file is found
3109 through this prefix. WARN should point to an int
3110 which will be set to 1 if this entry is used.
3112 COMPONENT is the value to be passed to update_path.
3114 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
3115 the complete value of machine_suffix.
3116 2 means try both machine_suffix and just_machine_suffix. */
3118 static void
3119 add_prefix (struct path_prefix *pprefix, const char *prefix,
3120 const char *component, /* enum prefix_priority */ int priority,
3121 int require_machine_suffix, int os_multilib)
3123 struct prefix_list *pl, **prev;
3124 int len;
3126 for (prev = &pprefix->plist;
3127 (*prev) != NULL && (*prev)->priority <= priority;
3128 prev = &(*prev)->next)
3131 /* Keep track of the longest prefix. */
3133 prefix = update_path (prefix, component);
3134 len = strlen (prefix);
3135 if (len > pprefix->max_len)
3136 pprefix->max_len = len;
3138 pl = XNEW (struct prefix_list);
3139 pl->prefix = prefix;
3140 pl->require_machine_suffix = require_machine_suffix;
3141 pl->priority = priority;
3142 pl->os_multilib = os_multilib;
3144 /* Insert after PREV. */
3145 pl->next = (*prev);
3146 (*prev) = pl;
3149 /* Same as add_prefix, but prepending target_system_root to prefix. */
3150 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
3151 static void
3152 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
3153 const char *component,
3154 /* enum prefix_priority */ int priority,
3155 int require_machine_suffix, int os_multilib)
3157 if (!IS_ABSOLUTE_PATH (prefix))
3158 fatal_error (input_location, "system path %qs is not absolute", prefix);
3160 if (target_system_root)
3162 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
3163 size_t sysroot_len = strlen (target_system_root);
3165 if (sysroot_len > 0
3166 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
3167 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3169 if (target_sysroot_suffix)
3170 prefix = concat (sysroot_no_trailing_dir_separator,
3171 target_sysroot_suffix, prefix, NULL);
3172 else
3173 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
3175 free (sysroot_no_trailing_dir_separator);
3177 /* We have to override this because GCC's notion of sysroot
3178 moves along with GCC. */
3179 component = "GCC";
3182 add_prefix (pprefix, prefix, component, priority,
3183 require_machine_suffix, os_multilib);
3186 /* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */
3188 static void
3189 add_sysrooted_hdrs_prefix (struct path_prefix *pprefix, const char *prefix,
3190 const char *component,
3191 /* enum prefix_priority */ int priority,
3192 int require_machine_suffix, int os_multilib)
3194 if (!IS_ABSOLUTE_PATH (prefix))
3195 fatal_error (input_location, "system path %qs is not absolute", prefix);
3197 if (target_system_root)
3199 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
3200 size_t sysroot_len = strlen (target_system_root);
3202 if (sysroot_len > 0
3203 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
3204 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3206 if (target_sysroot_hdrs_suffix)
3207 prefix = concat (sysroot_no_trailing_dir_separator,
3208 target_sysroot_hdrs_suffix, prefix, NULL);
3209 else
3210 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
3212 free (sysroot_no_trailing_dir_separator);
3214 /* We have to override this because GCC's notion of sysroot
3215 moves along with GCC. */
3216 component = "GCC";
3219 add_prefix (pprefix, prefix, component, priority,
3220 require_machine_suffix, os_multilib);
3224 /* Execute the command specified by the arguments on the current line of spec.
3225 When using pipes, this includes several piped-together commands
3226 with `|' between them.
3228 Return 0 if successful, -1 if failed. */
3230 static int
3231 execute (void)
3233 int i;
3234 int n_commands; /* # of command. */
3235 char *string;
3236 struct pex_obj *pex;
3237 struct command
3239 const char *prog; /* program name. */
3240 const char **argv; /* vector of args. */
3242 const char *arg;
3244 struct command *commands; /* each command buffer with above info. */
3246 gcc_assert (!processing_spec_function);
3248 if (wrapper_string)
3250 string = find_a_program (argbuf[0]);
3251 if (string)
3252 argbuf[0] = string;
3253 insert_wrapper (wrapper_string);
3256 /* Count # of piped commands. */
3257 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3258 if (strcmp (arg, "|") == 0)
3259 n_commands++;
3261 /* Get storage for each command. */
3262 commands = XALLOCAVEC (struct command, n_commands);
3264 /* Split argbuf into its separate piped processes,
3265 and record info about each one.
3266 Also search for the programs that are to be run. */
3268 argbuf.safe_push (0);
3270 commands[0].prog = argbuf[0]; /* first command. */
3271 commands[0].argv = argbuf.address ();
3273 if (!wrapper_string)
3275 string = find_a_program(commands[0].prog);
3276 if (string)
3277 commands[0].argv[0] = string;
3280 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3281 if (arg && strcmp (arg, "|") == 0)
3282 { /* each command. */
3283 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3284 fatal_error (input_location, "%<-pipe%> not supported");
3285 #endif
3286 argbuf[i] = 0; /* Termination of command args. */
3287 commands[n_commands].prog = argbuf[i + 1];
3288 commands[n_commands].argv
3289 = &(argbuf.address ())[i + 1];
3290 string = find_a_program(commands[n_commands].prog);
3291 if (string)
3292 commands[n_commands].argv[0] = string;
3293 n_commands++;
3296 /* If -v, print what we are about to do, and maybe query. */
3298 if (verbose_flag)
3300 /* For help listings, put a blank line between sub-processes. */
3301 if (print_help_list)
3302 fputc ('\n', stderr);
3304 /* Print each piped command as a separate line. */
3305 for (i = 0; i < n_commands; i++)
3307 const char *const *j;
3309 if (verbose_only_flag)
3311 for (j = commands[i].argv; *j; j++)
3313 const char *p;
3314 for (p = *j; *p; ++p)
3315 if (!ISALNUM ((unsigned char) *p)
3316 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
3317 break;
3318 if (*p || !*j)
3320 fprintf (stderr, " \"");
3321 for (p = *j; *p; ++p)
3323 if (*p == '"' || *p == '\\' || *p == '$')
3324 fputc ('\\', stderr);
3325 fputc (*p, stderr);
3327 fputc ('"', stderr);
3329 /* If it's empty, print "". */
3330 else if (!**j)
3331 fprintf (stderr, " \"\"");
3332 else
3333 fprintf (stderr, " %s", *j);
3336 else
3337 for (j = commands[i].argv; *j; j++)
3338 /* If it's empty, print "". */
3339 if (!**j)
3340 fprintf (stderr, " \"\"");
3341 else
3342 fprintf (stderr, " %s", *j);
3344 /* Print a pipe symbol after all but the last command. */
3345 if (i + 1 != n_commands)
3346 fprintf (stderr, " |");
3347 fprintf (stderr, "\n");
3349 fflush (stderr);
3350 if (verbose_only_flag != 0)
3352 /* verbose_only_flag should act as if the spec was
3353 executed, so increment execution_count before
3354 returning. This prevents spurious warnings about
3355 unused linker input files, etc. */
3356 execution_count++;
3357 return 0;
3359 #ifdef DEBUG
3360 fnotice (stderr, "\nGo ahead? (y or n) ");
3361 fflush (stderr);
3362 i = getchar ();
3363 if (i != '\n')
3364 while (getchar () != '\n')
3367 if (i != 'y' && i != 'Y')
3368 return 0;
3369 #endif /* DEBUG */
3372 #ifdef ENABLE_VALGRIND_CHECKING
3373 /* Run the each command through valgrind. To simplify prepending the
3374 path to valgrind and the option "-q" (for quiet operation unless
3375 something triggers), we allocate a separate argv array. */
3377 for (i = 0; i < n_commands; i++)
3379 const char **argv;
3380 int argc;
3381 int j;
3383 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3386 argv = XALLOCAVEC (const char *, argc + 3);
3388 argv[0] = VALGRIND_PATH;
3389 argv[1] = "-q";
3390 for (j = 2; j < argc + 2; j++)
3391 argv[j] = commands[i].argv[j - 2];
3392 argv[j] = NULL;
3394 commands[i].argv = argv;
3395 commands[i].prog = argv[0];
3397 #endif
3399 /* Run each piped subprocess. */
3401 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3402 ? PEX_RECORD_TIMES : 0),
3403 progname, temp_filename);
3404 if (pex == NULL)
3405 fatal_error (input_location, "%<pex_init%> failed: %m");
3407 for (i = 0; i < n_commands; i++)
3409 const char *errmsg;
3410 int err;
3411 const char *string = commands[i].argv[0];
3413 errmsg = pex_run (pex,
3414 ((i + 1 == n_commands ? PEX_LAST : 0)
3415 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3416 string, CONST_CAST (char **, commands[i].argv),
3417 NULL, NULL, &err);
3418 if (errmsg != NULL)
3420 errno = err;
3421 fatal_error (input_location,
3422 err ? G_("cannot execute %qs: %s: %m")
3423 : G_("cannot execute %qs: %s"),
3424 string, errmsg);
3427 if (i && string != commands[i].prog)
3428 free (CONST_CAST (char *, string));
3431 execution_count++;
3433 /* Wait for all the subprocesses to finish. */
3436 int *statuses;
3437 struct pex_time *times = NULL;
3438 int ret_code = 0;
3440 statuses = XALLOCAVEC (int, n_commands);
3441 if (!pex_get_status (pex, n_commands, statuses))
3442 fatal_error (input_location, "failed to get exit status: %m");
3444 if (report_times || report_times_to_file)
3446 times = XALLOCAVEC (struct pex_time, n_commands);
3447 if (!pex_get_times (pex, n_commands, times))
3448 fatal_error (input_location, "failed to get process times: %m");
3451 pex_free (pex);
3453 for (i = 0; i < n_commands; ++i)
3455 int status = statuses[i];
3457 if (WIFSIGNALED (status))
3458 switch (WTERMSIG (status))
3460 case SIGINT:
3461 case SIGTERM:
3462 /* SIGQUIT and SIGKILL are not available on MinGW. */
3463 #ifdef SIGQUIT
3464 case SIGQUIT:
3465 #endif
3466 #ifdef SIGKILL
3467 case SIGKILL:
3468 #endif
3469 /* The user (or environment) did something to the
3470 inferior. Making this an ICE confuses the user into
3471 thinking there's a compiler bug. Much more likely is
3472 the user or OOM killer nuked it. */
3473 fatal_error (input_location,
3474 "%s signal terminated program %s",
3475 strsignal (WTERMSIG (status)),
3476 commands[i].prog);
3477 break;
3479 #ifdef SIGPIPE
3480 case SIGPIPE:
3481 /* SIGPIPE is a special case. It happens in -pipe mode
3482 when the compiler dies before the preprocessor is
3483 done, or the assembler dies before the compiler is
3484 done. There's generally been an error already, and
3485 this is just fallout. So don't generate another
3486 error unless we would otherwise have succeeded. */
3487 if (signal_count || greatest_status >= MIN_FATAL_STATUS)
3489 signal_count++;
3490 ret_code = -1;
3491 break;
3493 #endif
3494 /* FALLTHROUGH */
3496 default:
3497 /* The inferior failed to catch the signal. */
3498 internal_error_no_backtrace ("%s signal terminated program %s",
3499 strsignal (WTERMSIG (status)),
3500 commands[i].prog);
3502 else if (WIFEXITED (status)
3503 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3505 /* For ICEs in cc1, cc1obj, cc1plus see if it is
3506 reproducible or not. */
3507 const char *p;
3508 if (flag_report_bug
3509 && WEXITSTATUS (status) == ICE_EXIT_CODE
3510 && i == 0
3511 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR))
3512 && startswith (p + 1, "cc1"))
3513 try_generate_repro (commands[0].argv);
3514 if (WEXITSTATUS (status) > greatest_status)
3515 greatest_status = WEXITSTATUS (status);
3516 ret_code = -1;
3519 if (report_times || report_times_to_file)
3521 struct pex_time *pt = &times[i];
3522 double ut, st;
3524 ut = ((double) pt->user_seconds
3525 + (double) pt->user_microseconds / 1.0e6);
3526 st = ((double) pt->system_seconds
3527 + (double) pt->system_microseconds / 1.0e6);
3529 if (ut + st != 0)
3531 if (report_times)
3532 fnotice (stderr, "# %s %.2f %.2f\n",
3533 commands[i].prog, ut, st);
3535 if (report_times_to_file)
3537 int c = 0;
3538 const char *const *j;
3540 fprintf (report_times_to_file, "%g %g", ut, st);
3542 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3544 const char *p;
3545 for (p = *j; *p; ++p)
3546 if (*p == '"' || *p == '\\' || *p == '$'
3547 || ISSPACE (*p))
3548 break;
3550 if (*p)
3552 fprintf (report_times_to_file, " \"");
3553 for (p = *j; *p; ++p)
3555 if (*p == '"' || *p == '\\' || *p == '$')
3556 fputc ('\\', report_times_to_file);
3557 fputc (*p, report_times_to_file);
3559 fputc ('"', report_times_to_file);
3561 else
3562 fprintf (report_times_to_file, " %s", *j);
3565 fputc ('\n', report_times_to_file);
3571 if (commands[0].argv[0] != commands[0].prog)
3572 free (CONST_CAST (char *, commands[0].argv[0]));
3574 return ret_code;
3578 static struct switchstr *switches;
3580 static int n_switches;
3582 static int n_switches_alloc;
3584 /* Set to zero if -fcompare-debug is disabled, positive if it's
3585 enabled and we're running the first compilation, negative if it's
3586 enabled and we're running the second compilation. For most of the
3587 time, it's in the range -1..1, but it can be temporarily set to 2
3588 or 3 to indicate that the -fcompare-debug flags didn't come from
3589 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3590 variable, until a synthesized -fcompare-debug flag is added to the
3591 command line. */
3592 int compare_debug;
3594 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3595 int compare_debug_second;
3597 /* Set to the flags that should be passed to the second compilation in
3598 a -fcompare-debug compilation. */
3599 const char *compare_debug_opt;
3601 static struct switchstr *switches_debug_check[2];
3603 static int n_switches_debug_check[2];
3605 static int n_switches_alloc_debug_check[2];
3607 static char *debug_check_temp_file[2];
3609 /* Language is one of three things:
3611 1) The name of a real programming language.
3612 2) NULL, indicating that no one has figured out
3613 what it is yet.
3614 3) '*', indicating that the file should be passed
3615 to the linker. */
3616 struct infile
3618 const char *name;
3619 const char *language;
3620 struct compiler *incompiler;
3621 bool compiled;
3622 bool preprocessed;
3625 /* Also a vector of input files specified. */
3627 static struct infile *infiles;
3629 int n_infiles;
3631 static int n_infiles_alloc;
3633 /* True if undefined environment variables encountered during spec processing
3634 are ok to ignore, typically when we're running for --help or --version. */
3636 static bool spec_undefvar_allowed;
3638 /* True if multiple input files are being compiled to a single
3639 assembly file. */
3641 static bool combine_inputs;
3643 /* This counts the number of libraries added by lang_specific_driver, so that
3644 we can tell if there were any user supplied any files or libraries. */
3646 static int added_libraries;
3648 /* And a vector of corresponding output files is made up later. */
3650 const char **outfiles;
3652 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3654 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3655 is true if we should look for an executable suffix. DO_OBJ
3656 is true if we should look for an object suffix. */
3658 static const char *
3659 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3660 int do_obj ATTRIBUTE_UNUSED)
3662 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3663 int i;
3664 #endif
3665 int len;
3667 if (name == NULL)
3668 return NULL;
3670 len = strlen (name);
3672 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3673 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3674 if (do_obj && len > 2
3675 && name[len - 2] == '.'
3676 && name[len - 1] == 'o')
3678 obstack_grow (&obstack, name, len - 2);
3679 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3680 name = XOBFINISH (&obstack, const char *);
3682 #endif
3684 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3685 /* If there is no filetype, make it the executable suffix (which includes
3686 the "."). But don't get confused if we have just "-o". */
3687 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || not_actual_file_p (name))
3688 return name;
3690 for (i = len - 1; i >= 0; i--)
3691 if (IS_DIR_SEPARATOR (name[i]))
3692 break;
3694 for (i++; i < len; i++)
3695 if (name[i] == '.')
3696 return name;
3698 obstack_grow (&obstack, name, len);
3699 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3700 strlen (TARGET_EXECUTABLE_SUFFIX));
3701 name = XOBFINISH (&obstack, const char *);
3702 #endif
3704 return name;
3706 #endif
3708 /* Display the command line switches accepted by gcc. */
3709 static void
3710 display_help (void)
3712 printf (_("Usage: %s [options] file...\n"), progname);
3713 fputs (_("Options:\n"), stdout);
3715 fputs (_(" -pass-exit-codes Exit with highest error code from a phase.\n"), stdout);
3716 fputs (_(" --help Display this information.\n"), stdout);
3717 fputs (_(" --target-help Display target specific command line options "
3718 "(including assembler and linker options).\n"), stdout);
3719 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"), stdout);
3720 fputs (_(" Display specific types of command line options.\n"), stdout);
3721 if (! verbose_flag)
3722 fputs (_(" (Use '-v --help' to display command line options of sub-processes).\n"), stdout);
3723 fputs (_(" --version Display compiler version information.\n"), stdout);
3724 fputs (_(" -dumpspecs Display all of the built in spec strings.\n"), stdout);
3725 fputs (_(" -dumpversion Display the version of the compiler.\n"), stdout);
3726 fputs (_(" -dumpmachine Display the compiler's target processor.\n"), stdout);
3727 fputs (_(" -foffload=<targets> Specify offloading targets.\n"), stdout);
3728 fputs (_(" -print-search-dirs Display the directories in the compiler's search path.\n"), stdout);
3729 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library.\n"), stdout);
3730 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>.\n"), stdout);
3731 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n"), stdout);
3732 fputs (_("\
3733 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3734 a component in the library path.\n"), stdout);
3735 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc.\n"), stdout);
3736 fputs (_("\
3737 -print-multi-lib Display the mapping between command line options and\n\
3738 multiple library search directories.\n"), stdout);
3739 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries.\n"), stdout);
3740 fputs (_(" -print-sysroot Display the target libraries directory.\n"), stdout);
3741 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"), stdout);
3742 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler.\n"), stdout);
3743 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n"), stdout);
3744 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker.\n"), stdout);
3745 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler.\n"), stdout);
3746 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n"), stdout);
3747 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker.\n"), stdout);
3748 fputs (_(" -save-temps Do not delete intermediate files.\n"), stdout);
3749 fputs (_(" -save-temps=<arg> Do not delete intermediate files.\n"), stdout);
3750 fputs (_("\
3751 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3752 prefixes to other gcc components.\n"), stdout);
3753 fputs (_(" -pipe Use pipes rather than intermediate files.\n"), stdout);
3754 fputs (_(" -time Time the execution of each subprocess.\n"), stdout);
3755 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>.\n"), stdout);
3756 fputs (_(" -std=<standard> Assume that the input sources are for <standard>.\n"), stdout);
3757 fputs (_("\
3758 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3759 and libraries.\n"), stdout);
3760 fputs (_(" -B <directory> Add <directory> to the compiler's search paths.\n"), stdout);
3761 fputs (_(" -v Display the programs invoked by the compiler.\n"), stdout);
3762 fputs (_(" -### Like -v but options quoted and commands not executed.\n"), stdout);
3763 fputs (_(" -E Preprocess only; do not compile, assemble or link.\n"), stdout);
3764 fputs (_(" -S Compile only; do not assemble or link.\n"), stdout);
3765 fputs (_(" -c Compile and assemble, but do not link.\n"), stdout);
3766 fputs (_(" -o <file> Place the output into <file>.\n"), stdout);
3767 fputs (_(" -pie Create a dynamically linked position independent\n\
3768 executable.\n"), stdout);
3769 fputs (_(" -shared Create a shared library.\n"), stdout);
3770 fputs (_("\
3771 -x <language> Specify the language of the following input files.\n\
3772 Permissible languages include: c c++ assembler none\n\
3773 'none' means revert to the default behavior of\n\
3774 guessing the language based on the file's extension.\n\
3775 "), stdout);
3777 printf (_("\
3778 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3779 passed on to the various sub-processes invoked by %s. In order to pass\n\
3780 other options on to these processes the -W<letter> options must be used.\n\
3781 "), progname);
3783 /* The rest of the options are displayed by invocations of the various
3784 sub-processes. */
3787 static void
3788 add_preprocessor_option (const char *option, int len)
3790 preprocessor_options.safe_push (save_string (option, len));
3793 static void
3794 add_assembler_option (const char *option, int len)
3796 assembler_options.safe_push (save_string (option, len));
3799 static void
3800 add_linker_option (const char *option, int len)
3802 linker_options.safe_push (save_string (option, len));
3805 /* Allocate space for an input file in infiles. */
3807 static void
3808 alloc_infile (void)
3810 if (n_infiles_alloc == 0)
3812 n_infiles_alloc = 16;
3813 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3815 else if (n_infiles_alloc == n_infiles)
3817 n_infiles_alloc *= 2;
3818 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3822 /* Store an input file with the given NAME and LANGUAGE in
3823 infiles. */
3825 static void
3826 add_infile (const char *name, const char *language)
3828 alloc_infile ();
3829 infiles[n_infiles].name = name;
3830 infiles[n_infiles++].language = language;
3833 /* Allocate space for a switch in switches. */
3835 static void
3836 alloc_switch (void)
3838 if (n_switches_alloc == 0)
3840 n_switches_alloc = 16;
3841 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3843 else if (n_switches_alloc == n_switches)
3845 n_switches_alloc *= 2;
3846 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3850 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3851 as validated if VALIDATED and KNOWN if it is an internal switch. */
3853 static void
3854 save_switch (const char *opt, size_t n_args, const char *const *args,
3855 bool validated, bool known)
3857 alloc_switch ();
3858 switches[n_switches].part1 = opt + 1;
3859 if (n_args == 0)
3860 switches[n_switches].args = 0;
3861 else
3863 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3864 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3865 switches[n_switches].args[n_args] = NULL;
3868 switches[n_switches].live_cond = 0;
3869 switches[n_switches].validated = validated;
3870 switches[n_switches].known = known;
3871 switches[n_switches].ordering = 0;
3872 n_switches++;
3875 /* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3876 not set already. */
3878 static void
3879 set_source_date_epoch_envvar ()
3881 /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3882 of 64 bit integers. */
3883 char source_date_epoch[21];
3884 time_t tt;
3886 errno = 0;
3887 tt = time (NULL);
3888 if (tt < (time_t) 0 || errno != 0)
3889 tt = (time_t) 0;
3891 snprintf (source_date_epoch, 21, "%llu", (unsigned long long) tt);
3892 /* Using setenv instead of xputenv because we want the variable to remain
3893 after finalizing so that it's still set in the second run when using
3894 -fcompare-debug. */
3895 setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0);
3898 /* Handle an option DECODED that is unknown to the option-processing
3899 machinery. */
3901 static bool
3902 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3904 const char *opt = decoded->arg;
3905 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3906 && !(decoded->errors & CL_ERR_NEGATIVE))
3908 /* Leave unknown -Wno-* options for the compiler proper, to be
3909 diagnosed only if there are warnings. */
3910 save_switch (decoded->canonical_option[0],
3911 decoded->canonical_option_num_elements - 1,
3912 &decoded->canonical_option[1], false, true);
3913 return false;
3915 if (decoded->opt_index == OPT_SPECIAL_unknown)
3917 /* Give it a chance to define it a spec file. */
3918 save_switch (decoded->canonical_option[0],
3919 decoded->canonical_option_num_elements - 1,
3920 &decoded->canonical_option[1], false, false);
3921 return false;
3923 else
3924 return true;
3927 /* Handle an option DECODED that is not marked as CL_DRIVER.
3928 LANG_MASK will always be CL_DRIVER. */
3930 static void
3931 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3932 unsigned int lang_mask ATTRIBUTE_UNUSED)
3934 /* At this point, non-driver options are accepted (and expected to
3935 be passed down by specs) unless marked to be rejected by the
3936 driver. Options to be rejected by the driver but accepted by the
3937 compilers proper are treated just like completely unknown
3938 options. */
3939 const struct cl_option *option = &cl_options[decoded->opt_index];
3941 if (option->cl_reject_driver)
3942 error ("unrecognized command-line option %qs",
3943 decoded->orig_option_with_args_text);
3944 else
3945 save_switch (decoded->canonical_option[0],
3946 decoded->canonical_option_num_elements - 1,
3947 &decoded->canonical_option[1], false, true);
3950 static const char *spec_lang = 0;
3951 static int last_language_n_infiles;
3954 /* Check that GCC is configured to support the offload target. */
3956 static bool
3957 check_offload_target_name (const char *target, ptrdiff_t len)
3959 const char *n, *c = OFFLOAD_TARGETS;
3960 while (c)
3962 n = strchr (c, ',');
3963 if (n == NULL)
3964 n = strchr (c, '\0');
3965 if (len == n - c && strncmp (target, c, n - c) == 0)
3966 break;
3967 c = *n ? n + 1 : NULL;
3969 if (!c)
3971 auto_vec<const char*> candidates;
3972 size_t olen = strlen (OFFLOAD_TARGETS) + 1;
3973 char *cand = XALLOCAVEC (char, olen);
3974 memcpy (cand, OFFLOAD_TARGETS, olen);
3975 for (c = strtok (cand, ","); c; c = strtok (NULL, ","))
3976 candidates.safe_push (c);
3977 candidates.safe_push ("default");
3978 candidates.safe_push ("disable");
3980 char *target2 = XALLOCAVEC (char, len + 1);
3981 memcpy (target2, target, len);
3982 target2[len] = '\0';
3984 error ("GCC is not configured to support %qs as %<-foffload=%> argument",
3985 target2);
3987 char *s;
3988 const char *hint = candidates_list_and_hint (target2, s, candidates);
3989 if (hint)
3990 inform (UNKNOWN_LOCATION,
3991 "valid %<-foffload=%> arguments are: %s; "
3992 "did you mean %qs?", s, hint);
3993 else
3994 inform (UNKNOWN_LOCATION, "valid %<-foffload=%> arguments are: %s", s);
3995 XDELETEVEC (s);
3996 return false;
3998 return true;
4001 /* Sanity check for -foffload-options. */
4003 static void
4004 check_foffload_target_names (const char *arg)
4006 const char *cur, *next, *end;
4007 /* If option argument starts with '-' then no target is specified and we
4008 do not need to parse it. */
4009 if (arg[0] == '-')
4010 return;
4011 end = strchr (arg, '=');
4012 if (end == NULL)
4014 error ("%<=%>options missing after %<-foffload-options=%>target");
4015 return;
4018 cur = arg;
4019 while (cur < end)
4021 next = strchr (cur, ',');
4022 if (next == NULL)
4023 next = end;
4024 next = (next > end) ? end : next;
4026 /* Retain non-supported targets after printing an error as those will not
4027 be processed; each enabled target only processes its triplet. */
4028 check_offload_target_name (cur, next - cur);
4029 cur = next + 1;
4033 /* Parse -foffload option argument. */
4035 static void
4036 handle_foffload_option (const char *arg)
4038 const char *c, *cur, *n, *next, *end;
4039 char *target;
4041 /* If option argument starts with '-' then no target is specified and we
4042 do not need to parse it. */
4043 if (arg[0] == '-')
4044 return;
4046 end = strchr (arg, '=');
4047 if (end == NULL)
4048 end = strchr (arg, '\0');
4049 cur = arg;
4051 while (cur < end)
4053 next = strchr (cur, ',');
4054 if (next == NULL)
4055 next = end;
4056 next = (next > end) ? end : next;
4058 target = XNEWVEC (char, next - cur + 1);
4059 memcpy (target, cur, next - cur);
4060 target[next - cur] = '\0';
4062 /* Reset offloading list and continue. */
4063 if (strcmp (target, "default") == 0)
4065 free (offload_targets);
4066 offload_targets = NULL;
4067 goto next_item;
4070 /* If 'disable' is passed to the option, clean the list of
4071 offload targets and return, even if more targets follow.
4072 Likewise if GCC is not configured to support that offload target. */
4073 if (strcmp (target, "disable") == 0
4074 || !check_offload_target_name (target, next - cur))
4076 free (offload_targets);
4077 offload_targets = xstrdup ("");
4078 return;
4081 if (!offload_targets)
4083 offload_targets = target;
4084 target = NULL;
4086 else
4088 /* Check that the target hasn't already presented in the list. */
4089 c = offload_targets;
4092 n = strchr (c, ':');
4093 if (n == NULL)
4094 n = strchr (c, '\0');
4096 if (next - cur == n - c && strncmp (c, target, n - c) == 0)
4097 break;
4099 c = n + 1;
4101 while (*n);
4103 /* If duplicate is not found, append the target to the list. */
4104 if (c > n)
4106 size_t offload_targets_len = strlen (offload_targets);
4107 offload_targets
4108 = XRESIZEVEC (char, offload_targets,
4109 offload_targets_len + 1 + next - cur + 1);
4110 offload_targets[offload_targets_len++] = ':';
4111 memcpy (offload_targets + offload_targets_len, target, next - cur + 1);
4114 next_item:
4115 cur = next + 1;
4116 XDELETEVEC (target);
4120 /* Handle a driver option; arguments and return value as for
4121 handle_option. */
4123 static bool
4124 driver_handle_option (struct gcc_options *opts,
4125 struct gcc_options *opts_set,
4126 const struct cl_decoded_option *decoded,
4127 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
4128 location_t loc,
4129 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
4130 diagnostic_context *dc,
4131 void (*) (void))
4133 size_t opt_index = decoded->opt_index;
4134 const char *arg = decoded->arg;
4135 const char *compare_debug_replacement_opt;
4136 int value = decoded->value;
4137 bool validated = false;
4138 bool do_save = true;
4140 gcc_assert (opts == &global_options);
4141 gcc_assert (opts_set == &global_options_set);
4142 gcc_assert (kind == DK_UNSPECIFIED);
4143 gcc_assert (loc == UNKNOWN_LOCATION);
4144 gcc_assert (dc == global_dc);
4146 switch (opt_index)
4148 case OPT_dumpspecs:
4150 struct spec_list *sl;
4151 init_spec ();
4152 for (sl = specs; sl; sl = sl->next)
4153 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
4154 if (link_command_spec)
4155 printf ("*link_command:\n%s\n\n", link_command_spec);
4156 exit (0);
4159 case OPT_dumpversion:
4160 printf ("%s\n", spec_version);
4161 exit (0);
4163 case OPT_dumpmachine:
4164 printf ("%s\n", spec_machine);
4165 exit (0);
4167 case OPT_dumpfullversion:
4168 printf ("%s\n", BASEVER);
4169 exit (0);
4171 case OPT__version:
4172 print_version = 1;
4174 /* CPP driver cannot obtain switch from cc1_options. */
4175 if (is_cpp_driver)
4176 add_preprocessor_option ("--version", strlen ("--version"));
4177 add_assembler_option ("--version", strlen ("--version"));
4178 add_linker_option ("--version", strlen ("--version"));
4179 break;
4181 case OPT__completion_:
4182 validated = true;
4183 completion = decoded->arg;
4184 break;
4186 case OPT__help:
4187 print_help_list = 1;
4189 /* CPP driver cannot obtain switch from cc1_options. */
4190 if (is_cpp_driver)
4191 add_preprocessor_option ("--help", 6);
4192 add_assembler_option ("--help", 6);
4193 add_linker_option ("--help", 6);
4194 break;
4196 case OPT__help_:
4197 print_subprocess_help = 2;
4198 break;
4200 case OPT__target_help:
4201 print_subprocess_help = 1;
4203 /* CPP driver cannot obtain switch from cc1_options. */
4204 if (is_cpp_driver)
4205 add_preprocessor_option ("--target-help", 13);
4206 add_assembler_option ("--target-help", 13);
4207 add_linker_option ("--target-help", 13);
4208 break;
4210 case OPT__no_sysroot_suffix:
4211 case OPT_pass_exit_codes:
4212 case OPT_print_search_dirs:
4213 case OPT_print_file_name_:
4214 case OPT_print_prog_name_:
4215 case OPT_print_multi_lib:
4216 case OPT_print_multi_directory:
4217 case OPT_print_sysroot:
4218 case OPT_print_multi_os_directory:
4219 case OPT_print_multiarch:
4220 case OPT_print_sysroot_headers_suffix:
4221 case OPT_time:
4222 case OPT_wrapper:
4223 /* These options set the variables specified in common.opt
4224 automatically, and do not need to be saved for spec
4225 processing. */
4226 do_save = false;
4227 break;
4229 case OPT_print_libgcc_file_name:
4230 print_file_name = "libgcc.a";
4231 do_save = false;
4232 break;
4234 case OPT_fuse_ld_bfd:
4235 use_ld = ".bfd";
4236 break;
4238 case OPT_fuse_ld_gold:
4239 use_ld = ".gold";
4240 break;
4242 case OPT_fuse_ld_mold:
4243 use_ld = ".mold";
4244 break;
4246 case OPT_fcompare_debug_second:
4247 compare_debug_second = 1;
4248 break;
4250 case OPT_fcompare_debug:
4251 switch (value)
4253 case 0:
4254 compare_debug_replacement_opt = "-fcompare-debug=";
4255 arg = "";
4256 goto compare_debug_with_arg;
4258 case 1:
4259 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
4260 arg = "-gtoggle";
4261 goto compare_debug_with_arg;
4263 default:
4264 gcc_unreachable ();
4266 break;
4268 case OPT_fcompare_debug_:
4269 compare_debug_replacement_opt = decoded->canonical_option[0];
4270 compare_debug_with_arg:
4271 gcc_assert (decoded->canonical_option_num_elements == 1);
4272 gcc_assert (arg != NULL);
4273 if (*arg)
4274 compare_debug = 1;
4275 else
4276 compare_debug = -1;
4277 if (compare_debug < 0)
4278 compare_debug_opt = NULL;
4279 else
4280 compare_debug_opt = arg;
4281 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
4282 set_source_date_epoch_envvar ();
4283 return true;
4285 case OPT_fdiagnostics_color_:
4286 diagnostic_color_init (dc, value);
4287 break;
4289 case OPT_fdiagnostics_urls_:
4290 diagnostic_urls_init (dc, value);
4291 break;
4293 case OPT_fdiagnostics_format_:
4295 const char *basename = (opts->x_dump_base_name ? opts->x_dump_base_name
4296 : opts->x_main_input_basename);
4297 diagnostic_output_format_init (dc, basename,
4298 (enum diagnostics_output_format)value);
4299 break;
4302 case OPT_Wa_:
4304 int prev, j;
4305 /* Pass the rest of this option to the assembler. */
4307 /* Split the argument at commas. */
4308 prev = 0;
4309 for (j = 0; arg[j]; j++)
4310 if (arg[j] == ',')
4312 add_assembler_option (arg + prev, j - prev);
4313 prev = j + 1;
4316 /* Record the part after the last comma. */
4317 add_assembler_option (arg + prev, j - prev);
4319 do_save = false;
4320 break;
4322 case OPT_Wp_:
4324 int prev, j;
4325 /* Pass the rest of this option to the preprocessor. */
4327 /* Split the argument at commas. */
4328 prev = 0;
4329 for (j = 0; arg[j]; j++)
4330 if (arg[j] == ',')
4332 add_preprocessor_option (arg + prev, j - prev);
4333 prev = j + 1;
4336 /* Record the part after the last comma. */
4337 add_preprocessor_option (arg + prev, j - prev);
4339 do_save = false;
4340 break;
4342 case OPT_Wl_:
4344 int prev, j;
4345 /* Split the argument at commas. */
4346 prev = 0;
4347 for (j = 0; arg[j]; j++)
4348 if (arg[j] == ',')
4350 add_infile (save_string (arg + prev, j - prev), "*");
4351 prev = j + 1;
4353 /* Record the part after the last comma. */
4354 add_infile (arg + prev, "*");
4356 do_save = false;
4357 break;
4359 case OPT_Xlinker:
4360 add_infile (arg, "*");
4361 do_save = false;
4362 break;
4364 case OPT_Xpreprocessor:
4365 add_preprocessor_option (arg, strlen (arg));
4366 do_save = false;
4367 break;
4369 case OPT_Xassembler:
4370 add_assembler_option (arg, strlen (arg));
4371 do_save = false;
4372 break;
4374 case OPT_l:
4375 /* POSIX allows separation of -l and the lib arg; canonicalize
4376 by concatenating -l with its arg */
4377 add_infile (concat ("-l", arg, NULL), "*");
4378 do_save = false;
4379 break;
4381 case OPT_L:
4382 /* Similarly, canonicalize -L for linkers that may not accept
4383 separate arguments. */
4384 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
4385 return true;
4387 case OPT_F:
4388 /* Likewise -F. */
4389 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
4390 return true;
4392 case OPT_save_temps:
4393 if (!save_temps_flag)
4394 save_temps_flag = SAVE_TEMPS_DUMP;
4395 validated = true;
4396 break;
4398 case OPT_save_temps_:
4399 if (strcmp (arg, "cwd") == 0)
4400 save_temps_flag = SAVE_TEMPS_CWD;
4401 else if (strcmp (arg, "obj") == 0
4402 || strcmp (arg, "object") == 0)
4403 save_temps_flag = SAVE_TEMPS_OBJ;
4404 else
4405 fatal_error (input_location, "%qs is an unknown %<-save-temps%> option",
4406 decoded->orig_option_with_args_text);
4407 save_temps_overrides_dumpdir = true;
4408 break;
4410 case OPT_dumpdir:
4411 free (dumpdir);
4412 dumpdir = xstrdup (arg);
4413 save_temps_overrides_dumpdir = false;
4414 break;
4416 case OPT_dumpbase:
4417 free (dumpbase);
4418 dumpbase = xstrdup (arg);
4419 break;
4421 case OPT_dumpbase_ext:
4422 free (dumpbase_ext);
4423 dumpbase_ext = xstrdup (arg);
4424 break;
4426 case OPT_no_canonical_prefixes:
4427 /* Already handled as a special case, so ignored here. */
4428 do_save = false;
4429 break;
4431 case OPT_pipe:
4432 validated = true;
4433 /* These options set the variables specified in common.opt
4434 automatically, but do need to be saved for spec
4435 processing. */
4436 break;
4438 case OPT_specs_:
4440 struct user_specs *user = XNEW (struct user_specs);
4442 user->next = (struct user_specs *) 0;
4443 user->filename = arg;
4444 if (user_specs_tail)
4445 user_specs_tail->next = user;
4446 else
4447 user_specs_head = user;
4448 user_specs_tail = user;
4450 validated = true;
4451 break;
4453 case OPT__sysroot_:
4454 target_system_root = arg;
4455 target_system_root_changed = 1;
4456 /* Saving this option is useful to let self-specs decide to
4457 provide a default one. */
4458 do_save = true;
4459 validated = true;
4460 break;
4462 case OPT_time_:
4463 if (report_times_to_file)
4464 fclose (report_times_to_file);
4465 report_times_to_file = fopen (arg, "a");
4466 do_save = false;
4467 break;
4469 case OPT____:
4470 /* "-###"
4471 This is similar to -v except that there is no execution
4472 of the commands and the echoed arguments are quoted. It
4473 is intended for use in shell scripts to capture the
4474 driver-generated command line. */
4475 verbose_only_flag++;
4476 verbose_flag = 1;
4477 do_save = false;
4478 break;
4480 case OPT_B:
4482 size_t len = strlen (arg);
4484 /* Catch the case where the user has forgotten to append a
4485 directory separator to the path. Note, they may be using
4486 -B to add an executable name prefix, eg "i386-elf-", in
4487 order to distinguish between multiple installations of
4488 GCC in the same directory. Hence we must check to see
4489 if appending a directory separator actually makes a
4490 valid directory name. */
4491 if (!IS_DIR_SEPARATOR (arg[len - 1])
4492 && is_directory (arg, false))
4494 char *tmp = XNEWVEC (char, len + 2);
4495 strcpy (tmp, arg);
4496 tmp[len] = DIR_SEPARATOR;
4497 tmp[++len] = 0;
4498 arg = tmp;
4501 add_prefix (&exec_prefixes, arg, NULL,
4502 PREFIX_PRIORITY_B_OPT, 0, 0);
4503 add_prefix (&startfile_prefixes, arg, NULL,
4504 PREFIX_PRIORITY_B_OPT, 0, 0);
4505 add_prefix (&include_prefixes, arg, NULL,
4506 PREFIX_PRIORITY_B_OPT, 0, 0);
4508 validated = true;
4509 break;
4511 case OPT_E:
4512 have_E = true;
4513 break;
4515 case OPT_x:
4516 spec_lang = arg;
4517 if (!strcmp (spec_lang, "none"))
4518 /* Suppress the warning if -xnone comes after the last input
4519 file, because alternate command interfaces like g++ might
4520 find it useful to place -xnone after each input file. */
4521 spec_lang = 0;
4522 else
4523 last_language_n_infiles = n_infiles;
4524 do_save = false;
4525 break;
4527 case OPT_o:
4528 have_o = 1;
4529 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4530 arg = convert_filename (arg, ! have_c, 0);
4531 #endif
4532 output_file = arg;
4533 /* On some systems, ld cannot handle "-o" without a space. So
4534 split the option from its argument. */
4535 save_switch ("-o", 1, &arg, validated, true);
4536 return true;
4538 #ifdef ENABLE_DEFAULT_PIE
4539 case OPT_pie:
4540 /* -pie is turned on by default. */
4541 #endif
4543 case OPT_static_libgcc:
4544 case OPT_shared_libgcc:
4545 case OPT_static_libgfortran:
4546 case OPT_static_libquadmath:
4547 case OPT_static_libphobos:
4548 case OPT_static_libgm2:
4549 case OPT_static_libstdc__:
4550 /* These are always valid; gcc.cc itself understands the first two
4551 gfortranspec.cc understands -static-libgfortran,
4552 libgfortran.spec handles -static-libquadmath,
4553 d-spec.cc understands -static-libphobos,
4554 gm2spec.cc understands -static-libgm2,
4555 and g++spec.cc understands -static-libstdc++. */
4556 validated = true;
4557 break;
4559 case OPT_fwpa:
4560 flag_wpa = "";
4561 break;
4563 case OPT_foffload_options_:
4564 check_foffload_target_names (arg);
4565 break;
4567 case OPT_foffload_:
4568 handle_foffload_option (arg);
4569 if (arg[0] == '-' || NULL != strchr (arg, '='))
4570 save_switch (concat ("-foffload-options=", arg, NULL),
4571 0, NULL, validated, true);
4572 do_save = false;
4573 break;
4575 default:
4576 /* Various driver options need no special processing at this
4577 point, having been handled in a prescan above or being
4578 handled by specs. */
4579 break;
4582 if (do_save)
4583 save_switch (decoded->canonical_option[0],
4584 decoded->canonical_option_num_elements - 1,
4585 &decoded->canonical_option[1], validated, true);
4586 return true;
4589 /* Return true if F2 is F1 followed by a single suffix, i.e., by a
4590 period and additional characters other than a period. */
4592 static inline bool
4593 adds_single_suffix_p (const char *f2, const char *f1)
4595 size_t len = strlen (f1);
4597 return (strncmp (f1, f2, len) == 0
4598 && f2[len] == '.'
4599 && strchr (f2 + len + 1, '.') == NULL);
4602 /* Put the driver's standard set of option handlers in *HANDLERS. */
4604 static void
4605 set_option_handlers (struct cl_option_handlers *handlers)
4607 handlers->unknown_option_callback = driver_unknown_option_callback;
4608 handlers->wrong_lang_callback = driver_wrong_lang_callback;
4609 handlers->num_handlers = 3;
4610 handlers->handlers[0].handler = driver_handle_option;
4611 handlers->handlers[0].mask = CL_DRIVER;
4612 handlers->handlers[1].handler = common_handle_option;
4613 handlers->handlers[1].mask = CL_COMMON;
4614 handlers->handlers[2].handler = target_handle_option;
4615 handlers->handlers[2].mask = CL_TARGET;
4619 /* Return the index into infiles for the single non-library
4620 non-lto-wpa input file, -1 if there isn't any, or -2 if there is
4621 more than one. */
4622 static inline int
4623 single_input_file_index ()
4625 int ret = -1;
4627 for (int i = 0; i < n_infiles; i++)
4629 if (infiles[i].language
4630 && (infiles[i].language[0] == '*'
4631 || (flag_wpa
4632 && strcmp (infiles[i].language, "lto") == 0)))
4633 continue;
4635 if (ret != -1)
4636 return -2;
4638 ret = i;
4641 return ret;
4644 /* Create the vector `switches' and its contents.
4645 Store its length in `n_switches'. */
4647 static void
4648 process_command (unsigned int decoded_options_count,
4649 struct cl_decoded_option *decoded_options)
4651 const char *temp;
4652 char *temp1;
4653 char *tooldir_prefix, *tooldir_prefix2;
4654 char *(*get_relative_prefix) (const char *, const char *,
4655 const char *) = NULL;
4656 struct cl_option_handlers handlers;
4657 unsigned int j;
4659 gcc_exec_prefix = env.get ("GCC_EXEC_PREFIX");
4661 n_switches = 0;
4662 n_infiles = 0;
4663 added_libraries = 0;
4665 /* Figure compiler version from version string. */
4667 compiler_version = temp1 = xstrdup (version_string);
4669 for (; *temp1; ++temp1)
4671 if (*temp1 == ' ')
4673 *temp1 = '\0';
4674 break;
4678 /* Handle any -no-canonical-prefixes flag early, to assign the function
4679 that builds relative prefixes. This function creates default search
4680 paths that are needed later in normal option handling. */
4682 for (j = 1; j < decoded_options_count; j++)
4684 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
4686 get_relative_prefix = make_relative_prefix_ignore_links;
4687 break;
4690 if (! get_relative_prefix)
4691 get_relative_prefix = make_relative_prefix;
4693 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
4694 see if we can create it from the pathname specified in
4695 decoded_options[0].arg. */
4697 gcc_libexec_prefix = standard_libexec_prefix;
4698 #ifndef VMS
4699 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
4700 if (!gcc_exec_prefix)
4702 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
4703 standard_bindir_prefix,
4704 standard_exec_prefix);
4705 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
4706 standard_bindir_prefix,
4707 standard_libexec_prefix);
4708 if (gcc_exec_prefix)
4709 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
4711 else
4713 /* make_relative_prefix requires a program name, but
4714 GCC_EXEC_PREFIX is typically a directory name with a trailing
4715 / (which is ignored by make_relative_prefix), so append a
4716 program name. */
4717 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
4718 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
4719 standard_exec_prefix,
4720 standard_libexec_prefix);
4722 /* The path is unrelocated, so fallback to the original setting. */
4723 if (!gcc_libexec_prefix)
4724 gcc_libexec_prefix = standard_libexec_prefix;
4726 free (tmp_prefix);
4728 #else
4729 #endif
4730 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4731 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4732 or an automatically created GCC_EXEC_PREFIX from
4733 decoded_options[0].arg. */
4735 /* Do language-specific adjustment/addition of flags. */
4736 lang_specific_driver (&decoded_options, &decoded_options_count,
4737 &added_libraries);
4739 if (gcc_exec_prefix)
4741 int len = strlen (gcc_exec_prefix);
4743 if (len > (int) sizeof ("/lib/gcc/") - 1
4744 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
4746 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
4747 if (IS_DIR_SEPARATOR (*temp)
4748 && filename_ncmp (temp + 1, "lib", 3) == 0
4749 && IS_DIR_SEPARATOR (temp[4])
4750 && filename_ncmp (temp + 5, "gcc", 3) == 0)
4751 len -= sizeof ("/lib/gcc/") - 1;
4754 set_std_prefix (gcc_exec_prefix, len);
4755 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
4756 PREFIX_PRIORITY_LAST, 0, 0);
4757 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
4758 PREFIX_PRIORITY_LAST, 0, 0);
4761 /* COMPILER_PATH and LIBRARY_PATH have values
4762 that are lists of directory names with colons. */
4764 temp = env.get ("COMPILER_PATH");
4765 if (temp)
4767 const char *startp, *endp;
4768 char *nstore = (char *) alloca (strlen (temp) + 3);
4770 startp = endp = temp;
4771 while (1)
4773 if (*endp == PATH_SEPARATOR || *endp == 0)
4775 strncpy (nstore, startp, endp - startp);
4776 if (endp == startp)
4777 strcpy (nstore, concat (".", dir_separator_str, NULL));
4778 else if (!IS_DIR_SEPARATOR (endp[-1]))
4780 nstore[endp - startp] = DIR_SEPARATOR;
4781 nstore[endp - startp + 1] = 0;
4783 else
4784 nstore[endp - startp] = 0;
4785 add_prefix (&exec_prefixes, nstore, 0,
4786 PREFIX_PRIORITY_LAST, 0, 0);
4787 add_prefix (&include_prefixes, nstore, 0,
4788 PREFIX_PRIORITY_LAST, 0, 0);
4789 if (*endp == 0)
4790 break;
4791 endp = startp = endp + 1;
4793 else
4794 endp++;
4798 temp = env.get (LIBRARY_PATH_ENV);
4799 if (temp && *cross_compile == '0')
4801 const char *startp, *endp;
4802 char *nstore = (char *) alloca (strlen (temp) + 3);
4804 startp = endp = temp;
4805 while (1)
4807 if (*endp == PATH_SEPARATOR || *endp == 0)
4809 strncpy (nstore, startp, endp - startp);
4810 if (endp == startp)
4811 strcpy (nstore, concat (".", dir_separator_str, NULL));
4812 else if (!IS_DIR_SEPARATOR (endp[-1]))
4814 nstore[endp - startp] = DIR_SEPARATOR;
4815 nstore[endp - startp + 1] = 0;
4817 else
4818 nstore[endp - startp] = 0;
4819 add_prefix (&startfile_prefixes, nstore, NULL,
4820 PREFIX_PRIORITY_LAST, 0, 1);
4821 if (*endp == 0)
4822 break;
4823 endp = startp = endp + 1;
4825 else
4826 endp++;
4830 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4831 temp = env.get ("LPATH");
4832 if (temp && *cross_compile == '0')
4834 const char *startp, *endp;
4835 char *nstore = (char *) alloca (strlen (temp) + 3);
4837 startp = endp = temp;
4838 while (1)
4840 if (*endp == PATH_SEPARATOR || *endp == 0)
4842 strncpy (nstore, startp, endp - startp);
4843 if (endp == startp)
4844 strcpy (nstore, concat (".", dir_separator_str, NULL));
4845 else if (!IS_DIR_SEPARATOR (endp[-1]))
4847 nstore[endp - startp] = DIR_SEPARATOR;
4848 nstore[endp - startp + 1] = 0;
4850 else
4851 nstore[endp - startp] = 0;
4852 add_prefix (&startfile_prefixes, nstore, NULL,
4853 PREFIX_PRIORITY_LAST, 0, 1);
4854 if (*endp == 0)
4855 break;
4856 endp = startp = endp + 1;
4858 else
4859 endp++;
4863 /* Process the options and store input files and switches in their
4864 vectors. */
4866 last_language_n_infiles = -1;
4868 set_option_handlers (&handlers);
4870 for (j = 1; j < decoded_options_count; j++)
4872 switch (decoded_options[j].opt_index)
4874 case OPT_S:
4875 case OPT_c:
4876 case OPT_E:
4877 have_c = 1;
4878 break;
4880 if (have_c)
4881 break;
4884 for (j = 1; j < decoded_options_count; j++)
4886 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4888 const char *arg = decoded_options[j].arg;
4890 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4891 arg = convert_filename (arg, 0, access (arg, F_OK));
4892 #endif
4893 add_infile (arg, spec_lang);
4895 continue;
4898 read_cmdline_option (&global_options, &global_options_set,
4899 decoded_options + j, UNKNOWN_LOCATION,
4900 CL_DRIVER, &handlers, global_dc);
4903 /* If the user didn't specify any, default to all configured offload
4904 targets. */
4905 if (ENABLE_OFFLOADING && offload_targets == NULL)
4907 handle_foffload_option (OFFLOAD_TARGETS);
4908 #if OFFLOAD_DEFAULTED
4909 offload_targets_default = true;
4910 #endif
4913 /* Handle -gtoggle as it would later in toplev.cc:process_options to
4914 make the debug-level-gt spec function work as expected. */
4915 if (flag_gtoggle)
4917 if (debug_info_level == DINFO_LEVEL_NONE)
4918 debug_info_level = DINFO_LEVEL_NORMAL;
4919 else
4920 debug_info_level = DINFO_LEVEL_NONE;
4923 if (output_file
4924 && strcmp (output_file, "-") != 0
4925 && strcmp (output_file, HOST_BIT_BUCKET) != 0)
4927 int i;
4928 for (i = 0; i < n_infiles; i++)
4929 if ((!infiles[i].language || infiles[i].language[0] != '*')
4930 && canonical_filename_eq (infiles[i].name, output_file))
4931 fatal_error (input_location,
4932 "input file %qs is the same as output file",
4933 output_file);
4936 if (output_file != NULL && output_file[0] == '\0')
4937 fatal_error (input_location, "output filename may not be empty");
4939 /* -dumpdir and -save-temps=* both specify the location of aux/dump
4940 outputs; the one that appears last prevails. When compiling
4941 multiple sources, an explicit dumpbase (minus -ext) may be
4942 combined with an explicit or implicit dumpdir, whereas when
4943 linking, a specified or implied link output name (minus
4944 extension) may be combined with a prevailing -save-temps=* or an
4945 otherwise implied dumpdir, but not override a prevailing
4946 -dumpdir. Primary outputs (e.g., linker output when linking
4947 without -o, or .i, .s or .o outputs when processing multiple
4948 inputs with -E, -S or -c, respectively) are NOT affected by these
4949 -save-temps=/-dump* options, always landing in the current
4950 directory and with the same basename as the input when an output
4951 name is not given, but when they're intermediate outputs, they
4952 are named like other aux outputs, so the options affect their
4953 location and name.
4955 Here are some examples. There are several more in the
4956 documentation of -o and -dump*, and some quite exhaustive tests
4957 in gcc.misc-tests/outputs.exp.
4959 When compiling any number of sources, no -dump* nor
4960 -save-temps=*, all outputs in cwd without prefix:
4962 # gcc -c b.c -gsplit-dwarf
4963 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
4965 # gcc -c b.c d.c -gsplit-dwarf
4966 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
4967 && cc1 [-dumpdir ./] -dumpbase d.c -dumpbase-ext .c # d.o d.dwo
4969 When compiling and linking, no -dump* nor -save-temps=*, .o
4970 outputs are temporary, aux outputs land in the dir of the output,
4971 prefixed with the basename of the linker output:
4973 # gcc b.c d.c -o ab -gsplit-dwarf
4974 -> cc1 -dumpdir ab- -dumpbase b.c -dumpbase-ext .c # ab-b.dwo
4975 && cc1 -dumpdir ab- -dumpbase d.c -dumpbase-ext .c # ab-d.dwo
4976 && link ... -o ab
4978 # gcc b.c d.c [-o a.out] -gsplit-dwarf
4979 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.dwo
4980 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.dwo
4981 && link ... [-o a.out]
4983 When compiling and linking, a prevailing -dumpdir fully overrides
4984 the prefix of aux outputs given by the output name:
4986 # gcc -dumpdir f b.c d.c -gsplit-dwarf [-o [dir/]whatever]
4987 -> cc1 -dumpdir f -dumpbase b.c -dumpbase-ext .c # fb.dwo
4988 && cc1 -dumpdir f -dumpbase d.c -dumpbase-ext .c # fd.dwo
4989 && link ... [-o whatever]
4991 When compiling multiple inputs, an explicit -dumpbase is combined
4992 with -dumpdir, affecting aux outputs, but not the .o outputs:
4994 # gcc -dumpdir f -dumpbase g- b.c d.c -gsplit-dwarf -c
4995 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # b.o fg-b.dwo
4996 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # d.o fg-d.dwo
4998 When compiling and linking with -save-temps, the .o outputs that
4999 would have been temporary become aux outputs, so they get
5000 affected by -dump* flags:
5002 # gcc -dumpdir f -dumpbase g- -save-temps b.c d.c
5003 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # fg-b.o
5004 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # fg-d.o
5005 && link
5007 If -save-temps=* prevails over -dumpdir, however, the explicit
5008 -dumpdir is discarded, as if it wasn't there. The basename of
5009 the implicit linker output, a.out or a.exe, becomes a- as the aux
5010 output prefix for all compilations:
5012 # gcc [-dumpdir f] -save-temps=cwd b.c d.c
5013 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.o
5014 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.o
5015 && link
5017 A single -dumpbase, applying to multiple inputs, overrides the
5018 linker output name, implied or explicit, as the aux output prefix:
5020 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c
5021 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5022 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5023 && link
5025 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c -o dir/h.out
5026 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5027 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5028 && link -o dir/h.out
5030 Now, if the linker output is NOT overridden as a prefix, but
5031 -save-temps=* overrides implicit or explicit -dumpdir, the
5032 effective dump dir combines the dir selected by the -save-temps=*
5033 option with the basename of the specified or implied link output:
5035 # gcc [-dumpdir f] -save-temps=cwd b.c d.c -o dir/h.out
5036 -> cc1 -dumpdir h- -dumpbase b.c -dumpbase-ext .c # h-b.o
5037 && cc1 -dumpdir h- -dumpbase d.c -dumpbase-ext .c # h-d.o
5038 && link -o dir/h.out
5040 # gcc [-dumpdir f] -save-temps=obj b.c d.c -o dir/h.out
5041 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5042 && cc1 -dumpdir dir/h- -dumpbase d.c -dumpbase-ext .c # dir/h-d.o
5043 && link -o dir/h.out
5045 But then again, a single -dumpbase applying to multiple inputs
5046 gets used instead of the linker output basename in the combined
5047 dumpdir:
5049 # gcc [-dumpdir f] -dumpbase g- -save-temps=obj b.c d.c -o dir/h.out
5050 -> cc1 -dumpdir dir/g- -dumpbase b.c -dumpbase-ext .c # dir/g-b.o
5051 && cc1 -dumpdir dir/g- -dumpbase d.c -dumpbase-ext .c # dir/g-d.o
5052 && link -o dir/h.out
5054 With a single input being compiled, the output basename does NOT
5055 affect the dumpdir prefix.
5057 # gcc -save-temps=obj b.c -gsplit-dwarf -c -o dir/b.o
5058 -> cc1 -dumpdir dir/ -dumpbase b.c -dumpbase-ext .c # dir/b.o dir/b.dwo
5060 but when compiling and linking even a single file, it does:
5062 # gcc -save-temps=obj b.c -o dir/h.out
5063 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5065 unless an explicit -dumpdir prevails:
5067 # gcc -save-temps[=obj] -dumpdir g- b.c -o dir/h.out
5068 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5072 bool explicit_dumpdir = dumpdir;
5074 if ((!save_temps_overrides_dumpdir && explicit_dumpdir)
5075 || (output_file && not_actual_file_p (output_file)))
5077 /* Do nothing. */
5080 /* If -save-temps=obj and -o name, create the prefix to use for %b.
5081 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
5082 else if (save_temps_flag != SAVE_TEMPS_CWD && output_file != NULL)
5084 free (dumpdir);
5085 dumpdir = NULL;
5086 temp = lbasename (output_file);
5087 if (temp != output_file)
5088 dumpdir = xstrndup (output_file,
5089 strlen (output_file) - strlen (temp));
5091 else if (dumpdir)
5093 free (dumpdir);
5094 dumpdir = NULL;
5097 if (save_temps_flag)
5098 save_temps_flag = SAVE_TEMPS_DUMP;
5100 /* If there is any pathname component in an explicit -dumpbase, it
5101 overrides dumpdir entirely, so discard it right away. Although
5102 the presence of an explicit -dumpdir matters for the driver, it
5103 shouldn't matter for other processes, that get all that's needed
5104 from the -dumpdir and -dumpbase always passed to them. */
5105 if (dumpdir && dumpbase && lbasename (dumpbase) != dumpbase)
5107 free (dumpdir);
5108 dumpdir = NULL;
5111 /* Check that dumpbase_ext matches the end of dumpbase, drop it
5112 otherwise. */
5113 if (dumpbase_ext && dumpbase && *dumpbase)
5115 int lendb = strlen (dumpbase);
5116 int lendbx = strlen (dumpbase_ext);
5118 /* -dumpbase-ext must be a suffix proper; discard it if it
5119 matches all of -dumpbase, as that would make for an empty
5120 basename. */
5121 if (lendbx >= lendb
5122 || strcmp (dumpbase + lendb - lendbx, dumpbase_ext) != 0)
5124 free (dumpbase_ext);
5125 dumpbase_ext = NULL;
5129 /* -dumpbase with multiple sources goes into dumpdir. With a single
5130 source, it does only if linking and if dumpdir was not explicitly
5131 specified. */
5132 if (dumpbase && *dumpbase
5133 && (single_input_file_index () == -2
5134 || (!have_c && !explicit_dumpdir)))
5136 char *prefix;
5138 if (dumpbase_ext)
5139 /* We checked that they match above. */
5140 dumpbase[strlen (dumpbase) - strlen (dumpbase_ext)] = '\0';
5142 if (dumpdir)
5143 prefix = concat (dumpdir, dumpbase, "-", NULL);
5144 else
5145 prefix = concat (dumpbase, "-", NULL);
5147 free (dumpdir);
5148 free (dumpbase);
5149 free (dumpbase_ext);
5150 dumpbase = dumpbase_ext = NULL;
5151 dumpdir = prefix;
5152 dumpdir_trailing_dash_added = true;
5155 /* If dumpbase was not brought into dumpdir but we're linking, bring
5156 output_file into dumpdir unless dumpdir was explicitly specified.
5157 The test for !explicit_dumpdir is further below, because we want
5158 to use the obase computation for a ghost outbase, passed to
5159 GCC_COLLECT_OPTIONS. */
5160 else if (!have_c && (!explicit_dumpdir || (dumpbase && !*dumpbase)))
5162 /* If we get here, we know dumpbase was not specified, or it was
5163 specified as an empty string. If it was anything else, it
5164 would have combined with dumpdir above, because the condition
5165 for dumpbase to be used when present is broader than the
5166 condition that gets us here. */
5167 gcc_assert (!dumpbase || !*dumpbase);
5169 const char *obase;
5170 char *tofree = NULL;
5171 if (!output_file || not_actual_file_p (output_file))
5172 obase = "a";
5173 else
5175 obase = lbasename (output_file);
5176 size_t blen = strlen (obase), xlen;
5177 /* Drop the suffix if it's dumpbase_ext, if given,
5178 otherwise .exe or the target executable suffix, or if the
5179 output was explicitly named a.out, but not otherwise. */
5180 if (dumpbase_ext
5181 ? (blen > (xlen = strlen (dumpbase_ext))
5182 && strcmp ((temp = (obase + blen - xlen)),
5183 dumpbase_ext) == 0)
5184 : ((temp = strrchr (obase + 1, '.'))
5185 && (xlen = strlen (temp))
5186 && (strcmp (temp, ".exe") == 0
5187 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
5188 || strcmp (temp, TARGET_EXECUTABLE_SUFFIX) == 0
5189 #endif
5190 || strcmp (obase, "a.out") == 0)))
5192 tofree = xstrndup (obase, blen - xlen);
5193 obase = tofree;
5197 /* We wish to save this basename to the -dumpdir passed through
5198 GCC_COLLECT_OPTIONS within maybe_run_linker, for e.g. LTO,
5199 but we do NOT wish to add it to e.g. %b, so we keep
5200 outbase_length as zero. */
5201 gcc_assert (!outbase);
5202 outbase_length = 0;
5204 /* If we're building [dir1/]foo[.exe] out of a single input
5205 [dir2/]foo.c that shares the same basename, dump to
5206 [dir2/]foo.c.* rather than duplicating the basename into
5207 [dir2/]foo-foo.c.*. */
5208 int idxin;
5209 if (dumpbase
5210 || ((idxin = single_input_file_index ()) >= 0
5211 && adds_single_suffix_p (lbasename (infiles[idxin].name),
5212 obase)))
5214 if (obase == tofree)
5215 outbase = tofree;
5216 else
5218 outbase = xstrdup (obase);
5219 free (tofree);
5221 obase = tofree = NULL;
5223 else
5225 if (dumpdir)
5227 char *p = concat (dumpdir, obase, "-", NULL);
5228 free (dumpdir);
5229 dumpdir = p;
5231 else
5232 dumpdir = concat (obase, "-", NULL);
5234 dumpdir_trailing_dash_added = true;
5236 free (tofree);
5237 obase = tofree = NULL;
5240 if (!explicit_dumpdir || dumpbase)
5242 /* Absent -dumpbase and present -dumpbase-ext have been applied
5243 to the linker output name, so compute fresh defaults for each
5244 compilation. */
5245 free (dumpbase_ext);
5246 dumpbase_ext = NULL;
5250 /* Now, if we're compiling, or if we haven't used the dumpbase
5251 above, then outbase (%B) is derived from dumpbase, if given, or
5252 from the output name, given or implied. We can't precompute
5253 implied output names, but that's ok, since they're derived from
5254 input names. Just make sure we skip this if dumpbase is the
5255 empty string: we want to use input names then, so don't set
5256 outbase. */
5257 if ((dumpbase || have_c)
5258 && !(dumpbase && !*dumpbase))
5260 gcc_assert (!outbase);
5262 if (dumpbase)
5264 gcc_assert (single_input_file_index () != -2);
5265 /* We do not want lbasename here; dumpbase with dirnames
5266 overrides dumpdir entirely, even if dumpdir is
5267 specified. */
5268 if (dumpbase_ext)
5269 /* We've already checked above that the suffix matches. */
5270 outbase = xstrndup (dumpbase,
5271 strlen (dumpbase) - strlen (dumpbase_ext));
5272 else
5273 outbase = xstrdup (dumpbase);
5275 else if (output_file && !not_actual_file_p (output_file))
5277 outbase = xstrdup (lbasename (output_file));
5278 char *p = strrchr (outbase + 1, '.');
5279 if (p)
5280 *p = '\0';
5283 if (outbase)
5284 outbase_length = strlen (outbase);
5287 /* If there is any pathname component in an explicit -dumpbase, do
5288 not use dumpdir, but retain it to pass it on to the compiler. */
5289 if (dumpdir)
5290 dumpdir_length = strlen (dumpdir);
5291 else
5292 dumpdir_length = 0;
5294 /* Check that dumpbase_ext, if still present, still matches the end
5295 of dumpbase, if present, and drop it otherwise. We only retained
5296 it above when dumpbase was absent to maybe use it to drop the
5297 extension from output_name before combining it with dumpdir. We
5298 won't deal with -dumpbase-ext when -dumpbase is not explicitly
5299 given, even if just to activate backward-compatible dumpbase:
5300 dropping it on the floor is correct, expected and documented
5301 behavior. Attempting to deal with a -dumpbase-ext that might
5302 match the end of some input filename, or of the combination of
5303 the output basename with the suffix of the input filename,
5304 possible with an intermediate .gk extension for -fcompare-debug,
5305 is just calling for trouble. */
5306 if (dumpbase_ext)
5308 if (!dumpbase || !*dumpbase)
5310 free (dumpbase_ext);
5311 dumpbase_ext = NULL;
5313 else
5314 gcc_assert (strcmp (dumpbase + strlen (dumpbase)
5315 - strlen (dumpbase_ext), dumpbase_ext) == 0);
5318 if (save_temps_flag && use_pipes)
5320 /* -save-temps overrides -pipe, so that temp files are produced */
5321 if (save_temps_flag)
5322 warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
5323 use_pipes = 0;
5326 if (!compare_debug)
5328 const char *gcd = env.get ("GCC_COMPARE_DEBUG");
5330 if (gcd && gcd[0] == '-')
5332 compare_debug = 2;
5333 compare_debug_opt = gcd;
5335 else if (gcd && *gcd && strcmp (gcd, "0"))
5337 compare_debug = 3;
5338 compare_debug_opt = "-gtoggle";
5341 else if (compare_debug < 0)
5343 compare_debug = 0;
5344 gcc_assert (!compare_debug_opt);
5347 /* Set up the search paths. We add directories that we expect to
5348 contain GNU Toolchain components before directories specified by
5349 the machine description so that we will find GNU components (like
5350 the GNU assembler) before those of the host system. */
5352 /* If we don't know where the toolchain has been installed, use the
5353 configured-in locations. */
5354 if (!gcc_exec_prefix)
5356 #ifndef OS2
5357 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
5358 PREFIX_PRIORITY_LAST, 1, 0);
5359 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
5360 PREFIX_PRIORITY_LAST, 2, 0);
5361 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
5362 PREFIX_PRIORITY_LAST, 2, 0);
5363 #endif
5364 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
5365 PREFIX_PRIORITY_LAST, 1, 0);
5368 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
5369 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
5370 dir_separator_str, NULL);
5372 /* Look for tools relative to the location from which the driver is
5373 running, or, if that is not available, the configured prefix. */
5374 tooldir_prefix
5375 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
5376 spec_host_machine, dir_separator_str, spec_version,
5377 accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL);
5378 free (tooldir_prefix2);
5380 add_prefix (&exec_prefixes,
5381 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
5382 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
5383 add_prefix (&startfile_prefixes,
5384 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
5385 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
5386 free (tooldir_prefix);
5388 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
5389 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
5390 then consider it to relocate with the rest of the GCC installation
5391 if GCC_EXEC_PREFIX is set.
5392 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
5393 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
5395 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
5396 standard_bindir_prefix,
5397 target_system_root);
5398 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
5400 target_system_root = tmp_prefix;
5401 target_system_root_changed = 1;
5404 #endif
5406 /* More prefixes are enabled in main, after we read the specs file
5407 and determine whether this is cross-compilation or not. */
5409 if (n_infiles != 0 && n_infiles == last_language_n_infiles && spec_lang != 0)
5410 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
5412 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
5413 environment variable. */
5414 if (compare_debug == 2 || compare_debug == 3)
5416 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
5417 save_switch (opt, 0, NULL, false, true);
5418 compare_debug = 1;
5421 /* Ensure we only invoke each subprocess once. */
5422 if (n_infiles == 0
5423 && (print_subprocess_help || print_help_list || print_version))
5425 /* Create a dummy input file, so that we can pass
5426 the help option on to the various sub-processes. */
5427 add_infile ("help-dummy", "c");
5430 /* Decide if undefined variable references are allowed in specs. */
5432 /* -v alone is safe. --version and --help alone or together are safe. Note
5433 that -v would make them unsafe, as they'd then be run for subprocesses as
5434 well, the location of which might depend on variables possibly coming
5435 from self-specs. Note also that the command name is counted in
5436 decoded_options_count. */
5438 unsigned help_version_count = 0;
5440 if (print_version)
5441 help_version_count++;
5443 if (print_help_list)
5444 help_version_count++;
5446 spec_undefvar_allowed =
5447 ((verbose_flag && decoded_options_count == 2)
5448 || help_version_count == decoded_options_count - 1);
5450 alloc_switch ();
5451 switches[n_switches].part1 = 0;
5452 alloc_infile ();
5453 infiles[n_infiles].name = 0;
5456 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
5457 and place that in the environment. */
5459 static void
5460 set_collect_gcc_options (void)
5462 int i;
5463 int first_time;
5465 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5466 the compiler. */
5467 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5468 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5470 first_time = TRUE;
5471 for (i = 0; (int) i < n_switches; i++)
5473 const char *const *args;
5474 const char *p, *q;
5475 if (!first_time)
5476 obstack_grow (&collect_obstack, " ", 1);
5478 first_time = FALSE;
5480 /* Ignore elided switches. */
5481 if ((switches[i].live_cond
5482 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
5483 == SWITCH_IGNORE)
5484 continue;
5486 obstack_grow (&collect_obstack, "'-", 2);
5487 q = switches[i].part1;
5488 while ((p = strchr (q, '\'')))
5490 obstack_grow (&collect_obstack, q, p - q);
5491 obstack_grow (&collect_obstack, "'\\''", 4);
5492 q = ++p;
5494 obstack_grow (&collect_obstack, q, strlen (q));
5495 obstack_grow (&collect_obstack, "'", 1);
5497 for (args = switches[i].args; args && *args; args++)
5499 obstack_grow (&collect_obstack, " '", 2);
5500 q = *args;
5501 while ((p = strchr (q, '\'')))
5503 obstack_grow (&collect_obstack, q, p - q);
5504 obstack_grow (&collect_obstack, "'\\''", 4);
5505 q = ++p;
5507 obstack_grow (&collect_obstack, q, strlen (q));
5508 obstack_grow (&collect_obstack, "'", 1);
5512 if (dumpdir)
5514 if (!first_time)
5515 obstack_grow (&collect_obstack, " ", 1);
5516 first_time = FALSE;
5518 obstack_grow (&collect_obstack, "'-dumpdir' '", 12);
5519 const char *p, *q;
5521 q = dumpdir;
5522 while ((p = strchr (q, '\'')))
5524 obstack_grow (&collect_obstack, q, p - q);
5525 obstack_grow (&collect_obstack, "'\\''", 4);
5526 q = ++p;
5528 obstack_grow (&collect_obstack, q, strlen (q));
5530 obstack_grow (&collect_obstack, "'", 1);
5533 obstack_grow (&collect_obstack, "\0", 1);
5534 xputenv (XOBFINISH (&collect_obstack, char *));
5537 /* Process a spec string, accumulating and running commands. */
5539 /* These variables describe the input file name.
5540 input_file_number is the index on outfiles of this file,
5541 so that the output file name can be stored for later use by %o.
5542 input_basename is the start of the part of the input file
5543 sans all directory names, and basename_length is the number
5544 of characters starting there excluding the suffix .c or whatever. */
5546 static const char *gcc_input_filename;
5547 static int input_file_number;
5548 size_t input_filename_length;
5549 static int basename_length;
5550 static int suffixed_basename_length;
5551 static const char *input_basename;
5552 static const char *input_suffix;
5553 #ifndef HOST_LACKS_INODE_NUMBERS
5554 static struct stat input_stat;
5555 #endif
5556 static int input_stat_set;
5558 /* The compiler used to process the current input file. */
5559 static struct compiler *input_file_compiler;
5561 /* These are variables used within do_spec and do_spec_1. */
5563 /* Nonzero if an arg has been started and not yet terminated
5564 (with space, tab or newline). */
5565 static int arg_going;
5567 /* Nonzero means %d or %g has been seen; the next arg to be terminated
5568 is a temporary file name. */
5569 static int delete_this_arg;
5571 /* Nonzero means %w has been seen; the next arg to be terminated
5572 is the output file name of this compilation. */
5573 static int this_is_output_file;
5575 /* Nonzero means %s has been seen; the next arg to be terminated
5576 is the name of a library file and we should try the standard
5577 search dirs for it. */
5578 static int this_is_library_file;
5580 /* Nonzero means %T has been seen; the next arg to be terminated
5581 is the name of a linker script and we should try all of the
5582 standard search dirs for it. If it is found insert a --script
5583 command line switch and then substitute the full path in place,
5584 otherwise generate an error message. */
5585 static int this_is_linker_script;
5587 /* Nonzero means that the input of this command is coming from a pipe. */
5588 static int input_from_pipe;
5590 /* Nonnull means substitute this for any suffix when outputting a switches
5591 arguments. */
5592 static const char *suffix_subst;
5594 /* If there is an argument being accumulated, terminate it and store it. */
5596 static void
5597 end_going_arg (void)
5599 if (arg_going)
5601 const char *string;
5603 obstack_1grow (&obstack, 0);
5604 string = XOBFINISH (&obstack, const char *);
5605 if (this_is_library_file)
5606 string = find_file (string);
5607 if (this_is_linker_script)
5609 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
5611 if (full_script_path == NULL)
5613 error ("unable to locate default linker script %qs in the library search paths", string);
5614 /* Script was not found on search path. */
5615 return;
5617 store_arg ("--script", false, false);
5618 string = full_script_path;
5620 store_arg (string, delete_this_arg, this_is_output_file);
5621 if (this_is_output_file)
5622 outfiles[input_file_number] = string;
5623 arg_going = 0;
5628 /* Parse the WRAPPER string which is a comma separated list of the command line
5629 and insert them into the beginning of argbuf. */
5631 static void
5632 insert_wrapper (const char *wrapper)
5634 int n = 0;
5635 int i;
5636 char *buf = xstrdup (wrapper);
5637 char *p = buf;
5638 unsigned int old_length = argbuf.length ();
5642 n++;
5643 while (*p == ',')
5644 p++;
5646 while ((p = strchr (p, ',')) != NULL);
5648 argbuf.safe_grow (old_length + n, true);
5649 memmove (argbuf.address () + n,
5650 argbuf.address (),
5651 old_length * sizeof (const_char_p));
5653 i = 0;
5654 p = buf;
5657 while (*p == ',')
5659 *p = 0;
5660 p++;
5662 argbuf[i] = p;
5663 i++;
5665 while ((p = strchr (p, ',')) != NULL);
5666 gcc_assert (i == n);
5669 /* Process the spec SPEC and run the commands specified therein.
5670 Returns 0 if the spec is successfully processed; -1 if failed. */
5673 do_spec (const char *spec)
5675 int value;
5677 value = do_spec_2 (spec, NULL);
5679 /* Force out any unfinished command.
5680 If -pipe, this forces out the last command if it ended in `|'. */
5681 if (value == 0)
5683 if (argbuf.length () > 0
5684 && !strcmp (argbuf.last (), "|"))
5685 argbuf.pop ();
5687 set_collect_gcc_options ();
5689 if (argbuf.length () > 0)
5690 value = execute ();
5693 return value;
5696 /* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
5697 of a matched * pattern which may be re-injected by way of %*. */
5699 static int
5700 do_spec_2 (const char *spec, const char *soft_matched_part)
5702 int result;
5704 clear_args ();
5705 arg_going = 0;
5706 delete_this_arg = 0;
5707 this_is_output_file = 0;
5708 this_is_library_file = 0;
5709 this_is_linker_script = 0;
5710 input_from_pipe = 0;
5711 suffix_subst = NULL;
5713 result = do_spec_1 (spec, 0, soft_matched_part);
5715 end_going_arg ();
5717 return result;
5720 /* Process the given spec string and add any new options to the end
5721 of the switches/n_switches array. */
5723 static void
5724 do_option_spec (const char *name, const char *spec)
5726 unsigned int i, value_count, value_len;
5727 const char *p, *q, *value;
5728 char *tmp_spec, *tmp_spec_p;
5730 if (configure_default_options[0].name == NULL)
5731 return;
5733 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
5734 if (strcmp (configure_default_options[i].name, name) == 0)
5735 break;
5736 if (i == ARRAY_SIZE (configure_default_options))
5737 return;
5739 value = configure_default_options[i].value;
5740 value_len = strlen (value);
5742 /* Compute the size of the final spec. */
5743 value_count = 0;
5744 p = spec;
5745 while ((p = strstr (p, "%(VALUE)")) != NULL)
5747 p ++;
5748 value_count ++;
5751 /* Replace each %(VALUE) by the specified value. */
5752 tmp_spec = (char *) alloca (strlen (spec) + 1
5753 + value_count * (value_len - strlen ("%(VALUE)")));
5754 tmp_spec_p = tmp_spec;
5755 q = spec;
5756 while ((p = strstr (q, "%(VALUE)")) != NULL)
5758 memcpy (tmp_spec_p, q, p - q);
5759 tmp_spec_p = tmp_spec_p + (p - q);
5760 memcpy (tmp_spec_p, value, value_len);
5761 tmp_spec_p += value_len;
5762 q = p + strlen ("%(VALUE)");
5764 strcpy (tmp_spec_p, q);
5766 do_self_spec (tmp_spec);
5769 /* Process the given spec string and add any new options to the end
5770 of the switches/n_switches array. */
5772 static void
5773 do_self_spec (const char *spec)
5775 int i;
5777 do_spec_2 (spec, NULL);
5778 do_spec_1 (" ", 0, NULL);
5780 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
5781 do_self_specs adds the replacements to switches array, so it shouldn't
5782 be processed afterwards. */
5783 for (i = 0; i < n_switches; i++)
5784 if ((switches[i].live_cond & SWITCH_IGNORE))
5785 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
5787 if (argbuf.length () > 0)
5789 const char **argbuf_copy;
5790 struct cl_decoded_option *decoded_options;
5791 struct cl_option_handlers handlers;
5792 unsigned int decoded_options_count;
5793 unsigned int j;
5795 /* Create a copy of argbuf with a dummy argv[0] entry for
5796 decode_cmdline_options_to_array. */
5797 argbuf_copy = XNEWVEC (const char *,
5798 argbuf.length () + 1);
5799 argbuf_copy[0] = "";
5800 memcpy (argbuf_copy + 1, argbuf.address (),
5801 argbuf.length () * sizeof (const char *));
5803 decode_cmdline_options_to_array (argbuf.length () + 1,
5804 argbuf_copy,
5805 CL_DRIVER, &decoded_options,
5806 &decoded_options_count);
5807 free (argbuf_copy);
5809 set_option_handlers (&handlers);
5811 for (j = 1; j < decoded_options_count; j++)
5813 switch (decoded_options[j].opt_index)
5815 case OPT_SPECIAL_input_file:
5816 /* Specs should only generate options, not input
5817 files. */
5818 if (strcmp (decoded_options[j].arg, "-") != 0)
5819 fatal_error (input_location,
5820 "switch %qs does not start with %<-%>",
5821 decoded_options[j].arg);
5822 else
5823 fatal_error (input_location,
5824 "spec-generated switch is just %<-%>");
5825 break;
5827 case OPT_fcompare_debug_second:
5828 case OPT_fcompare_debug:
5829 case OPT_fcompare_debug_:
5830 case OPT_o:
5831 /* Avoid duplicate processing of some options from
5832 compare-debug specs; just save them here. */
5833 save_switch (decoded_options[j].canonical_option[0],
5834 (decoded_options[j].canonical_option_num_elements
5835 - 1),
5836 &decoded_options[j].canonical_option[1], false, true);
5837 break;
5839 default:
5840 read_cmdline_option (&global_options, &global_options_set,
5841 decoded_options + j, UNKNOWN_LOCATION,
5842 CL_DRIVER, &handlers, global_dc);
5843 break;
5847 free (decoded_options);
5849 alloc_switch ();
5850 switches[n_switches].part1 = 0;
5854 /* Callback for processing %D and %I specs. */
5856 struct spec_path_info {
5857 const char *option;
5858 const char *append;
5859 size_t append_len;
5860 bool omit_relative;
5861 bool separate_options;
5864 static void *
5865 spec_path (char *path, void *data)
5867 struct spec_path_info *info = (struct spec_path_info *) data;
5868 size_t len = 0;
5869 char save = 0;
5871 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
5872 return NULL;
5874 if (info->append_len != 0)
5876 len = strlen (path);
5877 memcpy (path + len, info->append, info->append_len + 1);
5880 if (!is_directory (path, true))
5881 return NULL;
5883 do_spec_1 (info->option, 1, NULL);
5884 if (info->separate_options)
5885 do_spec_1 (" ", 0, NULL);
5887 if (info->append_len == 0)
5889 len = strlen (path);
5890 save = path[len - 1];
5891 if (IS_DIR_SEPARATOR (path[len - 1]))
5892 path[len - 1] = '\0';
5895 do_spec_1 (path, 1, NULL);
5896 do_spec_1 (" ", 0, NULL);
5898 /* Must not damage the original path. */
5899 if (info->append_len == 0)
5900 path[len - 1] = save;
5902 return NULL;
5905 /* True if we should compile INFILE. */
5907 static bool
5908 compile_input_file_p (struct infile *infile)
5910 if ((!infile->language) || (infile->language[0] != '*'))
5911 if (infile->incompiler == input_file_compiler)
5912 return true;
5913 return false;
5916 /* Process each member of VEC as a spec. */
5918 static void
5919 do_specs_vec (vec<char_p> vec)
5921 for (char *opt : vec)
5923 do_spec_1 (opt, 1, NULL);
5924 /* Make each accumulated option a separate argument. */
5925 do_spec_1 (" ", 0, NULL);
5929 /* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS. */
5931 static void
5932 putenv_COLLECT_AS_OPTIONS (vec<char_p> vec)
5934 if (vec.is_empty ())
5935 return;
5937 obstack_init (&collect_obstack);
5938 obstack_grow (&collect_obstack, "COLLECT_AS_OPTIONS=",
5939 strlen ("COLLECT_AS_OPTIONS="));
5941 char *opt;
5942 unsigned ix;
5944 FOR_EACH_VEC_ELT (vec, ix, opt)
5946 obstack_1grow (&collect_obstack, '\'');
5947 obstack_grow (&collect_obstack, opt, strlen (opt));
5948 obstack_1grow (&collect_obstack, '\'');
5949 if (ix < vec.length () - 1)
5950 obstack_1grow(&collect_obstack, ' ');
5953 obstack_1grow (&collect_obstack, '\0');
5954 xputenv (XOBFINISH (&collect_obstack, char *));
5957 /* Process the sub-spec SPEC as a portion of a larger spec.
5958 This is like processing a whole spec except that we do
5959 not initialize at the beginning and we do not supply a
5960 newline by default at the end.
5961 INSWITCH nonzero means don't process %-sequences in SPEC;
5962 in this case, % is treated as an ordinary character.
5963 This is used while substituting switches.
5964 INSWITCH nonzero also causes SPC not to terminate an argument.
5966 Value is zero unless a line was finished
5967 and the command on that line reported an error. */
5969 static int
5970 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
5972 const char *p = spec;
5973 int c;
5974 int i;
5975 int value;
5977 /* If it's an empty string argument to a switch, keep it as is. */
5978 if (inswitch && !*p)
5979 arg_going = 1;
5981 while ((c = *p++))
5982 /* If substituting a switch, treat all chars like letters.
5983 Otherwise, NL, SPC, TAB and % are special. */
5984 switch (inswitch ? 'a' : c)
5986 case '\n':
5987 end_going_arg ();
5989 if (argbuf.length () > 0
5990 && !strcmp (argbuf.last (), "|"))
5992 /* A `|' before the newline means use a pipe here,
5993 but only if -pipe was specified.
5994 Otherwise, execute now and don't pass the `|' as an arg. */
5995 if (use_pipes)
5997 input_from_pipe = 1;
5998 break;
6000 else
6001 argbuf.pop ();
6004 set_collect_gcc_options ();
6006 if (argbuf.length () > 0)
6008 value = execute ();
6009 if (value)
6010 return value;
6012 /* Reinitialize for a new command, and for a new argument. */
6013 clear_args ();
6014 arg_going = 0;
6015 delete_this_arg = 0;
6016 this_is_output_file = 0;
6017 this_is_library_file = 0;
6018 this_is_linker_script = 0;
6019 input_from_pipe = 0;
6020 break;
6022 case '|':
6023 end_going_arg ();
6025 /* Use pipe */
6026 obstack_1grow (&obstack, c);
6027 arg_going = 1;
6028 break;
6030 case '\t':
6031 case ' ':
6032 end_going_arg ();
6034 /* Reinitialize for a new argument. */
6035 delete_this_arg = 0;
6036 this_is_output_file = 0;
6037 this_is_library_file = 0;
6038 this_is_linker_script = 0;
6039 break;
6041 case '%':
6042 switch (c = *p++)
6044 case 0:
6045 fatal_error (input_location, "spec %qs invalid", spec);
6047 case 'b':
6048 /* Don't use %b in the linker command. */
6049 gcc_assert (suffixed_basename_length);
6050 if (!this_is_output_file && dumpdir_length)
6051 obstack_grow (&obstack, dumpdir, dumpdir_length);
6052 if (this_is_output_file || !outbase_length)
6053 obstack_grow (&obstack, input_basename, basename_length);
6054 else
6055 obstack_grow (&obstack, outbase, outbase_length);
6056 if (compare_debug < 0)
6057 obstack_grow (&obstack, ".gk", 3);
6058 arg_going = 1;
6059 break;
6061 case 'B':
6062 /* Don't use %B in the linker command. */
6063 gcc_assert (suffixed_basename_length);
6064 if (!this_is_output_file && dumpdir_length)
6065 obstack_grow (&obstack, dumpdir, dumpdir_length);
6066 if (this_is_output_file || !outbase_length)
6067 obstack_grow (&obstack, input_basename, basename_length);
6068 else
6069 obstack_grow (&obstack, outbase, outbase_length);
6070 if (compare_debug < 0)
6071 obstack_grow (&obstack, ".gk", 3);
6072 obstack_grow (&obstack, input_basename + basename_length,
6073 suffixed_basename_length - basename_length);
6075 arg_going = 1;
6076 break;
6078 case 'd':
6079 delete_this_arg = 2;
6080 break;
6082 /* Dump out the directories specified with LIBRARY_PATH,
6083 followed by the absolute directories
6084 that we search for startfiles. */
6085 case 'D':
6087 struct spec_path_info info;
6089 info.option = "-L";
6090 info.append_len = 0;
6091 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
6092 /* Used on systems which record the specified -L dirs
6093 and use them to search for dynamic linking.
6094 Relative directories always come from -B,
6095 and it is better not to use them for searching
6096 at run time. In particular, stage1 loses. */
6097 info.omit_relative = true;
6098 #else
6099 info.omit_relative = false;
6100 #endif
6101 info.separate_options = false;
6103 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
6105 break;
6107 case 'e':
6108 /* %efoo means report an error with `foo' as error message
6109 and don't execute any more commands for this file. */
6111 const char *q = p;
6112 char *buf;
6113 while (*p != 0 && *p != '\n')
6114 p++;
6115 buf = (char *) alloca (p - q + 1);
6116 strncpy (buf, q, p - q);
6117 buf[p - q] = 0;
6118 error ("%s", _(buf));
6119 return -1;
6121 break;
6122 case 'n':
6123 /* %nfoo means report a notice with `foo' on stderr. */
6125 const char *q = p;
6126 char *buf;
6127 while (*p != 0 && *p != '\n')
6128 p++;
6129 buf = (char *) alloca (p - q + 1);
6130 strncpy (buf, q, p - q);
6131 buf[p - q] = 0;
6132 inform (UNKNOWN_LOCATION, "%s", _(buf));
6133 if (*p)
6134 p++;
6136 break;
6138 case 'j':
6140 struct stat st;
6142 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
6143 defined, and it is not a directory, and it is
6144 writable, use it. Otherwise, treat this like any
6145 other temporary file. */
6147 if ((!save_temps_flag)
6148 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
6149 && (access (HOST_BIT_BUCKET, W_OK) == 0))
6151 obstack_grow (&obstack, HOST_BIT_BUCKET,
6152 strlen (HOST_BIT_BUCKET));
6153 delete_this_arg = 0;
6154 arg_going = 1;
6155 break;
6158 goto create_temp_file;
6159 case '|':
6160 if (use_pipes)
6162 obstack_1grow (&obstack, '-');
6163 delete_this_arg = 0;
6164 arg_going = 1;
6166 /* consume suffix */
6167 while (*p == '.' || ISALNUM ((unsigned char) *p))
6168 p++;
6169 if (p[0] == '%' && p[1] == 'O')
6170 p += 2;
6172 break;
6174 goto create_temp_file;
6175 case 'm':
6176 if (use_pipes)
6178 /* consume suffix */
6179 while (*p == '.' || ISALNUM ((unsigned char) *p))
6180 p++;
6181 if (p[0] == '%' && p[1] == 'O')
6182 p += 2;
6184 break;
6186 goto create_temp_file;
6187 case 'g':
6188 case 'u':
6189 case 'U':
6190 create_temp_file:
6192 struct temp_name *t;
6193 int suffix_length;
6194 const char *suffix = p;
6195 char *saved_suffix = NULL;
6197 while (*p == '.' || ISALNUM ((unsigned char) *p))
6198 p++;
6199 suffix_length = p - suffix;
6200 if (p[0] == '%' && p[1] == 'O')
6202 p += 2;
6203 /* We don't support extra suffix characters after %O. */
6204 if (*p == '.' || ISALNUM ((unsigned char) *p))
6205 fatal_error (input_location,
6206 "spec %qs has invalid %<%%0%c%>", spec, *p);
6207 if (suffix_length == 0)
6208 suffix = TARGET_OBJECT_SUFFIX;
6209 else
6211 saved_suffix
6212 = XNEWVEC (char, suffix_length
6213 + strlen (TARGET_OBJECT_SUFFIX) + 1);
6214 strncpy (saved_suffix, suffix, suffix_length);
6215 strcpy (saved_suffix + suffix_length,
6216 TARGET_OBJECT_SUFFIX);
6218 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
6221 if (compare_debug < 0)
6223 suffix = concat (".gk", suffix, NULL);
6224 suffix_length += 3;
6227 /* If -save-temps was specified, use that for the
6228 temp file. */
6229 if (save_temps_flag)
6231 char *tmp;
6232 bool adjusted_suffix = false;
6233 if (suffix_length
6234 && !outbase_length && !basename_length
6235 && !dumpdir_trailing_dash_added)
6237 adjusted_suffix = true;
6238 suffix++;
6239 suffix_length--;
6241 temp_filename_length
6242 = dumpdir_length + suffix_length + 1;
6243 if (outbase_length)
6244 temp_filename_length += outbase_length;
6245 else
6246 temp_filename_length += basename_length;
6247 tmp = (char *) alloca (temp_filename_length);
6248 if (dumpdir_length)
6249 memcpy (tmp, dumpdir, dumpdir_length);
6250 if (outbase_length)
6251 memcpy (tmp + dumpdir_length, outbase,
6252 outbase_length);
6253 else if (basename_length)
6254 memcpy (tmp + dumpdir_length, input_basename,
6255 basename_length);
6256 memcpy (tmp + temp_filename_length - suffix_length - 1,
6257 suffix, suffix_length);
6258 if (adjusted_suffix)
6260 adjusted_suffix = false;
6261 suffix--;
6262 suffix_length++;
6264 tmp[temp_filename_length - 1] = '\0';
6265 temp_filename = tmp;
6267 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
6269 #ifndef HOST_LACKS_INODE_NUMBERS
6270 struct stat st_temp;
6272 /* Note, set_input() resets input_stat_set to 0. */
6273 if (input_stat_set == 0)
6275 input_stat_set = stat (gcc_input_filename,
6276 &input_stat);
6277 if (input_stat_set >= 0)
6278 input_stat_set = 1;
6281 /* If we have the stat for the gcc_input_filename
6282 and we can do the stat for the temp_filename
6283 then the they could still refer to the same
6284 file if st_dev/st_ino's are the same. */
6285 if (input_stat_set != 1
6286 || stat (temp_filename, &st_temp) < 0
6287 || input_stat.st_dev != st_temp.st_dev
6288 || input_stat.st_ino != st_temp.st_ino)
6289 #else
6290 /* Just compare canonical pathnames. */
6291 char* input_realname = lrealpath (gcc_input_filename);
6292 char* temp_realname = lrealpath (temp_filename);
6293 bool files_differ = filename_cmp (input_realname, temp_realname);
6294 free (input_realname);
6295 free (temp_realname);
6296 if (files_differ)
6297 #endif
6299 temp_filename
6300 = save_string (temp_filename,
6301 temp_filename_length - 1);
6302 obstack_grow (&obstack, temp_filename,
6303 temp_filename_length);
6304 arg_going = 1;
6305 delete_this_arg = 0;
6306 break;
6311 /* See if we already have an association of %g/%u/%U and
6312 suffix. */
6313 for (t = temp_names; t; t = t->next)
6314 if (t->length == suffix_length
6315 && strncmp (t->suffix, suffix, suffix_length) == 0
6316 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
6317 break;
6319 /* Make a new association if needed. %u and %j
6320 require one. */
6321 if (t == 0 || c == 'u' || c == 'j')
6323 if (t == 0)
6325 t = XNEW (struct temp_name);
6326 t->next = temp_names;
6327 temp_names = t;
6329 t->length = suffix_length;
6330 if (saved_suffix)
6332 t->suffix = saved_suffix;
6333 saved_suffix = NULL;
6335 else
6336 t->suffix = save_string (suffix, suffix_length);
6337 t->unique = (c == 'u' || c == 'U' || c == 'j');
6338 temp_filename = make_temp_file (t->suffix);
6339 temp_filename_length = strlen (temp_filename);
6340 t->filename = temp_filename;
6341 t->filename_length = temp_filename_length;
6344 free (saved_suffix);
6346 obstack_grow (&obstack, t->filename, t->filename_length);
6347 delete_this_arg = 1;
6349 arg_going = 1;
6350 break;
6352 case 'i':
6353 if (combine_inputs)
6355 /* We are going to expand `%i' into `@FILE', where FILE
6356 is a newly-created temporary filename. The filenames
6357 that would usually be expanded in place of %o will be
6358 written to the temporary file. */
6359 if (at_file_supplied)
6360 open_at_file ();
6362 for (i = 0; (int) i < n_infiles; i++)
6363 if (compile_input_file_p (&infiles[i]))
6365 store_arg (infiles[i].name, 0, 0);
6366 infiles[i].compiled = true;
6369 if (at_file_supplied)
6370 close_at_file ();
6372 else
6374 obstack_grow (&obstack, gcc_input_filename,
6375 input_filename_length);
6376 arg_going = 1;
6378 break;
6380 case 'I':
6382 struct spec_path_info info;
6384 if (multilib_dir)
6386 do_spec_1 ("-imultilib", 1, NULL);
6387 /* Make this a separate argument. */
6388 do_spec_1 (" ", 0, NULL);
6389 do_spec_1 (multilib_dir, 1, NULL);
6390 do_spec_1 (" ", 0, NULL);
6393 if (multiarch_dir)
6395 do_spec_1 ("-imultiarch", 1, NULL);
6396 /* Make this a separate argument. */
6397 do_spec_1 (" ", 0, NULL);
6398 do_spec_1 (multiarch_dir, 1, NULL);
6399 do_spec_1 (" ", 0, NULL);
6402 if (gcc_exec_prefix)
6404 do_spec_1 ("-iprefix", 1, NULL);
6405 /* Make this a separate argument. */
6406 do_spec_1 (" ", 0, NULL);
6407 do_spec_1 (gcc_exec_prefix, 1, NULL);
6408 do_spec_1 (" ", 0, NULL);
6411 if (target_system_root_changed ||
6412 (target_system_root && target_sysroot_hdrs_suffix))
6414 do_spec_1 ("-isysroot", 1, NULL);
6415 /* Make this a separate argument. */
6416 do_spec_1 (" ", 0, NULL);
6417 do_spec_1 (target_system_root, 1, NULL);
6418 if (target_sysroot_hdrs_suffix)
6419 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
6420 do_spec_1 (" ", 0, NULL);
6423 info.option = "-isystem";
6424 info.append = "include";
6425 info.append_len = strlen (info.append);
6426 info.omit_relative = false;
6427 info.separate_options = true;
6429 for_each_path (&include_prefixes, false, info.append_len,
6430 spec_path, &info);
6432 info.append = "include-fixed";
6433 if (*sysroot_hdrs_suffix_spec)
6434 info.append = concat (info.append, dir_separator_str,
6435 multilib_dir, NULL);
6436 else if (multiarch_dir)
6438 /* For multiarch, search include-fixed/<multiarch-dir>
6439 before include-fixed. */
6440 info.append = concat (info.append, dir_separator_str,
6441 multiarch_dir, NULL);
6442 info.append_len = strlen (info.append);
6443 for_each_path (&include_prefixes, false, info.append_len,
6444 spec_path, &info);
6446 info.append = "include-fixed";
6448 info.append_len = strlen (info.append);
6449 for_each_path (&include_prefixes, false, info.append_len,
6450 spec_path, &info);
6452 break;
6454 case 'o':
6455 /* We are going to expand `%o' into `@FILE', where FILE
6456 is a newly-created temporary filename. The filenames
6457 that would usually be expanded in place of %o will be
6458 written to the temporary file. */
6459 if (at_file_supplied)
6460 open_at_file ();
6462 for (i = 0; i < n_infiles + lang_specific_extra_outfiles; i++)
6463 if (outfiles[i])
6464 store_arg (outfiles[i], 0, 0);
6466 if (at_file_supplied)
6467 close_at_file ();
6468 break;
6470 case 'O':
6471 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
6472 arg_going = 1;
6473 break;
6475 case 's':
6476 this_is_library_file = 1;
6477 break;
6479 case 'T':
6480 this_is_linker_script = 1;
6481 break;
6483 case 'V':
6484 outfiles[input_file_number] = NULL;
6485 break;
6487 case 'w':
6488 this_is_output_file = 1;
6489 break;
6491 case 'W':
6493 unsigned int cur_index = argbuf.length ();
6494 /* Handle the {...} following the %W. */
6495 if (*p != '{')
6496 fatal_error (input_location,
6497 "spec %qs has invalid %<%%W%c%>", spec, *p);
6498 p = handle_braces (p + 1);
6499 if (p == 0)
6500 return -1;
6501 end_going_arg ();
6502 /* If any args were output, mark the last one for deletion
6503 on failure. */
6504 if (argbuf.length () != cur_index)
6505 record_temp_file (argbuf.last (), 0, 1);
6506 break;
6509 case '@':
6510 /* Handle the {...} following the %@. */
6511 if (*p != '{')
6512 fatal_error (input_location,
6513 "spec %qs has invalid %<%%@%c%>", spec, *p);
6514 if (at_file_supplied)
6515 open_at_file ();
6516 p = handle_braces (p + 1);
6517 if (at_file_supplied)
6518 close_at_file ();
6519 if (p == 0)
6520 return -1;
6521 break;
6523 /* %x{OPTION} records OPTION for %X to output. */
6524 case 'x':
6526 const char *p1 = p;
6527 char *string;
6529 /* Skip past the option value and make a copy. */
6530 if (*p != '{')
6531 fatal_error (input_location,
6532 "spec %qs has invalid %<%%x%c%>", spec, *p);
6533 while (*p++ != '}')
6535 string = save_string (p1 + 1, p - p1 - 2);
6537 /* See if we already recorded this option. */
6538 for (const char *opt : linker_options)
6539 if (! strcmp (string, opt))
6541 free (string);
6542 return 0;
6545 /* This option is new; add it. */
6546 add_linker_option (string, strlen (string));
6547 free (string);
6549 break;
6551 /* Dump out the options accumulated previously using %x. */
6552 case 'X':
6553 do_specs_vec (linker_options);
6554 break;
6556 /* Dump out the options accumulated previously using -Wa,. */
6557 case 'Y':
6558 do_specs_vec (assembler_options);
6559 break;
6561 /* Dump out the options accumulated previously using -Wp,. */
6562 case 'Z':
6563 do_specs_vec (preprocessor_options);
6564 break;
6566 /* Here are digits and numbers that just process
6567 a certain constant string as a spec. */
6569 case '1':
6570 value = do_spec_1 (cc1_spec, 0, NULL);
6571 if (value != 0)
6572 return value;
6573 break;
6575 case '2':
6576 value = do_spec_1 (cc1plus_spec, 0, NULL);
6577 if (value != 0)
6578 return value;
6579 break;
6581 case 'a':
6582 value = do_spec_1 (asm_spec, 0, NULL);
6583 if (value != 0)
6584 return value;
6585 break;
6587 case 'A':
6588 value = do_spec_1 (asm_final_spec, 0, NULL);
6589 if (value != 0)
6590 return value;
6591 break;
6593 case 'C':
6595 const char *const spec
6596 = (input_file_compiler->cpp_spec
6597 ? input_file_compiler->cpp_spec
6598 : cpp_spec);
6599 value = do_spec_1 (spec, 0, NULL);
6600 if (value != 0)
6601 return value;
6603 break;
6605 case 'E':
6606 value = do_spec_1 (endfile_spec, 0, NULL);
6607 if (value != 0)
6608 return value;
6609 break;
6611 case 'l':
6612 value = do_spec_1 (link_spec, 0, NULL);
6613 if (value != 0)
6614 return value;
6615 break;
6617 case 'L':
6618 value = do_spec_1 (lib_spec, 0, NULL);
6619 if (value != 0)
6620 return value;
6621 break;
6623 case 'M':
6624 if (multilib_os_dir == NULL)
6625 obstack_1grow (&obstack, '.');
6626 else
6627 obstack_grow (&obstack, multilib_os_dir,
6628 strlen (multilib_os_dir));
6629 break;
6631 case 'G':
6632 value = do_spec_1 (libgcc_spec, 0, NULL);
6633 if (value != 0)
6634 return value;
6635 break;
6637 case 'R':
6638 /* We assume there is a directory
6639 separator at the end of this string. */
6640 if (target_system_root)
6642 obstack_grow (&obstack, target_system_root,
6643 strlen (target_system_root));
6644 if (target_sysroot_suffix)
6645 obstack_grow (&obstack, target_sysroot_suffix,
6646 strlen (target_sysroot_suffix));
6648 break;
6650 case 'S':
6651 value = do_spec_1 (startfile_spec, 0, NULL);
6652 if (value != 0)
6653 return value;
6654 break;
6656 /* Here we define characters other than letters and digits. */
6658 case '{':
6659 p = handle_braces (p);
6660 if (p == 0)
6661 return -1;
6662 break;
6664 case ':':
6665 p = handle_spec_function (p, NULL, soft_matched_part);
6666 if (p == 0)
6667 return -1;
6668 break;
6670 case '%':
6671 obstack_1grow (&obstack, '%');
6672 break;
6674 case '.':
6676 unsigned len = 0;
6678 while (p[len] && p[len] != ' ' && p[len] != '%')
6679 len++;
6680 suffix_subst = save_string (p - 1, len + 1);
6681 p += len;
6683 break;
6685 /* Henceforth ignore the option(s) matching the pattern
6686 after the %<. */
6687 case '<':
6688 case '>':
6690 unsigned len = 0;
6691 int have_wildcard = 0;
6692 int i;
6693 int switch_option;
6695 if (c == '>')
6696 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
6697 else
6698 switch_option = SWITCH_IGNORE;
6700 while (p[len] && p[len] != ' ' && p[len] != '\t')
6701 len++;
6703 if (p[len-1] == '*')
6704 have_wildcard = 1;
6706 for (i = 0; i < n_switches; i++)
6707 if (!strncmp (switches[i].part1, p, len - have_wildcard)
6708 && (have_wildcard || switches[i].part1[len] == '\0'))
6710 switches[i].live_cond |= switch_option;
6711 /* User switch be validated from validate_all_switches.
6712 when the definition is seen from the spec file.
6713 If not defined anywhere, will be rejected. */
6714 if (switches[i].known)
6715 switches[i].validated = true;
6718 p += len;
6720 break;
6722 case '*':
6723 if (soft_matched_part)
6725 if (soft_matched_part[0])
6726 do_spec_1 (soft_matched_part, 1, NULL);
6727 /* Only insert a space after the substitution if it is at the
6728 end of the current sequence. So if:
6730 "%{foo=*:bar%*}%{foo=*:one%*two}"
6732 matches -foo=hello then it will produce:
6734 barhello onehellotwo
6736 if (*p == 0 || *p == '}')
6737 do_spec_1 (" ", 0, NULL);
6739 else
6740 /* Catch the case where a spec string contains something like
6741 '%{foo:%*}'. i.e. there is no * in the pattern on the left
6742 hand side of the :. */
6743 error ("spec failure: %<%%*%> has not been initialized by pattern match");
6744 break;
6746 /* Process a string found as the value of a spec given by name.
6747 This feature allows individual machine descriptions
6748 to add and use their own specs. */
6749 case '(':
6751 const char *name = p;
6752 struct spec_list *sl;
6753 int len;
6755 /* The string after the S/P is the name of a spec that is to be
6756 processed. */
6757 while (*p && *p != ')')
6758 p++;
6760 /* See if it's in the list. */
6761 for (len = p - name, sl = specs; sl; sl = sl->next)
6762 if (sl->name_len == len && !strncmp (sl->name, name, len))
6764 name = *(sl->ptr_spec);
6765 #ifdef DEBUG_SPECS
6766 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
6767 sl->name, name);
6768 #endif
6769 break;
6772 if (sl)
6774 value = do_spec_1 (name, 0, NULL);
6775 if (value != 0)
6776 return value;
6779 /* Discard the closing paren. */
6780 if (*p)
6781 p++;
6783 break;
6785 case '"':
6786 /* End a previous argument, if there is one, then issue an
6787 empty argument. */
6788 end_going_arg ();
6789 arg_going = 1;
6790 end_going_arg ();
6791 break;
6793 default:
6794 error ("spec failure: unrecognized spec option %qc", c);
6795 break;
6797 break;
6799 case '\\':
6800 /* Backslash: treat next character as ordinary. */
6801 c = *p++;
6803 /* When adding more cases that previously matched default, make
6804 sure to adjust quote_spec_char_p as well. */
6806 /* Fall through. */
6807 default:
6808 /* Ordinary character: put it into the current argument. */
6809 obstack_1grow (&obstack, c);
6810 arg_going = 1;
6813 /* End of string. If we are processing a spec function, we need to
6814 end any pending argument. */
6815 if (processing_spec_function)
6816 end_going_arg ();
6818 return 0;
6821 /* Look up a spec function. */
6823 static const struct spec_function *
6824 lookup_spec_function (const char *name)
6826 const struct spec_function *sf;
6828 for (sf = static_spec_functions; sf->name != NULL; sf++)
6829 if (strcmp (sf->name, name) == 0)
6830 return sf;
6832 return NULL;
6835 /* Evaluate a spec function. */
6837 static const char *
6838 eval_spec_function (const char *func, const char *args,
6839 const char *soft_matched_part)
6841 const struct spec_function *sf;
6842 const char *funcval;
6844 /* Saved spec processing context. */
6845 vec<const_char_p> save_argbuf;
6847 int save_arg_going;
6848 int save_delete_this_arg;
6849 int save_this_is_output_file;
6850 int save_this_is_library_file;
6851 int save_input_from_pipe;
6852 int save_this_is_linker_script;
6853 const char *save_suffix_subst;
6855 int save_growing_size;
6856 void *save_growing_value = NULL;
6858 sf = lookup_spec_function (func);
6859 if (sf == NULL)
6860 fatal_error (input_location, "unknown spec function %qs", func);
6862 /* Push the spec processing context. */
6863 save_argbuf = argbuf;
6865 save_arg_going = arg_going;
6866 save_delete_this_arg = delete_this_arg;
6867 save_this_is_output_file = this_is_output_file;
6868 save_this_is_library_file = this_is_library_file;
6869 save_this_is_linker_script = this_is_linker_script;
6870 save_input_from_pipe = input_from_pipe;
6871 save_suffix_subst = suffix_subst;
6873 /* If we have some object growing now, finalize it so the args and function
6874 eval proceed from a cleared context. This is needed to prevent the first
6875 constructed arg from mistakenly including the growing value. We'll push
6876 this value back on the obstack once the function evaluation is done, to
6877 restore a consistent processing context for our caller. This is fine as
6878 the address of growing objects isn't guaranteed to remain stable until
6879 they are finalized, and we expect this situation to be rare enough for
6880 the extra copy not to be an issue. */
6881 save_growing_size = obstack_object_size (&obstack);
6882 if (save_growing_size > 0)
6883 save_growing_value = obstack_finish (&obstack);
6885 /* Create a new spec processing context, and build the function
6886 arguments. */
6888 alloc_args ();
6889 if (do_spec_2 (args, soft_matched_part) < 0)
6890 fatal_error (input_location, "error in arguments to spec function %qs",
6891 func);
6893 /* argbuf_index is an index for the next argument to be inserted, and
6894 so contains the count of the args already inserted. */
6896 funcval = (*sf->func) (argbuf.length (),
6897 argbuf.address ());
6899 /* Pop the spec processing context. */
6900 argbuf.release ();
6901 argbuf = save_argbuf;
6903 arg_going = save_arg_going;
6904 delete_this_arg = save_delete_this_arg;
6905 this_is_output_file = save_this_is_output_file;
6906 this_is_library_file = save_this_is_library_file;
6907 this_is_linker_script = save_this_is_linker_script;
6908 input_from_pipe = save_input_from_pipe;
6909 suffix_subst = save_suffix_subst;
6911 if (save_growing_size > 0)
6912 obstack_grow (&obstack, save_growing_value, save_growing_size);
6914 return funcval;
6917 /* Handle a spec function call of the form:
6919 %:function(args)
6921 ARGS is processed as a spec in a separate context and split into an
6922 argument vector in the normal fashion. The function returns a string
6923 containing a spec which we then process in the caller's context, or
6924 NULL if no processing is required.
6926 If RETVAL_NONNULL is not NULL, then store a bool whether function
6927 returned non-NULL.
6929 SOFT_MATCHED_PART holds the current value of a matched * pattern, which
6930 may be re-expanded with a %* as part of the function arguments. */
6932 static const char *
6933 handle_spec_function (const char *p, bool *retval_nonnull,
6934 const char *soft_matched_part)
6936 char *func, *args;
6937 const char *endp, *funcval;
6938 int count;
6940 processing_spec_function++;
6942 /* Get the function name. */
6943 for (endp = p; *endp != '\0'; endp++)
6945 if (*endp == '(') /* ) */
6946 break;
6947 /* Only allow [A-Za-z0-9], -, and _ in function names. */
6948 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
6949 fatal_error (input_location, "malformed spec function name");
6951 if (*endp != '(') /* ) */
6952 fatal_error (input_location, "no arguments for spec function");
6953 func = save_string (p, endp - p);
6954 p = ++endp;
6956 /* Get the arguments. */
6957 for (count = 0; *endp != '\0'; endp++)
6959 /* ( */
6960 if (*endp == ')')
6962 if (count == 0)
6963 break;
6964 count--;
6966 else if (*endp == '(') /* ) */
6967 count++;
6969 /* ( */
6970 if (*endp != ')')
6971 fatal_error (input_location, "malformed spec function arguments");
6972 args = save_string (p, endp - p);
6973 p = ++endp;
6975 /* p now points to just past the end of the spec function expression. */
6977 funcval = eval_spec_function (func, args, soft_matched_part);
6978 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
6979 p = NULL;
6980 if (retval_nonnull)
6981 *retval_nonnull = funcval != NULL;
6983 free (func);
6984 free (args);
6986 processing_spec_function--;
6988 return p;
6991 /* Inline subroutine of handle_braces. Returns true if the current
6992 input suffix matches the atom bracketed by ATOM and END_ATOM. */
6993 static inline bool
6994 input_suffix_matches (const char *atom, const char *end_atom)
6996 return (input_suffix
6997 && !strncmp (input_suffix, atom, end_atom - atom)
6998 && input_suffix[end_atom - atom] == '\0');
7001 /* Subroutine of handle_braces. Returns true if the current
7002 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
7003 static bool
7004 input_spec_matches (const char *atom, const char *end_atom)
7006 return (input_file_compiler
7007 && input_file_compiler->suffix
7008 && input_file_compiler->suffix[0] != '\0'
7009 && !strncmp (input_file_compiler->suffix + 1, atom,
7010 end_atom - atom)
7011 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
7014 /* Subroutine of handle_braces. Returns true if a switch
7015 matching the atom bracketed by ATOM and END_ATOM appeared on the
7016 command line. */
7017 static bool
7018 switch_matches (const char *atom, const char *end_atom, int starred)
7020 int i;
7021 int len = end_atom - atom;
7022 int plen = starred ? len : -1;
7024 for (i = 0; i < n_switches; i++)
7025 if (!strncmp (switches[i].part1, atom, len)
7026 && (starred || switches[i].part1[len] == '\0')
7027 && check_live_switch (i, plen))
7028 return true;
7030 /* Check if a switch with separated form matching the atom.
7031 We check -D and -U switches. */
7032 else if (switches[i].args != 0)
7034 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
7035 && *switches[i].part1 == atom[0])
7037 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
7038 && (starred || (switches[i].part1[1] == '\0'
7039 && switches[i].args[0][len - 1] == '\0'))
7040 && check_live_switch (i, (starred ? 1 : -1)))
7041 return true;
7045 return false;
7048 /* Inline subroutine of handle_braces. Mark all of the switches which
7049 match ATOM (extends to END_ATOM; STARRED indicates whether there
7050 was a star after the atom) for later processing. */
7051 static inline void
7052 mark_matching_switches (const char *atom, const char *end_atom, int starred)
7054 int i;
7055 int len = end_atom - atom;
7056 int plen = starred ? len : -1;
7058 for (i = 0; i < n_switches; i++)
7059 if (!strncmp (switches[i].part1, atom, len)
7060 && (starred || switches[i].part1[len] == '\0')
7061 && check_live_switch (i, plen))
7062 switches[i].ordering = 1;
7065 /* Inline subroutine of handle_braces. Process all the currently
7066 marked switches through give_switch, and clear the marks. */
7067 static inline void
7068 process_marked_switches (void)
7070 int i;
7072 for (i = 0; i < n_switches; i++)
7073 if (switches[i].ordering == 1)
7075 switches[i].ordering = 0;
7076 give_switch (i, 0);
7080 /* Handle a %{ ... } construct. P points just inside the leading {.
7081 Returns a pointer one past the end of the brace block, or 0
7082 if we call do_spec_1 and that returns -1. */
7084 static const char *
7085 handle_braces (const char *p)
7087 const char *atom, *end_atom;
7088 const char *d_atom = NULL, *d_end_atom = NULL;
7089 char *esc_buf = NULL, *d_esc_buf = NULL;
7090 int esc;
7091 const char *orig = p;
7093 bool a_is_suffix;
7094 bool a_is_spectype;
7095 bool a_is_starred;
7096 bool a_is_negated;
7097 bool a_matched;
7099 bool a_must_be_last = false;
7100 bool ordered_set = false;
7101 bool disjunct_set = false;
7102 bool disj_matched = false;
7103 bool disj_starred = true;
7104 bool n_way_choice = false;
7105 bool n_way_matched = false;
7107 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7111 if (a_must_be_last)
7112 goto invalid;
7114 /* Scan one "atom" (S in the description above of %{}, possibly
7115 with '!', '.', '@', ',', or '*' modifiers). */
7116 a_matched = false;
7117 a_is_suffix = false;
7118 a_is_starred = false;
7119 a_is_negated = false;
7120 a_is_spectype = false;
7122 SKIP_WHITE ();
7123 if (*p == '!')
7124 p++, a_is_negated = true;
7126 SKIP_WHITE ();
7127 if (*p == '%' && p[1] == ':')
7129 atom = NULL;
7130 end_atom = NULL;
7131 p = handle_spec_function (p + 2, &a_matched, NULL);
7133 else
7135 if (*p == '.')
7136 p++, a_is_suffix = true;
7137 else if (*p == ',')
7138 p++, a_is_spectype = true;
7140 atom = p;
7141 esc = 0;
7142 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7143 || *p == ',' || *p == '.' || *p == '@' || *p == '\\')
7145 if (*p == '\\')
7147 p++;
7148 if (!*p)
7149 fatal_error (input_location,
7150 "braced spec %qs ends in escape", orig);
7151 esc++;
7153 p++;
7155 end_atom = p;
7157 if (esc)
7159 const char *ap;
7160 char *ep;
7162 if (esc_buf && esc_buf != d_esc_buf)
7163 free (esc_buf);
7164 esc_buf = NULL;
7165 ep = esc_buf = (char *) xmalloc (end_atom - atom - esc + 1);
7166 for (ap = atom; ap != end_atom; ap++, ep++)
7168 if (*ap == '\\')
7169 ap++;
7170 *ep = *ap;
7172 *ep = '\0';
7173 atom = esc_buf;
7174 end_atom = ep;
7177 if (*p == '*')
7178 p++, a_is_starred = 1;
7181 SKIP_WHITE ();
7182 switch (*p)
7184 case '&': case '}':
7185 /* Substitute the switch(es) indicated by the current atom. */
7186 ordered_set = true;
7187 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
7188 || a_is_spectype || atom == end_atom)
7189 goto invalid;
7191 mark_matching_switches (atom, end_atom, a_is_starred);
7193 if (*p == '}')
7194 process_marked_switches ();
7195 break;
7197 case '|': case ':':
7198 /* Substitute some text if the current atom appears as a switch
7199 or suffix. */
7200 disjunct_set = true;
7201 if (ordered_set)
7202 goto invalid;
7204 if (atom && atom == end_atom)
7206 if (!n_way_choice || disj_matched || *p == '|'
7207 || a_is_negated || a_is_suffix || a_is_spectype
7208 || a_is_starred)
7209 goto invalid;
7211 /* An empty term may appear as the last choice of an
7212 N-way choice set; it means "otherwise". */
7213 a_must_be_last = true;
7214 disj_matched = !n_way_matched;
7215 disj_starred = false;
7217 else
7219 if ((a_is_suffix || a_is_spectype) && a_is_starred)
7220 goto invalid;
7222 if (!a_is_starred)
7223 disj_starred = false;
7225 /* Don't bother testing this atom if we already have a
7226 match. */
7227 if (!disj_matched && !n_way_matched)
7229 if (atom == NULL)
7230 /* a_matched is already set by handle_spec_function. */;
7231 else if (a_is_suffix)
7232 a_matched = input_suffix_matches (atom, end_atom);
7233 else if (a_is_spectype)
7234 a_matched = input_spec_matches (atom, end_atom);
7235 else
7236 a_matched = switch_matches (atom, end_atom, a_is_starred);
7238 if (a_matched != a_is_negated)
7240 disj_matched = true;
7241 d_atom = atom;
7242 d_end_atom = end_atom;
7243 d_esc_buf = esc_buf;
7248 if (*p == ':')
7250 /* Found the body, that is, the text to substitute if the
7251 current disjunction matches. */
7252 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
7253 disj_matched && !n_way_matched);
7254 if (p == 0)
7255 goto done;
7257 /* If we have an N-way choice, reset state for the next
7258 disjunction. */
7259 if (*p == ';')
7261 n_way_choice = true;
7262 n_way_matched |= disj_matched;
7263 disj_matched = false;
7264 disj_starred = true;
7265 d_atom = d_end_atom = NULL;
7268 break;
7270 default:
7271 goto invalid;
7274 while (*p++ != '}');
7276 done:
7277 if (d_esc_buf && d_esc_buf != esc_buf)
7278 free (d_esc_buf);
7279 if (esc_buf)
7280 free (esc_buf);
7282 return p;
7284 invalid:
7285 fatal_error (input_location, "braced spec %qs is invalid at %qc", orig, *p);
7287 #undef SKIP_WHITE
7290 /* Subroutine of handle_braces. Scan and process a brace substitution body
7291 (X in the description of %{} syntax). P points one past the colon;
7292 ATOM and END_ATOM bracket the first atom which was found to be true
7293 (present) in the current disjunction; STARRED indicates whether all
7294 the atoms in the current disjunction were starred (for syntax validation);
7295 MATCHED indicates whether the disjunction matched or not, and therefore
7296 whether or not the body is to be processed through do_spec_1 or just
7297 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
7298 returns -1. */
7300 static const char *
7301 process_brace_body (const char *p, const char *atom, const char *end_atom,
7302 int starred, int matched)
7304 const char *body, *end_body;
7305 unsigned int nesting_level;
7306 bool have_subst = false;
7308 /* Locate the closing } or ;, honoring nested braces.
7309 Trim trailing whitespace. */
7310 body = p;
7311 nesting_level = 1;
7312 for (;;)
7314 if (*p == '{')
7315 nesting_level++;
7316 else if (*p == '}')
7318 if (!--nesting_level)
7319 break;
7321 else if (*p == ';' && nesting_level == 1)
7322 break;
7323 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
7324 have_subst = true;
7325 else if (*p == '\0')
7326 goto invalid;
7327 p++;
7330 end_body = p;
7331 while (end_body[-1] == ' ' || end_body[-1] == '\t')
7332 end_body--;
7334 if (have_subst && !starred)
7335 goto invalid;
7337 if (matched)
7339 /* Copy the substitution body to permanent storage and execute it.
7340 If have_subst is false, this is a simple matter of running the
7341 body through do_spec_1... */
7342 char *string = save_string (body, end_body - body);
7343 if (!have_subst)
7345 if (do_spec_1 (string, 0, NULL) < 0)
7347 free (string);
7348 return 0;
7351 else
7353 /* ... but if have_subst is true, we have to process the
7354 body once for each matching switch, with %* set to the
7355 variant part of the switch. */
7356 unsigned int hard_match_len = end_atom - atom;
7357 int i;
7359 for (i = 0; i < n_switches; i++)
7360 if (!strncmp (switches[i].part1, atom, hard_match_len)
7361 && check_live_switch (i, hard_match_len))
7363 if (do_spec_1 (string, 0,
7364 &switches[i].part1[hard_match_len]) < 0)
7366 free (string);
7367 return 0;
7369 /* Pass any arguments this switch has. */
7370 give_switch (i, 1);
7371 suffix_subst = NULL;
7374 free (string);
7377 return p;
7379 invalid:
7380 fatal_error (input_location, "braced spec body %qs is invalid", body);
7383 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
7384 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
7385 spec, or -1 if either exact match or %* is used.
7387 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
7388 whose value does not begin with "no-" is obsoleted by the same value
7389 with the "no-", similarly for a switch with the "no-" prefix. */
7391 static int
7392 check_live_switch (int switchnum, int prefix_length)
7394 const char *name = switches[switchnum].part1;
7395 int i;
7397 /* If we already processed this switch and determined if it was
7398 live or not, return our past determination. */
7399 if (switches[switchnum].live_cond != 0)
7400 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
7401 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
7402 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
7403 == 0);
7405 /* In the common case of {<at-most-one-letter>*}, a negating
7406 switch would always match, so ignore that case. We will just
7407 send the conflicting switches to the compiler phase. */
7408 if (prefix_length >= 0 && prefix_length <= 1)
7409 return 1;
7411 /* Now search for duplicate in a manner that depends on the name. */
7412 switch (*name)
7414 case 'O':
7415 for (i = switchnum + 1; i < n_switches; i++)
7416 if (switches[i].part1[0] == 'O')
7418 switches[switchnum].validated = true;
7419 switches[switchnum].live_cond = SWITCH_FALSE;
7420 return 0;
7422 break;
7424 case 'W': case 'f': case 'm': case 'g':
7425 if (startswith (name + 1, "no-"))
7427 /* We have Xno-YYY, search for XYYY. */
7428 for (i = switchnum + 1; i < n_switches; i++)
7429 if (switches[i].part1[0] == name[0]
7430 && ! strcmp (&switches[i].part1[1], &name[4]))
7432 /* --specs are validated with the validate_switches mechanism. */
7433 if (switches[switchnum].known)
7434 switches[switchnum].validated = true;
7435 switches[switchnum].live_cond = SWITCH_FALSE;
7436 return 0;
7439 else
7441 /* We have XYYY, search for Xno-YYY. */
7442 for (i = switchnum + 1; i < n_switches; i++)
7443 if (switches[i].part1[0] == name[0]
7444 && switches[i].part1[1] == 'n'
7445 && switches[i].part1[2] == 'o'
7446 && switches[i].part1[3] == '-'
7447 && !strcmp (&switches[i].part1[4], &name[1]))
7449 /* --specs are validated with the validate_switches mechanism. */
7450 if (switches[switchnum].known)
7451 switches[switchnum].validated = true;
7452 switches[switchnum].live_cond = SWITCH_FALSE;
7453 return 0;
7456 break;
7459 /* Otherwise the switch is live. */
7460 switches[switchnum].live_cond |= SWITCH_LIVE;
7461 return 1;
7464 /* Pass a switch to the current accumulating command
7465 in the same form that we received it.
7466 SWITCHNUM identifies the switch; it is an index into
7467 the vector of switches gcc received, which is `switches'.
7468 This cannot fail since it never finishes a command line.
7470 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
7472 static void
7473 give_switch (int switchnum, int omit_first_word)
7475 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
7476 return;
7478 if (!omit_first_word)
7480 do_spec_1 ("-", 0, NULL);
7481 do_spec_1 (switches[switchnum].part1, 1, NULL);
7484 if (switches[switchnum].args != 0)
7486 const char **p;
7487 for (p = switches[switchnum].args; *p; p++)
7489 const char *arg = *p;
7491 do_spec_1 (" ", 0, NULL);
7492 if (suffix_subst)
7494 unsigned length = strlen (arg);
7495 int dot = 0;
7497 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
7498 if (arg[length] == '.')
7500 (CONST_CAST (char *, arg))[length] = 0;
7501 dot = 1;
7502 break;
7504 do_spec_1 (arg, 1, NULL);
7505 if (dot)
7506 (CONST_CAST (char *, arg))[length] = '.';
7507 do_spec_1 (suffix_subst, 1, NULL);
7509 else
7510 do_spec_1 (arg, 1, NULL);
7514 do_spec_1 (" ", 0, NULL);
7515 switches[switchnum].validated = true;
7518 /* Print GCC configuration (e.g. version, thread model, target,
7519 configuration_arguments) to a given FILE. */
7521 static void
7522 print_configuration (FILE *file)
7524 int n;
7525 const char *thrmod;
7527 fnotice (file, "Target: %s\n", spec_machine);
7528 fnotice (file, "Configured with: %s\n", configuration_arguments);
7530 #ifdef THREAD_MODEL_SPEC
7531 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7532 but there's no point in doing all this processing just to get
7533 thread_model back. */
7534 obstack_init (&obstack);
7535 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
7536 obstack_1grow (&obstack, '\0');
7537 thrmod = XOBFINISH (&obstack, const char *);
7538 #else
7539 thrmod = thread_model;
7540 #endif
7542 fnotice (file, "Thread model: %s\n", thrmod);
7543 fnotice (file, "Supported LTO compression algorithms: zlib");
7544 #ifdef HAVE_ZSTD_H
7545 fnotice (file, " zstd");
7546 #endif
7547 fnotice (file, "\n");
7549 /* compiler_version is truncated at the first space when initialized
7550 from version string, so truncate version_string at the first space
7551 before comparing. */
7552 for (n = 0; version_string[n]; n++)
7553 if (version_string[n] == ' ')
7554 break;
7556 if (! strncmp (version_string, compiler_version, n)
7557 && compiler_version[n] == 0)
7558 fnotice (file, "gcc version %s %s\n", version_string,
7559 pkgversion_string);
7560 else
7561 fnotice (file, "gcc driver version %s %sexecuting gcc version %s\n",
7562 version_string, pkgversion_string, compiler_version);
7566 #define RETRY_ICE_ATTEMPTS 3
7568 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
7570 static bool
7571 files_equal_p (char *file1, char *file2)
7573 struct stat st1, st2;
7574 off_t n, len;
7575 int fd1, fd2;
7576 const int bufsize = 8192;
7577 char *buf = XNEWVEC (char, bufsize);
7579 fd1 = open (file1, O_RDONLY);
7580 fd2 = open (file2, O_RDONLY);
7582 if (fd1 < 0 || fd2 < 0)
7583 goto error;
7585 if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
7586 goto error;
7588 if (st1.st_size != st2.st_size)
7589 goto error;
7591 for (n = st1.st_size; n; n -= len)
7593 len = n;
7594 if ((int) len > bufsize / 2)
7595 len = bufsize / 2;
7597 if (read (fd1, buf, len) != (int) len
7598 || read (fd2, buf + bufsize / 2, len) != (int) len)
7600 goto error;
7603 if (memcmp (buf, buf + bufsize / 2, len) != 0)
7604 goto error;
7607 free (buf);
7608 close (fd1);
7609 close (fd2);
7611 return 1;
7613 error:
7614 free (buf);
7615 close (fd1);
7616 close (fd2);
7617 return 0;
7620 /* Check that compiler's output doesn't differ across runs.
7621 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
7622 stdout and stderr for each compiler run. Return true if all of
7623 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
7625 static bool
7626 check_repro (char **temp_stdout_files, char **temp_stderr_files)
7628 int i;
7629 for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
7631 if (!files_equal_p (temp_stdout_files[i], temp_stdout_files[i + 1])
7632 || !files_equal_p (temp_stderr_files[i], temp_stderr_files[i + 1]))
7634 fnotice (stderr, "The bug is not reproducible, so it is"
7635 " likely a hardware or OS problem.\n");
7636 break;
7639 return i == RETRY_ICE_ATTEMPTS - 2;
7642 enum attempt_status {
7643 ATTEMPT_STATUS_FAIL_TO_RUN,
7644 ATTEMPT_STATUS_SUCCESS,
7645 ATTEMPT_STATUS_ICE
7649 /* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
7650 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
7651 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
7652 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
7653 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
7654 ATTEMPT_STATUS_SUCCESS otherwise. */
7656 static enum attempt_status
7657 run_attempt (const char **new_argv, const char *out_temp,
7658 const char *err_temp, int emit_system_info, int append)
7661 if (emit_system_info)
7663 FILE *file_out = fopen (err_temp, "a");
7664 print_configuration (file_out);
7665 fputs ("\n", file_out);
7666 fclose (file_out);
7669 int exit_status;
7670 const char *errmsg;
7671 struct pex_obj *pex;
7672 int err;
7673 int pex_flags = PEX_USE_PIPES | PEX_LAST;
7674 enum attempt_status status = ATTEMPT_STATUS_FAIL_TO_RUN;
7676 if (append)
7677 pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
7679 pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
7680 if (!pex)
7681 fatal_error (input_location, "%<pex_init%> failed: %m");
7683 errmsg = pex_run (pex, pex_flags, new_argv[0],
7684 CONST_CAST2 (char *const *, const char **, &new_argv[1]),
7685 out_temp, err_temp, &err);
7686 if (errmsg != NULL)
7688 errno = err;
7689 fatal_error (input_location,
7690 err ? G_ ("cannot execute %qs: %s: %m")
7691 : G_ ("cannot execute %qs: %s"),
7692 new_argv[0], errmsg);
7695 if (!pex_get_status (pex, 1, &exit_status))
7696 goto out;
7698 switch (WEXITSTATUS (exit_status))
7700 case ICE_EXIT_CODE:
7701 status = ATTEMPT_STATUS_ICE;
7702 break;
7704 case SUCCESS_EXIT_CODE:
7705 status = ATTEMPT_STATUS_SUCCESS;
7706 break;
7708 default:
7712 out:
7713 pex_free (pex);
7714 return status;
7717 /* This routine reads lines from IN file, adds C++ style comments
7718 at the begining of each line and writes result into OUT. */
7720 static void
7721 insert_comments (const char *file_in, const char *file_out)
7723 FILE *in = fopen (file_in, "rb");
7724 FILE *out = fopen (file_out, "wb");
7725 char line[256];
7727 bool add_comment = true;
7728 while (fgets (line, sizeof (line), in))
7730 if (add_comment)
7731 fputs ("// ", out);
7732 fputs (line, out);
7733 add_comment = strchr (line, '\n') != NULL;
7736 fclose (in);
7737 fclose (out);
7740 /* This routine adds preprocessed source code into the given ERR_FILE.
7741 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
7742 add information in report file. RUN_ATTEMPT should return
7743 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
7745 static void
7746 do_report_bug (const char **new_argv, const int nargs,
7747 char **out_file, char **err_file)
7749 int i, status;
7750 int fd = open (*out_file, O_RDWR | O_APPEND);
7751 if (fd < 0)
7752 return;
7753 write (fd, "\n//", 3);
7754 for (i = 0; i < nargs; i++)
7756 write (fd, " ", 1);
7757 write (fd, new_argv[i], strlen (new_argv[i]));
7759 write (fd, "\n\n", 2);
7760 close (fd);
7761 new_argv[nargs] = "-E";
7762 new_argv[nargs + 1] = NULL;
7764 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
7766 if (status == ATTEMPT_STATUS_SUCCESS)
7768 fnotice (stderr, "Preprocessed source stored into %s file,"
7769 " please attach this to your bugreport.\n", *out_file);
7770 /* Make sure it is not deleted. */
7771 free (*out_file);
7772 *out_file = NULL;
7776 /* Try to reproduce ICE. If bug is reproducible, generate report .err file
7777 containing GCC configuration, backtrace, compiler's command line options
7778 and preprocessed source code. */
7780 static void
7781 try_generate_repro (const char **argv)
7783 int i, nargs, out_arg = -1, quiet = 0, attempt;
7784 const char **new_argv;
7785 char *temp_files[RETRY_ICE_ATTEMPTS * 2];
7786 char **temp_stdout_files = &temp_files[0];
7787 char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
7789 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
7790 return;
7792 for (nargs = 0; argv[nargs] != NULL; ++nargs)
7793 /* Only retry compiler ICEs, not preprocessor ones. */
7794 if (! strcmp (argv[nargs], "-E"))
7795 return;
7796 else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
7798 if (out_arg == -1)
7799 out_arg = nargs;
7800 else
7801 return;
7803 /* If the compiler is going to output any time information,
7804 it might varry between invocations. */
7805 else if (! strcmp (argv[nargs], "-quiet"))
7806 quiet = 1;
7807 else if (! strcmp (argv[nargs], "-ftime-report"))
7808 return;
7810 if (out_arg == -1 || !quiet)
7811 return;
7813 memset (temp_files, '\0', sizeof (temp_files));
7814 new_argv = XALLOCAVEC (const char *, nargs + 4);
7815 memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
7816 new_argv[nargs++] = "-frandom-seed=0";
7817 new_argv[nargs++] = "-fdump-noaddr";
7818 new_argv[nargs] = NULL;
7819 if (new_argv[out_arg][2] == '\0')
7820 new_argv[out_arg + 1] = "-";
7821 else
7822 new_argv[out_arg] = "-o-";
7824 int status;
7825 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
7827 int emit_system_info = 0;
7828 int append = 0;
7829 temp_stdout_files[attempt] = make_temp_file (".out");
7830 temp_stderr_files[attempt] = make_temp_file (".err");
7832 if (attempt == RETRY_ICE_ATTEMPTS - 1)
7834 append = 1;
7835 emit_system_info = 1;
7838 status = run_attempt (new_argv, temp_stdout_files[attempt],
7839 temp_stderr_files[attempt], emit_system_info,
7840 append);
7842 if (status != ATTEMPT_STATUS_ICE)
7844 fnotice (stderr, "The bug is not reproducible, so it is"
7845 " likely a hardware or OS problem.\n");
7846 goto out;
7850 if (!check_repro (temp_stdout_files, temp_stderr_files))
7851 goto out;
7854 /* Insert commented out backtrace into report file. */
7855 char **stderr_commented = &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1];
7856 insert_comments (temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
7857 *stderr_commented);
7859 /* In final attempt we append compiler options and preprocesssed code to last
7860 generated .out file with configuration and backtrace. */
7861 char **err = &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1];
7862 do_report_bug (new_argv, nargs, stderr_commented, err);
7865 out:
7866 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
7867 if (temp_files[i])
7869 unlink (temp_stdout_files[i]);
7870 free (temp_stdout_files[i]);
7874 /* Search for a file named NAME trying various prefixes including the
7875 user's -B prefix and some standard ones.
7876 Return the absolute file name found. If nothing is found, return NAME. */
7878 static const char *
7879 find_file (const char *name)
7881 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
7882 return newname ? newname : name;
7885 /* Determine whether a directory exists. If LINKER, return 0 for
7886 certain fixed names not needed by the linker. */
7888 static int
7889 is_directory (const char *path1, bool linker)
7891 int len1;
7892 char *path;
7893 char *cp;
7894 struct stat st;
7896 /* Ensure the string ends with "/.". The resulting path will be a
7897 directory even if the given path is a symbolic link. */
7898 len1 = strlen (path1);
7899 path = (char *) alloca (3 + len1);
7900 memcpy (path, path1, len1);
7901 cp = path + len1;
7902 if (!IS_DIR_SEPARATOR (cp[-1]))
7903 *cp++ = DIR_SEPARATOR;
7904 *cp++ = '.';
7905 *cp = '\0';
7907 /* Exclude directories that the linker is known to search. */
7908 if (linker
7909 && IS_DIR_SEPARATOR (path[0])
7910 && ((cp - path == 6
7911 && filename_ncmp (path + 1, "lib", 3) == 0)
7912 || (cp - path == 10
7913 && filename_ncmp (path + 1, "usr", 3) == 0
7914 && IS_DIR_SEPARATOR (path[4])
7915 && filename_ncmp (path + 5, "lib", 3) == 0)))
7916 return 0;
7918 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
7921 /* Set up the various global variables to indicate that we're processing
7922 the input file named FILENAME. */
7924 void
7925 set_input (const char *filename)
7927 const char *p;
7929 gcc_input_filename = filename;
7930 input_filename_length = strlen (gcc_input_filename);
7931 input_basename = lbasename (gcc_input_filename);
7933 /* Find a suffix starting with the last period,
7934 and set basename_length to exclude that suffix. */
7935 basename_length = strlen (input_basename);
7936 suffixed_basename_length = basename_length;
7937 p = input_basename + basename_length;
7938 while (p != input_basename && *p != '.')
7939 --p;
7940 if (*p == '.' && p != input_basename)
7942 basename_length = p - input_basename;
7943 input_suffix = p + 1;
7945 else
7946 input_suffix = "";
7948 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
7949 we will need to do a stat on the gcc_input_filename. The
7950 INPUT_STAT_SET signals that the stat is needed. */
7951 input_stat_set = 0;
7954 /* On fatal signals, delete all the temporary files. */
7956 static void
7957 fatal_signal (int signum)
7959 signal (signum, SIG_DFL);
7960 delete_failure_queue ();
7961 delete_temp_files ();
7962 /* Get the same signal again, this time not handled,
7963 so its normal effect occurs. */
7964 kill (getpid (), signum);
7967 /* Compare the contents of the two files named CMPFILE[0] and
7968 CMPFILE[1]. Return zero if they're identical, nonzero
7969 otherwise. */
7971 static int
7972 compare_files (char *cmpfile[])
7974 int ret = 0;
7975 FILE *temp[2] = { NULL, NULL };
7976 int i;
7978 #if HAVE_MMAP_FILE
7980 size_t length[2];
7981 void *map[2] = { NULL, NULL };
7983 for (i = 0; i < 2; i++)
7985 struct stat st;
7987 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
7989 error ("%s: could not determine length of compare-debug file %s",
7990 gcc_input_filename, cmpfile[i]);
7991 ret = 1;
7992 break;
7995 length[i] = st.st_size;
7998 if (!ret && length[0] != length[1])
8000 error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename);
8001 ret = 1;
8004 if (!ret)
8005 for (i = 0; i < 2; i++)
8007 int fd = open (cmpfile[i], O_RDONLY);
8008 if (fd < 0)
8010 error ("%s: could not open compare-debug file %s",
8011 gcc_input_filename, cmpfile[i]);
8012 ret = 1;
8013 break;
8016 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
8017 close (fd);
8019 if (map[i] == (void *) MAP_FAILED)
8021 ret = -1;
8022 break;
8026 if (!ret)
8028 if (memcmp (map[0], map[1], length[0]) != 0)
8030 error ("%s: %<-fcompare-debug%> failure", gcc_input_filename);
8031 ret = 1;
8035 for (i = 0; i < 2; i++)
8036 if (map[i])
8037 munmap ((caddr_t) map[i], length[i]);
8039 if (ret >= 0)
8040 return ret;
8042 ret = 0;
8044 #endif
8046 for (i = 0; i < 2; i++)
8048 temp[i] = fopen (cmpfile[i], "r");
8049 if (!temp[i])
8051 error ("%s: could not open compare-debug file %s",
8052 gcc_input_filename, cmpfile[i]);
8053 ret = 1;
8054 break;
8058 if (!ret && temp[0] && temp[1])
8059 for (;;)
8061 int c0, c1;
8062 c0 = fgetc (temp[0]);
8063 c1 = fgetc (temp[1]);
8065 if (c0 != c1)
8067 error ("%s: %<-fcompare-debug%> failure",
8068 gcc_input_filename);
8069 ret = 1;
8070 break;
8073 if (c0 == EOF)
8074 break;
8077 for (i = 1; i >= 0; i--)
8079 if (temp[i])
8080 fclose (temp[i]);
8083 return ret;
8086 driver::driver (bool can_finalize, bool debug) :
8087 explicit_link_files (NULL),
8088 decoded_options (NULL)
8090 env.init (can_finalize, debug);
8093 driver::~driver ()
8095 XDELETEVEC (explicit_link_files);
8096 XDELETEVEC (decoded_options);
8099 /* driver::main is implemented as a series of driver:: method calls. */
8102 driver::main (int argc, char **argv)
8104 bool early_exit;
8106 set_progname (argv[0]);
8107 expand_at_files (&argc, &argv);
8108 decode_argv (argc, const_cast <const char **> (argv));
8109 global_initializations ();
8110 build_multilib_strings ();
8111 set_up_specs ();
8112 putenv_COLLECT_AS_OPTIONS (assembler_options);
8113 putenv_COLLECT_GCC (argv[0]);
8114 maybe_putenv_COLLECT_LTO_WRAPPER ();
8115 maybe_putenv_OFFLOAD_TARGETS ();
8116 handle_unrecognized_options ();
8118 if (completion)
8120 m_option_proposer.suggest_completion (completion);
8121 return 0;
8124 if (!maybe_print_and_exit ())
8125 return 0;
8127 early_exit = prepare_infiles ();
8128 if (early_exit)
8129 return get_exit_code ();
8131 do_spec_on_infiles ();
8132 maybe_run_linker (argv[0]);
8133 final_actions ();
8134 return get_exit_code ();
8137 /* Locate the final component of argv[0] after any leading path, and set
8138 the program name accordingly. */
8140 void
8141 driver::set_progname (const char *argv0) const
8143 const char *p = argv0 + strlen (argv0);
8144 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
8145 --p;
8146 progname = p;
8148 xmalloc_set_program_name (progname);
8151 /* Expand any @ files within the command-line args,
8152 setting at_file_supplied if any were expanded. */
8154 void
8155 driver::expand_at_files (int *argc, char ***argv) const
8157 char **old_argv = *argv;
8159 expandargv (argc, argv);
8161 /* Determine if any expansions were made. */
8162 if (*argv != old_argv)
8163 at_file_supplied = true;
8166 /* Decode the command-line arguments from argc/argv into the
8167 decoded_options array. */
8169 void
8170 driver::decode_argv (int argc, const char **argv)
8172 init_opts_obstack ();
8173 init_options_struct (&global_options, &global_options_set);
8175 decode_cmdline_options_to_array (argc, argv,
8176 CL_DRIVER,
8177 &decoded_options, &decoded_options_count);
8180 /* Perform various initializations and setup. */
8182 void
8183 driver::global_initializations ()
8185 /* Unlock the stdio streams. */
8186 unlock_std_streams ();
8188 gcc_init_libintl ();
8190 diagnostic_initialize (global_dc, 0);
8191 diagnostic_color_init (global_dc);
8192 diagnostic_urls_init (global_dc);
8194 #ifdef GCC_DRIVER_HOST_INITIALIZATION
8195 /* Perform host dependent initialization when needed. */
8196 GCC_DRIVER_HOST_INITIALIZATION;
8197 #endif
8199 if (atexit (delete_temp_files) != 0)
8200 fatal_error (input_location, "atexit failed");
8202 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
8203 signal (SIGINT, fatal_signal);
8204 #ifdef SIGHUP
8205 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
8206 signal (SIGHUP, fatal_signal);
8207 #endif
8208 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
8209 signal (SIGTERM, fatal_signal);
8210 #ifdef SIGPIPE
8211 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
8212 signal (SIGPIPE, fatal_signal);
8213 #endif
8214 #ifdef SIGCHLD
8215 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
8216 receive the signal. A different setting is inheritable */
8217 signal (SIGCHLD, SIG_DFL);
8218 #endif
8220 /* Parsing and gimplification sometimes need quite large stack.
8221 Increase stack size limits if possible. */
8222 stack_limit_increase (64 * 1024 * 1024);
8224 /* Allocate the argument vector. */
8225 alloc_args ();
8227 obstack_init (&obstack);
8230 /* Build multilib_select, et. al from the separate lines that make up each
8231 multilib selection. */
8233 void
8234 driver::build_multilib_strings () const
8237 const char *p;
8238 const char *const *q = multilib_raw;
8239 int need_space;
8241 obstack_init (&multilib_obstack);
8242 while ((p = *q++) != (char *) 0)
8243 obstack_grow (&multilib_obstack, p, strlen (p));
8245 obstack_1grow (&multilib_obstack, 0);
8246 multilib_select = XOBFINISH (&multilib_obstack, const char *);
8248 q = multilib_matches_raw;
8249 while ((p = *q++) != (char *) 0)
8250 obstack_grow (&multilib_obstack, p, strlen (p));
8252 obstack_1grow (&multilib_obstack, 0);
8253 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
8255 q = multilib_exclusions_raw;
8256 while ((p = *q++) != (char *) 0)
8257 obstack_grow (&multilib_obstack, p, strlen (p));
8259 obstack_1grow (&multilib_obstack, 0);
8260 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
8262 q = multilib_reuse_raw;
8263 while ((p = *q++) != (char *) 0)
8264 obstack_grow (&multilib_obstack, p, strlen (p));
8266 obstack_1grow (&multilib_obstack, 0);
8267 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
8269 need_space = FALSE;
8270 for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
8272 if (need_space)
8273 obstack_1grow (&multilib_obstack, ' ');
8274 obstack_grow (&multilib_obstack,
8275 multilib_defaults_raw[i],
8276 strlen (multilib_defaults_raw[i]));
8277 need_space = TRUE;
8280 obstack_1grow (&multilib_obstack, 0);
8281 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
8285 /* Set up the spec-handling machinery. */
8287 void
8288 driver::set_up_specs () const
8290 const char *spec_machine_suffix;
8291 char *specs_file;
8292 size_t i;
8294 #ifdef INIT_ENVIRONMENT
8295 /* Set up any other necessary machine specific environment variables. */
8296 xputenv (INIT_ENVIRONMENT);
8297 #endif
8299 /* Make a table of what switches there are (switches, n_switches).
8300 Make a table of specified input files (infiles, n_infiles).
8301 Decode switches that are handled locally. */
8303 process_command (decoded_options_count, decoded_options);
8305 /* Initialize the vector of specs to just the default.
8306 This means one element containing 0s, as a terminator. */
8308 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
8309 memcpy (compilers, default_compilers, sizeof default_compilers);
8310 n_compilers = n_default_compilers;
8312 /* Read specs from a file if there is one. */
8314 machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
8315 accel_dir_suffix, dir_separator_str, NULL);
8316 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
8318 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
8319 /* Read the specs file unless it is a default one. */
8320 if (specs_file != 0 && strcmp (specs_file, "specs"))
8321 read_specs (specs_file, true, false);
8322 else
8323 init_spec ();
8325 #ifdef ACCEL_COMPILER
8326 spec_machine_suffix = machine_suffix;
8327 #else
8328 spec_machine_suffix = just_machine_suffix;
8329 #endif
8331 /* We need to check standard_exec_prefix/spec_machine_suffix/specs
8332 for any override of as, ld and libraries. */
8333 specs_file = (char *) alloca (strlen (standard_exec_prefix)
8334 + strlen (spec_machine_suffix) + sizeof ("specs"));
8335 strcpy (specs_file, standard_exec_prefix);
8336 strcat (specs_file, spec_machine_suffix);
8337 strcat (specs_file, "specs");
8338 if (access (specs_file, R_OK) == 0)
8339 read_specs (specs_file, true, false);
8341 /* Process any configure-time defaults specified for the command line
8342 options, via OPTION_DEFAULT_SPECS. */
8343 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
8344 do_option_spec (option_default_specs[i].name,
8345 option_default_specs[i].spec);
8347 /* Process DRIVER_SELF_SPECS, adding any new options to the end
8348 of the command line. */
8350 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
8351 do_self_spec (driver_self_specs[i]);
8353 /* If not cross-compiling, look for executables in the standard
8354 places. */
8355 if (*cross_compile == '0')
8357 if (*md_exec_prefix)
8359 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
8360 PREFIX_PRIORITY_LAST, 0, 0);
8364 /* Process sysroot_suffix_spec. */
8365 if (*sysroot_suffix_spec != 0
8366 && !no_sysroot_suffix
8367 && do_spec_2 (sysroot_suffix_spec, NULL) == 0)
8369 if (argbuf.length () > 1)
8370 error ("spec failure: more than one argument to "
8371 "%<SYSROOT_SUFFIX_SPEC%>");
8372 else if (argbuf.length () == 1)
8373 target_sysroot_suffix = xstrdup (argbuf.last ());
8376 #ifdef HAVE_LD_SYSROOT
8377 /* Pass the --sysroot option to the linker, if it supports that. If
8378 there is a sysroot_suffix_spec, it has already been processed by
8379 this point, so target_system_root really is the system root we
8380 should be using. */
8381 if (target_system_root)
8383 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
8384 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
8385 set_spec ("link", XOBFINISH (&obstack, const char *), false);
8387 #endif
8389 /* Process sysroot_hdrs_suffix_spec. */
8390 if (*sysroot_hdrs_suffix_spec != 0
8391 && !no_sysroot_suffix
8392 && do_spec_2 (sysroot_hdrs_suffix_spec, NULL) == 0)
8394 if (argbuf.length () > 1)
8395 error ("spec failure: more than one argument "
8396 "to %<SYSROOT_HEADERS_SUFFIX_SPEC%>");
8397 else if (argbuf.length () == 1)
8398 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
8401 /* Look for startfiles in the standard places. */
8402 if (*startfile_prefix_spec != 0
8403 && do_spec_2 (startfile_prefix_spec, NULL) == 0
8404 && do_spec_1 (" ", 0, NULL) == 0)
8406 for (const char *arg : argbuf)
8407 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
8408 PREFIX_PRIORITY_LAST, 0, 1);
8410 /* We should eventually get rid of all these and stick to
8411 startfile_prefix_spec exclusively. */
8412 else if (*cross_compile == '0' || target_system_root)
8414 if (*md_startfile_prefix)
8415 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
8416 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
8418 if (*md_startfile_prefix_1)
8419 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
8420 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
8422 /* If standard_startfile_prefix is relative, base it on
8423 standard_exec_prefix. This lets us move the installed tree
8424 as a unit. If GCC_EXEC_PREFIX is defined, base
8425 standard_startfile_prefix on that as well.
8427 If the prefix is relative, only search it for native compilers;
8428 otherwise we will search a directory containing host libraries. */
8429 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
8430 add_sysrooted_prefix (&startfile_prefixes,
8431 standard_startfile_prefix, "BINUTILS",
8432 PREFIX_PRIORITY_LAST, 0, 1);
8433 else if (*cross_compile == '0')
8435 add_prefix (&startfile_prefixes,
8436 concat (gcc_exec_prefix
8437 ? gcc_exec_prefix : standard_exec_prefix,
8438 machine_suffix,
8439 standard_startfile_prefix, NULL),
8440 NULL, PREFIX_PRIORITY_LAST, 0, 1);
8443 /* Sysrooted prefixes are relocated because target_system_root is
8444 also relocated by gcc_exec_prefix. */
8445 if (*standard_startfile_prefix_1)
8446 add_sysrooted_prefix (&startfile_prefixes,
8447 standard_startfile_prefix_1, "BINUTILS",
8448 PREFIX_PRIORITY_LAST, 0, 1);
8449 if (*standard_startfile_prefix_2)
8450 add_sysrooted_prefix (&startfile_prefixes,
8451 standard_startfile_prefix_2, "BINUTILS",
8452 PREFIX_PRIORITY_LAST, 0, 1);
8455 /* Process any user specified specs in the order given on the command
8456 line. */
8457 for (struct user_specs *uptr = user_specs_head; uptr; uptr = uptr->next)
8459 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
8460 R_OK, true);
8461 read_specs (filename ? filename : uptr->filename, false, true);
8464 /* Process any user self specs. */
8466 struct spec_list *sl;
8467 for (sl = specs; sl; sl = sl->next)
8468 if (sl->name_len == sizeof "self_spec" - 1
8469 && !strcmp (sl->name, "self_spec"))
8470 do_self_spec (*sl->ptr_spec);
8473 if (compare_debug)
8475 enum save_temps save;
8477 if (!compare_debug_second)
8479 n_switches_debug_check[1] = n_switches;
8480 n_switches_alloc_debug_check[1] = n_switches_alloc;
8481 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
8482 n_switches_alloc);
8484 do_self_spec ("%:compare-debug-self-opt()");
8485 n_switches_debug_check[0] = n_switches;
8486 n_switches_alloc_debug_check[0] = n_switches_alloc;
8487 switches_debug_check[0] = switches;
8489 n_switches = n_switches_debug_check[1];
8490 n_switches_alloc = n_switches_alloc_debug_check[1];
8491 switches = switches_debug_check[1];
8494 /* Avoid crash when computing %j in this early. */
8495 save = save_temps_flag;
8496 save_temps_flag = SAVE_TEMPS_NONE;
8498 compare_debug = -compare_debug;
8499 do_self_spec ("%:compare-debug-self-opt()");
8501 save_temps_flag = save;
8503 if (!compare_debug_second)
8505 n_switches_debug_check[1] = n_switches;
8506 n_switches_alloc_debug_check[1] = n_switches_alloc;
8507 switches_debug_check[1] = switches;
8508 compare_debug = -compare_debug;
8509 n_switches = n_switches_debug_check[0];
8510 n_switches_alloc = n_switches_debug_check[0];
8511 switches = switches_debug_check[0];
8516 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
8517 if (gcc_exec_prefix)
8518 gcc_exec_prefix = concat (gcc_exec_prefix, spec_host_machine,
8519 dir_separator_str, spec_version,
8520 accel_dir_suffix, dir_separator_str, NULL);
8522 /* Now we have the specs.
8523 Set the `valid' bits for switches that match anything in any spec. */
8525 validate_all_switches ();
8527 /* Now that we have the switches and the specs, set
8528 the subdirectory based on the options. */
8529 set_multilib_dir ();
8532 /* Set up to remember the pathname of gcc and any options
8533 needed for collect. We use argv[0] instead of progname because
8534 we need the complete pathname. */
8536 void
8537 driver::putenv_COLLECT_GCC (const char *argv0) const
8539 obstack_init (&collect_obstack);
8540 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
8541 obstack_grow (&collect_obstack, argv0, strlen (argv0) + 1);
8542 xputenv (XOBFINISH (&collect_obstack, char *));
8545 /* Set up to remember the pathname of the lto wrapper. */
8547 void
8548 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
8550 char *lto_wrapper_file;
8552 if (have_c)
8553 lto_wrapper_file = NULL;
8554 else
8555 lto_wrapper_file = find_a_program ("lto-wrapper");
8556 if (lto_wrapper_file)
8558 lto_wrapper_file = convert_white_space (lto_wrapper_file);
8559 set_static_spec_owned (&lto_wrapper_spec, lto_wrapper_file);
8560 obstack_init (&collect_obstack);
8561 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
8562 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
8563 obstack_grow (&collect_obstack, lto_wrapper_spec,
8564 strlen (lto_wrapper_spec) + 1);
8565 xputenv (XOBFINISH (&collect_obstack, char *));
8570 /* Set up to remember the names of offload targets. */
8572 void
8573 driver::maybe_putenv_OFFLOAD_TARGETS () const
8575 if (offload_targets && offload_targets[0] != '\0')
8577 obstack_grow (&collect_obstack, "OFFLOAD_TARGET_NAMES=",
8578 sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
8579 obstack_grow (&collect_obstack, offload_targets,
8580 strlen (offload_targets) + 1);
8581 xputenv (XOBFINISH (&collect_obstack, char *));
8582 #if OFFLOAD_DEFAULTED
8583 if (offload_targets_default)
8584 xputenv ("OFFLOAD_TARGET_DEFAULT=1");
8585 #endif
8588 free (offload_targets);
8589 offload_targets = NULL;
8592 /* Reject switches that no pass was interested in. */
8594 void
8595 driver::handle_unrecognized_options ()
8597 for (size_t i = 0; (int) i < n_switches; i++)
8598 if (! switches[i].validated)
8600 const char *hint = m_option_proposer.suggest_option (switches[i].part1);
8601 if (hint)
8602 error ("unrecognized command-line option %<-%s%>;"
8603 " did you mean %<-%s%>?",
8604 switches[i].part1, hint);
8605 else
8606 error ("unrecognized command-line option %<-%s%>",
8607 switches[i].part1);
8611 /* Handle the various -print-* options, returning 0 if the driver
8612 should exit, or nonzero if the driver should continue. */
8615 driver::maybe_print_and_exit () const
8617 if (print_search_dirs)
8619 printf (_("install: %s%s\n"),
8620 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
8621 gcc_exec_prefix ? "" : machine_suffix);
8622 printf (_("programs: %s\n"),
8623 build_search_list (&exec_prefixes, "", false, false));
8624 printf (_("libraries: %s\n"),
8625 build_search_list (&startfile_prefixes, "", false, true));
8626 return (0);
8629 if (print_file_name)
8631 printf ("%s\n", find_file (print_file_name));
8632 return (0);
8635 if (print_prog_name)
8637 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
8639 /* Append USE_LD to the default linker. */
8640 #ifdef DEFAULT_LINKER
8641 char *ld;
8642 # ifdef HAVE_HOST_EXECUTABLE_SUFFIX
8643 int len = (sizeof (DEFAULT_LINKER)
8644 - sizeof (HOST_EXECUTABLE_SUFFIX));
8645 ld = NULL;
8646 if (len > 0)
8648 char *default_linker = xstrdup (DEFAULT_LINKER);
8649 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
8650 HOST_EXECUTABLE_SUFFIX. */
8651 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
8653 default_linker[len] = '\0';
8654 ld = concat (default_linker, use_ld,
8655 HOST_EXECUTABLE_SUFFIX, NULL);
8658 if (ld == NULL)
8659 # endif
8660 ld = concat (DEFAULT_LINKER, use_ld, NULL);
8661 if (access (ld, X_OK) == 0)
8663 printf ("%s\n", ld);
8664 return (0);
8666 #endif
8667 print_prog_name = concat (print_prog_name, use_ld, NULL);
8669 char *newname = find_a_program (print_prog_name);
8670 printf ("%s\n", (newname ? newname : print_prog_name));
8671 return (0);
8674 if (print_multi_lib)
8676 print_multilib_info ();
8677 return (0);
8680 if (print_multi_directory)
8682 if (multilib_dir == NULL)
8683 printf (".\n");
8684 else
8685 printf ("%s\n", multilib_dir);
8686 return (0);
8689 if (print_multiarch)
8691 if (multiarch_dir == NULL)
8692 printf ("\n");
8693 else
8694 printf ("%s\n", multiarch_dir);
8695 return (0);
8698 if (print_sysroot)
8700 if (target_system_root)
8702 if (target_sysroot_suffix)
8703 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
8704 else
8705 printf ("%s\n", target_system_root);
8707 return (0);
8710 if (print_multi_os_directory)
8712 if (multilib_os_dir == NULL)
8713 printf (".\n");
8714 else
8715 printf ("%s\n", multilib_os_dir);
8716 return (0);
8719 if (print_sysroot_headers_suffix)
8721 if (*sysroot_hdrs_suffix_spec)
8723 printf("%s\n", (target_sysroot_hdrs_suffix
8724 ? target_sysroot_hdrs_suffix
8725 : ""));
8726 return (0);
8728 else
8729 /* The error status indicates that only one set of fixed
8730 headers should be built. */
8731 fatal_error (input_location,
8732 "not configured with sysroot headers suffix");
8735 if (print_help_list)
8737 display_help ();
8739 if (! verbose_flag)
8741 printf (_("\nFor bug reporting instructions, please see:\n"));
8742 printf ("%s.\n", bug_report_url);
8744 return (0);
8747 /* We do not exit here. Instead we have created a fake input file
8748 called 'help-dummy' which needs to be compiled, and we pass this
8749 on the various sub-processes, along with the --help switch.
8750 Ensure their output appears after ours. */
8751 fputc ('\n', stdout);
8752 fflush (stdout);
8755 if (print_version)
8757 printf (_("%s %s%s\n"), progname, pkgversion_string,
8758 version_string);
8759 printf ("Copyright %s 2023 Free Software Foundation, Inc.\n",
8760 _("(C)"));
8761 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
8762 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
8763 stdout);
8764 if (! verbose_flag)
8765 return 0;
8767 /* We do not exit here. We use the same mechanism of --help to print
8768 the version of the sub-processes. */
8769 fputc ('\n', stdout);
8770 fflush (stdout);
8773 if (verbose_flag)
8775 print_configuration (stderr);
8776 if (n_infiles == 0)
8777 return (0);
8780 return 1;
8783 /* Figure out what to do with each input file.
8784 Return true if we need to exit early from "main", false otherwise. */
8786 bool
8787 driver::prepare_infiles ()
8789 size_t i;
8790 int lang_n_infiles = 0;
8792 if (n_infiles == added_libraries)
8793 fatal_error (input_location, "no input files");
8795 if (seen_error ())
8796 /* Early exit needed from main. */
8797 return true;
8799 /* Make a place to record the compiler output file names
8800 that correspond to the input files. */
8802 i = n_infiles;
8803 i += lang_specific_extra_outfiles;
8804 outfiles = XCNEWVEC (const char *, i);
8806 /* Record which files were specified explicitly as link input. */
8808 explicit_link_files = XCNEWVEC (char, n_infiles);
8810 combine_inputs = have_o || flag_wpa;
8812 for (i = 0; (int) i < n_infiles; i++)
8814 const char *name = infiles[i].name;
8815 struct compiler *compiler = lookup_compiler (name,
8816 strlen (name),
8817 infiles[i].language);
8819 if (compiler && !(compiler->combinable))
8820 combine_inputs = false;
8822 if (lang_n_infiles > 0 && compiler != input_file_compiler
8823 && infiles[i].language && infiles[i].language[0] != '*')
8824 infiles[i].incompiler = compiler;
8825 else if (compiler)
8827 lang_n_infiles++;
8828 input_file_compiler = compiler;
8829 infiles[i].incompiler = compiler;
8831 else
8833 /* Since there is no compiler for this input file, assume it is a
8834 linker file. */
8835 explicit_link_files[i] = 1;
8836 infiles[i].incompiler = NULL;
8838 infiles[i].compiled = false;
8839 infiles[i].preprocessed = false;
8842 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
8843 fatal_error (input_location,
8844 "cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> "
8845 "with multiple files");
8847 /* No early exit needed from main; we can continue. */
8848 return false;
8851 /* Run the spec machinery on each input file. */
8853 void
8854 driver::do_spec_on_infiles () const
8856 size_t i;
8858 for (i = 0; (int) i < n_infiles; i++)
8860 int this_file_error = 0;
8862 /* Tell do_spec what to substitute for %i. */
8864 input_file_number = i;
8865 set_input (infiles[i].name);
8867 if (infiles[i].compiled)
8868 continue;
8870 /* Use the same thing in %o, unless cp->spec says otherwise. */
8872 outfiles[i] = gcc_input_filename;
8874 /* Figure out which compiler from the file's suffix. */
8876 input_file_compiler
8877 = lookup_compiler (infiles[i].name, input_filename_length,
8878 infiles[i].language);
8880 if (input_file_compiler)
8882 /* Ok, we found an applicable compiler. Run its spec. */
8884 if (input_file_compiler->spec[0] == '#')
8886 error ("%s: %s compiler not installed on this system",
8887 gcc_input_filename, &input_file_compiler->spec[1]);
8888 this_file_error = 1;
8890 else
8892 int value;
8894 if (compare_debug)
8896 free (debug_check_temp_file[0]);
8897 debug_check_temp_file[0] = NULL;
8899 free (debug_check_temp_file[1]);
8900 debug_check_temp_file[1] = NULL;
8903 value = do_spec (input_file_compiler->spec);
8904 infiles[i].compiled = true;
8905 if (value < 0)
8906 this_file_error = 1;
8907 else if (compare_debug && debug_check_temp_file[0])
8909 if (verbose_flag)
8910 inform (UNKNOWN_LOCATION,
8911 "recompiling with %<-fcompare-debug%>");
8913 compare_debug = -compare_debug;
8914 n_switches = n_switches_debug_check[1];
8915 n_switches_alloc = n_switches_alloc_debug_check[1];
8916 switches = switches_debug_check[1];
8918 value = do_spec (input_file_compiler->spec);
8920 compare_debug = -compare_debug;
8921 n_switches = n_switches_debug_check[0];
8922 n_switches_alloc = n_switches_alloc_debug_check[0];
8923 switches = switches_debug_check[0];
8925 if (value < 0)
8927 error ("during %<-fcompare-debug%> recompilation");
8928 this_file_error = 1;
8931 gcc_assert (debug_check_temp_file[1]
8932 && filename_cmp (debug_check_temp_file[0],
8933 debug_check_temp_file[1]));
8935 if (verbose_flag)
8936 inform (UNKNOWN_LOCATION, "comparing final insns dumps");
8938 if (compare_files (debug_check_temp_file))
8939 this_file_error = 1;
8942 if (compare_debug)
8944 free (debug_check_temp_file[0]);
8945 debug_check_temp_file[0] = NULL;
8947 free (debug_check_temp_file[1]);
8948 debug_check_temp_file[1] = NULL;
8953 /* If this file's name does not contain a recognized suffix,
8954 record it as explicit linker input. */
8956 else
8957 explicit_link_files[i] = 1;
8959 /* Clear the delete-on-failure queue, deleting the files in it
8960 if this compilation failed. */
8962 if (this_file_error)
8964 delete_failure_queue ();
8965 errorcount++;
8967 /* If this compilation succeeded, don't delete those files later. */
8968 clear_failure_queue ();
8971 /* Reset the input file name to the first compile/object file name, for use
8972 with %b in LINK_SPEC. We use the first input file that we can find
8973 a compiler to compile it instead of using infiles.language since for
8974 languages other than C we use aliases that we then lookup later. */
8975 if (n_infiles > 0)
8977 int i;
8979 for (i = 0; i < n_infiles ; i++)
8980 if (infiles[i].incompiler
8981 || (infiles[i].language && infiles[i].language[0] != '*'))
8983 set_input (infiles[i].name);
8984 break;
8988 if (!seen_error ())
8990 /* Make sure INPUT_FILE_NUMBER points to first available open
8991 slot. */
8992 input_file_number = n_infiles;
8993 if (lang_specific_pre_link ())
8994 errorcount++;
8998 /* If we have to run the linker, do it now. */
9000 void
9001 driver::maybe_run_linker (const char *argv0) const
9003 size_t i;
9004 int linker_was_run = 0;
9005 int num_linker_inputs;
9007 /* Determine if there are any linker input files. */
9008 num_linker_inputs = 0;
9009 for (i = 0; (int) i < n_infiles; i++)
9010 if (explicit_link_files[i] || outfiles[i] != NULL)
9011 num_linker_inputs++;
9013 /* Arrange for temporary file names created during linking to take
9014 on names related with the linker output rather than with the
9015 inputs when appropriate. */
9016 if (outbase && *outbase)
9018 if (dumpdir)
9020 char *tofree = dumpdir;
9021 gcc_checking_assert (strlen (dumpdir) == dumpdir_length);
9022 dumpdir = concat (dumpdir, outbase, ".", NULL);
9023 free (tofree);
9025 else
9026 dumpdir = concat (outbase, ".", NULL);
9027 dumpdir_length += strlen (outbase) + 1;
9028 dumpdir_trailing_dash_added = true;
9030 else if (dumpdir_trailing_dash_added)
9032 gcc_assert (dumpdir[dumpdir_length - 1] == '-');
9033 dumpdir[dumpdir_length - 1] = '.';
9036 if (dumpdir_trailing_dash_added)
9038 gcc_assert (dumpdir_length > 0);
9039 gcc_assert (dumpdir[dumpdir_length - 1] == '.');
9040 dumpdir_length--;
9043 free (outbase);
9044 input_basename = outbase = NULL;
9045 outbase_length = suffixed_basename_length = basename_length = 0;
9047 /* Run ld to link all the compiler output files. */
9049 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
9051 int tmp = execution_count;
9053 detect_jobserver ();
9055 if (! have_c)
9057 #if HAVE_LTO_PLUGIN > 0
9058 #if HAVE_LTO_PLUGIN == 2
9059 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
9060 #else
9061 const char *fuse_linker_plugin = "fuse-linker-plugin";
9062 #endif
9063 #endif
9065 /* We'll use ld if we can't find collect2. */
9066 if (! strcmp (linker_name_spec, "collect2"))
9068 char *s = find_a_program ("collect2");
9069 if (s == NULL)
9070 set_static_spec_shared (&linker_name_spec, "ld");
9073 #if HAVE_LTO_PLUGIN > 0
9074 #if HAVE_LTO_PLUGIN == 2
9075 if (!switch_matches (fno_use_linker_plugin,
9076 fno_use_linker_plugin
9077 + strlen (fno_use_linker_plugin), 0))
9078 #else
9079 if (switch_matches (fuse_linker_plugin,
9080 fuse_linker_plugin
9081 + strlen (fuse_linker_plugin), 0))
9082 #endif
9084 char *temp_spec = find_a_file (&exec_prefixes,
9085 LTOPLUGINSONAME, R_OK,
9086 false);
9087 if (!temp_spec)
9088 fatal_error (input_location,
9089 "%<-fuse-linker-plugin%>, but %s not found",
9090 LTOPLUGINSONAME);
9091 linker_plugin_file_spec = convert_white_space (temp_spec);
9093 #endif
9094 set_static_spec_shared (&lto_gcc_spec, argv0);
9097 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
9098 for collect. */
9099 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
9100 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
9102 if (print_subprocess_help == 1)
9104 printf (_("\nLinker options\n==============\n\n"));
9105 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
9106 " to the linker.\n\n"));
9107 fflush (stdout);
9109 int value = do_spec (link_command_spec);
9110 if (value < 0)
9111 errorcount = 1;
9112 linker_was_run = (tmp != execution_count);
9115 /* If options said don't run linker,
9116 complain about input files to be given to the linker. */
9118 if (! linker_was_run && !seen_error ())
9119 for (i = 0; (int) i < n_infiles; i++)
9120 if (explicit_link_files[i]
9121 && !(infiles[i].language && infiles[i].language[0] == '*'))
9123 warning (0, "%s: linker input file unused because linking not done",
9124 outfiles[i]);
9125 if (access (outfiles[i], F_OK) < 0)
9126 /* This is can be an indication the user specifed an errorneous
9127 separated option value, (or used the wrong prefix for an
9128 option). */
9129 error ("%s: linker input file not found: %m", outfiles[i]);
9133 /* The end of "main". */
9135 void
9136 driver::final_actions () const
9138 /* Delete some or all of the temporary files we made. */
9140 if (seen_error ())
9141 delete_failure_queue ();
9142 delete_temp_files ();
9144 if (print_help_list)
9146 printf (("\nFor bug reporting instructions, please see:\n"));
9147 printf ("%s\n", bug_report_url);
9151 /* Detect whether jobserver is active and working. If not drop
9152 --jobserver-auth from MAKEFLAGS. */
9154 void
9155 driver::detect_jobserver () const
9157 jobserver_info jinfo;
9158 if (!jinfo.is_active && !jinfo.skipped_makeflags.empty ())
9159 xputenv (xstrdup (jinfo.skipped_makeflags.c_str ()));
9162 /* Determine what the exit code of the driver should be. */
9165 driver::get_exit_code () const
9167 return (signal_count != 0 ? 2
9168 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
9169 : 0);
9172 /* Find the proper compilation spec for the file name NAME,
9173 whose length is LENGTH. LANGUAGE is the specified language,
9174 or 0 if this file is to be passed to the linker. */
9176 static struct compiler *
9177 lookup_compiler (const char *name, size_t length, const char *language)
9179 struct compiler *cp;
9181 /* If this was specified by the user to be a linker input, indicate that. */
9182 if (language != 0 && language[0] == '*')
9183 return 0;
9185 /* Otherwise, look for the language, if one is spec'd. */
9186 if (language != 0)
9188 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9189 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
9191 if (name != NULL && strcmp (name, "-") == 0
9192 && (strcmp (cp->suffix, "@c-header") == 0
9193 || strcmp (cp->suffix, "@c++-header") == 0)
9194 && !have_E)
9195 fatal_error (input_location,
9196 "cannot use %<-%> as input filename for a "
9197 "precompiled header");
9199 return cp;
9202 error ("language %s not recognized", language);
9203 return 0;
9206 /* Look for a suffix. */
9207 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9209 if (/* The suffix `-' matches only the file name `-'. */
9210 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
9211 || (strlen (cp->suffix) < length
9212 /* See if the suffix matches the end of NAME. */
9213 && !strcmp (cp->suffix,
9214 name + length - strlen (cp->suffix))
9216 break;
9219 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
9220 /* Look again, but case-insensitively this time. */
9221 if (cp < compilers)
9222 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9224 if (/* The suffix `-' matches only the file name `-'. */
9225 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
9226 || (strlen (cp->suffix) < length
9227 /* See if the suffix matches the end of NAME. */
9228 && ((!strcmp (cp->suffix,
9229 name + length - strlen (cp->suffix))
9230 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
9231 && !strcasecmp (cp->suffix,
9232 name + length - strlen (cp->suffix)))
9234 break;
9236 #endif
9238 if (cp >= compilers)
9240 if (cp->spec[0] != '@')
9241 /* A non-alias entry: return it. */
9242 return cp;
9244 /* An alias entry maps a suffix to a language.
9245 Search for the language; pass 0 for NAME and LENGTH
9246 to avoid infinite recursion if language not found. */
9247 return lookup_compiler (NULL, 0, cp->spec + 1);
9249 return 0;
9252 static char *
9253 save_string (const char *s, int len)
9255 char *result = XNEWVEC (char, len + 1);
9257 gcc_checking_assert (strlen (s) >= (unsigned int) len);
9258 memcpy (result, s, len);
9259 result[len] = 0;
9260 return result;
9264 static inline void
9265 validate_switches_from_spec (const char *spec, bool user)
9267 const char *p = spec;
9268 char c;
9269 while ((c = *p++))
9270 if (c == '%'
9271 && (*p == '{'
9272 || *p == '<'
9273 || (*p == 'W' && *++p == '{')
9274 || (*p == '@' && *++p == '{')))
9275 /* We have a switch spec. */
9276 p = validate_switches (p + 1, user, *p == '{');
9279 static void
9280 validate_all_switches (void)
9282 struct compiler *comp;
9283 struct spec_list *spec;
9285 for (comp = compilers; comp->spec; comp++)
9286 validate_switches_from_spec (comp->spec, false);
9288 /* Look through the linked list of specs read from the specs file. */
9289 for (spec = specs; spec; spec = spec->next)
9290 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
9292 validate_switches_from_spec (link_command_spec, false);
9295 /* Look at the switch-name that comes after START and mark as valid
9296 all supplied switches that match it. If BRACED, handle other
9297 switches after '|' and '&', and specs after ':' until ';' or '}',
9298 going back for more switches after ';'. Without BRACED, handle
9299 only one atom. Return a pointer to whatever follows the handled
9300 items, after the closing brace if BRACED. */
9302 static const char *
9303 validate_switches (const char *start, bool user_spec, bool braced)
9305 const char *p = start;
9306 const char *atom;
9307 size_t len;
9308 int i;
9309 bool suffix;
9310 bool starred;
9312 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
9314 next_member:
9315 suffix = false;
9316 starred = false;
9318 SKIP_WHITE ();
9320 if (*p == '!')
9321 p++;
9323 SKIP_WHITE ();
9324 if (*p == '.' || *p == ',')
9325 suffix = true, p++;
9327 atom = p;
9328 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
9329 || *p == ',' || *p == '.' || *p == '@')
9330 p++;
9331 len = p - atom;
9333 if (*p == '*')
9334 starred = true, p++;
9336 SKIP_WHITE ();
9338 if (!suffix)
9340 /* Mark all matching switches as valid. */
9341 for (i = 0; i < n_switches; i++)
9342 if (!strncmp (switches[i].part1, atom, len)
9343 && (starred || switches[i].part1[len] == '\0')
9344 && (switches[i].known || user_spec))
9345 switches[i].validated = true;
9348 if (!braced)
9349 return p;
9351 if (*p) p++;
9352 if (*p && (p[-1] == '|' || p[-1] == '&'))
9353 goto next_member;
9355 if (*p && p[-1] == ':')
9357 while (*p && *p != ';' && *p != '}')
9359 if (*p == '%')
9361 p++;
9362 if (*p == '{' || *p == '<')
9363 p = validate_switches (p+1, user_spec, *p == '{');
9364 else if (p[0] == 'W' && p[1] == '{')
9365 p = validate_switches (p+2, user_spec, true);
9366 else if (p[0] == '@' && p[1] == '{')
9367 p = validate_switches (p+2, user_spec, true);
9369 else
9370 p++;
9373 if (*p) p++;
9374 if (*p && p[-1] == ';')
9375 goto next_member;
9378 return p;
9379 #undef SKIP_WHITE
9382 struct mdswitchstr
9384 const char *str;
9385 int len;
9388 static struct mdswitchstr *mdswitches;
9389 static int n_mdswitches;
9391 /* Check whether a particular argument was used. The first time we
9392 canonicalize the switches to keep only the ones we care about. */
9394 struct used_arg_t
9396 public:
9397 int operator () (const char *p, int len);
9398 void finalize ();
9400 private:
9401 struct mswitchstr
9403 const char *str;
9404 const char *replace;
9405 int len;
9406 int rep_len;
9409 mswitchstr *mswitches;
9410 int n_mswitches;
9414 used_arg_t used_arg;
9417 used_arg_t::operator () (const char *p, int len)
9419 int i, j;
9421 if (!mswitches)
9423 struct mswitchstr *matches;
9424 const char *q;
9425 int cnt = 0;
9427 /* Break multilib_matches into the component strings of string
9428 and replacement string. */
9429 for (q = multilib_matches; *q != '\0'; q++)
9430 if (*q == ';')
9431 cnt++;
9433 matches
9434 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
9435 i = 0;
9436 q = multilib_matches;
9437 while (*q != '\0')
9439 matches[i].str = q;
9440 while (*q != ' ')
9442 if (*q == '\0')
9444 invalid_matches:
9445 fatal_error (input_location, "multilib spec %qs is invalid",
9446 multilib_matches);
9448 q++;
9450 matches[i].len = q - matches[i].str;
9452 matches[i].replace = ++q;
9453 while (*q != ';' && *q != '\0')
9455 if (*q == ' ')
9456 goto invalid_matches;
9457 q++;
9459 matches[i].rep_len = q - matches[i].replace;
9460 i++;
9461 if (*q == ';')
9462 q++;
9465 /* Now build a list of the replacement string for switches that we care
9466 about. Make sure we allocate at least one entry. This prevents
9467 xmalloc from calling fatal, and prevents us from re-executing this
9468 block of code. */
9469 mswitches
9470 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
9471 for (i = 0; i < n_switches; i++)
9472 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
9474 int xlen = strlen (switches[i].part1);
9475 for (j = 0; j < cnt; j++)
9476 if (xlen == matches[j].len
9477 && ! strncmp (switches[i].part1, matches[j].str, xlen))
9479 mswitches[n_mswitches].str = matches[j].replace;
9480 mswitches[n_mswitches].len = matches[j].rep_len;
9481 mswitches[n_mswitches].replace = (char *) 0;
9482 mswitches[n_mswitches].rep_len = 0;
9483 n_mswitches++;
9484 break;
9488 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
9489 on the command line nor any options mutually incompatible with
9490 them. */
9491 for (i = 0; i < n_mdswitches; i++)
9493 const char *r;
9495 for (q = multilib_options; *q != '\0'; *q && q++)
9497 while (*q == ' ')
9498 q++;
9500 r = q;
9501 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
9502 || strchr (" /", q[mdswitches[i].len]) == NULL)
9504 while (*q != ' ' && *q != '/' && *q != '\0')
9505 q++;
9506 if (*q != '/')
9507 break;
9508 q++;
9511 if (*q != ' ' && *q != '\0')
9513 while (*r != ' ' && *r != '\0')
9515 q = r;
9516 while (*q != ' ' && *q != '/' && *q != '\0')
9517 q++;
9519 if (used_arg (r, q - r))
9520 break;
9522 if (*q != '/')
9524 mswitches[n_mswitches].str = mdswitches[i].str;
9525 mswitches[n_mswitches].len = mdswitches[i].len;
9526 mswitches[n_mswitches].replace = (char *) 0;
9527 mswitches[n_mswitches].rep_len = 0;
9528 n_mswitches++;
9529 break;
9532 r = q + 1;
9534 break;
9540 for (i = 0; i < n_mswitches; i++)
9541 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
9542 return 1;
9544 return 0;
9547 void used_arg_t::finalize ()
9549 XDELETEVEC (mswitches);
9550 mswitches = NULL;
9551 n_mswitches = 0;
9555 static int
9556 default_arg (const char *p, int len)
9558 int i;
9560 for (i = 0; i < n_mdswitches; i++)
9561 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
9562 return 1;
9564 return 0;
9567 /* Work out the subdirectory to use based on the options. The format of
9568 multilib_select is a list of elements. Each element is a subdirectory
9569 name followed by a list of options followed by a semicolon. The format
9570 of multilib_exclusions is the same, but without the preceding
9571 directory. First gcc will check the exclusions, if none of the options
9572 beginning with an exclamation point are present, and all of the other
9573 options are present, then we will ignore this completely. Passing
9574 that, gcc will consider each multilib_select in turn using the same
9575 rules for matching the options. If a match is found, that subdirectory
9576 will be used.
9577 A subdirectory name is optionally followed by a colon and the corresponding
9578 multiarch name. */
9580 static void
9581 set_multilib_dir (void)
9583 const char *p;
9584 unsigned int this_path_len;
9585 const char *this_path, *this_arg;
9586 const char *start, *end;
9587 int not_arg;
9588 int ok, ndfltok, first;
9590 n_mdswitches = 0;
9591 start = multilib_defaults;
9592 while (*start == ' ' || *start == '\t')
9593 start++;
9594 while (*start != '\0')
9596 n_mdswitches++;
9597 while (*start != ' ' && *start != '\t' && *start != '\0')
9598 start++;
9599 while (*start == ' ' || *start == '\t')
9600 start++;
9603 if (n_mdswitches)
9605 int i = 0;
9607 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
9608 for (start = multilib_defaults; *start != '\0'; start = end + 1)
9610 while (*start == ' ' || *start == '\t')
9611 start++;
9613 if (*start == '\0')
9614 break;
9616 for (end = start + 1;
9617 *end != ' ' && *end != '\t' && *end != '\0'; end++)
9620 obstack_grow (&multilib_obstack, start, end - start);
9621 obstack_1grow (&multilib_obstack, 0);
9622 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
9623 mdswitches[i++].len = end - start;
9625 if (*end == '\0')
9626 break;
9630 p = multilib_exclusions;
9631 while (*p != '\0')
9633 /* Ignore newlines. */
9634 if (*p == '\n')
9636 ++p;
9637 continue;
9640 /* Check the arguments. */
9641 ok = 1;
9642 while (*p != ';')
9644 if (*p == '\0')
9646 invalid_exclusions:
9647 fatal_error (input_location, "multilib exclusions %qs is invalid",
9648 multilib_exclusions);
9651 if (! ok)
9653 ++p;
9654 continue;
9657 this_arg = p;
9658 while (*p != ' ' && *p != ';')
9660 if (*p == '\0')
9661 goto invalid_exclusions;
9662 ++p;
9665 if (*this_arg != '!')
9666 not_arg = 0;
9667 else
9669 not_arg = 1;
9670 ++this_arg;
9673 ok = used_arg (this_arg, p - this_arg);
9674 if (not_arg)
9675 ok = ! ok;
9677 if (*p == ' ')
9678 ++p;
9681 if (ok)
9682 return;
9684 ++p;
9687 first = 1;
9688 p = multilib_select;
9690 /* Append multilib reuse rules if any. With those rules, we can reuse
9691 one multilib for certain different options sets. */
9692 if (strlen (multilib_reuse) > 0)
9693 p = concat (p, multilib_reuse, NULL);
9695 while (*p != '\0')
9697 /* Ignore newlines. */
9698 if (*p == '\n')
9700 ++p;
9701 continue;
9704 /* Get the initial path. */
9705 this_path = p;
9706 while (*p != ' ')
9708 if (*p == '\0')
9710 invalid_select:
9711 fatal_error (input_location, "multilib select %qs %qs is invalid",
9712 multilib_select, multilib_reuse);
9714 ++p;
9716 this_path_len = p - this_path;
9718 /* Check the arguments. */
9719 ok = 1;
9720 ndfltok = 1;
9721 ++p;
9722 while (*p != ';')
9724 if (*p == '\0')
9725 goto invalid_select;
9727 if (! ok)
9729 ++p;
9730 continue;
9733 this_arg = p;
9734 while (*p != ' ' && *p != ';')
9736 if (*p == '\0')
9737 goto invalid_select;
9738 ++p;
9741 if (*this_arg != '!')
9742 not_arg = 0;
9743 else
9745 not_arg = 1;
9746 ++this_arg;
9749 /* If this is a default argument, we can just ignore it.
9750 This is true even if this_arg begins with '!'. Beginning
9751 with '!' does not mean that this argument is necessarily
9752 inappropriate for this library: it merely means that
9753 there is a more specific library which uses this
9754 argument. If this argument is a default, we need not
9755 consider that more specific library. */
9756 ok = used_arg (this_arg, p - this_arg);
9757 if (not_arg)
9758 ok = ! ok;
9760 if (! ok)
9761 ndfltok = 0;
9763 if (default_arg (this_arg, p - this_arg))
9764 ok = 1;
9766 if (*p == ' ')
9767 ++p;
9770 if (ok && first)
9772 if (this_path_len != 1
9773 || this_path[0] != '.')
9775 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
9776 char *q;
9778 strncpy (new_multilib_dir, this_path, this_path_len);
9779 new_multilib_dir[this_path_len] = '\0';
9780 q = strchr (new_multilib_dir, ':');
9781 if (q != NULL)
9782 *q = '\0';
9783 multilib_dir = new_multilib_dir;
9785 first = 0;
9788 if (ndfltok)
9790 const char *q = this_path, *end = this_path + this_path_len;
9792 while (q < end && *q != ':')
9793 q++;
9794 if (q < end)
9796 const char *q2 = q + 1, *ml_end = end;
9797 char *new_multilib_os_dir;
9799 while (q2 < end && *q2 != ':')
9800 q2++;
9801 if (*q2 == ':')
9802 ml_end = q2;
9803 if (ml_end - q == 1)
9804 multilib_os_dir = xstrdup (".");
9805 else
9807 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
9808 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
9809 new_multilib_os_dir[ml_end - q - 1] = '\0';
9810 multilib_os_dir = new_multilib_os_dir;
9813 if (q2 < end && *q2 == ':')
9815 char *new_multiarch_dir = XNEWVEC (char, end - q2);
9816 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
9817 new_multiarch_dir[end - q2 - 1] = '\0';
9818 multiarch_dir = new_multiarch_dir;
9820 break;
9824 ++p;
9827 multilib_dir =
9828 targetm_common.compute_multilib (
9829 switches,
9830 n_switches,
9831 multilib_dir,
9832 multilib_defaults,
9833 multilib_select,
9834 multilib_matches,
9835 multilib_exclusions,
9836 multilib_reuse);
9838 if (multilib_dir == NULL && multilib_os_dir != NULL
9839 && strcmp (multilib_os_dir, ".") == 0)
9841 free (CONST_CAST (char *, multilib_os_dir));
9842 multilib_os_dir = NULL;
9844 else if (multilib_dir != NULL && multilib_os_dir == NULL)
9845 multilib_os_dir = multilib_dir;
9848 /* Print out the multiple library subdirectory selection
9849 information. This prints out a series of lines. Each line looks
9850 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
9851 required. Only the desired options are printed out, the negative
9852 matches. The options are print without a leading dash. There are
9853 no spaces to make it easy to use the information in the shell.
9854 Each subdirectory is printed only once. This assumes the ordering
9855 generated by the genmultilib script. Also, we leave out ones that match
9856 the exclusions. */
9858 static void
9859 print_multilib_info (void)
9861 const char *p = multilib_select;
9862 const char *last_path = 0, *this_path;
9863 int skip;
9864 int not_arg;
9865 unsigned int last_path_len = 0;
9867 while (*p != '\0')
9869 skip = 0;
9870 /* Ignore newlines. */
9871 if (*p == '\n')
9873 ++p;
9874 continue;
9877 /* Get the initial path. */
9878 this_path = p;
9879 while (*p != ' ')
9881 if (*p == '\0')
9883 invalid_select:
9884 fatal_error (input_location,
9885 "multilib select %qs is invalid", multilib_select);
9888 ++p;
9891 /* When --disable-multilib was used but target defines
9892 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
9893 with .:: for multiarch configurations) are there just to find
9894 multilib_os_dir, so skip them from output. */
9895 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
9896 skip = 1;
9898 /* Check for matches with the multilib_exclusions. We don't bother
9899 with the '!' in either list. If any of the exclusion rules match
9900 all of its options with the select rule, we skip it. */
9902 const char *e = multilib_exclusions;
9903 const char *this_arg;
9905 while (*e != '\0')
9907 int m = 1;
9908 /* Ignore newlines. */
9909 if (*e == '\n')
9911 ++e;
9912 continue;
9915 /* Check the arguments. */
9916 while (*e != ';')
9918 const char *q;
9919 int mp = 0;
9921 if (*e == '\0')
9923 invalid_exclusion:
9924 fatal_error (input_location,
9925 "multilib exclusion %qs is invalid",
9926 multilib_exclusions);
9929 if (! m)
9931 ++e;
9932 continue;
9935 this_arg = e;
9937 while (*e != ' ' && *e != ';')
9939 if (*e == '\0')
9940 goto invalid_exclusion;
9941 ++e;
9944 q = p + 1;
9945 while (*q != ';')
9947 const char *arg;
9948 int len = e - this_arg;
9950 if (*q == '\0')
9951 goto invalid_select;
9953 arg = q;
9955 while (*q != ' ' && *q != ';')
9957 if (*q == '\0')
9958 goto invalid_select;
9959 ++q;
9962 if (! strncmp (arg, this_arg,
9963 (len < q - arg) ? q - arg : len)
9964 || default_arg (this_arg, e - this_arg))
9966 mp = 1;
9967 break;
9970 if (*q == ' ')
9971 ++q;
9974 if (! mp)
9975 m = 0;
9977 if (*e == ' ')
9978 ++e;
9981 if (m)
9983 skip = 1;
9984 break;
9987 if (*e != '\0')
9988 ++e;
9992 if (! skip)
9994 /* If this is a duplicate, skip it. */
9995 skip = (last_path != 0
9996 && (unsigned int) (p - this_path) == last_path_len
9997 && ! filename_ncmp (last_path, this_path, last_path_len));
9999 last_path = this_path;
10000 last_path_len = p - this_path;
10003 /* If all required arguments are default arguments, and no default
10004 arguments appear in the ! argument list, then we can skip it.
10005 We will already have printed a directory identical to this one
10006 which does not require that default argument. */
10007 if (! skip)
10009 const char *q;
10010 bool default_arg_ok = false;
10012 q = p + 1;
10013 while (*q != ';')
10015 const char *arg;
10017 if (*q == '\0')
10018 goto invalid_select;
10020 if (*q == '!')
10022 not_arg = 1;
10023 q++;
10025 else
10026 not_arg = 0;
10027 arg = q;
10029 while (*q != ' ' && *q != ';')
10031 if (*q == '\0')
10032 goto invalid_select;
10033 ++q;
10036 if (default_arg (arg, q - arg))
10038 /* Stop checking if any default arguments appeared in not
10039 list. */
10040 if (not_arg)
10042 default_arg_ok = false;
10043 break;
10046 default_arg_ok = true;
10048 else if (!not_arg)
10050 /* Stop checking if any required argument is not provided by
10051 default arguments. */
10052 default_arg_ok = false;
10053 break;
10056 if (*q == ' ')
10057 ++q;
10060 /* Make sure all default argument is OK for this multi-lib set. */
10061 if (default_arg_ok)
10062 skip = 1;
10063 else
10064 skip = 0;
10067 if (! skip)
10069 const char *p1;
10071 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
10072 putchar (*p1);
10073 putchar (';');
10076 ++p;
10077 while (*p != ';')
10079 int use_arg;
10081 if (*p == '\0')
10082 goto invalid_select;
10084 if (skip)
10086 ++p;
10087 continue;
10090 use_arg = *p != '!';
10092 if (use_arg)
10093 putchar ('@');
10095 while (*p != ' ' && *p != ';')
10097 if (*p == '\0')
10098 goto invalid_select;
10099 if (use_arg)
10100 putchar (*p);
10101 ++p;
10104 if (*p == ' ')
10105 ++p;
10108 if (! skip)
10110 /* If there are extra options, print them now. */
10111 if (multilib_extra && *multilib_extra)
10113 int print_at = TRUE;
10114 const char *q;
10116 for (q = multilib_extra; *q != '\0'; q++)
10118 if (*q == ' ')
10119 print_at = TRUE;
10120 else
10122 if (print_at)
10123 putchar ('@');
10124 putchar (*q);
10125 print_at = FALSE;
10130 putchar ('\n');
10133 ++p;
10137 /* getenv built-in spec function.
10139 Returns the value of the environment variable given by its first argument,
10140 concatenated with the second argument. If the variable is not defined, a
10141 fatal error is issued unless such undefs are internally allowed, in which
10142 case the variable name prefixed by a '/' is used as the variable value.
10144 The leading '/' allows using the result at a spot where a full path would
10145 normally be expected and when the actual value doesn't really matter since
10146 undef vars are allowed. */
10148 static const char *
10149 getenv_spec_function (int argc, const char **argv)
10151 const char *value;
10152 const char *varname;
10154 char *result;
10155 char *ptr;
10156 size_t len;
10158 if (argc != 2)
10159 return NULL;
10161 varname = argv[0];
10162 value = env.get (varname);
10164 /* If the variable isn't defined and this is allowed, craft our expected
10165 return value. Assume variable names used in specs strings don't contain
10166 any active spec character so don't need escaping. */
10167 if (!value && spec_undefvar_allowed)
10169 result = XNEWVAR (char, strlen(varname) + 2);
10170 sprintf (result, "/%s", varname);
10171 return result;
10174 if (!value)
10175 fatal_error (input_location,
10176 "environment variable %qs not defined", varname);
10178 /* We have to escape every character of the environment variable so
10179 they are not interpreted as active spec characters. A
10180 particularly painful case is when we are reading a variable
10181 holding a windows path complete with \ separators. */
10182 len = strlen (value) * 2 + strlen (argv[1]) + 1;
10183 result = XNEWVAR (char, len);
10184 for (ptr = result; *value; ptr += 2)
10186 ptr[0] = '\\';
10187 ptr[1] = *value++;
10190 strcpy (ptr, argv[1]);
10192 return result;
10195 /* if-exists built-in spec function.
10197 Checks to see if the file specified by the absolute pathname in
10198 ARGS exists. Returns that pathname if found.
10200 The usual use for this function is to check for a library file
10201 (whose name has been expanded with %s). */
10203 static const char *
10204 if_exists_spec_function (int argc, const char **argv)
10206 /* Must have only one argument. */
10207 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10208 return argv[0];
10210 return NULL;
10213 /* if-exists-else built-in spec function.
10215 This is like if-exists, but takes an additional argument which
10216 is returned if the first argument does not exist. */
10218 static const char *
10219 if_exists_else_spec_function (int argc, const char **argv)
10221 /* Must have exactly two arguments. */
10222 if (argc != 2)
10223 return NULL;
10225 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10226 return argv[0];
10228 return argv[1];
10231 /* if-exists-then-else built-in spec function.
10233 Checks to see if the file specified by the absolute pathname in
10234 the first arg exists. Returns the second arg if so, otherwise returns
10235 the third arg if it is present. */
10237 static const char *
10238 if_exists_then_else_spec_function (int argc, const char **argv)
10241 /* Must have two or three arguments. */
10242 if (argc != 2 && argc != 3)
10243 return NULL;
10245 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10246 return argv[1];
10248 if (argc == 3)
10249 return argv[2];
10251 return NULL;
10254 /* sanitize built-in spec function.
10256 This returns non-NULL, if sanitizing address, thread or
10257 any of the undefined behavior sanitizers. */
10259 static const char *
10260 sanitize_spec_function (int argc, const char **argv)
10262 if (argc != 1)
10263 return NULL;
10265 if (strcmp (argv[0], "address") == 0)
10266 return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
10267 if (strcmp (argv[0], "hwaddress") == 0)
10268 return (flag_sanitize & SANITIZE_USER_HWADDRESS) ? "" : NULL;
10269 if (strcmp (argv[0], "kernel-address") == 0)
10270 return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
10271 if (strcmp (argv[0], "kernel-hwaddress") == 0)
10272 return (flag_sanitize & SANITIZE_KERNEL_HWADDRESS) ? "" : NULL;
10273 if (strcmp (argv[0], "thread") == 0)
10274 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
10275 if (strcmp (argv[0], "undefined") == 0)
10276 return ((flag_sanitize
10277 & ~flag_sanitize_trap
10278 & (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)))
10279 ? "" : NULL;
10280 if (strcmp (argv[0], "leak") == 0)
10281 return ((flag_sanitize
10282 & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
10283 == SANITIZE_LEAK) ? "" : NULL;
10284 return NULL;
10287 /* replace-outfile built-in spec function.
10289 This looks for the first argument in the outfiles array's name and
10290 replaces it with the second argument. */
10292 static const char *
10293 replace_outfile_spec_function (int argc, const char **argv)
10295 int i;
10296 /* Must have exactly two arguments. */
10297 if (argc != 2)
10298 abort ();
10300 for (i = 0; i < n_infiles; i++)
10302 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
10303 outfiles[i] = xstrdup (argv[1]);
10305 return NULL;
10308 /* remove-outfile built-in spec function.
10310 * This looks for the first argument in the outfiles array's name and
10311 * removes it. */
10313 static const char *
10314 remove_outfile_spec_function (int argc, const char **argv)
10316 int i;
10317 /* Must have exactly one argument. */
10318 if (argc != 1)
10319 abort ();
10321 for (i = 0; i < n_infiles; i++)
10323 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
10324 outfiles[i] = NULL;
10326 return NULL;
10329 /* Given two version numbers, compares the two numbers.
10330 A version number must match the regular expression
10331 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
10333 static int
10334 compare_version_strings (const char *v1, const char *v2)
10336 int rresult;
10337 regex_t r;
10339 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
10340 REG_EXTENDED | REG_NOSUB) != 0)
10341 abort ();
10342 rresult = regexec (&r, v1, 0, NULL, 0);
10343 if (rresult == REG_NOMATCH)
10344 fatal_error (input_location, "invalid version number %qs", v1);
10345 else if (rresult != 0)
10346 abort ();
10347 rresult = regexec (&r, v2, 0, NULL, 0);
10348 if (rresult == REG_NOMATCH)
10349 fatal_error (input_location, "invalid version number %qs", v2);
10350 else if (rresult != 0)
10351 abort ();
10353 return strverscmp (v1, v2);
10357 /* version_compare built-in spec function.
10359 This takes an argument of the following form:
10361 <comparison-op> <arg1> [<arg2>] <switch> <result>
10363 and produces "result" if the comparison evaluates to true,
10364 and nothing if it doesn't.
10366 The supported <comparison-op> values are:
10368 >= true if switch is a later (or same) version than arg1
10369 !> opposite of >=
10370 < true if switch is an earlier version than arg1
10371 !< opposite of <
10372 >< true if switch is arg1 or later, and earlier than arg2
10373 <> true if switch is earlier than arg1 or is arg2 or later
10375 If the switch is not present, the condition is false unless
10376 the first character of the <comparison-op> is '!'.
10378 For example,
10379 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
10380 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
10382 static const char *
10383 version_compare_spec_function (int argc, const char **argv)
10385 int comp1, comp2;
10386 size_t switch_len;
10387 const char *switch_value = NULL;
10388 int nargs = 1, i;
10389 bool result;
10391 if (argc < 3)
10392 fatal_error (input_location, "too few arguments to %%:version-compare");
10393 if (argv[0][0] == '\0')
10394 abort ();
10395 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
10396 nargs = 2;
10397 if (argc != nargs + 3)
10398 fatal_error (input_location, "too many arguments to %%:version-compare");
10400 switch_len = strlen (argv[nargs + 1]);
10401 for (i = 0; i < n_switches; i++)
10402 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
10403 && check_live_switch (i, switch_len))
10404 switch_value = switches[i].part1 + switch_len;
10406 if (switch_value == NULL)
10407 comp1 = comp2 = -1;
10408 else
10410 comp1 = compare_version_strings (switch_value, argv[1]);
10411 if (nargs == 2)
10412 comp2 = compare_version_strings (switch_value, argv[2]);
10413 else
10414 comp2 = -1; /* This value unused. */
10417 switch (argv[0][0] << 8 | argv[0][1])
10419 case '>' << 8 | '=':
10420 result = comp1 >= 0;
10421 break;
10422 case '!' << 8 | '<':
10423 result = comp1 >= 0 || switch_value == NULL;
10424 break;
10425 case '<' << 8:
10426 result = comp1 < 0;
10427 break;
10428 case '!' << 8 | '>':
10429 result = comp1 < 0 || switch_value == NULL;
10430 break;
10431 case '>' << 8 | '<':
10432 result = comp1 >= 0 && comp2 < 0;
10433 break;
10434 case '<' << 8 | '>':
10435 result = comp1 < 0 || comp2 >= 0;
10436 break;
10438 default:
10439 fatal_error (input_location,
10440 "unknown operator %qs in %%:version-compare", argv[0]);
10442 if (! result)
10443 return NULL;
10445 return argv[nargs + 2];
10448 /* %:include builtin spec function. This differs from %include in that it
10449 can be nested inside a spec, and thus be conditionalized. It takes
10450 one argument, the filename, and looks for it in the startfile path.
10451 The result is always NULL, i.e. an empty expansion. */
10453 static const char *
10454 include_spec_function (int argc, const char **argv)
10456 char *file;
10458 if (argc != 1)
10459 abort ();
10461 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
10462 read_specs (file ? file : argv[0], false, false);
10464 return NULL;
10467 /* %:find-file spec function. This function replaces its argument by
10468 the file found through find_file, that is the -print-file-name gcc
10469 program option. */
10470 static const char *
10471 find_file_spec_function (int argc, const char **argv)
10473 const char *file;
10475 if (argc != 1)
10476 abort ();
10478 file = find_file (argv[0]);
10479 return file;
10483 /* %:find-plugindir spec function. This function replaces its argument
10484 by the -iplugindir=<dir> option. `dir' is found through find_file, that
10485 is the -print-file-name gcc program option. */
10486 static const char *
10487 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
10489 const char *option;
10491 if (argc != 0)
10492 abort ();
10494 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
10495 return option;
10499 /* %:print-asm-header spec function. Print a banner to say that the
10500 following output is from the assembler. */
10502 static const char *
10503 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
10504 const char **argv ATTRIBUTE_UNUSED)
10506 printf (_("Assembler options\n=================\n\n"));
10507 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
10508 fflush (stdout);
10509 return NULL;
10512 /* Get a random number for -frandom-seed */
10514 static unsigned HOST_WIDE_INT
10515 get_random_number (void)
10517 unsigned HOST_WIDE_INT ret = 0;
10518 int fd;
10520 fd = open ("/dev/urandom", O_RDONLY);
10521 if (fd >= 0)
10523 read (fd, &ret, sizeof (HOST_WIDE_INT));
10524 close (fd);
10525 if (ret)
10526 return ret;
10529 /* Get some more or less random data. */
10530 #ifdef HAVE_GETTIMEOFDAY
10532 struct timeval tv;
10534 gettimeofday (&tv, NULL);
10535 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
10537 #else
10539 time_t now = time (NULL);
10541 if (now != (time_t)-1)
10542 ret = (unsigned) now;
10544 #endif
10546 return ret ^ getpid ();
10549 /* %:compare-debug-dump-opt spec function. Save the last argument,
10550 expected to be the last -fdump-final-insns option, or generate a
10551 temporary. */
10553 static const char *
10554 compare_debug_dump_opt_spec_function (int arg,
10555 const char **argv ATTRIBUTE_UNUSED)
10557 char *ret;
10558 char *name;
10559 int which;
10560 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
10562 if (arg != 0)
10563 fatal_error (input_location,
10564 "too many arguments to %%:compare-debug-dump-opt");
10566 do_spec_2 ("%{fdump-final-insns=*:%*}", NULL);
10567 do_spec_1 (" ", 0, NULL);
10569 if (argbuf.length () > 0
10570 && strcmp (argv[argbuf.length () - 1], ".") != 0)
10572 if (!compare_debug)
10573 return NULL;
10575 name = xstrdup (argv[argbuf.length () - 1]);
10576 ret = NULL;
10578 else
10580 if (argbuf.length () > 0)
10581 do_spec_2 ("%B.gkd", NULL);
10582 else if (!compare_debug)
10583 return NULL;
10584 else
10585 do_spec_2 ("%{!save-temps*:%g.gkd}%{save-temps*:%B.gkd}", NULL);
10587 do_spec_1 (" ", 0, NULL);
10589 gcc_assert (argbuf.length () > 0);
10591 name = xstrdup (argbuf.last ());
10593 char *arg = quote_spec (xstrdup (name));
10594 ret = concat ("-fdump-final-insns=", arg, NULL);
10595 free (arg);
10598 which = compare_debug < 0;
10599 debug_check_temp_file[which] = name;
10601 if (!which)
10603 unsigned HOST_WIDE_INT value = get_random_number ();
10605 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
10608 if (*random_seed)
10610 char *tmp = ret;
10611 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
10612 ret, NULL);
10613 free (tmp);
10616 if (which)
10617 *random_seed = 0;
10619 return ret;
10622 /* %:compare-debug-self-opt spec function. Expands to the options
10623 that are to be passed in the second compilation of
10624 compare-debug. */
10626 static const char *
10627 compare_debug_self_opt_spec_function (int arg,
10628 const char **argv ATTRIBUTE_UNUSED)
10630 if (arg != 0)
10631 fatal_error (input_location,
10632 "too many arguments to %%:compare-debug-self-opt");
10634 if (compare_debug >= 0)
10635 return NULL;
10637 return concat ("\
10638 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
10639 %<fdump-final-insns=* -w -S -o %j \
10640 %{!fcompare-debug-second:-fcompare-debug-second} \
10641 ", compare_debug_opt, NULL);
10644 /* %:pass-through-libs spec function. Finds all -l options and input
10645 file names in the lib spec passed to it, and makes a list of them
10646 prepended with the plugin option to cause them to be passed through
10647 to the final link after all the new object files have been added. */
10649 const char *
10650 pass_through_libs_spec_func (int argc, const char **argv)
10652 char *prepended = xstrdup (" ");
10653 int n;
10654 /* Shlemiel the painter's algorithm. Innately horrible, but at least
10655 we know that there will never be more than a handful of strings to
10656 concat, and it's only once per run, so it's not worth optimising. */
10657 for (n = 0; n < argc; n++)
10659 char *old = prepended;
10660 /* Anything that isn't an option is a full path to an output
10661 file; pass it through if it ends in '.a'. Among options,
10662 pass only -l. */
10663 if (argv[n][0] == '-' && argv[n][1] == 'l')
10665 const char *lopt = argv[n] + 2;
10666 /* Handle both joined and non-joined -l options. If for any
10667 reason there's a trailing -l with no joined or following
10668 arg just discard it. */
10669 if (!*lopt && ++n >= argc)
10670 break;
10671 else if (!*lopt)
10672 lopt = argv[n];
10673 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
10674 lopt, " ", NULL);
10676 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
10678 prepended = concat (prepended, "-plugin-opt=-pass-through=",
10679 argv[n], " ", NULL);
10681 if (prepended != old)
10682 free (old);
10684 return prepended;
10687 static bool
10688 not_actual_file_p (const char *name)
10690 return (strcmp (name, "-") == 0
10691 || strcmp (name, HOST_BIT_BUCKET) == 0);
10694 /* %:dumps spec function. Take an optional argument that overrides
10695 the default extension for -dumpbase and -dumpbase-ext.
10696 Return -dumpdir, -dumpbase and -dumpbase-ext, if needed. */
10697 const char *
10698 dumps_spec_func (int argc, const char **argv ATTRIBUTE_UNUSED)
10700 const char *ext = dumpbase_ext;
10701 char *p;
10703 char *args[3] = { NULL, NULL, NULL };
10704 int nargs = 0;
10706 /* Do not compute a default for -dumpbase-ext when -dumpbase was
10707 given explicitly. */
10708 if (dumpbase && *dumpbase && !ext)
10709 ext = "";
10711 if (argc == 1)
10713 /* Do not override the explicitly-specified -dumpbase-ext with
10714 the specs-provided overrider. */
10715 if (!ext)
10716 ext = argv[0];
10718 else if (argc != 0)
10719 fatal_error (input_location, "too many arguments for %%:dumps");
10721 if (dumpdir)
10723 p = quote_spec_arg (xstrdup (dumpdir));
10724 args[nargs++] = concat (" -dumpdir ", p, NULL);
10725 free (p);
10728 if (!ext)
10729 ext = input_basename + basename_length;
10731 /* Use the precomputed outbase, or compute dumpbase from
10732 input_basename, just like %b would. */
10733 char *base;
10735 if (dumpbase && *dumpbase)
10737 base = xstrdup (dumpbase);
10738 p = base + outbase_length;
10739 gcc_checking_assert (strncmp (base, outbase, outbase_length) == 0);
10740 gcc_checking_assert (strcmp (p, ext) == 0);
10742 else if (outbase_length)
10744 base = xstrndup (outbase, outbase_length);
10745 p = NULL;
10747 else
10749 base = xstrndup (input_basename, suffixed_basename_length);
10750 p = base + basename_length;
10753 if (compare_debug < 0 || !p || strcmp (p, ext) != 0)
10755 if (p)
10756 *p = '\0';
10758 const char *gk;
10759 if (compare_debug < 0)
10760 gk = ".gk";
10761 else
10762 gk = "";
10764 p = concat (base, gk, ext, NULL);
10766 free (base);
10767 base = p;
10770 base = quote_spec_arg (base);
10771 args[nargs++] = concat (" -dumpbase ", base, NULL);
10772 free (base);
10774 if (*ext)
10776 p = quote_spec_arg (xstrdup (ext));
10777 args[nargs++] = concat (" -dumpbase-ext ", p, NULL);
10778 free (p);
10781 const char *ret = concat (args[0], args[1], args[2], NULL);
10782 while (nargs > 0)
10783 free (args[--nargs]);
10785 return ret;
10788 /* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
10789 Otherwise, return NULL. */
10791 static const char *
10792 greater_than_spec_func (int argc, const char **argv)
10794 char *converted;
10796 if (argc == 1)
10797 return NULL;
10799 gcc_assert (argc >= 2);
10801 long arg = strtol (argv[argc - 2], &converted, 10);
10802 gcc_assert (converted != argv[argc - 2]);
10804 long lim = strtol (argv[argc - 1], &converted, 10);
10805 gcc_assert (converted != argv[argc - 1]);
10807 if (arg > lim)
10808 return "";
10810 return NULL;
10813 /* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
10814 Otherwise, return NULL. */
10816 static const char *
10817 debug_level_greater_than_spec_func (int argc, const char **argv)
10819 char *converted;
10821 if (argc != 1)
10822 fatal_error (input_location,
10823 "wrong number of arguments to %%:debug-level-gt");
10825 long arg = strtol (argv[0], &converted, 10);
10826 gcc_assert (converted != argv[0]);
10828 if (debug_info_level > arg)
10829 return "";
10831 return NULL;
10834 /* Returns "" if dwarf_version is greater than ARGV[ARGC-1].
10835 Otherwise, return NULL. */
10837 static const char *
10838 dwarf_version_greater_than_spec_func (int argc, const char **argv)
10840 char *converted;
10842 if (argc != 1)
10843 fatal_error (input_location,
10844 "wrong number of arguments to %%:dwarf-version-gt");
10846 long arg = strtol (argv[0], &converted, 10);
10847 gcc_assert (converted != argv[0]);
10849 if (dwarf_version > arg)
10850 return "";
10852 return NULL;
10855 static void
10856 path_prefix_reset (path_prefix *prefix)
10858 struct prefix_list *iter, *next;
10859 iter = prefix->plist;
10860 while (iter)
10862 next = iter->next;
10863 free (const_cast <char *> (iter->prefix));
10864 XDELETE (iter);
10865 iter = next;
10867 prefix->plist = 0;
10868 prefix->max_len = 0;
10871 /* The function takes 3 arguments: OPTION name, file name and location
10872 where we search for Fortran modules.
10873 When the FILE is found by find_file, return OPTION=path_to_file. */
10875 static const char *
10876 find_fortran_preinclude_file (int argc, const char **argv)
10878 char *result = NULL;
10879 if (argc != 3)
10880 return NULL;
10882 struct path_prefix prefixes = { 0, 0, "preinclude" };
10884 /* Search first for 'finclude' folder location for a header file
10885 installed by the compiler (similar to omp_lib.h). */
10886 add_prefix (&prefixes, argv[2], NULL, 0, 0, 0);
10887 #ifdef TOOL_INCLUDE_DIR
10888 /* Then search: <prefix>/<target>/<include>/finclude */
10889 add_prefix (&prefixes, TOOL_INCLUDE_DIR "/finclude/",
10890 NULL, 0, 0, 0);
10891 #endif
10892 #ifdef NATIVE_SYSTEM_HEADER_DIR
10893 /* Then search: <sysroot>/usr/include/finclude/<multilib> */
10894 add_sysrooted_hdrs_prefix (&prefixes, NATIVE_SYSTEM_HEADER_DIR "/finclude/",
10895 NULL, 0, 0, 0);
10896 #endif
10898 const char *path = find_a_file (&include_prefixes, argv[1], R_OK, false);
10899 if (path != NULL)
10900 result = concat (argv[0], path, NULL);
10901 else
10903 path = find_a_file (&prefixes, argv[1], R_OK, false);
10904 if (path != NULL)
10905 result = concat (argv[0], path, NULL);
10908 path_prefix_reset (&prefixes);
10909 return result;
10912 /* If any character in ORIG fits QUOTE_P (_, P), reallocate the string
10913 so as to precede every one of them with a backslash. Return the
10914 original string or the reallocated one. */
10916 static inline char *
10917 quote_string (char *orig, bool (*quote_p)(char, void *), void *p)
10919 int len, number_of_space = 0;
10921 for (len = 0; orig[len]; len++)
10922 if (quote_p (orig[len], p))
10923 number_of_space++;
10925 if (number_of_space)
10927 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
10928 int j, k;
10929 for (j = 0, k = 0; j <= len; j++, k++)
10931 if (quote_p (orig[j], p))
10932 new_spec[k++] = '\\';
10933 new_spec[k] = orig[j];
10935 free (orig);
10936 return new_spec;
10938 else
10939 return orig;
10942 /* Return true iff C is any of the characters convert_white_space
10943 should quote. */
10945 static inline bool
10946 whitespace_to_convert_p (char c, void *)
10948 return (c == ' ' || c == '\t');
10951 /* Insert backslash before spaces in ORIG (usually a file path), to
10952 avoid being broken by spec parser.
10954 This function is needed as do_spec_1 treats white space (' ' and '\t')
10955 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
10956 the file name should be treated as a single argument rather than being
10957 broken into multiple. Solution is to insert '\\' before the space in a
10958 file name.
10960 This function converts and only converts all occurrence of ' '
10961 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
10962 "a b" -> "a\\ b"
10963 "a b" -> "a\\ \\ b"
10964 "a\tb" -> "a\\\tb"
10965 "a\\ b" -> "a\\\\ b"
10967 orig: input null-terminating string that was allocated by xalloc. The
10968 memory it points to might be freed in this function. Behavior undefined
10969 if ORIG wasn't xalloced or was freed already at entry.
10971 Return: ORIG if no conversion needed. Otherwise a newly allocated string
10972 that was converted from ORIG. */
10974 static char *
10975 convert_white_space (char *orig)
10977 return quote_string (orig, whitespace_to_convert_p, NULL);
10980 /* Return true iff C matches any of the spec active characters. */
10981 static inline bool
10982 quote_spec_char_p (char c, void *)
10984 switch (c)
10986 case ' ':
10987 case '\t':
10988 case '\n':
10989 case '|':
10990 case '%':
10991 case '\\':
10992 return true;
10994 default:
10995 return false;
10999 /* Like convert_white_space, but deactivate all active spec chars by
11000 quoting them. */
11002 static inline char *
11003 quote_spec (char *orig)
11005 return quote_string (orig, quote_spec_char_p, NULL);
11008 /* Like quote_spec, but also turn an empty string into the spec for an
11009 empty argument. */
11011 static inline char *
11012 quote_spec_arg (char *orig)
11014 if (!*orig)
11016 free (orig);
11017 return xstrdup ("%\"");
11020 return quote_spec (orig);
11023 /* Restore all state within gcc.cc to the initial state, so that the driver
11024 code can be safely re-run in-process.
11026 Many const char * variables are referenced by static specs (see
11027 INIT_STATIC_SPEC above). These variables are restored to their default
11028 values by a simple loop over the static specs.
11030 For other variables, we directly restore them all to their initial
11031 values (often implicitly 0).
11033 Free the various obstacks in this file, along with "opts_obstack"
11034 from opts.cc.
11036 This function also restores any environment variables that were changed. */
11038 void
11039 driver::finalize ()
11041 env.restore ();
11042 diagnostic_finish (global_dc);
11044 is_cpp_driver = 0;
11045 at_file_supplied = 0;
11046 print_help_list = 0;
11047 print_version = 0;
11048 verbose_only_flag = 0;
11049 print_subprocess_help = 0;
11050 use_ld = NULL;
11051 report_times_to_file = NULL;
11052 target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
11053 target_system_root_changed = 0;
11054 target_sysroot_suffix = 0;
11055 target_sysroot_hdrs_suffix = 0;
11056 save_temps_flag = SAVE_TEMPS_NONE;
11057 save_temps_overrides_dumpdir = false;
11058 dumpdir_trailing_dash_added = false;
11059 free (dumpdir);
11060 free (dumpbase);
11061 free (dumpbase_ext);
11062 free (outbase);
11063 dumpdir = dumpbase = dumpbase_ext = outbase = NULL;
11064 dumpdir_length = outbase_length = 0;
11065 spec_machine = DEFAULT_TARGET_MACHINE;
11066 greatest_status = 1;
11068 obstack_free (&obstack, NULL);
11069 obstack_free (&opts_obstack, NULL); /* in opts.cc */
11070 obstack_free (&collect_obstack, NULL);
11072 link_command_spec = LINK_COMMAND_SPEC;
11074 obstack_free (&multilib_obstack, NULL);
11076 user_specs_head = NULL;
11077 user_specs_tail = NULL;
11079 /* Within the "compilers" vec, the fields "suffix" and "spec" were
11080 statically allocated for the default compilers, but dynamically
11081 allocated for additional compilers. Delete them for the latter. */
11082 for (int i = n_default_compilers; i < n_compilers; i++)
11084 free (const_cast <char *> (compilers[i].suffix));
11085 free (const_cast <char *> (compilers[i].spec));
11087 XDELETEVEC (compilers);
11088 compilers = NULL;
11089 n_compilers = 0;
11091 linker_options.truncate (0);
11092 assembler_options.truncate (0);
11093 preprocessor_options.truncate (0);
11095 path_prefix_reset (&exec_prefixes);
11096 path_prefix_reset (&startfile_prefixes);
11097 path_prefix_reset (&include_prefixes);
11099 machine_suffix = 0;
11100 just_machine_suffix = 0;
11101 gcc_exec_prefix = 0;
11102 gcc_libexec_prefix = 0;
11103 set_static_spec_shared (&md_exec_prefix, MD_EXEC_PREFIX);
11104 set_static_spec_shared (&md_startfile_prefix, MD_STARTFILE_PREFIX);
11105 set_static_spec_shared (&md_startfile_prefix_1, MD_STARTFILE_PREFIX_1);
11106 multilib_dir = 0;
11107 multilib_os_dir = 0;
11108 multiarch_dir = 0;
11110 /* Free any specs dynamically-allocated by set_spec.
11111 These will be at the head of the list, before the
11112 statically-allocated ones. */
11113 if (specs)
11115 while (specs != static_specs)
11117 spec_list *next = specs->next;
11118 free (const_cast <char *> (specs->name));
11119 XDELETE (specs);
11120 specs = next;
11122 specs = 0;
11124 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
11126 spec_list *sl = &static_specs[i];
11127 if (sl->alloc_p)
11129 free (const_cast <char *> (*(sl->ptr_spec)));
11130 sl->alloc_p = false;
11132 *(sl->ptr_spec) = sl->default_ptr;
11134 #ifdef EXTRA_SPECS
11135 extra_specs = NULL;
11136 #endif
11138 processing_spec_function = 0;
11140 clear_args ();
11142 have_c = 0;
11143 have_o = 0;
11145 temp_names = NULL;
11146 execution_count = 0;
11147 signal_count = 0;
11149 temp_filename = NULL;
11150 temp_filename_length = 0;
11151 always_delete_queue = NULL;
11152 failure_delete_queue = NULL;
11154 XDELETEVEC (switches);
11155 switches = NULL;
11156 n_switches = 0;
11157 n_switches_alloc = 0;
11159 compare_debug = 0;
11160 compare_debug_second = 0;
11161 compare_debug_opt = NULL;
11162 for (int i = 0; i < 2; i++)
11164 switches_debug_check[i] = NULL;
11165 n_switches_debug_check[i] = 0;
11166 n_switches_alloc_debug_check[i] = 0;
11167 debug_check_temp_file[i] = NULL;
11170 XDELETEVEC (infiles);
11171 infiles = NULL;
11172 n_infiles = 0;
11173 n_infiles_alloc = 0;
11175 combine_inputs = false;
11176 added_libraries = 0;
11177 XDELETEVEC (outfiles);
11178 outfiles = NULL;
11179 spec_lang = 0;
11180 last_language_n_infiles = 0;
11181 gcc_input_filename = NULL;
11182 input_file_number = 0;
11183 input_filename_length = 0;
11184 basename_length = 0;
11185 suffixed_basename_length = 0;
11186 input_basename = NULL;
11187 input_suffix = NULL;
11188 /* We don't need to purge "input_stat", just to unset "input_stat_set". */
11189 input_stat_set = 0;
11190 input_file_compiler = NULL;
11191 arg_going = 0;
11192 delete_this_arg = 0;
11193 this_is_output_file = 0;
11194 this_is_library_file = 0;
11195 this_is_linker_script = 0;
11196 input_from_pipe = 0;
11197 suffix_subst = NULL;
11199 mdswitches = NULL;
11200 n_mdswitches = 0;
11202 used_arg.finalize ();
11205 /* PR jit/64810.
11206 Targets can provide configure-time default options in
11207 OPTION_DEFAULT_SPECS. The jit needs to access these, but
11208 they are expressed in the spec language.
11210 Run just enough of the driver to be able to expand these
11211 specs, and then call the callback CB on each
11212 such option. The options strings are *without* a leading
11213 '-' character e.g. ("march=x86-64"). Finally, clean up. */
11215 void
11216 driver_get_configure_time_options (void (*cb) (const char *option,
11217 void *user_data),
11218 void *user_data)
11220 size_t i;
11222 obstack_init (&obstack);
11223 init_opts_obstack ();
11224 n_switches = 0;
11226 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
11227 do_option_spec (option_default_specs[i].name,
11228 option_default_specs[i].spec);
11230 for (i = 0; (int) i < n_switches; i++)
11232 gcc_assert (switches[i].part1);
11233 (*cb) (switches[i].part1, user_data);
11236 obstack_free (&opts_obstack, NULL);
11237 obstack_free (&obstack, NULL);
11238 n_switches = 0;