1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2022 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
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
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". */
33 #include "coretypes.h"
34 #include "multilib.h" /* before tm.h */
40 #include "opt-suggestions.h"
42 #include "diagnostic.h"
45 #include "filenames.h"
46 #include "spellcheck.h"
48 #define untested() { fprintf (stderr, "@@#\n@@@:%s:%d:%s\n", __FILE__, __LINE__, __func__); }
54 /* Manage the manipulation of env vars.
56 We poison "getenv" and "putenv", so that all enviroment-handling is
57 done through this class. Note that poisoning happens in the
58 preprocessor at the identifier level, and doesn't distinguish between
62 Hence we need to use "get" for the accessor method, not "getenv". */
67 void init (bool can_restore
, bool debug
);
68 const char *get (const char *name
);
69 void xput (const char *string
);
84 /* The singleton instance of class env_manager. */
86 static env_manager env
;
88 /* Initializer for class env_manager.
90 We can't do this as a constructor since we have a statically
91 allocated instance ("env" above). */
94 env_manager::init (bool can_restore
, bool debug
)
96 m_can_restore
= can_restore
;
100 /* Get the value of NAME within the environment. Essentially
101 a wrapper for ::getenv, but adding logging, and the possibility
102 of caching results. */
105 env_manager::get (const char *name
)
107 const char *result
= ::getenv (name
);
109 fprintf (stderr
, "env_manager::getenv (%s) -> %s\n", name
, result
);
113 /* Put the given KEY=VALUE entry STRING into the environment.
114 If the env_manager was initialized with CAN_RESTORE set, then
115 also record the old value of KEY within the environment, so that it
116 can be later restored. */
119 env_manager::xput (const char *string
)
122 fprintf (stderr
, "env_manager::xput (%s)\n", string
);
124 fnotice (stderr
, "%s\n", string
);
128 char *equals
= strchr (const_cast <char *> (string
), '=');
132 kv
.m_key
= xstrndup (string
, equals
- string
);
133 const char *cur_value
= ::getenv (kv
.m_key
);
135 fprintf (stderr
, "saving old value: %s\n",cur_value
);
136 kv
.m_value
= cur_value
? xstrdup (cur_value
) : NULL
;
137 m_keys
.safe_push (kv
);
140 ::putenv (CONST_CAST (char *, string
));
143 /* Undo any xputenv changes made since last restore.
144 Can only be called if the env_manager was initialized with
145 CAN_RESTORE enabled. */
148 env_manager::restore ()
153 gcc_assert (m_can_restore
);
155 FOR_EACH_VEC_ELT_REVERSE (m_keys
, i
, item
)
158 printf ("restoring saved key: %s value: %s\n", item
->m_key
, item
->m_value
);
160 ::setenv (item
->m_key
, item
->m_value
, 1);
162 ::unsetenv (item
->m_key
);
164 free (item
->m_value
);
170 /* Forbid other uses of getenv and putenv. */
171 #if (GCC_VERSION >= 3000)
172 #pragma GCC poison getenv putenv
175 /* By default there is no special suffix for target executables. */
176 #ifdef TARGET_EXECUTABLE_SUFFIX
177 #define HAVE_TARGET_EXECUTABLE_SUFFIX
179 #define TARGET_EXECUTABLE_SUFFIX ""
182 /* By default there is no special suffix for host executables. */
183 #ifdef HOST_EXECUTABLE_SUFFIX
184 #define HAVE_HOST_EXECUTABLE_SUFFIX
186 #define HOST_EXECUTABLE_SUFFIX ""
189 /* By default, the suffix for target object files is ".o". */
190 #ifdef TARGET_OBJECT_SUFFIX
191 #define HAVE_TARGET_OBJECT_SUFFIX
193 #define TARGET_OBJECT_SUFFIX ".o"
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"
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. */
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
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)
254 #define DEFAULT_TARGET_SYSTEM_ROOT (0)
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 */
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
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
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
;
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";
337 static const char *cross_compile
= "0";
340 /* Greatest exit code of sub-processes that has been encountered up to
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
353 static struct obstack collect_obstack
;
355 /* Forward declaration for prototypes. */
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 *,
368 static void xputenv (const char *);
369 static void putenv_from_prefixes (const struct path_prefix
*, const char *,
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 *,
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 *,
421 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
422 static const char *convert_filename (const char *, int, int);
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 *);
451 /* The Specs Language
453 Specs are strings containing lines, each of which (if not blank)
454 is made up of a program name, and arguments separated by spaces.
455 The program name must be exact and start from root, since no path
456 is searched and it is unreliable to depend on the current working directory.
457 Redirection of input or output is not supported; the subprograms must
458 accept filenames saying what files to read and write.
460 In addition, the specs can contain %-sequences to substitute variable text
461 or for conditional text. Here is a table of all defined %-sequences.
462 Note that spaces are not generated automatically around the results of
463 expanding these sequences; therefore, you can concatenate them together
464 or with constant text in a single argument.
466 %% substitute one % into the program name or argument.
467 %" substitute an empty argument.
468 %i substitute the name of the input file being processed.
469 %b substitute the basename for outputs related with the input file
470 being processed. This is often a substring of the input file name,
471 up to (and not including) the last period but, unless %w is active,
472 it is affected by the directory selected by -save-temps=*, by
473 -dumpdir, and, in case of multiple compilations, even by -dumpbase
474 and -dumpbase-ext and, in case of linking, by the linker output
475 name. When %w is active, it derives the main output name only from
476 the input file base name; when it is not, it names aux/dump output
478 %B same as %b, but include the input file suffix (text after the last
481 substitute a file name that has suffix SUFFIX and is chosen
482 once per compilation, and mark the argument a la %d. To reduce
483 exposure to denial-of-service attacks, the file name is now
484 chosen in a way that is hard to predict even when previously
485 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
486 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
487 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
488 had been pre-processed. Previously, %g was simply substituted
489 with a file name chosen once per compilation, without regard
490 to any appended suffix (which was therefore treated just like
491 ordinary text), making such attacks more likely to succeed.
493 like %g, but if -pipe is in effect, expands simply to "-".
495 like %g, but if -pipe is in effect, expands to nothing. (We have both
496 %| and %m to accommodate differences between system assemblers; see
497 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
499 like %g, but generates a new temporary file name even if %uSUFFIX
502 substitutes the last file name generated with %uSUFFIX, generating a
503 new one if there is no such last file name. In the absence of any
504 %uSUFFIX, this is just like %gSUFFIX, except they don't share
505 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
506 would involve the generation of two distinct file names, one
507 for each `%g.s' and another for each `%U.s'. Previously, %U was
508 simply substituted with a file name chosen for the previous %u,
509 without regard to any appended suffix.
511 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
512 writable, and if save-temps is off; otherwise, substitute the name
513 of a temporary file, just like %u. This temporary file is not
514 meant for communication between processes, but rather as a junk
517 substitutes .SUFFIX for the suffixes of a matched switch's args when
518 it is subsequently output with %*. SUFFIX is terminated by the next
520 %d marks the argument containing or following the %d as a
521 temporary file name, so that file will be deleted if GCC exits
522 successfully. Unlike %g, this contributes no text to the argument.
523 %w marks the argument containing or following the %w as the
524 "output file" of this compilation. This puts the argument
525 into the sequence of arguments that %o will substitute later.
526 %V indicates that this compilation produces no "output file".
528 like %{...} but marks the last argument supplied within as a file
529 to be deleted on failure.
531 like %{...} but puts the result into a FILE and substitutes @FILE
532 if an @file argument has been supplied.
533 %o substitutes the names of all the output files, with spaces
534 automatically placed around them. You should write spaces
535 around the %o as well or the results are undefined.
536 %o is for use in the specs for running the linker.
537 Input files whose names have no recognized suffix are not compiled
538 at all, but they are included among the output files, so they will
540 %O substitutes the suffix for object files. Note that this is
541 handled specially when it immediately follows %g, %u, or %U
542 (with or without a suffix argument) because of the need for
543 those to form complete file names. The handling is such that
544 %O is treated exactly as if it had already been substituted,
545 except that %g, %u, and %U do not currently support additional
546 SUFFIX characters following %O as they would following, for
548 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
549 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
550 and -B options) and -imultilib as necessary.
551 %s current argument is the name of a library or startup file of some sort.
552 Search for that file in a standard list of directories
553 and substitute the full name found.
554 %T current argument is the name of a linker script.
555 Search for that file in the current list of directories to scan for
556 libraries. If the file is located, insert a --script option into the
557 command line followed by the full path name found. If the file is
558 not found then generate an error message.
559 Note: the current working directory is not searched.
560 %eSTR Print STR as an error message. STR is terminated by a newline.
561 Use this when inconsistent options are detected.
562 %nSTR Print STR as a notice. STR is terminated by a newline.
563 %x{OPTION} Accumulate an option for %X.
564 %X Output the accumulated linker options specified by compilations.
565 %Y Output the accumulated assembler options specified by compilations.
566 %Z Output the accumulated preprocessor options specified by compilations.
567 %a process ASM_SPEC as a spec.
568 This allows config.h to specify part of the spec for running as.
569 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
570 used here. This can be used to run a post-processor after the
571 assembler has done its job.
572 %D Dump out a -L option for each directory in startfile_prefixes.
573 If multilib_dir is set, extra entries are generated with it affixed.
574 %l process LINK_SPEC as a spec.
575 %L process LIB_SPEC as a spec.
576 %M Output multilib_os_dir.
577 %G process LIBGCC_SPEC as a spec.
578 %R Output the concatenation of target_system_root and
579 target_sysroot_suffix.
580 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
581 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
582 %C process CPP_SPEC as a spec.
583 %1 process CC1_SPEC as a spec.
584 %2 process CC1PLUS_SPEC as a spec.
585 %* substitute the variable part of a matched option. (See below.)
586 Note that each comma in the substituted string is replaced by
587 a single space. A space is appended after the last substition
588 unless there is more text in current sequence.
589 %<S remove all occurrences of -S from the command line.
590 Note - this command is position dependent. % commands in the
591 spec string before this one will see -S, % commands in the
592 spec string after this one will not.
593 %>S Similar to "%<S", but keep it in the GCC command line.
594 %<S* remove all occurrences of all switches beginning with -S from the
597 Call the named function FUNCTION, passing it ARGS. ARGS is
598 first processed as a nested spec string, then split into an
599 argument vector in the usual fashion. The function returns
600 a string which is processed as if it had appeared literally
601 as part of the current spec.
602 %{S} substitutes the -S switch, if that switch was given to GCC.
603 If that switch was not specified, this substitutes nothing.
604 Here S is a metasyntactic variable.
605 %{S*} substitutes all the switches specified to GCC whose names start
606 with -S. This is used for -o, -I, etc; switches that take
607 arguments. GCC considers `-o foo' as being one switch whose
608 name starts with `o'. %{o*} would substitute this text,
609 including the space; thus, two arguments would be generated.
610 %{S*&T*} likewise, but preserve order of S and T options (the order
611 of S and T in the spec is not significant). Can be any number
612 of ampersand-separated variables; for each the wild card is
613 optional. Useful for CPP as %{D*&U*&A*}.
615 %{S:X} substitutes X, if the -S switch was given to GCC.
616 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
617 %{S*:X} substitutes X if one or more switches whose names start
618 with -S was given to GCC. Normally X is substituted only
619 once, no matter how many such switches appeared. However,
620 if %* appears somewhere in X, then X will be substituted
621 once for each matching switch, with the %* replaced by the
622 part of that switch that matched the '*'. A space will be
623 appended after the last substition unless there is more
624 text in current sequence.
625 %{.S:X} substitutes X, if processing a file with suffix S.
626 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
627 %{,S:X} substitutes X, if processing a file which will use spec S.
628 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
630 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
631 combined with '!', '.', ',', and '*' as above binding stronger
633 If %* appears in X, all of the alternatives must be starred, and
634 only the first matching alternative is substituted.
635 %{%:function(args):X}
636 Call function named FUNCTION with args ARGS. If the function
637 returns non-NULL, then X is substituted, if it returns
638 NULL, it isn't substituted.
639 %{S:X; if S was given to GCC, substitutes X;
640 T:Y; else if T was given to GCC, substitutes Y;
641 :D} else substitutes D. There can be as many clauses as you need.
642 This may be combined with '.', '!', ',', '|', and '*' as above.
644 %(Spec) processes a specification defined in a specs file as *Spec:
646 The switch matching text S in a %{S}, %{S:X}, or similar construct can use
647 a backslash to ignore the special meaning of the character following it,
648 thus allowing literal matching of a character that is otherwise specially
649 treated. For example, %{std=iso9899\:1999:X} substitutes X if the
650 -std=iso9899:1999 option is given.
652 The conditional text X in a %{S:X} or similar construct may contain
653 other nested % constructs or spaces, or even newlines. They are
654 processed as usual, as described above. Trailing white space in X is
655 ignored. White space may also appear anywhere on the left side of the
656 colon in these constructs, except between . or * and the corresponding
659 The -O, -f, -g, -m, and -W switches are handled specifically in these
660 constructs. If another value of -O or the negated form of a -f, -m, or
661 -W switch is found later in the command line, the earlier switch
662 value is ignored, except with {S*} where S is just one letter; this
663 passes all matching options.
665 The character | at the beginning of the predicate text is used to indicate
666 that a command should be piped to the following command, but only if -pipe
669 Note that it is built into GCC which switches take arguments and which
670 do not. You might think it would be useful to generalize this to
671 allow each compiler's spec to say which switches take arguments. But
672 this cannot be done in a consistent fashion. GCC cannot even decide
673 which input files have been specified without knowing which switches
674 take arguments, and it must know which input files to compile in order
675 to tell which compilers to run.
677 GCC also knows implicitly that arguments starting in `-l' are to be
678 treated as compiler output files, and passed to the linker in their
679 proper position among the other output files. */
681 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
683 /* config.h can define ASM_SPEC to provide extra args to the assembler
684 or extra switch-translations. */
689 /* config.h can define ASM_FINAL_SPEC to run a post processor after
690 the assembler has run. */
691 #ifndef ASM_FINAL_SPEC
692 #define ASM_FINAL_SPEC \
694 objcopy --extract-dwo \
695 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
697 objcopy --strip-dwo \
698 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
702 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
703 or extra switch-translations. */
708 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
709 or extra switch-translations. */
714 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
715 or extra switch-translations. */
717 #define CC1PLUS_SPEC ""
720 /* config.h can define LINK_SPEC to provide extra args to the linker
721 or extra switch-translations. */
726 /* config.h can define LIB_SPEC to override the default libraries. */
728 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
731 /* When using -fsplit-stack we need to wrap pthread_create, in order
732 to initialize the stack guard. We always use wrapping, rather than
733 shared library ordering, and we keep the wrapper function in
734 libgcc. This is not yet a real spec, though it could become one;
735 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
736 only works with GNU ld and gold. */
737 #ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
738 #define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
740 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
744 #define STATIC_LIBASAN_LIBS \
745 " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
746 #ifdef LIBASAN_EARLY_SPEC
747 #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
748 #elif defined(HAVE_LD_STATIC_DYNAMIC)
749 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
750 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
753 #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
757 #ifndef LIBASAN_EARLY_SPEC
758 #define LIBASAN_EARLY_SPEC ""
761 #ifndef LIBHWASAN_SPEC
762 #define STATIC_LIBHWASAN_LIBS \
763 " %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
764 #ifdef LIBHWASAN_EARLY_SPEC
765 #define LIBHWASAN_SPEC STATIC_LIBHWASAN_LIBS
766 #elif defined(HAVE_LD_STATIC_DYNAMIC)
767 #define LIBHWASAN_SPEC "%{static-libhwasan:" LD_STATIC_OPTION \
768 "} -lhwasan %{static-libhwasan:" LD_DYNAMIC_OPTION "}" \
769 STATIC_LIBHWASAN_LIBS
771 #define LIBHWASAN_SPEC "-lhwasan" STATIC_LIBHWASAN_LIBS
775 #ifndef LIBHWASAN_EARLY_SPEC
776 #define LIBHWASAN_EARLY_SPEC ""
780 #define STATIC_LIBTSAN_LIBS \
781 " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
782 #ifdef LIBTSAN_EARLY_SPEC
783 #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
784 #elif defined(HAVE_LD_STATIC_DYNAMIC)
785 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
786 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
789 #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
793 #ifndef LIBTSAN_EARLY_SPEC
794 #define LIBTSAN_EARLY_SPEC ""
798 #define STATIC_LIBLSAN_LIBS \
799 " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
800 #ifdef LIBLSAN_EARLY_SPEC
801 #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
802 #elif defined(HAVE_LD_STATIC_DYNAMIC)
803 #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
804 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
807 #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
811 #ifndef LIBLSAN_EARLY_SPEC
812 #define LIBLSAN_EARLY_SPEC ""
815 #ifndef LIBUBSAN_SPEC
816 #define STATIC_LIBUBSAN_LIBS \
817 " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
818 #ifdef HAVE_LD_STATIC_DYNAMIC
819 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
820 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
823 #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
827 /* Linker options for compressed debug sections. */
828 #if HAVE_LD_COMPRESS_DEBUG == 0
829 /* No linker support. */
830 #define LINK_COMPRESS_DEBUG_SPEC \
831 " %{gz*:%e-gz is not supported in this configuration} "
832 #elif HAVE_LD_COMPRESS_DEBUG == 1
833 /* GNU style on input, GNU ld options. Reject, not useful. */
834 #define LINK_COMPRESS_DEBUG_SPEC \
835 " %{gz*:%e-gz is not supported in this configuration} "
836 #elif HAVE_LD_COMPRESS_DEBUG == 2
837 /* GNU style, GNU gold options. */
838 #define LINK_COMPRESS_DEBUG_SPEC \
839 " %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
840 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
841 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
842 #elif HAVE_LD_COMPRESS_DEBUG == 3
843 /* ELF gABI style. */
844 #define LINK_COMPRESS_DEBUG_SPEC \
845 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
846 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
847 " %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
849 #error Unknown value for HAVE_LD_COMPRESS_DEBUG.
852 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
855 #if defined(REAL_LIBGCC_SPEC)
856 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
857 #elif defined(LINK_LIBGCC_SPECIAL_1)
858 /* Have gcc do the search for libgcc.a. */
859 #define LIBGCC_SPEC "libgcc.a%s"
861 #define LIBGCC_SPEC "-lgcc"
865 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
866 #ifndef STARTFILE_SPEC
867 #define STARTFILE_SPEC \
868 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
871 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
873 #define ENDFILE_SPEC ""
877 #define LINKER_NAME "collect2"
880 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
881 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
886 /* Assembler options for compressed debug sections. */
887 #if HAVE_LD_COMPRESS_DEBUG < 2
888 /* Reject if the linker cannot write compressed debug sections. */
889 #define ASM_COMPRESS_DEBUG_SPEC \
890 " %{gz*:%e-gz is not supported in this configuration} "
891 #else /* HAVE_LD_COMPRESS_DEBUG >= 2 */
892 #if HAVE_AS_COMPRESS_DEBUG == 0
893 /* No assembler support. Ignore silently. */
894 #define ASM_COMPRESS_DEBUG_SPEC \
896 #elif HAVE_AS_COMPRESS_DEBUG == 1
897 /* GNU style, GNU as options. */
898 #define ASM_COMPRESS_DEBUG_SPEC \
899 " %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "}" \
900 " %{gz=none:" AS_NO_COMPRESS_DEBUG_OPTION "}" \
901 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
902 #elif HAVE_AS_COMPRESS_DEBUG == 2
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:" AS_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
909 #error Unknown value for HAVE_AS_COMPRESS_DEBUG.
911 #endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */
913 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
914 to the assembler, when compiling assembly sources only. */
915 #ifndef ASM_DEBUG_SPEC
916 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
917 /* If --gdwarf-N is supported and as can handle even compiler generated
918 .debug_line with it, supply --gdwarf-N in ASM_DEBUG_OPTION_SPEC rather
919 than in ASM_DEBUG_SPEC, so that it applies to both .s and .c etc.
921 # define ASM_DEBUG_DWARF_OPTION ""
922 # elif defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && !defined(HAVE_LD_BROKEN_PE_DWARF5)
923 # define ASM_DEBUG_DWARF_OPTION "%{%:dwarf-version-gt(4):--gdwarf-5;" \
924 "%:dwarf-version-gt(3):--gdwarf-4;" \
925 "%:dwarf-version-gt(2):--gdwarf-3;" \
928 # define ASM_DEBUG_DWARF_OPTION "--gdwarf2"
930 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
931 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
932 # define ASM_DEBUG_SPEC \
933 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
934 ? "%{%:debug-level-gt(0):" \
935 "%{gdwarf*:" ASM_DEBUG_DWARF_OPTION "};" \
936 ":%{g*:--gstabs}}" ASM_MAP \
937 : "%{%:debug-level-gt(0):" \
938 "%{gstabs*:--gstabs;" \
939 ":%{g*:" ASM_DEBUG_DWARF_OPTION "}}}" ASM_MAP)
941 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
942 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):--gstabs}}" ASM_MAP
944 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
945 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):" \
946 ASM_DEBUG_DWARF_OPTION "}}" ASM_MAP
950 #ifndef ASM_DEBUG_SPEC
951 # define ASM_DEBUG_SPEC ""
954 /* Define ASM_DEBUG_OPTION_SPEC to be a spec suitable for translating '-g'
955 to the assembler when compiling all sources. */
956 #ifndef ASM_DEBUG_OPTION_SPEC
957 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
958 # define ASM_DEBUG_OPTION_DWARF_OPT \
959 "%{%:dwarf-version-gt(4):--gdwarf-5 ;" \
960 "%:dwarf-version-gt(3):--gdwarf-4 ;" \
961 "%:dwarf-version-gt(2):--gdwarf-3 ;" \
963 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO)
964 # define ASM_DEBUG_OPTION_SPEC \
965 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
966 ? "%{%:debug-level-gt(0):" \
967 "%{gdwarf*:" ASM_DEBUG_OPTION_DWARF_OPT "}}" \
968 : "%{%:debug-level-gt(0):" \
969 "%{!gstabs*:%{g*:" ASM_DEBUG_OPTION_DWARF_OPT "}}}")
970 # elif defined(DWARF2_DEBUGGING_INFO)
971 # define ASM_DEBUG_OPTION_SPEC "%{g*:%{%:debug-level-gt(0):" \
972 ASM_DEBUG_OPTION_DWARF_OPT "}}"
976 #ifndef ASM_DEBUG_OPTION_SPEC
977 # define ASM_DEBUG_OPTION_SPEC ""
980 /* Here is the spec for running the linker, after compiling all files. */
982 /* This is overridable by the target in case they need to specify the
983 -lgcc and -lc order specially, yet not require them to override all
984 of LINK_COMMAND_SPEC. */
985 #ifndef LINK_GCC_C_SEQUENCE_SPEC
986 #define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
989 #ifndef LINK_SSP_SPEC
990 #ifdef TARGET_LIBC_PROVIDES_SSP
991 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
992 "|fstack-protector-strong|fstack-protector-explicit:}"
994 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
995 "|fstack-protector-strong|fstack-protector-explicit" \
996 ":-lssp_nonshared -lssp}"
1000 #ifdef ENABLE_DEFAULT_PIE
1001 #define PIE_SPEC "!no-pie"
1002 #define NO_FPIE1_SPEC "fno-pie"
1003 #define FPIE1_SPEC NO_FPIE1_SPEC ":;"
1004 #define NO_FPIE2_SPEC "fno-PIE"
1005 #define FPIE2_SPEC NO_FPIE2_SPEC ":;"
1006 #define NO_FPIE_SPEC NO_FPIE1_SPEC "|" NO_FPIE2_SPEC
1007 #define FPIE_SPEC NO_FPIE_SPEC ":;"
1008 #define NO_FPIC1_SPEC "fno-pic"
1009 #define FPIC1_SPEC NO_FPIC1_SPEC ":;"
1010 #define NO_FPIC2_SPEC "fno-PIC"
1011 #define FPIC2_SPEC NO_FPIC2_SPEC ":;"
1012 #define NO_FPIC_SPEC NO_FPIC1_SPEC "|" NO_FPIC2_SPEC
1013 #define FPIC_SPEC NO_FPIC_SPEC ":;"
1014 #define NO_FPIE1_AND_FPIC1_SPEC NO_FPIE1_SPEC "|" NO_FPIC1_SPEC
1015 #define FPIE1_OR_FPIC1_SPEC NO_FPIE1_AND_FPIC1_SPEC ":;"
1016 #define NO_FPIE2_AND_FPIC2_SPEC NO_FPIE2_SPEC "|" NO_FPIC2_SPEC
1017 #define FPIE2_OR_FPIC2_SPEC NO_FPIE2_AND_FPIC2_SPEC ":;"
1018 #define NO_FPIE_AND_FPIC_SPEC NO_FPIE_SPEC "|" NO_FPIC_SPEC
1019 #define FPIE_OR_FPIC_SPEC NO_FPIE_AND_FPIC_SPEC ":;"
1021 #define PIE_SPEC "pie"
1022 #define FPIE1_SPEC "fpie"
1023 #define NO_FPIE1_SPEC FPIE1_SPEC ":;"
1024 #define FPIE2_SPEC "fPIE"
1025 #define NO_FPIE2_SPEC FPIE2_SPEC ":;"
1026 #define FPIE_SPEC FPIE1_SPEC "|" FPIE2_SPEC
1027 #define NO_FPIE_SPEC FPIE_SPEC ":;"
1028 #define FPIC1_SPEC "fpic"
1029 #define NO_FPIC1_SPEC FPIC1_SPEC ":;"
1030 #define FPIC2_SPEC "fPIC"
1031 #define NO_FPIC2_SPEC FPIC2_SPEC ":;"
1032 #define FPIC_SPEC FPIC1_SPEC "|" FPIC2_SPEC
1033 #define NO_FPIC_SPEC FPIC_SPEC ":;"
1034 #define FPIE1_OR_FPIC1_SPEC FPIE1_SPEC "|" FPIC1_SPEC
1035 #define NO_FPIE1_AND_FPIC1_SPEC FPIE1_OR_FPIC1_SPEC ":;"
1036 #define FPIE2_OR_FPIC2_SPEC FPIE2_SPEC "|" FPIC2_SPEC
1037 #define NO_FPIE2_AND_FPIC2_SPEC FPIE1_OR_FPIC2_SPEC ":;"
1038 #define FPIE_OR_FPIC_SPEC FPIE_SPEC "|" FPIC_SPEC
1039 #define NO_FPIE_AND_FPIC_SPEC FPIE_OR_FPIC_SPEC ":;"
1042 #ifndef LINK_PIE_SPEC
1045 #define LD_PIE_SPEC "-pie"
1048 #define LD_PIE_SPEC ""
1050 #define LINK_PIE_SPEC "%{static|shared|r:;" PIE_SPEC ":" LD_PIE_SPEC "} "
1053 #ifndef LINK_BUILDID_SPEC
1054 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
1055 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
1059 #ifndef LTO_PLUGIN_SPEC
1060 #define LTO_PLUGIN_SPEC ""
1063 /* Conditional to test whether the LTO plugin is used or not.
1064 FIXME: For slim LTO we will need to enable plugin unconditionally. This
1065 still cause problems with PLUGIN_LD != LD and when plugin is built but
1066 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
1067 plugin only when LTO is enabled. We still honor explicit
1068 -fuse-linker-plugin if the linker used understands -plugin. */
1070 /* The linker has some plugin support. */
1071 #if HAVE_LTO_PLUGIN > 0
1072 /* The linker used has full plugin support, use LTO plugin by default. */
1073 #if HAVE_LTO_PLUGIN == 2
1074 #define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
1075 #define PLUGIN_COND_CLOSE "}"
1077 /* The linker used has limited plugin support, use LTO plugin with explicit
1078 -fuse-linker-plugin. */
1079 #define PLUGIN_COND "fuse-linker-plugin"
1080 #define PLUGIN_COND_CLOSE ""
1082 #define LINK_PLUGIN_SPEC \
1083 "%{" PLUGIN_COND": \
1084 -plugin %(linker_plugin_file) \
1085 -plugin-opt=%(lto_wrapper) \
1086 -plugin-opt=-fresolution=%u.res \
1087 " LTO_PLUGIN_SPEC "\
1088 %{flinker-output=*:-plugin-opt=-linker-output-known} \
1089 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
1090 }" PLUGIN_COND_CLOSE
1092 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
1093 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
1094 %e-fuse-linker-plugin is not supported in this configuration}"
1097 /* Linker command line options for -fsanitize= early on the command line. */
1098 #ifndef SANITIZER_EARLY_SPEC
1099 #define SANITIZER_EARLY_SPEC "\
1100 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
1101 %{%:sanitize(hwaddress):" LIBHWASAN_EARLY_SPEC "} \
1102 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
1103 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}"
1106 /* Linker command line options for -fsanitize= late on the command line. */
1107 #ifndef SANITIZER_SPEC
1108 #define SANITIZER_SPEC "\
1109 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
1110 %{static:%ecannot specify -static with -fsanitize=address}}\
1111 %{%:sanitize(hwaddress):" LIBHWASAN_SPEC "\
1112 %{static:%ecannot specify -static with -fsanitize=hwaddress}}\
1113 %{%:sanitize(thread):" LIBTSAN_SPEC "\
1114 %{static:%ecannot specify -static with -fsanitize=thread}}\
1115 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
1116 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}"
1119 #ifndef POST_LINK_SPEC
1120 #define POST_LINK_SPEC ""
1123 /* This is the spec to use, once the code for creating the vtable
1124 verification runtime library, libvtv.so, has been created. Currently
1125 the vtable verification runtime functions are in libstdc++, so we use
1126 the spec just below this one. */
1127 #ifndef VTABLE_VERIFICATION_SPEC
1128 #if ENABLE_VTABLE_VERIFY
1129 #define VTABLE_VERIFICATION_SPEC "\
1130 %{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1131 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1133 #define VTABLE_VERIFICATION_SPEC "\
1134 %{fvtable-verify=none:} \
1135 %{fvtable-verify=std: \
1136 %e-fvtable-verify=std is not supported in this configuration} \
1137 %{fvtable-verify=preinit: \
1138 %e-fvtable-verify=preinit is not supported in this configuration}"
1142 /* -u* was put back because both BSD and SysV seem to support it. */
1143 /* %{static|no-pie|static-pie:} simply prevents an error message:
1144 1. If the target machine doesn't handle -static.
1145 2. If PIE isn't enabled by default.
1146 3. If the target machine doesn't handle -static-pie.
1148 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1149 scripts which exist in user specified directories, or in standard
1151 /* We pass any -flto flags on to the linker, which is expected
1152 to understand them. In practice, this means it had better be collect2. */
1153 /* %{e*} includes -export-dynamic; see comment in common.opt. */
1154 #ifndef LINK_COMMAND_SPEC
1155 #define LINK_COMMAND_SPEC "\
1156 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1159 "%{flto|flto=*:%<fcompare-debug*} \
1160 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
1161 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
1162 "%X %{o*} %{e*} %{N} %{n} %{r}\
1163 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1164 %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
1165 VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
1166 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1167 %:include(libgomp.spec)%(link_gomp)}\
1168 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1169 %(mflib) " STACK_SPLIT_SPEC "\
1170 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
1171 %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1172 %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1175 #ifndef LINK_LIBGCC_SPEC
1176 /* Generate -L options for startfile prefix list. */
1177 # define LINK_LIBGCC_SPEC "%D"
1180 #ifndef STARTFILE_PREFIX_SPEC
1181 # define STARTFILE_PREFIX_SPEC ""
1184 #ifndef SYSROOT_SPEC
1185 # define SYSROOT_SPEC "--sysroot=%R"
1188 #ifndef SYSROOT_SUFFIX_SPEC
1189 # define SYSROOT_SUFFIX_SPEC ""
1192 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1193 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
1196 static const char *asm_debug
= ASM_DEBUG_SPEC
;
1197 static const char *asm_debug_option
= ASM_DEBUG_OPTION_SPEC
;
1198 static const char *cpp_spec
= CPP_SPEC
;
1199 static const char *cc1_spec
= CC1_SPEC
;
1200 static const char *cc1plus_spec
= CC1PLUS_SPEC
;
1201 static const char *link_gcc_c_sequence_spec
= LINK_GCC_C_SEQUENCE_SPEC
;
1202 static const char *link_ssp_spec
= LINK_SSP_SPEC
;
1203 static const char *asm_spec
= ASM_SPEC
;
1204 static const char *asm_final_spec
= ASM_FINAL_SPEC
;
1205 static const char *link_spec
= LINK_SPEC
;
1206 static const char *lib_spec
= LIB_SPEC
;
1207 static const char *link_gomp_spec
= "";
1208 static const char *libgcc_spec
= LIBGCC_SPEC
;
1209 static const char *endfile_spec
= ENDFILE_SPEC
;
1210 static const char *startfile_spec
= STARTFILE_SPEC
;
1211 static const char *linker_name_spec
= LINKER_NAME
;
1212 static const char *linker_plugin_file_spec
= "";
1213 static const char *lto_wrapper_spec
= "";
1214 static const char *lto_gcc_spec
= "";
1215 static const char *post_link_spec
= POST_LINK_SPEC
;
1216 static const char *link_command_spec
= LINK_COMMAND_SPEC
;
1217 static const char *link_libgcc_spec
= LINK_LIBGCC_SPEC
;
1218 static const char *startfile_prefix_spec
= STARTFILE_PREFIX_SPEC
;
1219 static const char *sysroot_spec
= SYSROOT_SPEC
;
1220 static const char *sysroot_suffix_spec
= SYSROOT_SUFFIX_SPEC
;
1221 static const char *sysroot_hdrs_suffix_spec
= SYSROOT_HEADERS_SUFFIX_SPEC
;
1222 static const char *self_spec
= "";
1224 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1225 There should be no need to override these in target dependent files,
1226 but we need to copy them to the specs file so that newer versions
1227 of the GCC driver can correctly drive older tool chains with the
1228 appropriate -B options. */
1230 /* When cpplib handles traditional preprocessing, get rid of this, and
1231 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1232 that we default the front end language better. */
1233 static const char *trad_capable_cpp
=
1234 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1236 /* We don't wrap .d files in %W{} since a missing .d file, and
1237 therefore no dependency entry, confuses make into thinking a .o
1238 file that happens to exist is up-to-date. */
1239 static const char *cpp_unique_options
=
1240 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1241 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1242 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1243 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1244 %{Mmodules} %{Mno-modules}\
1245 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1246 %{remap} %{%:debug-level-gt(2):-dD}\
1247 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1248 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1251 /* This contains cpp options which are common with cc1_options and are passed
1252 only when preprocessing only to avoid duplication. We pass the cc1 spec
1253 options to the preprocessor so that it the cc1 spec may manipulate
1254 options used to set target flags. Those special target flags settings may
1255 in turn cause preprocessor symbols to be defined specially. */
1256 static const char *cpp_options
=
1257 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1258 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1259 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1260 %{undef} %{save-temps*:-fpch-preprocess}";
1262 /* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
1264 Make it easy for a language to override the argument for the
1265 %:dumps specs function call. */
1266 #define DUMPS_OPTIONS(EXTS) \
1267 "%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps(" EXTS ")"
1269 /* This contains cpp options which are not passed when the preprocessor
1270 output will be used by another program. */
1271 static const char *cpp_debug_options
= DUMPS_OPTIONS ("");
1273 /* NB: This is shared amongst all front-ends, except for Ada. */
1274 static const char *cc1_options
=
1275 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1276 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1277 %1 %{!Q:-quiet} %(cpp_debug_options) %{m*} %{aux-info*}\
1278 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1279 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1280 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1281 %{-target-help:--target-help}\
1282 %{-version:--version}\
1283 %{-help=*:--help=%*}\
1284 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %w%b.s}}}\
1285 %{fsyntax-only:-o %j} %{-param*}\
1286 %{coverage:-fprofile-arcs -ftest-coverage}\
1287 %{fprofile-arcs|fprofile-generate*|coverage:\
1288 %{!fprofile-update=single:\
1289 %{pthread:-fprofile-update=prefer-atomic}}}";
1291 static const char *asm_options
=
1292 "%{-target-help:%:print-asm-header()} "
1294 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
1295 to the assembler equivalents. */
1296 "%{v} %{w:-W} %{I*} "
1298 "%(asm_debug_option)"
1299 ASM_COMPRESS_DEBUG_SPEC
1300 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1302 static const char *invoke_as
=
1303 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1305 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1306 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1310 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1311 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1315 /* Some compilers have limits on line lengths, and the multilib_select
1316 and/or multilib_matches strings can be very long, so we build them at
1318 static struct obstack multilib_obstack
;
1319 static const char *multilib_select
;
1320 static const char *multilib_matches
;
1321 static const char *multilib_defaults
;
1322 static const char *multilib_exclusions
;
1323 static const char *multilib_reuse
;
1325 /* Check whether a particular argument is a default argument. */
1327 #ifndef MULTILIB_DEFAULTS
1328 #define MULTILIB_DEFAULTS { "" }
1331 static const char *const multilib_defaults_raw
[] = MULTILIB_DEFAULTS
;
1333 #ifndef DRIVER_SELF_SPECS
1334 #define DRIVER_SELF_SPECS ""
1337 /* Linking to libgomp implies pthreads. This is particularly important
1338 for targets that use different start files and suchlike. */
1339 #ifndef GOMP_SELF_SPECS
1340 #define GOMP_SELF_SPECS \
1341 "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1345 /* Likewise for -fgnu-tm. */
1346 #ifndef GTM_SELF_SPECS
1347 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1350 static const char *const driver_self_specs
[] = {
1351 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1352 DRIVER_SELF_SPECS
, CONFIGURE_SPECS
, GOMP_SELF_SPECS
, GTM_SELF_SPECS
1355 #ifndef OPTION_DEFAULT_SPECS
1356 #define OPTION_DEFAULT_SPECS { "", "" }
1365 static const struct default_spec
1366 option_default_specs
[] = { OPTION_DEFAULT_SPECS
};
1370 struct user_specs
*next
;
1371 const char *filename
;
1374 static struct user_specs
*user_specs_head
, *user_specs_tail
;
1376 /* Record the mapping from file suffixes for compilation specs. */
1380 const char *suffix
; /* Use this compiler for input files
1381 whose names end in this suffix. */
1383 const char *spec
; /* To use this compiler, run this spec. */
1385 const char *cpp_spec
; /* If non-NULL, substitute this spec
1386 for `%C', rather than the usual
1388 int combinable
; /* If nonzero, compiler can deal with
1389 multiple source files at once (IMA). */
1390 int needs_preprocessing
; /* If nonzero, source files need to
1391 be run through a preprocessor. */
1394 /* Pointer to a vector of `struct compiler' that gives the spec for
1395 compiling a file, based on its suffix.
1396 A file that does not end in any of these suffixes will be passed
1397 unchanged to the loader and nothing else will be done to it.
1399 An entry containing two 0s is used to terminate the vector.
1401 If multiple entries match a file, the last matching one is used. */
1403 static struct compiler
*compilers
;
1405 /* Number of entries in `compilers', not counting the null terminator. */
1407 static int n_compilers
;
1409 /* The default list of file name suffixes and their compilation specs. */
1411 static const struct compiler default_compilers
[] =
1413 /* Add lists of suffixes of known languages here. If those languages
1414 were not present when we built the driver, we will hit these copies
1415 and be given a more meaningful error than "file not used since
1416 linking is not done". */
1417 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1418 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1419 {".mii", "#Objective-C++", 0, 0, 0},
1420 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1421 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1422 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1423 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1424 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1425 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1426 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1427 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1428 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1429 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1430 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1431 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1432 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1433 {".r", "#Ratfor", 0, 0, 0},
1434 {".go", "#Go", 0, 1, 0},
1435 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1436 /* Next come the entries for C. */
1437 {".c", "@c", 0, 0, 1},
1439 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1440 external preprocessor if -save-temps is given. */
1441 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1444 %eGNU C no longer supports -traditional without -E}\
1445 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1446 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1447 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1449 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1450 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1451 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1453 "%{!E:%e-E or -x required when input is from standard input}\
1454 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1455 {".h", "@c-header", 0, 0, 0},
1457 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1458 external preprocessor if -save-temps is given. */
1459 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1461 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1462 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1463 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1465 %{!fsyntax-only:%{!S:-o %g.s} \
1466 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1467 %W{o*:--output-pch=%*}}%V}}\
1468 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1469 cc1 %(cpp_unique_options) %(cc1_options)\
1470 %{!fsyntax-only:%{!S:-o %g.s} \
1471 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1472 %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
1473 {".i", "@cpp-output", 0, 0, 0},
1475 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1476 {".s", "@assembler", 0, 0, 0},
1478 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1479 {".sx", "@assembler-with-cpp", 0, 0, 0},
1480 {".S", "@assembler-with-cpp", 0, 0, 0},
1481 {"@assembler-with-cpp",
1482 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1483 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1484 %{E|M|MM:%(cpp_debug_options)}\
1485 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1486 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1488 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1489 %{E|M|MM:%(cpp_debug_options)}\
1490 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1491 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1496 /* Mark end of table. */
1500 /* Number of elements in default_compilers, not counting the terminator. */
1502 static const int n_default_compilers
= ARRAY_SIZE (default_compilers
) - 1;
1504 typedef char *char_p
; /* For DEF_VEC_P. */
1506 /* A vector of options to give to the linker.
1507 These options are accumulated by %x,
1508 and substituted into the linker command with %X. */
1509 static vec
<char_p
> linker_options
;
1511 /* A vector of options to give to the assembler.
1512 These options are accumulated by -Wa,
1513 and substituted into the assembler command with %Y. */
1514 static vec
<char_p
> assembler_options
;
1516 /* A vector of options to give to the preprocessor.
1517 These options are accumulated by -Wp,
1518 and substituted into the preprocessor command with %Z. */
1519 static vec
<char_p
> preprocessor_options
;
1522 skip_whitespace (char *p
)
1526 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1527 be considered whitespace. */
1528 if (p
[0] == '\n' && p
[1] == '\n' && p
[2] == '\n')
1530 else if (*p
== '\n' || *p
== ' ' || *p
== '\t')
1544 /* Structures to keep track of prefixes to try when looking for files. */
1548 const char *prefix
; /* String to prepend to the path. */
1549 struct prefix_list
*next
; /* Next in linked list. */
1550 int require_machine_suffix
; /* Don't use without machine_suffix. */
1551 /* 2 means try both machine_suffix and just_machine_suffix. */
1552 int priority
; /* Sort key - priority within list. */
1553 int os_multilib
; /* 1 if OS multilib scheme should be used,
1554 0 for GCC multilib scheme. */
1559 struct prefix_list
*plist
; /* List of prefixes to try */
1560 int max_len
; /* Max length of a prefix in PLIST */
1561 const char *name
; /* Name of this list (used in config stuff) */
1564 /* List of prefixes to try when looking for executables. */
1566 static struct path_prefix exec_prefixes
= { 0, 0, "exec" };
1568 /* List of prefixes to try when looking for startup (crt0) files. */
1570 static struct path_prefix startfile_prefixes
= { 0, 0, "startfile" };
1572 /* List of prefixes to try when looking for include files. */
1574 static struct path_prefix include_prefixes
= { 0, 0, "include" };
1576 /* Suffix to attach to directories searched for commands.
1577 This looks like `MACHINE/VERSION/'. */
1579 static const char *machine_suffix
= 0;
1581 /* Suffix to attach to directories searched for commands.
1582 This is just `MACHINE/'. */
1584 static const char *just_machine_suffix
= 0;
1586 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1588 static const char *gcc_exec_prefix
;
1590 /* Adjusted value of standard_libexec_prefix. */
1592 static const char *gcc_libexec_prefix
;
1594 /* Default prefixes to attach to command names. */
1596 #ifndef STANDARD_STARTFILE_PREFIX_1
1597 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1599 #ifndef STANDARD_STARTFILE_PREFIX_2
1600 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1603 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1604 #undef MD_EXEC_PREFIX
1605 #undef MD_STARTFILE_PREFIX
1606 #undef MD_STARTFILE_PREFIX_1
1609 /* If no prefixes defined, use the null string, which will disable them. */
1610 #ifndef MD_EXEC_PREFIX
1611 #define MD_EXEC_PREFIX ""
1613 #ifndef MD_STARTFILE_PREFIX
1614 #define MD_STARTFILE_PREFIX ""
1616 #ifndef MD_STARTFILE_PREFIX_1
1617 #define MD_STARTFILE_PREFIX_1 ""
1620 /* These directories are locations set at configure-time based on the
1621 --prefix option provided to configure. Their initializers are
1622 defined in Makefile.in. These paths are not *directly* used when
1623 gcc_exec_prefix is set because, in that case, we know where the
1624 compiler has been installed, and use paths relative to that
1625 location instead. */
1626 static const char *const standard_exec_prefix
= STANDARD_EXEC_PREFIX
;
1627 static const char *const standard_libexec_prefix
= STANDARD_LIBEXEC_PREFIX
;
1628 static const char *const standard_bindir_prefix
= STANDARD_BINDIR_PREFIX
;
1629 static const char *const standard_startfile_prefix
= STANDARD_STARTFILE_PREFIX
;
1631 /* For native compilers, these are well-known paths containing
1632 components that may be provided by the system. For cross
1633 compilers, these paths are not used. */
1634 static const char *md_exec_prefix
= MD_EXEC_PREFIX
;
1635 static const char *md_startfile_prefix
= MD_STARTFILE_PREFIX
;
1636 static const char *md_startfile_prefix_1
= MD_STARTFILE_PREFIX_1
;
1637 static const char *const standard_startfile_prefix_1
1638 = STANDARD_STARTFILE_PREFIX_1
;
1639 static const char *const standard_startfile_prefix_2
1640 = STANDARD_STARTFILE_PREFIX_2
;
1642 /* A relative path to be used in finding the location of tools
1643 relative to the driver. */
1644 static const char *const tooldir_base_prefix
= TOOLDIR_BASE_PREFIX
;
1646 /* A prefix to be used when this is an accelerator compiler. */
1647 static const char *const accel_dir_suffix
= ACCEL_DIR_SUFFIX
;
1649 /* Subdirectory to use for locating libraries. Set by
1650 set_multilib_dir based on the compilation options. */
1652 static const char *multilib_dir
;
1654 /* Subdirectory to use for locating libraries in OS conventions. Set by
1655 set_multilib_dir based on the compilation options. */
1657 static const char *multilib_os_dir
;
1659 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1660 set_multilib_dir based on the compilation options. */
1662 static const char *multiarch_dir
;
1664 /* Structure to keep track of the specs that have been defined so far.
1665 These are accessed using %(specname) in a compiler or link
1670 /* The following 2 fields must be first */
1671 /* to allow EXTRA_SPECS to be initialized */
1672 const char *name
; /* name of the spec. */
1673 const char *ptr
; /* available ptr if no static pointer */
1675 /* The following fields are not initialized */
1676 /* by EXTRA_SPECS */
1677 const char **ptr_spec
; /* pointer to the spec itself. */
1678 struct spec_list
*next
; /* Next spec in linked list. */
1679 int name_len
; /* length of the name */
1680 bool user_p
; /* whether string come from file spec. */
1681 bool alloc_p
; /* whether string was allocated */
1682 const char *default_ptr
; /* The default value of *ptr_spec. */
1685 #define INIT_STATIC_SPEC(NAME,PTR) \
1686 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1689 /* List of statically defined specs. */
1690 static struct spec_list static_specs
[] =
1692 INIT_STATIC_SPEC ("asm", &asm_spec
),
1693 INIT_STATIC_SPEC ("asm_debug", &asm_debug
),
1694 INIT_STATIC_SPEC ("asm_debug_option", &asm_debug_option
),
1695 INIT_STATIC_SPEC ("asm_final", &asm_final_spec
),
1696 INIT_STATIC_SPEC ("asm_options", &asm_options
),
1697 INIT_STATIC_SPEC ("invoke_as", &invoke_as
),
1698 INIT_STATIC_SPEC ("cpp", &cpp_spec
),
1699 INIT_STATIC_SPEC ("cpp_options", &cpp_options
),
1700 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options
),
1701 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options
),
1702 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp
),
1703 INIT_STATIC_SPEC ("cc1", &cc1_spec
),
1704 INIT_STATIC_SPEC ("cc1_options", &cc1_options
),
1705 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec
),
1706 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec
),
1707 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec
),
1708 INIT_STATIC_SPEC ("endfile", &endfile_spec
),
1709 INIT_STATIC_SPEC ("link", &link_spec
),
1710 INIT_STATIC_SPEC ("lib", &lib_spec
),
1711 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec
),
1712 INIT_STATIC_SPEC ("libgcc", &libgcc_spec
),
1713 INIT_STATIC_SPEC ("startfile", &startfile_spec
),
1714 INIT_STATIC_SPEC ("cross_compile", &cross_compile
),
1715 INIT_STATIC_SPEC ("version", &compiler_version
),
1716 INIT_STATIC_SPEC ("multilib", &multilib_select
),
1717 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults
),
1718 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra
),
1719 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches
),
1720 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions
),
1721 INIT_STATIC_SPEC ("multilib_options", &multilib_options
),
1722 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse
),
1723 INIT_STATIC_SPEC ("linker", &linker_name_spec
),
1724 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec
),
1725 INIT_STATIC_SPEC ("lto_wrapper", <o_wrapper_spec
),
1726 INIT_STATIC_SPEC ("lto_gcc", <o_gcc_spec
),
1727 INIT_STATIC_SPEC ("post_link", &post_link_spec
),
1728 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec
),
1729 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix
),
1730 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix
),
1731 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1
),
1732 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec
),
1733 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec
),
1734 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec
),
1735 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec
),
1736 INIT_STATIC_SPEC ("self_spec", &self_spec
),
1739 #ifdef EXTRA_SPECS /* additional specs needed */
1740 /* Structure to keep track of just the first two args of a spec_list.
1741 That is all that the EXTRA_SPECS macro gives us. */
1744 const char *const name
;
1745 const char *const ptr
;
1748 static const struct spec_list_1 extra_specs_1
[] = { EXTRA_SPECS
};
1749 static struct spec_list
*extra_specs
= (struct spec_list
*) 0;
1752 /* List of dynamically allocates specs that have been defined so far. */
1754 static struct spec_list
*specs
= (struct spec_list
*) 0;
1756 /* List of static spec functions. */
1758 static const struct spec_function static_spec_functions
[] =
1760 { "getenv", getenv_spec_function
},
1761 { "if-exists", if_exists_spec_function
},
1762 { "if-exists-else", if_exists_else_spec_function
},
1763 { "if-exists-then-else", if_exists_then_else_spec_function
},
1764 { "sanitize", sanitize_spec_function
},
1765 { "replace-outfile", replace_outfile_spec_function
},
1766 { "remove-outfile", remove_outfile_spec_function
},
1767 { "version-compare", version_compare_spec_function
},
1768 { "include", include_spec_function
},
1769 { "find-file", find_file_spec_function
},
1770 { "find-plugindir", find_plugindir_spec_function
},
1771 { "print-asm-header", print_asm_header_spec_function
},
1772 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function
},
1773 { "compare-debug-self-opt", compare_debug_self_opt_spec_function
},
1774 { "pass-through-libs", pass_through_libs_spec_func
},
1775 { "dumps", dumps_spec_func
},
1776 { "gt", greater_than_spec_func
},
1777 { "debug-level-gt", debug_level_greater_than_spec_func
},
1778 { "dwarf-version-gt", dwarf_version_greater_than_spec_func
},
1779 { "fortran-preinclude-file", find_fortran_preinclude_file
},
1780 #ifdef EXTRA_SPEC_FUNCTIONS
1781 EXTRA_SPEC_FUNCTIONS
1786 static int processing_spec_function
;
1788 /* Add appropriate libgcc specs to OBSTACK, taking into account
1789 various permutations of -shared-libgcc, -shared, and such. */
1791 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1793 #ifndef USE_LD_AS_NEEDED
1794 #define USE_LD_AS_NEEDED 0
1798 init_gcc_specs (struct obstack
*obstack
, const char *shared_name
,
1799 const char *static_name
, const char *eh_name
)
1803 #if USE_LD_AS_NEEDED
1804 buf
= concat ("%{static|static-libgcc|static-pie:", static_name
, " ", eh_name
, "}"
1805 "%{!static:%{!static-libgcc:%{!static-pie:"
1806 "%{!shared-libgcc:",
1807 static_name
, " " LD_AS_NEEDED_OPTION
" ",
1808 shared_name
, " " LD_NO_AS_NEEDED_OPTION
1811 shared_name
, "%{!shared: ", static_name
, "}"
1814 buf
= concat ("%{static|static-libgcc:", static_name
, " ", eh_name
, "}"
1815 "%{!static:%{!static-libgcc:"
1817 "%{!shared-libgcc:", static_name
, " ", eh_name
, "}"
1818 "%{shared-libgcc:", shared_name
, " ", static_name
, "}"
1822 "%{shared-libgcc:", shared_name
, "}"
1823 "%{!shared-libgcc:", static_name
, "}"
1826 "%{shared:", shared_name
, "}"
1831 obstack_grow (obstack
, buf
, strlen (buf
));
1834 #endif /* ENABLE_SHARED_LIBGCC */
1836 /* Initialize the specs lookup routines. */
1841 struct spec_list
*next
= (struct spec_list
*) 0;
1842 struct spec_list
*sl
= (struct spec_list
*) 0;
1846 return; /* Already initialized. */
1849 fnotice (stderr
, "Using built-in specs.\n");
1852 extra_specs
= XCNEWVEC (struct spec_list
, ARRAY_SIZE (extra_specs_1
));
1854 for (i
= ARRAY_SIZE (extra_specs_1
) - 1; i
>= 0; i
--)
1856 sl
= &extra_specs
[i
];
1857 sl
->name
= extra_specs_1
[i
].name
;
1858 sl
->ptr
= extra_specs_1
[i
].ptr
;
1860 sl
->name_len
= strlen (sl
->name
);
1861 sl
->ptr_spec
= &sl
->ptr
;
1862 gcc_assert (sl
->ptr_spec
!= NULL
);
1863 sl
->default_ptr
= sl
->ptr
;
1868 for (i
= ARRAY_SIZE (static_specs
) - 1; i
>= 0; i
--)
1870 sl
= &static_specs
[i
];
1875 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1876 /* ??? If neither -shared-libgcc nor --static-libgcc was
1877 seen, then we should be making an educated guess. Some proposed
1878 heuristics for ELF include:
1880 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1881 program will be doing dynamic loading, which will likely
1882 need the shared libgcc.
1884 (2) If "-ldl", then it's also a fair bet that we're doing
1887 (3) For each ET_DYN we're linking against (either through -lfoo
1888 or /some/path/foo.so), check to see whether it or one of
1889 its dependencies depends on a shared libgcc.
1893 If the runtime is fixed to look for program headers instead
1894 of calling __register_frame_info at all, for each object,
1895 use the shared libgcc if any EH symbol referenced.
1897 If crtstuff is fixed to not invoke __register_frame_info
1898 automatically, for each object, use the shared libgcc if
1899 any non-empty unwind section found.
1901 Doing any of this probably requires invoking an external program to
1902 do the actual object file scanning. */
1904 const char *p
= libgcc_spec
;
1907 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1908 when given the proper command line arguments. */
1911 if (in_sep
&& *p
== '-' && startswith (p
, "-lgcc"))
1913 init_gcc_specs (&obstack
,
1915 #ifdef USE_LIBUNWIND_EXCEPTIONS
1921 #ifdef USE_LIBUNWIND_EXCEPTIONS
1922 # ifdef HAVE_LD_STATIC_DYNAMIC
1923 " %{!static:%{!static-pie:" LD_STATIC_OPTION
"}} -lunwind"
1924 " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION
"}}"
1934 else if (in_sep
&& *p
== 'l' && startswith (p
, "libgcc.a%s"))
1936 /* Ug. We don't know shared library extensions. Hope that
1937 systems that use this form don't do shared libraries. */
1938 init_gcc_specs (&obstack
,
1942 #ifdef USE_LIBUNWIND_EXCEPTIONS
1951 obstack_1grow (&obstack
, *p
);
1952 in_sep
= (*p
== ' ');
1957 obstack_1grow (&obstack
, '\0');
1958 libgcc_spec
= XOBFINISH (&obstack
, const char *);
1961 #ifdef USE_AS_TRADITIONAL_FORMAT
1962 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1964 static const char tf
[] = "--traditional-format ";
1965 obstack_grow (&obstack
, tf
, sizeof (tf
) - 1);
1966 obstack_grow0 (&obstack
, asm_spec
, strlen (asm_spec
));
1967 asm_spec
= XOBFINISH (&obstack
, const char *);
1971 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1972 defined LINKER_HASH_STYLE
1973 # ifdef LINK_BUILDID_SPEC
1974 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1975 obstack_grow (&obstack
, LINK_BUILDID_SPEC
, sizeof (LINK_BUILDID_SPEC
) - 1);
1977 # ifdef LINK_EH_SPEC
1978 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1979 obstack_grow (&obstack
, LINK_EH_SPEC
, sizeof (LINK_EH_SPEC
) - 1);
1981 # ifdef LINKER_HASH_STYLE
1982 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1985 static const char hash_style
[] = "--hash-style=";
1986 obstack_grow (&obstack
, hash_style
, sizeof (hash_style
) - 1);
1987 obstack_grow (&obstack
, LINKER_HASH_STYLE
, sizeof (LINKER_HASH_STYLE
) - 1);
1988 obstack_1grow (&obstack
, ' ');
1991 obstack_grow0 (&obstack
, link_spec
, strlen (link_spec
));
1992 link_spec
= XOBFINISH (&obstack
, const char *);
1998 /* Update the entry for SPEC in the static_specs table to point to VALUE,
1999 ensuring that we free the previous value if necessary. Set alloc_p for the
2000 entry to ALLOC_P: this determines whether we take ownership of VALUE (i.e.
2001 whether we need to free it later on). */
2003 set_static_spec (const char **spec
, const char *value
, bool alloc_p
)
2005 struct spec_list
*sl
= NULL
;
2007 for (unsigned i
= 0; i
< ARRAY_SIZE (static_specs
); i
++)
2009 if (static_specs
[i
].ptr_spec
== spec
)
2011 sl
= static_specs
+ i
;
2020 const char *old
= *spec
;
2021 free (const_cast <char *> (old
));
2025 sl
->alloc_p
= alloc_p
;
2028 /* Update a static spec to a new string, taking ownership of that
2030 static void set_static_spec_owned (const char **spec
, const char *val
)
2032 return set_static_spec (spec
, val
, true);
2035 /* Update a static spec to point to a new value, but don't take
2036 ownership of (i.e. don't free) that string. */
2037 static void set_static_spec_shared (const char **spec
, const char *val
)
2039 return set_static_spec (spec
, val
, false);
2042 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
2043 removed; If the spec starts with a + then SPEC is added to the end of the
2047 set_spec (const char *name
, const char *spec
, bool user_p
)
2049 struct spec_list
*sl
;
2050 const char *old_spec
;
2051 int name_len
= strlen (name
);
2054 /* If this is the first call, initialize the statically allocated specs. */
2057 struct spec_list
*next
= (struct spec_list
*) 0;
2058 for (i
= ARRAY_SIZE (static_specs
) - 1; i
>= 0; i
--)
2060 sl
= &static_specs
[i
];
2067 /* See if the spec already exists. */
2068 for (sl
= specs
; sl
; sl
= sl
->next
)
2069 if (name_len
== sl
->name_len
&& !strcmp (sl
->name
, name
))
2074 /* Not found - make it. */
2075 sl
= XNEW (struct spec_list
);
2076 sl
->name
= xstrdup (name
);
2077 sl
->name_len
= name_len
;
2078 sl
->ptr_spec
= &sl
->ptr
;
2080 *(sl
->ptr_spec
) = "";
2082 sl
->default_ptr
= NULL
;
2086 old_spec
= *(sl
->ptr_spec
);
2087 *(sl
->ptr_spec
) = ((spec
[0] == '+' && ISSPACE ((unsigned char)spec
[1]))
2088 ? concat (old_spec
, spec
+ 1, NULL
)
2093 fnotice (stderr
, "Setting spec %s to '%s'\n\n", name
, *(sl
->ptr_spec
));
2096 /* Free the old spec. */
2097 if (old_spec
&& sl
->alloc_p
)
2098 free (CONST_CAST (char *, old_spec
));
2100 sl
->user_p
= user_p
;
2104 /* Accumulate a command (program name and args), and run it. */
2106 typedef const char *const_char_p
; /* For DEF_VEC_P. */
2108 /* Vector of pointers to arguments in the current line of specifications. */
2109 static vec
<const_char_p
> argbuf
;
2111 /* Likewise, but for the current @file. */
2112 static vec
<const_char_p
> at_file_argbuf
;
2114 /* Whether an @file is currently open. */
2115 static bool in_at_file
= false;
2117 /* Were the options -c, -S or -E passed. */
2118 static int have_c
= 0;
2120 /* Was the option -o passed. */
2121 static int have_o
= 0;
2123 /* Was the option -E passed. */
2124 static int have_E
= 0;
2126 /* Pointer to output file name passed in with -o. */
2127 static const char *output_file
= 0;
2129 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
2130 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
2133 static struct temp_name
{
2134 const char *suffix
; /* suffix associated with the code. */
2135 int length
; /* strlen (suffix). */
2136 int unique
; /* Indicates whether %g or %u/%U was used. */
2137 const char *filename
; /* associated filename. */
2138 int filename_length
; /* strlen (filename). */
2139 struct temp_name
*next
;
2142 /* Number of commands executed so far. */
2144 static int execution_count
;
2146 /* Number of commands that exited with a signal. */
2148 static int signal_count
;
2150 /* Allocate the argument vector. */
2156 at_file_argbuf
.create (10);
2159 /* Clear out the vector of arguments (after a command is executed). */
2164 argbuf
.truncate (0);
2165 at_file_argbuf
.truncate (0);
2168 /* Add one argument to the vector at the end.
2169 This is done when a space is seen or at the end of the line.
2170 If DELETE_ALWAYS is nonzero, the arg is a filename
2171 and the file should be deleted eventually.
2172 If DELETE_FAILURE is nonzero, the arg is a filename
2173 and the file should be deleted if this compilation fails. */
2176 store_arg (const char *arg
, int delete_always
, int delete_failure
)
2179 at_file_argbuf
.safe_push (arg
);
2181 argbuf
.safe_push (arg
);
2183 if (delete_always
|| delete_failure
)
2186 /* If the temporary file we should delete is specified as
2187 part of a joined argument extract the filename. */
2189 && (p
= strrchr (arg
, '=')))
2191 record_temp_file (arg
, delete_always
, delete_failure
);
2195 /* Open a temporary @file into which subsequent arguments will be stored. */
2201 fatal_error (input_location
, "cannot open nested response file");
2206 /* Create a temporary @file name. */
2208 static char *make_at_file (void)
2210 static int fileno
= 0;
2212 const char *base
, *ext
;
2214 if (!save_temps_flag
)
2215 return make_temp_file ("");
2218 if (!(base
&& *base
))
2220 if (!(base
&& *base
))
2223 sprintf (filename
, ".args.%d", fileno
++);
2226 if (base
== dumpdir
&& dumpdir_trailing_dash_added
)
2229 return concat (base
, ext
, NULL
);
2232 /* Close the temporary @file and add @file to the argument list. */
2235 close_at_file (void)
2238 fatal_error (input_location
, "cannot close nonexistent response file");
2242 const unsigned int n_args
= at_file_argbuf
.length ();
2246 char **argv
= XALLOCAVEC (char *, n_args
+ 1);
2247 char *temp_file
= make_at_file ();
2248 char *at_argument
= concat ("@", temp_file
, NULL
);
2249 FILE *f
= fopen (temp_file
, "w");
2253 /* Copy the strings over. */
2254 for (i
= 0; i
< n_args
; i
++)
2255 argv
[i
] = CONST_CAST (char *, at_file_argbuf
[i
]);
2258 at_file_argbuf
.truncate (0);
2261 fatal_error (input_location
, "could not open temporary response file %s",
2264 status
= writeargv (argv
, f
);
2267 fatal_error (input_location
,
2268 "could not write to temporary response file %s",
2271 status
= fclose (f
);
2274 fatal_error (input_location
, "could not close temporary response file %s",
2277 store_arg (at_argument
, 0, 0);
2279 record_temp_file (temp_file
, !save_temps_flag
, !save_temps_flag
);
2282 /* Load specs from a file name named FILENAME, replacing occurrences of
2283 various different types of line-endings, \r\n, \n\r and just \r, with
2287 load_specs (const char *filename
)
2291 struct stat statbuf
;
2298 fnotice (stderr
, "Reading specs from %s\n", filename
);
2300 /* Open and stat the file. */
2301 desc
= open (filename
, O_RDONLY
, 0);
2305 /* This leaves DESC open, but the OS will save us. */
2306 fatal_error (input_location
, "cannot read spec file %qs: %m", filename
);
2309 if (stat (filename
, &statbuf
) < 0)
2312 /* Read contents of file into BUFFER. */
2313 buffer
= XNEWVEC (char, statbuf
.st_size
+ 1);
2314 readlen
= read (desc
, buffer
, (unsigned) statbuf
.st_size
);
2317 buffer
[readlen
] = 0;
2320 specs
= XNEWVEC (char, readlen
+ 1);
2322 for (buffer_p
= buffer
; buffer_p
&& *buffer_p
; buffer_p
++)
2328 if (buffer_p
> buffer
&& *(buffer_p
- 1) == '\n') /* \n\r */
2330 else if (*(buffer_p
+ 1) == '\n') /* \r\n */
2344 /* Read compilation specs from a file named FILENAME,
2345 replacing the default ones.
2347 A suffix which starts with `*' is a definition for
2348 one of the machine-specific sub-specs. The "suffix" should be
2349 *asm, *cc1, *cpp, *link, *startfile, etc.
2350 The corresponding spec is stored in asm_spec, etc.,
2351 rather than in the `compilers' vector.
2353 Anything invalid in the file is a fatal error. */
2356 read_specs (const char *filename
, bool main_p
, bool user_p
)
2361 buffer
= load_specs (filename
);
2363 /* Scan BUFFER for specs, putting them in the vector. */
2369 char *in
, *out
, *p1
, *p2
, *p3
;
2371 /* Advance P in BUFFER to the next nonblank nocomment line. */
2372 p
= skip_whitespace (p
);
2376 /* Is this a special command that starts with '%'? */
2377 /* Don't allow this for the main specs file, since it would
2378 encourage people to overwrite it. */
2379 if (*p
== '%' && !main_p
)
2382 while (*p
&& *p
!= '\n')
2388 if (startswith (p1
, "%include")
2389 && (p1
[sizeof "%include" - 1] == ' '
2390 || p1
[sizeof "%include" - 1] == '\t'))
2394 p1
+= sizeof ("%include");
2395 while (*p1
== ' ' || *p1
== '\t')
2398 if (*p1
++ != '<' || p
[-2] != '>')
2399 fatal_error (input_location
,
2400 "specs %%include syntax malformed after "
2402 (long) (p1
- buffer
+ 1));
2405 new_filename
= find_a_file (&startfile_prefixes
, p1
, R_OK
, true);
2406 read_specs (new_filename
? new_filename
: p1
, false, user_p
);
2409 else if (startswith (p1
, "%include_noerr")
2410 && (p1
[sizeof "%include_noerr" - 1] == ' '
2411 || p1
[sizeof "%include_noerr" - 1] == '\t'))
2415 p1
+= sizeof "%include_noerr";
2416 while (*p1
== ' ' || *p1
== '\t')
2419 if (*p1
++ != '<' || p
[-2] != '>')
2420 fatal_error (input_location
,
2421 "specs %%include syntax malformed after "
2423 (long) (p1
- buffer
+ 1));
2426 new_filename
= find_a_file (&startfile_prefixes
, p1
, R_OK
, true);
2428 read_specs (new_filename
, false, user_p
);
2429 else if (verbose_flag
)
2430 fnotice (stderr
, "could not find specs file %s\n", p1
);
2433 else if (startswith (p1
, "%rename")
2434 && (p1
[sizeof "%rename" - 1] == ' '
2435 || p1
[sizeof "%rename" - 1] == '\t'))
2438 struct spec_list
*sl
;
2439 struct spec_list
*newsl
;
2441 /* Get original name. */
2442 p1
+= sizeof "%rename";
2443 while (*p1
== ' ' || *p1
== '\t')
2446 if (! ISALPHA ((unsigned char) *p1
))
2447 fatal_error (input_location
,
2448 "specs %%rename syntax malformed after "
2450 (long) (p1
- buffer
));
2453 while (*p2
&& !ISSPACE ((unsigned char) *p2
))
2456 if (*p2
!= ' ' && *p2
!= '\t')
2457 fatal_error (input_location
,
2458 "specs %%rename syntax malformed after "
2460 (long) (p2
- buffer
));
2464 while (*p2
== ' ' || *p2
== '\t')
2467 if (! ISALPHA ((unsigned char) *p2
))
2468 fatal_error (input_location
,
2469 "specs %%rename syntax malformed after "
2471 (long) (p2
- buffer
));
2473 /* Get new spec name. */
2475 while (*p3
&& !ISSPACE ((unsigned char) *p3
))
2479 fatal_error (input_location
,
2480 "specs %%rename syntax malformed after "
2482 (long) (p3
- buffer
));
2485 for (sl
= specs
; sl
; sl
= sl
->next
)
2486 if (name_len
== sl
->name_len
&& !strcmp (sl
->name
, p1
))
2490 fatal_error (input_location
,
2491 "specs %s spec was not found to be renamed", p1
);
2493 if (strcmp (p1
, p2
) == 0)
2496 for (newsl
= specs
; newsl
; newsl
= newsl
->next
)
2497 if (strcmp (newsl
->name
, p2
) == 0)
2498 fatal_error (input_location
,
2499 "%s: attempt to rename spec %qs to "
2500 "already defined spec %qs",
2505 fnotice (stderr
, "rename spec %s to %s\n", p1
, p2
);
2507 fnotice (stderr
, "spec is '%s'\n\n", *(sl
->ptr_spec
));
2511 set_spec (p2
, *(sl
->ptr_spec
), user_p
);
2513 free (CONST_CAST (char *, *(sl
->ptr_spec
)));
2515 *(sl
->ptr_spec
) = "";
2520 fatal_error (input_location
,
2521 "specs unknown %% command after %ld characters",
2522 (long) (p1
- buffer
));
2525 /* Find the colon that should end the suffix. */
2527 while (*p1
&& *p1
!= ':' && *p1
!= '\n')
2530 /* The colon shouldn't be missing. */
2532 fatal_error (input_location
,
2533 "specs file malformed after %ld characters",
2534 (long) (p1
- buffer
));
2536 /* Skip back over trailing whitespace. */
2538 while (p2
> buffer
&& (p2
[-1] == ' ' || p2
[-1] == '\t'))
2541 /* Copy the suffix to a string. */
2542 suffix
= save_string (p
, p2
- p
);
2543 /* Find the next line. */
2544 p
= skip_whitespace (p1
+ 1);
2546 fatal_error (input_location
,
2547 "specs file malformed after %ld characters",
2548 (long) (p
- buffer
));
2551 /* Find next blank line or end of string. */
2552 while (*p1
&& !(*p1
== '\n' && (p1
[1] == '\n' || p1
[1] == '\0')))
2555 /* Specs end at the blank line and do not include the newline. */
2556 spec
= save_string (p
, p1
- p
);
2559 /* Delete backslash-newline sequences from the spec. */
2564 if (in
[0] == '\\' && in
[1] == '\n')
2566 else if (in
[0] == '#')
2567 while (*in
&& *in
!= '\n')
2575 if (suffix
[0] == '*')
2577 if (! strcmp (suffix
, "*link_command"))
2578 link_command_spec
= spec
;
2581 set_spec (suffix
+ 1, spec
, user_p
);
2587 /* Add this pair to the vector. */
2589 = XRESIZEVEC (struct compiler
, compilers
, n_compilers
+ 2);
2591 compilers
[n_compilers
].suffix
= suffix
;
2592 compilers
[n_compilers
].spec
= spec
;
2594 memset (&compilers
[n_compilers
], 0, sizeof compilers
[n_compilers
]);
2598 link_command_spec
= spec
;
2601 if (link_command_spec
== 0)
2602 fatal_error (input_location
, "spec file has no spec for linking");
2604 XDELETEVEC (buffer
);
2607 /* Record the names of temporary files we tell compilers to write,
2608 and delete them at the end of the run. */
2610 /* This is the common prefix we use to make temp file names.
2611 It is chosen once for each run of this program.
2612 It is substituted into a spec by %g or %j.
2613 Thus, all temp file names contain this prefix.
2614 In practice, all temp file names start with this prefix.
2616 This prefix comes from the envvar TMPDIR if it is defined;
2617 otherwise, from the P_tmpdir macro if that is defined;
2618 otherwise, in /usr/tmp or /tmp;
2619 or finally the current directory if all else fails. */
2621 static const char *temp_filename
;
2623 /* Length of the prefix. */
2625 static int temp_filename_length
;
2627 /* Define the list of temporary files to delete. */
2632 struct temp_file
*next
;
2635 /* Queue of files to delete on success or failure of compilation. */
2636 static struct temp_file
*always_delete_queue
;
2637 /* Queue of files to delete on failure of compilation. */
2638 static struct temp_file
*failure_delete_queue
;
2640 /* Record FILENAME as a file to be deleted automatically.
2641 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2642 otherwise delete it in any case.
2643 FAIL_DELETE nonzero means delete it if a compilation step fails;
2644 otherwise delete it in any case. */
2647 record_temp_file (const char *filename
, int always_delete
, int fail_delete
)
2649 char *const name
= xstrdup (filename
);
2653 struct temp_file
*temp
;
2654 for (temp
= always_delete_queue
; temp
; temp
= temp
->next
)
2655 if (! filename_cmp (name
, temp
->name
))
2661 temp
= XNEW (struct temp_file
);
2662 temp
->next
= always_delete_queue
;
2664 always_delete_queue
= temp
;
2671 struct temp_file
*temp
;
2672 for (temp
= failure_delete_queue
; temp
; temp
= temp
->next
)
2673 if (! filename_cmp (name
, temp
->name
))
2679 temp
= XNEW (struct temp_file
);
2680 temp
->next
= failure_delete_queue
;
2682 failure_delete_queue
= temp
;
2688 /* Delete all the temporary files whose names we previously recorded. */
2690 #ifndef DELETE_IF_ORDINARY
2691 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2694 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2695 if (unlink (NAME) < 0) \
2697 error ("%s: %m", (NAME)); \
2702 delete_if_ordinary (const char *name
)
2708 printf ("Delete %s? (y or n) ", name
);
2712 while ((c
= getchar ()) != '\n' && c
!= EOF
)
2715 if (i
== 'y' || i
== 'Y')
2717 DELETE_IF_ORDINARY (name
, st
, verbose_flag
);
2721 delete_temp_files (void)
2723 struct temp_file
*temp
;
2725 for (temp
= always_delete_queue
; temp
; temp
= temp
->next
)
2726 delete_if_ordinary (temp
->name
);
2727 always_delete_queue
= 0;
2730 /* Delete all the files to be deleted on error. */
2733 delete_failure_queue (void)
2735 struct temp_file
*temp
;
2737 for (temp
= failure_delete_queue
; temp
; temp
= temp
->next
)
2738 delete_if_ordinary (temp
->name
);
2742 clear_failure_queue (void)
2744 failure_delete_queue
= 0;
2747 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2749 If DO_MULTI is true iterate over the paths twice, first with multilib
2750 suffix then without, otherwise iterate over the paths once without
2751 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2752 to avoid visiting the same path twice, but we could do better. For
2753 instance, /usr/lib/../lib is considered different from /usr/lib.
2754 At least EXTRA_SPACE chars past the end of the path passed to
2755 CALLBACK are available for use by the callback.
2756 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2758 Returns the value returned by CALLBACK. */
2761 for_each_path (const struct path_prefix
*paths
,
2764 void *(*callback
) (char *, void *),
2765 void *callback_info
)
2767 struct prefix_list
*pl
;
2768 const char *multi_dir
= NULL
;
2769 const char *multi_os_dir
= NULL
;
2770 const char *multiarch_suffix
= NULL
;
2771 const char *multi_suffix
;
2772 const char *just_multi_suffix
;
2775 bool skip_multi_dir
= false;
2776 bool skip_multi_os_dir
= false;
2778 multi_suffix
= machine_suffix
;
2779 just_multi_suffix
= just_machine_suffix
;
2780 if (do_multi
&& multilib_dir
&& strcmp (multilib_dir
, ".") != 0)
2782 multi_dir
= concat (multilib_dir
, dir_separator_str
, NULL
);
2783 multi_suffix
= concat (multi_suffix
, multi_dir
, NULL
);
2784 just_multi_suffix
= concat (just_multi_suffix
, multi_dir
, NULL
);
2786 if (do_multi
&& multilib_os_dir
&& strcmp (multilib_os_dir
, ".") != 0)
2787 multi_os_dir
= concat (multilib_os_dir
, dir_separator_str
, NULL
);
2789 multiarch_suffix
= concat (multiarch_dir
, dir_separator_str
, NULL
);
2793 size_t multi_dir_len
= 0;
2794 size_t multi_os_dir_len
= 0;
2795 size_t multiarch_len
= 0;
2797 size_t just_suffix_len
;
2801 multi_dir_len
= strlen (multi_dir
);
2803 multi_os_dir_len
= strlen (multi_os_dir
);
2804 if (multiarch_suffix
)
2805 multiarch_len
= strlen (multiarch_suffix
);
2806 suffix_len
= strlen (multi_suffix
);
2807 just_suffix_len
= strlen (just_multi_suffix
);
2811 len
= paths
->max_len
+ extra_space
+ 1;
2812 len
+= MAX (MAX (suffix_len
, multi_os_dir_len
), multiarch_len
);
2813 path
= XNEWVEC (char, len
);
2816 for (pl
= paths
->plist
; pl
!= 0; pl
= pl
->next
)
2818 len
= strlen (pl
->prefix
);
2819 memcpy (path
, pl
->prefix
, len
);
2821 /* Look first in MACHINE/VERSION subdirectory. */
2822 if (!skip_multi_dir
)
2824 memcpy (path
+ len
, multi_suffix
, suffix_len
+ 1);
2825 ret
= callback (path
, callback_info
);
2830 /* Some paths are tried with just the machine (ie. target)
2831 subdir. This is used for finding as, ld, etc. */
2833 && pl
->require_machine_suffix
== 2)
2835 memcpy (path
+ len
, just_multi_suffix
, just_suffix_len
+ 1);
2836 ret
= callback (path
, callback_info
);
2841 /* Now try the multiarch path. */
2843 && !pl
->require_machine_suffix
&& multiarch_dir
)
2845 memcpy (path
+ len
, multiarch_suffix
, multiarch_len
+ 1);
2846 ret
= callback (path
, callback_info
);
2851 /* Now try the base path. */
2852 if (!pl
->require_machine_suffix
2853 && !(pl
->os_multilib
? skip_multi_os_dir
: skip_multi_dir
))
2855 const char *this_multi
;
2856 size_t this_multi_len
;
2858 if (pl
->os_multilib
)
2860 this_multi
= multi_os_dir
;
2861 this_multi_len
= multi_os_dir_len
;
2865 this_multi
= multi_dir
;
2866 this_multi_len
= multi_dir_len
;
2870 memcpy (path
+ len
, this_multi
, this_multi_len
+ 1);
2874 ret
= callback (path
, callback_info
);
2882 if (multi_dir
== NULL
&& multi_os_dir
== NULL
)
2885 /* Run through the paths again, this time without multilibs.
2886 Don't repeat any we have already seen. */
2889 free (CONST_CAST (char *, multi_dir
));
2891 free (CONST_CAST (char *, multi_suffix
));
2892 multi_suffix
= machine_suffix
;
2893 free (CONST_CAST (char *, just_multi_suffix
));
2894 just_multi_suffix
= just_machine_suffix
;
2897 skip_multi_dir
= true;
2900 free (CONST_CAST (char *, multi_os_dir
));
2901 multi_os_dir
= NULL
;
2904 skip_multi_os_dir
= true;
2909 free (CONST_CAST (char *, multi_dir
));
2910 free (CONST_CAST (char *, multi_suffix
));
2911 free (CONST_CAST (char *, just_multi_suffix
));
2914 free (CONST_CAST (char *, multi_os_dir
));
2920 /* Callback for build_search_list. Adds path to obstack being built. */
2922 struct add_to_obstack_info
{
2929 add_to_obstack (char *path
, void *data
)
2931 struct add_to_obstack_info
*info
= (struct add_to_obstack_info
*) data
;
2933 if (info
->check_dir
&& !is_directory (path
, false))
2936 if (!info
->first_time
)
2937 obstack_1grow (info
->ob
, PATH_SEPARATOR
);
2939 obstack_grow (info
->ob
, path
, strlen (path
));
2941 info
->first_time
= false;
2945 /* Add or change the value of an environment variable, outputting the
2946 change to standard error if in verbose mode. */
2948 xputenv (const char *string
)
2953 /* Build a list of search directories from PATHS.
2954 PREFIX is a string to prepend to the list.
2955 If CHECK_DIR_P is true we ensure the directory exists.
2956 If DO_MULTI is true, multilib paths are output first, then
2958 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2959 It is also used by the --print-search-dirs flag. */
2962 build_search_list (const struct path_prefix
*paths
, const char *prefix
,
2963 bool check_dir
, bool do_multi
)
2965 struct add_to_obstack_info info
;
2967 info
.ob
= &collect_obstack
;
2968 info
.check_dir
= check_dir
;
2969 info
.first_time
= true;
2971 obstack_grow (&collect_obstack
, prefix
, strlen (prefix
));
2972 obstack_1grow (&collect_obstack
, '=');
2974 for_each_path (paths
, do_multi
, 0, add_to_obstack
, &info
);
2976 obstack_1grow (&collect_obstack
, '\0');
2977 return XOBFINISH (&collect_obstack
, char *);
2980 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2984 putenv_from_prefixes (const struct path_prefix
*paths
, const char *env_var
,
2987 xputenv (build_search_list (paths
, env_var
, true, do_multi
));
2990 /* Check whether NAME can be accessed in MODE. This is like access,
2991 except that it never considers directories to be executable. */
2994 access_check (const char *name
, int mode
)
3000 if (stat (name
, &st
) < 0
3001 || S_ISDIR (st
.st_mode
))
3005 return access (name
, mode
);
3008 /* Callback for find_a_file. Appends the file name to the directory
3009 path. If the resulting file exists in the right mode, return the
3010 full pathname to the file. */
3012 struct file_at_path_info
{
3021 file_at_path (char *path
, void *data
)
3023 struct file_at_path_info
*info
= (struct file_at_path_info
*) data
;
3024 size_t len
= strlen (path
);
3026 memcpy (path
+ len
, info
->name
, info
->name_len
);
3027 len
+= info
->name_len
;
3029 /* Some systems have a suffix for executable files.
3030 So try appending that first. */
3031 if (info
->suffix_len
)
3033 memcpy (path
+ len
, info
->suffix
, info
->suffix_len
+ 1);
3034 if (access_check (path
, info
->mode
) == 0)
3039 if (access_check (path
, info
->mode
) == 0)
3045 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
3046 access to check permissions. If DO_MULTI is true, search multilib
3047 paths then non-multilib paths, otherwise do not search multilib paths.
3048 Return 0 if not found, otherwise return its name, allocated with malloc. */
3051 find_a_file (const struct path_prefix
*pprefix
, const char *name
, int mode
,
3054 struct file_at_path_info info
;
3056 /* Find the filename in question (special case for absolute paths). */
3058 if (IS_ABSOLUTE_PATH (name
))
3060 if (access (name
, mode
) == 0)
3061 return xstrdup (name
);
3067 info
.suffix
= (mode
& X_OK
) != 0 ? HOST_EXECUTABLE_SUFFIX
: "";
3068 info
.name_len
= strlen (info
.name
);
3069 info
.suffix_len
= strlen (info
.suffix
);
3072 return (char*) for_each_path (pprefix
, do_multi
,
3073 info
.name_len
+ info
.suffix_len
,
3074 file_at_path
, &info
);
3077 /* Specialization of find_a_file for programs that also takes into account
3078 configure-specified default programs. */
3081 find_a_program (const char *name
)
3083 /* Do not search if default matches query. */
3085 #ifdef DEFAULT_ASSEMBLER
3086 if (! strcmp (name
, "as") && access (DEFAULT_ASSEMBLER
, X_OK
) == 0)
3087 return xstrdup (DEFAULT_ASSEMBLER
);
3090 #ifdef DEFAULT_LINKER
3091 if (! strcmp (name
, "ld") && access (DEFAULT_LINKER
, X_OK
) == 0)
3092 return xstrdup (DEFAULT_LINKER
);
3095 #ifdef DEFAULT_DSYMUTIL
3096 if (! strcmp (name
, "dsymutil") && access (DEFAULT_DSYMUTIL
, X_OK
) == 0)
3097 return xstrdup (DEFAULT_DSYMUTIL
);
3100 return find_a_file (&exec_prefixes
, name
, X_OK
, false);
3103 /* Ranking of prefixes in the sort list. -B prefixes are put before
3106 enum path_prefix_priority
3108 PREFIX_PRIORITY_B_OPT
,
3109 PREFIX_PRIORITY_LAST
3112 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
3113 order according to PRIORITY. Within each PRIORITY, new entries are
3116 If WARN is nonzero, we will warn if no file is found
3117 through this prefix. WARN should point to an int
3118 which will be set to 1 if this entry is used.
3120 COMPONENT is the value to be passed to update_path.
3122 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
3123 the complete value of machine_suffix.
3124 2 means try both machine_suffix and just_machine_suffix. */
3127 add_prefix (struct path_prefix
*pprefix
, const char *prefix
,
3128 const char *component
, /* enum prefix_priority */ int priority
,
3129 int require_machine_suffix
, int os_multilib
)
3131 struct prefix_list
*pl
, **prev
;
3134 for (prev
= &pprefix
->plist
;
3135 (*prev
) != NULL
&& (*prev
)->priority
<= priority
;
3136 prev
= &(*prev
)->next
)
3139 /* Keep track of the longest prefix. */
3141 prefix
= update_path (prefix
, component
);
3142 len
= strlen (prefix
);
3143 if (len
> pprefix
->max_len
)
3144 pprefix
->max_len
= len
;
3146 pl
= XNEW (struct prefix_list
);
3147 pl
->prefix
= prefix
;
3148 pl
->require_machine_suffix
= require_machine_suffix
;
3149 pl
->priority
= priority
;
3150 pl
->os_multilib
= os_multilib
;
3152 /* Insert after PREV. */
3157 /* Same as add_prefix, but prepending target_system_root to prefix. */
3158 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
3160 add_sysrooted_prefix (struct path_prefix
*pprefix
, const char *prefix
,
3161 const char *component
,
3162 /* enum prefix_priority */ int priority
,
3163 int require_machine_suffix
, int os_multilib
)
3165 if (!IS_ABSOLUTE_PATH (prefix
))
3166 fatal_error (input_location
, "system path %qs is not absolute", prefix
);
3168 if (target_system_root
)
3170 char *sysroot_no_trailing_dir_separator
= xstrdup (target_system_root
);
3171 size_t sysroot_len
= strlen (target_system_root
);
3174 && target_system_root
[sysroot_len
- 1] == DIR_SEPARATOR
)
3175 sysroot_no_trailing_dir_separator
[sysroot_len
- 1] = '\0';
3177 if (target_sysroot_suffix
)
3178 prefix
= concat (sysroot_no_trailing_dir_separator
,
3179 target_sysroot_suffix
, prefix
, NULL
);
3181 prefix
= concat (sysroot_no_trailing_dir_separator
, prefix
, NULL
);
3183 free (sysroot_no_trailing_dir_separator
);
3185 /* We have to override this because GCC's notion of sysroot
3186 moves along with GCC. */
3190 add_prefix (pprefix
, prefix
, component
, priority
,
3191 require_machine_suffix
, os_multilib
);
3194 /* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */
3197 add_sysrooted_hdrs_prefix (struct path_prefix
*pprefix
, const char *prefix
,
3198 const char *component
,
3199 /* enum prefix_priority */ int priority
,
3200 int require_machine_suffix
, int os_multilib
)
3202 if (!IS_ABSOLUTE_PATH (prefix
))
3203 fatal_error (input_location
, "system path %qs is not absolute", prefix
);
3205 if (target_system_root
)
3207 char *sysroot_no_trailing_dir_separator
= xstrdup (target_system_root
);
3208 size_t sysroot_len
= strlen (target_system_root
);
3211 && target_system_root
[sysroot_len
- 1] == DIR_SEPARATOR
)
3212 sysroot_no_trailing_dir_separator
[sysroot_len
- 1] = '\0';
3214 if (target_sysroot_hdrs_suffix
)
3215 prefix
= concat (sysroot_no_trailing_dir_separator
,
3216 target_sysroot_hdrs_suffix
, prefix
, NULL
);
3218 prefix
= concat (sysroot_no_trailing_dir_separator
, prefix
, NULL
);
3220 free (sysroot_no_trailing_dir_separator
);
3222 /* We have to override this because GCC's notion of sysroot
3223 moves along with GCC. */
3227 add_prefix (pprefix
, prefix
, component
, priority
,
3228 require_machine_suffix
, os_multilib
);
3231 /* Execute the command specified by the arguments on the current line of spec.
3232 When using pipes, this includes several piped-together commands
3233 with `|' between them.
3235 Return 0 if successful, -1 if failed. */
3241 int n_commands
; /* # of command. */
3243 struct pex_obj
*pex
;
3246 const char *prog
; /* program name. */
3247 const char **argv
; /* vector of args. */
3251 struct command
*commands
; /* each command buffer with above info. */
3253 gcc_assert (!processing_spec_function
);
3257 string
= find_a_program (argbuf
[0]);
3260 insert_wrapper (wrapper_string
);
3263 /* Count # of piped commands. */
3264 for (n_commands
= 1, i
= 0; argbuf
.iterate (i
, &arg
); i
++)
3265 if (strcmp (arg
, "|") == 0)
3268 /* Get storage for each command. */
3269 commands
= XALLOCAVEC (struct command
, n_commands
);
3271 /* Split argbuf into its separate piped processes,
3272 and record info about each one.
3273 Also search for the programs that are to be run. */
3275 argbuf
.safe_push (0);
3277 commands
[0].prog
= argbuf
[0]; /* first command. */
3278 commands
[0].argv
= argbuf
.address ();
3280 if (!wrapper_string
)
3282 string
= find_a_program(commands
[0].prog
);
3284 commands
[0].argv
[0] = string
;
3287 for (n_commands
= 1, i
= 0; argbuf
.iterate (i
, &arg
); i
++)
3288 if (arg
&& strcmp (arg
, "|") == 0)
3289 { /* each command. */
3290 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3291 fatal_error (input_location
, "%<-pipe%> not supported");
3293 argbuf
[i
] = 0; /* Termination of command args. */
3294 commands
[n_commands
].prog
= argbuf
[i
+ 1];
3295 commands
[n_commands
].argv
3296 = &(argbuf
.address ())[i
+ 1];
3297 string
= find_a_program(commands
[n_commands
].prog
);
3299 commands
[n_commands
].argv
[0] = string
;
3303 /* If -v, print what we are about to do, and maybe query. */
3307 /* For help listings, put a blank line between sub-processes. */
3308 if (print_help_list
)
3309 fputc ('\n', stderr
);
3311 /* Print each piped command as a separate line. */
3312 for (i
= 0; i
< n_commands
; i
++)
3314 const char *const *j
;
3316 if (verbose_only_flag
)
3318 for (j
= commands
[i
].argv
; *j
; j
++)
3321 for (p
= *j
; *p
; ++p
)
3322 if (!ISALNUM ((unsigned char) *p
)
3323 && *p
!= '_' && *p
!= '/' && *p
!= '-' && *p
!= '.')
3327 fprintf (stderr
, " \"");
3328 for (p
= *j
; *p
; ++p
)
3330 if (*p
== '"' || *p
== '\\' || *p
== '$')
3331 fputc ('\\', stderr
);
3334 fputc ('"', stderr
);
3336 /* If it's empty, print "". */
3338 fprintf (stderr
, " \"\"");
3340 fprintf (stderr
, " %s", *j
);
3344 for (j
= commands
[i
].argv
; *j
; j
++)
3345 /* If it's empty, print "". */
3347 fprintf (stderr
, " \"\"");
3349 fprintf (stderr
, " %s", *j
);
3351 /* Print a pipe symbol after all but the last command. */
3352 if (i
+ 1 != n_commands
)
3353 fprintf (stderr
, " |");
3354 fprintf (stderr
, "\n");
3357 if (verbose_only_flag
!= 0)
3359 /* verbose_only_flag should act as if the spec was
3360 executed, so increment execution_count before
3361 returning. This prevents spurious warnings about
3362 unused linker input files, etc. */
3367 fnotice (stderr
, "\nGo ahead? (y or n) ");
3371 while (getchar () != '\n')
3374 if (i
!= 'y' && i
!= 'Y')
3379 #ifdef ENABLE_VALGRIND_CHECKING
3380 /* Run the each command through valgrind. To simplify prepending the
3381 path to valgrind and the option "-q" (for quiet operation unless
3382 something triggers), we allocate a separate argv array. */
3384 for (i
= 0; i
< n_commands
; i
++)
3390 for (argc
= 0; commands
[i
].argv
[argc
] != NULL
; argc
++)
3393 argv
= XALLOCAVEC (const char *, argc
+ 3);
3395 argv
[0] = VALGRIND_PATH
;
3397 for (j
= 2; j
< argc
+ 2; j
++)
3398 argv
[j
] = commands
[i
].argv
[j
- 2];
3401 commands
[i
].argv
= argv
;
3402 commands
[i
].prog
= argv
[0];
3406 /* Run each piped subprocess. */
3408 pex
= pex_init (PEX_USE_PIPES
| ((report_times
|| report_times_to_file
)
3409 ? PEX_RECORD_TIMES
: 0),
3410 progname
, temp_filename
);
3412 fatal_error (input_location
, "%<pex_init%> failed: %m");
3414 for (i
= 0; i
< n_commands
; i
++)
3418 const char *string
= commands
[i
].argv
[0];
3420 errmsg
= pex_run (pex
,
3421 ((i
+ 1 == n_commands
? PEX_LAST
: 0)
3422 | (string
== commands
[i
].prog
? PEX_SEARCH
: 0)),
3423 string
, CONST_CAST (char **, commands
[i
].argv
),
3428 fatal_error (input_location
,
3429 err
? G_("cannot execute %qs: %s: %m")
3430 : G_("cannot execute %qs: %s"),
3434 if (i
&& string
!= commands
[i
].prog
)
3435 free (CONST_CAST (char *, string
));
3440 /* Wait for all the subprocesses to finish. */
3444 struct pex_time
*times
= NULL
;
3447 statuses
= XALLOCAVEC (int, n_commands
);
3448 if (!pex_get_status (pex
, n_commands
, statuses
))
3449 fatal_error (input_location
, "failed to get exit status: %m");
3451 if (report_times
|| report_times_to_file
)
3453 times
= XALLOCAVEC (struct pex_time
, n_commands
);
3454 if (!pex_get_times (pex
, n_commands
, times
))
3455 fatal_error (input_location
, "failed to get process times: %m");
3460 for (i
= 0; i
< n_commands
; ++i
)
3462 int status
= statuses
[i
];
3464 if (WIFSIGNALED (status
))
3465 switch (WTERMSIG (status
))
3469 /* SIGQUIT and SIGKILL are not available on MinGW. */
3476 /* The user (or environment) did something to the
3477 inferior. Making this an ICE confuses the user into
3478 thinking there's a compiler bug. Much more likely is
3479 the user or OOM killer nuked it. */
3480 fatal_error (input_location
,
3481 "%s signal terminated program %s",
3482 strsignal (WTERMSIG (status
)),
3488 /* SIGPIPE is a special case. It happens in -pipe mode
3489 when the compiler dies before the preprocessor is
3490 done, or the assembler dies before the compiler is
3491 done. There's generally been an error already, and
3492 this is just fallout. So don't generate another
3493 error unless we would otherwise have succeeded. */
3494 if (signal_count
|| greatest_status
>= MIN_FATAL_STATUS
)
3504 /* The inferior failed to catch the signal. */
3505 internal_error_no_backtrace ("%s signal terminated program %s",
3506 strsignal (WTERMSIG (status
)),
3509 else if (WIFEXITED (status
)
3510 && WEXITSTATUS (status
) >= MIN_FATAL_STATUS
)
3512 /* For ICEs in cc1, cc1obj, cc1plus see if it is
3513 reproducible or not. */
3516 && WEXITSTATUS (status
) == ICE_EXIT_CODE
3518 && (p
= strrchr (commands
[0].argv
[0], DIR_SEPARATOR
))
3519 && startswith (p
+ 1, "cc1"))
3520 try_generate_repro (commands
[0].argv
);
3521 if (WEXITSTATUS (status
) > greatest_status
)
3522 greatest_status
= WEXITSTATUS (status
);
3526 if (report_times
|| report_times_to_file
)
3528 struct pex_time
*pt
= ×
[i
];
3531 ut
= ((double) pt
->user_seconds
3532 + (double) pt
->user_microseconds
/ 1.0e6
);
3533 st
= ((double) pt
->system_seconds
3534 + (double) pt
->system_microseconds
/ 1.0e6
);
3539 fnotice (stderr
, "# %s %.2f %.2f\n",
3540 commands
[i
].prog
, ut
, st
);
3542 if (report_times_to_file
)
3545 const char *const *j
;
3547 fprintf (report_times_to_file
, "%g %g", ut
, st
);
3549 for (j
= &commands
[i
].prog
; *j
; j
= &commands
[i
].argv
[++c
])
3552 for (p
= *j
; *p
; ++p
)
3553 if (*p
== '"' || *p
== '\\' || *p
== '$'
3559 fprintf (report_times_to_file
, " \"");
3560 for (p
= *j
; *p
; ++p
)
3562 if (*p
== '"' || *p
== '\\' || *p
== '$')
3563 fputc ('\\', report_times_to_file
);
3564 fputc (*p
, report_times_to_file
);
3566 fputc ('"', report_times_to_file
);
3569 fprintf (report_times_to_file
, " %s", *j
);
3572 fputc ('\n', report_times_to_file
);
3578 if (commands
[0].argv
[0] != commands
[0].prog
)
3579 free (CONST_CAST (char *, commands
[0].argv
[0]));
3585 /* Find all the switches given to us
3586 and make a vector describing them.
3587 The elements of the vector are strings, one per switch given.
3588 If a switch uses following arguments, then the `part1' field
3589 is the switch itself and the `args' field
3590 is a null-terminated vector containing the following arguments.
3591 Bits in the `live_cond' field are:
3592 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3593 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3594 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3595 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored.
3596 SWITCH_KEEP_FOR_GCC to indicate that this switch, otherwise ignored,
3597 should be included in COLLECT_GCC_OPTIONS.
3598 in all do_spec calls afterwards. Used for %<S from self specs.
3599 The `known' field describes whether this is an internal switch.
3600 The `validated' field describes whether any spec has looked at this switch;
3601 if it remains false at the end of the run, the switch must be meaningless.
3602 The `ordering' field is used to temporarily mark switches that have to be
3603 kept in a specific order. */
3605 #define SWITCH_LIVE (1 << 0)
3606 #define SWITCH_FALSE (1 << 1)
3607 #define SWITCH_IGNORE (1 << 2)
3608 #define SWITCH_IGNORE_PERMANENTLY (1 << 3)
3609 #define SWITCH_KEEP_FOR_GCC (1 << 4)
3615 unsigned int live_cond
;
3621 static struct switchstr
*switches
;
3623 static int n_switches
;
3625 static int n_switches_alloc
;
3627 /* Set to zero if -fcompare-debug is disabled, positive if it's
3628 enabled and we're running the first compilation, negative if it's
3629 enabled and we're running the second compilation. For most of the
3630 time, it's in the range -1..1, but it can be temporarily set to 2
3631 or 3 to indicate that the -fcompare-debug flags didn't come from
3632 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3633 variable, until a synthesized -fcompare-debug flag is added to the
3637 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3638 int compare_debug_second
;
3640 /* Set to the flags that should be passed to the second compilation in
3641 a -fcompare-debug compilation. */
3642 const char *compare_debug_opt
;
3644 static struct switchstr
*switches_debug_check
[2];
3646 static int n_switches_debug_check
[2];
3648 static int n_switches_alloc_debug_check
[2];
3650 static char *debug_check_temp_file
[2];
3652 /* Language is one of three things:
3654 1) The name of a real programming language.
3655 2) NULL, indicating that no one has figured out
3657 3) '*', indicating that the file should be passed
3662 const char *language
;
3663 struct compiler
*incompiler
;
3668 /* Also a vector of input files specified. */
3670 static struct infile
*infiles
;
3674 static int n_infiles_alloc
;
3676 /* True if undefined environment variables encountered during spec processing
3677 are ok to ignore, typically when we're running for --help or --version. */
3679 static bool spec_undefvar_allowed
;
3681 /* True if multiple input files are being compiled to a single
3684 static bool combine_inputs
;
3686 /* This counts the number of libraries added by lang_specific_driver, so that
3687 we can tell if there were any user supplied any files or libraries. */
3689 static int added_libraries
;
3691 /* And a vector of corresponding output files is made up later. */
3693 const char **outfiles
;
3695 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3697 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3698 is true if we should look for an executable suffix. DO_OBJ
3699 is true if we should look for an object suffix. */
3702 convert_filename (const char *name
, int do_exe ATTRIBUTE_UNUSED
,
3703 int do_obj ATTRIBUTE_UNUSED
)
3705 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3713 len
= strlen (name
);
3715 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3716 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3717 if (do_obj
&& len
> 2
3718 && name
[len
- 2] == '.'
3719 && name
[len
- 1] == 'o')
3721 obstack_grow (&obstack
, name
, len
- 2);
3722 obstack_grow0 (&obstack
, TARGET_OBJECT_SUFFIX
, strlen (TARGET_OBJECT_SUFFIX
));
3723 name
= XOBFINISH (&obstack
, const char *);
3727 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3728 /* If there is no filetype, make it the executable suffix (which includes
3729 the "."). But don't get confused if we have just "-o". */
3730 if (! do_exe
|| TARGET_EXECUTABLE_SUFFIX
[0] == 0 || not_actual_file_p (name
))
3733 for (i
= len
- 1; i
>= 0; i
--)
3734 if (IS_DIR_SEPARATOR (name
[i
]))
3737 for (i
++; i
< len
; i
++)
3741 obstack_grow (&obstack
, name
, len
);
3742 obstack_grow0 (&obstack
, TARGET_EXECUTABLE_SUFFIX
,
3743 strlen (TARGET_EXECUTABLE_SUFFIX
));
3744 name
= XOBFINISH (&obstack
, const char *);
3751 /* Display the command line switches accepted by gcc. */
3755 printf (_("Usage: %s [options] file...\n"), progname
);
3756 fputs (_("Options:\n"), stdout
);
3758 fputs (_(" -pass-exit-codes Exit with highest error code from a phase.\n"), stdout
);
3759 fputs (_(" --help Display this information.\n"), stdout
);
3760 fputs (_(" --target-help Display target specific command line options "
3761 "(including assembler and linker options).\n"), stdout
);
3762 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"), stdout
);
3763 fputs (_(" Display specific types of command line options.\n"), stdout
);
3765 fputs (_(" (Use '-v --help' to display command line options of sub-processes).\n"), stdout
);
3766 fputs (_(" --version Display compiler version information.\n"), stdout
);
3767 fputs (_(" -dumpspecs Display all of the built in spec strings.\n"), stdout
);
3768 fputs (_(" -dumpversion Display the version of the compiler.\n"), stdout
);
3769 fputs (_(" -dumpmachine Display the compiler's target processor.\n"), stdout
);
3770 fputs (_(" -foffload=<targets> Specify offloading targets.\n"), stdout
);
3771 fputs (_(" -print-search-dirs Display the directories in the compiler's search path.\n"), stdout
);
3772 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library.\n"), stdout
);
3773 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>.\n"), stdout
);
3774 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n"), stdout
);
3776 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3777 a component in the library path.\n"), stdout
);
3778 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc.\n"), stdout
);
3780 -print-multi-lib Display the mapping between command line options and\n\
3781 multiple library search directories.\n"), stdout
);
3782 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries.\n"), stdout
);
3783 fputs (_(" -print-sysroot Display the target libraries directory.\n"), stdout
);
3784 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"), stdout
);
3785 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler.\n"), stdout
);
3786 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n"), stdout
);
3787 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker.\n"), stdout
);
3788 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler.\n"), stdout
);
3789 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n"), stdout
);
3790 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker.\n"), stdout
);
3791 fputs (_(" -save-temps Do not delete intermediate files.\n"), stdout
);
3792 fputs (_(" -save-temps=<arg> Do not delete intermediate files.\n"), stdout
);
3794 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3795 prefixes to other gcc components.\n"), stdout
);
3796 fputs (_(" -pipe Use pipes rather than intermediate files.\n"), stdout
);
3797 fputs (_(" -time Time the execution of each subprocess.\n"), stdout
);
3798 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>.\n"), stdout
);
3799 fputs (_(" -std=<standard> Assume that the input sources are for <standard>.\n"), stdout
);
3801 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3802 and libraries.\n"), stdout
);
3803 fputs (_(" -B <directory> Add <directory> to the compiler's search paths.\n"), stdout
);
3804 fputs (_(" -v Display the programs invoked by the compiler.\n"), stdout
);
3805 fputs (_(" -### Like -v but options quoted and commands not executed.\n"), stdout
);
3806 fputs (_(" -E Preprocess only; do not compile, assemble or link.\n"), stdout
);
3807 fputs (_(" -S Compile only; do not assemble or link.\n"), stdout
);
3808 fputs (_(" -c Compile and assemble, but do not link.\n"), stdout
);
3809 fputs (_(" -o <file> Place the output into <file>.\n"), stdout
);
3810 fputs (_(" -pie Create a dynamically linked position independent\n\
3811 executable.\n"), stdout
);
3812 fputs (_(" -shared Create a shared library.\n"), stdout
);
3814 -x <language> Specify the language of the following input files.\n\
3815 Permissible languages include: c c++ assembler none\n\
3816 'none' means revert to the default behavior of\n\
3817 guessing the language based on the file's extension.\n\
3821 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3822 passed on to the various sub-processes invoked by %s. In order to pass\n\
3823 other options on to these processes the -W<letter> options must be used.\n\
3826 /* The rest of the options are displayed by invocations of the various
3831 add_preprocessor_option (const char *option
, int len
)
3833 preprocessor_options
.safe_push (save_string (option
, len
));
3837 add_assembler_option (const char *option
, int len
)
3839 assembler_options
.safe_push (save_string (option
, len
));
3843 add_linker_option (const char *option
, int len
)
3845 linker_options
.safe_push (save_string (option
, len
));
3848 /* Allocate space for an input file in infiles. */
3853 if (n_infiles_alloc
== 0)
3855 n_infiles_alloc
= 16;
3856 infiles
= XNEWVEC (struct infile
, n_infiles_alloc
);
3858 else if (n_infiles_alloc
== n_infiles
)
3860 n_infiles_alloc
*= 2;
3861 infiles
= XRESIZEVEC (struct infile
, infiles
, n_infiles_alloc
);
3865 /* Store an input file with the given NAME and LANGUAGE in
3869 add_infile (const char *name
, const char *language
)
3872 infiles
[n_infiles
].name
= name
;
3873 infiles
[n_infiles
++].language
= language
;
3876 /* Allocate space for a switch in switches. */
3881 if (n_switches_alloc
== 0)
3883 n_switches_alloc
= 16;
3884 switches
= XNEWVEC (struct switchstr
, n_switches_alloc
);
3886 else if (n_switches_alloc
== n_switches
)
3888 n_switches_alloc
*= 2;
3889 switches
= XRESIZEVEC (struct switchstr
, switches
, n_switches_alloc
);
3893 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3894 as validated if VALIDATED and KNOWN if it is an internal switch. */
3897 save_switch (const char *opt
, size_t n_args
, const char *const *args
,
3898 bool validated
, bool known
)
3901 switches
[n_switches
].part1
= opt
+ 1;
3903 switches
[n_switches
].args
= 0;
3906 switches
[n_switches
].args
= XNEWVEC (const char *, n_args
+ 1);
3907 memcpy (switches
[n_switches
].args
, args
, n_args
* sizeof (const char *));
3908 switches
[n_switches
].args
[n_args
] = NULL
;
3911 switches
[n_switches
].live_cond
= 0;
3912 switches
[n_switches
].validated
= validated
;
3913 switches
[n_switches
].known
= known
;
3914 switches
[n_switches
].ordering
= 0;
3918 /* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3922 set_source_date_epoch_envvar ()
3924 /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3925 of 64 bit integers. */
3926 char source_date_epoch
[21];
3931 if (tt
< (time_t) 0 || errno
!= 0)
3934 snprintf (source_date_epoch
, 21, "%llu", (unsigned long long) tt
);
3935 /* Using setenv instead of xputenv because we want the variable to remain
3936 after finalizing so that it's still set in the second run when using
3938 setenv ("SOURCE_DATE_EPOCH", source_date_epoch
, 0);
3941 /* Handle an option DECODED that is unknown to the option-processing
3945 driver_unknown_option_callback (const struct cl_decoded_option
*decoded
)
3947 const char *opt
= decoded
->arg
;
3948 if (opt
[1] == 'W' && opt
[2] == 'n' && opt
[3] == 'o' && opt
[4] == '-'
3949 && !(decoded
->errors
& CL_ERR_NEGATIVE
))
3951 /* Leave unknown -Wno-* options for the compiler proper, to be
3952 diagnosed only if there are warnings. */
3953 save_switch (decoded
->canonical_option
[0],
3954 decoded
->canonical_option_num_elements
- 1,
3955 &decoded
->canonical_option
[1], false, true);
3958 if (decoded
->opt_index
== OPT_SPECIAL_unknown
)
3960 /* Give it a chance to define it a spec file. */
3961 save_switch (decoded
->canonical_option
[0],
3962 decoded
->canonical_option_num_elements
- 1,
3963 &decoded
->canonical_option
[1], false, false);
3970 /* Handle an option DECODED that is not marked as CL_DRIVER.
3971 LANG_MASK will always be CL_DRIVER. */
3974 driver_wrong_lang_callback (const struct cl_decoded_option
*decoded
,
3975 unsigned int lang_mask ATTRIBUTE_UNUSED
)
3977 /* At this point, non-driver options are accepted (and expected to
3978 be passed down by specs) unless marked to be rejected by the
3979 driver. Options to be rejected by the driver but accepted by the
3980 compilers proper are treated just like completely unknown
3982 const struct cl_option
*option
= &cl_options
[decoded
->opt_index
];
3984 if (option
->cl_reject_driver
)
3985 error ("aaunrecognized command-line option %qs",
3986 decoded
->orig_option_with_args_text
);
3988 save_switch (decoded
->canonical_option
[0],
3989 decoded
->canonical_option_num_elements
- 1,
3990 &decoded
->canonical_option
[1], false, true);
3993 static const char *spec_lang
= 0;
3994 static int last_language_n_infiles
;
3997 /* Check that GCC is configured to support the offload target. */
4000 check_offload_target_name (const char *target
, ptrdiff_t len
)
4002 const char *n
, *c
= OFFLOAD_TARGETS
;
4005 n
= strchr (c
, ',');
4007 n
= strchr (c
, '\0');
4008 if (len
== n
- c
&& strncmp (target
, c
, n
- c
) == 0)
4010 c
= *n
? n
+ 1 : NULL
;
4014 auto_vec
<const char*> candidates
;
4015 size_t olen
= strlen (OFFLOAD_TARGETS
) + 1;
4016 char *cand
= XALLOCAVEC (char, olen
);
4017 memcpy (cand
, OFFLOAD_TARGETS
, olen
);
4018 for (c
= strtok (cand
, ","); c
; c
= strtok (NULL
, ","))
4019 candidates
.safe_push (c
);
4020 candidates
.safe_push ("default");
4021 candidates
.safe_push ("disable");
4023 char *target2
= XALLOCAVEC (char, len
+ 1);
4024 memcpy (target2
, target
, len
);
4025 target2
[len
] = '\0';
4027 error ("GCC is not configured to support %qs as %<-foffload=%> argument",
4031 const char *hint
= candidates_list_and_hint (target2
, s
, candidates
);
4033 inform (UNKNOWN_LOCATION
,
4034 "valid %<-foffload=%> arguments are: %s; "
4035 "did you mean %qs?", s
, hint
);
4037 inform (UNKNOWN_LOCATION
, "valid %<-foffload=%> arguments are: %s", s
);
4044 /* Sanity check for -foffload-options. */
4047 check_foffload_target_names (const char *arg
)
4049 const char *cur
, *next
, *end
;
4050 /* If option argument starts with '-' then no target is specified and we
4051 do not need to parse it. */
4054 end
= strchr (arg
, '=');
4057 error ("%<=%>options missing after %<-foffload-options=%>target");
4064 next
= strchr (cur
, ',');
4067 next
= (next
> end
) ? end
: next
;
4069 /* Retain non-supported targets after printing an error as those will not
4070 be processed; each enabled target only processes its triplet. */
4071 check_offload_target_name (cur
, next
- cur
);
4076 /* Parse -foffload option argument. */
4079 handle_foffload_option (const char *arg
)
4081 const char *c
, *cur
, *n
, *next
, *end
;
4084 /* If option argument starts with '-' then no target is specified and we
4085 do not need to parse it. */
4089 end
= strchr (arg
, '=');
4091 end
= strchr (arg
, '\0');
4096 next
= strchr (cur
, ',');
4099 next
= (next
> end
) ? end
: next
;
4101 target
= XNEWVEC (char, next
- cur
+ 1);
4102 memcpy (target
, cur
, next
- cur
);
4103 target
[next
- cur
] = '\0';
4105 /* Reset offloading list and continue. */
4106 if (strcmp (target
, "default") == 0)
4108 free (offload_targets
);
4109 offload_targets
= NULL
;
4113 /* If 'disable' is passed to the option, clean the list of
4114 offload targets and return, even if more targets follow.
4115 Likewise if GCC is not configured to support that offload target. */
4116 if (strcmp (target
, "disable") == 0
4117 || !check_offload_target_name (target
, next
- cur
))
4119 free (offload_targets
);
4120 offload_targets
= xstrdup ("");
4124 if (!offload_targets
)
4126 offload_targets
= target
;
4131 /* Check that the target hasn't already presented in the list. */
4132 c
= offload_targets
;
4135 n
= strchr (c
, ':');
4137 n
= strchr (c
, '\0');
4139 if (next
- cur
== n
- c
&& strncmp (c
, target
, n
- c
) == 0)
4146 /* If duplicate is not found, append the target to the list. */
4149 size_t offload_targets_len
= strlen (offload_targets
);
4151 = XRESIZEVEC (char, offload_targets
,
4152 offload_targets_len
+ 1 + next
- cur
+ 1);
4153 offload_targets
[offload_targets_len
++] = ':';
4154 memcpy (offload_targets
+ offload_targets_len
, target
, next
- cur
+ 1);
4159 XDELETEVEC (target
);
4163 /* Handle a driver option; arguments and return value as for
4167 driver_handle_option (struct gcc_options
*opts
,
4168 struct gcc_options
*opts_set
,
4169 const struct cl_decoded_option
*decoded
,
4170 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
4172 const struct cl_option_handlers
*handlers ATTRIBUTE_UNUSED
,
4173 diagnostic_context
*dc
,
4176 size_t opt_index
= decoded
->opt_index
;
4177 const char *arg
= decoded
->arg
;
4178 const char *compare_debug_replacement_opt
;
4179 const char* orig
= decoded
->orig_option_with_args_text
;
4180 int value
= decoded
->value
;
4181 bool validated
= false;
4182 bool do_save
= true;
4184 gcc_assert (opts
== &global_options
);
4185 gcc_assert (opts_set
== &global_options_set
);
4186 gcc_assert (kind
== DK_UNSPECIFIED
);
4187 gcc_assert (loc
== UNKNOWN_LOCATION
);
4188 gcc_assert (dc
== global_dc
);
4194 struct spec_list
*sl
;
4196 for (sl
= specs
; sl
; sl
= sl
->next
)
4197 printf ("*%s:\n%s\n\n", sl
->name
, *(sl
->ptr_spec
));
4198 if (link_command_spec
)
4199 printf ("*link_command:\n%s\n\n", link_command_spec
);
4203 case OPT_dumpversion
:
4204 printf ("%s\n", spec_version
);
4207 case OPT_dumpmachine
:
4208 printf ("%s\n", spec_machine
);
4211 case OPT_dumpfullversion
:
4212 printf ("%s\n", BASEVER
);
4218 /* CPP driver cannot obtain switch from cc1_options. */
4220 add_preprocessor_option ("--version", strlen ("--version"));
4221 add_assembler_option ("--version", strlen ("--version"));
4222 add_linker_option ("--version", strlen ("--version"));
4225 case OPT__completion_
:
4227 completion
= decoded
->arg
;
4231 print_help_list
= 1;
4233 /* CPP driver cannot obtain switch from cc1_options. */
4235 add_preprocessor_option ("--help", 6);
4236 add_assembler_option ("--help", 6);
4237 add_linker_option ("--help", 6);
4241 print_subprocess_help
= 2;
4246 add_preprocessor_option (orig
, strlen (orig
));
4249 case OPT__target_help
:
4250 print_subprocess_help
= 1;
4252 /* CPP driver cannot obtain switch from cc1_options. */
4254 add_preprocessor_option ("--target-help", 13);
4255 add_assembler_option ("--target-help", 13);
4256 add_linker_option ("--target-help", 13);
4259 case OPT__no_sysroot_suffix
:
4260 case OPT_pass_exit_codes
:
4261 case OPT_print_search_dirs
:
4262 case OPT_print_file_name_
:
4263 case OPT_print_prog_name_
:
4264 case OPT_print_multi_lib
:
4265 case OPT_print_multi_directory
:
4266 case OPT_print_sysroot
:
4267 case OPT_print_multi_os_directory
:
4268 case OPT_print_multiarch
:
4269 case OPT_print_sysroot_headers_suffix
:
4272 /* These options set the variables specified in common.opt
4273 automatically, and do not need to be saved for spec
4278 case OPT_print_libgcc_file_name
:
4279 print_file_name
= "libgcc.a";
4283 case OPT_fuse_ld_bfd
:
4287 case OPT_fuse_ld_gold
:
4291 case OPT_fuse_ld_mold
:
4295 case OPT_fcompare_debug_second
:
4296 compare_debug_second
= 1;
4299 case OPT_fcompare_debug
:
4303 compare_debug_replacement_opt
= "-fcompare-debug=";
4305 goto compare_debug_with_arg
;
4308 compare_debug_replacement_opt
= "-fcompare-debug=-gtoggle";
4310 goto compare_debug_with_arg
;
4317 case OPT_fcompare_debug_
:
4318 compare_debug_replacement_opt
= decoded
->canonical_option
[0];
4319 compare_debug_with_arg
:
4320 gcc_assert (decoded
->canonical_option_num_elements
== 1);
4321 gcc_assert (arg
!= NULL
);
4326 if (compare_debug
< 0)
4327 compare_debug_opt
= NULL
;
4329 compare_debug_opt
= arg
;
4330 save_switch (compare_debug_replacement_opt
, 0, NULL
, validated
, true);
4331 set_source_date_epoch_envvar ();
4334 case OPT_fdiagnostics_color_
:
4335 diagnostic_color_init (dc
, value
);
4338 case OPT_fdiagnostics_urls_
:
4339 diagnostic_urls_init (dc
, value
);
4342 case OPT_fdiagnostics_format_
:
4343 diagnostic_output_format_init (dc
,
4344 (enum diagnostics_output_format
)value
);
4350 /* Pass the rest of this option to the assembler. */
4352 /* Split the argument at commas. */
4354 for (j
= 0; arg
[j
]; j
++)
4357 add_assembler_option (arg
+ prev
, j
- prev
);
4361 /* Record the part after the last comma. */
4362 add_assembler_option (arg
+ prev
, j
- prev
);
4370 /* Pass the rest of this option to the preprocessor. */
4372 /* Split the argument at commas. */
4374 for (j
= 0; arg
[j
]; j
++)
4377 add_preprocessor_option (arg
+ prev
, j
- prev
);
4381 /* Record the part after the last comma. */
4382 add_preprocessor_option (arg
+ prev
, j
- prev
);
4390 /* Split the argument at commas. */
4392 for (j
= 0; arg
[j
]; j
++)
4395 add_infile (save_string (arg
+ prev
, j
- prev
), "*");
4398 /* Record the part after the last comma. */
4399 add_infile (arg
+ prev
, "*");
4405 add_infile (arg
, "*");
4409 case OPT_Xpreprocessor
:
4410 add_preprocessor_option (arg
, strlen (arg
));
4414 case OPT_Xassembler
:
4415 add_assembler_option (arg
, strlen (arg
));
4420 /* POSIX allows separation of -l and the lib arg; canonicalize
4421 by concatenating -l with its arg */
4422 add_infile (concat ("-l", arg
, NULL
), "*");
4427 /* Similarly, canonicalize -L for linkers that may not accept
4428 separate arguments. */
4429 save_switch (concat ("-L", arg
, NULL
), 0, NULL
, validated
, true);
4434 save_switch (concat ("-F", arg
, NULL
), 0, NULL
, validated
, true);
4437 case OPT_save_temps
:
4438 if (!save_temps_flag
)
4439 save_temps_flag
= SAVE_TEMPS_DUMP
;
4443 case OPT_save_temps_
:
4444 if (strcmp (arg
, "cwd") == 0)
4445 save_temps_flag
= SAVE_TEMPS_CWD
;
4446 else if (strcmp (arg
, "obj") == 0
4447 || strcmp (arg
, "object") == 0)
4448 save_temps_flag
= SAVE_TEMPS_OBJ
;
4450 fatal_error (input_location
, "%qs is an unknown %<-save-temps%> option",
4451 decoded
->orig_option_with_args_text
);
4452 save_temps_overrides_dumpdir
= true;
4457 dumpdir
= xstrdup (arg
);
4458 save_temps_overrides_dumpdir
= false;
4463 dumpbase
= xstrdup (arg
);
4466 case OPT_dumpbase_ext
:
4467 free (dumpbase_ext
);
4468 dumpbase_ext
= xstrdup (arg
);
4471 case OPT_no_canonical_prefixes
:
4472 /* Already handled as a special case, so ignored here. */
4478 /* These options set the variables specified in common.opt
4479 automatically, but do need to be saved for spec
4485 struct user_specs
*user
= XNEW (struct user_specs
);
4487 user
->next
= (struct user_specs
*) 0;
4488 user
->filename
= arg
;
4489 if (user_specs_tail
)
4490 user_specs_tail
->next
= user
;
4492 user_specs_head
= user
;
4493 user_specs_tail
= user
;
4499 target_system_root
= arg
;
4500 target_system_root_changed
= 1;
4501 /* Saving this option is useful to let self-specs decide to
4502 provide a default one. */
4508 if (report_times_to_file
)
4509 fclose (report_times_to_file
);
4510 report_times_to_file
= fopen (arg
, "a");
4516 This is similar to -v except that there is no execution
4517 of the commands and the echoed arguments are quoted. It
4518 is intended for use in shell scripts to capture the
4519 driver-generated command line. */
4520 verbose_only_flag
++;
4527 size_t len
= strlen (arg
);
4529 /* Catch the case where the user has forgotten to append a
4530 directory separator to the path. Note, they may be using
4531 -B to add an executable name prefix, eg "i386-elf-", in
4532 order to distinguish between multiple installations of
4533 GCC in the same directory. Hence we must check to see
4534 if appending a directory separator actually makes a
4535 valid directory name. */
4536 if (!IS_DIR_SEPARATOR (arg
[len
- 1])
4537 && is_directory (arg
, false))
4539 char *tmp
= XNEWVEC (char, len
+ 2);
4541 tmp
[len
] = DIR_SEPARATOR
;
4546 add_prefix (&exec_prefixes
, arg
, NULL
,
4547 PREFIX_PRIORITY_B_OPT
, 0, 0);
4548 add_prefix (&startfile_prefixes
, arg
, NULL
,
4549 PREFIX_PRIORITY_B_OPT
, 0, 0);
4550 add_prefix (&include_prefixes
, arg
, NULL
,
4551 PREFIX_PRIORITY_B_OPT
, 0, 0);
4562 if (!strcmp (spec_lang
, "none"))
4563 /* Suppress the warning if -xnone comes after the last input
4564 file, because alternate command interfaces like g++ might
4565 find it useful to place -xnone after each input file. */
4568 last_language_n_infiles
= n_infiles
;
4574 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4575 arg
= convert_filename (arg
, ! have_c
, 0);
4578 /* On some systems, ld cannot handle "-o" without a space. So
4579 split the option from its argument. */
4580 save_switch ("-o", 1, &arg
, validated
, true);
4583 #ifdef ENABLE_DEFAULT_PIE
4585 /* -pie is turned on by default. */
4588 case OPT_static_libgcc
:
4589 case OPT_shared_libgcc
:
4590 case OPT_static_libgfortran
:
4591 case OPT_static_libphobos
:
4592 case OPT_static_libstdc__
:
4593 /* These are always valid, since gcc.cc itself understands the
4594 first two, gfortranspec.cc understands -static-libgfortran,
4595 d-spec.cc understands -static-libphobos, and g++spec.cc
4596 understands -static-libstdc++ */
4600 /// sdcpp case OPT_fwpa:
4601 /// sdcpp flag_wpa = "";
4604 case OPT_foffload_options_
:
4605 check_foffload_target_names (arg
);
4609 handle_foffload_option (arg
);
4610 if (arg
[0] == '-' || NULL
!= strchr (arg
, '='))
4611 save_switch (concat ("-foffload-options=", arg
, NULL
),
4612 0, NULL
, validated
, true);
4617 /* Various driver options need no special processing at this
4618 point, having been handled in a prescan above or being
4619 handled by specs. */
4624 save_switch (decoded
->canonical_option
[0],
4625 decoded
->canonical_option_num_elements
- 1,
4626 &decoded
->canonical_option
[1], validated
, true);
4630 /* Return true if F2 is F1 followed by a single suffix, i.e., by a
4631 period and additional characters other than a period. */
4634 adds_single_suffix_p (const char *f2
, const char *f1
)
4636 size_t len
= strlen (f1
);
4638 return (strncmp (f1
, f2
, len
) == 0
4640 && strchr (f2
+ len
+ 1, '.') == NULL
);
4643 /* Put the driver's standard set of option handlers in *HANDLERS. */
4646 set_option_handlers (struct cl_option_handlers
*handlers
)
4648 handlers
->unknown_option_callback
= driver_unknown_option_callback
;
4649 handlers
->wrong_lang_callback
= driver_wrong_lang_callback
;
4650 handlers
->num_handlers
= 3;
4651 handlers
->handlers
[0].handler
= driver_handle_option
;
4652 handlers
->handlers
[0].mask
= CL_DRIVER
;
4653 handlers
->handlers
[1].handler
= common_handle_option
;
4654 handlers
->handlers
[1].mask
= CL_COMMON
;
4655 // sdcpp handlers->handlers[2].handler = target_handle_option;
4656 handlers
->handlers
[2].mask
= CL_TARGET
;
4660 /* Return the index into infiles for the single non-library
4661 non-lto-wpa input file, -1 if there isn't any, or -2 if there is
4664 single_input_file_index ()
4668 for (int i
= 0; i
< n_infiles
; i
++)
4670 if (infiles
[i
].language
4671 && (infiles
[i
].language
[0] == '*'
4673 && strcmp (infiles
[i
].language
, "lto") == 0)))
4685 /* Create the vector `switches' and its contents.
4686 Store its length in `n_switches'. */
4689 process_command (unsigned int decoded_options_count
,
4690 struct cl_decoded_option
*decoded_options
)
4694 char *tooldir_prefix
, *tooldir_prefix2
;
4695 char *(*get_relative_prefix
) (const char *, const char *,
4696 const char *) = NULL
;
4697 struct cl_option_handlers handlers
;
4700 gcc_exec_prefix
= env
.get ("GCC_EXEC_PREFIX");
4704 added_libraries
= 0;
4706 /* Figure compiler version from version string. */
4708 compiler_version
= temp1
= xstrdup (version_string
);
4710 for (; *temp1
; ++temp1
)
4719 /* Handle any -no-canonical-prefixes flag early, to assign the function
4720 that builds relative prefixes. This function creates default search
4721 paths that are needed later in normal option handling. */
4723 for (j
= 1; j
< decoded_options_count
; j
++)
4725 if (decoded_options
[j
].opt_index
== OPT_no_canonical_prefixes
)
4727 get_relative_prefix
= make_relative_prefix_ignore_links
;
4731 if (! get_relative_prefix
)
4732 get_relative_prefix
= make_relative_prefix
;
4734 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
4735 see if we can create it from the pathname specified in
4736 decoded_options[0].arg. */
4738 gcc_libexec_prefix
= standard_libexec_prefix
;
4740 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
4741 if (!gcc_exec_prefix
)
4743 gcc_exec_prefix
= get_relative_prefix (decoded_options
[0].arg
,
4744 standard_bindir_prefix
,
4745 standard_exec_prefix
);
4746 gcc_libexec_prefix
= get_relative_prefix (decoded_options
[0].arg
,
4747 standard_bindir_prefix
,
4748 standard_libexec_prefix
);
4749 if (gcc_exec_prefix
)
4750 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix
, NULL
));
4754 /* make_relative_prefix requires a program name, but
4755 GCC_EXEC_PREFIX is typically a directory name with a trailing
4756 / (which is ignored by make_relative_prefix), so append a
4758 char *tmp_prefix
= concat (gcc_exec_prefix
, "gcc", NULL
);
4759 gcc_libexec_prefix
= get_relative_prefix (tmp_prefix
,
4760 standard_exec_prefix
,
4761 standard_libexec_prefix
);
4763 /* The path is unrelocated, so fallback to the original setting. */
4764 if (!gcc_libexec_prefix
)
4765 gcc_libexec_prefix
= standard_libexec_prefix
;
4771 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4772 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4773 or an automatically created GCC_EXEC_PREFIX from
4774 decoded_options[0].arg. */
4776 /* Do language-specific adjustment/addition of flags. */
4777 lang_specific_driver (&decoded_options
, &decoded_options_count
,
4780 if (gcc_exec_prefix
)
4782 int len
= strlen (gcc_exec_prefix
);
4784 if (len
> (int) sizeof ("/lib/gcc/") - 1
4785 && (IS_DIR_SEPARATOR (gcc_exec_prefix
[len
-1])))
4787 temp
= gcc_exec_prefix
+ len
- sizeof ("/lib/gcc/") + 1;
4788 if (IS_DIR_SEPARATOR (*temp
)
4789 && filename_ncmp (temp
+ 1, "lib", 3) == 0
4790 && IS_DIR_SEPARATOR (temp
[4])
4791 && filename_ncmp (temp
+ 5, "gcc", 3) == 0)
4792 len
-= sizeof ("/lib/gcc/") - 1;
4795 set_std_prefix (gcc_exec_prefix
, len
);
4796 add_prefix (&exec_prefixes
, gcc_libexec_prefix
, "GCC",
4797 PREFIX_PRIORITY_LAST
, 0, 0);
4798 add_prefix (&startfile_prefixes
, gcc_exec_prefix
, "GCC",
4799 PREFIX_PRIORITY_LAST
, 0, 0);
4802 /* COMPILER_PATH and LIBRARY_PATH have values
4803 that are lists of directory names with colons. */
4805 temp
= env
.get ("COMPILER_PATH");
4808 const char *startp
, *endp
;
4809 char *nstore
= (char *) alloca (strlen (temp
) + 3);
4811 startp
= endp
= temp
;
4814 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
4816 strncpy (nstore
, startp
, endp
- startp
);
4818 strcpy (nstore
, concat (".", dir_separator_str
, NULL
));
4819 else if (!IS_DIR_SEPARATOR (endp
[-1]))
4821 nstore
[endp
- startp
] = DIR_SEPARATOR
;
4822 nstore
[endp
- startp
+ 1] = 0;
4825 nstore
[endp
- startp
] = 0;
4826 add_prefix (&exec_prefixes
, nstore
, 0,
4827 PREFIX_PRIORITY_LAST
, 0, 0);
4828 add_prefix (&include_prefixes
, nstore
, 0,
4829 PREFIX_PRIORITY_LAST
, 0, 0);
4832 endp
= startp
= endp
+ 1;
4839 temp
= env
.get (LIBRARY_PATH_ENV
);
4840 if (temp
&& *cross_compile
== '0')
4842 const char *startp
, *endp
;
4843 char *nstore
= (char *) alloca (strlen (temp
) + 3);
4845 startp
= endp
= temp
;
4848 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
4850 strncpy (nstore
, startp
, endp
- startp
);
4852 strcpy (nstore
, concat (".", dir_separator_str
, NULL
));
4853 else if (!IS_DIR_SEPARATOR (endp
[-1]))
4855 nstore
[endp
- startp
] = DIR_SEPARATOR
;
4856 nstore
[endp
- startp
+ 1] = 0;
4859 nstore
[endp
- startp
] = 0;
4860 add_prefix (&startfile_prefixes
, nstore
, NULL
,
4861 PREFIX_PRIORITY_LAST
, 0, 1);
4864 endp
= startp
= endp
+ 1;
4871 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4872 temp
= env
.get ("LPATH");
4873 if (temp
&& *cross_compile
== '0')
4875 const char *startp
, *endp
;
4876 char *nstore
= (char *) alloca (strlen (temp
) + 3);
4878 startp
= endp
= temp
;
4881 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
4883 strncpy (nstore
, startp
, endp
- startp
);
4885 strcpy (nstore
, concat (".", dir_separator_str
, NULL
));
4886 else if (!IS_DIR_SEPARATOR (endp
[-1]))
4888 nstore
[endp
- startp
] = DIR_SEPARATOR
;
4889 nstore
[endp
- startp
+ 1] = 0;
4892 nstore
[endp
- startp
] = 0;
4893 add_prefix (&startfile_prefixes
, nstore
, NULL
,
4894 PREFIX_PRIORITY_LAST
, 0, 1);
4897 endp
= startp
= endp
+ 1;
4904 /* Process the options and store input files and switches in their
4907 last_language_n_infiles
= -1;
4909 set_option_handlers (&handlers
);
4911 for (j
= 1; j
< decoded_options_count
; j
++)
4913 switch (decoded_options
[j
].opt_index
)
4925 for (j
= 1; j
< decoded_options_count
; j
++)
4927 if (decoded_options
[j
].opt_index
== OPT_SPECIAL_input_file
)
4929 const char *arg
= decoded_options
[j
].arg
;
4931 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4932 arg
= convert_filename (arg
, 0, access (arg
, F_OK
));
4934 add_infile (arg
, spec_lang
);
4939 read_cmdline_option (&global_options
, &global_options_set
,
4940 decoded_options
+ j
, UNKNOWN_LOCATION
,
4941 CL_DRIVER
, &handlers
, global_dc
);
4944 /* If the user didn't specify any, default to all configured offload
4946 if (ENABLE_OFFLOADING
&& offload_targets
== NULL
)
4948 handle_foffload_option (OFFLOAD_TARGETS
);
4949 #if OFFLOAD_DEFAULTED
4950 offload_targets_default
= true;
4954 /* Handle -gtoggle as it would later in toplev.cc:process_options to
4955 make the debug-level-gt spec function work as expected. */
4958 if (debug_info_level
== DINFO_LEVEL_NONE
)
4959 debug_info_level
= DINFO_LEVEL_NORMAL
;
4961 debug_info_level
= DINFO_LEVEL_NONE
;
4965 && strcmp (output_file
, "-") != 0
4966 && strcmp (output_file
, HOST_BIT_BUCKET
) != 0)
4969 for (i
= 0; i
< n_infiles
; i
++)
4970 if ((!infiles
[i
].language
|| infiles
[i
].language
[0] != '*')
4971 && canonical_filename_eq (infiles
[i
].name
, output_file
))
4972 fatal_error (input_location
,
4973 "input file %qs is the same as output file",
4977 if (output_file
!= NULL
&& output_file
[0] == '\0')
4978 fatal_error (input_location
, "output filename may not be empty");
4980 /* -dumpdir and -save-temps=* both specify the location of aux/dump
4981 outputs; the one that appears last prevails. When compiling
4982 multiple sources, an explicit dumpbase (minus -ext) may be
4983 combined with an explicit or implicit dumpdir, whereas when
4984 linking, a specified or implied link output name (minus
4985 extension) may be combined with a prevailing -save-temps=* or an
4986 otherwise implied dumpdir, but not override a prevailing
4987 -dumpdir. Primary outputs (e.g., linker output when linking
4988 without -o, or .i, .s or .o outputs when processing multiple
4989 inputs with -E, -S or -c, respectively) are NOT affected by these
4990 -save-temps=/-dump* options, always landing in the current
4991 directory and with the same basename as the input when an output
4992 name is not given, but when they're intermediate outputs, they
4993 are named like other aux outputs, so the options affect their
4996 Here are some examples. There are several more in the
4997 documentation of -o and -dump*, and some quite exhaustive tests
4998 in gcc.misc-tests/outputs.exp.
5000 When compiling any number of sources, no -dump* nor
5001 -save-temps=*, all outputs in cwd without prefix:
5003 # gcc -c b.c -gsplit-dwarf
5004 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
5006 # gcc -c b.c d.c -gsplit-dwarf
5007 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
5008 && cc1 [-dumpdir ./] -dumpbase d.c -dumpbase-ext .c # d.o d.dwo
5010 When compiling and linking, no -dump* nor -save-temps=*, .o
5011 outputs are temporary, aux outputs land in the dir of the output,
5012 prefixed with the basename of the linker output:
5014 # gcc b.c d.c -o ab -gsplit-dwarf
5015 -> cc1 -dumpdir ab- -dumpbase b.c -dumpbase-ext .c # ab-b.dwo
5016 && cc1 -dumpdir ab- -dumpbase d.c -dumpbase-ext .c # ab-d.dwo
5019 # gcc b.c d.c [-o a.out] -gsplit-dwarf
5020 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.dwo
5021 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.dwo
5022 && link ... [-o a.out]
5024 When compiling and linking, a prevailing -dumpdir fully overrides
5025 the prefix of aux outputs given by the output name:
5027 # gcc -dumpdir f b.c d.c -gsplit-dwarf [-o [dir/]whatever]
5028 -> cc1 -dumpdir f -dumpbase b.c -dumpbase-ext .c # fb.dwo
5029 && cc1 -dumpdir f -dumpbase d.c -dumpbase-ext .c # fd.dwo
5030 && link ... [-o whatever]
5032 When compiling multiple inputs, an explicit -dumpbase is combined
5033 with -dumpdir, affecting aux outputs, but not the .o outputs:
5035 # gcc -dumpdir f -dumpbase g- b.c d.c -gsplit-dwarf -c
5036 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # b.o fg-b.dwo
5037 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # d.o fg-d.dwo
5039 When compiling and linking with -save-temps, the .o outputs that
5040 would have been temporary become aux outputs, so they get
5041 affected by -dump* flags:
5043 # gcc -dumpdir f -dumpbase g- -save-temps b.c d.c
5044 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # fg-b.o
5045 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # fg-d.o
5048 If -save-temps=* prevails over -dumpdir, however, the explicit
5049 -dumpdir is discarded, as if it wasn't there. The basename of
5050 the implicit linker output, a.out or a.exe, becomes a- as the aux
5051 output prefix for all compilations:
5053 # gcc [-dumpdir f] -save-temps=cwd b.c d.c
5054 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.o
5055 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.o
5058 A single -dumpbase, applying to multiple inputs, overrides the
5059 linker output name, implied or explicit, as the aux output prefix:
5061 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c
5062 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5063 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5066 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c -o dir/h.out
5067 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5068 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5069 && link -o dir/h.out
5071 Now, if the linker output is NOT overridden as a prefix, but
5072 -save-temps=* overrides implicit or explicit -dumpdir, the
5073 effective dump dir combines the dir selected by the -save-temps=*
5074 option with the basename of the specified or implied link output:
5076 # gcc [-dumpdir f] -save-temps=cwd b.c d.c -o dir/h.out
5077 -> cc1 -dumpdir h- -dumpbase b.c -dumpbase-ext .c # h-b.o
5078 && cc1 -dumpdir h- -dumpbase d.c -dumpbase-ext .c # h-d.o
5079 && link -o dir/h.out
5081 # gcc [-dumpdir f] -save-temps=obj b.c d.c -o dir/h.out
5082 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5083 && cc1 -dumpdir dir/h- -dumpbase d.c -dumpbase-ext .c # dir/h-d.o
5084 && link -o dir/h.out
5086 But then again, a single -dumpbase applying to multiple inputs
5087 gets used instead of the linker output basename in the combined
5090 # gcc [-dumpdir f] -dumpbase g- -save-temps=obj b.c d.c -o dir/h.out
5091 -> cc1 -dumpdir dir/g- -dumpbase b.c -dumpbase-ext .c # dir/g-b.o
5092 && cc1 -dumpdir dir/g- -dumpbase d.c -dumpbase-ext .c # dir/g-d.o
5093 && link -o dir/h.out
5095 With a single input being compiled, the output basename does NOT
5096 affect the dumpdir prefix.
5098 # gcc -save-temps=obj b.c -gsplit-dwarf -c -o dir/b.o
5099 -> cc1 -dumpdir dir/ -dumpbase b.c -dumpbase-ext .c # dir/b.o dir/b.dwo
5101 but when compiling and linking even a single file, it does:
5103 # gcc -save-temps=obj b.c -o dir/h.out
5104 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5106 unless an explicit -dumpdir prevails:
5108 # gcc -save-temps[=obj] -dumpdir g- b.c -o dir/h.out
5109 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5113 bool explicit_dumpdir
= dumpdir
;
5115 if ((!save_temps_overrides_dumpdir
&& explicit_dumpdir
)
5116 || (output_file
&& not_actual_file_p (output_file
)))
5121 /* If -save-temps=obj and -o name, create the prefix to use for %b.
5122 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
5123 else if (save_temps_flag
!= SAVE_TEMPS_CWD
&& output_file
!= NULL
)
5127 temp
= lbasename (output_file
);
5128 if (temp
!= output_file
)
5129 dumpdir
= xstrndup (output_file
,
5130 strlen (output_file
) - strlen (temp
));
5138 if (save_temps_flag
)
5139 save_temps_flag
= SAVE_TEMPS_DUMP
;
5141 /* If there is any pathname component in an explicit -dumpbase, it
5142 overrides dumpdir entirely, so discard it right away. Although
5143 the presence of an explicit -dumpdir matters for the driver, it
5144 shouldn't matter for other processes, that get all that's needed
5145 from the -dumpdir and -dumpbase always passed to them. */
5146 if (dumpdir
&& dumpbase
&& lbasename (dumpbase
) != dumpbase
)
5152 /* Check that dumpbase_ext matches the end of dumpbase, drop it
5154 if (dumpbase_ext
&& dumpbase
&& *dumpbase
)
5156 int lendb
= strlen (dumpbase
);
5157 int lendbx
= strlen (dumpbase_ext
);
5159 /* -dumpbase-ext must be a suffix proper; discard it if it
5160 matches all of -dumpbase, as that would make for an empty
5163 || strcmp (dumpbase
+ lendb
- lendbx
, dumpbase_ext
) != 0)
5165 free (dumpbase_ext
);
5166 dumpbase_ext
= NULL
;
5170 /* -dumpbase with multiple sources goes into dumpdir. With a single
5171 source, it does only if linking and if dumpdir was not explicitly
5173 if (dumpbase
&& *dumpbase
5174 && (single_input_file_index () == -2
5175 || (!have_c
&& !explicit_dumpdir
)))
5180 /* We checked that they match above. */
5181 dumpbase
[strlen (dumpbase
) - strlen (dumpbase_ext
)] = '\0';
5184 prefix
= concat (dumpdir
, dumpbase
, "-", NULL
);
5186 prefix
= concat (dumpbase
, "-", NULL
);
5190 free (dumpbase_ext
);
5191 dumpbase
= dumpbase_ext
= NULL
;
5193 dumpdir_trailing_dash_added
= true;
5196 /* If dumpbase was not brought into dumpdir but we're linking, bring
5197 output_file into dumpdir unless dumpdir was explicitly specified.
5198 The test for !explicit_dumpdir is further below, because we want
5199 to use the obase computation for a ghost outbase, passed to
5200 GCC_COLLECT_OPTIONS. */
5201 else if (!have_c
&& (!explicit_dumpdir
|| (dumpbase
&& !*dumpbase
)))
5203 /* If we get here, we know dumpbase was not specified, or it was
5204 specified as an empty string. If it was anything else, it
5205 would have combined with dumpdir above, because the condition
5206 for dumpbase to be used when present is broader than the
5207 condition that gets us here. */
5208 gcc_assert (!dumpbase
|| !*dumpbase
);
5211 char *tofree
= NULL
;
5212 if (!output_file
|| not_actual_file_p (output_file
))
5216 obase
= lbasename (output_file
);
5217 size_t blen
= strlen (obase
), xlen
;
5218 /* Drop the suffix if it's dumpbase_ext, if given,
5219 otherwise .exe or the target executable suffix, or if the
5220 output was explicitly named a.out, but not otherwise. */
5222 ? (blen
> (xlen
= strlen (dumpbase_ext
))
5223 && strcmp ((temp
= (obase
+ blen
- xlen
)),
5225 : ((temp
= strrchr (obase
+ 1, '.'))
5226 && (xlen
= strlen (temp
))
5227 && (strcmp (temp
, ".exe") == 0
5228 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
5229 || strcmp (temp
, TARGET_EXECUTABLE_SUFFIX
) == 0
5231 || strcmp (obase
, "a.out") == 0)))
5233 tofree
= xstrndup (obase
, blen
- xlen
);
5238 /* We wish to save this basename to the -dumpdir passed through
5239 GCC_COLLECT_OPTIONS within maybe_run_linker, for e.g. LTO,
5240 but we do NOT wish to add it to e.g. %b, so we keep
5241 outbase_length as zero. */
5242 gcc_assert (!outbase
);
5245 /* If we're building [dir1/]foo[.exe] out of a single input
5246 [dir2/]foo.c that shares the same basename, dump to
5247 [dir2/]foo.c.* rather than duplicating the basename into
5248 [dir2/]foo-foo.c.*. */
5251 || ((idxin
= single_input_file_index ()) >= 0
5252 && adds_single_suffix_p (lbasename (infiles
[idxin
].name
),
5255 if (obase
== tofree
)
5259 outbase
= xstrdup (obase
);
5262 obase
= tofree
= NULL
;
5268 char *p
= concat (dumpdir
, obase
, "-", NULL
);
5273 dumpdir
= concat (obase
, "-", NULL
);
5275 dumpdir_trailing_dash_added
= true;
5278 obase
= tofree
= NULL
;
5281 if (!explicit_dumpdir
|| dumpbase
)
5283 /* Absent -dumpbase and present -dumpbase-ext have been applied
5284 to the linker output name, so compute fresh defaults for each
5286 free (dumpbase_ext
);
5287 dumpbase_ext
= NULL
;
5291 /* Now, if we're compiling, or if we haven't used the dumpbase
5292 above, then outbase (%B) is derived from dumpbase, if given, or
5293 from the output name, given or implied. We can't precompute
5294 implied output names, but that's ok, since they're derived from
5295 input names. Just make sure we skip this if dumpbase is the
5296 empty string: we want to use input names then, so don't set
5298 if ((dumpbase
|| have_c
)
5299 && !(dumpbase
&& !*dumpbase
))
5301 gcc_assert (!outbase
);
5305 gcc_assert (single_input_file_index () != -2);
5306 /* We do not want lbasename here; dumpbase with dirnames
5307 overrides dumpdir entirely, even if dumpdir is
5310 /* We've already checked above that the suffix matches. */
5311 outbase
= xstrndup (dumpbase
,
5312 strlen (dumpbase
) - strlen (dumpbase_ext
));
5314 outbase
= xstrdup (dumpbase
);
5316 else if (output_file
&& !not_actual_file_p (output_file
))
5318 outbase
= xstrdup (lbasename (output_file
));
5319 char *p
= strrchr (outbase
+ 1, '.');
5325 outbase_length
= strlen (outbase
);
5328 /* If there is any pathname component in an explicit -dumpbase, do
5329 not use dumpdir, but retain it to pass it on to the compiler. */
5331 dumpdir_length
= strlen (dumpdir
);
5335 /* Check that dumpbase_ext, if still present, still matches the end
5336 of dumpbase, if present, and drop it otherwise. We only retained
5337 it above when dumpbase was absent to maybe use it to drop the
5338 extension from output_name before combining it with dumpdir. We
5339 won't deal with -dumpbase-ext when -dumpbase is not explicitly
5340 given, even if just to activate backward-compatible dumpbase:
5341 dropping it on the floor is correct, expected and documented
5342 behavior. Attempting to deal with a -dumpbase-ext that might
5343 match the end of some input filename, or of the combination of
5344 the output basename with the suffix of the input filename,
5345 possible with an intermediate .gk extension for -fcompare-debug,
5346 is just calling for trouble. */
5349 if (!dumpbase
|| !*dumpbase
)
5351 free (dumpbase_ext
);
5352 dumpbase_ext
= NULL
;
5355 gcc_assert (strcmp (dumpbase
+ strlen (dumpbase
)
5356 - strlen (dumpbase_ext
), dumpbase_ext
) == 0);
5359 if (save_temps_flag
&& use_pipes
)
5361 /* -save-temps overrides -pipe, so that temp files are produced */
5362 if (save_temps_flag
)
5363 warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
5369 const char *gcd
= env
.get ("GCC_COMPARE_DEBUG");
5371 if (gcd
&& gcd
[0] == '-')
5374 compare_debug_opt
= gcd
;
5376 else if (gcd
&& *gcd
&& strcmp (gcd
, "0"))
5379 compare_debug_opt
= "-gtoggle";
5382 else if (compare_debug
< 0)
5385 gcc_assert (!compare_debug_opt
);
5388 /* Set up the search paths. We add directories that we expect to
5389 contain GNU Toolchain components before directories specified by
5390 the machine description so that we will find GNU components (like
5391 the GNU assembler) before those of the host system. */
5393 /* If we don't know where the toolchain has been installed, use the
5394 configured-in locations. */
5395 if (!gcc_exec_prefix
)
5398 add_prefix (&exec_prefixes
, standard_libexec_prefix
, "GCC",
5399 PREFIX_PRIORITY_LAST
, 1, 0);
5400 add_prefix (&exec_prefixes
, standard_libexec_prefix
, "BINUTILS",
5401 PREFIX_PRIORITY_LAST
, 2, 0);
5402 add_prefix (&exec_prefixes
, standard_exec_prefix
, "BINUTILS",
5403 PREFIX_PRIORITY_LAST
, 2, 0);
5405 add_prefix (&startfile_prefixes
, standard_exec_prefix
, "BINUTILS",
5406 PREFIX_PRIORITY_LAST
, 1, 0);
5409 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix
));
5410 tooldir_prefix2
= concat (tooldir_base_prefix
, spec_machine
,
5411 dir_separator_str
, NULL
);
5413 /* Look for tools relative to the location from which the driver is
5414 running, or, if that is not available, the configured prefix. */
5416 = concat (gcc_exec_prefix
? gcc_exec_prefix
: standard_exec_prefix
,
5417 spec_host_machine
, dir_separator_str
, spec_version
,
5418 accel_dir_suffix
, dir_separator_str
, tooldir_prefix2
, NULL
);
5419 free (tooldir_prefix2
);
5421 add_prefix (&exec_prefixes
,
5422 concat (tooldir_prefix
, "bin", dir_separator_str
, NULL
),
5423 "BINUTILS", PREFIX_PRIORITY_LAST
, 0, 0);
5424 add_prefix (&startfile_prefixes
,
5425 concat (tooldir_prefix
, "lib", dir_separator_str
, NULL
),
5426 "BINUTILS", PREFIX_PRIORITY_LAST
, 0, 1);
5427 free (tooldir_prefix
);
5429 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
5430 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
5431 then consider it to relocate with the rest of the GCC installation
5432 if GCC_EXEC_PREFIX is set.
5433 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
5434 if (target_system_root
&& !target_system_root_changed
&& gcc_exec_prefix
)
5436 char *tmp_prefix
= get_relative_prefix (decoded_options
[0].arg
,
5437 standard_bindir_prefix
,
5438 target_system_root
);
5439 if (tmp_prefix
&& access_check (tmp_prefix
, F_OK
) == 0)
5441 target_system_root
= tmp_prefix
;
5442 target_system_root_changed
= 1;
5447 /* More prefixes are enabled in main, after we read the specs file
5448 and determine whether this is cross-compilation or not. */
5450 if (n_infiles
!= 0 && n_infiles
== last_language_n_infiles
&& spec_lang
!= 0)
5451 warning (0, "%<-x %s%> after last input file has no effect", spec_lang
);
5453 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
5454 environment variable. */
5455 if (compare_debug
== 2 || compare_debug
== 3)
5457 const char *opt
= concat ("-fcompare-debug=", compare_debug_opt
, NULL
);
5458 save_switch (opt
, 0, NULL
, false, true);
5462 /* Ensure we only invoke each subprocess once. */
5464 && (print_subprocess_help
|| print_help_list
|| print_version
))
5466 /* Create a dummy input file, so that we can pass
5467 the help option on to the various sub-processes. */
5468 add_infile ("help-dummy", "c");
5471 /* Decide if undefined variable references are allowed in specs. */
5473 /* -v alone is safe. --version and --help alone or together are safe. Note
5474 that -v would make them unsafe, as they'd then be run for subprocesses as
5475 well, the location of which might depend on variables possibly coming
5476 from self-specs. Note also that the command name is counted in
5477 decoded_options_count. */
5479 unsigned help_version_count
= 0;
5482 help_version_count
++;
5484 if (print_help_list
)
5485 help_version_count
++;
5487 spec_undefvar_allowed
=
5488 ((verbose_flag
&& decoded_options_count
== 2)
5489 || help_version_count
== decoded_options_count
- 1);
5492 switches
[n_switches
].part1
= 0;
5494 infiles
[n_infiles
].name
= 0;
5497 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
5498 and place that in the environment. */
5501 set_collect_gcc_options (void)
5506 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5508 obstack_grow (&collect_obstack
, "COLLECT_GCC_OPTIONS=",
5509 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5512 for (i
= 0; (int) i
< n_switches
; i
++)
5514 const char *const *args
;
5517 obstack_grow (&collect_obstack
, " ", 1);
5521 /* Ignore elided switches. */
5522 if ((switches
[i
].live_cond
5523 & (SWITCH_IGNORE
| SWITCH_KEEP_FOR_GCC
))
5527 obstack_grow (&collect_obstack
, "'-", 2);
5528 q
= switches
[i
].part1
;
5529 while ((p
= strchr (q
, '\'')))
5531 obstack_grow (&collect_obstack
, q
, p
- q
);
5532 obstack_grow (&collect_obstack
, "'\\''", 4);
5535 obstack_grow (&collect_obstack
, q
, strlen (q
));
5536 obstack_grow (&collect_obstack
, "'", 1);
5538 for (args
= switches
[i
].args
; args
&& *args
; args
++)
5540 obstack_grow (&collect_obstack
, " '", 2);
5542 while ((p
= strchr (q
, '\'')))
5544 obstack_grow (&collect_obstack
, q
, p
- q
);
5545 obstack_grow (&collect_obstack
, "'\\''", 4);
5548 obstack_grow (&collect_obstack
, q
, strlen (q
));
5549 obstack_grow (&collect_obstack
, "'", 1);
5556 obstack_grow (&collect_obstack
, " ", 1);
5559 obstack_grow (&collect_obstack
, "'-dumpdir' '", 12);
5563 while ((p
= strchr (q
, '\'')))
5565 obstack_grow (&collect_obstack
, q
, p
- q
);
5566 obstack_grow (&collect_obstack
, "'\\''", 4);
5569 obstack_grow (&collect_obstack
, q
, strlen (q
));
5571 obstack_grow (&collect_obstack
, "'", 1);
5574 obstack_grow (&collect_obstack
, "\0", 1);
5575 xputenv (XOBFINISH (&collect_obstack
, char *));
5578 /* Process a spec string, accumulating and running commands. */
5580 /* These variables describe the input file name.
5581 input_file_number is the index on outfiles of this file,
5582 so that the output file name can be stored for later use by %o.
5583 input_basename is the start of the part of the input file
5584 sans all directory names, and basename_length is the number
5585 of characters starting there excluding the suffix .c or whatever. */
5587 static const char *gcc_input_filename
;
5588 static int input_file_number
;
5589 size_t input_filename_length
;
5590 static int basename_length
;
5591 static int suffixed_basename_length
;
5592 static const char *input_basename
;
5593 static const char *input_suffix
;
5594 #ifndef HOST_LACKS_INODE_NUMBERS
5595 static struct stat input_stat
;
5597 static int input_stat_set
;
5599 /* The compiler used to process the current input file. */
5600 static struct compiler
*input_file_compiler
;
5602 /* These are variables used within do_spec and do_spec_1. */
5604 /* Nonzero if an arg has been started and not yet terminated
5605 (with space, tab or newline). */
5606 static int arg_going
;
5608 /* Nonzero means %d or %g has been seen; the next arg to be terminated
5609 is a temporary file name. */
5610 static int delete_this_arg
;
5612 /* Nonzero means %w has been seen; the next arg to be terminated
5613 is the output file name of this compilation. */
5614 static int this_is_output_file
;
5616 /* Nonzero means %s has been seen; the next arg to be terminated
5617 is the name of a library file and we should try the standard
5618 search dirs for it. */
5619 static int this_is_library_file
;
5621 /* Nonzero means %T has been seen; the next arg to be terminated
5622 is the name of a linker script and we should try all of the
5623 standard search dirs for it. If it is found insert a --script
5624 command line switch and then substitute the full path in place,
5625 otherwise generate an error message. */
5626 static int this_is_linker_script
;
5628 /* Nonzero means that the input of this command is coming from a pipe. */
5629 static int input_from_pipe
;
5631 /* Nonnull means substitute this for any suffix when outputting a switches
5633 static const char *suffix_subst
;
5635 /* If there is an argument being accumulated, terminate it and store it. */
5638 end_going_arg (void)
5644 obstack_1grow (&obstack
, 0);
5645 string
= XOBFINISH (&obstack
, const char *);
5646 if (this_is_library_file
)
5647 string
= find_file (string
);
5648 if (this_is_linker_script
)
5650 char * full_script_path
= find_a_file (&startfile_prefixes
, string
, R_OK
, true);
5652 if (full_script_path
== NULL
)
5654 error ("unable to locate default linker script %qs in the library search paths", string
);
5655 /* Script was not found on search path. */
5658 store_arg ("--script", false, false);
5659 string
= full_script_path
;
5661 store_arg (string
, delete_this_arg
, this_is_output_file
);
5662 if (this_is_output_file
)
5663 outfiles
[input_file_number
] = string
;
5669 /* Parse the WRAPPER string which is a comma separated list of the command line
5670 and insert them into the beginning of argbuf. */
5673 insert_wrapper (const char *wrapper
)
5677 char *buf
= xstrdup (wrapper
);
5679 unsigned int old_length
= argbuf
.length ();
5687 while ((p
= strchr (p
, ',')) != NULL
);
5689 argbuf
.safe_grow (old_length
+ n
, true);
5690 memmove (argbuf
.address () + n
,
5692 old_length
* sizeof (const_char_p
));
5706 while ((p
= strchr (p
, ',')) != NULL
);
5707 gcc_assert (i
== n
);
5710 /* Process the spec SPEC and run the commands specified therein.
5711 Returns 0 if the spec is successfully processed; -1 if failed. */
5714 do_spec (const char *spec
)
5718 value
= do_spec_2 (spec
, NULL
);
5720 /* Force out any unfinished command.
5721 If -pipe, this forces out the last command if it ended in `|'. */
5724 if (argbuf
.length () > 0
5725 && !strcmp (argbuf
.last (), "|"))
5728 set_collect_gcc_options ();
5730 if (argbuf
.length () > 0)
5737 /* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
5738 of a matched * pattern which may be re-injected by way of %*. */
5741 do_spec_2 (const char *spec
, const char *soft_matched_part
)
5747 delete_this_arg
= 0;
5748 this_is_output_file
= 0;
5749 this_is_library_file
= 0;
5750 this_is_linker_script
= 0;
5751 input_from_pipe
= 0;
5752 suffix_subst
= NULL
;
5754 result
= do_spec_1 (spec
, 0, soft_matched_part
);
5761 /* Process the given spec string and add any new options to the end
5762 of the switches/n_switches array. */
5765 do_option_spec (const char *name
, const char *spec
)
5767 unsigned int i
, value_count
, value_len
;
5768 const char *p
, *q
, *value
;
5769 char *tmp_spec
, *tmp_spec_p
;
5771 if (configure_default_options
[0].name
== NULL
)
5774 for (i
= 0; i
< ARRAY_SIZE (configure_default_options
); i
++)
5775 if (strcmp (configure_default_options
[i
].name
, name
) == 0)
5777 if (i
== ARRAY_SIZE (configure_default_options
))
5780 value
= configure_default_options
[i
].value
;
5781 value_len
= strlen (value
);
5783 /* Compute the size of the final spec. */
5786 while ((p
= strstr (p
, "%(VALUE)")) != NULL
)
5792 /* Replace each %(VALUE) by the specified value. */
5793 tmp_spec
= (char *) alloca (strlen (spec
) + 1
5794 + value_count
* (value_len
- strlen ("%(VALUE)")));
5795 tmp_spec_p
= tmp_spec
;
5797 while ((p
= strstr (q
, "%(VALUE)")) != NULL
)
5799 memcpy (tmp_spec_p
, q
, p
- q
);
5800 tmp_spec_p
= tmp_spec_p
+ (p
- q
);
5801 memcpy (tmp_spec_p
, value
, value_len
);
5802 tmp_spec_p
+= value_len
;
5803 q
= p
+ strlen ("%(VALUE)");
5805 strcpy (tmp_spec_p
, q
);
5807 do_self_spec (tmp_spec
);
5810 /* Process the given spec string and add any new options to the end
5811 of the switches/n_switches array. */
5814 do_self_spec (const char *spec
)
5818 do_spec_2 (spec
, NULL
);
5819 do_spec_1 (" ", 0, NULL
);
5821 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
5822 do_self_specs adds the replacements to switches array, so it shouldn't
5823 be processed afterwards. */
5824 for (i
= 0; i
< n_switches
; i
++)
5825 if ((switches
[i
].live_cond
& SWITCH_IGNORE
))
5826 switches
[i
].live_cond
|= SWITCH_IGNORE_PERMANENTLY
;
5828 if (argbuf
.length () > 0)
5830 const char **argbuf_copy
;
5831 struct cl_decoded_option
*decoded_options
;
5832 struct cl_option_handlers handlers
;
5833 unsigned int decoded_options_count
;
5836 /* Create a copy of argbuf with a dummy argv[0] entry for
5837 decode_cmdline_options_to_array. */
5838 argbuf_copy
= XNEWVEC (const char *,
5839 argbuf
.length () + 1);
5840 argbuf_copy
[0] = "";
5841 memcpy (argbuf_copy
+ 1, argbuf
.address (),
5842 argbuf
.length () * sizeof (const char *));
5844 decode_cmdline_options_to_array (argbuf
.length () + 1,
5846 CL_DRIVER
, &decoded_options
,
5847 &decoded_options_count
);
5850 set_option_handlers (&handlers
);
5852 for (j
= 1; j
< decoded_options_count
; j
++)
5854 switch (decoded_options
[j
].opt_index
)
5856 case OPT_SPECIAL_input_file
:
5857 /* Specs should only generate options, not input
5859 if (strcmp (decoded_options
[j
].arg
, "-") != 0)
5860 fatal_error (input_location
,
5861 "switch %qs does not start with %<-%>",
5862 decoded_options
[j
].arg
);
5864 fatal_error (input_location
,
5865 "spec-generated switch is just %<-%>");
5868 case OPT_fcompare_debug_second
:
5869 case OPT_fcompare_debug
:
5870 case OPT_fcompare_debug_
:
5872 /* Avoid duplicate processing of some options from
5873 compare-debug specs; just save them here. */
5874 save_switch (decoded_options
[j
].canonical_option
[0],
5875 (decoded_options
[j
].canonical_option_num_elements
5877 &decoded_options
[j
].canonical_option
[1], false, true);
5881 read_cmdline_option (&global_options
, &global_options_set
,
5882 decoded_options
+ j
, UNKNOWN_LOCATION
,
5883 CL_DRIVER
, &handlers
, global_dc
);
5888 free (decoded_options
);
5891 switches
[n_switches
].part1
= 0;
5895 /* Callback for processing %D and %I specs. */
5897 struct spec_path_info
{
5902 bool separate_options
;
5906 spec_path (char *path
, void *data
)
5908 struct spec_path_info
*info
= (struct spec_path_info
*) data
;
5912 if (info
->omit_relative
&& !IS_ABSOLUTE_PATH (path
))
5915 if (info
->append_len
!= 0)
5917 len
= strlen (path
);
5918 memcpy (path
+ len
, info
->append
, info
->append_len
+ 1);
5921 if (!is_directory (path
, true))
5924 do_spec_1 (info
->option
, 1, NULL
);
5925 if (info
->separate_options
)
5926 do_spec_1 (" ", 0, NULL
);
5928 if (info
->append_len
== 0)
5930 len
= strlen (path
);
5931 save
= path
[len
- 1];
5932 if (IS_DIR_SEPARATOR (path
[len
- 1]))
5933 path
[len
- 1] = '\0';
5936 do_spec_1 (path
, 1, NULL
);
5937 do_spec_1 (" ", 0, NULL
);
5939 /* Must not damage the original path. */
5940 if (info
->append_len
== 0)
5941 path
[len
- 1] = save
;
5946 /* True if we should compile INFILE. */
5949 compile_input_file_p (struct infile
*infile
)
5951 if ((!infile
->language
) || (infile
->language
[0] != '*'))
5952 if (infile
->incompiler
== input_file_compiler
)
5957 /* Process each member of VEC as a spec. */
5960 do_specs_vec (vec
<char_p
> vec
)
5962 for (char *opt
: vec
)
5964 do_spec_1 (opt
, 1, NULL
);
5965 /* Make each accumulated option a separate argument. */
5966 do_spec_1 (" ", 0, NULL
);
5970 /* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS. */
5973 putenv_COLLECT_AS_OPTIONS (vec
<char_p
> vec
)
5975 if (vec
.is_empty ())
5978 obstack_init (&collect_obstack
);
5979 obstack_grow (&collect_obstack
, "COLLECT_AS_OPTIONS=",
5980 strlen ("COLLECT_AS_OPTIONS="));
5985 FOR_EACH_VEC_ELT (vec
, ix
, opt
)
5987 obstack_1grow (&collect_obstack
, '\'');
5988 obstack_grow (&collect_obstack
, opt
, strlen (opt
));
5989 obstack_1grow (&collect_obstack
, '\'');
5990 if (ix
< vec
.length () - 1)
5991 obstack_1grow(&collect_obstack
, ' ');
5994 obstack_1grow (&collect_obstack
, '\0');
5995 xputenv (XOBFINISH (&collect_obstack
, char *));
5998 /* Process the sub-spec SPEC as a portion of a larger spec.
5999 This is like processing a whole spec except that we do
6000 not initialize at the beginning and we do not supply a
6001 newline by default at the end.
6002 INSWITCH nonzero means don't process %-sequences in SPEC;
6003 in this case, % is treated as an ordinary character.
6004 This is used while substituting switches.
6005 INSWITCH nonzero also causes SPC not to terminate an argument.
6007 Value is zero unless a line was finished
6008 and the command on that line reported an error. */
6011 do_spec_1 (const char *spec
, int inswitch
, const char *soft_matched_part
)
6013 const char *p
= spec
;
6018 /* If it's an empty string argument to a switch, keep it as is. */
6019 if (inswitch
&& !*p
)
6023 /* If substituting a switch, treat all chars like letters.
6024 Otherwise, NL, SPC, TAB and % are special. */
6025 switch (inswitch
? 'a' : c
)
6030 if (argbuf
.length () > 0
6031 && !strcmp (argbuf
.last (), "|"))
6033 /* A `|' before the newline means use a pipe here,
6034 but only if -pipe was specified.
6035 Otherwise, execute now and don't pass the `|' as an arg. */
6038 input_from_pipe
= 1;
6045 set_collect_gcc_options ();
6047 if (argbuf
.length () > 0)
6053 /* Reinitialize for a new command, and for a new argument. */
6056 delete_this_arg
= 0;
6057 this_is_output_file
= 0;
6058 this_is_library_file
= 0;
6059 this_is_linker_script
= 0;
6060 input_from_pipe
= 0;
6067 obstack_1grow (&obstack
, c
);
6075 /* Reinitialize for a new argument. */
6076 delete_this_arg
= 0;
6077 this_is_output_file
= 0;
6078 this_is_library_file
= 0;
6079 this_is_linker_script
= 0;
6086 fatal_error (input_location
, "spec %qs invalid", spec
);
6089 /* Don't use %b in the linker command. */
6090 gcc_assert (suffixed_basename_length
);
6091 if (!this_is_output_file
&& dumpdir_length
)
6092 obstack_grow (&obstack
, dumpdir
, dumpdir_length
);
6093 if (this_is_output_file
|| !outbase_length
)
6094 obstack_grow (&obstack
, input_basename
, basename_length
);
6096 obstack_grow (&obstack
, outbase
, outbase_length
);
6097 if (compare_debug
< 0)
6098 obstack_grow (&obstack
, ".gk", 3);
6103 /* Don't use %B in the linker command. */
6104 gcc_assert (suffixed_basename_length
);
6105 if (!this_is_output_file
&& dumpdir_length
)
6106 obstack_grow (&obstack
, dumpdir
, dumpdir_length
);
6107 if (this_is_output_file
|| !outbase_length
)
6108 obstack_grow (&obstack
, input_basename
, basename_length
);
6110 obstack_grow (&obstack
, outbase
, outbase_length
);
6111 if (compare_debug
< 0)
6112 obstack_grow (&obstack
, ".gk", 3);
6113 obstack_grow (&obstack
, input_basename
+ basename_length
,
6114 suffixed_basename_length
- basename_length
);
6120 delete_this_arg
= 2;
6123 /* Dump out the directories specified with LIBRARY_PATH,
6124 followed by the absolute directories
6125 that we search for startfiles. */
6128 struct spec_path_info info
;
6131 info
.append_len
= 0;
6132 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
6133 /* Used on systems which record the specified -L dirs
6134 and use them to search for dynamic linking.
6135 Relative directories always come from -B,
6136 and it is better not to use them for searching
6137 at run time. In particular, stage1 loses. */
6138 info
.omit_relative
= true;
6140 info
.omit_relative
= false;
6142 info
.separate_options
= false;
6144 for_each_path (&startfile_prefixes
, true, 0, spec_path
, &info
);
6149 /* %efoo means report an error with `foo' as error message
6150 and don't execute any more commands for this file. */
6154 while (*p
!= 0 && *p
!= '\n')
6156 buf
= (char *) alloca (p
- q
+ 1);
6157 strncpy (buf
, q
, p
- q
);
6159 error ("%s", _(buf
));
6164 /* %nfoo means report a notice with `foo' on stderr. */
6168 while (*p
!= 0 && *p
!= '\n')
6170 buf
= (char *) alloca (p
- q
+ 1);
6171 strncpy (buf
, q
, p
- q
);
6173 inform (UNKNOWN_LOCATION
, "%s", _(buf
));
6183 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
6184 defined, and it is not a directory, and it is
6185 writable, use it. Otherwise, treat this like any
6186 other temporary file. */
6188 if ((!save_temps_flag
)
6189 && (stat (HOST_BIT_BUCKET
, &st
) == 0) && (!S_ISDIR (st
.st_mode
))
6190 && (access (HOST_BIT_BUCKET
, W_OK
) == 0))
6192 obstack_grow (&obstack
, HOST_BIT_BUCKET
,
6193 strlen (HOST_BIT_BUCKET
));
6194 delete_this_arg
= 0;
6199 goto create_temp_file
;
6203 obstack_1grow (&obstack
, '-');
6204 delete_this_arg
= 0;
6207 /* consume suffix */
6208 while (*p
== '.' || ISALNUM ((unsigned char) *p
))
6210 if (p
[0] == '%' && p
[1] == 'O')
6215 goto create_temp_file
;
6219 /* consume suffix */
6220 while (*p
== '.' || ISALNUM ((unsigned char) *p
))
6222 if (p
[0] == '%' && p
[1] == 'O')
6227 goto create_temp_file
;
6233 struct temp_name
*t
;
6235 const char *suffix
= p
;
6236 char *saved_suffix
= NULL
;
6238 while (*p
== '.' || ISALNUM ((unsigned char) *p
))
6240 suffix_length
= p
- suffix
;
6241 if (p
[0] == '%' && p
[1] == 'O')
6244 /* We don't support extra suffix characters after %O. */
6245 if (*p
== '.' || ISALNUM ((unsigned char) *p
))
6246 fatal_error (input_location
,
6247 "spec %qs has invalid %<%%0%c%>", spec
, *p
);
6248 if (suffix_length
== 0)
6249 suffix
= TARGET_OBJECT_SUFFIX
;
6253 = XNEWVEC (char, suffix_length
6254 + strlen (TARGET_OBJECT_SUFFIX
) + 1);
6255 strncpy (saved_suffix
, suffix
, suffix_length
);
6256 strcpy (saved_suffix
+ suffix_length
,
6257 TARGET_OBJECT_SUFFIX
);
6259 suffix_length
+= strlen (TARGET_OBJECT_SUFFIX
);
6262 if (compare_debug
< 0)
6264 suffix
= concat (".gk", suffix
, NULL
);
6268 /* If -save-temps was specified, use that for the
6270 if (save_temps_flag
)
6273 bool adjusted_suffix
= false;
6275 && !outbase_length
&& !basename_length
6276 && !dumpdir_trailing_dash_added
)
6278 adjusted_suffix
= true;
6282 temp_filename_length
6283 = dumpdir_length
+ suffix_length
+ 1;
6285 temp_filename_length
+= outbase_length
;
6287 temp_filename_length
+= basename_length
;
6288 tmp
= (char *) alloca (temp_filename_length
);
6290 memcpy (tmp
, dumpdir
, dumpdir_length
);
6292 memcpy (tmp
+ dumpdir_length
, outbase
,
6294 else if (basename_length
)
6295 memcpy (tmp
+ dumpdir_length
, input_basename
,
6297 memcpy (tmp
+ temp_filename_length
- suffix_length
- 1,
6298 suffix
, suffix_length
);
6299 if (adjusted_suffix
)
6301 adjusted_suffix
= false;
6305 tmp
[temp_filename_length
- 1] = '\0';
6306 temp_filename
= tmp
;
6308 if (filename_cmp (temp_filename
, gcc_input_filename
) != 0)
6310 #ifndef HOST_LACKS_INODE_NUMBERS
6311 struct stat st_temp
;
6313 /* Note, set_input() resets input_stat_set to 0. */
6314 if (input_stat_set
== 0)
6316 input_stat_set
= stat (gcc_input_filename
,
6318 if (input_stat_set
>= 0)
6322 /* If we have the stat for the gcc_input_filename
6323 and we can do the stat for the temp_filename
6324 then the they could still refer to the same
6325 file if st_dev/st_ino's are the same. */
6326 if (input_stat_set
!= 1
6327 || stat (temp_filename
, &st_temp
) < 0
6328 || input_stat
.st_dev
!= st_temp
.st_dev
6329 || input_stat
.st_ino
!= st_temp
.st_ino
)
6331 /* Just compare canonical pathnames. */
6332 char* input_realname
= lrealpath (gcc_input_filename
);
6333 char* temp_realname
= lrealpath (temp_filename
);
6334 bool files_differ
= filename_cmp (input_realname
, temp_realname
);
6335 free (input_realname
);
6336 free (temp_realname
);
6341 = save_string (temp_filename
,
6342 temp_filename_length
- 1);
6343 obstack_grow (&obstack
, temp_filename
,
6344 temp_filename_length
);
6346 delete_this_arg
= 0;
6352 /* See if we already have an association of %g/%u/%U and
6354 for (t
= temp_names
; t
; t
= t
->next
)
6355 if (t
->length
== suffix_length
6356 && strncmp (t
->suffix
, suffix
, suffix_length
) == 0
6357 && t
->unique
== (c
== 'u' || c
== 'U' || c
== 'j'))
6360 /* Make a new association if needed. %u and %j
6362 if (t
== 0 || c
== 'u' || c
== 'j')
6366 t
= XNEW (struct temp_name
);
6367 t
->next
= temp_names
;
6370 t
->length
= suffix_length
;
6373 t
->suffix
= saved_suffix
;
6374 saved_suffix
= NULL
;
6377 t
->suffix
= save_string (suffix
, suffix_length
);
6378 t
->unique
= (c
== 'u' || c
== 'U' || c
== 'j');
6379 temp_filename
= make_temp_file (t
->suffix
);
6380 temp_filename_length
= strlen (temp_filename
);
6381 t
->filename
= temp_filename
;
6382 t
->filename_length
= temp_filename_length
;
6385 free (saved_suffix
);
6387 obstack_grow (&obstack
, t
->filename
, t
->filename_length
);
6388 delete_this_arg
= 1;
6396 /* We are going to expand `%i' into `@FILE', where FILE
6397 is a newly-created temporary filename. The filenames
6398 that would usually be expanded in place of %o will be
6399 written to the temporary file. */
6400 if (at_file_supplied
)
6403 for (i
= 0; (int) i
< n_infiles
; i
++)
6404 if (compile_input_file_p (&infiles
[i
]))
6406 store_arg (infiles
[i
].name
, 0, 0);
6407 infiles
[i
].compiled
= true;
6410 if (at_file_supplied
)
6415 obstack_grow (&obstack
, gcc_input_filename
,
6416 input_filename_length
);
6423 struct spec_path_info info
;
6427 do_spec_1 ("-imultilib", 1, NULL
);
6428 /* Make this a separate argument. */
6429 do_spec_1 (" ", 0, NULL
);
6430 do_spec_1 (multilib_dir
, 1, NULL
);
6431 do_spec_1 (" ", 0, NULL
);
6436 do_spec_1 ("-imultiarch", 1, NULL
);
6437 /* Make this a separate argument. */
6438 do_spec_1 (" ", 0, NULL
);
6439 do_spec_1 (multiarch_dir
, 1, NULL
);
6440 do_spec_1 (" ", 0, NULL
);
6443 if (gcc_exec_prefix
)
6445 do_spec_1 ("-iprefix", 1, NULL
);
6446 /* Make this a separate argument. */
6447 do_spec_1 (" ", 0, NULL
);
6448 do_spec_1 (gcc_exec_prefix
, 1, NULL
);
6449 do_spec_1 (" ", 0, NULL
);
6452 if (target_system_root_changed
||
6453 (target_system_root
&& target_sysroot_hdrs_suffix
))
6455 do_spec_1 ("-isysroot", 1, NULL
);
6456 /* Make this a separate argument. */
6457 do_spec_1 (" ", 0, NULL
);
6458 do_spec_1 (target_system_root
, 1, NULL
);
6459 if (target_sysroot_hdrs_suffix
)
6460 do_spec_1 (target_sysroot_hdrs_suffix
, 1, NULL
);
6461 do_spec_1 (" ", 0, NULL
);
6464 info
.option
= "-isystem";
6465 info
.append
= "include";
6466 info
.append_len
= strlen (info
.append
);
6467 info
.omit_relative
= false;
6468 info
.separate_options
= true;
6470 for_each_path (&include_prefixes
, false, info
.append_len
,
6473 info
.append
= "include-fixed";
6474 if (*sysroot_hdrs_suffix_spec
)
6475 info
.append
= concat (info
.append
, dir_separator_str
,
6476 multilib_dir
, NULL
);
6477 info
.append_len
= strlen (info
.append
);
6478 for_each_path (&include_prefixes
, false, info
.append_len
,
6484 /* We are going to expand `%o' into `@FILE', where FILE
6485 is a newly-created temporary filename. The filenames
6486 that would usually be expanded in place of %o will be
6487 written to the temporary file. */
6488 if (at_file_supplied
)
6491 for (i
= 0; i
< n_infiles
+ lang_specific_extra_outfiles
; i
++)
6493 store_arg (outfiles
[i
], 0, 0);
6495 if (at_file_supplied
)
6500 obstack_grow (&obstack
, TARGET_OBJECT_SUFFIX
, strlen (TARGET_OBJECT_SUFFIX
));
6505 this_is_library_file
= 1;
6509 this_is_linker_script
= 1;
6513 outfiles
[input_file_number
] = NULL
;
6517 this_is_output_file
= 1;
6522 unsigned int cur_index
= argbuf
.length ();
6523 /* Handle the {...} following the %W. */
6525 fatal_error (input_location
,
6526 "spec %qs has invalid %<%%W%c%>", spec
, *p
);
6527 p
= handle_braces (p
+ 1);
6531 /* If any args were output, mark the last one for deletion
6533 if (argbuf
.length () != cur_index
)
6534 record_temp_file (argbuf
.last (), 0, 1);
6539 /* Handle the {...} following the %@. */
6541 fatal_error (input_location
,
6542 "spec %qs has invalid %<%%@%c%>", spec
, *p
);
6543 if (at_file_supplied
)
6545 p
= handle_braces (p
+ 1);
6546 if (at_file_supplied
)
6552 /* %x{OPTION} records OPTION for %X to output. */
6558 /* Skip past the option value and make a copy. */
6560 fatal_error (input_location
,
6561 "spec %qs has invalid %<%%x%c%>", spec
, *p
);
6564 string
= save_string (p1
+ 1, p
- p1
- 2);
6566 /* See if we already recorded this option. */
6567 for (const char *opt
: linker_options
)
6568 if (! strcmp (string
, opt
))
6574 /* This option is new; add it. */
6575 add_linker_option (string
, strlen (string
));
6580 /* Dump out the options accumulated previously using %x. */
6582 do_specs_vec (linker_options
);
6585 /* Dump out the options accumulated previously using -Wa,. */
6587 do_specs_vec (assembler_options
);
6590 /* Dump out the options accumulated previously using -Wp,. */
6592 do_specs_vec (preprocessor_options
);
6595 /* Here are digits and numbers that just process
6596 a certain constant string as a spec. */
6599 value
= do_spec_1 (cc1_spec
, 0, NULL
);
6605 value
= do_spec_1 (cc1plus_spec
, 0, NULL
);
6611 value
= do_spec_1 (asm_spec
, 0, NULL
);
6617 value
= do_spec_1 (asm_final_spec
, 0, NULL
);
6624 const char *const spec
6625 = (input_file_compiler
->cpp_spec
6626 ? input_file_compiler
->cpp_spec
6628 value
= do_spec_1 (spec
, 0, NULL
);
6635 value
= do_spec_1 (endfile_spec
, 0, NULL
);
6641 value
= do_spec_1 (link_spec
, 0, NULL
);
6647 value
= do_spec_1 (lib_spec
, 0, NULL
);
6653 if (multilib_os_dir
== NULL
)
6654 obstack_1grow (&obstack
, '.');
6656 obstack_grow (&obstack
, multilib_os_dir
,
6657 strlen (multilib_os_dir
));
6661 value
= do_spec_1 (libgcc_spec
, 0, NULL
);
6667 /* We assume there is a directory
6668 separator at the end of this string. */
6669 if (target_system_root
)
6671 obstack_grow (&obstack
, target_system_root
,
6672 strlen (target_system_root
));
6673 if (target_sysroot_suffix
)
6674 obstack_grow (&obstack
, target_sysroot_suffix
,
6675 strlen (target_sysroot_suffix
));
6680 value
= do_spec_1 (startfile_spec
, 0, NULL
);
6685 /* Here we define characters other than letters and digits. */
6688 p
= handle_braces (p
);
6694 p
= handle_spec_function (p
, NULL
, soft_matched_part
);
6700 obstack_1grow (&obstack
, '%');
6707 while (p
[len
] && p
[len
] != ' ' && p
[len
] != '%')
6709 suffix_subst
= save_string (p
- 1, len
+ 1);
6714 /* Henceforth ignore the option(s) matching the pattern
6720 int have_wildcard
= 0;
6725 switch_option
= SWITCH_IGNORE
| SWITCH_KEEP_FOR_GCC
;
6727 switch_option
= SWITCH_IGNORE
;
6729 while (p
[len
] && p
[len
] != ' ' && p
[len
] != '\t')
6732 if (p
[len
-1] == '*')
6735 for (i
= 0; i
< n_switches
; i
++)
6736 if (!strncmp (switches
[i
].part1
, p
, len
- have_wildcard
)
6737 && (have_wildcard
|| switches
[i
].part1
[len
] == '\0'))
6739 switches
[i
].live_cond
|= switch_option
;
6740 /* User switch be validated from validate_all_switches.
6741 when the definition is seen from the spec file.
6742 If not defined anywhere, will be rejected. */
6743 if (switches
[i
].known
)
6744 switches
[i
].validated
= true;
6752 if (soft_matched_part
)
6754 if (soft_matched_part
[0])
6755 do_spec_1 (soft_matched_part
, 1, NULL
);
6756 /* Only insert a space after the substitution if it is at the
6757 end of the current sequence. So if:
6759 "%{foo=*:bar%*}%{foo=*:one%*two}"
6761 matches -foo=hello then it will produce:
6763 barhello onehellotwo
6765 if (*p
== 0 || *p
== '}')
6766 do_spec_1 (" ", 0, NULL
);
6769 /* Catch the case where a spec string contains something like
6770 '%{foo:%*}'. i.e. there is no * in the pattern on the left
6771 hand side of the :. */
6772 error ("spec failure: %<%%*%> has not been initialized by pattern match");
6775 /* Process a string found as the value of a spec given by name.
6776 This feature allows individual machine descriptions
6777 to add and use their own specs. */
6780 const char *name
= p
;
6781 struct spec_list
*sl
;
6784 /* The string after the S/P is the name of a spec that is to be
6786 while (*p
&& *p
!= ')')
6789 /* See if it's in the list. */
6790 for (len
= p
- name
, sl
= specs
; sl
; sl
= sl
->next
)
6791 if (sl
->name_len
== len
&& !strncmp (sl
->name
, name
, len
))
6793 name
= *(sl
->ptr_spec
);
6795 fnotice (stderr
, "Processing spec (%s), which is '%s'\n",
6803 value
= do_spec_1 (name
, 0, NULL
);
6808 /* Discard the closing paren. */
6815 /* End a previous argument, if there is one, then issue an
6823 error ("spec failure: unrecognized spec option %qc", c
);
6829 /* Backslash: treat next character as ordinary. */
6832 /* When adding more cases that previously matched default, make
6833 sure to adjust quote_spec_char_p as well. */
6837 /* Ordinary character: put it into the current argument. */
6838 obstack_1grow (&obstack
, c
);
6842 /* End of string. If we are processing a spec function, we need to
6843 end any pending argument. */
6844 if (processing_spec_function
)
6850 /* Look up a spec function. */
6852 static const struct spec_function
*
6853 lookup_spec_function (const char *name
)
6855 const struct spec_function
*sf
;
6857 for (sf
= static_spec_functions
; sf
->name
!= NULL
; sf
++)
6858 if (strcmp (sf
->name
, name
) == 0)
6864 /* Evaluate a spec function. */
6867 eval_spec_function (const char *func
, const char *args
,
6868 const char *soft_matched_part
)
6870 const struct spec_function
*sf
;
6871 const char *funcval
;
6873 /* Saved spec processing context. */
6874 vec
<const_char_p
> save_argbuf
;
6877 int save_delete_this_arg
;
6878 int save_this_is_output_file
;
6879 int save_this_is_library_file
;
6880 int save_input_from_pipe
;
6881 int save_this_is_linker_script
;
6882 const char *save_suffix_subst
;
6884 int save_growing_size
;
6885 void *save_growing_value
= NULL
;
6887 sf
= lookup_spec_function (func
);
6889 fatal_error (input_location
, "unknown spec function %qs", func
);
6891 /* Push the spec processing context. */
6892 save_argbuf
= argbuf
;
6894 save_arg_going
= arg_going
;
6895 save_delete_this_arg
= delete_this_arg
;
6896 save_this_is_output_file
= this_is_output_file
;
6897 save_this_is_library_file
= this_is_library_file
;
6898 save_this_is_linker_script
= this_is_linker_script
;
6899 save_input_from_pipe
= input_from_pipe
;
6900 save_suffix_subst
= suffix_subst
;
6902 /* If we have some object growing now, finalize it so the args and function
6903 eval proceed from a cleared context. This is needed to prevent the first
6904 constructed arg from mistakenly including the growing value. We'll push
6905 this value back on the obstack once the function evaluation is done, to
6906 restore a consistent processing context for our caller. This is fine as
6907 the address of growing objects isn't guaranteed to remain stable until
6908 they are finalized, and we expect this situation to be rare enough for
6909 the extra copy not to be an issue. */
6910 save_growing_size
= obstack_object_size (&obstack
);
6911 if (save_growing_size
> 0)
6912 save_growing_value
= obstack_finish (&obstack
);
6914 /* Create a new spec processing context, and build the function
6918 if (do_spec_2 (args
, soft_matched_part
) < 0)
6919 fatal_error (input_location
, "error in arguments to spec function %qs",
6922 /* argbuf_index is an index for the next argument to be inserted, and
6923 so contains the count of the args already inserted. */
6925 funcval
= (*sf
->func
) (argbuf
.length (),
6928 /* Pop the spec processing context. */
6930 argbuf
= save_argbuf
;
6932 arg_going
= save_arg_going
;
6933 delete_this_arg
= save_delete_this_arg
;
6934 this_is_output_file
= save_this_is_output_file
;
6935 this_is_library_file
= save_this_is_library_file
;
6936 this_is_linker_script
= save_this_is_linker_script
;
6937 input_from_pipe
= save_input_from_pipe
;
6938 suffix_subst
= save_suffix_subst
;
6940 if (save_growing_size
> 0)
6941 obstack_grow (&obstack
, save_growing_value
, save_growing_size
);
6946 /* Handle a spec function call of the form:
6950 ARGS is processed as a spec in a separate context and split into an
6951 argument vector in the normal fashion. The function returns a string
6952 containing a spec which we then process in the caller's context, or
6953 NULL if no processing is required.
6955 If RETVAL_NONNULL is not NULL, then store a bool whether function
6958 SOFT_MATCHED_PART holds the current value of a matched * pattern, which
6959 may be re-expanded with a %* as part of the function arguments. */
6962 handle_spec_function (const char *p
, bool *retval_nonnull
,
6963 const char *soft_matched_part
)
6966 const char *endp
, *funcval
;
6969 processing_spec_function
++;
6971 /* Get the function name. */
6972 for (endp
= p
; *endp
!= '\0'; endp
++)
6974 if (*endp
== '(') /* ) */
6976 /* Only allow [A-Za-z0-9], -, and _ in function names. */
6977 if (!ISALNUM (*endp
) && !(*endp
== '-' || *endp
== '_'))
6978 fatal_error (input_location
, "malformed spec function name");
6980 if (*endp
!= '(') /* ) */
6981 fatal_error (input_location
, "no arguments for spec function");
6982 func
= save_string (p
, endp
- p
);
6985 /* Get the arguments. */
6986 for (count
= 0; *endp
!= '\0'; endp
++)
6995 else if (*endp
== '(') /* ) */
7000 fatal_error (input_location
, "malformed spec function arguments");
7001 args
= save_string (p
, endp
- p
);
7004 /* p now points to just past the end of the spec function expression. */
7006 funcval
= eval_spec_function (func
, args
, soft_matched_part
);
7007 if (funcval
!= NULL
&& do_spec_1 (funcval
, 0, NULL
) < 0)
7010 *retval_nonnull
= funcval
!= NULL
;
7015 processing_spec_function
--;
7020 /* Inline subroutine of handle_braces. Returns true if the current
7021 input suffix matches the atom bracketed by ATOM and END_ATOM. */
7023 input_suffix_matches (const char *atom
, const char *end_atom
)
7025 return (input_suffix
7026 && !strncmp (input_suffix
, atom
, end_atom
- atom
)
7027 && input_suffix
[end_atom
- atom
] == '\0');
7030 /* Subroutine of handle_braces. Returns true if the current
7031 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
7033 input_spec_matches (const char *atom
, const char *end_atom
)
7035 return (input_file_compiler
7036 && input_file_compiler
->suffix
7037 && input_file_compiler
->suffix
[0] != '\0'
7038 && !strncmp (input_file_compiler
->suffix
+ 1, atom
,
7040 && input_file_compiler
->suffix
[end_atom
- atom
+ 1] == '\0');
7043 /* Subroutine of handle_braces. Returns true if a switch
7044 matching the atom bracketed by ATOM and END_ATOM appeared on the
7047 switch_matches (const char *atom
, const char *end_atom
, int starred
)
7050 int len
= end_atom
- atom
;
7051 int plen
= starred
? len
: -1;
7053 for (i
= 0; i
< n_switches
; i
++)
7054 if (!strncmp (switches
[i
].part1
, atom
, len
)
7055 && (starred
|| switches
[i
].part1
[len
] == '\0')
7056 && check_live_switch (i
, plen
))
7059 /* Check if a switch with separated form matching the atom.
7060 We check -D and -U switches. */
7061 else if (switches
[i
].args
!= 0)
7063 if ((*switches
[i
].part1
== 'D' || *switches
[i
].part1
== 'U')
7064 && *switches
[i
].part1
== atom
[0])
7066 if (!strncmp (switches
[i
].args
[0], &atom
[1], len
- 1)
7067 && (starred
|| (switches
[i
].part1
[1] == '\0'
7068 && switches
[i
].args
[0][len
- 1] == '\0'))
7069 && check_live_switch (i
, (starred
? 1 : -1)))
7077 /* Inline subroutine of handle_braces. Mark all of the switches which
7078 match ATOM (extends to END_ATOM; STARRED indicates whether there
7079 was a star after the atom) for later processing. */
7081 mark_matching_switches (const char *atom
, const char *end_atom
, int starred
)
7084 int len
= end_atom
- atom
;
7085 int plen
= starred
? len
: -1;
7087 for (i
= 0; i
< n_switches
; i
++)
7088 if (!strncmp (switches
[i
].part1
, atom
, len
)
7089 && (starred
|| switches
[i
].part1
[len
] == '\0')
7090 && check_live_switch (i
, plen
))
7091 switches
[i
].ordering
= 1;
7094 /* Inline subroutine of handle_braces. Process all the currently
7095 marked switches through give_switch, and clear the marks. */
7097 process_marked_switches (void)
7101 for (i
= 0; i
< n_switches
; i
++)
7102 if (switches
[i
].ordering
== 1)
7104 switches
[i
].ordering
= 0;
7109 /* Handle a %{ ... } construct. P points just inside the leading {.
7110 Returns a pointer one past the end of the brace block, or 0
7111 if we call do_spec_1 and that returns -1. */
7114 handle_braces (const char *p
)
7116 const char *atom
, *end_atom
;
7117 const char *d_atom
= NULL
, *d_end_atom
= NULL
;
7118 char *esc_buf
= NULL
, *d_esc_buf
= NULL
;
7120 const char *orig
= p
;
7128 bool a_must_be_last
= false;
7129 bool ordered_set
= false;
7130 bool disjunct_set
= false;
7131 bool disj_matched
= false;
7132 bool disj_starred
= true;
7133 bool n_way_choice
= false;
7134 bool n_way_matched
= false;
7136 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7143 /* Scan one "atom" (S in the description above of %{}, possibly
7144 with '!', '.', '@', ',', or '*' modifiers). */
7146 a_is_suffix
= false;
7147 a_is_starred
= false;
7148 a_is_negated
= false;
7149 a_is_spectype
= false;
7153 p
++, a_is_negated
= true;
7156 if (*p
== '%' && p
[1] == ':')
7160 p
= handle_spec_function (p
+ 2, &a_matched
, NULL
);
7165 p
++, a_is_suffix
= true;
7167 p
++, a_is_spectype
= true;
7171 while (ISIDNUM (*p
) || *p
== '-' || *p
== '+' || *p
== '='
7172 || *p
== ',' || *p
== '.' || *p
== '@' || *p
== '\\')
7178 fatal_error (input_location
,
7179 "braced spec %qs ends in escape", orig
);
7191 if (esc_buf
&& esc_buf
!= d_esc_buf
)
7194 ep
= esc_buf
= (char *) xmalloc (end_atom
- atom
- esc
+ 1);
7195 for (ap
= atom
; ap
!= end_atom
; ap
++, ep
++)
7207 p
++, a_is_starred
= 1;
7214 /* Substitute the switch(es) indicated by the current atom. */
7216 if (disjunct_set
|| n_way_choice
|| a_is_negated
|| a_is_suffix
7217 || a_is_spectype
|| atom
== end_atom
)
7220 mark_matching_switches (atom
, end_atom
, a_is_starred
);
7223 process_marked_switches ();
7227 /* Substitute some text if the current atom appears as a switch
7229 disjunct_set
= true;
7233 if (atom
&& atom
== end_atom
)
7235 if (!n_way_choice
|| disj_matched
|| *p
== '|'
7236 || a_is_negated
|| a_is_suffix
|| a_is_spectype
7240 /* An empty term may appear as the last choice of an
7241 N-way choice set; it means "otherwise". */
7242 a_must_be_last
= true;
7243 disj_matched
= !n_way_matched
;
7244 disj_starred
= false;
7248 if ((a_is_suffix
|| a_is_spectype
) && a_is_starred
)
7252 disj_starred
= false;
7254 /* Don't bother testing this atom if we already have a
7256 if (!disj_matched
&& !n_way_matched
)
7259 /* a_matched is already set by handle_spec_function. */;
7260 else if (a_is_suffix
)
7261 a_matched
= input_suffix_matches (atom
, end_atom
);
7262 else if (a_is_spectype
)
7263 a_matched
= input_spec_matches (atom
, end_atom
);
7265 a_matched
= switch_matches (atom
, end_atom
, a_is_starred
);
7267 if (a_matched
!= a_is_negated
)
7269 disj_matched
= true;
7271 d_end_atom
= end_atom
;
7272 d_esc_buf
= esc_buf
;
7279 /* Found the body, that is, the text to substitute if the
7280 current disjunction matches. */
7281 p
= process_brace_body (p
+ 1, d_atom
, d_end_atom
, disj_starred
,
7282 disj_matched
&& !n_way_matched
);
7286 /* If we have an N-way choice, reset state for the next
7290 n_way_choice
= true;
7291 n_way_matched
|= disj_matched
;
7292 disj_matched
= false;
7293 disj_starred
= true;
7294 d_atom
= d_end_atom
= NULL
;
7303 while (*p
++ != '}');
7306 if (d_esc_buf
&& d_esc_buf
!= esc_buf
)
7314 fatal_error (input_location
, "braced spec %qs is invalid at %qc", orig
, *p
);
7319 /* Subroutine of handle_braces. Scan and process a brace substitution body
7320 (X in the description of %{} syntax). P points one past the colon;
7321 ATOM and END_ATOM bracket the first atom which was found to be true
7322 (present) in the current disjunction; STARRED indicates whether all
7323 the atoms in the current disjunction were starred (for syntax validation);
7324 MATCHED indicates whether the disjunction matched or not, and therefore
7325 whether or not the body is to be processed through do_spec_1 or just
7326 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
7330 process_brace_body (const char *p
, const char *atom
, const char *end_atom
,
7331 int starred
, int matched
)
7333 const char *body
, *end_body
;
7334 unsigned int nesting_level
;
7335 bool have_subst
= false;
7337 /* Locate the closing } or ;, honoring nested braces.
7338 Trim trailing whitespace. */
7347 if (!--nesting_level
)
7350 else if (*p
== ';' && nesting_level
== 1)
7352 else if (*p
== '%' && p
[1] == '*' && nesting_level
== 1)
7354 else if (*p
== '\0')
7360 while (end_body
[-1] == ' ' || end_body
[-1] == '\t')
7363 if (have_subst
&& !starred
)
7368 /* Copy the substitution body to permanent storage and execute it.
7369 If have_subst is false, this is a simple matter of running the
7370 body through do_spec_1... */
7371 char *string
= save_string (body
, end_body
- body
);
7374 if (do_spec_1 (string
, 0, NULL
) < 0)
7382 /* ... but if have_subst is true, we have to process the
7383 body once for each matching switch, with %* set to the
7384 variant part of the switch. */
7385 unsigned int hard_match_len
= end_atom
- atom
;
7388 for (i
= 0; i
< n_switches
; i
++)
7389 if (!strncmp (switches
[i
].part1
, atom
, hard_match_len
)
7390 && check_live_switch (i
, hard_match_len
))
7392 if (do_spec_1 (string
, 0,
7393 &switches
[i
].part1
[hard_match_len
]) < 0)
7398 /* Pass any arguments this switch has. */
7400 suffix_subst
= NULL
;
7409 fatal_error (input_location
, "braced spec body %qs is invalid", body
);
7412 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
7413 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
7414 spec, or -1 if either exact match or %* is used.
7416 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
7417 whose value does not begin with "no-" is obsoleted by the same value
7418 with the "no-", similarly for a switch with the "no-" prefix. */
7421 check_live_switch (int switchnum
, int prefix_length
)
7423 const char *name
= switches
[switchnum
].part1
;
7426 /* If we already processed this switch and determined if it was
7427 live or not, return our past determination. */
7428 if (switches
[switchnum
].live_cond
!= 0)
7429 return ((switches
[switchnum
].live_cond
& SWITCH_LIVE
) != 0
7430 && (switches
[switchnum
].live_cond
& SWITCH_FALSE
) == 0
7431 && (switches
[switchnum
].live_cond
& SWITCH_IGNORE_PERMANENTLY
)
7434 /* In the common case of {<at-most-one-letter>*}, a negating
7435 switch would always match, so ignore that case. We will just
7436 send the conflicting switches to the compiler phase. */
7437 if (prefix_length
>= 0 && prefix_length
<= 1)
7440 /* Now search for duplicate in a manner that depends on the name. */
7444 for (i
= switchnum
+ 1; i
< n_switches
; i
++)
7445 if (switches
[i
].part1
[0] == 'O')
7447 switches
[switchnum
].validated
= true;
7448 switches
[switchnum
].live_cond
= SWITCH_FALSE
;
7453 case 'W': case 'f': case 'm': case 'g':
7454 if (startswith (name
+ 1, "no-"))
7456 /* We have Xno-YYY, search for XYYY. */
7457 for (i
= switchnum
+ 1; i
< n_switches
; i
++)
7458 if (switches
[i
].part1
[0] == name
[0]
7459 && ! strcmp (&switches
[i
].part1
[1], &name
[4]))
7461 /* --specs are validated with the validate_switches mechanism. */
7462 if (switches
[switchnum
].known
)
7463 switches
[switchnum
].validated
= true;
7464 switches
[switchnum
].live_cond
= SWITCH_FALSE
;
7470 /* We have XYYY, search for Xno-YYY. */
7471 for (i
= switchnum
+ 1; i
< n_switches
; i
++)
7472 if (switches
[i
].part1
[0] == name
[0]
7473 && switches
[i
].part1
[1] == 'n'
7474 && switches
[i
].part1
[2] == 'o'
7475 && switches
[i
].part1
[3] == '-'
7476 && !strcmp (&switches
[i
].part1
[4], &name
[1]))
7478 /* --specs are validated with the validate_switches mechanism. */
7479 if (switches
[switchnum
].known
)
7480 switches
[switchnum
].validated
= true;
7481 switches
[switchnum
].live_cond
= SWITCH_FALSE
;
7488 /* Otherwise the switch is live. */
7489 switches
[switchnum
].live_cond
|= SWITCH_LIVE
;
7493 /* Pass a switch to the current accumulating command
7494 in the same form that we received it.
7495 SWITCHNUM identifies the switch; it is an index into
7496 the vector of switches gcc received, which is `switches'.
7497 This cannot fail since it never finishes a command line.
7499 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
7502 give_switch (int switchnum
, int omit_first_word
)
7504 if ((switches
[switchnum
].live_cond
& SWITCH_IGNORE
) != 0)
7507 if (!omit_first_word
)
7509 do_spec_1 ("-", 0, NULL
);
7510 do_spec_1 (switches
[switchnum
].part1
, 1, NULL
);
7513 if (switches
[switchnum
].args
!= 0)
7516 for (p
= switches
[switchnum
].args
; *p
; p
++)
7518 const char *arg
= *p
;
7520 do_spec_1 (" ", 0, NULL
);
7523 unsigned length
= strlen (arg
);
7526 while (length
-- && !IS_DIR_SEPARATOR (arg
[length
]))
7527 if (arg
[length
] == '.')
7529 (CONST_CAST (char *, arg
))[length
] = 0;
7533 do_spec_1 (arg
, 1, NULL
);
7535 (CONST_CAST (char *, arg
))[length
] = '.';
7536 do_spec_1 (suffix_subst
, 1, NULL
);
7539 do_spec_1 (arg
, 1, NULL
);
7543 do_spec_1 (" ", 0, NULL
);
7544 switches
[switchnum
].validated
= true;
7547 /* Print GCC configuration (e.g. version, thread model, target,
7548 configuration_arguments) to a given FILE. */
7551 print_configuration (FILE *file
)
7556 fnotice (file
, "Target: %s\n", spec_machine
);
7557 fnotice (file
, "Configured with: %s\n", configuration_arguments
);
7559 #ifdef THREAD_MODEL_SPEC
7560 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7561 but there's no point in doing all this processing just to get
7562 thread_model back. */
7563 obstack_init (&obstack
);
7564 do_spec_1 (THREAD_MODEL_SPEC
, 0, thread_model
);
7565 obstack_1grow (&obstack
, '\0');
7566 thrmod
= XOBFINISH (&obstack
, const char *);
7568 thrmod
= thread_model
;
7571 fnotice (file
, "Thread model: %s\n", thrmod
);
7572 fnotice (file
, "Supported LTO compression algorithms: zlib");
7574 fnotice (file
, " zstd");
7576 fnotice (file
, "\n");
7578 /* compiler_version is truncated at the first space when initialized
7579 from version string, so truncate version_string at the first space
7580 before comparing. */
7581 for (n
= 0; version_string
[n
]; n
++)
7582 if (version_string
[n
] == ' ')
7585 if (! strncmp (version_string
, compiler_version
, n
)
7586 && compiler_version
[n
] == 0)
7587 fnotice (file
, "gcc version %s %s\n", version_string
,
7590 fnotice (file
, "gcc driver version %s %sexecuting gcc version %s\n",
7591 version_string
, pkgversion_string
, compiler_version
);
7595 #define RETRY_ICE_ATTEMPTS 3
7597 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
7600 files_equal_p (char *file1
, char *file2
)
7602 struct stat st1
, st2
;
7605 const int bufsize
= 8192;
7606 char *buf
= XNEWVEC (char, bufsize
);
7608 fd1
= open (file1
, O_RDONLY
);
7609 fd2
= open (file2
, O_RDONLY
);
7611 if (fd1
< 0 || fd2
< 0)
7614 if (fstat (fd1
, &st1
) < 0 || fstat (fd2
, &st2
) < 0)
7617 if (st1
.st_size
!= st2
.st_size
)
7620 for (n
= st1
.st_size
; n
; n
-= len
)
7623 if ((int) len
> bufsize
/ 2)
7626 if (read (fd1
, buf
, len
) != (int) len
7627 || read (fd2
, buf
+ bufsize
/ 2, len
) != (int) len
)
7632 if (memcmp (buf
, buf
+ bufsize
/ 2, len
) != 0)
7649 /* Check that compiler's output doesn't differ across runs.
7650 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
7651 stdout and stderr for each compiler run. Return true if all of
7652 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
7655 check_repro (char **temp_stdout_files
, char **temp_stderr_files
)
7658 for (i
= 0; i
< RETRY_ICE_ATTEMPTS
- 2; ++i
)
7660 if (!files_equal_p (temp_stdout_files
[i
], temp_stdout_files
[i
+ 1])
7661 || !files_equal_p (temp_stderr_files
[i
], temp_stderr_files
[i
+ 1]))
7663 fnotice (stderr
, "The bug is not reproducible, so it is"
7664 " likely a hardware or OS problem.\n");
7668 return i
== RETRY_ICE_ATTEMPTS
- 2;
7671 enum attempt_status
{
7672 ATTEMPT_STATUS_FAIL_TO_RUN
,
7673 ATTEMPT_STATUS_SUCCESS
,
7678 /* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
7679 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
7680 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
7681 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
7682 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
7683 ATTEMPT_STATUS_SUCCESS otherwise. */
7685 static enum attempt_status
7686 run_attempt (const char **new_argv
, const char *out_temp
,
7687 const char *err_temp
, int emit_system_info
, int append
)
7690 if (emit_system_info
)
7692 FILE *file_out
= fopen (err_temp
, "a");
7693 print_configuration (file_out
);
7694 fputs ("\n", file_out
);
7700 struct pex_obj
*pex
;
7702 int pex_flags
= PEX_USE_PIPES
| PEX_LAST
;
7703 enum attempt_status status
= ATTEMPT_STATUS_FAIL_TO_RUN
;
7706 pex_flags
|= PEX_STDOUT_APPEND
| PEX_STDERR_APPEND
;
7708 pex
= pex_init (PEX_USE_PIPES
, new_argv
[0], NULL
);
7710 fatal_error (input_location
, "%<pex_init%> failed: %m");
7712 errmsg
= pex_run (pex
, pex_flags
, new_argv
[0],
7713 CONST_CAST2 (char *const *, const char **, &new_argv
[1]),
7714 out_temp
, err_temp
, &err
);
7718 fatal_error (input_location
,
7719 err
? G_ ("cannot execute %qs: %s: %m")
7720 : G_ ("cannot execute %qs: %s"),
7721 new_argv
[0], errmsg
);
7724 if (!pex_get_status (pex
, 1, &exit_status
))
7727 switch (WEXITSTATUS (exit_status
))
7730 status
= ATTEMPT_STATUS_ICE
;
7733 case SUCCESS_EXIT_CODE
:
7734 status
= ATTEMPT_STATUS_SUCCESS
;
7746 /* This routine reads lines from IN file, adds C++ style comments
7747 at the begining of each line and writes result into OUT. */
7750 insert_comments (const char *file_in
, const char *file_out
)
7752 FILE *in
= fopen (file_in
, "rb");
7753 FILE *out
= fopen (file_out
, "wb");
7756 bool add_comment
= true;
7757 while (fgets (line
, sizeof (line
), in
))
7762 add_comment
= strchr (line
, '\n') != NULL
;
7769 /* This routine adds preprocessed source code into the given ERR_FILE.
7770 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
7771 add information in report file. RUN_ATTEMPT should return
7772 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
7775 do_report_bug (const char **new_argv
, const int nargs
,
7776 char **out_file
, char **err_file
)
7780 int fd
= open (*out_file
, O_RDWR
| O_APPEND
);
7783 ret
= write (fd
, "\n//", 3);
7784 for (i
= 0; i
< nargs
; i
++)
7786 ret
= write (fd
, " ", 1);
7787 ret
= write (fd
, new_argv
[i
], strlen (new_argv
[i
]));
7789 ret
= write (fd
, "\n\n", 2);
7792 new_argv
[nargs
] = "-E";
7793 new_argv
[nargs
+ 1] = NULL
;
7795 status
= run_attempt (new_argv
, *out_file
, *err_file
, 0, 1);
7797 if (status
== ATTEMPT_STATUS_SUCCESS
)
7799 fnotice (stderr
, "Preprocessed source stored into %s file,"
7800 " please attach this to your bugreport.\n", *out_file
);
7801 /* Make sure it is not deleted. */
7807 /* Try to reproduce ICE. If bug is reproducible, generate report .err file
7808 containing GCC configuration, backtrace, compiler's command line options
7809 and preprocessed source code. */
7812 try_generate_repro (const char **argv
)
7814 int i
, nargs
, out_arg
= -1, quiet
= 0, attempt
;
7815 const char **new_argv
;
7816 char *temp_files
[RETRY_ICE_ATTEMPTS
* 2];
7817 char **temp_stdout_files
= &temp_files
[0];
7818 char **temp_stderr_files
= &temp_files
[RETRY_ICE_ATTEMPTS
];
7820 if (gcc_input_filename
== NULL
|| ! strcmp (gcc_input_filename
, "-"))
7823 for (nargs
= 0; argv
[nargs
] != NULL
; ++nargs
)
7824 /* Only retry compiler ICEs, not preprocessor ones. */
7825 if (! strcmp (argv
[nargs
], "-E"))
7827 else if (argv
[nargs
][0] == '-' && argv
[nargs
][1] == 'o')
7834 /* If the compiler is going to output any time information,
7835 it might varry between invocations. */
7836 else if (! strcmp (argv
[nargs
], "-quiet"))
7838 else if (! strcmp (argv
[nargs
], "-ftime-report"))
7841 if (out_arg
== -1 || !quiet
)
7844 memset (temp_files
, '\0', sizeof (temp_files
));
7845 new_argv
= XALLOCAVEC (const char *, nargs
+ 4);
7846 memcpy (new_argv
, argv
, (nargs
+ 1) * sizeof (const char *));
7847 new_argv
[nargs
++] = "-frandom-seed=0";
7848 new_argv
[nargs
++] = "-fdump-noaddr";
7849 new_argv
[nargs
] = NULL
;
7850 if (new_argv
[out_arg
][2] == '\0')
7851 new_argv
[out_arg
+ 1] = "-";
7853 new_argv
[out_arg
] = "-o-";
7856 for (attempt
= 0; attempt
< RETRY_ICE_ATTEMPTS
; ++attempt
)
7858 int emit_system_info
= 0;
7860 temp_stdout_files
[attempt
] = make_temp_file (".out");
7861 temp_stderr_files
[attempt
] = make_temp_file (".err");
7863 if (attempt
== RETRY_ICE_ATTEMPTS
- 1)
7866 emit_system_info
= 1;
7869 status
= run_attempt (new_argv
, temp_stdout_files
[attempt
],
7870 temp_stderr_files
[attempt
], emit_system_info
,
7873 if (status
!= ATTEMPT_STATUS_ICE
)
7875 fnotice (stderr
, "The bug is not reproducible, so it is"
7876 " likely a hardware or OS problem.\n");
7881 if (!check_repro (temp_stdout_files
, temp_stderr_files
))
7885 /* Insert commented out backtrace into report file. */
7886 char **stderr_commented
= &temp_stdout_files
[RETRY_ICE_ATTEMPTS
- 1];
7887 insert_comments (temp_stderr_files
[RETRY_ICE_ATTEMPTS
- 1],
7890 /* In final attempt we append compiler options and preprocesssed code to last
7891 generated .out file with configuration and backtrace. */
7892 char **err
= &temp_stderr_files
[RETRY_ICE_ATTEMPTS
- 1];
7893 do_report_bug (new_argv
, nargs
, stderr_commented
, err
);
7897 for (i
= 0; i
< RETRY_ICE_ATTEMPTS
* 2; i
++)
7900 unlink (temp_stdout_files
[i
]);
7901 free (temp_stdout_files
[i
]);
7905 /* Search for a file named NAME trying various prefixes including the
7906 user's -B prefix and some standard ones.
7907 Return the absolute file name found. If nothing is found, return NAME. */
7910 find_file (const char *name
)
7912 char *newname
= find_a_file (&startfile_prefixes
, name
, R_OK
, true);
7913 return newname
? newname
: name
;
7916 /* Determine whether a directory exists. If LINKER, return 0 for
7917 certain fixed names not needed by the linker. */
7920 is_directory (const char *path1
, bool linker
)
7927 /* Ensure the string ends with "/.". The resulting path will be a
7928 directory even if the given path is a symbolic link. */
7929 len1
= strlen (path1
);
7930 path
= (char *) alloca (3 + len1
);
7931 memcpy (path
, path1
, len1
);
7933 if (!IS_DIR_SEPARATOR (cp
[-1]))
7934 *cp
++ = DIR_SEPARATOR
;
7938 /* Exclude directories that the linker is known to search. */
7940 && IS_DIR_SEPARATOR (path
[0])
7942 && filename_ncmp (path
+ 1, "lib", 3) == 0)
7944 && filename_ncmp (path
+ 1, "usr", 3) == 0
7945 && IS_DIR_SEPARATOR (path
[4])
7946 && filename_ncmp (path
+ 5, "lib", 3) == 0)))
7949 return (stat (path
, &st
) >= 0 && S_ISDIR (st
.st_mode
));
7952 /* Set up the various global variables to indicate that we're processing
7953 the input file named FILENAME. */
7956 set_input (const char *filename
)
7960 gcc_input_filename
= filename
;
7961 input_filename_length
= strlen (gcc_input_filename
);
7962 input_basename
= lbasename (gcc_input_filename
);
7964 /* Find a suffix starting with the last period,
7965 and set basename_length to exclude that suffix. */
7966 basename_length
= strlen (input_basename
);
7967 suffixed_basename_length
= basename_length
;
7968 p
= input_basename
+ basename_length
;
7969 while (p
!= input_basename
&& *p
!= '.')
7971 if (*p
== '.' && p
!= input_basename
)
7973 basename_length
= p
- input_basename
;
7974 input_suffix
= p
+ 1;
7979 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
7980 we will need to do a stat on the gcc_input_filename. The
7981 INPUT_STAT_SET signals that the stat is needed. */
7985 /* On fatal signals, delete all the temporary files. */
7988 fatal_signal (int signum
)
7990 signal (signum
, SIG_DFL
);
7991 delete_failure_queue ();
7992 delete_temp_files ();
7993 /* Get the same signal again, this time not handled,
7994 so its normal effect occurs. */
7995 kill (getpid (), signum
);
7998 /* Compare the contents of the two files named CMPFILE[0] and
7999 CMPFILE[1]. Return zero if they're identical, nonzero
8003 compare_files (char *cmpfile
[])
8006 FILE *temp
[2] = { NULL
, NULL
};
8012 void *map
[2] = { NULL
, NULL
};
8014 for (i
= 0; i
< 2; i
++)
8018 if (stat (cmpfile
[i
], &st
) < 0 || !S_ISREG (st
.st_mode
))
8020 error ("%s: could not determine length of compare-debug file %s",
8021 gcc_input_filename
, cmpfile
[i
]);
8026 length
[i
] = st
.st_size
;
8029 if (!ret
&& length
[0] != length
[1])
8031 error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename
);
8036 for (i
= 0; i
< 2; i
++)
8038 int fd
= open (cmpfile
[i
], O_RDONLY
);
8041 error ("%s: could not open compare-debug file %s",
8042 gcc_input_filename
, cmpfile
[i
]);
8047 map
[i
] = mmap (NULL
, length
[i
], PROT_READ
, MAP_PRIVATE
, fd
, 0);
8050 if (map
[i
] == (void *) MAP_FAILED
)
8059 if (memcmp (map
[0], map
[1], length
[0]) != 0)
8061 error ("%s: %<-fcompare-debug%> failure", gcc_input_filename
);
8066 for (i
= 0; i
< 2; i
++)
8068 munmap ((caddr_t
) map
[i
], length
[i
]);
8077 for (i
= 0; i
< 2; i
++)
8079 temp
[i
] = fopen (cmpfile
[i
], "r");
8082 error ("%s: could not open compare-debug file %s",
8083 gcc_input_filename
, cmpfile
[i
]);
8089 if (!ret
&& temp
[0] && temp
[1])
8093 c0
= fgetc (temp
[0]);
8094 c1
= fgetc (temp
[1]);
8098 error ("%s: %<-fcompare-debug%> failure",
8099 gcc_input_filename
);
8108 for (i
= 1; i
>= 0; i
--)
8117 driver::driver (bool can_finalize
, bool debug
) :
8118 explicit_link_files (NULL
),
8119 decoded_options (NULL
)
8121 env
.init (can_finalize
, debug
);
8126 XDELETEVEC (explicit_link_files
);
8127 XDELETEVEC (decoded_options
);
8130 /* driver::main is implemented as a series of driver:: method calls. */
8133 driver::main (int argc
, char **argv
)
8137 set_progname (argv
[0]);
8138 expand_at_files (&argc
, &argv
);
8139 decode_argv (argc
, const_cast <const char **> (argv
));
8140 global_initializations ();
8141 build_multilib_strings ();
8143 putenv_COLLECT_AS_OPTIONS (assembler_options
);
8144 putenv_COLLECT_GCC (argv
[0]);
8145 maybe_putenv_COLLECT_LTO_WRAPPER ();
8146 maybe_putenv_OFFLOAD_TARGETS ();
8147 handle_unrecognized_options ();
8151 // sdcpp m_option_proposer.suggest_completion (completion);
8155 if (!maybe_print_and_exit ())
8158 early_exit
= prepare_infiles ();
8160 return get_exit_code ();
8162 do_spec_on_infiles ();
8163 maybe_run_linker (argv
[0]);
8165 return get_exit_code ();
8168 /* Locate the final component of argv[0] after any leading path, and set
8169 the program name accordingly. */
8172 driver::set_progname (const char *argv0
) const
8174 const char *p
= argv0
+ strlen (argv0
);
8175 while (p
!= argv0
&& !IS_DIR_SEPARATOR (p
[-1]))
8179 xmalloc_set_program_name (progname
);
8182 /* Expand any @ files within the command-line args,
8183 setting at_file_supplied if any were expanded. */
8186 driver::expand_at_files (int *argc
, char ***argv
) const
8188 char **old_argv
= *argv
;
8190 expandargv (argc
, argv
);
8192 /* Determine if any expansions were made. */
8193 if (*argv
!= old_argv
)
8194 at_file_supplied
= true;
8197 /* Decode the command-line arguments from argc/argv into the
8198 decoded_options array. */
8201 driver::decode_argv (int argc
, const char **argv
)
8203 init_opts_obstack ();
8204 init_options_struct (&global_options
, &global_options_set
);
8206 decode_cmdline_options_to_array (argc
, argv
,
8208 &decoded_options
, &decoded_options_count
);
8211 /* Perform various initializations and setup. */
8214 driver::global_initializations ()
8216 /* Unlock the stdio streams. */
8217 unlock_std_streams ();
8219 gcc_init_libintl ();
8221 diagnostic_initialize (global_dc
, 0);
8222 diagnostic_color_init (global_dc
);
8223 diagnostic_urls_init (global_dc
);
8225 #ifdef GCC_DRIVER_HOST_INITIALIZATION
8226 /* Perform host dependent initialization when needed. */
8227 GCC_DRIVER_HOST_INITIALIZATION
;
8230 if (atexit (delete_temp_files
) != 0)
8231 fatal_error (input_location
, "atexit failed");
8233 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
8234 signal (SIGINT
, fatal_signal
);
8236 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
8237 signal (SIGHUP
, fatal_signal
);
8239 if (signal (SIGTERM
, SIG_IGN
) != SIG_IGN
)
8240 signal (SIGTERM
, fatal_signal
);
8242 if (signal (SIGPIPE
, SIG_IGN
) != SIG_IGN
)
8243 signal (SIGPIPE
, fatal_signal
);
8246 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
8247 receive the signal. A different setting is inheritable */
8248 signal (SIGCHLD
, SIG_DFL
);
8251 /* Parsing and gimplification sometimes need quite large stack.
8252 Increase stack size limits if possible. */
8253 stack_limit_increase (64 * 1024 * 1024);
8255 /* Allocate the argument vector. */
8258 obstack_init (&obstack
);
8261 /* Build multilib_select, et. al from the separate lines that make up each
8262 multilib selection. */
8265 driver::build_multilib_strings () const
8269 const char *const *q
= multilib_raw
;
8272 obstack_init (&multilib_obstack
);
8273 while ((p
= *q
++) != (char *) 0)
8274 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8276 obstack_1grow (&multilib_obstack
, 0);
8277 multilib_select
= XOBFINISH (&multilib_obstack
, const char *);
8279 q
= multilib_matches_raw
;
8280 while ((p
= *q
++) != (char *) 0)
8281 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8283 obstack_1grow (&multilib_obstack
, 0);
8284 multilib_matches
= XOBFINISH (&multilib_obstack
, const char *);
8286 q
= multilib_exclusions_raw
;
8287 while ((p
= *q
++) != (char *) 0)
8288 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8290 obstack_1grow (&multilib_obstack
, 0);
8291 multilib_exclusions
= XOBFINISH (&multilib_obstack
, const char *);
8293 q
= multilib_reuse_raw
;
8294 while ((p
= *q
++) != (char *) 0)
8295 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8297 obstack_1grow (&multilib_obstack
, 0);
8298 multilib_reuse
= XOBFINISH (&multilib_obstack
, const char *);
8301 for (size_t i
= 0; i
< ARRAY_SIZE (multilib_defaults_raw
); i
++)
8304 obstack_1grow (&multilib_obstack
, ' ');
8305 obstack_grow (&multilib_obstack
,
8306 multilib_defaults_raw
[i
],
8307 strlen (multilib_defaults_raw
[i
]));
8311 obstack_1grow (&multilib_obstack
, 0);
8312 multilib_defaults
= XOBFINISH (&multilib_obstack
, const char *);
8316 /* Set up the spec-handling machinery. */
8319 driver::set_up_specs () const
8321 const char *spec_machine_suffix
;
8325 #ifdef INIT_ENVIRONMENT
8326 /* Set up any other necessary machine specific environment variables. */
8327 xputenv (INIT_ENVIRONMENT
);
8330 /* Make a table of what switches there are (switches, n_switches).
8331 Make a table of specified input files (infiles, n_infiles).
8332 Decode switches that are handled locally. */
8334 process_command (decoded_options_count
, decoded_options
);
8336 /* Initialize the vector of specs to just the default.
8337 This means one element containing 0s, as a terminator. */
8339 compilers
= XNEWVAR (struct compiler
, sizeof default_compilers
);
8340 memcpy (compilers
, default_compilers
, sizeof default_compilers
);
8341 n_compilers
= n_default_compilers
;
8343 /* Read specs from a file if there is one. */
8345 machine_suffix
= concat (spec_host_machine
, dir_separator_str
, spec_version
,
8346 accel_dir_suffix
, dir_separator_str
, NULL
);
8347 just_machine_suffix
= concat (spec_machine
, dir_separator_str
, NULL
);
8349 specs_file
= find_a_file (&startfile_prefixes
, "specs", R_OK
, true);
8350 /* Read the specs file unless it is a default one. */
8351 if (specs_file
!= 0 && strcmp (specs_file
, "specs"))
8352 read_specs (specs_file
, true, false);
8356 #ifdef ACCEL_COMPILER
8357 spec_machine_suffix
= machine_suffix
;
8359 spec_machine_suffix
= just_machine_suffix
;
8362 /* We need to check standard_exec_prefix/spec_machine_suffix/specs
8363 for any override of as, ld and libraries. */
8364 specs_file
= (char *) alloca (strlen (standard_exec_prefix
)
8365 + strlen (spec_machine_suffix
) + sizeof ("specs"));
8366 strcpy (specs_file
, standard_exec_prefix
);
8367 strcat (specs_file
, spec_machine_suffix
);
8368 strcat (specs_file
, "specs");
8369 if (access (specs_file
, R_OK
) == 0)
8370 read_specs (specs_file
, true, false);
8372 /* Process any configure-time defaults specified for the command line
8373 options, via OPTION_DEFAULT_SPECS. */
8374 for (i
= 0; i
< ARRAY_SIZE (option_default_specs
); i
++)
8375 do_option_spec (option_default_specs
[i
].name
,
8376 option_default_specs
[i
].spec
);
8378 /* Process DRIVER_SELF_SPECS, adding any new options to the end
8379 of the command line. */
8381 for (i
= 0; i
< ARRAY_SIZE (driver_self_specs
); i
++)
8382 do_self_spec (driver_self_specs
[i
]);
8384 /* If not cross-compiling, look for executables in the standard
8386 if (*cross_compile
== '0')
8388 if (*md_exec_prefix
)
8390 add_prefix (&exec_prefixes
, md_exec_prefix
, "GCC",
8391 PREFIX_PRIORITY_LAST
, 0, 0);
8395 /* Process sysroot_suffix_spec. */
8396 if (*sysroot_suffix_spec
!= 0
8397 && !no_sysroot_suffix
8398 && do_spec_2 (sysroot_suffix_spec
, NULL
) == 0)
8400 if (argbuf
.length () > 1)
8401 error ("spec failure: more than one argument to "
8402 "%<SYSROOT_SUFFIX_SPEC%>");
8403 else if (argbuf
.length () == 1)
8404 target_sysroot_suffix
= xstrdup (argbuf
.last ());
8407 #ifdef HAVE_LD_SYSROOT
8408 /* Pass the --sysroot option to the linker, if it supports that. If
8409 there is a sysroot_suffix_spec, it has already been processed by
8410 this point, so target_system_root really is the system root we
8412 if (target_system_root
)
8414 obstack_grow (&obstack
, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
8415 obstack_grow0 (&obstack
, link_spec
, strlen (link_spec
));
8416 set_spec ("link", XOBFINISH (&obstack
, const char *), false);
8420 /* Process sysroot_hdrs_suffix_spec. */
8421 if (*sysroot_hdrs_suffix_spec
!= 0
8422 && !no_sysroot_suffix
8423 && do_spec_2 (sysroot_hdrs_suffix_spec
, NULL
) == 0)
8425 if (argbuf
.length () > 1)
8426 error ("spec failure: more than one argument "
8427 "to %<SYSROOT_HEADERS_SUFFIX_SPEC%>");
8428 else if (argbuf
.length () == 1)
8429 target_sysroot_hdrs_suffix
= xstrdup (argbuf
.last ());
8432 /* Look for startfiles in the standard places. */
8433 if (*startfile_prefix_spec
!= 0
8434 && do_spec_2 (startfile_prefix_spec
, NULL
) == 0
8435 && do_spec_1 (" ", 0, NULL
) == 0)
8437 for (const char *arg
: argbuf
)
8438 add_sysrooted_prefix (&startfile_prefixes
, arg
, "BINUTILS",
8439 PREFIX_PRIORITY_LAST
, 0, 1);
8441 /* We should eventually get rid of all these and stick to
8442 startfile_prefix_spec exclusively. */
8443 else if (*cross_compile
== '0' || target_system_root
)
8445 if (*md_startfile_prefix
)
8446 add_sysrooted_prefix (&startfile_prefixes
, md_startfile_prefix
,
8447 "GCC", PREFIX_PRIORITY_LAST
, 0, 1);
8449 if (*md_startfile_prefix_1
)
8450 add_sysrooted_prefix (&startfile_prefixes
, md_startfile_prefix_1
,
8451 "GCC", PREFIX_PRIORITY_LAST
, 0, 1);
8453 /* If standard_startfile_prefix is relative, base it on
8454 standard_exec_prefix. This lets us move the installed tree
8455 as a unit. If GCC_EXEC_PREFIX is defined, base
8456 standard_startfile_prefix on that as well.
8458 If the prefix is relative, only search it for native compilers;
8459 otherwise we will search a directory containing host libraries. */
8460 if (IS_ABSOLUTE_PATH (standard_startfile_prefix
))
8461 add_sysrooted_prefix (&startfile_prefixes
,
8462 standard_startfile_prefix
, "BINUTILS",
8463 PREFIX_PRIORITY_LAST
, 0, 1);
8464 else if (*cross_compile
== '0')
8466 add_prefix (&startfile_prefixes
,
8467 concat (gcc_exec_prefix
8468 ? gcc_exec_prefix
: standard_exec_prefix
,
8470 standard_startfile_prefix
, NULL
),
8471 NULL
, PREFIX_PRIORITY_LAST
, 0, 1);
8474 /* Sysrooted prefixes are relocated because target_system_root is
8475 also relocated by gcc_exec_prefix. */
8476 if (*standard_startfile_prefix_1
)
8477 add_sysrooted_prefix (&startfile_prefixes
,
8478 standard_startfile_prefix_1
, "BINUTILS",
8479 PREFIX_PRIORITY_LAST
, 0, 1);
8480 if (*standard_startfile_prefix_2
)
8481 add_sysrooted_prefix (&startfile_prefixes
,
8482 standard_startfile_prefix_2
, "BINUTILS",
8483 PREFIX_PRIORITY_LAST
, 0, 1);
8486 /* Process any user specified specs in the order given on the command
8488 for (struct user_specs
*uptr
= user_specs_head
; uptr
; uptr
= uptr
->next
)
8490 char *filename
= find_a_file (&startfile_prefixes
, uptr
->filename
,
8492 read_specs (filename
? filename
: uptr
->filename
, false, true);
8495 /* Process any user self specs. */
8497 struct spec_list
*sl
;
8498 for (sl
= specs
; sl
; sl
= sl
->next
)
8499 if (sl
->name_len
== sizeof "self_spec" - 1
8500 && !strcmp (sl
->name
, "self_spec"))
8501 do_self_spec (*sl
->ptr_spec
);
8506 enum save_temps save
;
8508 if (!compare_debug_second
)
8510 n_switches_debug_check
[1] = n_switches
;
8511 n_switches_alloc_debug_check
[1] = n_switches_alloc
;
8512 switches_debug_check
[1] = XDUPVEC (struct switchstr
, switches
,
8515 do_self_spec ("%:compare-debug-self-opt()");
8516 n_switches_debug_check
[0] = n_switches
;
8517 n_switches_alloc_debug_check
[0] = n_switches_alloc
;
8518 switches_debug_check
[0] = switches
;
8520 n_switches
= n_switches_debug_check
[1];
8521 n_switches_alloc
= n_switches_alloc_debug_check
[1];
8522 switches
= switches_debug_check
[1];
8525 /* Avoid crash when computing %j in this early. */
8526 save
= save_temps_flag
;
8527 save_temps_flag
= SAVE_TEMPS_NONE
;
8529 compare_debug
= -compare_debug
;
8530 do_self_spec ("%:compare-debug-self-opt()");
8532 save_temps_flag
= save
;
8534 if (!compare_debug_second
)
8536 n_switches_debug_check
[1] = n_switches
;
8537 n_switches_alloc_debug_check
[1] = n_switches_alloc
;
8538 switches_debug_check
[1] = switches
;
8539 compare_debug
= -compare_debug
;
8540 n_switches
= n_switches_debug_check
[0];
8541 n_switches_alloc
= n_switches_debug_check
[0];
8542 switches
= switches_debug_check
[0];
8547 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
8548 if (gcc_exec_prefix
)
8549 gcc_exec_prefix
= concat (gcc_exec_prefix
, spec_host_machine
,
8550 dir_separator_str
, spec_version
,
8551 accel_dir_suffix
, dir_separator_str
, NULL
);
8553 /* Now we have the specs.
8554 Set the `valid' bits for switches that match anything in any spec. */
8556 validate_all_switches ();
8558 /* Now that we have the switches and the specs, set
8559 the subdirectory based on the options. */
8560 set_multilib_dir ();
8563 /* Set up to remember the pathname of gcc and any options
8564 needed for collect. We use argv[0] instead of progname because
8565 we need the complete pathname. */
8568 driver::putenv_COLLECT_GCC (const char *argv0
) const
8570 obstack_init (&collect_obstack
);
8571 obstack_grow (&collect_obstack
, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
8572 obstack_grow (&collect_obstack
, argv0
, strlen (argv0
) + 1);
8573 xputenv (XOBFINISH (&collect_obstack
, char *));
8576 /* Set up to remember the pathname of the lto wrapper. */
8579 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
8581 char *lto_wrapper_file
;
8584 lto_wrapper_file
= NULL
;
8586 lto_wrapper_file
= find_a_program ("lto-wrapper");
8587 if (lto_wrapper_file
)
8589 lto_wrapper_file
= convert_white_space (lto_wrapper_file
);
8590 set_static_spec_owned (<o_wrapper_spec
, lto_wrapper_file
);
8591 obstack_init (&collect_obstack
);
8592 obstack_grow (&collect_obstack
, "COLLECT_LTO_WRAPPER=",
8593 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
8594 obstack_grow (&collect_obstack
, lto_wrapper_spec
,
8595 strlen (lto_wrapper_spec
) + 1);
8596 xputenv (XOBFINISH (&collect_obstack
, char *));
8601 /* Set up to remember the names of offload targets. */
8604 driver::maybe_putenv_OFFLOAD_TARGETS () const
8606 if (offload_targets
&& offload_targets
[0] != '\0')
8608 obstack_grow (&collect_obstack
, "OFFLOAD_TARGET_NAMES=",
8609 sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
8610 obstack_grow (&collect_obstack
, offload_targets
,
8611 strlen (offload_targets
) + 1);
8612 xputenv (XOBFINISH (&collect_obstack
, char *));
8613 #if OFFLOAD_DEFAULTED
8614 if (offload_targets_default
)
8615 xputenv ("OFFLOAD_TARGET_DEFAULT=1");
8619 free (offload_targets
);
8620 offload_targets
= NULL
;
8623 /* Reject switches that no pass was interested in. */
8626 driver::handle_unrecognized_options ()
8628 for (size_t i
= 0; (int) i
< n_switches
; i
++)
8629 if (! switches
[i
].validated
)
8631 const char *hint
= 0; // sdcpp m_option_proposer.suggest_option (switches[i].part1);
8633 error ("bbunrecognized command-line option %<-%s%>;"
8634 " did you mean %<-%s%>?",
8635 switches
[i
].part1
, hint
);
8637 error ("ccunrecognized command-line option %<-%s%>",
8645 /* Handle the various -print-* options, returning 0 if the driver
8646 should exit, or nonzero if the driver should continue. */
8649 driver::maybe_print_and_exit () const
8651 if (print_search_dirs
)
8653 printf (_("install: %s%s\n"),
8654 gcc_exec_prefix
? gcc_exec_prefix
: standard_exec_prefix
,
8655 gcc_exec_prefix
? "" : machine_suffix
);
8656 printf (_("programs: %s\n"),
8657 build_search_list (&exec_prefixes
, "", false, false));
8658 printf (_("libraries: %s\n"),
8659 build_search_list (&startfile_prefixes
, "", false, true));
8663 if (print_file_name
)
8665 printf ("%s\n", find_file (print_file_name
));
8669 if (print_prog_name
)
8671 if (use_ld
!= NULL
&& ! strcmp (print_prog_name
, "ld"))
8673 /* Append USE_LD to the default linker. */
8674 #ifdef DEFAULT_LINKER
8676 # ifdef HAVE_HOST_EXECUTABLE_SUFFIX
8677 int len
= (sizeof (DEFAULT_LINKER
)
8678 - sizeof (HOST_EXECUTABLE_SUFFIX
));
8682 char *default_linker
= xstrdup (DEFAULT_LINKER
);
8683 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
8684 HOST_EXECUTABLE_SUFFIX. */
8685 if (! strcmp (&default_linker
[len
], HOST_EXECUTABLE_SUFFIX
))
8687 default_linker
[len
] = '\0';
8688 ld
= concat (default_linker
, use_ld
,
8689 HOST_EXECUTABLE_SUFFIX
, NULL
);
8694 ld
= concat (DEFAULT_LINKER
, use_ld
, NULL
);
8695 if (access (ld
, X_OK
) == 0)
8697 printf ("%s\n", ld
);
8701 print_prog_name
= concat (print_prog_name
, use_ld
, NULL
);
8703 char *newname
= find_a_program (print_prog_name
);
8704 printf ("%s\n", (newname
? newname
: print_prog_name
));
8708 if (print_multi_lib
)
8710 print_multilib_info ();
8714 if (print_multi_directory
)
8716 if (multilib_dir
== NULL
)
8719 printf ("%s\n", multilib_dir
);
8723 if (print_multiarch
)
8725 if (multiarch_dir
== NULL
)
8728 printf ("%s\n", multiarch_dir
);
8734 if (target_system_root
)
8736 if (target_sysroot_suffix
)
8737 printf ("%s%s\n", target_system_root
, target_sysroot_suffix
);
8739 printf ("%s\n", target_system_root
);
8744 if (print_multi_os_directory
)
8746 if (multilib_os_dir
== NULL
)
8749 printf ("%s\n", multilib_os_dir
);
8753 if (print_sysroot_headers_suffix
)
8755 if (*sysroot_hdrs_suffix_spec
)
8757 printf("%s\n", (target_sysroot_hdrs_suffix
8758 ? target_sysroot_hdrs_suffix
8763 /* The error status indicates that only one set of fixed
8764 headers should be built. */
8765 fatal_error (input_location
,
8766 "not configured with sysroot headers suffix");
8769 if (print_help_list
)
8775 printf (_("\nFor bug reporting instructions, please see:\n"));
8776 printf ("%s.\n", bug_report_url
);
8781 /* We do not exit here. Instead we have created a fake input file
8782 called 'help-dummy' which needs to be compiled, and we pass this
8783 on the various sub-processes, along with the --help switch.
8784 Ensure their output appears after ours. */
8785 fputc ('\n', stdout
);
8791 printf (_("%s %s%s\n"), progname
, pkgversion_string
,
8793 printf ("Copyright %s 2022 Free Software Foundation, Inc.\n",
8795 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
8796 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
8801 /* We do not exit here. We use the same mechanism of --help to print
8802 the version of the sub-processes. */
8803 fputc ('\n', stdout
);
8809 print_configuration (stderr
);
8817 /* Figure out what to do with each input file.
8818 Return true if we need to exit early from "main", false otherwise. */
8821 driver::prepare_infiles ()
8824 int lang_n_infiles
= 0;
8826 if (n_infiles
== added_libraries
)
8827 fatal_error (input_location
, "no input files");
8830 /* Early exit needed from main. */
8833 /* Make a place to record the compiler output file names
8834 that correspond to the input files. */
8837 i
+= lang_specific_extra_outfiles
;
8838 outfiles
= XCNEWVEC (const char *, i
);
8840 /* Record which files were specified explicitly as link input. */
8842 explicit_link_files
= XCNEWVEC (char, n_infiles
);
8844 combine_inputs
= have_o
|| flag_wpa
;
8846 for (i
= 0; (int) i
< n_infiles
; i
++)
8848 const char *name
= infiles
[i
].name
;
8849 struct compiler
*compiler
= lookup_compiler (name
,
8851 infiles
[i
].language
);
8853 if (compiler
&& !(compiler
->combinable
))
8854 combine_inputs
= false;
8856 if (lang_n_infiles
> 0 && compiler
!= input_file_compiler
8857 && infiles
[i
].language
&& infiles
[i
].language
[0] != '*')
8858 infiles
[i
].incompiler
= compiler
;
8862 input_file_compiler
= compiler
;
8863 infiles
[i
].incompiler
= compiler
;
8867 /* Since there is no compiler for this input file, assume it is a
8869 explicit_link_files
[i
] = 1;
8870 infiles
[i
].incompiler
= NULL
;
8872 infiles
[i
].compiled
= false;
8873 infiles
[i
].preprocessed
= false;
8876 if (!combine_inputs
&& have_c
&& have_o
&& lang_n_infiles
> 1)
8877 fatal_error (input_location
,
8878 "cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> "
8879 "with multiple files");
8881 /* No early exit needed from main; we can continue. */
8885 /* Run the spec machinery on each input file. */
8888 driver::do_spec_on_infiles () const
8892 for (i
= 0; (int) i
< n_infiles
; i
++)
8894 int this_file_error
= 0;
8896 /* Tell do_spec what to substitute for %i. */
8898 input_file_number
= i
;
8899 set_input (infiles
[i
].name
);
8901 if (infiles
[i
].compiled
)
8904 /* Use the same thing in %o, unless cp->spec says otherwise. */
8906 outfiles
[i
] = gcc_input_filename
;
8908 /* Figure out which compiler from the file's suffix. */
8911 = lookup_compiler (infiles
[i
].name
, input_filename_length
,
8912 infiles
[i
].language
);
8914 if (input_file_compiler
)
8916 /* Ok, we found an applicable compiler. Run its spec. */
8918 if (input_file_compiler
->spec
[0] == '#')
8920 error ("%s: %s compiler not installed on this system",
8921 gcc_input_filename
, &input_file_compiler
->spec
[1]);
8922 this_file_error
= 1;
8930 free (debug_check_temp_file
[0]);
8931 debug_check_temp_file
[0] = NULL
;
8933 free (debug_check_temp_file
[1]);
8934 debug_check_temp_file
[1] = NULL
;
8937 value
= do_spec (input_file_compiler
->spec
);
8938 infiles
[i
].compiled
= true;
8940 this_file_error
= 1;
8941 else if (compare_debug
&& debug_check_temp_file
[0])
8944 inform (UNKNOWN_LOCATION
,
8945 "recompiling with %<-fcompare-debug%>");
8947 compare_debug
= -compare_debug
;
8948 n_switches
= n_switches_debug_check
[1];
8949 n_switches_alloc
= n_switches_alloc_debug_check
[1];
8950 switches
= switches_debug_check
[1];
8952 value
= do_spec (input_file_compiler
->spec
);
8954 compare_debug
= -compare_debug
;
8955 n_switches
= n_switches_debug_check
[0];
8956 n_switches_alloc
= n_switches_alloc_debug_check
[0];
8957 switches
= switches_debug_check
[0];
8961 error ("during %<-fcompare-debug%> recompilation");
8962 this_file_error
= 1;
8965 gcc_assert (debug_check_temp_file
[1]
8966 && filename_cmp (debug_check_temp_file
[0],
8967 debug_check_temp_file
[1]));
8970 inform (UNKNOWN_LOCATION
, "comparing final insns dumps");
8972 if (compare_files (debug_check_temp_file
))
8973 this_file_error
= 1;
8978 free (debug_check_temp_file
[0]);
8979 debug_check_temp_file
[0] = NULL
;
8981 free (debug_check_temp_file
[1]);
8982 debug_check_temp_file
[1] = NULL
;
8987 /* If this file's name does not contain a recognized suffix,
8988 record it as explicit linker input. */
8991 explicit_link_files
[i
] = 1;
8993 /* Clear the delete-on-failure queue, deleting the files in it
8994 if this compilation failed. */
8996 if (this_file_error
)
8998 delete_failure_queue ();
9001 /* If this compilation succeeded, don't delete those files later. */
9002 clear_failure_queue ();
9005 /* Reset the input file name to the first compile/object file name, for use
9006 with %b in LINK_SPEC. We use the first input file that we can find
9007 a compiler to compile it instead of using infiles.language since for
9008 languages other than C we use aliases that we then lookup later. */
9013 for (i
= 0; i
< n_infiles
; i
++)
9014 if (infiles
[i
].incompiler
9015 || (infiles
[i
].language
&& infiles
[i
].language
[0] != '*'))
9017 set_input (infiles
[i
].name
);
9024 /* Make sure INPUT_FILE_NUMBER points to first available open
9026 input_file_number
= n_infiles
;
9027 if (lang_specific_pre_link ())
9032 /* If we have to run the linker, do it now. */
9035 driver::maybe_run_linker (const char *argv0
) const
9038 int linker_was_run
= 0;
9039 int num_linker_inputs
;
9041 /* Determine if there are any linker input files. */
9042 num_linker_inputs
= 0;
9043 for (i
= 0; (int) i
< n_infiles
; i
++)
9044 if (explicit_link_files
[i
] || outfiles
[i
] != NULL
)
9045 num_linker_inputs
++;
9047 /* Arrange for temporary file names created during linking to take
9048 on names related with the linker output rather than with the
9049 inputs when appropriate. */
9050 if (outbase
&& *outbase
)
9054 char *tofree
= dumpdir
;
9055 gcc_checking_assert (strlen (dumpdir
) == dumpdir_length
);
9056 dumpdir
= concat (dumpdir
, outbase
, ".", NULL
);
9060 dumpdir
= concat (outbase
, ".", NULL
);
9061 dumpdir_length
+= strlen (outbase
) + 1;
9062 dumpdir_trailing_dash_added
= true;
9064 else if (dumpdir_trailing_dash_added
)
9066 gcc_assert (dumpdir
[dumpdir_length
- 1] == '-');
9067 dumpdir
[dumpdir_length
- 1] = '.';
9070 if (dumpdir_trailing_dash_added
)
9072 gcc_assert (dumpdir_length
> 0);
9073 gcc_assert (dumpdir
[dumpdir_length
- 1] == '.');
9078 input_basename
= outbase
= NULL
;
9079 outbase_length
= suffixed_basename_length
= basename_length
= 0;
9081 /* Run ld to link all the compiler output files. */
9083 if (num_linker_inputs
> 0 && !seen_error () && print_subprocess_help
< 2)
9085 int tmp
= execution_count
;
9087 detect_jobserver ();
9091 #if HAVE_LTO_PLUGIN > 0
9092 #if HAVE_LTO_PLUGIN == 2
9093 const char *fno_use_linker_plugin
= "fno-use-linker-plugin";
9095 const char *fuse_linker_plugin
= "fuse-linker-plugin";
9099 /* We'll use ld if we can't find collect2. */
9100 if (! strcmp (linker_name_spec
, "collect2"))
9102 char *s
= find_a_program ("collect2");
9104 set_static_spec_shared (&linker_name_spec
, "ld");
9107 #if HAVE_LTO_PLUGIN > 0
9108 #if HAVE_LTO_PLUGIN == 2
9109 if (!switch_matches (fno_use_linker_plugin
,
9110 fno_use_linker_plugin
9111 + strlen (fno_use_linker_plugin
), 0))
9113 if (switch_matches (fuse_linker_plugin
,
9115 + strlen (fuse_linker_plugin
), 0))
9118 char *temp_spec
= find_a_file (&exec_prefixes
,
9119 LTOPLUGINSONAME
, R_OK
,
9122 fatal_error (input_location
,
9123 "%<-fuse-linker-plugin%>, but %s not found",
9125 linker_plugin_file_spec
= convert_white_space (temp_spec
);
9128 set_static_spec_shared (<o_gcc_spec
, argv0
);
9131 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
9133 putenv_from_prefixes (&exec_prefixes
, "COMPILER_PATH", false);
9134 putenv_from_prefixes (&startfile_prefixes
, LIBRARY_PATH_ENV
, true);
9136 if (print_subprocess_help
== 1)
9138 printf (_("\nLinker options\n==============\n\n"));
9139 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
9140 " to the linker.\n\n"));
9143 int value
= do_spec (link_command_spec
);
9146 linker_was_run
= (tmp
!= execution_count
);
9149 /* If options said don't run linker,
9150 complain about input files to be given to the linker. */
9152 if (! linker_was_run
&& !seen_error ())
9153 for (i
= 0; (int) i
< n_infiles
; i
++)
9154 if (explicit_link_files
[i
]
9155 && !(infiles
[i
].language
&& infiles
[i
].language
[0] == '*'))
9157 warning (0, "%s: linker input file unused because linking not done",
9159 if (access (outfiles
[i
], F_OK
) < 0)
9160 /* This is can be an indication the user specifed an errorneous
9161 separated option value, (or used the wrong prefix for an
9163 error ("%s: linker input file not found: %m", outfiles
[i
]);
9167 /* The end of "main". */
9170 driver::final_actions () const
9172 /* Delete some or all of the temporary files we made. */
9175 delete_failure_queue ();
9176 delete_temp_files ();
9178 if (print_help_list
)
9180 printf (("\nFor bug reporting instructions, please see:\n"));
9181 printf ("%s\n", bug_report_url
);
9185 /* Detect whether jobserver is active and working. If not drop
9186 --jobserver-auth from MAKEFLAGS. */
9189 driver::detect_jobserver () const
9191 /* Detect jobserver and drop it if it's not working. */
9192 const char *makeflags
= env
.get ("MAKEFLAGS");
9193 if (makeflags
!= NULL
)
9195 const char *needle
= "--jobserver-auth=";
9196 const char *n
= strstr (makeflags
, needle
);
9203 = (sscanf (n
+ strlen (needle
), "%d,%d", &rfd
, &wfd
) == 2
9206 && is_valid_fd (rfd
)
9207 && is_valid_fd (wfd
));
9209 /* Drop the jobserver if it's not working now. */
9212 unsigned offset
= n
- makeflags
;
9213 char *dup
= xstrdup (makeflags
);
9216 const char *space
= strchr (makeflags
+ offset
, ' ');
9218 strcpy (dup
+ offset
, space
);
9219 xputenv (concat ("MAKEFLAGS=", dup
, NULL
));
9225 /* Determine what the exit code of the driver should be. */
9228 driver::get_exit_code () const
9230 return (signal_count
!= 0 ? 2
9231 : seen_error () ? (pass_exit_codes
? greatest_status
: 1)
9235 /* Find the proper compilation spec for the file name NAME,
9236 whose length is LENGTH. LANGUAGE is the specified language,
9237 or 0 if this file is to be passed to the linker. */
9239 static struct compiler
*
9240 lookup_compiler (const char *name
, size_t length
, const char *language
)
9242 struct compiler
*cp
;
9244 /* If this was specified by the user to be a linker input, indicate that. */
9245 if (language
!= 0 && language
[0] == '*')
9248 /* Otherwise, look for the language, if one is spec'd. */
9251 for (cp
= compilers
+ n_compilers
- 1; cp
>= compilers
; cp
--)
9252 if (cp
->suffix
[0] == '@' && !strcmp (cp
->suffix
+ 1, language
))
9254 if (name
!= NULL
&& strcmp (name
, "-") == 0
9255 && (strcmp (cp
->suffix
, "@c-header") == 0
9256 || strcmp (cp
->suffix
, "@c++-header") == 0)
9258 fatal_error (input_location
,
9259 "cannot use %<-%> as input filename for a "
9260 "precompiled header");
9265 error ("language %s not recognized", language
);
9269 /* Look for a suffix. */
9270 for (cp
= compilers
+ n_compilers
- 1; cp
>= compilers
; cp
--)
9272 if (/* The suffix `-' matches only the file name `-'. */
9273 (!strcmp (cp
->suffix
, "-") && !strcmp (name
, "-"))
9274 || (strlen (cp
->suffix
) < length
9275 /* See if the suffix matches the end of NAME. */
9276 && !strcmp (cp
->suffix
,
9277 name
+ length
- strlen (cp
->suffix
))
9282 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
9283 /* Look again, but case-insensitively this time. */
9285 for (cp
= compilers
+ n_compilers
- 1; cp
>= compilers
; cp
--)
9287 if (/* The suffix `-' matches only the file name `-'. */
9288 (!strcmp (cp
->suffix
, "-") && !strcmp (name
, "-"))
9289 || (strlen (cp
->suffix
) < length
9290 /* See if the suffix matches the end of NAME. */
9291 && ((!strcmp (cp
->suffix
,
9292 name
+ length
- strlen (cp
->suffix
))
9293 || !strpbrk (cp
->suffix
, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
9294 && !strcasecmp (cp
->suffix
,
9295 name
+ length
- strlen (cp
->suffix
)))
9301 if (cp
>= compilers
)
9303 if (cp
->spec
[0] != '@')
9304 /* A non-alias entry: return it. */
9307 /* An alias entry maps a suffix to a language.
9308 Search for the language; pass 0 for NAME and LENGTH
9309 to avoid infinite recursion if language not found. */
9310 return lookup_compiler (NULL
, 0, cp
->spec
+ 1);
9316 save_string (const char *s
, int len
)
9318 char *result
= XNEWVEC (char, len
+ 1);
9320 gcc_checking_assert (strlen (s
) >= (unsigned int) len
);
9321 memcpy (result
, s
, len
);
9327 validate_switches_from_spec (const char *spec
, bool user
)
9329 const char *p
= spec
;
9335 || (*p
== 'W' && *++p
== '{')
9336 || (*p
== '@' && *++p
== '{')))
9337 /* We have a switch spec. */
9338 p
= validate_switches (p
+ 1, user
, *p
== '{');
9342 validate_all_switches (void)
9344 struct compiler
*comp
;
9345 struct spec_list
*spec
;
9347 for (comp
= compilers
; comp
->spec
; comp
++)
9348 validate_switches_from_spec (comp
->spec
, false);
9350 /* Look through the linked list of specs read from the specs file. */
9351 for (spec
= specs
; spec
; spec
= spec
->next
)
9352 validate_switches_from_spec (*spec
->ptr_spec
, spec
->user_p
);
9354 validate_switches_from_spec (link_command_spec
, false);
9357 /* Look at the switch-name that comes after START and mark as valid
9358 all supplied switches that match it. If BRACED, handle other
9359 switches after '|' and '&', and specs after ':' until ';' or '}',
9360 going back for more switches after ';'. Without BRACED, handle
9361 only one atom. Return a pointer to whatever follows the handled
9362 items, after the closing brace if BRACED. */
9365 validate_switches (const char *start
, bool user_spec
, bool braced
)
9367 const char *p
= start
;
9371 bool suffix
= false;
9372 bool starred
= false;
9374 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
9383 if (*p
== '.' || *p
== ',')
9387 while (ISIDNUM (*p
) || *p
== '-' || *p
== '+' || *p
== '='
9388 || *p
== ',' || *p
== '.' || *p
== '@')
9393 starred
= true, p
++;
9399 /* Mark all matching switches as valid. */
9400 for (i
= 0; i
< n_switches
; i
++)
9401 if (!strncmp (switches
[i
].part1
, atom
, len
)
9402 && (starred
|| switches
[i
].part1
[len
] == '\0')
9403 && (switches
[i
].known
|| user_spec
)){
9404 switches
[i
].validated
= true;
9412 if (*p
&& (p
[-1] == '|' || p
[-1] == '&'))
9415 if (*p
&& p
[-1] == ':')
9417 while (*p
&& *p
!= ';' && *p
!= '}')
9422 if (*p
== '{' || *p
== '<')
9423 p
= validate_switches (p
+1, user_spec
, *p
== '{');
9424 else if (p
[0] == 'W' && p
[1] == '{')
9425 p
= validate_switches (p
+2, user_spec
, true);
9426 else if (p
[0] == '@' && p
[1] == '{')
9427 p
= validate_switches (p
+2, user_spec
, true);
9434 if (*p
&& p
[-1] == ';')
9448 static struct mdswitchstr
*mdswitches
;
9449 static int n_mdswitches
;
9451 /* Check whether a particular argument was used. The first time we
9452 canonicalize the switches to keep only the ones we care about. */
9457 int operator () (const char *p
, int len
);
9464 const char *replace
;
9469 mswitchstr
*mswitches
;
9474 used_arg_t used_arg
;
9477 used_arg_t::operator () (const char *p
, int len
)
9483 struct mswitchstr
*matches
;
9487 /* Break multilib_matches into the component strings of string
9488 and replacement string. */
9489 for (q
= multilib_matches
; *q
!= '\0'; q
++)
9494 = (struct mswitchstr
*) alloca ((sizeof (struct mswitchstr
)) * cnt
);
9496 q
= multilib_matches
;
9505 fatal_error (input_location
, "multilib spec %qs is invalid",
9510 matches
[i
].len
= q
- matches
[i
].str
;
9512 matches
[i
].replace
= ++q
;
9513 while (*q
!= ';' && *q
!= '\0')
9516 goto invalid_matches
;
9519 matches
[i
].rep_len
= q
- matches
[i
].replace
;
9525 /* Now build a list of the replacement string for switches that we care
9526 about. Make sure we allocate at least one entry. This prevents
9527 xmalloc from calling fatal, and prevents us from re-executing this
9530 = XNEWVEC (struct mswitchstr
, n_mdswitches
+ (n_switches
? n_switches
: 1));
9531 for (i
= 0; i
< n_switches
; i
++)
9532 if ((switches
[i
].live_cond
& SWITCH_IGNORE
) == 0)
9534 int xlen
= strlen (switches
[i
].part1
);
9535 for (j
= 0; j
< cnt
; j
++)
9536 if (xlen
== matches
[j
].len
9537 && ! strncmp (switches
[i
].part1
, matches
[j
].str
, xlen
))
9539 mswitches
[n_mswitches
].str
= matches
[j
].replace
;
9540 mswitches
[n_mswitches
].len
= matches
[j
].rep_len
;
9541 mswitches
[n_mswitches
].replace
= (char *) 0;
9542 mswitches
[n_mswitches
].rep_len
= 0;
9548 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
9549 on the command line nor any options mutually incompatible with
9551 for (i
= 0; i
< n_mdswitches
; i
++)
9555 for (q
= multilib_options
; *q
!= '\0'; *q
&& q
++)
9561 while (strncmp (q
, mdswitches
[i
].str
, mdswitches
[i
].len
) != 0
9562 || strchr (" /", q
[mdswitches
[i
].len
]) == NULL
)
9564 while (*q
!= ' ' && *q
!= '/' && *q
!= '\0')
9571 if (*q
!= ' ' && *q
!= '\0')
9573 while (*r
!= ' ' && *r
!= '\0')
9576 while (*q
!= ' ' && *q
!= '/' && *q
!= '\0')
9579 if (used_arg (r
, q
- r
))
9584 mswitches
[n_mswitches
].str
= mdswitches
[i
].str
;
9585 mswitches
[n_mswitches
].len
= mdswitches
[i
].len
;
9586 mswitches
[n_mswitches
].replace
= (char *) 0;
9587 mswitches
[n_mswitches
].rep_len
= 0;
9600 for (i
= 0; i
< n_mswitches
; i
++)
9601 if (len
== mswitches
[i
].len
&& ! strncmp (p
, mswitches
[i
].str
, len
))
9607 void used_arg_t::finalize ()
9609 XDELETEVEC (mswitches
);
9616 default_arg (const char *p
, int len
)
9620 for (i
= 0; i
< n_mdswitches
; i
++)
9621 if (len
== mdswitches
[i
].len
&& ! strncmp (p
, mdswitches
[i
].str
, len
))
9627 /* Work out the subdirectory to use based on the options. The format of
9628 multilib_select is a list of elements. Each element is a subdirectory
9629 name followed by a list of options followed by a semicolon. The format
9630 of multilib_exclusions is the same, but without the preceding
9631 directory. First gcc will check the exclusions, if none of the options
9632 beginning with an exclamation point are present, and all of the other
9633 options are present, then we will ignore this completely. Passing
9634 that, gcc will consider each multilib_select in turn using the same
9635 rules for matching the options. If a match is found, that subdirectory
9637 A subdirectory name is optionally followed by a colon and the corresponding
9641 set_multilib_dir (void)
9644 unsigned int this_path_len
;
9645 const char *this_path
, *this_arg
;
9646 const char *start
, *end
;
9648 int ok
, ndfltok
, first
;
9651 start
= multilib_defaults
;
9652 while (*start
== ' ' || *start
== '\t')
9654 while (*start
!= '\0')
9657 while (*start
!= ' ' && *start
!= '\t' && *start
!= '\0')
9659 while (*start
== ' ' || *start
== '\t')
9667 mdswitches
= XNEWVEC (struct mdswitchstr
, n_mdswitches
);
9668 for (start
= multilib_defaults
; *start
!= '\0'; start
= end
+ 1)
9670 while (*start
== ' ' || *start
== '\t')
9676 for (end
= start
+ 1;
9677 *end
!= ' ' && *end
!= '\t' && *end
!= '\0'; end
++)
9680 obstack_grow (&multilib_obstack
, start
, end
- start
);
9681 obstack_1grow (&multilib_obstack
, 0);
9682 mdswitches
[i
].str
= XOBFINISH (&multilib_obstack
, const char *);
9683 mdswitches
[i
++].len
= end
- start
;
9690 p
= multilib_exclusions
;
9693 /* Ignore newlines. */
9700 /* Check the arguments. */
9707 fatal_error (input_location
, "multilib exclusions %qs is invalid",
9708 multilib_exclusions
);
9718 while (*p
!= ' ' && *p
!= ';')
9721 goto invalid_exclusions
;
9725 if (*this_arg
!= '!')
9733 ok
= used_arg (this_arg
, p
- this_arg
);
9748 p
= multilib_select
;
9750 /* Append multilib reuse rules if any. With those rules, we can reuse
9751 one multilib for certain different options sets. */
9752 if (strlen (multilib_reuse
) > 0)
9753 p
= concat (p
, multilib_reuse
, NULL
);
9757 /* Ignore newlines. */
9764 /* Get the initial path. */
9771 fatal_error (input_location
, "multilib select %qs %qs is invalid",
9772 multilib_select
, multilib_reuse
);
9776 this_path_len
= p
- this_path
;
9778 /* Check the arguments. */
9785 goto invalid_select
;
9794 while (*p
!= ' ' && *p
!= ';')
9797 goto invalid_select
;
9801 if (*this_arg
!= '!')
9809 /* If this is a default argument, we can just ignore it.
9810 This is true even if this_arg begins with '!'. Beginning
9811 with '!' does not mean that this argument is necessarily
9812 inappropriate for this library: it merely means that
9813 there is a more specific library which uses this
9814 argument. If this argument is a default, we need not
9815 consider that more specific library. */
9816 ok
= used_arg (this_arg
, p
- this_arg
);
9823 if (default_arg (this_arg
, p
- this_arg
))
9832 if (this_path_len
!= 1
9833 || this_path
[0] != '.')
9835 char *new_multilib_dir
= XNEWVEC (char, this_path_len
+ 1);
9838 strncpy (new_multilib_dir
, this_path
, this_path_len
);
9839 new_multilib_dir
[this_path_len
] = '\0';
9840 q
= strchr (new_multilib_dir
, ':');
9843 multilib_dir
= new_multilib_dir
;
9850 const char *q
= this_path
, *end
= this_path
+ this_path_len
;
9852 while (q
< end
&& *q
!= ':')
9856 const char *q2
= q
+ 1, *ml_end
= end
;
9857 char *new_multilib_os_dir
;
9859 while (q2
< end
&& *q2
!= ':')
9863 if (ml_end
- q
== 1)
9864 multilib_os_dir
= xstrdup (".");
9867 new_multilib_os_dir
= XNEWVEC (char, ml_end
- q
);
9868 memcpy (new_multilib_os_dir
, q
+ 1, ml_end
- q
- 1);
9869 new_multilib_os_dir
[ml_end
- q
- 1] = '\0';
9870 multilib_os_dir
= new_multilib_os_dir
;
9873 if (q2
< end
&& *q2
== ':')
9875 char *new_multiarch_dir
= XNEWVEC (char, end
- q2
);
9876 memcpy (new_multiarch_dir
, q2
+ 1, end
- q2
- 1);
9877 new_multiarch_dir
[end
- q2
- 1] = '\0';
9878 multiarch_dir
= new_multiarch_dir
;
9887 if (multilib_dir
== NULL
&& multilib_os_dir
!= NULL
9888 && strcmp (multilib_os_dir
, ".") == 0)
9890 free (CONST_CAST (char *, multilib_os_dir
));
9891 multilib_os_dir
= NULL
;
9893 else if (multilib_dir
!= NULL
&& multilib_os_dir
== NULL
)
9894 multilib_os_dir
= multilib_dir
;
9897 /* Print out the multiple library subdirectory selection
9898 information. This prints out a series of lines. Each line looks
9899 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
9900 required. Only the desired options are printed out, the negative
9901 matches. The options are print without a leading dash. There are
9902 no spaces to make it easy to use the information in the shell.
9903 Each subdirectory is printed only once. This assumes the ordering
9904 generated by the genmultilib script. Also, we leave out ones that match
9908 print_multilib_info (void)
9910 const char *p
= multilib_select
;
9911 const char *last_path
= 0, *this_path
;
9914 unsigned int last_path_len
= 0;
9919 /* Ignore newlines. */
9926 /* Get the initial path. */
9933 fatal_error (input_location
,
9934 "multilib select %qs is invalid", multilib_select
);
9940 /* When --disable-multilib was used but target defines
9941 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
9942 with .:: for multiarch configurations) are there just to find
9943 multilib_os_dir, so skip them from output. */
9944 if (this_path
[0] == '.' && this_path
[1] == ':' && this_path
[2] != ':')
9947 /* Check for matches with the multilib_exclusions. We don't bother
9948 with the '!' in either list. If any of the exclusion rules match
9949 all of its options with the select rule, we skip it. */
9951 const char *e
= multilib_exclusions
;
9952 const char *this_arg
;
9957 /* Ignore newlines. */
9964 /* Check the arguments. */
9973 fatal_error (input_location
,
9974 "multilib exclusion %qs is invalid",
9975 multilib_exclusions
);
9986 while (*e
!= ' ' && *e
!= ';')
9989 goto invalid_exclusion
;
9997 int len
= e
- this_arg
;
10000 goto invalid_select
;
10004 while (*q
!= ' ' && *q
!= ';')
10007 goto invalid_select
;
10011 if (! strncmp (arg
, this_arg
,
10012 (len
< q
- arg
) ? q
- arg
: len
)
10013 || default_arg (this_arg
, e
- this_arg
))
10043 /* If this is a duplicate, skip it. */
10044 skip
= (last_path
!= 0
10045 && (unsigned int) (p
- this_path
) == last_path_len
10046 && ! filename_ncmp (last_path
, this_path
, last_path_len
));
10048 last_path
= this_path
;
10049 last_path_len
= p
- this_path
;
10052 /* If all required arguments are default arguments, and no default
10053 arguments appear in the ! argument list, then we can skip it.
10054 We will already have printed a directory identical to this one
10055 which does not require that default argument. */
10059 bool default_arg_ok
= false;
10067 goto invalid_select
;
10078 while (*q
!= ' ' && *q
!= ';')
10081 goto invalid_select
;
10085 if (default_arg (arg
, q
- arg
))
10087 /* Stop checking if any default arguments appeared in not
10091 default_arg_ok
= false;
10095 default_arg_ok
= true;
10099 /* Stop checking if any required argument is not provided by
10100 default arguments. */
10101 default_arg_ok
= false;
10109 /* Make sure all default argument is OK for this multi-lib set. */
10110 if (default_arg_ok
)
10120 for (p1
= last_path
; p1
< p
&& *p1
!= ':'; p1
++)
10131 goto invalid_select
;
10139 use_arg
= *p
!= '!';
10144 while (*p
!= ' ' && *p
!= ';')
10147 goto invalid_select
;
10159 /* If there are extra options, print them now. */
10160 if (multilib_extra
&& *multilib_extra
)
10162 int print_at
= TRUE
;
10165 for (q
= multilib_extra
; *q
!= '\0'; q
++)
10186 /* getenv built-in spec function.
10188 Returns the value of the environment variable given by its first argument,
10189 concatenated with the second argument. If the variable is not defined, a
10190 fatal error is issued unless such undefs are internally allowed, in which
10191 case the variable name prefixed by a '/' is used as the variable value.
10193 The leading '/' allows using the result at a spot where a full path would
10194 normally be expected and when the actual value doesn't really matter since
10195 undef vars are allowed. */
10197 static const char *
10198 getenv_spec_function (int argc
, const char **argv
)
10201 const char *varname
;
10211 value
= env
.get (varname
);
10213 /* If the variable isn't defined and this is allowed, craft our expected
10214 return value. Assume variable names used in specs strings don't contain
10215 any active spec character so don't need escaping. */
10216 if (!value
&& spec_undefvar_allowed
)
10218 result
= XNEWVAR (char, strlen(varname
) + 2);
10219 sprintf (result
, "/%s", varname
);
10224 fatal_error (input_location
,
10225 "environment variable %qs not defined", varname
);
10227 /* We have to escape every character of the environment variable so
10228 they are not interpreted as active spec characters. A
10229 particularly painful case is when we are reading a variable
10230 holding a windows path complete with \ separators. */
10231 len
= strlen (value
) * 2 + strlen (argv
[1]) + 1;
10232 result
= XNEWVAR (char, len
);
10233 for (ptr
= result
; *value
; ptr
+= 2)
10239 strcpy (ptr
, argv
[1]);
10244 /* if-exists built-in spec function.
10246 Checks to see if the file specified by the absolute pathname in
10247 ARGS exists. Returns that pathname if found.
10249 The usual use for this function is to check for a library file
10250 (whose name has been expanded with %s). */
10252 static const char *
10253 if_exists_spec_function (int argc
, const char **argv
)
10255 /* Must have only one argument. */
10256 if (argc
== 1 && IS_ABSOLUTE_PATH (argv
[0]) && ! access (argv
[0], R_OK
))
10262 /* if-exists-else built-in spec function.
10264 This is like if-exists, but takes an additional argument which
10265 is returned if the first argument does not exist. */
10267 static const char *
10268 if_exists_else_spec_function (int argc
, const char **argv
)
10270 /* Must have exactly two arguments. */
10274 if (IS_ABSOLUTE_PATH (argv
[0]) && ! access (argv
[0], R_OK
))
10280 /* if-exists-then-else built-in spec function.
10282 Checks to see if the file specified by the absolute pathname in
10283 the first arg exists. Returns the second arg if so, otherwise returns
10284 the third arg if it is present. */
10286 static const char *
10287 if_exists_then_else_spec_function (int argc
, const char **argv
)
10290 /* Must have two or three arguments. */
10291 if (argc
!= 2 && argc
!= 3)
10294 if (IS_ABSOLUTE_PATH (argv
[0]) && ! access (argv
[0], R_OK
))
10303 /* sanitize built-in spec function.
10305 This returns non-NULL, if sanitizing address, thread or
10306 any of the undefined behavior sanitizers. */
10308 static const char *
10309 sanitize_spec_function (int argc
, const char **argv
)
10314 if (strcmp (argv
[0], "address") == 0)
10315 return (flag_sanitize
& SANITIZE_USER_ADDRESS
) ? "" : NULL
;
10316 if (strcmp (argv
[0], "hwaddress") == 0)
10317 return (flag_sanitize
& SANITIZE_USER_HWADDRESS
) ? "" : NULL
;
10318 if (strcmp (argv
[0], "kernel-address") == 0)
10319 return (flag_sanitize
& SANITIZE_KERNEL_ADDRESS
) ? "" : NULL
;
10320 if (strcmp (argv
[0], "kernel-hwaddress") == 0)
10321 return (flag_sanitize
& SANITIZE_KERNEL_HWADDRESS
) ? "" : NULL
;
10322 if (strcmp (argv
[0], "thread") == 0)
10323 return (flag_sanitize
& SANITIZE_THREAD
) ? "" : NULL
;
10324 if (strcmp (argv
[0], "undefined") == 0)
10325 return ((flag_sanitize
10326 & (SANITIZE_UNDEFINED
| SANITIZE_UNDEFINED_NONDEFAULT
))
10327 && !flag_sanitize_undefined_trap_on_error
) ? "" : NULL
;
10328 if (strcmp (argv
[0], "leak") == 0)
10329 return ((flag_sanitize
10330 & (SANITIZE_ADDRESS
| SANITIZE_LEAK
| SANITIZE_THREAD
))
10331 == SANITIZE_LEAK
) ? "" : NULL
;
10335 /* replace-outfile built-in spec function.
10337 This looks for the first argument in the outfiles array's name and
10338 replaces it with the second argument. */
10340 static const char *
10341 replace_outfile_spec_function (int argc
, const char **argv
)
10344 /* Must have exactly two arguments. */
10348 for (i
= 0; i
< n_infiles
; i
++)
10350 if (outfiles
[i
] && !filename_cmp (outfiles
[i
], argv
[0]))
10351 outfiles
[i
] = xstrdup (argv
[1]);
10356 /* remove-outfile built-in spec function.
10358 * This looks for the first argument in the outfiles array's name and
10361 static const char *
10362 remove_outfile_spec_function (int argc
, const char **argv
)
10365 /* Must have exactly one argument. */
10369 for (i
= 0; i
< n_infiles
; i
++)
10371 if (outfiles
[i
] && !filename_cmp (outfiles
[i
], argv
[0]))
10372 outfiles
[i
] = NULL
;
10377 /* Given two version numbers, compares the two numbers.
10378 A version number must match the regular expression
10379 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
10382 compare_version_strings (const char *v1
, const char *v2
)
10387 if (regcomp (&r
, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
10388 REG_EXTENDED
| REG_NOSUB
) != 0)
10390 rresult
= regexec (&r
, v1
, 0, NULL
, 0);
10391 if (rresult
== REG_NOMATCH
)
10392 fatal_error (input_location
, "invalid version number %qs", v1
);
10393 else if (rresult
!= 0)
10395 rresult
= regexec (&r
, v2
, 0, NULL
, 0);
10396 if (rresult
== REG_NOMATCH
)
10397 fatal_error (input_location
, "invalid version number %qs", v2
);
10398 else if (rresult
!= 0)
10401 return strverscmp (v1
, v2
);
10405 /* version_compare built-in spec function.
10407 This takes an argument of the following form:
10409 <comparison-op> <arg1> [<arg2>] <switch> <result>
10411 and produces "result" if the comparison evaluates to true,
10412 and nothing if it doesn't.
10414 The supported <comparison-op> values are:
10416 >= true if switch is a later (or same) version than arg1
10418 < true if switch is an earlier version than arg1
10420 >< true if switch is arg1 or later, and earlier than arg2
10421 <> true if switch is earlier than arg1 or is arg2 or later
10423 If the switch is not present, the condition is false unless
10424 the first character of the <comparison-op> is '!'.
10427 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
10428 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
10430 static const char *
10431 version_compare_spec_function (int argc
, const char **argv
)
10435 const char *switch_value
= NULL
;
10440 fatal_error (input_location
, "too few arguments to %%:version-compare");
10441 if (argv
[0][0] == '\0')
10443 if ((argv
[0][1] == '<' || argv
[0][1] == '>') && argv
[0][0] != '!')
10445 if (argc
!= nargs
+ 3)
10446 fatal_error (input_location
, "too many arguments to %%:version-compare");
10448 switch_len
= strlen (argv
[nargs
+ 1]);
10449 for (i
= 0; i
< n_switches
; i
++)
10450 if (!strncmp (switches
[i
].part1
, argv
[nargs
+ 1], switch_len
)
10451 && check_live_switch (i
, switch_len
))
10452 switch_value
= switches
[i
].part1
+ switch_len
;
10454 if (switch_value
== NULL
)
10455 comp1
= comp2
= -1;
10458 comp1
= compare_version_strings (switch_value
, argv
[1]);
10460 comp2
= compare_version_strings (switch_value
, argv
[2]);
10462 comp2
= -1; /* This value unused. */
10465 switch (argv
[0][0] << 8 | argv
[0][1])
10467 case '>' << 8 | '=':
10468 result
= comp1
>= 0;
10470 case '!' << 8 | '<':
10471 result
= comp1
>= 0 || switch_value
== NULL
;
10474 result
= comp1
< 0;
10476 case '!' << 8 | '>':
10477 result
= comp1
< 0 || switch_value
== NULL
;
10479 case '>' << 8 | '<':
10480 result
= comp1
>= 0 && comp2
< 0;
10482 case '<' << 8 | '>':
10483 result
= comp1
< 0 || comp2
>= 0;
10487 fatal_error (input_location
,
10488 "unknown operator %qs in %%:version-compare", argv
[0]);
10493 return argv
[nargs
+ 2];
10496 /* %:include builtin spec function. This differs from %include in that it
10497 can be nested inside a spec, and thus be conditionalized. It takes
10498 one argument, the filename, and looks for it in the startfile path.
10499 The result is always NULL, i.e. an empty expansion. */
10501 static const char *
10502 include_spec_function (int argc
, const char **argv
)
10509 file
= find_a_file (&startfile_prefixes
, argv
[0], R_OK
, true);
10510 read_specs (file
? file
: argv
[0], false, false);
10515 /* %:find-file spec function. This function replaces its argument by
10516 the file found through find_file, that is the -print-file-name gcc
10518 static const char *
10519 find_file_spec_function (int argc
, const char **argv
)
10526 file
= find_file (argv
[0]);
10531 /* %:find-plugindir spec function. This function replaces its argument
10532 by the -iplugindir=<dir> option. `dir' is found through find_file, that
10533 is the -print-file-name gcc program option. */
10534 static const char *
10535 find_plugindir_spec_function (int argc
, const char **argv ATTRIBUTE_UNUSED
)
10537 const char *option
;
10542 option
= concat ("-iplugindir=", find_file ("plugin"), NULL
);
10547 /* %:print-asm-header spec function. Print a banner to say that the
10548 following output is from the assembler. */
10550 static const char *
10551 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED
,
10552 const char **argv ATTRIBUTE_UNUSED
)
10554 printf (_("Assembler options\n=================\n\n"));
10555 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
10560 /* Get a random number for -frandom-seed */
10562 static unsigned HOST_WIDE_INT
10563 get_random_number (void)
10565 unsigned HOST_WIDE_INT ret
= 0;
10568 fd
= open ("/dev/urandom", O_RDONLY
);
10571 ssize_t r
= read (fd
, &ret
, sizeof (HOST_WIDE_INT
));
10573 if (ret
&& r
== sizeof (HOST_WIDE_INT
))
10577 /* Get some more or less random data. */
10578 #ifdef HAVE_GETTIMEOFDAY
10582 gettimeofday (&tv
, NULL
);
10583 ret
= tv
.tv_sec
* 1000 + tv
.tv_usec
/ 1000;
10587 time_t now
= time (NULL
);
10589 if (now
!= (time_t)-1)
10590 ret
= (unsigned) now
;
10594 return ret
^ getpid ();
10597 /* %:compare-debug-dump-opt spec function. Save the last argument,
10598 expected to be the last -fdump-final-insns option, or generate a
10601 static const char *
10602 compare_debug_dump_opt_spec_function (int arg
,
10603 const char **argv ATTRIBUTE_UNUSED
)
10608 static char random_seed
[HOST_BITS_PER_WIDE_INT
/ 4 + 3];
10611 fatal_error (input_location
,
10612 "too many arguments to %%:compare-debug-dump-opt");
10614 do_spec_2 ("%{fdump-final-insns=*:%*}", NULL
);
10615 do_spec_1 (" ", 0, NULL
);
10617 if (argbuf
.length () > 0
10618 && strcmp (argv
[argbuf
.length () - 1], ".") != 0)
10620 if (!compare_debug
)
10623 name
= xstrdup (argv
[argbuf
.length () - 1]);
10628 if (argbuf
.length () > 0)
10629 do_spec_2 ("%B.gkd", NULL
);
10630 else if (!compare_debug
)
10633 do_spec_2 ("%{!save-temps*:%g.gkd}%{save-temps*:%B.gkd}", NULL
);
10635 do_spec_1 (" ", 0, NULL
);
10637 gcc_assert (argbuf
.length () > 0);
10639 name
= xstrdup (argbuf
.last ());
10641 char *arg
= quote_spec (xstrdup (name
));
10642 ret
= concat ("-fdump-final-insns=", arg
, NULL
);
10646 which
= compare_debug
< 0;
10647 debug_check_temp_file
[which
] = name
;
10651 unsigned HOST_WIDE_INT value
= get_random_number ();
10653 sprintf (random_seed
, HOST_WIDE_INT_PRINT_HEX
, value
);
10659 ret
= concat ("%{!frandom-seed=*:-frandom-seed=", random_seed
, "} ",
10670 /* %:compare-debug-self-opt spec function. Expands to the options
10671 that are to be passed in the second compilation of
10674 static const char *
10675 compare_debug_self_opt_spec_function (int arg
,
10676 const char **argv ATTRIBUTE_UNUSED
)
10679 fatal_error (input_location
,
10680 "too many arguments to %%:compare-debug-self-opt");
10682 if (compare_debug
>= 0)
10686 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
10687 %<fdump-final-insns=* -w -S -o %j \
10688 %{!fcompare-debug-second:-fcompare-debug-second} \
10689 ", compare_debug_opt
, NULL
);
10692 /* %:pass-through-libs spec function. Finds all -l options and input
10693 file names in the lib spec passed to it, and makes a list of them
10694 prepended with the plugin option to cause them to be passed through
10695 to the final link after all the new object files have been added. */
10698 pass_through_libs_spec_func (int argc
, const char **argv
)
10700 char *prepended
= xstrdup (" ");
10702 /* Shlemiel the painter's algorithm. Innately horrible, but at least
10703 we know that there will never be more than a handful of strings to
10704 concat, and it's only once per run, so it's not worth optimising. */
10705 for (n
= 0; n
< argc
; n
++)
10707 char *old
= prepended
;
10708 /* Anything that isn't an option is a full path to an output
10709 file; pass it through if it ends in '.a'. Among options,
10711 if (argv
[n
][0] == '-' && argv
[n
][1] == 'l')
10713 const char *lopt
= argv
[n
] + 2;
10714 /* Handle both joined and non-joined -l options. If for any
10715 reason there's a trailing -l with no joined or following
10716 arg just discard it. */
10717 if (!*lopt
&& ++n
>= argc
)
10721 prepended
= concat (prepended
, "-plugin-opt=-pass-through=-l",
10724 else if (!strcmp (".a", argv
[n
] + strlen (argv
[n
]) - 2))
10726 prepended
= concat (prepended
, "-plugin-opt=-pass-through=",
10727 argv
[n
], " ", NULL
);
10729 if (prepended
!= old
)
10736 not_actual_file_p (const char *name
)
10738 return (strcmp (name
, "-") == 0
10739 || strcmp (name
, HOST_BIT_BUCKET
) == 0);
10742 /* %:dumps spec function. Take an optional argument that overrides
10743 the default extension for -dumpbase and -dumpbase-ext.
10744 Return -dumpdir, -dumpbase and -dumpbase-ext, if needed. */
10746 dumps_spec_func (int argc
, const char **argv ATTRIBUTE_UNUSED
)
10748 const char *ext
= dumpbase_ext
;
10751 char *args
[3] = { NULL
, NULL
, NULL
};
10754 /* Do not compute a default for -dumpbase-ext when -dumpbase was
10755 given explicitly. */
10756 if (dumpbase
&& *dumpbase
&& !ext
)
10761 /* Do not override the explicitly-specified -dumpbase-ext with
10762 the specs-provided overrider. */
10766 else if (argc
!= 0)
10767 fatal_error (input_location
, "too many arguments for %%:dumps");
10771 p
= quote_spec_arg (xstrdup (dumpdir
));
10772 args
[nargs
++] = concat (" -dumpdir ", p
, NULL
);
10777 ext
= input_basename
+ basename_length
;
10779 /* Use the precomputed outbase, or compute dumpbase from
10780 input_basename, just like %b would. */
10783 if (dumpbase
&& *dumpbase
)
10785 base
= xstrdup (dumpbase
);
10786 p
= base
+ outbase_length
;
10787 gcc_checking_assert (strncmp (base
, outbase
, outbase_length
) == 0);
10788 gcc_checking_assert (strcmp (p
, ext
) == 0);
10790 else if (outbase_length
)
10792 base
= xstrndup (outbase
, outbase_length
);
10797 base
= xstrndup (input_basename
, suffixed_basename_length
);
10798 p
= base
+ basename_length
;
10801 if (compare_debug
< 0 || !p
|| strcmp (p
, ext
) != 0)
10807 if (compare_debug
< 0)
10812 p
= concat (base
, gk
, ext
, NULL
);
10818 base
= quote_spec_arg (base
);
10819 args
[nargs
++] = concat (" -dumpbase ", base
, NULL
);
10824 p
= quote_spec_arg (xstrdup (ext
));
10825 args
[nargs
++] = concat (" -dumpbase-ext ", p
, NULL
);
10829 const char *ret
= concat (args
[0], args
[1], args
[2], NULL
);
10831 free (args
[--nargs
]);
10836 /* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
10837 Otherwise, return NULL. */
10839 static const char *
10840 greater_than_spec_func (int argc
, const char **argv
)
10847 gcc_assert (argc
>= 2);
10849 long arg
= strtol (argv
[argc
- 2], &converted
, 10);
10850 gcc_assert (converted
!= argv
[argc
- 2]);
10852 long lim
= strtol (argv
[argc
- 1], &converted
, 10);
10853 gcc_assert (converted
!= argv
[argc
- 1]);
10861 /* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
10862 Otherwise, return NULL. */
10864 static const char *
10865 debug_level_greater_than_spec_func (int argc
, const char **argv
)
10870 fatal_error (input_location
,
10871 "wrong number of arguments to %%:debug-level-gt");
10873 long arg
= strtol (argv
[0], &converted
, 10);
10874 gcc_assert (converted
!= argv
[0]);
10876 if (debug_info_level
> arg
)
10882 /* Returns "" if dwarf_version is greater than ARGV[ARGC-1].
10883 Otherwise, return NULL. */
10885 static const char *
10886 dwarf_version_greater_than_spec_func (int argc
, const char **argv
)
10891 fatal_error (input_location
,
10892 "wrong number of arguments to %%:dwarf-version-gt");
10894 long arg
= strtol (argv
[0], &converted
, 10);
10895 gcc_assert (converted
!= argv
[0]);
10897 if (dwarf_version
> arg
)
10904 path_prefix_reset (path_prefix
*prefix
)
10906 struct prefix_list
*iter
, *next
;
10907 iter
= prefix
->plist
;
10911 free (const_cast <char *> (iter
->prefix
));
10916 prefix
->max_len
= 0;
10919 /* The function takes 3 arguments: OPTION name, file name and location
10920 where we search for Fortran modules.
10921 When the FILE is found by find_file, return OPTION=path_to_file. */
10923 static const char *
10924 find_fortran_preinclude_file (int argc
, const char **argv
)
10926 char *result
= NULL
;
10930 struct path_prefix prefixes
= { 0, 0, "preinclude" };
10932 /* Search first for 'finclude' folder location for a header file
10933 installed by the compiler (similar to omp_lib.h). */
10934 add_prefix (&prefixes
, argv
[2], NULL
, 0, 0, 0);
10935 #ifdef TOOL_INCLUDE_DIR
10936 /* Then search: <prefix>/<target>/<include>/finclude */
10937 add_prefix (&prefixes
, TOOL_INCLUDE_DIR
"/finclude/",
10940 #ifdef NATIVE_SYSTEM_HEADER_DIR
10941 /* Then search: <sysroot>/usr/include/finclude/<multilib> */
10942 add_sysrooted_hdrs_prefix (&prefixes
, NATIVE_SYSTEM_HEADER_DIR
"/finclude/",
10946 const char *path
= find_a_file (&include_prefixes
, argv
[1], R_OK
, false);
10948 result
= concat (argv
[0], path
, NULL
);
10951 path
= find_a_file (&prefixes
, argv
[1], R_OK
, false);
10953 result
= concat (argv
[0], path
, NULL
);
10956 path_prefix_reset (&prefixes
);
10960 /* If any character in ORIG fits QUOTE_P (_, P), reallocate the string
10961 so as to precede every one of them with a backslash. Return the
10962 original string or the reallocated one. */
10964 static inline char *
10965 quote_string (char *orig
, bool (*quote_p
)(char, void *), void *p
)
10967 int len
, number_of_space
= 0;
10969 for (len
= 0; orig
[len
]; len
++)
10970 if (quote_p (orig
[len
], p
))
10973 if (number_of_space
)
10975 char *new_spec
= (char *) xmalloc (len
+ number_of_space
+ 1);
10977 for (j
= 0, k
= 0; j
<= len
; j
++, k
++)
10979 if (quote_p (orig
[j
], p
))
10980 new_spec
[k
++] = '\\';
10981 new_spec
[k
] = orig
[j
];
10990 /* Return true iff C is any of the characters convert_white_space
10994 whitespace_to_convert_p (char c
, void *)
10996 return (c
== ' ' || c
== '\t');
10999 /* Insert backslash before spaces in ORIG (usually a file path), to
11000 avoid being broken by spec parser.
11002 This function is needed as do_spec_1 treats white space (' ' and '\t')
11003 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
11004 the file name should be treated as a single argument rather than being
11005 broken into multiple. Solution is to insert '\\' before the space in a
11008 This function converts and only converts all occurrence of ' '
11009 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
11011 "a b" -> "a\\ \\ b"
11013 "a\\ b" -> "a\\\\ b"
11015 orig: input null-terminating string that was allocated by xalloc. The
11016 memory it points to might be freed in this function. Behavior undefined
11017 if ORIG wasn't xalloced or was freed already at entry.
11019 Return: ORIG if no conversion needed. Otherwise a newly allocated string
11020 that was converted from ORIG. */
11023 convert_white_space (char *orig
)
11025 return quote_string (orig
, whitespace_to_convert_p
, NULL
);
11028 /* Return true iff C matches any of the spec active characters. */
11030 quote_spec_char_p (char c
, void *)
11047 /* Like convert_white_space, but deactivate all active spec chars by
11050 static inline char *
11051 quote_spec (char *orig
)
11053 return quote_string (orig
, quote_spec_char_p
, NULL
);
11056 /* Like quote_spec, but also turn an empty string into the spec for an
11059 static inline char *
11060 quote_spec_arg (char *orig
)
11065 return xstrdup ("%\"");
11068 return quote_spec (orig
);
11071 /* Restore all state within gcc.cc to the initial state, so that the driver
11072 code can be safely re-run in-process.
11074 Many const char * variables are referenced by static specs (see
11075 INIT_STATIC_SPEC above). These variables are restored to their default
11076 values by a simple loop over the static specs.
11078 For other variables, we directly restore them all to their initial
11079 values (often implicitly 0).
11081 Free the various obstacks in this file, along with "opts_obstack"
11084 This function also restores any environment variables that were changed. */
11087 driver::finalize ()
11090 diagnostic_finish (global_dc
);
11093 at_file_supplied
= 0;
11094 print_help_list
= 0;
11096 verbose_only_flag
= 0;
11097 print_subprocess_help
= 0;
11099 report_times_to_file
= NULL
;
11100 target_system_root
= DEFAULT_TARGET_SYSTEM_ROOT
;
11101 target_system_root_changed
= 0;
11102 target_sysroot_suffix
= 0;
11103 target_sysroot_hdrs_suffix
= 0;
11104 save_temps_flag
= SAVE_TEMPS_NONE
;
11105 save_temps_overrides_dumpdir
= false;
11106 dumpdir_trailing_dash_added
= false;
11109 free (dumpbase_ext
);
11111 dumpdir
= dumpbase
= dumpbase_ext
= outbase
= NULL
;
11112 dumpdir_length
= outbase_length
= 0;
11113 spec_machine
= DEFAULT_TARGET_MACHINE
;
11114 greatest_status
= 1;
11116 obstack_free (&obstack
, NULL
);
11117 obstack_free (&opts_obstack
, NULL
); /* in opts.cc */
11118 obstack_free (&collect_obstack
, NULL
);
11120 link_command_spec
= LINK_COMMAND_SPEC
;
11122 obstack_free (&multilib_obstack
, NULL
);
11124 user_specs_head
= NULL
;
11125 user_specs_tail
= NULL
;
11127 /* Within the "compilers" vec, the fields "suffix" and "spec" were
11128 statically allocated for the default compilers, but dynamically
11129 allocated for additional compilers. Delete them for the latter. */
11130 for (int i
= n_default_compilers
; i
< n_compilers
; i
++)
11132 free (const_cast <char *> (compilers
[i
].suffix
));
11133 free (const_cast <char *> (compilers
[i
].spec
));
11135 XDELETEVEC (compilers
);
11139 linker_options
.truncate (0);
11140 assembler_options
.truncate (0);
11141 preprocessor_options
.truncate (0);
11143 path_prefix_reset (&exec_prefixes
);
11144 path_prefix_reset (&startfile_prefixes
);
11145 path_prefix_reset (&include_prefixes
);
11147 machine_suffix
= 0;
11148 just_machine_suffix
= 0;
11149 gcc_exec_prefix
= 0;
11150 gcc_libexec_prefix
= 0;
11151 set_static_spec_shared (&md_exec_prefix
, MD_EXEC_PREFIX
);
11152 set_static_spec_shared (&md_startfile_prefix
, MD_STARTFILE_PREFIX
);
11153 set_static_spec_shared (&md_startfile_prefix_1
, MD_STARTFILE_PREFIX_1
);
11155 multilib_os_dir
= 0;
11158 /* Free any specs dynamically-allocated by set_spec.
11159 These will be at the head of the list, before the
11160 statically-allocated ones. */
11163 while (specs
!= static_specs
)
11165 spec_list
*next
= specs
->next
;
11166 free (const_cast <char *> (specs
->name
));
11172 for (unsigned i
= 0; i
< ARRAY_SIZE (static_specs
); i
++)
11174 spec_list
*sl
= &static_specs
[i
];
11177 free (const_cast <char *> (*(sl
->ptr_spec
)));
11178 sl
->alloc_p
= false;
11180 *(sl
->ptr_spec
) = sl
->default_ptr
;
11183 extra_specs
= NULL
;
11186 processing_spec_function
= 0;
11194 execution_count
= 0;
11197 temp_filename
= NULL
;
11198 temp_filename_length
= 0;
11199 always_delete_queue
= NULL
;
11200 failure_delete_queue
= NULL
;
11202 XDELETEVEC (switches
);
11205 n_switches_alloc
= 0;
11208 compare_debug_second
= 0;
11209 compare_debug_opt
= NULL
;
11210 for (int i
= 0; i
< 2; i
++)
11212 switches_debug_check
[i
] = NULL
;
11213 n_switches_debug_check
[i
] = 0;
11214 n_switches_alloc_debug_check
[i
] = 0;
11215 debug_check_temp_file
[i
] = NULL
;
11218 XDELETEVEC (infiles
);
11221 n_infiles_alloc
= 0;
11223 combine_inputs
= false;
11224 added_libraries
= 0;
11225 XDELETEVEC (outfiles
);
11228 last_language_n_infiles
= 0;
11229 gcc_input_filename
= NULL
;
11230 input_file_number
= 0;
11231 input_filename_length
= 0;
11232 basename_length
= 0;
11233 suffixed_basename_length
= 0;
11234 input_basename
= NULL
;
11235 input_suffix
= NULL
;
11236 /* We don't need to purge "input_stat", just to unset "input_stat_set". */
11237 input_stat_set
= 0;
11238 input_file_compiler
= NULL
;
11240 delete_this_arg
= 0;
11241 this_is_output_file
= 0;
11242 this_is_library_file
= 0;
11243 this_is_linker_script
= 0;
11244 input_from_pipe
= 0;
11245 suffix_subst
= NULL
;
11250 used_arg
.finalize ();
11254 Targets can provide configure-time default options in
11255 OPTION_DEFAULT_SPECS. The jit needs to access these, but
11256 they are expressed in the spec language.
11258 Run just enough of the driver to be able to expand these
11259 specs, and then call the callback CB on each
11260 such option. The options strings are *without* a leading
11261 '-' character e.g. ("march=x86-64"). Finally, clean up. */
11264 driver_get_configure_time_options (void (*cb
) (const char *option
,
11270 obstack_init (&obstack
);
11271 init_opts_obstack ();
11274 for (i
= 0; i
< ARRAY_SIZE (option_default_specs
); i
++)
11275 do_option_spec (option_default_specs
[i
].name
,
11276 option_default_specs
[i
].spec
);
11278 for (i
= 0; (int) i
< n_switches
; i
++)
11280 gcc_assert (switches
[i
].part1
);
11281 (*cb
) (switches
[i
].part1
, user_data
);
11284 obstack_free (&opts_obstack
, NULL
);
11285 obstack_free (&obstack
, NULL
);