1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
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". */
30 #define INCLUDE_STRING
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"
47 #include "opts-jobserver.h"
48 #include "common/common-target.h"
52 /* Manage the manipulation of env vars.
54 We poison "getenv" and "putenv", so that all enviroment-handling is
55 done through this class. Note that poisoning happens in the
56 preprocessor at the identifier level, and doesn't distinguish between
60 Hence we need to use "get" for the accessor method, not "getenv". */
65 void init (bool can_restore
, bool debug
);
66 const char *get (const char *name
);
67 void xput (const char *string
);
82 /* The singleton instance of class env_manager. */
84 static env_manager env
;
86 /* Initializer for class env_manager.
88 We can't do this as a constructor since we have a statically
89 allocated instance ("env" above). */
92 env_manager::init (bool can_restore
, bool debug
)
94 m_can_restore
= can_restore
;
98 /* Get the value of NAME within the environment. Essentially
99 a wrapper for ::getenv, but adding logging, and the possibility
100 of caching results. */
103 env_manager::get (const char *name
)
105 const char *result
= ::getenv (name
);
107 fprintf (stderr
, "env_manager::getenv (%s) -> %s\n", name
, result
);
111 /* Put the given KEY=VALUE entry STRING into the environment.
112 If the env_manager was initialized with CAN_RESTORE set, then
113 also record the old value of KEY within the environment, so that it
114 can be later restored. */
117 env_manager::xput (const char *string
)
120 fprintf (stderr
, "env_manager::xput (%s)\n", string
);
122 fnotice (stderr
, "%s\n", string
);
126 char *equals
= strchr (const_cast <char *> (string
), '=');
130 kv
.m_key
= xstrndup (string
, equals
- string
);
131 const char *cur_value
= ::getenv (kv
.m_key
);
133 fprintf (stderr
, "saving old value: %s\n",cur_value
);
134 kv
.m_value
= cur_value
? xstrdup (cur_value
) : NULL
;
135 m_keys
.safe_push (kv
);
138 ::putenv (CONST_CAST (char *, string
));
141 /* Undo any xputenv changes made since last restore.
142 Can only be called if the env_manager was initialized with
143 CAN_RESTORE enabled. */
146 env_manager::restore ()
151 gcc_assert (m_can_restore
);
153 FOR_EACH_VEC_ELT_REVERSE (m_keys
, i
, item
)
156 printf ("restoring saved key: %s value: %s\n", item
->m_key
, item
->m_value
);
158 ::setenv (item
->m_key
, item
->m_value
, 1);
160 ::unsetenv (item
->m_key
);
162 free (item
->m_value
);
168 /* Forbid other uses of getenv and putenv. */
169 #if (GCC_VERSION >= 3000)
170 #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 *);
452 /* The Specs Language
454 Specs are strings containing lines, each of which (if not blank)
455 is made up of a program name, and arguments separated by spaces.
456 The program name must be exact and start from root, since no path
457 is searched and it is unreliable to depend on the current working directory.
458 Redirection of input or output is not supported; the subprograms must
459 accept filenames saying what files to read and write.
461 In addition, the specs can contain %-sequences to substitute variable text
462 or for conditional text. Here is a table of all defined %-sequences.
463 Note that spaces are not generated automatically around the results of
464 expanding these sequences; therefore, you can concatenate them together
465 or with constant text in a single argument.
467 %% substitute one % into the program name or argument.
468 %" substitute an empty argument.
469 %i substitute the name of the input file being processed.
470 %b substitute the basename for outputs related with the input file
471 being processed. This is often a substring of the input file name,
472 up to (and not including) the last period but, unless %w is active,
473 it is affected by the directory selected by -save-temps=*, by
474 -dumpdir, and, in case of multiple compilations, even by -dumpbase
475 and -dumpbase-ext and, in case of linking, by the linker output
476 name. When %w is active, it derives the main output name only from
477 the input file base name; when it is not, it names aux/dump output
479 %B same as %b, but include the input file suffix (text after the last
482 substitute a file name that has suffix SUFFIX and is chosen
483 once per compilation, and mark the argument a la %d. To reduce
484 exposure to denial-of-service attacks, the file name is now
485 chosen in a way that is hard to predict even when previously
486 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
487 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
488 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
489 had been pre-processed. Previously, %g was simply substituted
490 with a file name chosen once per compilation, without regard
491 to any appended suffix (which was therefore treated just like
492 ordinary text), making such attacks more likely to succeed.
494 like %g, but if -pipe is in effect, expands simply to "-".
496 like %g, but if -pipe is in effect, expands to nothing. (We have both
497 %| and %m to accommodate differences between system assemblers; see
498 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
500 like %g, but generates a new temporary file name even if %uSUFFIX
503 substitutes the last file name generated with %uSUFFIX, generating a
504 new one if there is no such last file name. In the absence of any
505 %uSUFFIX, this is just like %gSUFFIX, except they don't share
506 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
507 would involve the generation of two distinct file names, one
508 for each `%g.s' and another for each `%U.s'. Previously, %U was
509 simply substituted with a file name chosen for the previous %u,
510 without regard to any appended suffix.
512 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
513 writable, and if save-temps is off; otherwise, substitute the name
514 of a temporary file, just like %u. This temporary file is not
515 meant for communication between processes, but rather as a junk
518 substitutes .SUFFIX for the suffixes of a matched switch's args when
519 it is subsequently output with %*. SUFFIX is terminated by the next
521 %d marks the argument containing or following the %d as a
522 temporary file name, so that file will be deleted if GCC exits
523 successfully. Unlike %g, this contributes no text to the argument.
524 %w marks the argument containing or following the %w as the
525 "output file" of this compilation. This puts the argument
526 into the sequence of arguments that %o will substitute later.
527 %V indicates that this compilation produces no "output file".
529 like %{...} but marks the last argument supplied within as a file
530 to be deleted on failure.
532 like %{...} but puts the result into a FILE and substitutes @FILE
533 if an @file argument has been supplied.
534 %o substitutes the names of all the output files, with spaces
535 automatically placed around them. You should write spaces
536 around the %o as well or the results are undefined.
537 %o is for use in the specs for running the linker.
538 Input files whose names have no recognized suffix are not compiled
539 at all, but they are included among the output files, so they will
541 %O substitutes the suffix for object files. Note that this is
542 handled specially when it immediately follows %g, %u, or %U
543 (with or without a suffix argument) because of the need for
544 those to form complete file names. The handling is such that
545 %O is treated exactly as if it had already been substituted,
546 except that %g, %u, and %U do not currently support additional
547 SUFFIX characters following %O as they would following, for
549 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
550 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
551 and -B options) and -imultilib as necessary.
552 %s current argument is the name of a library or startup file of some sort.
553 Search for that file in a standard list of directories
554 and substitute the full name found.
555 %T current argument is the name of a linker script.
556 Search for that file in the current list of directories to scan for
557 libraries. If the file is located, insert a --script option into the
558 command line followed by the full path name found. If the file is
559 not found then generate an error message.
560 Note: the current working directory is not searched.
561 %eSTR Print STR as an error message. STR is terminated by a newline.
562 Use this when inconsistent options are detected.
563 %nSTR Print STR as a notice. STR is terminated by a newline.
564 %x{OPTION} Accumulate an option for %X.
565 %X Output the accumulated linker options specified by compilations.
566 %Y Output the accumulated assembler options specified by compilations.
567 %Z Output the accumulated preprocessor options specified by compilations.
568 %a process ASM_SPEC as a spec.
569 This allows config.h to specify part of the spec for running as.
570 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
571 used here. This can be used to run a post-processor after the
572 assembler has done its job.
573 %D Dump out a -L option for each directory in startfile_prefixes.
574 If multilib_dir is set, extra entries are generated with it affixed.
575 %l process LINK_SPEC as a spec.
576 %L process LIB_SPEC as a spec.
577 %M Output multilib_os_dir.
578 %G process LIBGCC_SPEC as a spec.
579 %R Output the concatenation of target_system_root and
580 target_sysroot_suffix.
581 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
582 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
583 %C process CPP_SPEC as a spec.
584 %1 process CC1_SPEC as a spec.
585 %2 process CC1PLUS_SPEC as a spec.
586 %* substitute the variable part of a matched option. (See below.)
587 Note that each comma in the substituted string is replaced by
588 a single space. A space is appended after the last substition
589 unless there is more text in current sequence.
590 %<S remove all occurrences of -S from the command line.
591 Note - this command is position dependent. % commands in the
592 spec string before this one will see -S, % commands in the
593 spec string after this one will not.
594 %>S Similar to "%<S", but keep it in the GCC command line.
595 %<S* remove all occurrences of all switches beginning with -S from the
598 Call the named function FUNCTION, passing it ARGS. ARGS is
599 first processed as a nested spec string, then split into an
600 argument vector in the usual fashion. The function returns
601 a string which is processed as if it had appeared literally
602 as part of the current spec.
603 %{S} substitutes the -S switch, if that switch was given to GCC.
604 If that switch was not specified, this substitutes nothing.
605 Here S is a metasyntactic variable.
606 %{S*} substitutes all the switches specified to GCC whose names start
607 with -S. This is used for -o, -I, etc; switches that take
608 arguments. GCC considers `-o foo' as being one switch whose
609 name starts with `o'. %{o*} would substitute this text,
610 including the space; thus, two arguments would be generated.
611 %{S*&T*} likewise, but preserve order of S and T options (the order
612 of S and T in the spec is not significant). Can be any number
613 of ampersand-separated variables; for each the wild card is
614 optional. Useful for CPP as %{D*&U*&A*}.
616 %{S:X} substitutes X, if the -S switch was given to GCC.
617 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
618 %{S*:X} substitutes X if one or more switches whose names start
619 with -S was given to GCC. Normally X is substituted only
620 once, no matter how many such switches appeared. However,
621 if %* appears somewhere in X, then X will be substituted
622 once for each matching switch, with the %* replaced by the
623 part of that switch that matched the '*'. A space will be
624 appended after the last substition unless there is more
625 text in current sequence.
626 %{.S:X} substitutes X, if processing a file with suffix S.
627 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
628 %{,S:X} substitutes X, if processing a file which will use spec S.
629 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
631 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
632 combined with '!', '.', ',', and '*' as above binding stronger
634 If %* appears in X, all of the alternatives must be starred, and
635 only the first matching alternative is substituted.
636 %{%:function(args):X}
637 Call function named FUNCTION with args ARGS. If the function
638 returns non-NULL, then X is substituted, if it returns
639 NULL, it isn't substituted.
640 %{S:X; if S was given to GCC, substitutes X;
641 T:Y; else if T was given to GCC, substitutes Y;
642 :D} else substitutes D. There can be as many clauses as you need.
643 This may be combined with '.', '!', ',', '|', and '*' as above.
645 %(Spec) processes a specification defined in a specs file as *Spec:
647 The switch matching text S in a %{S}, %{S:X}, or similar construct can use
648 a backslash to ignore the special meaning of the character following it,
649 thus allowing literal matching of a character that is otherwise specially
650 treated. For example, %{std=iso9899\:1999:X} substitutes X if the
651 -std=iso9899:1999 option is given.
653 The conditional text X in a %{S:X} or similar construct may contain
654 other nested % constructs or spaces, or even newlines. They are
655 processed as usual, as described above. Trailing white space in X is
656 ignored. White space may also appear anywhere on the left side of the
657 colon in these constructs, except between . or * and the corresponding
660 The -O, -f, -g, -m, and -W switches are handled specifically in these
661 constructs. If another value of -O or the negated form of a -f, -m, or
662 -W switch is found later in the command line, the earlier switch
663 value is ignored, except with {S*} where S is just one letter; this
664 passes all matching options.
666 The character | at the beginning of the predicate text is used to indicate
667 that a command should be piped to the following command, but only if -pipe
670 Note that it is built into GCC which switches take arguments and which
671 do not. You might think it would be useful to generalize this to
672 allow each compiler's spec to say which switches take arguments. But
673 this cannot be done in a consistent fashion. GCC cannot even decide
674 which input files have been specified without knowing which switches
675 take arguments, and it must know which input files to compile in order
676 to tell which compilers to run.
678 GCC also knows implicitly that arguments starting in `-l' are to be
679 treated as compiler output files, and passed to the linker in their
680 proper position among the other output files. */
682 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
684 /* config.h can define ASM_SPEC to provide extra args to the assembler
685 or extra switch-translations. */
690 /* config.h can define ASM_FINAL_SPEC to run a post processor after
691 the assembler has run. */
692 #ifndef ASM_FINAL_SPEC
693 #define ASM_FINAL_SPEC \
695 objcopy --extract-dwo \
696 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
698 objcopy --strip-dwo \
699 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
703 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
704 or extra switch-translations. */
709 /* Operating systems can define OS_CC1_SPEC to provide extra args to cc1 and
710 cc1plus or extra switch-translations. The OS_CC1_SPEC is appended
711 to CC1_SPEC in the initialization of cc1_spec. */
713 #define OS_CC1_SPEC ""
716 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
717 or extra switch-translations. */
722 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
723 or extra switch-translations. */
725 #define CC1PLUS_SPEC ""
728 /* config.h can define LINK_SPEC to provide extra args to the linker
729 or extra switch-translations. */
734 /* config.h can define LIB_SPEC to override the default libraries. */
736 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
739 /* When using -fsplit-stack we need to wrap pthread_create, in order
740 to initialize the stack guard. We always use wrapping, rather than
741 shared library ordering, and we keep the wrapper function in
742 libgcc. This is not yet a real spec, though it could become one;
743 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
744 only works with GNU ld and gold. */
745 #ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
746 #define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
748 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
752 #define STATIC_LIBASAN_LIBS \
753 " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
754 #ifdef LIBASAN_EARLY_SPEC
755 #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
756 #elif defined(HAVE_LD_STATIC_DYNAMIC)
757 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
758 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
761 #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
765 #ifndef LIBASAN_EARLY_SPEC
766 #define LIBASAN_EARLY_SPEC ""
769 #ifndef LIBHWASAN_SPEC
770 #define STATIC_LIBHWASAN_LIBS \
771 " %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
772 #ifdef LIBHWASAN_EARLY_SPEC
773 #define LIBHWASAN_SPEC STATIC_LIBHWASAN_LIBS
774 #elif defined(HAVE_LD_STATIC_DYNAMIC)
775 #define LIBHWASAN_SPEC "%{static-libhwasan:" LD_STATIC_OPTION \
776 "} -lhwasan %{static-libhwasan:" LD_DYNAMIC_OPTION "}" \
777 STATIC_LIBHWASAN_LIBS
779 #define LIBHWASAN_SPEC "-lhwasan" STATIC_LIBHWASAN_LIBS
783 #ifndef LIBHWASAN_EARLY_SPEC
784 #define LIBHWASAN_EARLY_SPEC ""
788 #define STATIC_LIBTSAN_LIBS \
789 " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
790 #ifdef LIBTSAN_EARLY_SPEC
791 #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
792 #elif defined(HAVE_LD_STATIC_DYNAMIC)
793 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
794 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
797 #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
801 #ifndef LIBTSAN_EARLY_SPEC
802 #define LIBTSAN_EARLY_SPEC ""
806 #define STATIC_LIBLSAN_LIBS \
807 " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
808 #ifdef LIBLSAN_EARLY_SPEC
809 #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
810 #elif defined(HAVE_LD_STATIC_DYNAMIC)
811 #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
812 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
815 #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
819 #ifndef LIBLSAN_EARLY_SPEC
820 #define LIBLSAN_EARLY_SPEC ""
823 #ifndef LIBUBSAN_SPEC
824 #define STATIC_LIBUBSAN_LIBS \
825 " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
826 #ifdef HAVE_LD_STATIC_DYNAMIC
827 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
828 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
831 #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
835 /* Linker options for compressed debug sections. */
836 #if HAVE_LD_COMPRESS_DEBUG == 0
837 /* No linker support. */
838 #define LINK_COMPRESS_DEBUG_SPEC \
839 " %{gz*:%e-gz is not supported in this configuration} "
840 #elif HAVE_LD_COMPRESS_DEBUG == 1
841 /* ELF gABI style. */
842 #define LINK_COMPRESS_DEBUG_SPEC \
843 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
844 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
845 " %{gz=zstd:%e-gz=zstd is not supported in this configuration} " \
846 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
847 #elif HAVE_LD_COMPRESS_DEBUG == 2
848 /* ELF gABI style and ZSTD. */
849 #define LINK_COMPRESS_DEBUG_SPEC \
850 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
851 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
852 " %{gz=zstd:" LD_COMPRESS_DEBUG_OPTION "=zstd}" \
853 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
855 #error Unknown value for HAVE_LD_COMPRESS_DEBUG.
858 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
861 #if defined(REAL_LIBGCC_SPEC)
862 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
863 #elif defined(LINK_LIBGCC_SPECIAL_1)
864 /* Have gcc do the search for libgcc.a. */
865 #define LIBGCC_SPEC "libgcc.a%s"
867 #define LIBGCC_SPEC "-lgcc"
871 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
872 #ifndef STARTFILE_SPEC
873 #define STARTFILE_SPEC \
874 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
877 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
879 #define ENDFILE_SPEC ""
883 #define LINKER_NAME "collect2"
886 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
887 #define ASM_MAP " %{ffile-prefix-map=*:--debug-prefix-map %*} %{fdebug-prefix-map=*:--debug-prefix-map %*}"
892 /* Assembler options for compressed debug sections. */
893 #if HAVE_LD_COMPRESS_DEBUG == 0
894 /* Reject if the linker cannot write compressed debug sections. */
895 #define ASM_COMPRESS_DEBUG_SPEC \
896 " %{gz*:%e-gz is not supported in this configuration} "
897 #else /* HAVE_LD_COMPRESS_DEBUG >= 1 */
898 #if HAVE_AS_COMPRESS_DEBUG == 0
899 /* No assembler support. Ignore silently. */
900 #define ASM_COMPRESS_DEBUG_SPEC \
902 #elif HAVE_AS_COMPRESS_DEBUG == 1
903 /* ELF gABI style. */
904 #define ASM_COMPRESS_DEBUG_SPEC \
905 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
906 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
907 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
908 #elif HAVE_AS_COMPRESS_DEBUG == 2
909 /* ELF gABI style and ZSTD. */
910 #define ASM_COMPRESS_DEBUG_SPEC \
911 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
912 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
913 " %{gz=zstd:" AS_COMPRESS_DEBUG_OPTION "=zstd}" \
914 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
916 #error Unknown value for HAVE_AS_COMPRESS_DEBUG.
918 #endif /* HAVE_LD_COMPRESS_DEBUG >= 1 */
920 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
921 to the assembler, when compiling assembly sources only. */
922 #ifndef ASM_DEBUG_SPEC
923 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
924 /* If --gdwarf-N is supported and as can handle even compiler generated
925 .debug_line with it, supply --gdwarf-N in ASM_DEBUG_OPTION_SPEC rather
926 than in ASM_DEBUG_SPEC, so that it applies to both .s and .c etc.
928 # define ASM_DEBUG_DWARF_OPTION ""
929 # elif defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && !defined(HAVE_LD_BROKEN_PE_DWARF5)
930 # define ASM_DEBUG_DWARF_OPTION "%{%:dwarf-version-gt(4):--gdwarf-5;" \
931 "%:dwarf-version-gt(3):--gdwarf-4;" \
932 "%:dwarf-version-gt(2):--gdwarf-3;" \
935 # define ASM_DEBUG_DWARF_OPTION "--gdwarf2"
937 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
938 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):" \
939 ASM_DEBUG_DWARF_OPTION "}}" ASM_MAP
942 #ifndef ASM_DEBUG_SPEC
943 # define ASM_DEBUG_SPEC ""
946 /* Define ASM_DEBUG_OPTION_SPEC to be a spec suitable for translating '-g'
947 to the assembler when compiling all sources. */
948 #ifndef ASM_DEBUG_OPTION_SPEC
949 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
950 # define ASM_DEBUG_OPTION_DWARF_OPT \
951 "%{%:dwarf-version-gt(4):--gdwarf-5 ;" \
952 "%:dwarf-version-gt(3):--gdwarf-4 ;" \
953 "%:dwarf-version-gt(2):--gdwarf-3 ;" \
955 # if defined(DWARF2_DEBUGGING_INFO)
956 # define ASM_DEBUG_OPTION_SPEC "%{g*:%{%:debug-level-gt(0):" \
957 ASM_DEBUG_OPTION_DWARF_OPT "}}"
961 #ifndef ASM_DEBUG_OPTION_SPEC
962 # define ASM_DEBUG_OPTION_SPEC ""
965 /* Here is the spec for running the linker, after compiling all files. */
967 /* This is overridable by the target in case they need to specify the
968 -lgcc and -lc order specially, yet not require them to override all
969 of LINK_COMMAND_SPEC. */
970 #ifndef LINK_GCC_C_SEQUENCE_SPEC
971 #define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
974 #ifndef LINK_SSP_SPEC
975 #ifdef TARGET_LIBC_PROVIDES_SSP
976 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
977 "|fstack-protector-strong|fstack-protector-explicit:}"
979 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
980 "|fstack-protector-strong|fstack-protector-explicit" \
981 ":-lssp_nonshared -lssp}"
985 #ifdef ENABLE_DEFAULT_PIE
986 #define PIE_SPEC "!no-pie"
987 #define NO_FPIE1_SPEC "fno-pie"
988 #define FPIE1_SPEC NO_FPIE1_SPEC ":;"
989 #define NO_FPIE2_SPEC "fno-PIE"
990 #define FPIE2_SPEC NO_FPIE2_SPEC ":;"
991 #define NO_FPIE_SPEC NO_FPIE1_SPEC "|" NO_FPIE2_SPEC
992 #define FPIE_SPEC NO_FPIE_SPEC ":;"
993 #define NO_FPIC1_SPEC "fno-pic"
994 #define FPIC1_SPEC NO_FPIC1_SPEC ":;"
995 #define NO_FPIC2_SPEC "fno-PIC"
996 #define FPIC2_SPEC NO_FPIC2_SPEC ":;"
997 #define NO_FPIC_SPEC NO_FPIC1_SPEC "|" NO_FPIC2_SPEC
998 #define FPIC_SPEC NO_FPIC_SPEC ":;"
999 #define NO_FPIE1_AND_FPIC1_SPEC NO_FPIE1_SPEC "|" NO_FPIC1_SPEC
1000 #define FPIE1_OR_FPIC1_SPEC NO_FPIE1_AND_FPIC1_SPEC ":;"
1001 #define NO_FPIE2_AND_FPIC2_SPEC NO_FPIE2_SPEC "|" NO_FPIC2_SPEC
1002 #define FPIE2_OR_FPIC2_SPEC NO_FPIE2_AND_FPIC2_SPEC ":;"
1003 #define NO_FPIE_AND_FPIC_SPEC NO_FPIE_SPEC "|" NO_FPIC_SPEC
1004 #define FPIE_OR_FPIC_SPEC NO_FPIE_AND_FPIC_SPEC ":;"
1006 #define PIE_SPEC "pie"
1007 #define FPIE1_SPEC "fpie"
1008 #define NO_FPIE1_SPEC FPIE1_SPEC ":;"
1009 #define FPIE2_SPEC "fPIE"
1010 #define NO_FPIE2_SPEC FPIE2_SPEC ":;"
1011 #define FPIE_SPEC FPIE1_SPEC "|" FPIE2_SPEC
1012 #define NO_FPIE_SPEC FPIE_SPEC ":;"
1013 #define FPIC1_SPEC "fpic"
1014 #define NO_FPIC1_SPEC FPIC1_SPEC ":;"
1015 #define FPIC2_SPEC "fPIC"
1016 #define NO_FPIC2_SPEC FPIC2_SPEC ":;"
1017 #define FPIC_SPEC FPIC1_SPEC "|" FPIC2_SPEC
1018 #define NO_FPIC_SPEC FPIC_SPEC ":;"
1019 #define FPIE1_OR_FPIC1_SPEC FPIE1_SPEC "|" FPIC1_SPEC
1020 #define NO_FPIE1_AND_FPIC1_SPEC FPIE1_OR_FPIC1_SPEC ":;"
1021 #define FPIE2_OR_FPIC2_SPEC FPIE2_SPEC "|" FPIC2_SPEC
1022 #define NO_FPIE2_AND_FPIC2_SPEC FPIE1_OR_FPIC2_SPEC ":;"
1023 #define FPIE_OR_FPIC_SPEC FPIE_SPEC "|" FPIC_SPEC
1024 #define NO_FPIE_AND_FPIC_SPEC FPIE_OR_FPIC_SPEC ":;"
1027 #ifndef LINK_PIE_SPEC
1030 #define LD_PIE_SPEC "-pie"
1033 #define LD_PIE_SPEC ""
1035 #define LINK_PIE_SPEC "%{static|shared|r:;" PIE_SPEC ":" LD_PIE_SPEC "} "
1038 #ifndef LINK_BUILDID_SPEC
1039 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
1040 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
1044 #ifndef LTO_PLUGIN_SPEC
1045 #define LTO_PLUGIN_SPEC ""
1048 /* Conditional to test whether the LTO plugin is used or not.
1049 FIXME: For slim LTO we will need to enable plugin unconditionally. This
1050 still cause problems with PLUGIN_LD != LD and when plugin is built but
1051 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
1052 plugin only when LTO is enabled. We still honor explicit
1053 -fuse-linker-plugin if the linker used understands -plugin. */
1055 /* The linker has some plugin support. */
1056 #if HAVE_LTO_PLUGIN > 0
1057 /* The linker used has full plugin support, use LTO plugin by default. */
1058 #if HAVE_LTO_PLUGIN == 2
1059 #define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
1060 #define PLUGIN_COND_CLOSE "}"
1062 /* The linker used has limited plugin support, use LTO plugin with explicit
1063 -fuse-linker-plugin. */
1064 #define PLUGIN_COND "fuse-linker-plugin"
1065 #define PLUGIN_COND_CLOSE ""
1067 #define LINK_PLUGIN_SPEC \
1068 "%{" PLUGIN_COND": \
1069 -plugin %(linker_plugin_file) \
1070 -plugin-opt=%(lto_wrapper) \
1071 -plugin-opt=-fresolution=%u.res \
1072 " LTO_PLUGIN_SPEC "\
1073 %{flinker-output=*:-plugin-opt=-linker-output-known} \
1074 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
1075 }" PLUGIN_COND_CLOSE
1077 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
1078 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
1079 %e-fuse-linker-plugin is not supported in this configuration}"
1082 /* Linker command line options for -fsanitize= early on the command line. */
1083 #ifndef SANITIZER_EARLY_SPEC
1084 #define SANITIZER_EARLY_SPEC "\
1085 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
1086 %{%:sanitize(hwaddress):" LIBHWASAN_EARLY_SPEC "} \
1087 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
1088 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}"
1091 /* Linker command line options for -fsanitize= late on the command line. */
1092 #ifndef SANITIZER_SPEC
1093 #define SANITIZER_SPEC "\
1094 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
1095 %{static:%ecannot specify -static with -fsanitize=address}}\
1096 %{%:sanitize(hwaddress):" LIBHWASAN_SPEC "\
1097 %{static:%ecannot specify -static with -fsanitize=hwaddress}}\
1098 %{%:sanitize(thread):" LIBTSAN_SPEC "\
1099 %{static:%ecannot specify -static with -fsanitize=thread}}\
1100 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
1101 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}"
1104 #ifndef POST_LINK_SPEC
1105 #define POST_LINK_SPEC ""
1108 /* This is the spec to use, once the code for creating the vtable
1109 verification runtime library, libvtv.so, has been created. Currently
1110 the vtable verification runtime functions are in libstdc++, so we use
1111 the spec just below this one. */
1112 #ifndef VTABLE_VERIFICATION_SPEC
1113 #if ENABLE_VTABLE_VERIFY
1114 #define VTABLE_VERIFICATION_SPEC "\
1115 %{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1116 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1118 #define VTABLE_VERIFICATION_SPEC "\
1119 %{fvtable-verify=none:} \
1120 %{fvtable-verify=std: \
1121 %e-fvtable-verify=std is not supported in this configuration} \
1122 %{fvtable-verify=preinit: \
1123 %e-fvtable-verify=preinit is not supported in this configuration}"
1127 /* -u* was put back because both BSD and SysV seem to support it. */
1128 /* %{static|no-pie|static-pie:} simply prevents an error message:
1129 1. If the target machine doesn't handle -static.
1130 2. If PIE isn't enabled by default.
1131 3. If the target machine doesn't handle -static-pie.
1133 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1134 scripts which exist in user specified directories, or in standard
1136 /* We pass any -flto flags on to the linker, which is expected
1137 to understand them. In practice, this means it had better be collect2. */
1138 /* %{e*} includes -export-dynamic; see comment in common.opt. */
1139 #ifndef LINK_COMMAND_SPEC
1140 #define LINK_COMMAND_SPEC "\
1141 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1144 "%{flto|flto=*:%<fcompare-debug*} \
1145 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
1146 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
1147 "%X %{o*} %{e*} %{N} %{n} %{r}\
1148 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1149 %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
1150 VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
1151 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1152 %:include(libgomp.spec)%(link_gomp)}\
1153 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1154 %(mflib) " STACK_SPLIT_SPEC "\
1155 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
1156 %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1157 %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1160 #ifndef LINK_LIBGCC_SPEC
1161 /* Generate -L options for startfile prefix list. */
1162 # define LINK_LIBGCC_SPEC "%D"
1165 #ifndef STARTFILE_PREFIX_SPEC
1166 # define STARTFILE_PREFIX_SPEC ""
1169 #ifndef SYSROOT_SPEC
1170 # define SYSROOT_SPEC "--sysroot=%R"
1173 #ifndef SYSROOT_SUFFIX_SPEC
1174 # define SYSROOT_SUFFIX_SPEC ""
1177 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1178 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
1181 static const char *asm_debug
= ASM_DEBUG_SPEC
;
1182 static const char *asm_debug_option
= ASM_DEBUG_OPTION_SPEC
;
1183 static const char *cpp_spec
= CPP_SPEC
;
1184 static const char *cc1_spec
= CC1_SPEC OS_CC1_SPEC
;
1185 static const char *cc1plus_spec
= CC1PLUS_SPEC
;
1186 static const char *link_gcc_c_sequence_spec
= LINK_GCC_C_SEQUENCE_SPEC
;
1187 static const char *link_ssp_spec
= LINK_SSP_SPEC
;
1188 static const char *asm_spec
= ASM_SPEC
;
1189 static const char *asm_final_spec
= ASM_FINAL_SPEC
;
1190 static const char *link_spec
= LINK_SPEC
;
1191 static const char *lib_spec
= LIB_SPEC
;
1192 static const char *link_gomp_spec
= "";
1193 static const char *libgcc_spec
= LIBGCC_SPEC
;
1194 static const char *endfile_spec
= ENDFILE_SPEC
;
1195 static const char *startfile_spec
= STARTFILE_SPEC
;
1196 static const char *linker_name_spec
= LINKER_NAME
;
1197 static const char *linker_plugin_file_spec
= "";
1198 static const char *lto_wrapper_spec
= "";
1199 static const char *lto_gcc_spec
= "";
1200 static const char *post_link_spec
= POST_LINK_SPEC
;
1201 static const char *link_command_spec
= LINK_COMMAND_SPEC
;
1202 static const char *link_libgcc_spec
= LINK_LIBGCC_SPEC
;
1203 static const char *startfile_prefix_spec
= STARTFILE_PREFIX_SPEC
;
1204 static const char *sysroot_spec
= SYSROOT_SPEC
;
1205 static const char *sysroot_suffix_spec
= SYSROOT_SUFFIX_SPEC
;
1206 static const char *sysroot_hdrs_suffix_spec
= SYSROOT_HEADERS_SUFFIX_SPEC
;
1207 static const char *self_spec
= "";
1209 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1210 There should be no need to override these in target dependent files,
1211 but we need to copy them to the specs file so that newer versions
1212 of the GCC driver can correctly drive older tool chains with the
1213 appropriate -B options. */
1215 /* When cpplib handles traditional preprocessing, get rid of this, and
1216 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1217 that we default the front end language better. */
1218 static const char *trad_capable_cpp
=
1219 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1221 /* We don't wrap .d files in %W{} since a missing .d file, and
1222 therefore no dependency entry, confuses make into thinking a .o
1223 file that happens to exist is up-to-date. */
1224 static const char *cpp_unique_options
=
1225 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1226 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1227 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1228 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1229 %{Mmodules} %{Mno-modules}\
1230 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1231 %{remap} %{%:debug-level-gt(2):-dD}\
1232 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1233 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1236 /* This contains cpp options which are common with cc1_options and are passed
1237 only when preprocessing only to avoid duplication. We pass the cc1 spec
1238 options to the preprocessor so that it the cc1 spec may manipulate
1239 options used to set target flags. Those special target flags settings may
1240 in turn cause preprocessor symbols to be defined specially. */
1241 static const char *cpp_options
=
1242 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1243 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1244 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1245 %{undef} %{save-temps*:-fpch-preprocess}";
1247 /* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
1249 Make it easy for a language to override the argument for the
1250 %:dumps specs function call. */
1251 #define DUMPS_OPTIONS(EXTS) \
1252 "%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps(" EXTS ")"
1254 /* This contains cpp options which are not passed when the preprocessor
1255 output will be used by another program. */
1256 static const char *cpp_debug_options
= DUMPS_OPTIONS ("");
1258 /* NB: This is shared amongst all front-ends, except for Ada. */
1259 static const char *cc1_options
=
1260 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1261 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1262 %1 %{!Q:-quiet} %(cpp_debug_options) %{m*} %{aux-info*}\
1263 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1264 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1265 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1266 %{-target-help:--target-help}\
1267 %{-version:--version}\
1268 %{-help=*:--help=%*}\
1269 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %w%b.s}}}\
1270 %{fsyntax-only:-o %j} %{-param*}\
1271 %{coverage:-fprofile-arcs -ftest-coverage}\
1272 %{fprofile-arcs|fprofile-generate*|coverage:\
1273 %{!fprofile-update=single:\
1274 %{pthread:-fprofile-update=prefer-atomic}}}";
1276 static const char *asm_options
=
1277 "%{-target-help:%:print-asm-header()} "
1279 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
1280 to the assembler equivalents. */
1281 "%{v} %{w:-W} %{I*} "
1283 "%(asm_debug_option)"
1284 ASM_COMPRESS_DEBUG_SPEC
1285 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1287 static const char *invoke_as
=
1288 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1290 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1291 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1295 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1296 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1300 /* Some compilers have limits on line lengths, and the multilib_select
1301 and/or multilib_matches strings can be very long, so we build them at
1303 static struct obstack multilib_obstack
;
1304 static const char *multilib_select
;
1305 static const char *multilib_matches
;
1306 static const char *multilib_defaults
;
1307 static const char *multilib_exclusions
;
1308 static const char *multilib_reuse
;
1310 /* Check whether a particular argument is a default argument. */
1312 #ifndef MULTILIB_DEFAULTS
1313 #define MULTILIB_DEFAULTS { "" }
1316 static const char *const multilib_defaults_raw
[] = MULTILIB_DEFAULTS
;
1318 #ifndef DRIVER_SELF_SPECS
1319 #define DRIVER_SELF_SPECS ""
1322 /* Linking to libgomp implies pthreads. This is particularly important
1323 for targets that use different start files and suchlike. */
1324 #ifndef GOMP_SELF_SPECS
1325 #define GOMP_SELF_SPECS \
1326 "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1330 /* Likewise for -fgnu-tm. */
1331 #ifndef GTM_SELF_SPECS
1332 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1335 static const char *const driver_self_specs
[] = {
1336 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1337 DRIVER_SELF_SPECS
, CONFIGURE_SPECS
, GOMP_SELF_SPECS
, GTM_SELF_SPECS
,
1338 /* This discards -fmultiflags at the end of self specs processing in the
1339 driver, so that it is effectively Ignored, without actually marking it as
1340 Ignored, which would get it discarded before self specs could remap it. */
1344 #ifndef OPTION_DEFAULT_SPECS
1345 #define OPTION_DEFAULT_SPECS { "", "" }
1354 static const struct default_spec
1355 option_default_specs
[] = { OPTION_DEFAULT_SPECS
};
1359 struct user_specs
*next
;
1360 const char *filename
;
1363 static struct user_specs
*user_specs_head
, *user_specs_tail
;
1366 /* Record the mapping from file suffixes for compilation specs. */
1370 const char *suffix
; /* Use this compiler for input files
1371 whose names end in this suffix. */
1373 const char *spec
; /* To use this compiler, run this spec. */
1375 const char *cpp_spec
; /* If non-NULL, substitute this spec
1376 for `%C', rather than the usual
1378 int combinable
; /* If nonzero, compiler can deal with
1379 multiple source files at once (IMA). */
1380 int needs_preprocessing
; /* If nonzero, source files need to
1381 be run through a preprocessor. */
1384 /* Pointer to a vector of `struct compiler' that gives the spec for
1385 compiling a file, based on its suffix.
1386 A file that does not end in any of these suffixes will be passed
1387 unchanged to the loader and nothing else will be done to it.
1389 An entry containing two 0s is used to terminate the vector.
1391 If multiple entries match a file, the last matching one is used. */
1393 static struct compiler
*compilers
;
1395 /* Number of entries in `compilers', not counting the null terminator. */
1397 static int n_compilers
;
1399 /* The default list of file name suffixes and their compilation specs. */
1401 static const struct compiler default_compilers
[] =
1403 /* Add lists of suffixes of known languages here. If those languages
1404 were not present when we built the driver, we will hit these copies
1405 and be given a more meaningful error than "file not used since
1406 linking is not done". */
1407 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1408 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1409 {".mii", "#Objective-C++", 0, 0, 0},
1410 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1411 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1412 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1413 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1414 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1415 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1416 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1417 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1418 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1419 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1420 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1421 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1422 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1423 {".r", "#Ratfor", 0, 0, 0},
1424 {".go", "#Go", 0, 1, 0},
1425 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1426 {".mod", "#Modula-2", 0, 0, 0}, {".m2i", "#Modula-2", 0, 0, 0},
1427 /* Next come the entries for C. */
1428 {".c", "@c", 0, 0, 1},
1430 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1431 external preprocessor if -save-temps is given. */
1432 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1435 %eGNU C no longer supports -traditional without -E}\
1436 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1437 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1438 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1440 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1441 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1442 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1444 "%{!E:%e-E or -x required when input is from standard input}\
1445 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1446 {".h", "@c-header", 0, 0, 0},
1448 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1449 external preprocessor if -save-temps is given. */
1450 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1452 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1453 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1454 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1456 %{!fsyntax-only:%{!S:-o %g.s} \
1457 %{!fdump-ada-spec*:%{!o*:--output-pch %i.gch}\
1458 %W{o*:--output-pch %*}}%V}}\
1459 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1460 cc1 %(cpp_unique_options) %(cc1_options)\
1461 %{!fsyntax-only:%{!S:-o %g.s} \
1462 %{!fdump-ada-spec*:%{!o*:--output-pch %i.gch}\
1463 %W{o*:--output-pch %*}}%V}}}}}}}", 0, 0, 0},
1464 {".i", "@cpp-output", 0, 0, 0},
1466 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1467 {".s", "@assembler", 0, 0, 0},
1469 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1470 {".sx", "@assembler-with-cpp", 0, 0, 0},
1471 {".S", "@assembler-with-cpp", 0, 0, 0},
1472 {"@assembler-with-cpp",
1473 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1474 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1475 %{E|M|MM:%(cpp_debug_options)}\
1476 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1477 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1479 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1480 %{E|M|MM:%(cpp_debug_options)}\
1481 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1482 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1487 /* Mark end of table. */
1491 /* Number of elements in default_compilers, not counting the terminator. */
1493 static const int n_default_compilers
= ARRAY_SIZE (default_compilers
) - 1;
1495 typedef char *char_p
; /* For DEF_VEC_P. */
1497 /* A vector of options to give to the linker.
1498 These options are accumulated by %x,
1499 and substituted into the linker command with %X. */
1500 static vec
<char_p
> linker_options
;
1502 /* A vector of options to give to the assembler.
1503 These options are accumulated by -Wa,
1504 and substituted into the assembler command with %Y. */
1505 static vec
<char_p
> assembler_options
;
1507 /* A vector of options to give to the preprocessor.
1508 These options are accumulated by -Wp,
1509 and substituted into the preprocessor command with %Z. */
1510 static vec
<char_p
> preprocessor_options
;
1513 skip_whitespace (char *p
)
1517 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1518 be considered whitespace. */
1519 if (p
[0] == '\n' && p
[1] == '\n' && p
[2] == '\n')
1521 else if (*p
== '\n' || *p
== ' ' || *p
== '\t')
1535 /* Structures to keep track of prefixes to try when looking for files. */
1539 const char *prefix
; /* String to prepend to the path. */
1540 struct prefix_list
*next
; /* Next in linked list. */
1541 int require_machine_suffix
; /* Don't use without machine_suffix. */
1542 /* 2 means try both machine_suffix and just_machine_suffix. */
1543 int priority
; /* Sort key - priority within list. */
1544 int os_multilib
; /* 1 if OS multilib scheme should be used,
1545 0 for GCC multilib scheme. */
1550 struct prefix_list
*plist
; /* List of prefixes to try */
1551 int max_len
; /* Max length of a prefix in PLIST */
1552 const char *name
; /* Name of this list (used in config stuff) */
1555 /* List of prefixes to try when looking for executables. */
1557 static struct path_prefix exec_prefixes
= { 0, 0, "exec" };
1559 /* List of prefixes to try when looking for startup (crt0) files. */
1561 static struct path_prefix startfile_prefixes
= { 0, 0, "startfile" };
1563 /* List of prefixes to try when looking for include files. */
1565 static struct path_prefix include_prefixes
= { 0, 0, "include" };
1567 /* Suffix to attach to directories searched for commands.
1568 This looks like `MACHINE/VERSION/'. */
1570 static const char *machine_suffix
= 0;
1572 /* Suffix to attach to directories searched for commands.
1573 This is just `MACHINE/'. */
1575 static const char *just_machine_suffix
= 0;
1577 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1579 static const char *gcc_exec_prefix
;
1581 /* Adjusted value of standard_libexec_prefix. */
1583 static const char *gcc_libexec_prefix
;
1585 /* Default prefixes to attach to command names. */
1587 #ifndef STANDARD_STARTFILE_PREFIX_1
1588 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1590 #ifndef STANDARD_STARTFILE_PREFIX_2
1591 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1594 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1595 #undef MD_EXEC_PREFIX
1596 #undef MD_STARTFILE_PREFIX
1597 #undef MD_STARTFILE_PREFIX_1
1600 /* If no prefixes defined, use the null string, which will disable them. */
1601 #ifndef MD_EXEC_PREFIX
1602 #define MD_EXEC_PREFIX ""
1604 #ifndef MD_STARTFILE_PREFIX
1605 #define MD_STARTFILE_PREFIX ""
1607 #ifndef MD_STARTFILE_PREFIX_1
1608 #define MD_STARTFILE_PREFIX_1 ""
1611 /* These directories are locations set at configure-time based on the
1612 --prefix option provided to configure. Their initializers are
1613 defined in Makefile.in. These paths are not *directly* used when
1614 gcc_exec_prefix is set because, in that case, we know where the
1615 compiler has been installed, and use paths relative to that
1616 location instead. */
1617 static const char *const standard_exec_prefix
= STANDARD_EXEC_PREFIX
;
1618 static const char *const standard_libexec_prefix
= STANDARD_LIBEXEC_PREFIX
;
1619 static const char *const standard_bindir_prefix
= STANDARD_BINDIR_PREFIX
;
1620 static const char *const standard_startfile_prefix
= STANDARD_STARTFILE_PREFIX
;
1622 /* For native compilers, these are well-known paths containing
1623 components that may be provided by the system. For cross
1624 compilers, these paths are not used. */
1625 static const char *md_exec_prefix
= MD_EXEC_PREFIX
;
1626 static const char *md_startfile_prefix
= MD_STARTFILE_PREFIX
;
1627 static const char *md_startfile_prefix_1
= MD_STARTFILE_PREFIX_1
;
1628 static const char *const standard_startfile_prefix_1
1629 = STANDARD_STARTFILE_PREFIX_1
;
1630 static const char *const standard_startfile_prefix_2
1631 = STANDARD_STARTFILE_PREFIX_2
;
1633 /* A relative path to be used in finding the location of tools
1634 relative to the driver. */
1635 static const char *const tooldir_base_prefix
= TOOLDIR_BASE_PREFIX
;
1637 /* A prefix to be used when this is an accelerator compiler. */
1638 static const char *const accel_dir_suffix
= ACCEL_DIR_SUFFIX
;
1640 /* Subdirectory to use for locating libraries. Set by
1641 set_multilib_dir based on the compilation options. */
1643 static const char *multilib_dir
;
1645 /* Subdirectory to use for locating libraries in OS conventions. Set by
1646 set_multilib_dir based on the compilation options. */
1648 static const char *multilib_os_dir
;
1650 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1651 set_multilib_dir based on the compilation options. */
1653 static const char *multiarch_dir
;
1655 /* Structure to keep track of the specs that have been defined so far.
1656 These are accessed using %(specname) in a compiler or link
1661 /* The following 2 fields must be first */
1662 /* to allow EXTRA_SPECS to be initialized */
1663 const char *name
; /* name of the spec. */
1664 const char *ptr
; /* available ptr if no static pointer */
1666 /* The following fields are not initialized */
1667 /* by EXTRA_SPECS */
1668 const char **ptr_spec
; /* pointer to the spec itself. */
1669 struct spec_list
*next
; /* Next spec in linked list. */
1670 int name_len
; /* length of the name */
1671 bool user_p
; /* whether string come from file spec. */
1672 bool alloc_p
; /* whether string was allocated */
1673 const char *default_ptr
; /* The default value of *ptr_spec. */
1676 #define INIT_STATIC_SPEC(NAME,PTR) \
1677 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1680 /* List of statically defined specs. */
1681 static struct spec_list static_specs
[] =
1683 INIT_STATIC_SPEC ("asm", &asm_spec
),
1684 INIT_STATIC_SPEC ("asm_debug", &asm_debug
),
1685 INIT_STATIC_SPEC ("asm_debug_option", &asm_debug_option
),
1686 INIT_STATIC_SPEC ("asm_final", &asm_final_spec
),
1687 INIT_STATIC_SPEC ("asm_options", &asm_options
),
1688 INIT_STATIC_SPEC ("invoke_as", &invoke_as
),
1689 INIT_STATIC_SPEC ("cpp", &cpp_spec
),
1690 INIT_STATIC_SPEC ("cpp_options", &cpp_options
),
1691 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options
),
1692 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options
),
1693 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp
),
1694 INIT_STATIC_SPEC ("cc1", &cc1_spec
),
1695 INIT_STATIC_SPEC ("cc1_options", &cc1_options
),
1696 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec
),
1697 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec
),
1698 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec
),
1699 INIT_STATIC_SPEC ("endfile", &endfile_spec
),
1700 INIT_STATIC_SPEC ("link", &link_spec
),
1701 INIT_STATIC_SPEC ("lib", &lib_spec
),
1702 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec
),
1703 INIT_STATIC_SPEC ("libgcc", &libgcc_spec
),
1704 INIT_STATIC_SPEC ("startfile", &startfile_spec
),
1705 INIT_STATIC_SPEC ("cross_compile", &cross_compile
),
1706 INIT_STATIC_SPEC ("version", &compiler_version
),
1707 INIT_STATIC_SPEC ("multilib", &multilib_select
),
1708 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults
),
1709 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra
),
1710 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches
),
1711 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions
),
1712 INIT_STATIC_SPEC ("multilib_options", &multilib_options
),
1713 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse
),
1714 INIT_STATIC_SPEC ("linker", &linker_name_spec
),
1715 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec
),
1716 INIT_STATIC_SPEC ("lto_wrapper", <o_wrapper_spec
),
1717 INIT_STATIC_SPEC ("lto_gcc", <o_gcc_spec
),
1718 INIT_STATIC_SPEC ("post_link", &post_link_spec
),
1719 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec
),
1720 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix
),
1721 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix
),
1722 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1
),
1723 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec
),
1724 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec
),
1725 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec
),
1726 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec
),
1727 INIT_STATIC_SPEC ("self_spec", &self_spec
),
1730 #ifdef EXTRA_SPECS /* additional specs needed */
1731 /* Structure to keep track of just the first two args of a spec_list.
1732 That is all that the EXTRA_SPECS macro gives us. */
1735 const char *const name
;
1736 const char *const ptr
;
1739 static const struct spec_list_1 extra_specs_1
[] = { EXTRA_SPECS
};
1740 static struct spec_list
*extra_specs
= (struct spec_list
*) 0;
1743 /* List of dynamically allocates specs that have been defined so far. */
1745 static struct spec_list
*specs
= (struct spec_list
*) 0;
1747 /* List of static spec functions. */
1749 static const struct spec_function static_spec_functions
[] =
1751 { "getenv", getenv_spec_function
},
1752 { "if-exists", if_exists_spec_function
},
1753 { "if-exists-else", if_exists_else_spec_function
},
1754 { "if-exists-then-else", if_exists_then_else_spec_function
},
1755 { "sanitize", sanitize_spec_function
},
1756 { "replace-outfile", replace_outfile_spec_function
},
1757 { "remove-outfile", remove_outfile_spec_function
},
1758 { "version-compare", version_compare_spec_function
},
1759 { "include", include_spec_function
},
1760 { "find-file", find_file_spec_function
},
1761 { "find-plugindir", find_plugindir_spec_function
},
1762 { "print-asm-header", print_asm_header_spec_function
},
1763 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function
},
1764 { "compare-debug-self-opt", compare_debug_self_opt_spec_function
},
1765 { "pass-through-libs", pass_through_libs_spec_func
},
1766 { "dumps", dumps_spec_func
},
1767 { "gt", greater_than_spec_func
},
1768 { "debug-level-gt", debug_level_greater_than_spec_func
},
1769 { "dwarf-version-gt", dwarf_version_greater_than_spec_func
},
1770 { "fortran-preinclude-file", find_fortran_preinclude_file
},
1771 #ifdef EXTRA_SPEC_FUNCTIONS
1772 EXTRA_SPEC_FUNCTIONS
1777 static int processing_spec_function
;
1779 /* Add appropriate libgcc specs to OBSTACK, taking into account
1780 various permutations of -shared-libgcc, -shared, and such. */
1782 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1784 #ifndef USE_LD_AS_NEEDED
1785 #define USE_LD_AS_NEEDED 0
1789 init_gcc_specs (struct obstack
*obstack
, const char *shared_name
,
1790 const char *static_name
, const char *eh_name
)
1794 #if USE_LD_AS_NEEDED
1795 buf
= concat ("%{static|static-libgcc|static-pie:", static_name
, " ", eh_name
, "}"
1796 "%{!static:%{!static-libgcc:%{!static-pie:"
1797 "%{!shared-libgcc:",
1798 static_name
, " " LD_AS_NEEDED_OPTION
" ",
1799 shared_name
, " " LD_NO_AS_NEEDED_OPTION
1802 shared_name
, "%{!shared: ", static_name
, "}"
1805 buf
= concat ("%{static|static-libgcc:", static_name
, " ", eh_name
, "}"
1806 "%{!static:%{!static-libgcc:"
1808 "%{!shared-libgcc:", static_name
, " ", eh_name
, "}"
1809 "%{shared-libgcc:", shared_name
, " ", static_name
, "}"
1813 "%{shared-libgcc:", shared_name
, "}"
1814 "%{!shared-libgcc:", static_name
, "}"
1817 "%{shared:", shared_name
, "}"
1822 obstack_grow (obstack
, buf
, strlen (buf
));
1825 #endif /* ENABLE_SHARED_LIBGCC */
1827 /* Initialize the specs lookup routines. */
1832 struct spec_list
*next
= (struct spec_list
*) 0;
1833 struct spec_list
*sl
= (struct spec_list
*) 0;
1837 return; /* Already initialized. */
1840 fnotice (stderr
, "Using built-in specs.\n");
1843 extra_specs
= XCNEWVEC (struct spec_list
, ARRAY_SIZE (extra_specs_1
));
1845 for (i
= ARRAY_SIZE (extra_specs_1
) - 1; i
>= 0; i
--)
1847 sl
= &extra_specs
[i
];
1848 sl
->name
= extra_specs_1
[i
].name
;
1849 sl
->ptr
= extra_specs_1
[i
].ptr
;
1851 sl
->name_len
= strlen (sl
->name
);
1852 sl
->ptr_spec
= &sl
->ptr
;
1853 gcc_assert (sl
->ptr_spec
!= NULL
);
1854 sl
->default_ptr
= sl
->ptr
;
1859 for (i
= ARRAY_SIZE (static_specs
) - 1; i
>= 0; i
--)
1861 sl
= &static_specs
[i
];
1866 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1867 /* ??? If neither -shared-libgcc nor --static-libgcc was
1868 seen, then we should be making an educated guess. Some proposed
1869 heuristics for ELF include:
1871 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1872 program will be doing dynamic loading, which will likely
1873 need the shared libgcc.
1875 (2) If "-ldl", then it's also a fair bet that we're doing
1878 (3) For each ET_DYN we're linking against (either through -lfoo
1879 or /some/path/foo.so), check to see whether it or one of
1880 its dependencies depends on a shared libgcc.
1884 If the runtime is fixed to look for program headers instead
1885 of calling __register_frame_info at all, for each object,
1886 use the shared libgcc if any EH symbol referenced.
1888 If crtstuff is fixed to not invoke __register_frame_info
1889 automatically, for each object, use the shared libgcc if
1890 any non-empty unwind section found.
1892 Doing any of this probably requires invoking an external program to
1893 do the actual object file scanning. */
1895 const char *p
= libgcc_spec
;
1898 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1899 when given the proper command line arguments. */
1902 if (in_sep
&& *p
== '-' && startswith (p
, "-lgcc"))
1904 init_gcc_specs (&obstack
,
1906 #ifdef USE_LIBUNWIND_EXCEPTIONS
1912 #ifdef USE_LIBUNWIND_EXCEPTIONS
1913 # ifdef HAVE_LD_STATIC_DYNAMIC
1914 " %{!static:%{!static-pie:" LD_STATIC_OPTION
"}} -lunwind"
1915 " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION
"}}"
1925 else if (in_sep
&& *p
== 'l' && startswith (p
, "libgcc.a%s"))
1927 /* Ug. We don't know shared library extensions. Hope that
1928 systems that use this form don't do shared libraries. */
1929 init_gcc_specs (&obstack
,
1933 #ifdef USE_LIBUNWIND_EXCEPTIONS
1942 obstack_1grow (&obstack
, *p
);
1943 in_sep
= (*p
== ' ');
1948 obstack_1grow (&obstack
, '\0');
1949 libgcc_spec
= XOBFINISH (&obstack
, const char *);
1952 #ifdef USE_AS_TRADITIONAL_FORMAT
1953 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1955 static const char tf
[] = "--traditional-format ";
1956 obstack_grow (&obstack
, tf
, sizeof (tf
) - 1);
1957 obstack_grow0 (&obstack
, asm_spec
, strlen (asm_spec
));
1958 asm_spec
= XOBFINISH (&obstack
, const char *);
1962 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1963 defined LINKER_HASH_STYLE
1964 # ifdef LINK_BUILDID_SPEC
1965 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1966 obstack_grow (&obstack
, LINK_BUILDID_SPEC
, sizeof (LINK_BUILDID_SPEC
) - 1);
1968 # ifdef LINK_EH_SPEC
1969 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1970 obstack_grow (&obstack
, LINK_EH_SPEC
, sizeof (LINK_EH_SPEC
) - 1);
1972 # ifdef LINKER_HASH_STYLE
1973 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1976 static const char hash_style
[] = "--hash-style=";
1977 obstack_grow (&obstack
, hash_style
, sizeof (hash_style
) - 1);
1978 obstack_grow (&obstack
, LINKER_HASH_STYLE
, sizeof (LINKER_HASH_STYLE
) - 1);
1979 obstack_1grow (&obstack
, ' ');
1982 obstack_grow0 (&obstack
, link_spec
, strlen (link_spec
));
1983 link_spec
= XOBFINISH (&obstack
, const char *);
1989 /* Update the entry for SPEC in the static_specs table to point to VALUE,
1990 ensuring that we free the previous value if necessary. Set alloc_p for the
1991 entry to ALLOC_P: this determines whether we take ownership of VALUE (i.e.
1992 whether we need to free it later on). */
1994 set_static_spec (const char **spec
, const char *value
, bool alloc_p
)
1996 struct spec_list
*sl
= NULL
;
1998 for (unsigned i
= 0; i
< ARRAY_SIZE (static_specs
); i
++)
2000 if (static_specs
[i
].ptr_spec
== spec
)
2002 sl
= static_specs
+ i
;
2011 const char *old
= *spec
;
2012 free (const_cast <char *> (old
));
2016 sl
->alloc_p
= alloc_p
;
2019 /* Update a static spec to a new string, taking ownership of that
2021 static void set_static_spec_owned (const char **spec
, const char *val
)
2023 return set_static_spec (spec
, val
, true);
2026 /* Update a static spec to point to a new value, but don't take
2027 ownership of (i.e. don't free) that string. */
2028 static void set_static_spec_shared (const char **spec
, const char *val
)
2030 return set_static_spec (spec
, val
, false);
2034 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
2035 removed; If the spec starts with a + then SPEC is added to the end of the
2039 set_spec (const char *name
, const char *spec
, bool user_p
)
2041 struct spec_list
*sl
;
2042 const char *old_spec
;
2043 int name_len
= strlen (name
);
2046 /* If this is the first call, initialize the statically allocated specs. */
2049 struct spec_list
*next
= (struct spec_list
*) 0;
2050 for (i
= ARRAY_SIZE (static_specs
) - 1; i
>= 0; i
--)
2052 sl
= &static_specs
[i
];
2059 /* See if the spec already exists. */
2060 for (sl
= specs
; sl
; sl
= sl
->next
)
2061 if (name_len
== sl
->name_len
&& !strcmp (sl
->name
, name
))
2066 /* Not found - make it. */
2067 sl
= XNEW (struct spec_list
);
2068 sl
->name
= xstrdup (name
);
2069 sl
->name_len
= name_len
;
2070 sl
->ptr_spec
= &sl
->ptr
;
2072 *(sl
->ptr_spec
) = "";
2074 sl
->default_ptr
= NULL
;
2078 old_spec
= *(sl
->ptr_spec
);
2079 *(sl
->ptr_spec
) = ((spec
[0] == '+' && ISSPACE ((unsigned char)spec
[1]))
2080 ? concat (old_spec
, spec
+ 1, NULL
)
2085 fnotice (stderr
, "Setting spec %s to '%s'\n\n", name
, *(sl
->ptr_spec
));
2088 /* Free the old spec. */
2089 if (old_spec
&& sl
->alloc_p
)
2090 free (CONST_CAST (char *, old_spec
));
2092 sl
->user_p
= user_p
;
2096 /* Accumulate a command (program name and args), and run it. */
2098 typedef const char *const_char_p
; /* For DEF_VEC_P. */
2100 /* Vector of pointers to arguments in the current line of specifications. */
2101 static vec
<const_char_p
> argbuf
;
2103 /* Likewise, but for the current @file. */
2104 static vec
<const_char_p
> at_file_argbuf
;
2106 /* Whether an @file is currently open. */
2107 static bool in_at_file
= false;
2109 /* Were the options -c, -S or -E passed. */
2110 static int have_c
= 0;
2112 /* Was the option -o passed. */
2113 static int have_o
= 0;
2115 /* Was the option -E passed. */
2116 static int have_E
= 0;
2118 /* Pointer to output file name passed in with -o. */
2119 static const char *output_file
= 0;
2121 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
2122 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
2125 static struct temp_name
{
2126 const char *suffix
; /* suffix associated with the code. */
2127 int length
; /* strlen (suffix). */
2128 int unique
; /* Indicates whether %g or %u/%U was used. */
2129 const char *filename
; /* associated filename. */
2130 int filename_length
; /* strlen (filename). */
2131 struct temp_name
*next
;
2134 /* Number of commands executed so far. */
2136 static int execution_count
;
2138 /* Number of commands that exited with a signal. */
2140 static int signal_count
;
2142 /* Allocate the argument vector. */
2148 at_file_argbuf
.create (10);
2151 /* Clear out the vector of arguments (after a command is executed). */
2156 argbuf
.truncate (0);
2157 at_file_argbuf
.truncate (0);
2160 /* Add one argument to the vector at the end.
2161 This is done when a space is seen or at the end of the line.
2162 If DELETE_ALWAYS is nonzero, the arg is a filename
2163 and the file should be deleted eventually.
2164 If DELETE_FAILURE is nonzero, the arg is a filename
2165 and the file should be deleted if this compilation fails. */
2168 store_arg (const char *arg
, int delete_always
, int delete_failure
)
2171 at_file_argbuf
.safe_push (arg
);
2173 argbuf
.safe_push (arg
);
2175 if (delete_always
|| delete_failure
)
2178 /* If the temporary file we should delete is specified as
2179 part of a joined argument extract the filename. */
2181 && (p
= strrchr (arg
, '=')))
2183 record_temp_file (arg
, delete_always
, delete_failure
);
2187 /* Open a temporary @file into which subsequent arguments will be stored. */
2193 fatal_error (input_location
, "cannot open nested response file");
2198 /* Create a temporary @file name. */
2200 static char *make_at_file (void)
2202 static int fileno
= 0;
2204 const char *base
, *ext
;
2206 if (!save_temps_flag
)
2207 return make_temp_file ("");
2210 if (!(base
&& *base
))
2212 if (!(base
&& *base
))
2215 sprintf (filename
, ".args.%d", fileno
++);
2218 if (base
== dumpdir
&& dumpdir_trailing_dash_added
)
2221 return concat (base
, ext
, NULL
);
2224 /* Close the temporary @file and add @file to the argument list. */
2227 close_at_file (void)
2230 fatal_error (input_location
, "cannot close nonexistent response file");
2234 const unsigned int n_args
= at_file_argbuf
.length ();
2238 char **argv
= XALLOCAVEC (char *, n_args
+ 1);
2239 char *temp_file
= make_at_file ();
2240 char *at_argument
= concat ("@", temp_file
, NULL
);
2241 FILE *f
= fopen (temp_file
, "w");
2245 /* Copy the strings over. */
2246 for (i
= 0; i
< n_args
; i
++)
2247 argv
[i
] = CONST_CAST (char *, at_file_argbuf
[i
]);
2250 at_file_argbuf
.truncate (0);
2253 fatal_error (input_location
, "could not open temporary response file %s",
2256 status
= writeargv (argv
, f
);
2259 fatal_error (input_location
,
2260 "could not write to temporary response file %s",
2263 status
= fclose (f
);
2266 fatal_error (input_location
, "could not close temporary response file %s",
2269 store_arg (at_argument
, 0, 0);
2271 record_temp_file (temp_file
, !save_temps_flag
, !save_temps_flag
);
2274 /* Load specs from a file name named FILENAME, replacing occurrences of
2275 various different types of line-endings, \r\n, \n\r and just \r, with
2279 load_specs (const char *filename
)
2283 struct stat statbuf
;
2290 fnotice (stderr
, "Reading specs from %s\n", filename
);
2292 /* Open and stat the file. */
2293 desc
= open (filename
, O_RDONLY
, 0);
2297 /* This leaves DESC open, but the OS will save us. */
2298 fatal_error (input_location
, "cannot read spec file %qs: %m", filename
);
2301 if (stat (filename
, &statbuf
) < 0)
2304 /* Read contents of file into BUFFER. */
2305 buffer
= XNEWVEC (char, statbuf
.st_size
+ 1);
2306 readlen
= read (desc
, buffer
, (unsigned) statbuf
.st_size
);
2309 buffer
[readlen
] = 0;
2312 specs
= XNEWVEC (char, readlen
+ 1);
2314 for (buffer_p
= buffer
; buffer_p
&& *buffer_p
; buffer_p
++)
2320 if (buffer_p
> buffer
&& *(buffer_p
- 1) == '\n') /* \n\r */
2322 else if (*(buffer_p
+ 1) == '\n') /* \r\n */
2336 /* Read compilation specs from a file named FILENAME,
2337 replacing the default ones.
2339 A suffix which starts with `*' is a definition for
2340 one of the machine-specific sub-specs. The "suffix" should be
2341 *asm, *cc1, *cpp, *link, *startfile, etc.
2342 The corresponding spec is stored in asm_spec, etc.,
2343 rather than in the `compilers' vector.
2345 Anything invalid in the file is a fatal error. */
2348 read_specs (const char *filename
, bool main_p
, bool user_p
)
2353 buffer
= load_specs (filename
);
2355 /* Scan BUFFER for specs, putting them in the vector. */
2361 char *in
, *out
, *p1
, *p2
, *p3
;
2363 /* Advance P in BUFFER to the next nonblank nocomment line. */
2364 p
= skip_whitespace (p
);
2368 /* Is this a special command that starts with '%'? */
2369 /* Don't allow this for the main specs file, since it would
2370 encourage people to overwrite it. */
2371 if (*p
== '%' && !main_p
)
2374 while (*p
&& *p
!= '\n')
2380 if (startswith (p1
, "%include")
2381 && (p1
[sizeof "%include" - 1] == ' '
2382 || p1
[sizeof "%include" - 1] == '\t'))
2386 p1
+= sizeof ("%include");
2387 while (*p1
== ' ' || *p1
== '\t')
2390 if (*p1
++ != '<' || p
[-2] != '>')
2391 fatal_error (input_location
,
2392 "specs %%include syntax malformed after "
2394 (long) (p1
- buffer
+ 1));
2397 new_filename
= find_a_file (&startfile_prefixes
, p1
, R_OK
, true);
2398 read_specs (new_filename
? new_filename
: p1
, false, user_p
);
2401 else if (startswith (p1
, "%include_noerr")
2402 && (p1
[sizeof "%include_noerr" - 1] == ' '
2403 || p1
[sizeof "%include_noerr" - 1] == '\t'))
2407 p1
+= sizeof "%include_noerr";
2408 while (*p1
== ' ' || *p1
== '\t')
2411 if (*p1
++ != '<' || p
[-2] != '>')
2412 fatal_error (input_location
,
2413 "specs %%include syntax malformed after "
2415 (long) (p1
- buffer
+ 1));
2418 new_filename
= find_a_file (&startfile_prefixes
, p1
, R_OK
, true);
2420 read_specs (new_filename
, false, user_p
);
2421 else if (verbose_flag
)
2422 fnotice (stderr
, "could not find specs file %s\n", p1
);
2425 else if (startswith (p1
, "%rename")
2426 && (p1
[sizeof "%rename" - 1] == ' '
2427 || p1
[sizeof "%rename" - 1] == '\t'))
2430 struct spec_list
*sl
;
2431 struct spec_list
*newsl
;
2433 /* Get original name. */
2434 p1
+= sizeof "%rename";
2435 while (*p1
== ' ' || *p1
== '\t')
2438 if (! ISALPHA ((unsigned char) *p1
))
2439 fatal_error (input_location
,
2440 "specs %%rename syntax malformed after "
2442 (long) (p1
- buffer
));
2445 while (*p2
&& !ISSPACE ((unsigned char) *p2
))
2448 if (*p2
!= ' ' && *p2
!= '\t')
2449 fatal_error (input_location
,
2450 "specs %%rename syntax malformed after "
2452 (long) (p2
- buffer
));
2456 while (*p2
== ' ' || *p2
== '\t')
2459 if (! ISALPHA ((unsigned char) *p2
))
2460 fatal_error (input_location
,
2461 "specs %%rename syntax malformed after "
2463 (long) (p2
- buffer
));
2465 /* Get new spec name. */
2467 while (*p3
&& !ISSPACE ((unsigned char) *p3
))
2471 fatal_error (input_location
,
2472 "specs %%rename syntax malformed after "
2474 (long) (p3
- buffer
));
2477 for (sl
= specs
; sl
; sl
= sl
->next
)
2478 if (name_len
== sl
->name_len
&& !strcmp (sl
->name
, p1
))
2482 fatal_error (input_location
,
2483 "specs %s spec was not found to be renamed", p1
);
2485 if (strcmp (p1
, p2
) == 0)
2488 for (newsl
= specs
; newsl
; newsl
= newsl
->next
)
2489 if (strcmp (newsl
->name
, p2
) == 0)
2490 fatal_error (input_location
,
2491 "%s: attempt to rename spec %qs to "
2492 "already defined spec %qs",
2497 fnotice (stderr
, "rename spec %s to %s\n", p1
, p2
);
2499 fnotice (stderr
, "spec is '%s'\n\n", *(sl
->ptr_spec
));
2503 set_spec (p2
, *(sl
->ptr_spec
), user_p
);
2505 free (CONST_CAST (char *, *(sl
->ptr_spec
)));
2507 *(sl
->ptr_spec
) = "";
2512 fatal_error (input_location
,
2513 "specs unknown %% command after %ld characters",
2514 (long) (p1
- buffer
));
2517 /* Find the colon that should end the suffix. */
2519 while (*p1
&& *p1
!= ':' && *p1
!= '\n')
2522 /* The colon shouldn't be missing. */
2524 fatal_error (input_location
,
2525 "specs file malformed after %ld characters",
2526 (long) (p1
- buffer
));
2528 /* Skip back over trailing whitespace. */
2530 while (p2
> buffer
&& (p2
[-1] == ' ' || p2
[-1] == '\t'))
2533 /* Copy the suffix to a string. */
2534 suffix
= save_string (p
, p2
- p
);
2535 /* Find the next line. */
2536 p
= skip_whitespace (p1
+ 1);
2538 fatal_error (input_location
,
2539 "specs file malformed after %ld characters",
2540 (long) (p
- buffer
));
2543 /* Find next blank line or end of string. */
2544 while (*p1
&& !(*p1
== '\n' && (p1
[1] == '\n' || p1
[1] == '\0')))
2547 /* Specs end at the blank line and do not include the newline. */
2548 spec
= save_string (p
, p1
- p
);
2551 /* Delete backslash-newline sequences from the spec. */
2556 if (in
[0] == '\\' && in
[1] == '\n')
2558 else if (in
[0] == '#')
2559 while (*in
&& *in
!= '\n')
2567 if (suffix
[0] == '*')
2569 if (! strcmp (suffix
, "*link_command"))
2570 link_command_spec
= spec
;
2573 set_spec (suffix
+ 1, spec
, user_p
);
2579 /* Add this pair to the vector. */
2581 = XRESIZEVEC (struct compiler
, compilers
, n_compilers
+ 2);
2583 compilers
[n_compilers
].suffix
= suffix
;
2584 compilers
[n_compilers
].spec
= spec
;
2586 memset (&compilers
[n_compilers
], 0, sizeof compilers
[n_compilers
]);
2590 link_command_spec
= spec
;
2593 if (link_command_spec
== 0)
2594 fatal_error (input_location
, "spec file has no spec for linking");
2596 XDELETEVEC (buffer
);
2599 /* Record the names of temporary files we tell compilers to write,
2600 and delete them at the end of the run. */
2602 /* This is the common prefix we use to make temp file names.
2603 It is chosen once for each run of this program.
2604 It is substituted into a spec by %g or %j.
2605 Thus, all temp file names contain this prefix.
2606 In practice, all temp file names start with this prefix.
2608 This prefix comes from the envvar TMPDIR if it is defined;
2609 otherwise, from the P_tmpdir macro if that is defined;
2610 otherwise, in /usr/tmp or /tmp;
2611 or finally the current directory if all else fails. */
2613 static const char *temp_filename
;
2615 /* Length of the prefix. */
2617 static int temp_filename_length
;
2619 /* Define the list of temporary files to delete. */
2624 struct temp_file
*next
;
2627 /* Queue of files to delete on success or failure of compilation. */
2628 static struct temp_file
*always_delete_queue
;
2629 /* Queue of files to delete on failure of compilation. */
2630 static struct temp_file
*failure_delete_queue
;
2632 /* Record FILENAME as a file to be deleted automatically.
2633 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2634 otherwise delete it in any case.
2635 FAIL_DELETE nonzero means delete it if a compilation step fails;
2636 otherwise delete it in any case. */
2639 record_temp_file (const char *filename
, int always_delete
, int fail_delete
)
2641 char *const name
= xstrdup (filename
);
2645 struct temp_file
*temp
;
2646 for (temp
= always_delete_queue
; temp
; temp
= temp
->next
)
2647 if (! filename_cmp (name
, temp
->name
))
2653 temp
= XNEW (struct temp_file
);
2654 temp
->next
= always_delete_queue
;
2656 always_delete_queue
= temp
;
2663 struct temp_file
*temp
;
2664 for (temp
= failure_delete_queue
; temp
; temp
= temp
->next
)
2665 if (! filename_cmp (name
, temp
->name
))
2671 temp
= XNEW (struct temp_file
);
2672 temp
->next
= failure_delete_queue
;
2674 failure_delete_queue
= temp
;
2680 /* Delete all the temporary files whose names we previously recorded. */
2682 #ifndef DELETE_IF_ORDINARY
2683 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2686 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2687 if (unlink (NAME) < 0) \
2689 error ("%s: %m", (NAME)); \
2694 delete_if_ordinary (const char *name
)
2700 printf ("Delete %s? (y or n) ", name
);
2704 while ((c
= getchar ()) != '\n' && c
!= EOF
)
2707 if (i
== 'y' || i
== 'Y')
2709 DELETE_IF_ORDINARY (name
, st
, verbose_flag
);
2713 delete_temp_files (void)
2715 struct temp_file
*temp
;
2717 for (temp
= always_delete_queue
; temp
; temp
= temp
->next
)
2718 delete_if_ordinary (temp
->name
);
2719 always_delete_queue
= 0;
2722 /* Delete all the files to be deleted on error. */
2725 delete_failure_queue (void)
2727 struct temp_file
*temp
;
2729 for (temp
= failure_delete_queue
; temp
; temp
= temp
->next
)
2730 delete_if_ordinary (temp
->name
);
2734 clear_failure_queue (void)
2736 failure_delete_queue
= 0;
2739 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2741 If DO_MULTI is true iterate over the paths twice, first with multilib
2742 suffix then without, otherwise iterate over the paths once without
2743 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2744 to avoid visiting the same path twice, but we could do better. For
2745 instance, /usr/lib/../lib is considered different from /usr/lib.
2746 At least EXTRA_SPACE chars past the end of the path passed to
2747 CALLBACK are available for use by the callback.
2748 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2750 Returns the value returned by CALLBACK. */
2753 for_each_path (const struct path_prefix
*paths
,
2756 void *(*callback
) (char *, void *),
2757 void *callback_info
)
2759 struct prefix_list
*pl
;
2760 const char *multi_dir
= NULL
;
2761 const char *multi_os_dir
= NULL
;
2762 const char *multiarch_suffix
= NULL
;
2763 const char *multi_suffix
;
2764 const char *just_multi_suffix
;
2767 bool skip_multi_dir
= false;
2768 bool skip_multi_os_dir
= false;
2770 multi_suffix
= machine_suffix
;
2771 just_multi_suffix
= just_machine_suffix
;
2772 if (do_multi
&& multilib_dir
&& strcmp (multilib_dir
, ".") != 0)
2774 multi_dir
= concat (multilib_dir
, dir_separator_str
, NULL
);
2775 multi_suffix
= concat (multi_suffix
, multi_dir
, NULL
);
2776 just_multi_suffix
= concat (just_multi_suffix
, multi_dir
, NULL
);
2778 if (do_multi
&& multilib_os_dir
&& strcmp (multilib_os_dir
, ".") != 0)
2779 multi_os_dir
= concat (multilib_os_dir
, dir_separator_str
, NULL
);
2781 multiarch_suffix
= concat (multiarch_dir
, dir_separator_str
, NULL
);
2785 size_t multi_dir_len
= 0;
2786 size_t multi_os_dir_len
= 0;
2787 size_t multiarch_len
= 0;
2789 size_t just_suffix_len
;
2793 multi_dir_len
= strlen (multi_dir
);
2795 multi_os_dir_len
= strlen (multi_os_dir
);
2796 if (multiarch_suffix
)
2797 multiarch_len
= strlen (multiarch_suffix
);
2798 suffix_len
= strlen (multi_suffix
);
2799 just_suffix_len
= strlen (just_multi_suffix
);
2803 len
= paths
->max_len
+ extra_space
+ 1;
2804 len
+= MAX (MAX (suffix_len
, multi_os_dir_len
), multiarch_len
);
2805 path
= XNEWVEC (char, len
);
2808 for (pl
= paths
->plist
; pl
!= 0; pl
= pl
->next
)
2810 len
= strlen (pl
->prefix
);
2811 memcpy (path
, pl
->prefix
, len
);
2813 /* Look first in MACHINE/VERSION subdirectory. */
2814 if (!skip_multi_dir
)
2816 memcpy (path
+ len
, multi_suffix
, suffix_len
+ 1);
2817 ret
= callback (path
, callback_info
);
2822 /* Some paths are tried with just the machine (ie. target)
2823 subdir. This is used for finding as, ld, etc. */
2825 && pl
->require_machine_suffix
== 2)
2827 memcpy (path
+ len
, just_multi_suffix
, just_suffix_len
+ 1);
2828 ret
= callback (path
, callback_info
);
2833 /* Now try the multiarch path. */
2835 && !pl
->require_machine_suffix
&& multiarch_dir
)
2837 memcpy (path
+ len
, multiarch_suffix
, multiarch_len
+ 1);
2838 ret
= callback (path
, callback_info
);
2843 /* Now try the base path. */
2844 if (!pl
->require_machine_suffix
2845 && !(pl
->os_multilib
? skip_multi_os_dir
: skip_multi_dir
))
2847 const char *this_multi
;
2848 size_t this_multi_len
;
2850 if (pl
->os_multilib
)
2852 this_multi
= multi_os_dir
;
2853 this_multi_len
= multi_os_dir_len
;
2857 this_multi
= multi_dir
;
2858 this_multi_len
= multi_dir_len
;
2862 memcpy (path
+ len
, this_multi
, this_multi_len
+ 1);
2866 ret
= callback (path
, callback_info
);
2874 if (multi_dir
== NULL
&& multi_os_dir
== NULL
)
2877 /* Run through the paths again, this time without multilibs.
2878 Don't repeat any we have already seen. */
2881 free (CONST_CAST (char *, multi_dir
));
2883 free (CONST_CAST (char *, multi_suffix
));
2884 multi_suffix
= machine_suffix
;
2885 free (CONST_CAST (char *, just_multi_suffix
));
2886 just_multi_suffix
= just_machine_suffix
;
2889 skip_multi_dir
= true;
2892 free (CONST_CAST (char *, multi_os_dir
));
2893 multi_os_dir
= NULL
;
2896 skip_multi_os_dir
= true;
2901 free (CONST_CAST (char *, multi_dir
));
2902 free (CONST_CAST (char *, multi_suffix
));
2903 free (CONST_CAST (char *, just_multi_suffix
));
2906 free (CONST_CAST (char *, multi_os_dir
));
2912 /* Callback for build_search_list. Adds path to obstack being built. */
2914 struct add_to_obstack_info
{
2921 add_to_obstack (char *path
, void *data
)
2923 struct add_to_obstack_info
*info
= (struct add_to_obstack_info
*) data
;
2925 if (info
->check_dir
&& !is_directory (path
, false))
2928 if (!info
->first_time
)
2929 obstack_1grow (info
->ob
, PATH_SEPARATOR
);
2931 obstack_grow (info
->ob
, path
, strlen (path
));
2933 info
->first_time
= false;
2937 /* Add or change the value of an environment variable, outputting the
2938 change to standard error if in verbose mode. */
2940 xputenv (const char *string
)
2945 /* Build a list of search directories from PATHS.
2946 PREFIX is a string to prepend to the list.
2947 If CHECK_DIR_P is true we ensure the directory exists.
2948 If DO_MULTI is true, multilib paths are output first, then
2950 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2951 It is also used by the --print-search-dirs flag. */
2954 build_search_list (const struct path_prefix
*paths
, const char *prefix
,
2955 bool check_dir
, bool do_multi
)
2957 struct add_to_obstack_info info
;
2959 info
.ob
= &collect_obstack
;
2960 info
.check_dir
= check_dir
;
2961 info
.first_time
= true;
2963 obstack_grow (&collect_obstack
, prefix
, strlen (prefix
));
2964 obstack_1grow (&collect_obstack
, '=');
2966 for_each_path (paths
, do_multi
, 0, add_to_obstack
, &info
);
2968 obstack_1grow (&collect_obstack
, '\0');
2969 return XOBFINISH (&collect_obstack
, char *);
2972 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2976 putenv_from_prefixes (const struct path_prefix
*paths
, const char *env_var
,
2979 xputenv (build_search_list (paths
, env_var
, true, do_multi
));
2982 /* Check whether NAME can be accessed in MODE. This is like access,
2983 except that it never considers directories to be executable. */
2986 access_check (const char *name
, int mode
)
2992 if (stat (name
, &st
) < 0
2993 || S_ISDIR (st
.st_mode
))
2997 return access (name
, mode
);
3000 /* Callback for find_a_file. Appends the file name to the directory
3001 path. If the resulting file exists in the right mode, return the
3002 full pathname to the file. */
3004 struct file_at_path_info
{
3013 file_at_path (char *path
, void *data
)
3015 struct file_at_path_info
*info
= (struct file_at_path_info
*) data
;
3016 size_t len
= strlen (path
);
3018 memcpy (path
+ len
, info
->name
, info
->name_len
);
3019 len
+= info
->name_len
;
3021 /* Some systems have a suffix for executable files.
3022 So try appending that first. */
3023 if (info
->suffix_len
)
3025 memcpy (path
+ len
, info
->suffix
, info
->suffix_len
+ 1);
3026 if (access_check (path
, info
->mode
) == 0)
3031 if (access_check (path
, info
->mode
) == 0)
3037 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
3038 access to check permissions. If DO_MULTI is true, search multilib
3039 paths then non-multilib paths, otherwise do not search multilib paths.
3040 Return 0 if not found, otherwise return its name, allocated with malloc. */
3043 find_a_file (const struct path_prefix
*pprefix
, const char *name
, int mode
,
3046 struct file_at_path_info info
;
3048 /* Find the filename in question (special case for absolute paths). */
3050 if (IS_ABSOLUTE_PATH (name
))
3052 if (access (name
, mode
) == 0)
3053 return xstrdup (name
);
3059 info
.suffix
= (mode
& X_OK
) != 0 ? HOST_EXECUTABLE_SUFFIX
: "";
3060 info
.name_len
= strlen (info
.name
);
3061 info
.suffix_len
= strlen (info
.suffix
);
3064 return (char*) for_each_path (pprefix
, do_multi
,
3065 info
.name_len
+ info
.suffix_len
,
3066 file_at_path
, &info
);
3069 /* Specialization of find_a_file for programs that also takes into account
3070 configure-specified default programs. */
3073 find_a_program (const char *name
)
3075 /* Do not search if default matches query. */
3077 #ifdef DEFAULT_ASSEMBLER
3078 if (! strcmp (name
, "as") && access (DEFAULT_ASSEMBLER
, X_OK
) == 0)
3079 return xstrdup (DEFAULT_ASSEMBLER
);
3082 #ifdef DEFAULT_LINKER
3083 if (! strcmp (name
, "ld") && access (DEFAULT_LINKER
, X_OK
) == 0)
3084 return xstrdup (DEFAULT_LINKER
);
3087 #ifdef DEFAULT_DSYMUTIL
3088 if (! strcmp (name
, "dsymutil") && access (DEFAULT_DSYMUTIL
, X_OK
) == 0)
3089 return xstrdup (DEFAULT_DSYMUTIL
);
3092 return find_a_file (&exec_prefixes
, name
, X_OK
, false);
3095 /* Ranking of prefixes in the sort list. -B prefixes are put before
3098 enum path_prefix_priority
3100 PREFIX_PRIORITY_B_OPT
,
3101 PREFIX_PRIORITY_LAST
3104 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
3105 order according to PRIORITY. Within each PRIORITY, new entries are
3108 If WARN is nonzero, we will warn if no file is found
3109 through this prefix. WARN should point to an int
3110 which will be set to 1 if this entry is used.
3112 COMPONENT is the value to be passed to update_path.
3114 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
3115 the complete value of machine_suffix.
3116 2 means try both machine_suffix and just_machine_suffix. */
3119 add_prefix (struct path_prefix
*pprefix
, const char *prefix
,
3120 const char *component
, /* enum prefix_priority */ int priority
,
3121 int require_machine_suffix
, int os_multilib
)
3123 struct prefix_list
*pl
, **prev
;
3126 for (prev
= &pprefix
->plist
;
3127 (*prev
) != NULL
&& (*prev
)->priority
<= priority
;
3128 prev
= &(*prev
)->next
)
3131 /* Keep track of the longest prefix. */
3133 prefix
= update_path (prefix
, component
);
3134 len
= strlen (prefix
);
3135 if (len
> pprefix
->max_len
)
3136 pprefix
->max_len
= len
;
3138 pl
= XNEW (struct prefix_list
);
3139 pl
->prefix
= prefix
;
3140 pl
->require_machine_suffix
= require_machine_suffix
;
3141 pl
->priority
= priority
;
3142 pl
->os_multilib
= os_multilib
;
3144 /* Insert after PREV. */
3149 /* Same as add_prefix, but prepending target_system_root to prefix. */
3150 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
3152 add_sysrooted_prefix (struct path_prefix
*pprefix
, const char *prefix
,
3153 const char *component
,
3154 /* enum prefix_priority */ int priority
,
3155 int require_machine_suffix
, int os_multilib
)
3157 if (!IS_ABSOLUTE_PATH (prefix
))
3158 fatal_error (input_location
, "system path %qs is not absolute", prefix
);
3160 if (target_system_root
)
3162 char *sysroot_no_trailing_dir_separator
= xstrdup (target_system_root
);
3163 size_t sysroot_len
= strlen (target_system_root
);
3166 && target_system_root
[sysroot_len
- 1] == DIR_SEPARATOR
)
3167 sysroot_no_trailing_dir_separator
[sysroot_len
- 1] = '\0';
3169 if (target_sysroot_suffix
)
3170 prefix
= concat (sysroot_no_trailing_dir_separator
,
3171 target_sysroot_suffix
, prefix
, NULL
);
3173 prefix
= concat (sysroot_no_trailing_dir_separator
, prefix
, NULL
);
3175 free (sysroot_no_trailing_dir_separator
);
3177 /* We have to override this because GCC's notion of sysroot
3178 moves along with GCC. */
3182 add_prefix (pprefix
, prefix
, component
, priority
,
3183 require_machine_suffix
, os_multilib
);
3186 /* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */
3189 add_sysrooted_hdrs_prefix (struct path_prefix
*pprefix
, const char *prefix
,
3190 const char *component
,
3191 /* enum prefix_priority */ int priority
,
3192 int require_machine_suffix
, int os_multilib
)
3194 if (!IS_ABSOLUTE_PATH (prefix
))
3195 fatal_error (input_location
, "system path %qs is not absolute", prefix
);
3197 if (target_system_root
)
3199 char *sysroot_no_trailing_dir_separator
= xstrdup (target_system_root
);
3200 size_t sysroot_len
= strlen (target_system_root
);
3203 && target_system_root
[sysroot_len
- 1] == DIR_SEPARATOR
)
3204 sysroot_no_trailing_dir_separator
[sysroot_len
- 1] = '\0';
3206 if (target_sysroot_hdrs_suffix
)
3207 prefix
= concat (sysroot_no_trailing_dir_separator
,
3208 target_sysroot_hdrs_suffix
, prefix
, NULL
);
3210 prefix
= concat (sysroot_no_trailing_dir_separator
, prefix
, NULL
);
3212 free (sysroot_no_trailing_dir_separator
);
3214 /* We have to override this because GCC's notion of sysroot
3215 moves along with GCC. */
3219 add_prefix (pprefix
, prefix
, component
, priority
,
3220 require_machine_suffix
, os_multilib
);
3224 /* Execute the command specified by the arguments on the current line of spec.
3225 When using pipes, this includes several piped-together commands
3226 with `|' between them.
3228 Return 0 if successful, -1 if failed. */
3234 int n_commands
; /* # of command. */
3236 struct pex_obj
*pex
;
3239 const char *prog
; /* program name. */
3240 const char **argv
; /* vector of args. */
3244 struct command
*commands
; /* each command buffer with above info. */
3246 gcc_assert (!processing_spec_function
);
3250 string
= find_a_program (argbuf
[0]);
3253 insert_wrapper (wrapper_string
);
3256 /* Count # of piped commands. */
3257 for (n_commands
= 1, i
= 0; argbuf
.iterate (i
, &arg
); i
++)
3258 if (strcmp (arg
, "|") == 0)
3261 /* Get storage for each command. */
3262 commands
= XALLOCAVEC (struct command
, n_commands
);
3264 /* Split argbuf into its separate piped processes,
3265 and record info about each one.
3266 Also search for the programs that are to be run. */
3268 argbuf
.safe_push (0);
3270 commands
[0].prog
= argbuf
[0]; /* first command. */
3271 commands
[0].argv
= argbuf
.address ();
3273 if (!wrapper_string
)
3275 string
= find_a_program(commands
[0].prog
);
3277 commands
[0].argv
[0] = string
;
3280 for (n_commands
= 1, i
= 0; argbuf
.iterate (i
, &arg
); i
++)
3281 if (arg
&& strcmp (arg
, "|") == 0)
3282 { /* each command. */
3283 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3284 fatal_error (input_location
, "%<-pipe%> not supported");
3286 argbuf
[i
] = 0; /* Termination of command args. */
3287 commands
[n_commands
].prog
= argbuf
[i
+ 1];
3288 commands
[n_commands
].argv
3289 = &(argbuf
.address ())[i
+ 1];
3290 string
= find_a_program(commands
[n_commands
].prog
);
3292 commands
[n_commands
].argv
[0] = string
;
3296 /* If -v, print what we are about to do, and maybe query. */
3300 /* For help listings, put a blank line between sub-processes. */
3301 if (print_help_list
)
3302 fputc ('\n', stderr
);
3304 /* Print each piped command as a separate line. */
3305 for (i
= 0; i
< n_commands
; i
++)
3307 const char *const *j
;
3309 if (verbose_only_flag
)
3311 for (j
= commands
[i
].argv
; *j
; j
++)
3314 for (p
= *j
; *p
; ++p
)
3315 if (!ISALNUM ((unsigned char) *p
)
3316 && *p
!= '_' && *p
!= '/' && *p
!= '-' && *p
!= '.')
3320 fprintf (stderr
, " \"");
3321 for (p
= *j
; *p
; ++p
)
3323 if (*p
== '"' || *p
== '\\' || *p
== '$')
3324 fputc ('\\', stderr
);
3327 fputc ('"', stderr
);
3329 /* If it's empty, print "". */
3331 fprintf (stderr
, " \"\"");
3333 fprintf (stderr
, " %s", *j
);
3337 for (j
= commands
[i
].argv
; *j
; j
++)
3338 /* If it's empty, print "". */
3340 fprintf (stderr
, " \"\"");
3342 fprintf (stderr
, " %s", *j
);
3344 /* Print a pipe symbol after all but the last command. */
3345 if (i
+ 1 != n_commands
)
3346 fprintf (stderr
, " |");
3347 fprintf (stderr
, "\n");
3350 if (verbose_only_flag
!= 0)
3352 /* verbose_only_flag should act as if the spec was
3353 executed, so increment execution_count before
3354 returning. This prevents spurious warnings about
3355 unused linker input files, etc. */
3360 fnotice (stderr
, "\nGo ahead? (y or n) ");
3364 while (getchar () != '\n')
3367 if (i
!= 'y' && i
!= 'Y')
3372 #ifdef ENABLE_VALGRIND_CHECKING
3373 /* Run the each command through valgrind. To simplify prepending the
3374 path to valgrind and the option "-q" (for quiet operation unless
3375 something triggers), we allocate a separate argv array. */
3377 for (i
= 0; i
< n_commands
; i
++)
3383 for (argc
= 0; commands
[i
].argv
[argc
] != NULL
; argc
++)
3386 argv
= XALLOCAVEC (const char *, argc
+ 3);
3388 argv
[0] = VALGRIND_PATH
;
3390 for (j
= 2; j
< argc
+ 2; j
++)
3391 argv
[j
] = commands
[i
].argv
[j
- 2];
3394 commands
[i
].argv
= argv
;
3395 commands
[i
].prog
= argv
[0];
3399 /* Run each piped subprocess. */
3401 pex
= pex_init (PEX_USE_PIPES
| ((report_times
|| report_times_to_file
)
3402 ? PEX_RECORD_TIMES
: 0),
3403 progname
, temp_filename
);
3405 fatal_error (input_location
, "%<pex_init%> failed: %m");
3407 for (i
= 0; i
< n_commands
; i
++)
3411 const char *string
= commands
[i
].argv
[0];
3413 errmsg
= pex_run (pex
,
3414 ((i
+ 1 == n_commands
? PEX_LAST
: 0)
3415 | (string
== commands
[i
].prog
? PEX_SEARCH
: 0)),
3416 string
, CONST_CAST (char **, commands
[i
].argv
),
3421 fatal_error (input_location
,
3422 err
? G_("cannot execute %qs: %s: %m")
3423 : G_("cannot execute %qs: %s"),
3427 if (i
&& string
!= commands
[i
].prog
)
3428 free (CONST_CAST (char *, string
));
3433 /* Wait for all the subprocesses to finish. */
3437 struct pex_time
*times
= NULL
;
3440 statuses
= XALLOCAVEC (int, n_commands
);
3441 if (!pex_get_status (pex
, n_commands
, statuses
))
3442 fatal_error (input_location
, "failed to get exit status: %m");
3444 if (report_times
|| report_times_to_file
)
3446 times
= XALLOCAVEC (struct pex_time
, n_commands
);
3447 if (!pex_get_times (pex
, n_commands
, times
))
3448 fatal_error (input_location
, "failed to get process times: %m");
3453 for (i
= 0; i
< n_commands
; ++i
)
3455 int status
= statuses
[i
];
3457 if (WIFSIGNALED (status
))
3458 switch (WTERMSIG (status
))
3462 /* SIGQUIT and SIGKILL are not available on MinGW. */
3469 /* The user (or environment) did something to the
3470 inferior. Making this an ICE confuses the user into
3471 thinking there's a compiler bug. Much more likely is
3472 the user or OOM killer nuked it. */
3473 fatal_error (input_location
,
3474 "%s signal terminated program %s",
3475 strsignal (WTERMSIG (status
)),
3481 /* SIGPIPE is a special case. It happens in -pipe mode
3482 when the compiler dies before the preprocessor is
3483 done, or the assembler dies before the compiler is
3484 done. There's generally been an error already, and
3485 this is just fallout. So don't generate another
3486 error unless we would otherwise have succeeded. */
3487 if (signal_count
|| greatest_status
>= MIN_FATAL_STATUS
)
3497 /* The inferior failed to catch the signal. */
3498 internal_error_no_backtrace ("%s signal terminated program %s",
3499 strsignal (WTERMSIG (status
)),
3502 else if (WIFEXITED (status
)
3503 && WEXITSTATUS (status
) >= MIN_FATAL_STATUS
)
3505 /* For ICEs in cc1, cc1obj, cc1plus see if it is
3506 reproducible or not. */
3509 && WEXITSTATUS (status
) == ICE_EXIT_CODE
3511 && (p
= strrchr (commands
[0].argv
[0], DIR_SEPARATOR
))
3512 && startswith (p
+ 1, "cc1"))
3513 try_generate_repro (commands
[0].argv
);
3514 if (WEXITSTATUS (status
) > greatest_status
)
3515 greatest_status
= WEXITSTATUS (status
);
3519 if (report_times
|| report_times_to_file
)
3521 struct pex_time
*pt
= ×
[i
];
3524 ut
= ((double) pt
->user_seconds
3525 + (double) pt
->user_microseconds
/ 1.0e6
);
3526 st
= ((double) pt
->system_seconds
3527 + (double) pt
->system_microseconds
/ 1.0e6
);
3532 fnotice (stderr
, "# %s %.2f %.2f\n",
3533 commands
[i
].prog
, ut
, st
);
3535 if (report_times_to_file
)
3538 const char *const *j
;
3540 fprintf (report_times_to_file
, "%g %g", ut
, st
);
3542 for (j
= &commands
[i
].prog
; *j
; j
= &commands
[i
].argv
[++c
])
3545 for (p
= *j
; *p
; ++p
)
3546 if (*p
== '"' || *p
== '\\' || *p
== '$'
3552 fprintf (report_times_to_file
, " \"");
3553 for (p
= *j
; *p
; ++p
)
3555 if (*p
== '"' || *p
== '\\' || *p
== '$')
3556 fputc ('\\', report_times_to_file
);
3557 fputc (*p
, report_times_to_file
);
3559 fputc ('"', report_times_to_file
);
3562 fprintf (report_times_to_file
, " %s", *j
);
3565 fputc ('\n', report_times_to_file
);
3571 if (commands
[0].argv
[0] != commands
[0].prog
)
3572 free (CONST_CAST (char *, commands
[0].argv
[0]));
3578 static struct switchstr
*switches
;
3580 static int n_switches
;
3582 static int n_switches_alloc
;
3584 /* Set to zero if -fcompare-debug is disabled, positive if it's
3585 enabled and we're running the first compilation, negative if it's
3586 enabled and we're running the second compilation. For most of the
3587 time, it's in the range -1..1, but it can be temporarily set to 2
3588 or 3 to indicate that the -fcompare-debug flags didn't come from
3589 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3590 variable, until a synthesized -fcompare-debug flag is added to the
3594 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3595 int compare_debug_second
;
3597 /* Set to the flags that should be passed to the second compilation in
3598 a -fcompare-debug compilation. */
3599 const char *compare_debug_opt
;
3601 static struct switchstr
*switches_debug_check
[2];
3603 static int n_switches_debug_check
[2];
3605 static int n_switches_alloc_debug_check
[2];
3607 static char *debug_check_temp_file
[2];
3609 /* Language is one of three things:
3611 1) The name of a real programming language.
3612 2) NULL, indicating that no one has figured out
3614 3) '*', indicating that the file should be passed
3619 const char *language
;
3620 struct compiler
*incompiler
;
3625 /* Also a vector of input files specified. */
3627 static struct infile
*infiles
;
3631 static int n_infiles_alloc
;
3633 /* True if undefined environment variables encountered during spec processing
3634 are ok to ignore, typically when we're running for --help or --version. */
3636 static bool spec_undefvar_allowed
;
3638 /* True if multiple input files are being compiled to a single
3641 static bool combine_inputs
;
3643 /* This counts the number of libraries added by lang_specific_driver, so that
3644 we can tell if there were any user supplied any files or libraries. */
3646 static int added_libraries
;
3648 /* And a vector of corresponding output files is made up later. */
3650 const char **outfiles
;
3652 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3654 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3655 is true if we should look for an executable suffix. DO_OBJ
3656 is true if we should look for an object suffix. */
3659 convert_filename (const char *name
, int do_exe ATTRIBUTE_UNUSED
,
3660 int do_obj ATTRIBUTE_UNUSED
)
3662 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3670 len
= strlen (name
);
3672 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3673 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3674 if (do_obj
&& len
> 2
3675 && name
[len
- 2] == '.'
3676 && name
[len
- 1] == 'o')
3678 obstack_grow (&obstack
, name
, len
- 2);
3679 obstack_grow0 (&obstack
, TARGET_OBJECT_SUFFIX
, strlen (TARGET_OBJECT_SUFFIX
));
3680 name
= XOBFINISH (&obstack
, const char *);
3684 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3685 /* If there is no filetype, make it the executable suffix (which includes
3686 the "."). But don't get confused if we have just "-o". */
3687 if (! do_exe
|| TARGET_EXECUTABLE_SUFFIX
[0] == 0 || not_actual_file_p (name
))
3690 for (i
= len
- 1; i
>= 0; i
--)
3691 if (IS_DIR_SEPARATOR (name
[i
]))
3694 for (i
++; i
< len
; i
++)
3698 obstack_grow (&obstack
, name
, len
);
3699 obstack_grow0 (&obstack
, TARGET_EXECUTABLE_SUFFIX
,
3700 strlen (TARGET_EXECUTABLE_SUFFIX
));
3701 name
= XOBFINISH (&obstack
, const char *);
3708 /* Display the command line switches accepted by gcc. */
3712 printf (_("Usage: %s [options] file...\n"), progname
);
3713 fputs (_("Options:\n"), stdout
);
3715 fputs (_(" -pass-exit-codes Exit with highest error code from a phase.\n"), stdout
);
3716 fputs (_(" --help Display this information.\n"), stdout
);
3717 fputs (_(" --target-help Display target specific command line options "
3718 "(including assembler and linker options).\n"), stdout
);
3719 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"), stdout
);
3720 fputs (_(" Display specific types of command line options.\n"), stdout
);
3722 fputs (_(" (Use '-v --help' to display command line options of sub-processes).\n"), stdout
);
3723 fputs (_(" --version Display compiler version information.\n"), stdout
);
3724 fputs (_(" -dumpspecs Display all of the built in spec strings.\n"), stdout
);
3725 fputs (_(" -dumpversion Display the version of the compiler.\n"), stdout
);
3726 fputs (_(" -dumpmachine Display the compiler's target processor.\n"), stdout
);
3727 fputs (_(" -foffload=<targets> Specify offloading targets.\n"), stdout
);
3728 fputs (_(" -print-search-dirs Display the directories in the compiler's search path.\n"), stdout
);
3729 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library.\n"), stdout
);
3730 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>.\n"), stdout
);
3731 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n"), stdout
);
3733 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3734 a component in the library path.\n"), stdout
);
3735 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc.\n"), stdout
);
3737 -print-multi-lib Display the mapping between command line options and\n\
3738 multiple library search directories.\n"), stdout
);
3739 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries.\n"), stdout
);
3740 fputs (_(" -print-sysroot Display the target libraries directory.\n"), stdout
);
3741 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"), stdout
);
3742 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler.\n"), stdout
);
3743 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n"), stdout
);
3744 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker.\n"), stdout
);
3745 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler.\n"), stdout
);
3746 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n"), stdout
);
3747 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker.\n"), stdout
);
3748 fputs (_(" -save-temps Do not delete intermediate files.\n"), stdout
);
3749 fputs (_(" -save-temps=<arg> Do not delete intermediate files.\n"), stdout
);
3751 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3752 prefixes to other gcc components.\n"), stdout
);
3753 fputs (_(" -pipe Use pipes rather than intermediate files.\n"), stdout
);
3754 fputs (_(" -time Time the execution of each subprocess.\n"), stdout
);
3755 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>.\n"), stdout
);
3756 fputs (_(" -std=<standard> Assume that the input sources are for <standard>.\n"), stdout
);
3758 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3759 and libraries.\n"), stdout
);
3760 fputs (_(" -B <directory> Add <directory> to the compiler's search paths.\n"), stdout
);
3761 fputs (_(" -v Display the programs invoked by the compiler.\n"), stdout
);
3762 fputs (_(" -### Like -v but options quoted and commands not executed.\n"), stdout
);
3763 fputs (_(" -E Preprocess only; do not compile, assemble or link.\n"), stdout
);
3764 fputs (_(" -S Compile only; do not assemble or link.\n"), stdout
);
3765 fputs (_(" -c Compile and assemble, but do not link.\n"), stdout
);
3766 fputs (_(" -o <file> Place the output into <file>.\n"), stdout
);
3767 fputs (_(" -pie Create a dynamically linked position independent\n\
3768 executable.\n"), stdout
);
3769 fputs (_(" -shared Create a shared library.\n"), stdout
);
3771 -x <language> Specify the language of the following input files.\n\
3772 Permissible languages include: c c++ assembler none\n\
3773 'none' means revert to the default behavior of\n\
3774 guessing the language based on the file's extension.\n\
3778 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3779 passed on to the various sub-processes invoked by %s. In order to pass\n\
3780 other options on to these processes the -W<letter> options must be used.\n\
3783 /* The rest of the options are displayed by invocations of the various
3788 add_preprocessor_option (const char *option
, int len
)
3790 preprocessor_options
.safe_push (save_string (option
, len
));
3794 add_assembler_option (const char *option
, int len
)
3796 assembler_options
.safe_push (save_string (option
, len
));
3800 add_linker_option (const char *option
, int len
)
3802 linker_options
.safe_push (save_string (option
, len
));
3805 /* Allocate space for an input file in infiles. */
3810 if (n_infiles_alloc
== 0)
3812 n_infiles_alloc
= 16;
3813 infiles
= XNEWVEC (struct infile
, n_infiles_alloc
);
3815 else if (n_infiles_alloc
== n_infiles
)
3817 n_infiles_alloc
*= 2;
3818 infiles
= XRESIZEVEC (struct infile
, infiles
, n_infiles_alloc
);
3822 /* Store an input file with the given NAME and LANGUAGE in
3826 add_infile (const char *name
, const char *language
)
3829 infiles
[n_infiles
].name
= name
;
3830 infiles
[n_infiles
++].language
= language
;
3833 /* Allocate space for a switch in switches. */
3838 if (n_switches_alloc
== 0)
3840 n_switches_alloc
= 16;
3841 switches
= XNEWVEC (struct switchstr
, n_switches_alloc
);
3843 else if (n_switches_alloc
== n_switches
)
3845 n_switches_alloc
*= 2;
3846 switches
= XRESIZEVEC (struct switchstr
, switches
, n_switches_alloc
);
3850 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3851 as validated if VALIDATED and KNOWN if it is an internal switch. */
3854 save_switch (const char *opt
, size_t n_args
, const char *const *args
,
3855 bool validated
, bool known
)
3858 switches
[n_switches
].part1
= opt
+ 1;
3860 switches
[n_switches
].args
= 0;
3863 switches
[n_switches
].args
= XNEWVEC (const char *, n_args
+ 1);
3864 memcpy (switches
[n_switches
].args
, args
, n_args
* sizeof (const char *));
3865 switches
[n_switches
].args
[n_args
] = NULL
;
3868 switches
[n_switches
].live_cond
= 0;
3869 switches
[n_switches
].validated
= validated
;
3870 switches
[n_switches
].known
= known
;
3871 switches
[n_switches
].ordering
= 0;
3875 /* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3879 set_source_date_epoch_envvar ()
3881 /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3882 of 64 bit integers. */
3883 char source_date_epoch
[21];
3888 if (tt
< (time_t) 0 || errno
!= 0)
3891 snprintf (source_date_epoch
, 21, "%llu", (unsigned long long) tt
);
3892 /* Using setenv instead of xputenv because we want the variable to remain
3893 after finalizing so that it's still set in the second run when using
3895 setenv ("SOURCE_DATE_EPOCH", source_date_epoch
, 0);
3898 /* Handle an option DECODED that is unknown to the option-processing
3902 driver_unknown_option_callback (const struct cl_decoded_option
*decoded
)
3904 const char *opt
= decoded
->arg
;
3905 if (opt
[1] == 'W' && opt
[2] == 'n' && opt
[3] == 'o' && opt
[4] == '-'
3906 && !(decoded
->errors
& CL_ERR_NEGATIVE
))
3908 /* Leave unknown -Wno-* options for the compiler proper, to be
3909 diagnosed only if there are warnings. */
3910 save_switch (decoded
->canonical_option
[0],
3911 decoded
->canonical_option_num_elements
- 1,
3912 &decoded
->canonical_option
[1], false, true);
3915 if (decoded
->opt_index
== OPT_SPECIAL_unknown
)
3917 /* Give it a chance to define it a spec file. */
3918 save_switch (decoded
->canonical_option
[0],
3919 decoded
->canonical_option_num_elements
- 1,
3920 &decoded
->canonical_option
[1], false, false);
3927 /* Handle an option DECODED that is not marked as CL_DRIVER.
3928 LANG_MASK will always be CL_DRIVER. */
3931 driver_wrong_lang_callback (const struct cl_decoded_option
*decoded
,
3932 unsigned int lang_mask ATTRIBUTE_UNUSED
)
3934 /* At this point, non-driver options are accepted (and expected to
3935 be passed down by specs) unless marked to be rejected by the
3936 driver. Options to be rejected by the driver but accepted by the
3937 compilers proper are treated just like completely unknown
3939 const struct cl_option
*option
= &cl_options
[decoded
->opt_index
];
3941 if (option
->cl_reject_driver
)
3942 error ("unrecognized command-line option %qs",
3943 decoded
->orig_option_with_args_text
);
3945 save_switch (decoded
->canonical_option
[0],
3946 decoded
->canonical_option_num_elements
- 1,
3947 &decoded
->canonical_option
[1], false, true);
3950 static const char *spec_lang
= 0;
3951 static int last_language_n_infiles
;
3954 /* Check that GCC is configured to support the offload target. */
3957 check_offload_target_name (const char *target
, ptrdiff_t len
)
3959 const char *n
, *c
= OFFLOAD_TARGETS
;
3962 n
= strchr (c
, ',');
3964 n
= strchr (c
, '\0');
3965 if (len
== n
- c
&& strncmp (target
, c
, n
- c
) == 0)
3967 c
= *n
? n
+ 1 : NULL
;
3971 auto_vec
<const char*> candidates
;
3972 size_t olen
= strlen (OFFLOAD_TARGETS
) + 1;
3973 char *cand
= XALLOCAVEC (char, olen
);
3974 memcpy (cand
, OFFLOAD_TARGETS
, olen
);
3975 for (c
= strtok (cand
, ","); c
; c
= strtok (NULL
, ","))
3976 candidates
.safe_push (c
);
3977 candidates
.safe_push ("default");
3978 candidates
.safe_push ("disable");
3980 char *target2
= XALLOCAVEC (char, len
+ 1);
3981 memcpy (target2
, target
, len
);
3982 target2
[len
] = '\0';
3984 error ("GCC is not configured to support %qs as %<-foffload=%> argument",
3988 const char *hint
= candidates_list_and_hint (target2
, s
, candidates
);
3990 inform (UNKNOWN_LOCATION
,
3991 "valid %<-foffload=%> arguments are: %s; "
3992 "did you mean %qs?", s
, hint
);
3994 inform (UNKNOWN_LOCATION
, "valid %<-foffload=%> arguments are: %s", s
);
4001 /* Sanity check for -foffload-options. */
4004 check_foffload_target_names (const char *arg
)
4006 const char *cur
, *next
, *end
;
4007 /* If option argument starts with '-' then no target is specified and we
4008 do not need to parse it. */
4011 end
= strchr (arg
, '=');
4014 error ("%<=%>options missing after %<-foffload-options=%>target");
4021 next
= strchr (cur
, ',');
4024 next
= (next
> end
) ? end
: next
;
4026 /* Retain non-supported targets after printing an error as those will not
4027 be processed; each enabled target only processes its triplet. */
4028 check_offload_target_name (cur
, next
- cur
);
4033 /* Parse -foffload option argument. */
4036 handle_foffload_option (const char *arg
)
4038 const char *c
, *cur
, *n
, *next
, *end
;
4041 /* If option argument starts with '-' then no target is specified and we
4042 do not need to parse it. */
4046 end
= strchr (arg
, '=');
4048 end
= strchr (arg
, '\0');
4053 next
= strchr (cur
, ',');
4056 next
= (next
> end
) ? end
: next
;
4058 target
= XNEWVEC (char, next
- cur
+ 1);
4059 memcpy (target
, cur
, next
- cur
);
4060 target
[next
- cur
] = '\0';
4062 /* Reset offloading list and continue. */
4063 if (strcmp (target
, "default") == 0)
4065 free (offload_targets
);
4066 offload_targets
= NULL
;
4070 /* If 'disable' is passed to the option, clean the list of
4071 offload targets and return, even if more targets follow.
4072 Likewise if GCC is not configured to support that offload target. */
4073 if (strcmp (target
, "disable") == 0
4074 || !check_offload_target_name (target
, next
- cur
))
4076 free (offload_targets
);
4077 offload_targets
= xstrdup ("");
4081 if (!offload_targets
)
4083 offload_targets
= target
;
4088 /* Check that the target hasn't already presented in the list. */
4089 c
= offload_targets
;
4092 n
= strchr (c
, ':');
4094 n
= strchr (c
, '\0');
4096 if (next
- cur
== n
- c
&& strncmp (c
, target
, n
- c
) == 0)
4103 /* If duplicate is not found, append the target to the list. */
4106 size_t offload_targets_len
= strlen (offload_targets
);
4108 = XRESIZEVEC (char, offload_targets
,
4109 offload_targets_len
+ 1 + next
- cur
+ 1);
4110 offload_targets
[offload_targets_len
++] = ':';
4111 memcpy (offload_targets
+ offload_targets_len
, target
, next
- cur
+ 1);
4116 XDELETEVEC (target
);
4120 /* Handle a driver option; arguments and return value as for
4124 driver_handle_option (struct gcc_options
*opts
,
4125 struct gcc_options
*opts_set
,
4126 const struct cl_decoded_option
*decoded
,
4127 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
4129 const struct cl_option_handlers
*handlers ATTRIBUTE_UNUSED
,
4130 diagnostic_context
*dc
,
4133 size_t opt_index
= decoded
->opt_index
;
4134 const char *arg
= decoded
->arg
;
4135 const char *compare_debug_replacement_opt
;
4136 int value
= decoded
->value
;
4137 bool validated
= false;
4138 bool do_save
= true;
4140 gcc_assert (opts
== &global_options
);
4141 gcc_assert (opts_set
== &global_options_set
);
4142 gcc_assert (kind
== DK_UNSPECIFIED
);
4143 gcc_assert (loc
== UNKNOWN_LOCATION
);
4144 gcc_assert (dc
== global_dc
);
4150 struct spec_list
*sl
;
4152 for (sl
= specs
; sl
; sl
= sl
->next
)
4153 printf ("*%s:\n%s\n\n", sl
->name
, *(sl
->ptr_spec
));
4154 if (link_command_spec
)
4155 printf ("*link_command:\n%s\n\n", link_command_spec
);
4159 case OPT_dumpversion
:
4160 printf ("%s\n", spec_version
);
4163 case OPT_dumpmachine
:
4164 printf ("%s\n", spec_machine
);
4167 case OPT_dumpfullversion
:
4168 printf ("%s\n", BASEVER
);
4174 /* CPP driver cannot obtain switch from cc1_options. */
4176 add_preprocessor_option ("--version", strlen ("--version"));
4177 add_assembler_option ("--version", strlen ("--version"));
4178 add_linker_option ("--version", strlen ("--version"));
4181 case OPT__completion_
:
4183 completion
= decoded
->arg
;
4187 print_help_list
= 1;
4189 /* CPP driver cannot obtain switch from cc1_options. */
4191 add_preprocessor_option ("--help", 6);
4192 add_assembler_option ("--help", 6);
4193 add_linker_option ("--help", 6);
4197 print_subprocess_help
= 2;
4200 case OPT__target_help
:
4201 print_subprocess_help
= 1;
4203 /* CPP driver cannot obtain switch from cc1_options. */
4205 add_preprocessor_option ("--target-help", 13);
4206 add_assembler_option ("--target-help", 13);
4207 add_linker_option ("--target-help", 13);
4210 case OPT__no_sysroot_suffix
:
4211 case OPT_pass_exit_codes
:
4212 case OPT_print_search_dirs
:
4213 case OPT_print_file_name_
:
4214 case OPT_print_prog_name_
:
4215 case OPT_print_multi_lib
:
4216 case OPT_print_multi_directory
:
4217 case OPT_print_sysroot
:
4218 case OPT_print_multi_os_directory
:
4219 case OPT_print_multiarch
:
4220 case OPT_print_sysroot_headers_suffix
:
4223 /* These options set the variables specified in common.opt
4224 automatically, and do not need to be saved for spec
4229 case OPT_print_libgcc_file_name
:
4230 print_file_name
= "libgcc.a";
4234 case OPT_fuse_ld_bfd
:
4238 case OPT_fuse_ld_gold
:
4242 case OPT_fuse_ld_mold
:
4246 case OPT_fcompare_debug_second
:
4247 compare_debug_second
= 1;
4250 case OPT_fcompare_debug
:
4254 compare_debug_replacement_opt
= "-fcompare-debug=";
4256 goto compare_debug_with_arg
;
4259 compare_debug_replacement_opt
= "-fcompare-debug=-gtoggle";
4261 goto compare_debug_with_arg
;
4268 case OPT_fcompare_debug_
:
4269 compare_debug_replacement_opt
= decoded
->canonical_option
[0];
4270 compare_debug_with_arg
:
4271 gcc_assert (decoded
->canonical_option_num_elements
== 1);
4272 gcc_assert (arg
!= NULL
);
4277 if (compare_debug
< 0)
4278 compare_debug_opt
= NULL
;
4280 compare_debug_opt
= arg
;
4281 save_switch (compare_debug_replacement_opt
, 0, NULL
, validated
, true);
4282 set_source_date_epoch_envvar ();
4285 case OPT_fdiagnostics_color_
:
4286 diagnostic_color_init (dc
, value
);
4289 case OPT_fdiagnostics_urls_
:
4290 diagnostic_urls_init (dc
, value
);
4293 case OPT_fdiagnostics_format_
:
4295 const char *basename
= (opts
->x_dump_base_name
? opts
->x_dump_base_name
4296 : opts
->x_main_input_basename
);
4297 diagnostic_output_format_init (dc
, basename
,
4298 (enum diagnostics_output_format
)value
);
4305 /* Pass the rest of this option to the assembler. */
4307 /* Split the argument at commas. */
4309 for (j
= 0; arg
[j
]; j
++)
4312 add_assembler_option (arg
+ prev
, j
- prev
);
4316 /* Record the part after the last comma. */
4317 add_assembler_option (arg
+ prev
, j
- prev
);
4325 /* Pass the rest of this option to the preprocessor. */
4327 /* Split the argument at commas. */
4329 for (j
= 0; arg
[j
]; j
++)
4332 add_preprocessor_option (arg
+ prev
, j
- prev
);
4336 /* Record the part after the last comma. */
4337 add_preprocessor_option (arg
+ prev
, j
- prev
);
4345 /* Split the argument at commas. */
4347 for (j
= 0; arg
[j
]; j
++)
4350 add_infile (save_string (arg
+ prev
, j
- prev
), "*");
4353 /* Record the part after the last comma. */
4354 add_infile (arg
+ prev
, "*");
4360 add_infile (arg
, "*");
4364 case OPT_Xpreprocessor
:
4365 add_preprocessor_option (arg
, strlen (arg
));
4369 case OPT_Xassembler
:
4370 add_assembler_option (arg
, strlen (arg
));
4375 /* POSIX allows separation of -l and the lib arg; canonicalize
4376 by concatenating -l with its arg */
4377 add_infile (concat ("-l", arg
, NULL
), "*");
4382 /* Similarly, canonicalize -L for linkers that may not accept
4383 separate arguments. */
4384 save_switch (concat ("-L", arg
, NULL
), 0, NULL
, validated
, true);
4389 save_switch (concat ("-F", arg
, NULL
), 0, NULL
, validated
, true);
4392 case OPT_save_temps
:
4393 if (!save_temps_flag
)
4394 save_temps_flag
= SAVE_TEMPS_DUMP
;
4398 case OPT_save_temps_
:
4399 if (strcmp (arg
, "cwd") == 0)
4400 save_temps_flag
= SAVE_TEMPS_CWD
;
4401 else if (strcmp (arg
, "obj") == 0
4402 || strcmp (arg
, "object") == 0)
4403 save_temps_flag
= SAVE_TEMPS_OBJ
;
4405 fatal_error (input_location
, "%qs is an unknown %<-save-temps%> option",
4406 decoded
->orig_option_with_args_text
);
4407 save_temps_overrides_dumpdir
= true;
4412 dumpdir
= xstrdup (arg
);
4413 save_temps_overrides_dumpdir
= false;
4418 dumpbase
= xstrdup (arg
);
4421 case OPT_dumpbase_ext
:
4422 free (dumpbase_ext
);
4423 dumpbase_ext
= xstrdup (arg
);
4426 case OPT_no_canonical_prefixes
:
4427 /* Already handled as a special case, so ignored here. */
4433 /* These options set the variables specified in common.opt
4434 automatically, but do need to be saved for spec
4440 struct user_specs
*user
= XNEW (struct user_specs
);
4442 user
->next
= (struct user_specs
*) 0;
4443 user
->filename
= arg
;
4444 if (user_specs_tail
)
4445 user_specs_tail
->next
= user
;
4447 user_specs_head
= user
;
4448 user_specs_tail
= user
;
4454 target_system_root
= arg
;
4455 target_system_root_changed
= 1;
4456 /* Saving this option is useful to let self-specs decide to
4457 provide a default one. */
4463 if (report_times_to_file
)
4464 fclose (report_times_to_file
);
4465 report_times_to_file
= fopen (arg
, "a");
4471 This is similar to -v except that there is no execution
4472 of the commands and the echoed arguments are quoted. It
4473 is intended for use in shell scripts to capture the
4474 driver-generated command line. */
4475 verbose_only_flag
++;
4482 size_t len
= strlen (arg
);
4484 /* Catch the case where the user has forgotten to append a
4485 directory separator to the path. Note, they may be using
4486 -B to add an executable name prefix, eg "i386-elf-", in
4487 order to distinguish between multiple installations of
4488 GCC in the same directory. Hence we must check to see
4489 if appending a directory separator actually makes a
4490 valid directory name. */
4491 if (!IS_DIR_SEPARATOR (arg
[len
- 1])
4492 && is_directory (arg
, false))
4494 char *tmp
= XNEWVEC (char, len
+ 2);
4496 tmp
[len
] = DIR_SEPARATOR
;
4501 add_prefix (&exec_prefixes
, arg
, NULL
,
4502 PREFIX_PRIORITY_B_OPT
, 0, 0);
4503 add_prefix (&startfile_prefixes
, arg
, NULL
,
4504 PREFIX_PRIORITY_B_OPT
, 0, 0);
4505 add_prefix (&include_prefixes
, arg
, NULL
,
4506 PREFIX_PRIORITY_B_OPT
, 0, 0);
4517 if (!strcmp (spec_lang
, "none"))
4518 /* Suppress the warning if -xnone comes after the last input
4519 file, because alternate command interfaces like g++ might
4520 find it useful to place -xnone after each input file. */
4523 last_language_n_infiles
= n_infiles
;
4529 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4530 arg
= convert_filename (arg
, ! have_c
, 0);
4533 /* On some systems, ld cannot handle "-o" without a space. So
4534 split the option from its argument. */
4535 save_switch ("-o", 1, &arg
, validated
, true);
4538 #ifdef ENABLE_DEFAULT_PIE
4540 /* -pie is turned on by default. */
4543 case OPT_static_libgcc
:
4544 case OPT_shared_libgcc
:
4545 case OPT_static_libgfortran
:
4546 case OPT_static_libquadmath
:
4547 case OPT_static_libphobos
:
4548 case OPT_static_libgm2
:
4549 case OPT_static_libstdc__
:
4550 /* These are always valid; gcc.cc itself understands the first two
4551 gfortranspec.cc understands -static-libgfortran,
4552 libgfortran.spec handles -static-libquadmath,
4553 d-spec.cc understands -static-libphobos,
4554 gm2spec.cc understands -static-libgm2,
4555 and g++spec.cc understands -static-libstdc++. */
4563 case OPT_foffload_options_
:
4564 check_foffload_target_names (arg
);
4568 handle_foffload_option (arg
);
4569 if (arg
[0] == '-' || NULL
!= strchr (arg
, '='))
4570 save_switch (concat ("-foffload-options=", arg
, NULL
),
4571 0, NULL
, validated
, true);
4576 /* Various driver options need no special processing at this
4577 point, having been handled in a prescan above or being
4578 handled by specs. */
4583 save_switch (decoded
->canonical_option
[0],
4584 decoded
->canonical_option_num_elements
- 1,
4585 &decoded
->canonical_option
[1], validated
, true);
4589 /* Return true if F2 is F1 followed by a single suffix, i.e., by a
4590 period and additional characters other than a period. */
4593 adds_single_suffix_p (const char *f2
, const char *f1
)
4595 size_t len
= strlen (f1
);
4597 return (strncmp (f1
, f2
, len
) == 0
4599 && strchr (f2
+ len
+ 1, '.') == NULL
);
4602 /* Put the driver's standard set of option handlers in *HANDLERS. */
4605 set_option_handlers (struct cl_option_handlers
*handlers
)
4607 handlers
->unknown_option_callback
= driver_unknown_option_callback
;
4608 handlers
->wrong_lang_callback
= driver_wrong_lang_callback
;
4609 handlers
->num_handlers
= 3;
4610 handlers
->handlers
[0].handler
= driver_handle_option
;
4611 handlers
->handlers
[0].mask
= CL_DRIVER
;
4612 handlers
->handlers
[1].handler
= common_handle_option
;
4613 handlers
->handlers
[1].mask
= CL_COMMON
;
4614 handlers
->handlers
[2].handler
= target_handle_option
;
4615 handlers
->handlers
[2].mask
= CL_TARGET
;
4619 /* Return the index into infiles for the single non-library
4620 non-lto-wpa input file, -1 if there isn't any, or -2 if there is
4623 single_input_file_index ()
4627 for (int i
= 0; i
< n_infiles
; i
++)
4629 if (infiles
[i
].language
4630 && (infiles
[i
].language
[0] == '*'
4632 && strcmp (infiles
[i
].language
, "lto") == 0)))
4644 /* Create the vector `switches' and its contents.
4645 Store its length in `n_switches'. */
4648 process_command (unsigned int decoded_options_count
,
4649 struct cl_decoded_option
*decoded_options
)
4653 char *tooldir_prefix
, *tooldir_prefix2
;
4654 char *(*get_relative_prefix
) (const char *, const char *,
4655 const char *) = NULL
;
4656 struct cl_option_handlers handlers
;
4659 gcc_exec_prefix
= env
.get ("GCC_EXEC_PREFIX");
4663 added_libraries
= 0;
4665 /* Figure compiler version from version string. */
4667 compiler_version
= temp1
= xstrdup (version_string
);
4669 for (; *temp1
; ++temp1
)
4678 /* Handle any -no-canonical-prefixes flag early, to assign the function
4679 that builds relative prefixes. This function creates default search
4680 paths that are needed later in normal option handling. */
4682 for (j
= 1; j
< decoded_options_count
; j
++)
4684 if (decoded_options
[j
].opt_index
== OPT_no_canonical_prefixes
)
4686 get_relative_prefix
= make_relative_prefix_ignore_links
;
4690 if (! get_relative_prefix
)
4691 get_relative_prefix
= make_relative_prefix
;
4693 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
4694 see if we can create it from the pathname specified in
4695 decoded_options[0].arg. */
4697 gcc_libexec_prefix
= standard_libexec_prefix
;
4699 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
4700 if (!gcc_exec_prefix
)
4702 gcc_exec_prefix
= get_relative_prefix (decoded_options
[0].arg
,
4703 standard_bindir_prefix
,
4704 standard_exec_prefix
);
4705 gcc_libexec_prefix
= get_relative_prefix (decoded_options
[0].arg
,
4706 standard_bindir_prefix
,
4707 standard_libexec_prefix
);
4708 if (gcc_exec_prefix
)
4709 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix
, NULL
));
4713 /* make_relative_prefix requires a program name, but
4714 GCC_EXEC_PREFIX is typically a directory name with a trailing
4715 / (which is ignored by make_relative_prefix), so append a
4717 char *tmp_prefix
= concat (gcc_exec_prefix
, "gcc", NULL
);
4718 gcc_libexec_prefix
= get_relative_prefix (tmp_prefix
,
4719 standard_exec_prefix
,
4720 standard_libexec_prefix
);
4722 /* The path is unrelocated, so fallback to the original setting. */
4723 if (!gcc_libexec_prefix
)
4724 gcc_libexec_prefix
= standard_libexec_prefix
;
4730 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4731 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4732 or an automatically created GCC_EXEC_PREFIX from
4733 decoded_options[0].arg. */
4735 /* Do language-specific adjustment/addition of flags. */
4736 lang_specific_driver (&decoded_options
, &decoded_options_count
,
4739 if (gcc_exec_prefix
)
4741 int len
= strlen (gcc_exec_prefix
);
4743 if (len
> (int) sizeof ("/lib/gcc/") - 1
4744 && (IS_DIR_SEPARATOR (gcc_exec_prefix
[len
-1])))
4746 temp
= gcc_exec_prefix
+ len
- sizeof ("/lib/gcc/") + 1;
4747 if (IS_DIR_SEPARATOR (*temp
)
4748 && filename_ncmp (temp
+ 1, "lib", 3) == 0
4749 && IS_DIR_SEPARATOR (temp
[4])
4750 && filename_ncmp (temp
+ 5, "gcc", 3) == 0)
4751 len
-= sizeof ("/lib/gcc/") - 1;
4754 set_std_prefix (gcc_exec_prefix
, len
);
4755 add_prefix (&exec_prefixes
, gcc_libexec_prefix
, "GCC",
4756 PREFIX_PRIORITY_LAST
, 0, 0);
4757 add_prefix (&startfile_prefixes
, gcc_exec_prefix
, "GCC",
4758 PREFIX_PRIORITY_LAST
, 0, 0);
4761 /* COMPILER_PATH and LIBRARY_PATH have values
4762 that are lists of directory names with colons. */
4764 temp
= env
.get ("COMPILER_PATH");
4767 const char *startp
, *endp
;
4768 char *nstore
= (char *) alloca (strlen (temp
) + 3);
4770 startp
= endp
= temp
;
4773 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
4775 strncpy (nstore
, startp
, endp
- startp
);
4777 strcpy (nstore
, concat (".", dir_separator_str
, NULL
));
4778 else if (!IS_DIR_SEPARATOR (endp
[-1]))
4780 nstore
[endp
- startp
] = DIR_SEPARATOR
;
4781 nstore
[endp
- startp
+ 1] = 0;
4784 nstore
[endp
- startp
] = 0;
4785 add_prefix (&exec_prefixes
, nstore
, 0,
4786 PREFIX_PRIORITY_LAST
, 0, 0);
4787 add_prefix (&include_prefixes
, nstore
, 0,
4788 PREFIX_PRIORITY_LAST
, 0, 0);
4791 endp
= startp
= endp
+ 1;
4798 temp
= env
.get (LIBRARY_PATH_ENV
);
4799 if (temp
&& *cross_compile
== '0')
4801 const char *startp
, *endp
;
4802 char *nstore
= (char *) alloca (strlen (temp
) + 3);
4804 startp
= endp
= temp
;
4807 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
4809 strncpy (nstore
, startp
, endp
- startp
);
4811 strcpy (nstore
, concat (".", dir_separator_str
, NULL
));
4812 else if (!IS_DIR_SEPARATOR (endp
[-1]))
4814 nstore
[endp
- startp
] = DIR_SEPARATOR
;
4815 nstore
[endp
- startp
+ 1] = 0;
4818 nstore
[endp
- startp
] = 0;
4819 add_prefix (&startfile_prefixes
, nstore
, NULL
,
4820 PREFIX_PRIORITY_LAST
, 0, 1);
4823 endp
= startp
= endp
+ 1;
4830 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4831 temp
= env
.get ("LPATH");
4832 if (temp
&& *cross_compile
== '0')
4834 const char *startp
, *endp
;
4835 char *nstore
= (char *) alloca (strlen (temp
) + 3);
4837 startp
= endp
= temp
;
4840 if (*endp
== PATH_SEPARATOR
|| *endp
== 0)
4842 strncpy (nstore
, startp
, endp
- startp
);
4844 strcpy (nstore
, concat (".", dir_separator_str
, NULL
));
4845 else if (!IS_DIR_SEPARATOR (endp
[-1]))
4847 nstore
[endp
- startp
] = DIR_SEPARATOR
;
4848 nstore
[endp
- startp
+ 1] = 0;
4851 nstore
[endp
- startp
] = 0;
4852 add_prefix (&startfile_prefixes
, nstore
, NULL
,
4853 PREFIX_PRIORITY_LAST
, 0, 1);
4856 endp
= startp
= endp
+ 1;
4863 /* Process the options and store input files and switches in their
4866 last_language_n_infiles
= -1;
4868 set_option_handlers (&handlers
);
4870 for (j
= 1; j
< decoded_options_count
; j
++)
4872 switch (decoded_options
[j
].opt_index
)
4884 for (j
= 1; j
< decoded_options_count
; j
++)
4886 if (decoded_options
[j
].opt_index
== OPT_SPECIAL_input_file
)
4888 const char *arg
= decoded_options
[j
].arg
;
4890 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4891 arg
= convert_filename (arg
, 0, access (arg
, F_OK
));
4893 add_infile (arg
, spec_lang
);
4898 read_cmdline_option (&global_options
, &global_options_set
,
4899 decoded_options
+ j
, UNKNOWN_LOCATION
,
4900 CL_DRIVER
, &handlers
, global_dc
);
4903 /* If the user didn't specify any, default to all configured offload
4905 if (ENABLE_OFFLOADING
&& offload_targets
== NULL
)
4907 handle_foffload_option (OFFLOAD_TARGETS
);
4908 #if OFFLOAD_DEFAULTED
4909 offload_targets_default
= true;
4913 /* Handle -gtoggle as it would later in toplev.cc:process_options to
4914 make the debug-level-gt spec function work as expected. */
4917 if (debug_info_level
== DINFO_LEVEL_NONE
)
4918 debug_info_level
= DINFO_LEVEL_NORMAL
;
4920 debug_info_level
= DINFO_LEVEL_NONE
;
4924 && strcmp (output_file
, "-") != 0
4925 && strcmp (output_file
, HOST_BIT_BUCKET
) != 0)
4928 for (i
= 0; i
< n_infiles
; i
++)
4929 if ((!infiles
[i
].language
|| infiles
[i
].language
[0] != '*')
4930 && canonical_filename_eq (infiles
[i
].name
, output_file
))
4931 fatal_error (input_location
,
4932 "input file %qs is the same as output file",
4936 if (output_file
!= NULL
&& output_file
[0] == '\0')
4937 fatal_error (input_location
, "output filename may not be empty");
4939 /* -dumpdir and -save-temps=* both specify the location of aux/dump
4940 outputs; the one that appears last prevails. When compiling
4941 multiple sources, an explicit dumpbase (minus -ext) may be
4942 combined with an explicit or implicit dumpdir, whereas when
4943 linking, a specified or implied link output name (minus
4944 extension) may be combined with a prevailing -save-temps=* or an
4945 otherwise implied dumpdir, but not override a prevailing
4946 -dumpdir. Primary outputs (e.g., linker output when linking
4947 without -o, or .i, .s or .o outputs when processing multiple
4948 inputs with -E, -S or -c, respectively) are NOT affected by these
4949 -save-temps=/-dump* options, always landing in the current
4950 directory and with the same basename as the input when an output
4951 name is not given, but when they're intermediate outputs, they
4952 are named like other aux outputs, so the options affect their
4955 Here are some examples. There are several more in the
4956 documentation of -o and -dump*, and some quite exhaustive tests
4957 in gcc.misc-tests/outputs.exp.
4959 When compiling any number of sources, no -dump* nor
4960 -save-temps=*, all outputs in cwd without prefix:
4962 # gcc -c b.c -gsplit-dwarf
4963 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
4965 # gcc -c b.c d.c -gsplit-dwarf
4966 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
4967 && cc1 [-dumpdir ./] -dumpbase d.c -dumpbase-ext .c # d.o d.dwo
4969 When compiling and linking, no -dump* nor -save-temps=*, .o
4970 outputs are temporary, aux outputs land in the dir of the output,
4971 prefixed with the basename of the linker output:
4973 # gcc b.c d.c -o ab -gsplit-dwarf
4974 -> cc1 -dumpdir ab- -dumpbase b.c -dumpbase-ext .c # ab-b.dwo
4975 && cc1 -dumpdir ab- -dumpbase d.c -dumpbase-ext .c # ab-d.dwo
4978 # gcc b.c d.c [-o a.out] -gsplit-dwarf
4979 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.dwo
4980 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.dwo
4981 && link ... [-o a.out]
4983 When compiling and linking, a prevailing -dumpdir fully overrides
4984 the prefix of aux outputs given by the output name:
4986 # gcc -dumpdir f b.c d.c -gsplit-dwarf [-o [dir/]whatever]
4987 -> cc1 -dumpdir f -dumpbase b.c -dumpbase-ext .c # fb.dwo
4988 && cc1 -dumpdir f -dumpbase d.c -dumpbase-ext .c # fd.dwo
4989 && link ... [-o whatever]
4991 When compiling multiple inputs, an explicit -dumpbase is combined
4992 with -dumpdir, affecting aux outputs, but not the .o outputs:
4994 # gcc -dumpdir f -dumpbase g- b.c d.c -gsplit-dwarf -c
4995 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # b.o fg-b.dwo
4996 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # d.o fg-d.dwo
4998 When compiling and linking with -save-temps, the .o outputs that
4999 would have been temporary become aux outputs, so they get
5000 affected by -dump* flags:
5002 # gcc -dumpdir f -dumpbase g- -save-temps b.c d.c
5003 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # fg-b.o
5004 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # fg-d.o
5007 If -save-temps=* prevails over -dumpdir, however, the explicit
5008 -dumpdir is discarded, as if it wasn't there. The basename of
5009 the implicit linker output, a.out or a.exe, becomes a- as the aux
5010 output prefix for all compilations:
5012 # gcc [-dumpdir f] -save-temps=cwd b.c d.c
5013 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.o
5014 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.o
5017 A single -dumpbase, applying to multiple inputs, overrides the
5018 linker output name, implied or explicit, as the aux output prefix:
5020 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c
5021 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5022 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5025 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c -o dir/h.out
5026 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5027 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5028 && link -o dir/h.out
5030 Now, if the linker output is NOT overridden as a prefix, but
5031 -save-temps=* overrides implicit or explicit -dumpdir, the
5032 effective dump dir combines the dir selected by the -save-temps=*
5033 option with the basename of the specified or implied link output:
5035 # gcc [-dumpdir f] -save-temps=cwd b.c d.c -o dir/h.out
5036 -> cc1 -dumpdir h- -dumpbase b.c -dumpbase-ext .c # h-b.o
5037 && cc1 -dumpdir h- -dumpbase d.c -dumpbase-ext .c # h-d.o
5038 && link -o dir/h.out
5040 # gcc [-dumpdir f] -save-temps=obj b.c d.c -o dir/h.out
5041 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5042 && cc1 -dumpdir dir/h- -dumpbase d.c -dumpbase-ext .c # dir/h-d.o
5043 && link -o dir/h.out
5045 But then again, a single -dumpbase applying to multiple inputs
5046 gets used instead of the linker output basename in the combined
5049 # gcc [-dumpdir f] -dumpbase g- -save-temps=obj b.c d.c -o dir/h.out
5050 -> cc1 -dumpdir dir/g- -dumpbase b.c -dumpbase-ext .c # dir/g-b.o
5051 && cc1 -dumpdir dir/g- -dumpbase d.c -dumpbase-ext .c # dir/g-d.o
5052 && link -o dir/h.out
5054 With a single input being compiled, the output basename does NOT
5055 affect the dumpdir prefix.
5057 # gcc -save-temps=obj b.c -gsplit-dwarf -c -o dir/b.o
5058 -> cc1 -dumpdir dir/ -dumpbase b.c -dumpbase-ext .c # dir/b.o dir/b.dwo
5060 but when compiling and linking even a single file, it does:
5062 # gcc -save-temps=obj b.c -o dir/h.out
5063 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5065 unless an explicit -dumpdir prevails:
5067 # gcc -save-temps[=obj] -dumpdir g- b.c -o dir/h.out
5068 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5072 bool explicit_dumpdir
= dumpdir
;
5074 if ((!save_temps_overrides_dumpdir
&& explicit_dumpdir
)
5075 || (output_file
&& not_actual_file_p (output_file
)))
5080 /* If -save-temps=obj and -o name, create the prefix to use for %b.
5081 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
5082 else if (save_temps_flag
!= SAVE_TEMPS_CWD
&& output_file
!= NULL
)
5086 temp
= lbasename (output_file
);
5087 if (temp
!= output_file
)
5088 dumpdir
= xstrndup (output_file
,
5089 strlen (output_file
) - strlen (temp
));
5097 if (save_temps_flag
)
5098 save_temps_flag
= SAVE_TEMPS_DUMP
;
5100 /* If there is any pathname component in an explicit -dumpbase, it
5101 overrides dumpdir entirely, so discard it right away. Although
5102 the presence of an explicit -dumpdir matters for the driver, it
5103 shouldn't matter for other processes, that get all that's needed
5104 from the -dumpdir and -dumpbase always passed to them. */
5105 if (dumpdir
&& dumpbase
&& lbasename (dumpbase
) != dumpbase
)
5111 /* Check that dumpbase_ext matches the end of dumpbase, drop it
5113 if (dumpbase_ext
&& dumpbase
&& *dumpbase
)
5115 int lendb
= strlen (dumpbase
);
5116 int lendbx
= strlen (dumpbase_ext
);
5118 /* -dumpbase-ext must be a suffix proper; discard it if it
5119 matches all of -dumpbase, as that would make for an empty
5122 || strcmp (dumpbase
+ lendb
- lendbx
, dumpbase_ext
) != 0)
5124 free (dumpbase_ext
);
5125 dumpbase_ext
= NULL
;
5129 /* -dumpbase with multiple sources goes into dumpdir. With a single
5130 source, it does only if linking and if dumpdir was not explicitly
5132 if (dumpbase
&& *dumpbase
5133 && (single_input_file_index () == -2
5134 || (!have_c
&& !explicit_dumpdir
)))
5139 /* We checked that they match above. */
5140 dumpbase
[strlen (dumpbase
) - strlen (dumpbase_ext
)] = '\0';
5143 prefix
= concat (dumpdir
, dumpbase
, "-", NULL
);
5145 prefix
= concat (dumpbase
, "-", NULL
);
5149 free (dumpbase_ext
);
5150 dumpbase
= dumpbase_ext
= NULL
;
5152 dumpdir_trailing_dash_added
= true;
5155 /* If dumpbase was not brought into dumpdir but we're linking, bring
5156 output_file into dumpdir unless dumpdir was explicitly specified.
5157 The test for !explicit_dumpdir is further below, because we want
5158 to use the obase computation for a ghost outbase, passed to
5159 GCC_COLLECT_OPTIONS. */
5160 else if (!have_c
&& (!explicit_dumpdir
|| (dumpbase
&& !*dumpbase
)))
5162 /* If we get here, we know dumpbase was not specified, or it was
5163 specified as an empty string. If it was anything else, it
5164 would have combined with dumpdir above, because the condition
5165 for dumpbase to be used when present is broader than the
5166 condition that gets us here. */
5167 gcc_assert (!dumpbase
|| !*dumpbase
);
5170 char *tofree
= NULL
;
5171 if (!output_file
|| not_actual_file_p (output_file
))
5175 obase
= lbasename (output_file
);
5176 size_t blen
= strlen (obase
), xlen
;
5177 /* Drop the suffix if it's dumpbase_ext, if given,
5178 otherwise .exe or the target executable suffix, or if the
5179 output was explicitly named a.out, but not otherwise. */
5181 ? (blen
> (xlen
= strlen (dumpbase_ext
))
5182 && strcmp ((temp
= (obase
+ blen
- xlen
)),
5184 : ((temp
= strrchr (obase
+ 1, '.'))
5185 && (xlen
= strlen (temp
))
5186 && (strcmp (temp
, ".exe") == 0
5187 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
5188 || strcmp (temp
, TARGET_EXECUTABLE_SUFFIX
) == 0
5190 || strcmp (obase
, "a.out") == 0)))
5192 tofree
= xstrndup (obase
, blen
- xlen
);
5197 /* We wish to save this basename to the -dumpdir passed through
5198 GCC_COLLECT_OPTIONS within maybe_run_linker, for e.g. LTO,
5199 but we do NOT wish to add it to e.g. %b, so we keep
5200 outbase_length as zero. */
5201 gcc_assert (!outbase
);
5204 /* If we're building [dir1/]foo[.exe] out of a single input
5205 [dir2/]foo.c that shares the same basename, dump to
5206 [dir2/]foo.c.* rather than duplicating the basename into
5207 [dir2/]foo-foo.c.*. */
5210 || ((idxin
= single_input_file_index ()) >= 0
5211 && adds_single_suffix_p (lbasename (infiles
[idxin
].name
),
5214 if (obase
== tofree
)
5218 outbase
= xstrdup (obase
);
5221 obase
= tofree
= NULL
;
5227 char *p
= concat (dumpdir
, obase
, "-", NULL
);
5232 dumpdir
= concat (obase
, "-", NULL
);
5234 dumpdir_trailing_dash_added
= true;
5237 obase
= tofree
= NULL
;
5240 if (!explicit_dumpdir
|| dumpbase
)
5242 /* Absent -dumpbase and present -dumpbase-ext have been applied
5243 to the linker output name, so compute fresh defaults for each
5245 free (dumpbase_ext
);
5246 dumpbase_ext
= NULL
;
5250 /* Now, if we're compiling, or if we haven't used the dumpbase
5251 above, then outbase (%B) is derived from dumpbase, if given, or
5252 from the output name, given or implied. We can't precompute
5253 implied output names, but that's ok, since they're derived from
5254 input names. Just make sure we skip this if dumpbase is the
5255 empty string: we want to use input names then, so don't set
5257 if ((dumpbase
|| have_c
)
5258 && !(dumpbase
&& !*dumpbase
))
5260 gcc_assert (!outbase
);
5264 gcc_assert (single_input_file_index () != -2);
5265 /* We do not want lbasename here; dumpbase with dirnames
5266 overrides dumpdir entirely, even if dumpdir is
5269 /* We've already checked above that the suffix matches. */
5270 outbase
= xstrndup (dumpbase
,
5271 strlen (dumpbase
) - strlen (dumpbase_ext
));
5273 outbase
= xstrdup (dumpbase
);
5275 else if (output_file
&& !not_actual_file_p (output_file
))
5277 outbase
= xstrdup (lbasename (output_file
));
5278 char *p
= strrchr (outbase
+ 1, '.');
5284 outbase_length
= strlen (outbase
);
5287 /* If there is any pathname component in an explicit -dumpbase, do
5288 not use dumpdir, but retain it to pass it on to the compiler. */
5290 dumpdir_length
= strlen (dumpdir
);
5294 /* Check that dumpbase_ext, if still present, still matches the end
5295 of dumpbase, if present, and drop it otherwise. We only retained
5296 it above when dumpbase was absent to maybe use it to drop the
5297 extension from output_name before combining it with dumpdir. We
5298 won't deal with -dumpbase-ext when -dumpbase is not explicitly
5299 given, even if just to activate backward-compatible dumpbase:
5300 dropping it on the floor is correct, expected and documented
5301 behavior. Attempting to deal with a -dumpbase-ext that might
5302 match the end of some input filename, or of the combination of
5303 the output basename with the suffix of the input filename,
5304 possible with an intermediate .gk extension for -fcompare-debug,
5305 is just calling for trouble. */
5308 if (!dumpbase
|| !*dumpbase
)
5310 free (dumpbase_ext
);
5311 dumpbase_ext
= NULL
;
5314 gcc_assert (strcmp (dumpbase
+ strlen (dumpbase
)
5315 - strlen (dumpbase_ext
), dumpbase_ext
) == 0);
5318 if (save_temps_flag
&& use_pipes
)
5320 /* -save-temps overrides -pipe, so that temp files are produced */
5321 if (save_temps_flag
)
5322 warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
5328 const char *gcd
= env
.get ("GCC_COMPARE_DEBUG");
5330 if (gcd
&& gcd
[0] == '-')
5333 compare_debug_opt
= gcd
;
5335 else if (gcd
&& *gcd
&& strcmp (gcd
, "0"))
5338 compare_debug_opt
= "-gtoggle";
5341 else if (compare_debug
< 0)
5344 gcc_assert (!compare_debug_opt
);
5347 /* Set up the search paths. We add directories that we expect to
5348 contain GNU Toolchain components before directories specified by
5349 the machine description so that we will find GNU components (like
5350 the GNU assembler) before those of the host system. */
5352 /* If we don't know where the toolchain has been installed, use the
5353 configured-in locations. */
5354 if (!gcc_exec_prefix
)
5357 add_prefix (&exec_prefixes
, standard_libexec_prefix
, "GCC",
5358 PREFIX_PRIORITY_LAST
, 1, 0);
5359 add_prefix (&exec_prefixes
, standard_libexec_prefix
, "BINUTILS",
5360 PREFIX_PRIORITY_LAST
, 2, 0);
5361 add_prefix (&exec_prefixes
, standard_exec_prefix
, "BINUTILS",
5362 PREFIX_PRIORITY_LAST
, 2, 0);
5364 add_prefix (&startfile_prefixes
, standard_exec_prefix
, "BINUTILS",
5365 PREFIX_PRIORITY_LAST
, 1, 0);
5368 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix
));
5369 tooldir_prefix2
= concat (tooldir_base_prefix
, spec_machine
,
5370 dir_separator_str
, NULL
);
5372 /* Look for tools relative to the location from which the driver is
5373 running, or, if that is not available, the configured prefix. */
5375 = concat (gcc_exec_prefix
? gcc_exec_prefix
: standard_exec_prefix
,
5376 spec_host_machine
, dir_separator_str
, spec_version
,
5377 accel_dir_suffix
, dir_separator_str
, tooldir_prefix2
, NULL
);
5378 free (tooldir_prefix2
);
5380 add_prefix (&exec_prefixes
,
5381 concat (tooldir_prefix
, "bin", dir_separator_str
, NULL
),
5382 "BINUTILS", PREFIX_PRIORITY_LAST
, 0, 0);
5383 add_prefix (&startfile_prefixes
,
5384 concat (tooldir_prefix
, "lib", dir_separator_str
, NULL
),
5385 "BINUTILS", PREFIX_PRIORITY_LAST
, 0, 1);
5386 free (tooldir_prefix
);
5388 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
5389 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
5390 then consider it to relocate with the rest of the GCC installation
5391 if GCC_EXEC_PREFIX is set.
5392 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
5393 if (target_system_root
&& !target_system_root_changed
&& gcc_exec_prefix
)
5395 char *tmp_prefix
= get_relative_prefix (decoded_options
[0].arg
,
5396 standard_bindir_prefix
,
5397 target_system_root
);
5398 if (tmp_prefix
&& access_check (tmp_prefix
, F_OK
) == 0)
5400 target_system_root
= tmp_prefix
;
5401 target_system_root_changed
= 1;
5406 /* More prefixes are enabled in main, after we read the specs file
5407 and determine whether this is cross-compilation or not. */
5409 if (n_infiles
!= 0 && n_infiles
== last_language_n_infiles
&& spec_lang
!= 0)
5410 warning (0, "%<-x %s%> after last input file has no effect", spec_lang
);
5412 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
5413 environment variable. */
5414 if (compare_debug
== 2 || compare_debug
== 3)
5416 const char *opt
= concat ("-fcompare-debug=", compare_debug_opt
, NULL
);
5417 save_switch (opt
, 0, NULL
, false, true);
5421 /* Ensure we only invoke each subprocess once. */
5423 && (print_subprocess_help
|| print_help_list
|| print_version
))
5425 /* Create a dummy input file, so that we can pass
5426 the help option on to the various sub-processes. */
5427 add_infile ("help-dummy", "c");
5430 /* Decide if undefined variable references are allowed in specs. */
5432 /* -v alone is safe. --version and --help alone or together are safe. Note
5433 that -v would make them unsafe, as they'd then be run for subprocesses as
5434 well, the location of which might depend on variables possibly coming
5435 from self-specs. Note also that the command name is counted in
5436 decoded_options_count. */
5438 unsigned help_version_count
= 0;
5441 help_version_count
++;
5443 if (print_help_list
)
5444 help_version_count
++;
5446 spec_undefvar_allowed
=
5447 ((verbose_flag
&& decoded_options_count
== 2)
5448 || help_version_count
== decoded_options_count
- 1);
5451 switches
[n_switches
].part1
= 0;
5453 infiles
[n_infiles
].name
= 0;
5456 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
5457 and place that in the environment. */
5460 set_collect_gcc_options (void)
5465 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5467 obstack_grow (&collect_obstack
, "COLLECT_GCC_OPTIONS=",
5468 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5471 for (i
= 0; (int) i
< n_switches
; i
++)
5473 const char *const *args
;
5476 obstack_grow (&collect_obstack
, " ", 1);
5480 /* Ignore elided switches. */
5481 if ((switches
[i
].live_cond
5482 & (SWITCH_IGNORE
| SWITCH_KEEP_FOR_GCC
))
5486 obstack_grow (&collect_obstack
, "'-", 2);
5487 q
= switches
[i
].part1
;
5488 while ((p
= strchr (q
, '\'')))
5490 obstack_grow (&collect_obstack
, q
, p
- q
);
5491 obstack_grow (&collect_obstack
, "'\\''", 4);
5494 obstack_grow (&collect_obstack
, q
, strlen (q
));
5495 obstack_grow (&collect_obstack
, "'", 1);
5497 for (args
= switches
[i
].args
; args
&& *args
; args
++)
5499 obstack_grow (&collect_obstack
, " '", 2);
5501 while ((p
= strchr (q
, '\'')))
5503 obstack_grow (&collect_obstack
, q
, p
- q
);
5504 obstack_grow (&collect_obstack
, "'\\''", 4);
5507 obstack_grow (&collect_obstack
, q
, strlen (q
));
5508 obstack_grow (&collect_obstack
, "'", 1);
5515 obstack_grow (&collect_obstack
, " ", 1);
5518 obstack_grow (&collect_obstack
, "'-dumpdir' '", 12);
5522 while ((p
= strchr (q
, '\'')))
5524 obstack_grow (&collect_obstack
, q
, p
- q
);
5525 obstack_grow (&collect_obstack
, "'\\''", 4);
5528 obstack_grow (&collect_obstack
, q
, strlen (q
));
5530 obstack_grow (&collect_obstack
, "'", 1);
5533 obstack_grow (&collect_obstack
, "\0", 1);
5534 xputenv (XOBFINISH (&collect_obstack
, char *));
5537 /* Process a spec string, accumulating and running commands. */
5539 /* These variables describe the input file name.
5540 input_file_number is the index on outfiles of this file,
5541 so that the output file name can be stored for later use by %o.
5542 input_basename is the start of the part of the input file
5543 sans all directory names, and basename_length is the number
5544 of characters starting there excluding the suffix .c or whatever. */
5546 static const char *gcc_input_filename
;
5547 static int input_file_number
;
5548 size_t input_filename_length
;
5549 static int basename_length
;
5550 static int suffixed_basename_length
;
5551 static const char *input_basename
;
5552 static const char *input_suffix
;
5553 #ifndef HOST_LACKS_INODE_NUMBERS
5554 static struct stat input_stat
;
5556 static int input_stat_set
;
5558 /* The compiler used to process the current input file. */
5559 static struct compiler
*input_file_compiler
;
5561 /* These are variables used within do_spec and do_spec_1. */
5563 /* Nonzero if an arg has been started and not yet terminated
5564 (with space, tab or newline). */
5565 static int arg_going
;
5567 /* Nonzero means %d or %g has been seen; the next arg to be terminated
5568 is a temporary file name. */
5569 static int delete_this_arg
;
5571 /* Nonzero means %w has been seen; the next arg to be terminated
5572 is the output file name of this compilation. */
5573 static int this_is_output_file
;
5575 /* Nonzero means %s has been seen; the next arg to be terminated
5576 is the name of a library file and we should try the standard
5577 search dirs for it. */
5578 static int this_is_library_file
;
5580 /* Nonzero means %T has been seen; the next arg to be terminated
5581 is the name of a linker script and we should try all of the
5582 standard search dirs for it. If it is found insert a --script
5583 command line switch and then substitute the full path in place,
5584 otherwise generate an error message. */
5585 static int this_is_linker_script
;
5587 /* Nonzero means that the input of this command is coming from a pipe. */
5588 static int input_from_pipe
;
5590 /* Nonnull means substitute this for any suffix when outputting a switches
5592 static const char *suffix_subst
;
5594 /* If there is an argument being accumulated, terminate it and store it. */
5597 end_going_arg (void)
5603 obstack_1grow (&obstack
, 0);
5604 string
= XOBFINISH (&obstack
, const char *);
5605 if (this_is_library_file
)
5606 string
= find_file (string
);
5607 if (this_is_linker_script
)
5609 char * full_script_path
= find_a_file (&startfile_prefixes
, string
, R_OK
, true);
5611 if (full_script_path
== NULL
)
5613 error ("unable to locate default linker script %qs in the library search paths", string
);
5614 /* Script was not found on search path. */
5617 store_arg ("--script", false, false);
5618 string
= full_script_path
;
5620 store_arg (string
, delete_this_arg
, this_is_output_file
);
5621 if (this_is_output_file
)
5622 outfiles
[input_file_number
] = string
;
5628 /* Parse the WRAPPER string which is a comma separated list of the command line
5629 and insert them into the beginning of argbuf. */
5632 insert_wrapper (const char *wrapper
)
5636 char *buf
= xstrdup (wrapper
);
5638 unsigned int old_length
= argbuf
.length ();
5646 while ((p
= strchr (p
, ',')) != NULL
);
5648 argbuf
.safe_grow (old_length
+ n
, true);
5649 memmove (argbuf
.address () + n
,
5651 old_length
* sizeof (const_char_p
));
5665 while ((p
= strchr (p
, ',')) != NULL
);
5666 gcc_assert (i
== n
);
5669 /* Process the spec SPEC and run the commands specified therein.
5670 Returns 0 if the spec is successfully processed; -1 if failed. */
5673 do_spec (const char *spec
)
5677 value
= do_spec_2 (spec
, NULL
);
5679 /* Force out any unfinished command.
5680 If -pipe, this forces out the last command if it ended in `|'. */
5683 if (argbuf
.length () > 0
5684 && !strcmp (argbuf
.last (), "|"))
5687 set_collect_gcc_options ();
5689 if (argbuf
.length () > 0)
5696 /* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
5697 of a matched * pattern which may be re-injected by way of %*. */
5700 do_spec_2 (const char *spec
, const char *soft_matched_part
)
5706 delete_this_arg
= 0;
5707 this_is_output_file
= 0;
5708 this_is_library_file
= 0;
5709 this_is_linker_script
= 0;
5710 input_from_pipe
= 0;
5711 suffix_subst
= NULL
;
5713 result
= do_spec_1 (spec
, 0, soft_matched_part
);
5720 /* Process the given spec string and add any new options to the end
5721 of the switches/n_switches array. */
5724 do_option_spec (const char *name
, const char *spec
)
5726 unsigned int i
, value_count
, value_len
;
5727 const char *p
, *q
, *value
;
5728 char *tmp_spec
, *tmp_spec_p
;
5730 if (configure_default_options
[0].name
== NULL
)
5733 for (i
= 0; i
< ARRAY_SIZE (configure_default_options
); i
++)
5734 if (strcmp (configure_default_options
[i
].name
, name
) == 0)
5736 if (i
== ARRAY_SIZE (configure_default_options
))
5739 value
= configure_default_options
[i
].value
;
5740 value_len
= strlen (value
);
5742 /* Compute the size of the final spec. */
5745 while ((p
= strstr (p
, "%(VALUE)")) != NULL
)
5751 /* Replace each %(VALUE) by the specified value. */
5752 tmp_spec
= (char *) alloca (strlen (spec
) + 1
5753 + value_count
* (value_len
- strlen ("%(VALUE)")));
5754 tmp_spec_p
= tmp_spec
;
5756 while ((p
= strstr (q
, "%(VALUE)")) != NULL
)
5758 memcpy (tmp_spec_p
, q
, p
- q
);
5759 tmp_spec_p
= tmp_spec_p
+ (p
- q
);
5760 memcpy (tmp_spec_p
, value
, value_len
);
5761 tmp_spec_p
+= value_len
;
5762 q
= p
+ strlen ("%(VALUE)");
5764 strcpy (tmp_spec_p
, q
);
5766 do_self_spec (tmp_spec
);
5769 /* Process the given spec string and add any new options to the end
5770 of the switches/n_switches array. */
5773 do_self_spec (const char *spec
)
5777 do_spec_2 (spec
, NULL
);
5778 do_spec_1 (" ", 0, NULL
);
5780 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
5781 do_self_specs adds the replacements to switches array, so it shouldn't
5782 be processed afterwards. */
5783 for (i
= 0; i
< n_switches
; i
++)
5784 if ((switches
[i
].live_cond
& SWITCH_IGNORE
))
5785 switches
[i
].live_cond
|= SWITCH_IGNORE_PERMANENTLY
;
5787 if (argbuf
.length () > 0)
5789 const char **argbuf_copy
;
5790 struct cl_decoded_option
*decoded_options
;
5791 struct cl_option_handlers handlers
;
5792 unsigned int decoded_options_count
;
5795 /* Create a copy of argbuf with a dummy argv[0] entry for
5796 decode_cmdline_options_to_array. */
5797 argbuf_copy
= XNEWVEC (const char *,
5798 argbuf
.length () + 1);
5799 argbuf_copy
[0] = "";
5800 memcpy (argbuf_copy
+ 1, argbuf
.address (),
5801 argbuf
.length () * sizeof (const char *));
5803 decode_cmdline_options_to_array (argbuf
.length () + 1,
5805 CL_DRIVER
, &decoded_options
,
5806 &decoded_options_count
);
5809 set_option_handlers (&handlers
);
5811 for (j
= 1; j
< decoded_options_count
; j
++)
5813 switch (decoded_options
[j
].opt_index
)
5815 case OPT_SPECIAL_input_file
:
5816 /* Specs should only generate options, not input
5818 if (strcmp (decoded_options
[j
].arg
, "-") != 0)
5819 fatal_error (input_location
,
5820 "switch %qs does not start with %<-%>",
5821 decoded_options
[j
].arg
);
5823 fatal_error (input_location
,
5824 "spec-generated switch is just %<-%>");
5827 case OPT_fcompare_debug_second
:
5828 case OPT_fcompare_debug
:
5829 case OPT_fcompare_debug_
:
5831 /* Avoid duplicate processing of some options from
5832 compare-debug specs; just save them here. */
5833 save_switch (decoded_options
[j
].canonical_option
[0],
5834 (decoded_options
[j
].canonical_option_num_elements
5836 &decoded_options
[j
].canonical_option
[1], false, true);
5840 read_cmdline_option (&global_options
, &global_options_set
,
5841 decoded_options
+ j
, UNKNOWN_LOCATION
,
5842 CL_DRIVER
, &handlers
, global_dc
);
5847 free (decoded_options
);
5850 switches
[n_switches
].part1
= 0;
5854 /* Callback for processing %D and %I specs. */
5856 struct spec_path_info
{
5861 bool separate_options
;
5865 spec_path (char *path
, void *data
)
5867 struct spec_path_info
*info
= (struct spec_path_info
*) data
;
5871 if (info
->omit_relative
&& !IS_ABSOLUTE_PATH (path
))
5874 if (info
->append_len
!= 0)
5876 len
= strlen (path
);
5877 memcpy (path
+ len
, info
->append
, info
->append_len
+ 1);
5880 if (!is_directory (path
, true))
5883 do_spec_1 (info
->option
, 1, NULL
);
5884 if (info
->separate_options
)
5885 do_spec_1 (" ", 0, NULL
);
5887 if (info
->append_len
== 0)
5889 len
= strlen (path
);
5890 save
= path
[len
- 1];
5891 if (IS_DIR_SEPARATOR (path
[len
- 1]))
5892 path
[len
- 1] = '\0';
5895 do_spec_1 (path
, 1, NULL
);
5896 do_spec_1 (" ", 0, NULL
);
5898 /* Must not damage the original path. */
5899 if (info
->append_len
== 0)
5900 path
[len
- 1] = save
;
5905 /* True if we should compile INFILE. */
5908 compile_input_file_p (struct infile
*infile
)
5910 if ((!infile
->language
) || (infile
->language
[0] != '*'))
5911 if (infile
->incompiler
== input_file_compiler
)
5916 /* Process each member of VEC as a spec. */
5919 do_specs_vec (vec
<char_p
> vec
)
5921 for (char *opt
: vec
)
5923 do_spec_1 (opt
, 1, NULL
);
5924 /* Make each accumulated option a separate argument. */
5925 do_spec_1 (" ", 0, NULL
);
5929 /* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS. */
5932 putenv_COLLECT_AS_OPTIONS (vec
<char_p
> vec
)
5934 if (vec
.is_empty ())
5937 obstack_init (&collect_obstack
);
5938 obstack_grow (&collect_obstack
, "COLLECT_AS_OPTIONS=",
5939 strlen ("COLLECT_AS_OPTIONS="));
5944 FOR_EACH_VEC_ELT (vec
, ix
, opt
)
5946 obstack_1grow (&collect_obstack
, '\'');
5947 obstack_grow (&collect_obstack
, opt
, strlen (opt
));
5948 obstack_1grow (&collect_obstack
, '\'');
5949 if (ix
< vec
.length () - 1)
5950 obstack_1grow(&collect_obstack
, ' ');
5953 obstack_1grow (&collect_obstack
, '\0');
5954 xputenv (XOBFINISH (&collect_obstack
, char *));
5957 /* Process the sub-spec SPEC as a portion of a larger spec.
5958 This is like processing a whole spec except that we do
5959 not initialize at the beginning and we do not supply a
5960 newline by default at the end.
5961 INSWITCH nonzero means don't process %-sequences in SPEC;
5962 in this case, % is treated as an ordinary character.
5963 This is used while substituting switches.
5964 INSWITCH nonzero also causes SPC not to terminate an argument.
5966 Value is zero unless a line was finished
5967 and the command on that line reported an error. */
5970 do_spec_1 (const char *spec
, int inswitch
, const char *soft_matched_part
)
5972 const char *p
= spec
;
5977 /* If it's an empty string argument to a switch, keep it as is. */
5978 if (inswitch
&& !*p
)
5982 /* If substituting a switch, treat all chars like letters.
5983 Otherwise, NL, SPC, TAB and % are special. */
5984 switch (inswitch
? 'a' : c
)
5989 if (argbuf
.length () > 0
5990 && !strcmp (argbuf
.last (), "|"))
5992 /* A `|' before the newline means use a pipe here,
5993 but only if -pipe was specified.
5994 Otherwise, execute now and don't pass the `|' as an arg. */
5997 input_from_pipe
= 1;
6004 set_collect_gcc_options ();
6006 if (argbuf
.length () > 0)
6012 /* Reinitialize for a new command, and for a new argument. */
6015 delete_this_arg
= 0;
6016 this_is_output_file
= 0;
6017 this_is_library_file
= 0;
6018 this_is_linker_script
= 0;
6019 input_from_pipe
= 0;
6026 obstack_1grow (&obstack
, c
);
6034 /* Reinitialize for a new argument. */
6035 delete_this_arg
= 0;
6036 this_is_output_file
= 0;
6037 this_is_library_file
= 0;
6038 this_is_linker_script
= 0;
6045 fatal_error (input_location
, "spec %qs invalid", spec
);
6048 /* Don't use %b in the linker command. */
6049 gcc_assert (suffixed_basename_length
);
6050 if (!this_is_output_file
&& dumpdir_length
)
6051 obstack_grow (&obstack
, dumpdir
, dumpdir_length
);
6052 if (this_is_output_file
|| !outbase_length
)
6053 obstack_grow (&obstack
, input_basename
, basename_length
);
6055 obstack_grow (&obstack
, outbase
, outbase_length
);
6056 if (compare_debug
< 0)
6057 obstack_grow (&obstack
, ".gk", 3);
6062 /* Don't use %B in the linker command. */
6063 gcc_assert (suffixed_basename_length
);
6064 if (!this_is_output_file
&& dumpdir_length
)
6065 obstack_grow (&obstack
, dumpdir
, dumpdir_length
);
6066 if (this_is_output_file
|| !outbase_length
)
6067 obstack_grow (&obstack
, input_basename
, basename_length
);
6069 obstack_grow (&obstack
, outbase
, outbase_length
);
6070 if (compare_debug
< 0)
6071 obstack_grow (&obstack
, ".gk", 3);
6072 obstack_grow (&obstack
, input_basename
+ basename_length
,
6073 suffixed_basename_length
- basename_length
);
6079 delete_this_arg
= 2;
6082 /* Dump out the directories specified with LIBRARY_PATH,
6083 followed by the absolute directories
6084 that we search for startfiles. */
6087 struct spec_path_info info
;
6090 info
.append_len
= 0;
6091 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
6092 /* Used on systems which record the specified -L dirs
6093 and use them to search for dynamic linking.
6094 Relative directories always come from -B,
6095 and it is better not to use them for searching
6096 at run time. In particular, stage1 loses. */
6097 info
.omit_relative
= true;
6099 info
.omit_relative
= false;
6101 info
.separate_options
= false;
6103 for_each_path (&startfile_prefixes
, true, 0, spec_path
, &info
);
6108 /* %efoo means report an error with `foo' as error message
6109 and don't execute any more commands for this file. */
6113 while (*p
!= 0 && *p
!= '\n')
6115 buf
= (char *) alloca (p
- q
+ 1);
6116 strncpy (buf
, q
, p
- q
);
6118 error ("%s", _(buf
));
6123 /* %nfoo means report a notice with `foo' on stderr. */
6127 while (*p
!= 0 && *p
!= '\n')
6129 buf
= (char *) alloca (p
- q
+ 1);
6130 strncpy (buf
, q
, p
- q
);
6132 inform (UNKNOWN_LOCATION
, "%s", _(buf
));
6142 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
6143 defined, and it is not a directory, and it is
6144 writable, use it. Otherwise, treat this like any
6145 other temporary file. */
6147 if ((!save_temps_flag
)
6148 && (stat (HOST_BIT_BUCKET
, &st
) == 0) && (!S_ISDIR (st
.st_mode
))
6149 && (access (HOST_BIT_BUCKET
, W_OK
) == 0))
6151 obstack_grow (&obstack
, HOST_BIT_BUCKET
,
6152 strlen (HOST_BIT_BUCKET
));
6153 delete_this_arg
= 0;
6158 goto create_temp_file
;
6162 obstack_1grow (&obstack
, '-');
6163 delete_this_arg
= 0;
6166 /* consume suffix */
6167 while (*p
== '.' || ISALNUM ((unsigned char) *p
))
6169 if (p
[0] == '%' && p
[1] == 'O')
6174 goto create_temp_file
;
6178 /* consume suffix */
6179 while (*p
== '.' || ISALNUM ((unsigned char) *p
))
6181 if (p
[0] == '%' && p
[1] == 'O')
6186 goto create_temp_file
;
6192 struct temp_name
*t
;
6194 const char *suffix
= p
;
6195 char *saved_suffix
= NULL
;
6197 while (*p
== '.' || ISALNUM ((unsigned char) *p
))
6199 suffix_length
= p
- suffix
;
6200 if (p
[0] == '%' && p
[1] == 'O')
6203 /* We don't support extra suffix characters after %O. */
6204 if (*p
== '.' || ISALNUM ((unsigned char) *p
))
6205 fatal_error (input_location
,
6206 "spec %qs has invalid %<%%0%c%>", spec
, *p
);
6207 if (suffix_length
== 0)
6208 suffix
= TARGET_OBJECT_SUFFIX
;
6212 = XNEWVEC (char, suffix_length
6213 + strlen (TARGET_OBJECT_SUFFIX
) + 1);
6214 strncpy (saved_suffix
, suffix
, suffix_length
);
6215 strcpy (saved_suffix
+ suffix_length
,
6216 TARGET_OBJECT_SUFFIX
);
6218 suffix_length
+= strlen (TARGET_OBJECT_SUFFIX
);
6221 if (compare_debug
< 0)
6223 suffix
= concat (".gk", suffix
, NULL
);
6227 /* If -save-temps was specified, use that for the
6229 if (save_temps_flag
)
6232 bool adjusted_suffix
= false;
6234 && !outbase_length
&& !basename_length
6235 && !dumpdir_trailing_dash_added
)
6237 adjusted_suffix
= true;
6241 temp_filename_length
6242 = dumpdir_length
+ suffix_length
+ 1;
6244 temp_filename_length
+= outbase_length
;
6246 temp_filename_length
+= basename_length
;
6247 tmp
= (char *) alloca (temp_filename_length
);
6249 memcpy (tmp
, dumpdir
, dumpdir_length
);
6251 memcpy (tmp
+ dumpdir_length
, outbase
,
6253 else if (basename_length
)
6254 memcpy (tmp
+ dumpdir_length
, input_basename
,
6256 memcpy (tmp
+ temp_filename_length
- suffix_length
- 1,
6257 suffix
, suffix_length
);
6258 if (adjusted_suffix
)
6260 adjusted_suffix
= false;
6264 tmp
[temp_filename_length
- 1] = '\0';
6265 temp_filename
= tmp
;
6267 if (filename_cmp (temp_filename
, gcc_input_filename
) != 0)
6269 #ifndef HOST_LACKS_INODE_NUMBERS
6270 struct stat st_temp
;
6272 /* Note, set_input() resets input_stat_set to 0. */
6273 if (input_stat_set
== 0)
6275 input_stat_set
= stat (gcc_input_filename
,
6277 if (input_stat_set
>= 0)
6281 /* If we have the stat for the gcc_input_filename
6282 and we can do the stat for the temp_filename
6283 then the they could still refer to the same
6284 file if st_dev/st_ino's are the same. */
6285 if (input_stat_set
!= 1
6286 || stat (temp_filename
, &st_temp
) < 0
6287 || input_stat
.st_dev
!= st_temp
.st_dev
6288 || input_stat
.st_ino
!= st_temp
.st_ino
)
6290 /* Just compare canonical pathnames. */
6291 char* input_realname
= lrealpath (gcc_input_filename
);
6292 char* temp_realname
= lrealpath (temp_filename
);
6293 bool files_differ
= filename_cmp (input_realname
, temp_realname
);
6294 free (input_realname
);
6295 free (temp_realname
);
6300 = save_string (temp_filename
,
6301 temp_filename_length
- 1);
6302 obstack_grow (&obstack
, temp_filename
,
6303 temp_filename_length
);
6305 delete_this_arg
= 0;
6311 /* See if we already have an association of %g/%u/%U and
6313 for (t
= temp_names
; t
; t
= t
->next
)
6314 if (t
->length
== suffix_length
6315 && strncmp (t
->suffix
, suffix
, suffix_length
) == 0
6316 && t
->unique
== (c
== 'u' || c
== 'U' || c
== 'j'))
6319 /* Make a new association if needed. %u and %j
6321 if (t
== 0 || c
== 'u' || c
== 'j')
6325 t
= XNEW (struct temp_name
);
6326 t
->next
= temp_names
;
6329 t
->length
= suffix_length
;
6332 t
->suffix
= saved_suffix
;
6333 saved_suffix
= NULL
;
6336 t
->suffix
= save_string (suffix
, suffix_length
);
6337 t
->unique
= (c
== 'u' || c
== 'U' || c
== 'j');
6338 temp_filename
= make_temp_file (t
->suffix
);
6339 temp_filename_length
= strlen (temp_filename
);
6340 t
->filename
= temp_filename
;
6341 t
->filename_length
= temp_filename_length
;
6344 free (saved_suffix
);
6346 obstack_grow (&obstack
, t
->filename
, t
->filename_length
);
6347 delete_this_arg
= 1;
6355 /* We are going to expand `%i' into `@FILE', where FILE
6356 is a newly-created temporary filename. The filenames
6357 that would usually be expanded in place of %o will be
6358 written to the temporary file. */
6359 if (at_file_supplied
)
6362 for (i
= 0; (int) i
< n_infiles
; i
++)
6363 if (compile_input_file_p (&infiles
[i
]))
6365 store_arg (infiles
[i
].name
, 0, 0);
6366 infiles
[i
].compiled
= true;
6369 if (at_file_supplied
)
6374 obstack_grow (&obstack
, gcc_input_filename
,
6375 input_filename_length
);
6382 struct spec_path_info info
;
6386 do_spec_1 ("-imultilib", 1, NULL
);
6387 /* Make this a separate argument. */
6388 do_spec_1 (" ", 0, NULL
);
6389 do_spec_1 (multilib_dir
, 1, NULL
);
6390 do_spec_1 (" ", 0, NULL
);
6395 do_spec_1 ("-imultiarch", 1, NULL
);
6396 /* Make this a separate argument. */
6397 do_spec_1 (" ", 0, NULL
);
6398 do_spec_1 (multiarch_dir
, 1, NULL
);
6399 do_spec_1 (" ", 0, NULL
);
6402 if (gcc_exec_prefix
)
6404 do_spec_1 ("-iprefix", 1, NULL
);
6405 /* Make this a separate argument. */
6406 do_spec_1 (" ", 0, NULL
);
6407 do_spec_1 (gcc_exec_prefix
, 1, NULL
);
6408 do_spec_1 (" ", 0, NULL
);
6411 if (target_system_root_changed
||
6412 (target_system_root
&& target_sysroot_hdrs_suffix
))
6414 do_spec_1 ("-isysroot", 1, NULL
);
6415 /* Make this a separate argument. */
6416 do_spec_1 (" ", 0, NULL
);
6417 do_spec_1 (target_system_root
, 1, NULL
);
6418 if (target_sysroot_hdrs_suffix
)
6419 do_spec_1 (target_sysroot_hdrs_suffix
, 1, NULL
);
6420 do_spec_1 (" ", 0, NULL
);
6423 info
.option
= "-isystem";
6424 info
.append
= "include";
6425 info
.append_len
= strlen (info
.append
);
6426 info
.omit_relative
= false;
6427 info
.separate_options
= true;
6429 for_each_path (&include_prefixes
, false, info
.append_len
,
6432 info
.append
= "include-fixed";
6433 if (*sysroot_hdrs_suffix_spec
)
6434 info
.append
= concat (info
.append
, dir_separator_str
,
6435 multilib_dir
, NULL
);
6436 else if (multiarch_dir
)
6438 /* For multiarch, search include-fixed/<multiarch-dir>
6439 before include-fixed. */
6440 info
.append
= concat (info
.append
, dir_separator_str
,
6441 multiarch_dir
, NULL
);
6442 info
.append_len
= strlen (info
.append
);
6443 for_each_path (&include_prefixes
, false, info
.append_len
,
6446 info
.append
= "include-fixed";
6448 info
.append_len
= strlen (info
.append
);
6449 for_each_path (&include_prefixes
, false, info
.append_len
,
6455 /* We are going to expand `%o' into `@FILE', where FILE
6456 is a newly-created temporary filename. The filenames
6457 that would usually be expanded in place of %o will be
6458 written to the temporary file. */
6459 if (at_file_supplied
)
6462 for (i
= 0; i
< n_infiles
+ lang_specific_extra_outfiles
; i
++)
6464 store_arg (outfiles
[i
], 0, 0);
6466 if (at_file_supplied
)
6471 obstack_grow (&obstack
, TARGET_OBJECT_SUFFIX
, strlen (TARGET_OBJECT_SUFFIX
));
6476 this_is_library_file
= 1;
6480 this_is_linker_script
= 1;
6484 outfiles
[input_file_number
] = NULL
;
6488 this_is_output_file
= 1;
6493 unsigned int cur_index
= argbuf
.length ();
6494 /* Handle the {...} following the %W. */
6496 fatal_error (input_location
,
6497 "spec %qs has invalid %<%%W%c%>", spec
, *p
);
6498 p
= handle_braces (p
+ 1);
6502 /* If any args were output, mark the last one for deletion
6504 if (argbuf
.length () != cur_index
)
6505 record_temp_file (argbuf
.last (), 0, 1);
6510 /* Handle the {...} following the %@. */
6512 fatal_error (input_location
,
6513 "spec %qs has invalid %<%%@%c%>", spec
, *p
);
6514 if (at_file_supplied
)
6516 p
= handle_braces (p
+ 1);
6517 if (at_file_supplied
)
6523 /* %x{OPTION} records OPTION for %X to output. */
6529 /* Skip past the option value and make a copy. */
6531 fatal_error (input_location
,
6532 "spec %qs has invalid %<%%x%c%>", spec
, *p
);
6535 string
= save_string (p1
+ 1, p
- p1
- 2);
6537 /* See if we already recorded this option. */
6538 for (const char *opt
: linker_options
)
6539 if (! strcmp (string
, opt
))
6545 /* This option is new; add it. */
6546 add_linker_option (string
, strlen (string
));
6551 /* Dump out the options accumulated previously using %x. */
6553 do_specs_vec (linker_options
);
6556 /* Dump out the options accumulated previously using -Wa,. */
6558 do_specs_vec (assembler_options
);
6561 /* Dump out the options accumulated previously using -Wp,. */
6563 do_specs_vec (preprocessor_options
);
6566 /* Here are digits and numbers that just process
6567 a certain constant string as a spec. */
6570 value
= do_spec_1 (cc1_spec
, 0, NULL
);
6576 value
= do_spec_1 (cc1plus_spec
, 0, NULL
);
6582 value
= do_spec_1 (asm_spec
, 0, NULL
);
6588 value
= do_spec_1 (asm_final_spec
, 0, NULL
);
6595 const char *const spec
6596 = (input_file_compiler
->cpp_spec
6597 ? input_file_compiler
->cpp_spec
6599 value
= do_spec_1 (spec
, 0, NULL
);
6606 value
= do_spec_1 (endfile_spec
, 0, NULL
);
6612 value
= do_spec_1 (link_spec
, 0, NULL
);
6618 value
= do_spec_1 (lib_spec
, 0, NULL
);
6624 if (multilib_os_dir
== NULL
)
6625 obstack_1grow (&obstack
, '.');
6627 obstack_grow (&obstack
, multilib_os_dir
,
6628 strlen (multilib_os_dir
));
6632 value
= do_spec_1 (libgcc_spec
, 0, NULL
);
6638 /* We assume there is a directory
6639 separator at the end of this string. */
6640 if (target_system_root
)
6642 obstack_grow (&obstack
, target_system_root
,
6643 strlen (target_system_root
));
6644 if (target_sysroot_suffix
)
6645 obstack_grow (&obstack
, target_sysroot_suffix
,
6646 strlen (target_sysroot_suffix
));
6651 value
= do_spec_1 (startfile_spec
, 0, NULL
);
6656 /* Here we define characters other than letters and digits. */
6659 p
= handle_braces (p
);
6665 p
= handle_spec_function (p
, NULL
, soft_matched_part
);
6671 obstack_1grow (&obstack
, '%');
6678 while (p
[len
] && p
[len
] != ' ' && p
[len
] != '%')
6680 suffix_subst
= save_string (p
- 1, len
+ 1);
6685 /* Henceforth ignore the option(s) matching the pattern
6691 int have_wildcard
= 0;
6696 switch_option
= SWITCH_IGNORE
| SWITCH_KEEP_FOR_GCC
;
6698 switch_option
= SWITCH_IGNORE
;
6700 while (p
[len
] && p
[len
] != ' ' && p
[len
] != '\t')
6703 if (p
[len
-1] == '*')
6706 for (i
= 0; i
< n_switches
; i
++)
6707 if (!strncmp (switches
[i
].part1
, p
, len
- have_wildcard
)
6708 && (have_wildcard
|| switches
[i
].part1
[len
] == '\0'))
6710 switches
[i
].live_cond
|= switch_option
;
6711 /* User switch be validated from validate_all_switches.
6712 when the definition is seen from the spec file.
6713 If not defined anywhere, will be rejected. */
6714 if (switches
[i
].known
)
6715 switches
[i
].validated
= true;
6723 if (soft_matched_part
)
6725 if (soft_matched_part
[0])
6726 do_spec_1 (soft_matched_part
, 1, NULL
);
6727 /* Only insert a space after the substitution if it is at the
6728 end of the current sequence. So if:
6730 "%{foo=*:bar%*}%{foo=*:one%*two}"
6732 matches -foo=hello then it will produce:
6734 barhello onehellotwo
6736 if (*p
== 0 || *p
== '}')
6737 do_spec_1 (" ", 0, NULL
);
6740 /* Catch the case where a spec string contains something like
6741 '%{foo:%*}'. i.e. there is no * in the pattern on the left
6742 hand side of the :. */
6743 error ("spec failure: %<%%*%> has not been initialized by pattern match");
6746 /* Process a string found as the value of a spec given by name.
6747 This feature allows individual machine descriptions
6748 to add and use their own specs. */
6751 const char *name
= p
;
6752 struct spec_list
*sl
;
6755 /* The string after the S/P is the name of a spec that is to be
6757 while (*p
&& *p
!= ')')
6760 /* See if it's in the list. */
6761 for (len
= p
- name
, sl
= specs
; sl
; sl
= sl
->next
)
6762 if (sl
->name_len
== len
&& !strncmp (sl
->name
, name
, len
))
6764 name
= *(sl
->ptr_spec
);
6766 fnotice (stderr
, "Processing spec (%s), which is '%s'\n",
6774 value
= do_spec_1 (name
, 0, NULL
);
6779 /* Discard the closing paren. */
6786 /* End a previous argument, if there is one, then issue an
6794 error ("spec failure: unrecognized spec option %qc", c
);
6800 /* Backslash: treat next character as ordinary. */
6803 /* When adding more cases that previously matched default, make
6804 sure to adjust quote_spec_char_p as well. */
6808 /* Ordinary character: put it into the current argument. */
6809 obstack_1grow (&obstack
, c
);
6813 /* End of string. If we are processing a spec function, we need to
6814 end any pending argument. */
6815 if (processing_spec_function
)
6821 /* Look up a spec function. */
6823 static const struct spec_function
*
6824 lookup_spec_function (const char *name
)
6826 const struct spec_function
*sf
;
6828 for (sf
= static_spec_functions
; sf
->name
!= NULL
; sf
++)
6829 if (strcmp (sf
->name
, name
) == 0)
6835 /* Evaluate a spec function. */
6838 eval_spec_function (const char *func
, const char *args
,
6839 const char *soft_matched_part
)
6841 const struct spec_function
*sf
;
6842 const char *funcval
;
6844 /* Saved spec processing context. */
6845 vec
<const_char_p
> save_argbuf
;
6848 int save_delete_this_arg
;
6849 int save_this_is_output_file
;
6850 int save_this_is_library_file
;
6851 int save_input_from_pipe
;
6852 int save_this_is_linker_script
;
6853 const char *save_suffix_subst
;
6855 int save_growing_size
;
6856 void *save_growing_value
= NULL
;
6858 sf
= lookup_spec_function (func
);
6860 fatal_error (input_location
, "unknown spec function %qs", func
);
6862 /* Push the spec processing context. */
6863 save_argbuf
= argbuf
;
6865 save_arg_going
= arg_going
;
6866 save_delete_this_arg
= delete_this_arg
;
6867 save_this_is_output_file
= this_is_output_file
;
6868 save_this_is_library_file
= this_is_library_file
;
6869 save_this_is_linker_script
= this_is_linker_script
;
6870 save_input_from_pipe
= input_from_pipe
;
6871 save_suffix_subst
= suffix_subst
;
6873 /* If we have some object growing now, finalize it so the args and function
6874 eval proceed from a cleared context. This is needed to prevent the first
6875 constructed arg from mistakenly including the growing value. We'll push
6876 this value back on the obstack once the function evaluation is done, to
6877 restore a consistent processing context for our caller. This is fine as
6878 the address of growing objects isn't guaranteed to remain stable until
6879 they are finalized, and we expect this situation to be rare enough for
6880 the extra copy not to be an issue. */
6881 save_growing_size
= obstack_object_size (&obstack
);
6882 if (save_growing_size
> 0)
6883 save_growing_value
= obstack_finish (&obstack
);
6885 /* Create a new spec processing context, and build the function
6889 if (do_spec_2 (args
, soft_matched_part
) < 0)
6890 fatal_error (input_location
, "error in arguments to spec function %qs",
6893 /* argbuf_index is an index for the next argument to be inserted, and
6894 so contains the count of the args already inserted. */
6896 funcval
= (*sf
->func
) (argbuf
.length (),
6899 /* Pop the spec processing context. */
6901 argbuf
= save_argbuf
;
6903 arg_going
= save_arg_going
;
6904 delete_this_arg
= save_delete_this_arg
;
6905 this_is_output_file
= save_this_is_output_file
;
6906 this_is_library_file
= save_this_is_library_file
;
6907 this_is_linker_script
= save_this_is_linker_script
;
6908 input_from_pipe
= save_input_from_pipe
;
6909 suffix_subst
= save_suffix_subst
;
6911 if (save_growing_size
> 0)
6912 obstack_grow (&obstack
, save_growing_value
, save_growing_size
);
6917 /* Handle a spec function call of the form:
6921 ARGS is processed as a spec in a separate context and split into an
6922 argument vector in the normal fashion. The function returns a string
6923 containing a spec which we then process in the caller's context, or
6924 NULL if no processing is required.
6926 If RETVAL_NONNULL is not NULL, then store a bool whether function
6929 SOFT_MATCHED_PART holds the current value of a matched * pattern, which
6930 may be re-expanded with a %* as part of the function arguments. */
6933 handle_spec_function (const char *p
, bool *retval_nonnull
,
6934 const char *soft_matched_part
)
6937 const char *endp
, *funcval
;
6940 processing_spec_function
++;
6942 /* Get the function name. */
6943 for (endp
= p
; *endp
!= '\0'; endp
++)
6945 if (*endp
== '(') /* ) */
6947 /* Only allow [A-Za-z0-9], -, and _ in function names. */
6948 if (!ISALNUM (*endp
) && !(*endp
== '-' || *endp
== '_'))
6949 fatal_error (input_location
, "malformed spec function name");
6951 if (*endp
!= '(') /* ) */
6952 fatal_error (input_location
, "no arguments for spec function");
6953 func
= save_string (p
, endp
- p
);
6956 /* Get the arguments. */
6957 for (count
= 0; *endp
!= '\0'; endp
++)
6966 else if (*endp
== '(') /* ) */
6971 fatal_error (input_location
, "malformed spec function arguments");
6972 args
= save_string (p
, endp
- p
);
6975 /* p now points to just past the end of the spec function expression. */
6977 funcval
= eval_spec_function (func
, args
, soft_matched_part
);
6978 if (funcval
!= NULL
&& do_spec_1 (funcval
, 0, NULL
) < 0)
6981 *retval_nonnull
= funcval
!= NULL
;
6986 processing_spec_function
--;
6991 /* Inline subroutine of handle_braces. Returns true if the current
6992 input suffix matches the atom bracketed by ATOM and END_ATOM. */
6994 input_suffix_matches (const char *atom
, const char *end_atom
)
6996 return (input_suffix
6997 && !strncmp (input_suffix
, atom
, end_atom
- atom
)
6998 && input_suffix
[end_atom
- atom
] == '\0');
7001 /* Subroutine of handle_braces. Returns true if the current
7002 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
7004 input_spec_matches (const char *atom
, const char *end_atom
)
7006 return (input_file_compiler
7007 && input_file_compiler
->suffix
7008 && input_file_compiler
->suffix
[0] != '\0'
7009 && !strncmp (input_file_compiler
->suffix
+ 1, atom
,
7011 && input_file_compiler
->suffix
[end_atom
- atom
+ 1] == '\0');
7014 /* Subroutine of handle_braces. Returns true if a switch
7015 matching the atom bracketed by ATOM and END_ATOM appeared on the
7018 switch_matches (const char *atom
, const char *end_atom
, int starred
)
7021 int len
= end_atom
- atom
;
7022 int plen
= starred
? len
: -1;
7024 for (i
= 0; i
< n_switches
; i
++)
7025 if (!strncmp (switches
[i
].part1
, atom
, len
)
7026 && (starred
|| switches
[i
].part1
[len
] == '\0')
7027 && check_live_switch (i
, plen
))
7030 /* Check if a switch with separated form matching the atom.
7031 We check -D and -U switches. */
7032 else if (switches
[i
].args
!= 0)
7034 if ((*switches
[i
].part1
== 'D' || *switches
[i
].part1
== 'U')
7035 && *switches
[i
].part1
== atom
[0])
7037 if (!strncmp (switches
[i
].args
[0], &atom
[1], len
- 1)
7038 && (starred
|| (switches
[i
].part1
[1] == '\0'
7039 && switches
[i
].args
[0][len
- 1] == '\0'))
7040 && check_live_switch (i
, (starred
? 1 : -1)))
7048 /* Inline subroutine of handle_braces. Mark all of the switches which
7049 match ATOM (extends to END_ATOM; STARRED indicates whether there
7050 was a star after the atom) for later processing. */
7052 mark_matching_switches (const char *atom
, const char *end_atom
, int starred
)
7055 int len
= end_atom
- atom
;
7056 int plen
= starred
? len
: -1;
7058 for (i
= 0; i
< n_switches
; i
++)
7059 if (!strncmp (switches
[i
].part1
, atom
, len
)
7060 && (starred
|| switches
[i
].part1
[len
] == '\0')
7061 && check_live_switch (i
, plen
))
7062 switches
[i
].ordering
= 1;
7065 /* Inline subroutine of handle_braces. Process all the currently
7066 marked switches through give_switch, and clear the marks. */
7068 process_marked_switches (void)
7072 for (i
= 0; i
< n_switches
; i
++)
7073 if (switches
[i
].ordering
== 1)
7075 switches
[i
].ordering
= 0;
7080 /* Handle a %{ ... } construct. P points just inside the leading {.
7081 Returns a pointer one past the end of the brace block, or 0
7082 if we call do_spec_1 and that returns -1. */
7085 handle_braces (const char *p
)
7087 const char *atom
, *end_atom
;
7088 const char *d_atom
= NULL
, *d_end_atom
= NULL
;
7089 char *esc_buf
= NULL
, *d_esc_buf
= NULL
;
7091 const char *orig
= p
;
7099 bool a_must_be_last
= false;
7100 bool ordered_set
= false;
7101 bool disjunct_set
= false;
7102 bool disj_matched
= false;
7103 bool disj_starred
= true;
7104 bool n_way_choice
= false;
7105 bool n_way_matched
= false;
7107 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7114 /* Scan one "atom" (S in the description above of %{}, possibly
7115 with '!', '.', '@', ',', or '*' modifiers). */
7117 a_is_suffix
= false;
7118 a_is_starred
= false;
7119 a_is_negated
= false;
7120 a_is_spectype
= false;
7124 p
++, a_is_negated
= true;
7127 if (*p
== '%' && p
[1] == ':')
7131 p
= handle_spec_function (p
+ 2, &a_matched
, NULL
);
7136 p
++, a_is_suffix
= true;
7138 p
++, a_is_spectype
= true;
7142 while (ISIDNUM (*p
) || *p
== '-' || *p
== '+' || *p
== '='
7143 || *p
== ',' || *p
== '.' || *p
== '@' || *p
== '\\')
7149 fatal_error (input_location
,
7150 "braced spec %qs ends in escape", orig
);
7162 if (esc_buf
&& esc_buf
!= d_esc_buf
)
7165 ep
= esc_buf
= (char *) xmalloc (end_atom
- atom
- esc
+ 1);
7166 for (ap
= atom
; ap
!= end_atom
; ap
++, ep
++)
7178 p
++, a_is_starred
= 1;
7185 /* Substitute the switch(es) indicated by the current atom. */
7187 if (disjunct_set
|| n_way_choice
|| a_is_negated
|| a_is_suffix
7188 || a_is_spectype
|| atom
== end_atom
)
7191 mark_matching_switches (atom
, end_atom
, a_is_starred
);
7194 process_marked_switches ();
7198 /* Substitute some text if the current atom appears as a switch
7200 disjunct_set
= true;
7204 if (atom
&& atom
== end_atom
)
7206 if (!n_way_choice
|| disj_matched
|| *p
== '|'
7207 || a_is_negated
|| a_is_suffix
|| a_is_spectype
7211 /* An empty term may appear as the last choice of an
7212 N-way choice set; it means "otherwise". */
7213 a_must_be_last
= true;
7214 disj_matched
= !n_way_matched
;
7215 disj_starred
= false;
7219 if ((a_is_suffix
|| a_is_spectype
) && a_is_starred
)
7223 disj_starred
= false;
7225 /* Don't bother testing this atom if we already have a
7227 if (!disj_matched
&& !n_way_matched
)
7230 /* a_matched is already set by handle_spec_function. */;
7231 else if (a_is_suffix
)
7232 a_matched
= input_suffix_matches (atom
, end_atom
);
7233 else if (a_is_spectype
)
7234 a_matched
= input_spec_matches (atom
, end_atom
);
7236 a_matched
= switch_matches (atom
, end_atom
, a_is_starred
);
7238 if (a_matched
!= a_is_negated
)
7240 disj_matched
= true;
7242 d_end_atom
= end_atom
;
7243 d_esc_buf
= esc_buf
;
7250 /* Found the body, that is, the text to substitute if the
7251 current disjunction matches. */
7252 p
= process_brace_body (p
+ 1, d_atom
, d_end_atom
, disj_starred
,
7253 disj_matched
&& !n_way_matched
);
7257 /* If we have an N-way choice, reset state for the next
7261 n_way_choice
= true;
7262 n_way_matched
|= disj_matched
;
7263 disj_matched
= false;
7264 disj_starred
= true;
7265 d_atom
= d_end_atom
= NULL
;
7274 while (*p
++ != '}');
7277 if (d_esc_buf
&& d_esc_buf
!= esc_buf
)
7285 fatal_error (input_location
, "braced spec %qs is invalid at %qc", orig
, *p
);
7290 /* Subroutine of handle_braces. Scan and process a brace substitution body
7291 (X in the description of %{} syntax). P points one past the colon;
7292 ATOM and END_ATOM bracket the first atom which was found to be true
7293 (present) in the current disjunction; STARRED indicates whether all
7294 the atoms in the current disjunction were starred (for syntax validation);
7295 MATCHED indicates whether the disjunction matched or not, and therefore
7296 whether or not the body is to be processed through do_spec_1 or just
7297 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
7301 process_brace_body (const char *p
, const char *atom
, const char *end_atom
,
7302 int starred
, int matched
)
7304 const char *body
, *end_body
;
7305 unsigned int nesting_level
;
7306 bool have_subst
= false;
7308 /* Locate the closing } or ;, honoring nested braces.
7309 Trim trailing whitespace. */
7318 if (!--nesting_level
)
7321 else if (*p
== ';' && nesting_level
== 1)
7323 else if (*p
== '%' && p
[1] == '*' && nesting_level
== 1)
7325 else if (*p
== '\0')
7331 while (end_body
[-1] == ' ' || end_body
[-1] == '\t')
7334 if (have_subst
&& !starred
)
7339 /* Copy the substitution body to permanent storage and execute it.
7340 If have_subst is false, this is a simple matter of running the
7341 body through do_spec_1... */
7342 char *string
= save_string (body
, end_body
- body
);
7345 if (do_spec_1 (string
, 0, NULL
) < 0)
7353 /* ... but if have_subst is true, we have to process the
7354 body once for each matching switch, with %* set to the
7355 variant part of the switch. */
7356 unsigned int hard_match_len
= end_atom
- atom
;
7359 for (i
= 0; i
< n_switches
; i
++)
7360 if (!strncmp (switches
[i
].part1
, atom
, hard_match_len
)
7361 && check_live_switch (i
, hard_match_len
))
7363 if (do_spec_1 (string
, 0,
7364 &switches
[i
].part1
[hard_match_len
]) < 0)
7369 /* Pass any arguments this switch has. */
7371 suffix_subst
= NULL
;
7380 fatal_error (input_location
, "braced spec body %qs is invalid", body
);
7383 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
7384 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
7385 spec, or -1 if either exact match or %* is used.
7387 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
7388 whose value does not begin with "no-" is obsoleted by the same value
7389 with the "no-", similarly for a switch with the "no-" prefix. */
7392 check_live_switch (int switchnum
, int prefix_length
)
7394 const char *name
= switches
[switchnum
].part1
;
7397 /* If we already processed this switch and determined if it was
7398 live or not, return our past determination. */
7399 if (switches
[switchnum
].live_cond
!= 0)
7400 return ((switches
[switchnum
].live_cond
& SWITCH_LIVE
) != 0
7401 && (switches
[switchnum
].live_cond
& SWITCH_FALSE
) == 0
7402 && (switches
[switchnum
].live_cond
& SWITCH_IGNORE_PERMANENTLY
)
7405 /* In the common case of {<at-most-one-letter>*}, a negating
7406 switch would always match, so ignore that case. We will just
7407 send the conflicting switches to the compiler phase. */
7408 if (prefix_length
>= 0 && prefix_length
<= 1)
7411 /* Now search for duplicate in a manner that depends on the name. */
7415 for (i
= switchnum
+ 1; i
< n_switches
; i
++)
7416 if (switches
[i
].part1
[0] == 'O')
7418 switches
[switchnum
].validated
= true;
7419 switches
[switchnum
].live_cond
= SWITCH_FALSE
;
7424 case 'W': case 'f': case 'm': case 'g':
7425 if (startswith (name
+ 1, "no-"))
7427 /* We have Xno-YYY, search for XYYY. */
7428 for (i
= switchnum
+ 1; i
< n_switches
; i
++)
7429 if (switches
[i
].part1
[0] == name
[0]
7430 && ! strcmp (&switches
[i
].part1
[1], &name
[4]))
7432 /* --specs are validated with the validate_switches mechanism. */
7433 if (switches
[switchnum
].known
)
7434 switches
[switchnum
].validated
= true;
7435 switches
[switchnum
].live_cond
= SWITCH_FALSE
;
7441 /* We have XYYY, search for Xno-YYY. */
7442 for (i
= switchnum
+ 1; i
< n_switches
; i
++)
7443 if (switches
[i
].part1
[0] == name
[0]
7444 && switches
[i
].part1
[1] == 'n'
7445 && switches
[i
].part1
[2] == 'o'
7446 && switches
[i
].part1
[3] == '-'
7447 && !strcmp (&switches
[i
].part1
[4], &name
[1]))
7449 /* --specs are validated with the validate_switches mechanism. */
7450 if (switches
[switchnum
].known
)
7451 switches
[switchnum
].validated
= true;
7452 switches
[switchnum
].live_cond
= SWITCH_FALSE
;
7459 /* Otherwise the switch is live. */
7460 switches
[switchnum
].live_cond
|= SWITCH_LIVE
;
7464 /* Pass a switch to the current accumulating command
7465 in the same form that we received it.
7466 SWITCHNUM identifies the switch; it is an index into
7467 the vector of switches gcc received, which is `switches'.
7468 This cannot fail since it never finishes a command line.
7470 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
7473 give_switch (int switchnum
, int omit_first_word
)
7475 if ((switches
[switchnum
].live_cond
& SWITCH_IGNORE
) != 0)
7478 if (!omit_first_word
)
7480 do_spec_1 ("-", 0, NULL
);
7481 do_spec_1 (switches
[switchnum
].part1
, 1, NULL
);
7484 if (switches
[switchnum
].args
!= 0)
7487 for (p
= switches
[switchnum
].args
; *p
; p
++)
7489 const char *arg
= *p
;
7491 do_spec_1 (" ", 0, NULL
);
7494 unsigned length
= strlen (arg
);
7497 while (length
-- && !IS_DIR_SEPARATOR (arg
[length
]))
7498 if (arg
[length
] == '.')
7500 (CONST_CAST (char *, arg
))[length
] = 0;
7504 do_spec_1 (arg
, 1, NULL
);
7506 (CONST_CAST (char *, arg
))[length
] = '.';
7507 do_spec_1 (suffix_subst
, 1, NULL
);
7510 do_spec_1 (arg
, 1, NULL
);
7514 do_spec_1 (" ", 0, NULL
);
7515 switches
[switchnum
].validated
= true;
7518 /* Print GCC configuration (e.g. version, thread model, target,
7519 configuration_arguments) to a given FILE. */
7522 print_configuration (FILE *file
)
7527 fnotice (file
, "Target: %s\n", spec_machine
);
7528 fnotice (file
, "Configured with: %s\n", configuration_arguments
);
7530 #ifdef THREAD_MODEL_SPEC
7531 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7532 but there's no point in doing all this processing just to get
7533 thread_model back. */
7534 obstack_init (&obstack
);
7535 do_spec_1 (THREAD_MODEL_SPEC
, 0, thread_model
);
7536 obstack_1grow (&obstack
, '\0');
7537 thrmod
= XOBFINISH (&obstack
, const char *);
7539 thrmod
= thread_model
;
7542 fnotice (file
, "Thread model: %s\n", thrmod
);
7543 fnotice (file
, "Supported LTO compression algorithms: zlib");
7545 fnotice (file
, " zstd");
7547 fnotice (file
, "\n");
7549 /* compiler_version is truncated at the first space when initialized
7550 from version string, so truncate version_string at the first space
7551 before comparing. */
7552 for (n
= 0; version_string
[n
]; n
++)
7553 if (version_string
[n
] == ' ')
7556 if (! strncmp (version_string
, compiler_version
, n
)
7557 && compiler_version
[n
] == 0)
7558 fnotice (file
, "gcc version %s %s\n", version_string
,
7561 fnotice (file
, "gcc driver version %s %sexecuting gcc version %s\n",
7562 version_string
, pkgversion_string
, compiler_version
);
7566 #define RETRY_ICE_ATTEMPTS 3
7568 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
7571 files_equal_p (char *file1
, char *file2
)
7573 struct stat st1
, st2
;
7576 const int bufsize
= 8192;
7577 char *buf
= XNEWVEC (char, bufsize
);
7579 fd1
= open (file1
, O_RDONLY
);
7580 fd2
= open (file2
, O_RDONLY
);
7582 if (fd1
< 0 || fd2
< 0)
7585 if (fstat (fd1
, &st1
) < 0 || fstat (fd2
, &st2
) < 0)
7588 if (st1
.st_size
!= st2
.st_size
)
7591 for (n
= st1
.st_size
; n
; n
-= len
)
7594 if ((int) len
> bufsize
/ 2)
7597 if (read (fd1
, buf
, len
) != (int) len
7598 || read (fd2
, buf
+ bufsize
/ 2, len
) != (int) len
)
7603 if (memcmp (buf
, buf
+ bufsize
/ 2, len
) != 0)
7620 /* Check that compiler's output doesn't differ across runs.
7621 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
7622 stdout and stderr for each compiler run. Return true if all of
7623 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
7626 check_repro (char **temp_stdout_files
, char **temp_stderr_files
)
7629 for (i
= 0; i
< RETRY_ICE_ATTEMPTS
- 2; ++i
)
7631 if (!files_equal_p (temp_stdout_files
[i
], temp_stdout_files
[i
+ 1])
7632 || !files_equal_p (temp_stderr_files
[i
], temp_stderr_files
[i
+ 1]))
7634 fnotice (stderr
, "The bug is not reproducible, so it is"
7635 " likely a hardware or OS problem.\n");
7639 return i
== RETRY_ICE_ATTEMPTS
- 2;
7642 enum attempt_status
{
7643 ATTEMPT_STATUS_FAIL_TO_RUN
,
7644 ATTEMPT_STATUS_SUCCESS
,
7649 /* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
7650 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
7651 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
7652 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
7653 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
7654 ATTEMPT_STATUS_SUCCESS otherwise. */
7656 static enum attempt_status
7657 run_attempt (const char **new_argv
, const char *out_temp
,
7658 const char *err_temp
, int emit_system_info
, int append
)
7661 if (emit_system_info
)
7663 FILE *file_out
= fopen (err_temp
, "a");
7664 print_configuration (file_out
);
7665 fputs ("\n", file_out
);
7671 struct pex_obj
*pex
;
7673 int pex_flags
= PEX_USE_PIPES
| PEX_LAST
;
7674 enum attempt_status status
= ATTEMPT_STATUS_FAIL_TO_RUN
;
7677 pex_flags
|= PEX_STDOUT_APPEND
| PEX_STDERR_APPEND
;
7679 pex
= pex_init (PEX_USE_PIPES
, new_argv
[0], NULL
);
7681 fatal_error (input_location
, "%<pex_init%> failed: %m");
7683 errmsg
= pex_run (pex
, pex_flags
, new_argv
[0],
7684 CONST_CAST2 (char *const *, const char **, &new_argv
[1]),
7685 out_temp
, err_temp
, &err
);
7689 fatal_error (input_location
,
7690 err
? G_ ("cannot execute %qs: %s: %m")
7691 : G_ ("cannot execute %qs: %s"),
7692 new_argv
[0], errmsg
);
7695 if (!pex_get_status (pex
, 1, &exit_status
))
7698 switch (WEXITSTATUS (exit_status
))
7701 status
= ATTEMPT_STATUS_ICE
;
7704 case SUCCESS_EXIT_CODE
:
7705 status
= ATTEMPT_STATUS_SUCCESS
;
7717 /* This routine reads lines from IN file, adds C++ style comments
7718 at the begining of each line and writes result into OUT. */
7721 insert_comments (const char *file_in
, const char *file_out
)
7723 FILE *in
= fopen (file_in
, "rb");
7724 FILE *out
= fopen (file_out
, "wb");
7727 bool add_comment
= true;
7728 while (fgets (line
, sizeof (line
), in
))
7733 add_comment
= strchr (line
, '\n') != NULL
;
7740 /* This routine adds preprocessed source code into the given ERR_FILE.
7741 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
7742 add information in report file. RUN_ATTEMPT should return
7743 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
7746 do_report_bug (const char **new_argv
, const int nargs
,
7747 char **out_file
, char **err_file
)
7750 int fd
= open (*out_file
, O_RDWR
| O_APPEND
);
7753 write (fd
, "\n//", 3);
7754 for (i
= 0; i
< nargs
; i
++)
7757 write (fd
, new_argv
[i
], strlen (new_argv
[i
]));
7759 write (fd
, "\n\n", 2);
7761 new_argv
[nargs
] = "-E";
7762 new_argv
[nargs
+ 1] = NULL
;
7764 status
= run_attempt (new_argv
, *out_file
, *err_file
, 0, 1);
7766 if (status
== ATTEMPT_STATUS_SUCCESS
)
7768 fnotice (stderr
, "Preprocessed source stored into %s file,"
7769 " please attach this to your bugreport.\n", *out_file
);
7770 /* Make sure it is not deleted. */
7776 /* Try to reproduce ICE. If bug is reproducible, generate report .err file
7777 containing GCC configuration, backtrace, compiler's command line options
7778 and preprocessed source code. */
7781 try_generate_repro (const char **argv
)
7783 int i
, nargs
, out_arg
= -1, quiet
= 0, attempt
;
7784 const char **new_argv
;
7785 char *temp_files
[RETRY_ICE_ATTEMPTS
* 2];
7786 char **temp_stdout_files
= &temp_files
[0];
7787 char **temp_stderr_files
= &temp_files
[RETRY_ICE_ATTEMPTS
];
7789 if (gcc_input_filename
== NULL
|| ! strcmp (gcc_input_filename
, "-"))
7792 for (nargs
= 0; argv
[nargs
] != NULL
; ++nargs
)
7793 /* Only retry compiler ICEs, not preprocessor ones. */
7794 if (! strcmp (argv
[nargs
], "-E"))
7796 else if (argv
[nargs
][0] == '-' && argv
[nargs
][1] == 'o')
7803 /* If the compiler is going to output any time information,
7804 it might varry between invocations. */
7805 else if (! strcmp (argv
[nargs
], "-quiet"))
7807 else if (! strcmp (argv
[nargs
], "-ftime-report"))
7810 if (out_arg
== -1 || !quiet
)
7813 memset (temp_files
, '\0', sizeof (temp_files
));
7814 new_argv
= XALLOCAVEC (const char *, nargs
+ 4);
7815 memcpy (new_argv
, argv
, (nargs
+ 1) * sizeof (const char *));
7816 new_argv
[nargs
++] = "-frandom-seed=0";
7817 new_argv
[nargs
++] = "-fdump-noaddr";
7818 new_argv
[nargs
] = NULL
;
7819 if (new_argv
[out_arg
][2] == '\0')
7820 new_argv
[out_arg
+ 1] = "-";
7822 new_argv
[out_arg
] = "-o-";
7825 for (attempt
= 0; attempt
< RETRY_ICE_ATTEMPTS
; ++attempt
)
7827 int emit_system_info
= 0;
7829 temp_stdout_files
[attempt
] = make_temp_file (".out");
7830 temp_stderr_files
[attempt
] = make_temp_file (".err");
7832 if (attempt
== RETRY_ICE_ATTEMPTS
- 1)
7835 emit_system_info
= 1;
7838 status
= run_attempt (new_argv
, temp_stdout_files
[attempt
],
7839 temp_stderr_files
[attempt
], emit_system_info
,
7842 if (status
!= ATTEMPT_STATUS_ICE
)
7844 fnotice (stderr
, "The bug is not reproducible, so it is"
7845 " likely a hardware or OS problem.\n");
7850 if (!check_repro (temp_stdout_files
, temp_stderr_files
))
7854 /* Insert commented out backtrace into report file. */
7855 char **stderr_commented
= &temp_stdout_files
[RETRY_ICE_ATTEMPTS
- 1];
7856 insert_comments (temp_stderr_files
[RETRY_ICE_ATTEMPTS
- 1],
7859 /* In final attempt we append compiler options and preprocesssed code to last
7860 generated .out file with configuration and backtrace. */
7861 char **err
= &temp_stderr_files
[RETRY_ICE_ATTEMPTS
- 1];
7862 do_report_bug (new_argv
, nargs
, stderr_commented
, err
);
7866 for (i
= 0; i
< RETRY_ICE_ATTEMPTS
* 2; i
++)
7869 unlink (temp_stdout_files
[i
]);
7870 free (temp_stdout_files
[i
]);
7874 /* Search for a file named NAME trying various prefixes including the
7875 user's -B prefix and some standard ones.
7876 Return the absolute file name found. If nothing is found, return NAME. */
7879 find_file (const char *name
)
7881 char *newname
= find_a_file (&startfile_prefixes
, name
, R_OK
, true);
7882 return newname
? newname
: name
;
7885 /* Determine whether a directory exists. If LINKER, return 0 for
7886 certain fixed names not needed by the linker. */
7889 is_directory (const char *path1
, bool linker
)
7896 /* Ensure the string ends with "/.". The resulting path will be a
7897 directory even if the given path is a symbolic link. */
7898 len1
= strlen (path1
);
7899 path
= (char *) alloca (3 + len1
);
7900 memcpy (path
, path1
, len1
);
7902 if (!IS_DIR_SEPARATOR (cp
[-1]))
7903 *cp
++ = DIR_SEPARATOR
;
7907 /* Exclude directories that the linker is known to search. */
7909 && IS_DIR_SEPARATOR (path
[0])
7911 && filename_ncmp (path
+ 1, "lib", 3) == 0)
7913 && filename_ncmp (path
+ 1, "usr", 3) == 0
7914 && IS_DIR_SEPARATOR (path
[4])
7915 && filename_ncmp (path
+ 5, "lib", 3) == 0)))
7918 return (stat (path
, &st
) >= 0 && S_ISDIR (st
.st_mode
));
7921 /* Set up the various global variables to indicate that we're processing
7922 the input file named FILENAME. */
7925 set_input (const char *filename
)
7929 gcc_input_filename
= filename
;
7930 input_filename_length
= strlen (gcc_input_filename
);
7931 input_basename
= lbasename (gcc_input_filename
);
7933 /* Find a suffix starting with the last period,
7934 and set basename_length to exclude that suffix. */
7935 basename_length
= strlen (input_basename
);
7936 suffixed_basename_length
= basename_length
;
7937 p
= input_basename
+ basename_length
;
7938 while (p
!= input_basename
&& *p
!= '.')
7940 if (*p
== '.' && p
!= input_basename
)
7942 basename_length
= p
- input_basename
;
7943 input_suffix
= p
+ 1;
7948 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
7949 we will need to do a stat on the gcc_input_filename. The
7950 INPUT_STAT_SET signals that the stat is needed. */
7954 /* On fatal signals, delete all the temporary files. */
7957 fatal_signal (int signum
)
7959 signal (signum
, SIG_DFL
);
7960 delete_failure_queue ();
7961 delete_temp_files ();
7962 /* Get the same signal again, this time not handled,
7963 so its normal effect occurs. */
7964 kill (getpid (), signum
);
7967 /* Compare the contents of the two files named CMPFILE[0] and
7968 CMPFILE[1]. Return zero if they're identical, nonzero
7972 compare_files (char *cmpfile
[])
7975 FILE *temp
[2] = { NULL
, NULL
};
7981 void *map
[2] = { NULL
, NULL
};
7983 for (i
= 0; i
< 2; i
++)
7987 if (stat (cmpfile
[i
], &st
) < 0 || !S_ISREG (st
.st_mode
))
7989 error ("%s: could not determine length of compare-debug file %s",
7990 gcc_input_filename
, cmpfile
[i
]);
7995 length
[i
] = st
.st_size
;
7998 if (!ret
&& length
[0] != length
[1])
8000 error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename
);
8005 for (i
= 0; i
< 2; i
++)
8007 int fd
= open (cmpfile
[i
], O_RDONLY
);
8010 error ("%s: could not open compare-debug file %s",
8011 gcc_input_filename
, cmpfile
[i
]);
8016 map
[i
] = mmap (NULL
, length
[i
], PROT_READ
, MAP_PRIVATE
, fd
, 0);
8019 if (map
[i
] == (void *) MAP_FAILED
)
8028 if (memcmp (map
[0], map
[1], length
[0]) != 0)
8030 error ("%s: %<-fcompare-debug%> failure", gcc_input_filename
);
8035 for (i
= 0; i
< 2; i
++)
8037 munmap ((caddr_t
) map
[i
], length
[i
]);
8046 for (i
= 0; i
< 2; i
++)
8048 temp
[i
] = fopen (cmpfile
[i
], "r");
8051 error ("%s: could not open compare-debug file %s",
8052 gcc_input_filename
, cmpfile
[i
]);
8058 if (!ret
&& temp
[0] && temp
[1])
8062 c0
= fgetc (temp
[0]);
8063 c1
= fgetc (temp
[1]);
8067 error ("%s: %<-fcompare-debug%> failure",
8068 gcc_input_filename
);
8077 for (i
= 1; i
>= 0; i
--)
8086 driver::driver (bool can_finalize
, bool debug
) :
8087 explicit_link_files (NULL
),
8088 decoded_options (NULL
)
8090 env
.init (can_finalize
, debug
);
8095 XDELETEVEC (explicit_link_files
);
8096 XDELETEVEC (decoded_options
);
8099 /* driver::main is implemented as a series of driver:: method calls. */
8102 driver::main (int argc
, char **argv
)
8106 set_progname (argv
[0]);
8107 expand_at_files (&argc
, &argv
);
8108 decode_argv (argc
, const_cast <const char **> (argv
));
8109 global_initializations ();
8110 build_multilib_strings ();
8112 putenv_COLLECT_AS_OPTIONS (assembler_options
);
8113 putenv_COLLECT_GCC (argv
[0]);
8114 maybe_putenv_COLLECT_LTO_WRAPPER ();
8115 maybe_putenv_OFFLOAD_TARGETS ();
8116 handle_unrecognized_options ();
8120 m_option_proposer
.suggest_completion (completion
);
8124 if (!maybe_print_and_exit ())
8127 early_exit
= prepare_infiles ();
8129 return get_exit_code ();
8131 do_spec_on_infiles ();
8132 maybe_run_linker (argv
[0]);
8134 return get_exit_code ();
8137 /* Locate the final component of argv[0] after any leading path, and set
8138 the program name accordingly. */
8141 driver::set_progname (const char *argv0
) const
8143 const char *p
= argv0
+ strlen (argv0
);
8144 while (p
!= argv0
&& !IS_DIR_SEPARATOR (p
[-1]))
8148 xmalloc_set_program_name (progname
);
8151 /* Expand any @ files within the command-line args,
8152 setting at_file_supplied if any were expanded. */
8155 driver::expand_at_files (int *argc
, char ***argv
) const
8157 char **old_argv
= *argv
;
8159 expandargv (argc
, argv
);
8161 /* Determine if any expansions were made. */
8162 if (*argv
!= old_argv
)
8163 at_file_supplied
= true;
8166 /* Decode the command-line arguments from argc/argv into the
8167 decoded_options array. */
8170 driver::decode_argv (int argc
, const char **argv
)
8172 init_opts_obstack ();
8173 init_options_struct (&global_options
, &global_options_set
);
8175 decode_cmdline_options_to_array (argc
, argv
,
8177 &decoded_options
, &decoded_options_count
);
8180 /* Perform various initializations and setup. */
8183 driver::global_initializations ()
8185 /* Unlock the stdio streams. */
8186 unlock_std_streams ();
8188 gcc_init_libintl ();
8190 diagnostic_initialize (global_dc
, 0);
8191 diagnostic_color_init (global_dc
);
8192 diagnostic_urls_init (global_dc
);
8194 #ifdef GCC_DRIVER_HOST_INITIALIZATION
8195 /* Perform host dependent initialization when needed. */
8196 GCC_DRIVER_HOST_INITIALIZATION
;
8199 if (atexit (delete_temp_files
) != 0)
8200 fatal_error (input_location
, "atexit failed");
8202 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
8203 signal (SIGINT
, fatal_signal
);
8205 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
8206 signal (SIGHUP
, fatal_signal
);
8208 if (signal (SIGTERM
, SIG_IGN
) != SIG_IGN
)
8209 signal (SIGTERM
, fatal_signal
);
8211 if (signal (SIGPIPE
, SIG_IGN
) != SIG_IGN
)
8212 signal (SIGPIPE
, fatal_signal
);
8215 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
8216 receive the signal. A different setting is inheritable */
8217 signal (SIGCHLD
, SIG_DFL
);
8220 /* Parsing and gimplification sometimes need quite large stack.
8221 Increase stack size limits if possible. */
8222 stack_limit_increase (64 * 1024 * 1024);
8224 /* Allocate the argument vector. */
8227 obstack_init (&obstack
);
8230 /* Build multilib_select, et. al from the separate lines that make up each
8231 multilib selection. */
8234 driver::build_multilib_strings () const
8238 const char *const *q
= multilib_raw
;
8241 obstack_init (&multilib_obstack
);
8242 while ((p
= *q
++) != (char *) 0)
8243 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8245 obstack_1grow (&multilib_obstack
, 0);
8246 multilib_select
= XOBFINISH (&multilib_obstack
, const char *);
8248 q
= multilib_matches_raw
;
8249 while ((p
= *q
++) != (char *) 0)
8250 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8252 obstack_1grow (&multilib_obstack
, 0);
8253 multilib_matches
= XOBFINISH (&multilib_obstack
, const char *);
8255 q
= multilib_exclusions_raw
;
8256 while ((p
= *q
++) != (char *) 0)
8257 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8259 obstack_1grow (&multilib_obstack
, 0);
8260 multilib_exclusions
= XOBFINISH (&multilib_obstack
, const char *);
8262 q
= multilib_reuse_raw
;
8263 while ((p
= *q
++) != (char *) 0)
8264 obstack_grow (&multilib_obstack
, p
, strlen (p
));
8266 obstack_1grow (&multilib_obstack
, 0);
8267 multilib_reuse
= XOBFINISH (&multilib_obstack
, const char *);
8270 for (size_t i
= 0; i
< ARRAY_SIZE (multilib_defaults_raw
); i
++)
8273 obstack_1grow (&multilib_obstack
, ' ');
8274 obstack_grow (&multilib_obstack
,
8275 multilib_defaults_raw
[i
],
8276 strlen (multilib_defaults_raw
[i
]));
8280 obstack_1grow (&multilib_obstack
, 0);
8281 multilib_defaults
= XOBFINISH (&multilib_obstack
, const char *);
8285 /* Set up the spec-handling machinery. */
8288 driver::set_up_specs () const
8290 const char *spec_machine_suffix
;
8294 #ifdef INIT_ENVIRONMENT
8295 /* Set up any other necessary machine specific environment variables. */
8296 xputenv (INIT_ENVIRONMENT
);
8299 /* Make a table of what switches there are (switches, n_switches).
8300 Make a table of specified input files (infiles, n_infiles).
8301 Decode switches that are handled locally. */
8303 process_command (decoded_options_count
, decoded_options
);
8305 /* Initialize the vector of specs to just the default.
8306 This means one element containing 0s, as a terminator. */
8308 compilers
= XNEWVAR (struct compiler
, sizeof default_compilers
);
8309 memcpy (compilers
, default_compilers
, sizeof default_compilers
);
8310 n_compilers
= n_default_compilers
;
8312 /* Read specs from a file if there is one. */
8314 machine_suffix
= concat (spec_host_machine
, dir_separator_str
, spec_version
,
8315 accel_dir_suffix
, dir_separator_str
, NULL
);
8316 just_machine_suffix
= concat (spec_machine
, dir_separator_str
, NULL
);
8318 specs_file
= find_a_file (&startfile_prefixes
, "specs", R_OK
, true);
8319 /* Read the specs file unless it is a default one. */
8320 if (specs_file
!= 0 && strcmp (specs_file
, "specs"))
8321 read_specs (specs_file
, true, false);
8325 #ifdef ACCEL_COMPILER
8326 spec_machine_suffix
= machine_suffix
;
8328 spec_machine_suffix
= just_machine_suffix
;
8331 /* We need to check standard_exec_prefix/spec_machine_suffix/specs
8332 for any override of as, ld and libraries. */
8333 specs_file
= (char *) alloca (strlen (standard_exec_prefix
)
8334 + strlen (spec_machine_suffix
) + sizeof ("specs"));
8335 strcpy (specs_file
, standard_exec_prefix
);
8336 strcat (specs_file
, spec_machine_suffix
);
8337 strcat (specs_file
, "specs");
8338 if (access (specs_file
, R_OK
) == 0)
8339 read_specs (specs_file
, true, false);
8341 /* Process any configure-time defaults specified for the command line
8342 options, via OPTION_DEFAULT_SPECS. */
8343 for (i
= 0; i
< ARRAY_SIZE (option_default_specs
); i
++)
8344 do_option_spec (option_default_specs
[i
].name
,
8345 option_default_specs
[i
].spec
);
8347 /* Process DRIVER_SELF_SPECS, adding any new options to the end
8348 of the command line. */
8350 for (i
= 0; i
< ARRAY_SIZE (driver_self_specs
); i
++)
8351 do_self_spec (driver_self_specs
[i
]);
8353 /* If not cross-compiling, look for executables in the standard
8355 if (*cross_compile
== '0')
8357 if (*md_exec_prefix
)
8359 add_prefix (&exec_prefixes
, md_exec_prefix
, "GCC",
8360 PREFIX_PRIORITY_LAST
, 0, 0);
8364 /* Process sysroot_suffix_spec. */
8365 if (*sysroot_suffix_spec
!= 0
8366 && !no_sysroot_suffix
8367 && do_spec_2 (sysroot_suffix_spec
, NULL
) == 0)
8369 if (argbuf
.length () > 1)
8370 error ("spec failure: more than one argument to "
8371 "%<SYSROOT_SUFFIX_SPEC%>");
8372 else if (argbuf
.length () == 1)
8373 target_sysroot_suffix
= xstrdup (argbuf
.last ());
8376 #ifdef HAVE_LD_SYSROOT
8377 /* Pass the --sysroot option to the linker, if it supports that. If
8378 there is a sysroot_suffix_spec, it has already been processed by
8379 this point, so target_system_root really is the system root we
8381 if (target_system_root
)
8383 obstack_grow (&obstack
, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
8384 obstack_grow0 (&obstack
, link_spec
, strlen (link_spec
));
8385 set_spec ("link", XOBFINISH (&obstack
, const char *), false);
8389 /* Process sysroot_hdrs_suffix_spec. */
8390 if (*sysroot_hdrs_suffix_spec
!= 0
8391 && !no_sysroot_suffix
8392 && do_spec_2 (sysroot_hdrs_suffix_spec
, NULL
) == 0)
8394 if (argbuf
.length () > 1)
8395 error ("spec failure: more than one argument "
8396 "to %<SYSROOT_HEADERS_SUFFIX_SPEC%>");
8397 else if (argbuf
.length () == 1)
8398 target_sysroot_hdrs_suffix
= xstrdup (argbuf
.last ());
8401 /* Look for startfiles in the standard places. */
8402 if (*startfile_prefix_spec
!= 0
8403 && do_spec_2 (startfile_prefix_spec
, NULL
) == 0
8404 && do_spec_1 (" ", 0, NULL
) == 0)
8406 for (const char *arg
: argbuf
)
8407 add_sysrooted_prefix (&startfile_prefixes
, arg
, "BINUTILS",
8408 PREFIX_PRIORITY_LAST
, 0, 1);
8410 /* We should eventually get rid of all these and stick to
8411 startfile_prefix_spec exclusively. */
8412 else if (*cross_compile
== '0' || target_system_root
)
8414 if (*md_startfile_prefix
)
8415 add_sysrooted_prefix (&startfile_prefixes
, md_startfile_prefix
,
8416 "GCC", PREFIX_PRIORITY_LAST
, 0, 1);
8418 if (*md_startfile_prefix_1
)
8419 add_sysrooted_prefix (&startfile_prefixes
, md_startfile_prefix_1
,
8420 "GCC", PREFIX_PRIORITY_LAST
, 0, 1);
8422 /* If standard_startfile_prefix is relative, base it on
8423 standard_exec_prefix. This lets us move the installed tree
8424 as a unit. If GCC_EXEC_PREFIX is defined, base
8425 standard_startfile_prefix on that as well.
8427 If the prefix is relative, only search it for native compilers;
8428 otherwise we will search a directory containing host libraries. */
8429 if (IS_ABSOLUTE_PATH (standard_startfile_prefix
))
8430 add_sysrooted_prefix (&startfile_prefixes
,
8431 standard_startfile_prefix
, "BINUTILS",
8432 PREFIX_PRIORITY_LAST
, 0, 1);
8433 else if (*cross_compile
== '0')
8435 add_prefix (&startfile_prefixes
,
8436 concat (gcc_exec_prefix
8437 ? gcc_exec_prefix
: standard_exec_prefix
,
8439 standard_startfile_prefix
, NULL
),
8440 NULL
, PREFIX_PRIORITY_LAST
, 0, 1);
8443 /* Sysrooted prefixes are relocated because target_system_root is
8444 also relocated by gcc_exec_prefix. */
8445 if (*standard_startfile_prefix_1
)
8446 add_sysrooted_prefix (&startfile_prefixes
,
8447 standard_startfile_prefix_1
, "BINUTILS",
8448 PREFIX_PRIORITY_LAST
, 0, 1);
8449 if (*standard_startfile_prefix_2
)
8450 add_sysrooted_prefix (&startfile_prefixes
,
8451 standard_startfile_prefix_2
, "BINUTILS",
8452 PREFIX_PRIORITY_LAST
, 0, 1);
8455 /* Process any user specified specs in the order given on the command
8457 for (struct user_specs
*uptr
= user_specs_head
; uptr
; uptr
= uptr
->next
)
8459 char *filename
= find_a_file (&startfile_prefixes
, uptr
->filename
,
8461 read_specs (filename
? filename
: uptr
->filename
, false, true);
8464 /* Process any user self specs. */
8466 struct spec_list
*sl
;
8467 for (sl
= specs
; sl
; sl
= sl
->next
)
8468 if (sl
->name_len
== sizeof "self_spec" - 1
8469 && !strcmp (sl
->name
, "self_spec"))
8470 do_self_spec (*sl
->ptr_spec
);
8475 enum save_temps save
;
8477 if (!compare_debug_second
)
8479 n_switches_debug_check
[1] = n_switches
;
8480 n_switches_alloc_debug_check
[1] = n_switches_alloc
;
8481 switches_debug_check
[1] = XDUPVEC (struct switchstr
, switches
,
8484 do_self_spec ("%:compare-debug-self-opt()");
8485 n_switches_debug_check
[0] = n_switches
;
8486 n_switches_alloc_debug_check
[0] = n_switches_alloc
;
8487 switches_debug_check
[0] = switches
;
8489 n_switches
= n_switches_debug_check
[1];
8490 n_switches_alloc
= n_switches_alloc_debug_check
[1];
8491 switches
= switches_debug_check
[1];
8494 /* Avoid crash when computing %j in this early. */
8495 save
= save_temps_flag
;
8496 save_temps_flag
= SAVE_TEMPS_NONE
;
8498 compare_debug
= -compare_debug
;
8499 do_self_spec ("%:compare-debug-self-opt()");
8501 save_temps_flag
= save
;
8503 if (!compare_debug_second
)
8505 n_switches_debug_check
[1] = n_switches
;
8506 n_switches_alloc_debug_check
[1] = n_switches_alloc
;
8507 switches_debug_check
[1] = switches
;
8508 compare_debug
= -compare_debug
;
8509 n_switches
= n_switches_debug_check
[0];
8510 n_switches_alloc
= n_switches_debug_check
[0];
8511 switches
= switches_debug_check
[0];
8516 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
8517 if (gcc_exec_prefix
)
8518 gcc_exec_prefix
= concat (gcc_exec_prefix
, spec_host_machine
,
8519 dir_separator_str
, spec_version
,
8520 accel_dir_suffix
, dir_separator_str
, NULL
);
8522 /* Now we have the specs.
8523 Set the `valid' bits for switches that match anything in any spec. */
8525 validate_all_switches ();
8527 /* Now that we have the switches and the specs, set
8528 the subdirectory based on the options. */
8529 set_multilib_dir ();
8532 /* Set up to remember the pathname of gcc and any options
8533 needed for collect. We use argv[0] instead of progname because
8534 we need the complete pathname. */
8537 driver::putenv_COLLECT_GCC (const char *argv0
) const
8539 obstack_init (&collect_obstack
);
8540 obstack_grow (&collect_obstack
, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
8541 obstack_grow (&collect_obstack
, argv0
, strlen (argv0
) + 1);
8542 xputenv (XOBFINISH (&collect_obstack
, char *));
8545 /* Set up to remember the pathname of the lto wrapper. */
8548 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
8550 char *lto_wrapper_file
;
8553 lto_wrapper_file
= NULL
;
8555 lto_wrapper_file
= find_a_program ("lto-wrapper");
8556 if (lto_wrapper_file
)
8558 lto_wrapper_file
= convert_white_space (lto_wrapper_file
);
8559 set_static_spec_owned (<o_wrapper_spec
, lto_wrapper_file
);
8560 obstack_init (&collect_obstack
);
8561 obstack_grow (&collect_obstack
, "COLLECT_LTO_WRAPPER=",
8562 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
8563 obstack_grow (&collect_obstack
, lto_wrapper_spec
,
8564 strlen (lto_wrapper_spec
) + 1);
8565 xputenv (XOBFINISH (&collect_obstack
, char *));
8570 /* Set up to remember the names of offload targets. */
8573 driver::maybe_putenv_OFFLOAD_TARGETS () const
8575 if (offload_targets
&& offload_targets
[0] != '\0')
8577 obstack_grow (&collect_obstack
, "OFFLOAD_TARGET_NAMES=",
8578 sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
8579 obstack_grow (&collect_obstack
, offload_targets
,
8580 strlen (offload_targets
) + 1);
8581 xputenv (XOBFINISH (&collect_obstack
, char *));
8582 #if OFFLOAD_DEFAULTED
8583 if (offload_targets_default
)
8584 xputenv ("OFFLOAD_TARGET_DEFAULT=1");
8588 free (offload_targets
);
8589 offload_targets
= NULL
;
8592 /* Reject switches that no pass was interested in. */
8595 driver::handle_unrecognized_options ()
8597 for (size_t i
= 0; (int) i
< n_switches
; i
++)
8598 if (! switches
[i
].validated
)
8600 const char *hint
= m_option_proposer
.suggest_option (switches
[i
].part1
);
8602 error ("unrecognized command-line option %<-%s%>;"
8603 " did you mean %<-%s%>?",
8604 switches
[i
].part1
, hint
);
8606 error ("unrecognized command-line option %<-%s%>",
8611 /* Handle the various -print-* options, returning 0 if the driver
8612 should exit, or nonzero if the driver should continue. */
8615 driver::maybe_print_and_exit () const
8617 if (print_search_dirs
)
8619 printf (_("install: %s%s\n"),
8620 gcc_exec_prefix
? gcc_exec_prefix
: standard_exec_prefix
,
8621 gcc_exec_prefix
? "" : machine_suffix
);
8622 printf (_("programs: %s\n"),
8623 build_search_list (&exec_prefixes
, "", false, false));
8624 printf (_("libraries: %s\n"),
8625 build_search_list (&startfile_prefixes
, "", false, true));
8629 if (print_file_name
)
8631 printf ("%s\n", find_file (print_file_name
));
8635 if (print_prog_name
)
8637 if (use_ld
!= NULL
&& ! strcmp (print_prog_name
, "ld"))
8639 /* Append USE_LD to the default linker. */
8640 #ifdef DEFAULT_LINKER
8642 # ifdef HAVE_HOST_EXECUTABLE_SUFFIX
8643 int len
= (sizeof (DEFAULT_LINKER
)
8644 - sizeof (HOST_EXECUTABLE_SUFFIX
));
8648 char *default_linker
= xstrdup (DEFAULT_LINKER
);
8649 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
8650 HOST_EXECUTABLE_SUFFIX. */
8651 if (! strcmp (&default_linker
[len
], HOST_EXECUTABLE_SUFFIX
))
8653 default_linker
[len
] = '\0';
8654 ld
= concat (default_linker
, use_ld
,
8655 HOST_EXECUTABLE_SUFFIX
, NULL
);
8660 ld
= concat (DEFAULT_LINKER
, use_ld
, NULL
);
8661 if (access (ld
, X_OK
) == 0)
8663 printf ("%s\n", ld
);
8667 print_prog_name
= concat (print_prog_name
, use_ld
, NULL
);
8669 char *newname
= find_a_program (print_prog_name
);
8670 printf ("%s\n", (newname
? newname
: print_prog_name
));
8674 if (print_multi_lib
)
8676 print_multilib_info ();
8680 if (print_multi_directory
)
8682 if (multilib_dir
== NULL
)
8685 printf ("%s\n", multilib_dir
);
8689 if (print_multiarch
)
8691 if (multiarch_dir
== NULL
)
8694 printf ("%s\n", multiarch_dir
);
8700 if (target_system_root
)
8702 if (target_sysroot_suffix
)
8703 printf ("%s%s\n", target_system_root
, target_sysroot_suffix
);
8705 printf ("%s\n", target_system_root
);
8710 if (print_multi_os_directory
)
8712 if (multilib_os_dir
== NULL
)
8715 printf ("%s\n", multilib_os_dir
);
8719 if (print_sysroot_headers_suffix
)
8721 if (*sysroot_hdrs_suffix_spec
)
8723 printf("%s\n", (target_sysroot_hdrs_suffix
8724 ? target_sysroot_hdrs_suffix
8729 /* The error status indicates that only one set of fixed
8730 headers should be built. */
8731 fatal_error (input_location
,
8732 "not configured with sysroot headers suffix");
8735 if (print_help_list
)
8741 printf (_("\nFor bug reporting instructions, please see:\n"));
8742 printf ("%s.\n", bug_report_url
);
8747 /* We do not exit here. Instead we have created a fake input file
8748 called 'help-dummy' which needs to be compiled, and we pass this
8749 on the various sub-processes, along with the --help switch.
8750 Ensure their output appears after ours. */
8751 fputc ('\n', stdout
);
8757 printf (_("%s %s%s\n"), progname
, pkgversion_string
,
8759 printf ("Copyright %s 2023 Free Software Foundation, Inc.\n",
8761 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
8762 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
8767 /* We do not exit here. We use the same mechanism of --help to print
8768 the version of the sub-processes. */
8769 fputc ('\n', stdout
);
8775 print_configuration (stderr
);
8783 /* Figure out what to do with each input file.
8784 Return true if we need to exit early from "main", false otherwise. */
8787 driver::prepare_infiles ()
8790 int lang_n_infiles
= 0;
8792 if (n_infiles
== added_libraries
)
8793 fatal_error (input_location
, "no input files");
8796 /* Early exit needed from main. */
8799 /* Make a place to record the compiler output file names
8800 that correspond to the input files. */
8803 i
+= lang_specific_extra_outfiles
;
8804 outfiles
= XCNEWVEC (const char *, i
);
8806 /* Record which files were specified explicitly as link input. */
8808 explicit_link_files
= XCNEWVEC (char, n_infiles
);
8810 combine_inputs
= have_o
|| flag_wpa
;
8812 for (i
= 0; (int) i
< n_infiles
; i
++)
8814 const char *name
= infiles
[i
].name
;
8815 struct compiler
*compiler
= lookup_compiler (name
,
8817 infiles
[i
].language
);
8819 if (compiler
&& !(compiler
->combinable
))
8820 combine_inputs
= false;
8822 if (lang_n_infiles
> 0 && compiler
!= input_file_compiler
8823 && infiles
[i
].language
&& infiles
[i
].language
[0] != '*')
8824 infiles
[i
].incompiler
= compiler
;
8828 input_file_compiler
= compiler
;
8829 infiles
[i
].incompiler
= compiler
;
8833 /* Since there is no compiler for this input file, assume it is a
8835 explicit_link_files
[i
] = 1;
8836 infiles
[i
].incompiler
= NULL
;
8838 infiles
[i
].compiled
= false;
8839 infiles
[i
].preprocessed
= false;
8842 if (!combine_inputs
&& have_c
&& have_o
&& lang_n_infiles
> 1)
8843 fatal_error (input_location
,
8844 "cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> "
8845 "with multiple files");
8847 /* No early exit needed from main; we can continue. */
8851 /* Run the spec machinery on each input file. */
8854 driver::do_spec_on_infiles () const
8858 for (i
= 0; (int) i
< n_infiles
; i
++)
8860 int this_file_error
= 0;
8862 /* Tell do_spec what to substitute for %i. */
8864 input_file_number
= i
;
8865 set_input (infiles
[i
].name
);
8867 if (infiles
[i
].compiled
)
8870 /* Use the same thing in %o, unless cp->spec says otherwise. */
8872 outfiles
[i
] = gcc_input_filename
;
8874 /* Figure out which compiler from the file's suffix. */
8877 = lookup_compiler (infiles
[i
].name
, input_filename_length
,
8878 infiles
[i
].language
);
8880 if (input_file_compiler
)
8882 /* Ok, we found an applicable compiler. Run its spec. */
8884 if (input_file_compiler
->spec
[0] == '#')
8886 error ("%s: %s compiler not installed on this system",
8887 gcc_input_filename
, &input_file_compiler
->spec
[1]);
8888 this_file_error
= 1;
8896 free (debug_check_temp_file
[0]);
8897 debug_check_temp_file
[0] = NULL
;
8899 free (debug_check_temp_file
[1]);
8900 debug_check_temp_file
[1] = NULL
;
8903 value
= do_spec (input_file_compiler
->spec
);
8904 infiles
[i
].compiled
= true;
8906 this_file_error
= 1;
8907 else if (compare_debug
&& debug_check_temp_file
[0])
8910 inform (UNKNOWN_LOCATION
,
8911 "recompiling with %<-fcompare-debug%>");
8913 compare_debug
= -compare_debug
;
8914 n_switches
= n_switches_debug_check
[1];
8915 n_switches_alloc
= n_switches_alloc_debug_check
[1];
8916 switches
= switches_debug_check
[1];
8918 value
= do_spec (input_file_compiler
->spec
);
8920 compare_debug
= -compare_debug
;
8921 n_switches
= n_switches_debug_check
[0];
8922 n_switches_alloc
= n_switches_alloc_debug_check
[0];
8923 switches
= switches_debug_check
[0];
8927 error ("during %<-fcompare-debug%> recompilation");
8928 this_file_error
= 1;
8931 gcc_assert (debug_check_temp_file
[1]
8932 && filename_cmp (debug_check_temp_file
[0],
8933 debug_check_temp_file
[1]));
8936 inform (UNKNOWN_LOCATION
, "comparing final insns dumps");
8938 if (compare_files (debug_check_temp_file
))
8939 this_file_error
= 1;
8944 free (debug_check_temp_file
[0]);
8945 debug_check_temp_file
[0] = NULL
;
8947 free (debug_check_temp_file
[1]);
8948 debug_check_temp_file
[1] = NULL
;
8953 /* If this file's name does not contain a recognized suffix,
8954 record it as explicit linker input. */
8957 explicit_link_files
[i
] = 1;
8959 /* Clear the delete-on-failure queue, deleting the files in it
8960 if this compilation failed. */
8962 if (this_file_error
)
8964 delete_failure_queue ();
8967 /* If this compilation succeeded, don't delete those files later. */
8968 clear_failure_queue ();
8971 /* Reset the input file name to the first compile/object file name, for use
8972 with %b in LINK_SPEC. We use the first input file that we can find
8973 a compiler to compile it instead of using infiles.language since for
8974 languages other than C we use aliases that we then lookup later. */
8979 for (i
= 0; i
< n_infiles
; i
++)
8980 if (infiles
[i
].incompiler
8981 || (infiles
[i
].language
&& infiles
[i
].language
[0] != '*'))
8983 set_input (infiles
[i
].name
);
8990 /* Make sure INPUT_FILE_NUMBER points to first available open
8992 input_file_number
= n_infiles
;
8993 if (lang_specific_pre_link ())
8998 /* If we have to run the linker, do it now. */
9001 driver::maybe_run_linker (const char *argv0
) const
9004 int linker_was_run
= 0;
9005 int num_linker_inputs
;
9007 /* Determine if there are any linker input files. */
9008 num_linker_inputs
= 0;
9009 for (i
= 0; (int) i
< n_infiles
; i
++)
9010 if (explicit_link_files
[i
] || outfiles
[i
] != NULL
)
9011 num_linker_inputs
++;
9013 /* Arrange for temporary file names created during linking to take
9014 on names related with the linker output rather than with the
9015 inputs when appropriate. */
9016 if (outbase
&& *outbase
)
9020 char *tofree
= dumpdir
;
9021 gcc_checking_assert (strlen (dumpdir
) == dumpdir_length
);
9022 dumpdir
= concat (dumpdir
, outbase
, ".", NULL
);
9026 dumpdir
= concat (outbase
, ".", NULL
);
9027 dumpdir_length
+= strlen (outbase
) + 1;
9028 dumpdir_trailing_dash_added
= true;
9030 else if (dumpdir_trailing_dash_added
)
9032 gcc_assert (dumpdir
[dumpdir_length
- 1] == '-');
9033 dumpdir
[dumpdir_length
- 1] = '.';
9036 if (dumpdir_trailing_dash_added
)
9038 gcc_assert (dumpdir_length
> 0);
9039 gcc_assert (dumpdir
[dumpdir_length
- 1] == '.');
9044 input_basename
= outbase
= NULL
;
9045 outbase_length
= suffixed_basename_length
= basename_length
= 0;
9047 /* Run ld to link all the compiler output files. */
9049 if (num_linker_inputs
> 0 && !seen_error () && print_subprocess_help
< 2)
9051 int tmp
= execution_count
;
9053 detect_jobserver ();
9057 #if HAVE_LTO_PLUGIN > 0
9058 #if HAVE_LTO_PLUGIN == 2
9059 const char *fno_use_linker_plugin
= "fno-use-linker-plugin";
9061 const char *fuse_linker_plugin
= "fuse-linker-plugin";
9065 /* We'll use ld if we can't find collect2. */
9066 if (! strcmp (linker_name_spec
, "collect2"))
9068 char *s
= find_a_program ("collect2");
9070 set_static_spec_shared (&linker_name_spec
, "ld");
9073 #if HAVE_LTO_PLUGIN > 0
9074 #if HAVE_LTO_PLUGIN == 2
9075 if (!switch_matches (fno_use_linker_plugin
,
9076 fno_use_linker_plugin
9077 + strlen (fno_use_linker_plugin
), 0))
9079 if (switch_matches (fuse_linker_plugin
,
9081 + strlen (fuse_linker_plugin
), 0))
9084 char *temp_spec
= find_a_file (&exec_prefixes
,
9085 LTOPLUGINSONAME
, R_OK
,
9088 fatal_error (input_location
,
9089 "%<-fuse-linker-plugin%>, but %s not found",
9091 linker_plugin_file_spec
= convert_white_space (temp_spec
);
9094 set_static_spec_shared (<o_gcc_spec
, argv0
);
9097 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
9099 putenv_from_prefixes (&exec_prefixes
, "COMPILER_PATH", false);
9100 putenv_from_prefixes (&startfile_prefixes
, LIBRARY_PATH_ENV
, true);
9102 if (print_subprocess_help
== 1)
9104 printf (_("\nLinker options\n==============\n\n"));
9105 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
9106 " to the linker.\n\n"));
9109 int value
= do_spec (link_command_spec
);
9112 linker_was_run
= (tmp
!= execution_count
);
9115 /* If options said don't run linker,
9116 complain about input files to be given to the linker. */
9118 if (! linker_was_run
&& !seen_error ())
9119 for (i
= 0; (int) i
< n_infiles
; i
++)
9120 if (explicit_link_files
[i
]
9121 && !(infiles
[i
].language
&& infiles
[i
].language
[0] == '*'))
9123 warning (0, "%s: linker input file unused because linking not done",
9125 if (access (outfiles
[i
], F_OK
) < 0)
9126 /* This is can be an indication the user specifed an errorneous
9127 separated option value, (or used the wrong prefix for an
9129 error ("%s: linker input file not found: %m", outfiles
[i
]);
9133 /* The end of "main". */
9136 driver::final_actions () const
9138 /* Delete some or all of the temporary files we made. */
9141 delete_failure_queue ();
9142 delete_temp_files ();
9144 if (print_help_list
)
9146 printf (("\nFor bug reporting instructions, please see:\n"));
9147 printf ("%s\n", bug_report_url
);
9151 /* Detect whether jobserver is active and working. If not drop
9152 --jobserver-auth from MAKEFLAGS. */
9155 driver::detect_jobserver () const
9157 jobserver_info jinfo
;
9158 if (!jinfo
.is_active
&& !jinfo
.skipped_makeflags
.empty ())
9159 xputenv (xstrdup (jinfo
.skipped_makeflags
.c_str ()));
9162 /* Determine what the exit code of the driver should be. */
9165 driver::get_exit_code () const
9167 return (signal_count
!= 0 ? 2
9168 : seen_error () ? (pass_exit_codes
? greatest_status
: 1)
9172 /* Find the proper compilation spec for the file name NAME,
9173 whose length is LENGTH. LANGUAGE is the specified language,
9174 or 0 if this file is to be passed to the linker. */
9176 static struct compiler
*
9177 lookup_compiler (const char *name
, size_t length
, const char *language
)
9179 struct compiler
*cp
;
9181 /* If this was specified by the user to be a linker input, indicate that. */
9182 if (language
!= 0 && language
[0] == '*')
9185 /* Otherwise, look for the language, if one is spec'd. */
9188 for (cp
= compilers
+ n_compilers
- 1; cp
>= compilers
; cp
--)
9189 if (cp
->suffix
[0] == '@' && !strcmp (cp
->suffix
+ 1, language
))
9191 if (name
!= NULL
&& strcmp (name
, "-") == 0
9192 && (strcmp (cp
->suffix
, "@c-header") == 0
9193 || strcmp (cp
->suffix
, "@c++-header") == 0)
9195 fatal_error (input_location
,
9196 "cannot use %<-%> as input filename for a "
9197 "precompiled header");
9202 error ("language %s not recognized", language
);
9206 /* Look for a suffix. */
9207 for (cp
= compilers
+ n_compilers
- 1; cp
>= compilers
; cp
--)
9209 if (/* The suffix `-' matches only the file name `-'. */
9210 (!strcmp (cp
->suffix
, "-") && !strcmp (name
, "-"))
9211 || (strlen (cp
->suffix
) < length
9212 /* See if the suffix matches the end of NAME. */
9213 && !strcmp (cp
->suffix
,
9214 name
+ length
- strlen (cp
->suffix
))
9219 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
9220 /* Look again, but case-insensitively this time. */
9222 for (cp
= compilers
+ n_compilers
- 1; cp
>= compilers
; cp
--)
9224 if (/* The suffix `-' matches only the file name `-'. */
9225 (!strcmp (cp
->suffix
, "-") && !strcmp (name
, "-"))
9226 || (strlen (cp
->suffix
) < length
9227 /* See if the suffix matches the end of NAME. */
9228 && ((!strcmp (cp
->suffix
,
9229 name
+ length
- strlen (cp
->suffix
))
9230 || !strpbrk (cp
->suffix
, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
9231 && !strcasecmp (cp
->suffix
,
9232 name
+ length
- strlen (cp
->suffix
)))
9238 if (cp
>= compilers
)
9240 if (cp
->spec
[0] != '@')
9241 /* A non-alias entry: return it. */
9244 /* An alias entry maps a suffix to a language.
9245 Search for the language; pass 0 for NAME and LENGTH
9246 to avoid infinite recursion if language not found. */
9247 return lookup_compiler (NULL
, 0, cp
->spec
+ 1);
9253 save_string (const char *s
, int len
)
9255 char *result
= XNEWVEC (char, len
+ 1);
9257 gcc_checking_assert (strlen (s
) >= (unsigned int) len
);
9258 memcpy (result
, s
, len
);
9265 validate_switches_from_spec (const char *spec
, bool user
)
9267 const char *p
= spec
;
9273 || (*p
== 'W' && *++p
== '{')
9274 || (*p
== '@' && *++p
== '{')))
9275 /* We have a switch spec. */
9276 p
= validate_switches (p
+ 1, user
, *p
== '{');
9280 validate_all_switches (void)
9282 struct compiler
*comp
;
9283 struct spec_list
*spec
;
9285 for (comp
= compilers
; comp
->spec
; comp
++)
9286 validate_switches_from_spec (comp
->spec
, false);
9288 /* Look through the linked list of specs read from the specs file. */
9289 for (spec
= specs
; spec
; spec
= spec
->next
)
9290 validate_switches_from_spec (*spec
->ptr_spec
, spec
->user_p
);
9292 validate_switches_from_spec (link_command_spec
, false);
9295 /* Look at the switch-name that comes after START and mark as valid
9296 all supplied switches that match it. If BRACED, handle other
9297 switches after '|' and '&', and specs after ':' until ';' or '}',
9298 going back for more switches after ';'. Without BRACED, handle
9299 only one atom. Return a pointer to whatever follows the handled
9300 items, after the closing brace if BRACED. */
9303 validate_switches (const char *start
, bool user_spec
, bool braced
)
9305 const char *p
= start
;
9312 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
9324 if (*p
== '.' || *p
== ',')
9328 while (ISIDNUM (*p
) || *p
== '-' || *p
== '+' || *p
== '='
9329 || *p
== ',' || *p
== '.' || *p
== '@')
9334 starred
= true, p
++;
9340 /* Mark all matching switches as valid. */
9341 for (i
= 0; i
< n_switches
; i
++)
9342 if (!strncmp (switches
[i
].part1
, atom
, len
)
9343 && (starred
|| switches
[i
].part1
[len
] == '\0')
9344 && (switches
[i
].known
|| user_spec
))
9345 switches
[i
].validated
= true;
9352 if (*p
&& (p
[-1] == '|' || p
[-1] == '&'))
9355 if (*p
&& p
[-1] == ':')
9357 while (*p
&& *p
!= ';' && *p
!= '}')
9362 if (*p
== '{' || *p
== '<')
9363 p
= validate_switches (p
+1, user_spec
, *p
== '{');
9364 else if (p
[0] == 'W' && p
[1] == '{')
9365 p
= validate_switches (p
+2, user_spec
, true);
9366 else if (p
[0] == '@' && p
[1] == '{')
9367 p
= validate_switches (p
+2, user_spec
, true);
9374 if (*p
&& p
[-1] == ';')
9388 static struct mdswitchstr
*mdswitches
;
9389 static int n_mdswitches
;
9391 /* Check whether a particular argument was used. The first time we
9392 canonicalize the switches to keep only the ones we care about. */
9397 int operator () (const char *p
, int len
);
9404 const char *replace
;
9409 mswitchstr
*mswitches
;
9414 used_arg_t used_arg
;
9417 used_arg_t::operator () (const char *p
, int len
)
9423 struct mswitchstr
*matches
;
9427 /* Break multilib_matches into the component strings of string
9428 and replacement string. */
9429 for (q
= multilib_matches
; *q
!= '\0'; q
++)
9434 = (struct mswitchstr
*) alloca ((sizeof (struct mswitchstr
)) * cnt
);
9436 q
= multilib_matches
;
9445 fatal_error (input_location
, "multilib spec %qs is invalid",
9450 matches
[i
].len
= q
- matches
[i
].str
;
9452 matches
[i
].replace
= ++q
;
9453 while (*q
!= ';' && *q
!= '\0')
9456 goto invalid_matches
;
9459 matches
[i
].rep_len
= q
- matches
[i
].replace
;
9465 /* Now build a list of the replacement string for switches that we care
9466 about. Make sure we allocate at least one entry. This prevents
9467 xmalloc from calling fatal, and prevents us from re-executing this
9470 = XNEWVEC (struct mswitchstr
, n_mdswitches
+ (n_switches
? n_switches
: 1));
9471 for (i
= 0; i
< n_switches
; i
++)
9472 if ((switches
[i
].live_cond
& SWITCH_IGNORE
) == 0)
9474 int xlen
= strlen (switches
[i
].part1
);
9475 for (j
= 0; j
< cnt
; j
++)
9476 if (xlen
== matches
[j
].len
9477 && ! strncmp (switches
[i
].part1
, matches
[j
].str
, xlen
))
9479 mswitches
[n_mswitches
].str
= matches
[j
].replace
;
9480 mswitches
[n_mswitches
].len
= matches
[j
].rep_len
;
9481 mswitches
[n_mswitches
].replace
= (char *) 0;
9482 mswitches
[n_mswitches
].rep_len
= 0;
9488 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
9489 on the command line nor any options mutually incompatible with
9491 for (i
= 0; i
< n_mdswitches
; i
++)
9495 for (q
= multilib_options
; *q
!= '\0'; *q
&& q
++)
9501 while (strncmp (q
, mdswitches
[i
].str
, mdswitches
[i
].len
) != 0
9502 || strchr (" /", q
[mdswitches
[i
].len
]) == NULL
)
9504 while (*q
!= ' ' && *q
!= '/' && *q
!= '\0')
9511 if (*q
!= ' ' && *q
!= '\0')
9513 while (*r
!= ' ' && *r
!= '\0')
9516 while (*q
!= ' ' && *q
!= '/' && *q
!= '\0')
9519 if (used_arg (r
, q
- r
))
9524 mswitches
[n_mswitches
].str
= mdswitches
[i
].str
;
9525 mswitches
[n_mswitches
].len
= mdswitches
[i
].len
;
9526 mswitches
[n_mswitches
].replace
= (char *) 0;
9527 mswitches
[n_mswitches
].rep_len
= 0;
9540 for (i
= 0; i
< n_mswitches
; i
++)
9541 if (len
== mswitches
[i
].len
&& ! strncmp (p
, mswitches
[i
].str
, len
))
9547 void used_arg_t::finalize ()
9549 XDELETEVEC (mswitches
);
9556 default_arg (const char *p
, int len
)
9560 for (i
= 0; i
< n_mdswitches
; i
++)
9561 if (len
== mdswitches
[i
].len
&& ! strncmp (p
, mdswitches
[i
].str
, len
))
9567 /* Work out the subdirectory to use based on the options. The format of
9568 multilib_select is a list of elements. Each element is a subdirectory
9569 name followed by a list of options followed by a semicolon. The format
9570 of multilib_exclusions is the same, but without the preceding
9571 directory. First gcc will check the exclusions, if none of the options
9572 beginning with an exclamation point are present, and all of the other
9573 options are present, then we will ignore this completely. Passing
9574 that, gcc will consider each multilib_select in turn using the same
9575 rules for matching the options. If a match is found, that subdirectory
9577 A subdirectory name is optionally followed by a colon and the corresponding
9581 set_multilib_dir (void)
9584 unsigned int this_path_len
;
9585 const char *this_path
, *this_arg
;
9586 const char *start
, *end
;
9588 int ok
, ndfltok
, first
;
9591 start
= multilib_defaults
;
9592 while (*start
== ' ' || *start
== '\t')
9594 while (*start
!= '\0')
9597 while (*start
!= ' ' && *start
!= '\t' && *start
!= '\0')
9599 while (*start
== ' ' || *start
== '\t')
9607 mdswitches
= XNEWVEC (struct mdswitchstr
, n_mdswitches
);
9608 for (start
= multilib_defaults
; *start
!= '\0'; start
= end
+ 1)
9610 while (*start
== ' ' || *start
== '\t')
9616 for (end
= start
+ 1;
9617 *end
!= ' ' && *end
!= '\t' && *end
!= '\0'; end
++)
9620 obstack_grow (&multilib_obstack
, start
, end
- start
);
9621 obstack_1grow (&multilib_obstack
, 0);
9622 mdswitches
[i
].str
= XOBFINISH (&multilib_obstack
, const char *);
9623 mdswitches
[i
++].len
= end
- start
;
9630 p
= multilib_exclusions
;
9633 /* Ignore newlines. */
9640 /* Check the arguments. */
9647 fatal_error (input_location
, "multilib exclusions %qs is invalid",
9648 multilib_exclusions
);
9658 while (*p
!= ' ' && *p
!= ';')
9661 goto invalid_exclusions
;
9665 if (*this_arg
!= '!')
9673 ok
= used_arg (this_arg
, p
- this_arg
);
9688 p
= multilib_select
;
9690 /* Append multilib reuse rules if any. With those rules, we can reuse
9691 one multilib for certain different options sets. */
9692 if (strlen (multilib_reuse
) > 0)
9693 p
= concat (p
, multilib_reuse
, NULL
);
9697 /* Ignore newlines. */
9704 /* Get the initial path. */
9711 fatal_error (input_location
, "multilib select %qs %qs is invalid",
9712 multilib_select
, multilib_reuse
);
9716 this_path_len
= p
- this_path
;
9718 /* Check the arguments. */
9725 goto invalid_select
;
9734 while (*p
!= ' ' && *p
!= ';')
9737 goto invalid_select
;
9741 if (*this_arg
!= '!')
9749 /* If this is a default argument, we can just ignore it.
9750 This is true even if this_arg begins with '!'. Beginning
9751 with '!' does not mean that this argument is necessarily
9752 inappropriate for this library: it merely means that
9753 there is a more specific library which uses this
9754 argument. If this argument is a default, we need not
9755 consider that more specific library. */
9756 ok
= used_arg (this_arg
, p
- this_arg
);
9763 if (default_arg (this_arg
, p
- this_arg
))
9772 if (this_path_len
!= 1
9773 || this_path
[0] != '.')
9775 char *new_multilib_dir
= XNEWVEC (char, this_path_len
+ 1);
9778 strncpy (new_multilib_dir
, this_path
, this_path_len
);
9779 new_multilib_dir
[this_path_len
] = '\0';
9780 q
= strchr (new_multilib_dir
, ':');
9783 multilib_dir
= new_multilib_dir
;
9790 const char *q
= this_path
, *end
= this_path
+ this_path_len
;
9792 while (q
< end
&& *q
!= ':')
9796 const char *q2
= q
+ 1, *ml_end
= end
;
9797 char *new_multilib_os_dir
;
9799 while (q2
< end
&& *q2
!= ':')
9803 if (ml_end
- q
== 1)
9804 multilib_os_dir
= xstrdup (".");
9807 new_multilib_os_dir
= XNEWVEC (char, ml_end
- q
);
9808 memcpy (new_multilib_os_dir
, q
+ 1, ml_end
- q
- 1);
9809 new_multilib_os_dir
[ml_end
- q
- 1] = '\0';
9810 multilib_os_dir
= new_multilib_os_dir
;
9813 if (q2
< end
&& *q2
== ':')
9815 char *new_multiarch_dir
= XNEWVEC (char, end
- q2
);
9816 memcpy (new_multiarch_dir
, q2
+ 1, end
- q2
- 1);
9817 new_multiarch_dir
[end
- q2
- 1] = '\0';
9818 multiarch_dir
= new_multiarch_dir
;
9828 targetm_common
.compute_multilib (
9835 multilib_exclusions
,
9838 if (multilib_dir
== NULL
&& multilib_os_dir
!= NULL
9839 && strcmp (multilib_os_dir
, ".") == 0)
9841 free (CONST_CAST (char *, multilib_os_dir
));
9842 multilib_os_dir
= NULL
;
9844 else if (multilib_dir
!= NULL
&& multilib_os_dir
== NULL
)
9845 multilib_os_dir
= multilib_dir
;
9848 /* Print out the multiple library subdirectory selection
9849 information. This prints out a series of lines. Each line looks
9850 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
9851 required. Only the desired options are printed out, the negative
9852 matches. The options are print without a leading dash. There are
9853 no spaces to make it easy to use the information in the shell.
9854 Each subdirectory is printed only once. This assumes the ordering
9855 generated by the genmultilib script. Also, we leave out ones that match
9859 print_multilib_info (void)
9861 const char *p
= multilib_select
;
9862 const char *last_path
= 0, *this_path
;
9865 unsigned int last_path_len
= 0;
9870 /* Ignore newlines. */
9877 /* Get the initial path. */
9884 fatal_error (input_location
,
9885 "multilib select %qs is invalid", multilib_select
);
9891 /* When --disable-multilib was used but target defines
9892 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
9893 with .:: for multiarch configurations) are there just to find
9894 multilib_os_dir, so skip them from output. */
9895 if (this_path
[0] == '.' && this_path
[1] == ':' && this_path
[2] != ':')
9898 /* Check for matches with the multilib_exclusions. We don't bother
9899 with the '!' in either list. If any of the exclusion rules match
9900 all of its options with the select rule, we skip it. */
9902 const char *e
= multilib_exclusions
;
9903 const char *this_arg
;
9908 /* Ignore newlines. */
9915 /* Check the arguments. */
9924 fatal_error (input_location
,
9925 "multilib exclusion %qs is invalid",
9926 multilib_exclusions
);
9937 while (*e
!= ' ' && *e
!= ';')
9940 goto invalid_exclusion
;
9948 int len
= e
- this_arg
;
9951 goto invalid_select
;
9955 while (*q
!= ' ' && *q
!= ';')
9958 goto invalid_select
;
9962 if (! strncmp (arg
, this_arg
,
9963 (len
< q
- arg
) ? q
- arg
: len
)
9964 || default_arg (this_arg
, e
- this_arg
))
9994 /* If this is a duplicate, skip it. */
9995 skip
= (last_path
!= 0
9996 && (unsigned int) (p
- this_path
) == last_path_len
9997 && ! filename_ncmp (last_path
, this_path
, last_path_len
));
9999 last_path
= this_path
;
10000 last_path_len
= p
- this_path
;
10003 /* If all required arguments are default arguments, and no default
10004 arguments appear in the ! argument list, then we can skip it.
10005 We will already have printed a directory identical to this one
10006 which does not require that default argument. */
10010 bool default_arg_ok
= false;
10018 goto invalid_select
;
10029 while (*q
!= ' ' && *q
!= ';')
10032 goto invalid_select
;
10036 if (default_arg (arg
, q
- arg
))
10038 /* Stop checking if any default arguments appeared in not
10042 default_arg_ok
= false;
10046 default_arg_ok
= true;
10050 /* Stop checking if any required argument is not provided by
10051 default arguments. */
10052 default_arg_ok
= false;
10060 /* Make sure all default argument is OK for this multi-lib set. */
10061 if (default_arg_ok
)
10071 for (p1
= last_path
; p1
< p
&& *p1
!= ':'; p1
++)
10082 goto invalid_select
;
10090 use_arg
= *p
!= '!';
10095 while (*p
!= ' ' && *p
!= ';')
10098 goto invalid_select
;
10110 /* If there are extra options, print them now. */
10111 if (multilib_extra
&& *multilib_extra
)
10113 int print_at
= TRUE
;
10116 for (q
= multilib_extra
; *q
!= '\0'; q
++)
10137 /* getenv built-in spec function.
10139 Returns the value of the environment variable given by its first argument,
10140 concatenated with the second argument. If the variable is not defined, a
10141 fatal error is issued unless such undefs are internally allowed, in which
10142 case the variable name prefixed by a '/' is used as the variable value.
10144 The leading '/' allows using the result at a spot where a full path would
10145 normally be expected and when the actual value doesn't really matter since
10146 undef vars are allowed. */
10148 static const char *
10149 getenv_spec_function (int argc
, const char **argv
)
10152 const char *varname
;
10162 value
= env
.get (varname
);
10164 /* If the variable isn't defined and this is allowed, craft our expected
10165 return value. Assume variable names used in specs strings don't contain
10166 any active spec character so don't need escaping. */
10167 if (!value
&& spec_undefvar_allowed
)
10169 result
= XNEWVAR (char, strlen(varname
) + 2);
10170 sprintf (result
, "/%s", varname
);
10175 fatal_error (input_location
,
10176 "environment variable %qs not defined", varname
);
10178 /* We have to escape every character of the environment variable so
10179 they are not interpreted as active spec characters. A
10180 particularly painful case is when we are reading a variable
10181 holding a windows path complete with \ separators. */
10182 len
= strlen (value
) * 2 + strlen (argv
[1]) + 1;
10183 result
= XNEWVAR (char, len
);
10184 for (ptr
= result
; *value
; ptr
+= 2)
10190 strcpy (ptr
, argv
[1]);
10195 /* if-exists built-in spec function.
10197 Checks to see if the file specified by the absolute pathname in
10198 ARGS exists. Returns that pathname if found.
10200 The usual use for this function is to check for a library file
10201 (whose name has been expanded with %s). */
10203 static const char *
10204 if_exists_spec_function (int argc
, const char **argv
)
10206 /* Must have only one argument. */
10207 if (argc
== 1 && IS_ABSOLUTE_PATH (argv
[0]) && ! access (argv
[0], R_OK
))
10213 /* if-exists-else built-in spec function.
10215 This is like if-exists, but takes an additional argument which
10216 is returned if the first argument does not exist. */
10218 static const char *
10219 if_exists_else_spec_function (int argc
, const char **argv
)
10221 /* Must have exactly two arguments. */
10225 if (IS_ABSOLUTE_PATH (argv
[0]) && ! access (argv
[0], R_OK
))
10231 /* if-exists-then-else built-in spec function.
10233 Checks to see if the file specified by the absolute pathname in
10234 the first arg exists. Returns the second arg if so, otherwise returns
10235 the third arg if it is present. */
10237 static const char *
10238 if_exists_then_else_spec_function (int argc
, const char **argv
)
10241 /* Must have two or three arguments. */
10242 if (argc
!= 2 && argc
!= 3)
10245 if (IS_ABSOLUTE_PATH (argv
[0]) && ! access (argv
[0], R_OK
))
10254 /* sanitize built-in spec function.
10256 This returns non-NULL, if sanitizing address, thread or
10257 any of the undefined behavior sanitizers. */
10259 static const char *
10260 sanitize_spec_function (int argc
, const char **argv
)
10265 if (strcmp (argv
[0], "address") == 0)
10266 return (flag_sanitize
& SANITIZE_USER_ADDRESS
) ? "" : NULL
;
10267 if (strcmp (argv
[0], "hwaddress") == 0)
10268 return (flag_sanitize
& SANITIZE_USER_HWADDRESS
) ? "" : NULL
;
10269 if (strcmp (argv
[0], "kernel-address") == 0)
10270 return (flag_sanitize
& SANITIZE_KERNEL_ADDRESS
) ? "" : NULL
;
10271 if (strcmp (argv
[0], "kernel-hwaddress") == 0)
10272 return (flag_sanitize
& SANITIZE_KERNEL_HWADDRESS
) ? "" : NULL
;
10273 if (strcmp (argv
[0], "thread") == 0)
10274 return (flag_sanitize
& SANITIZE_THREAD
) ? "" : NULL
;
10275 if (strcmp (argv
[0], "undefined") == 0)
10276 return ((flag_sanitize
10277 & ~flag_sanitize_trap
10278 & (SANITIZE_UNDEFINED
| SANITIZE_UNDEFINED_NONDEFAULT
)))
10280 if (strcmp (argv
[0], "leak") == 0)
10281 return ((flag_sanitize
10282 & (SANITIZE_ADDRESS
| SANITIZE_LEAK
| SANITIZE_THREAD
))
10283 == SANITIZE_LEAK
) ? "" : NULL
;
10287 /* replace-outfile built-in spec function.
10289 This looks for the first argument in the outfiles array's name and
10290 replaces it with the second argument. */
10292 static const char *
10293 replace_outfile_spec_function (int argc
, const char **argv
)
10296 /* Must have exactly two arguments. */
10300 for (i
= 0; i
< n_infiles
; i
++)
10302 if (outfiles
[i
] && !filename_cmp (outfiles
[i
], argv
[0]))
10303 outfiles
[i
] = xstrdup (argv
[1]);
10308 /* remove-outfile built-in spec function.
10310 * This looks for the first argument in the outfiles array's name and
10313 static const char *
10314 remove_outfile_spec_function (int argc
, const char **argv
)
10317 /* Must have exactly one argument. */
10321 for (i
= 0; i
< n_infiles
; i
++)
10323 if (outfiles
[i
] && !filename_cmp (outfiles
[i
], argv
[0]))
10324 outfiles
[i
] = NULL
;
10329 /* Given two version numbers, compares the two numbers.
10330 A version number must match the regular expression
10331 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
10334 compare_version_strings (const char *v1
, const char *v2
)
10339 if (regcomp (&r
, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
10340 REG_EXTENDED
| REG_NOSUB
) != 0)
10342 rresult
= regexec (&r
, v1
, 0, NULL
, 0);
10343 if (rresult
== REG_NOMATCH
)
10344 fatal_error (input_location
, "invalid version number %qs", v1
);
10345 else if (rresult
!= 0)
10347 rresult
= regexec (&r
, v2
, 0, NULL
, 0);
10348 if (rresult
== REG_NOMATCH
)
10349 fatal_error (input_location
, "invalid version number %qs", v2
);
10350 else if (rresult
!= 0)
10353 return strverscmp (v1
, v2
);
10357 /* version_compare built-in spec function.
10359 This takes an argument of the following form:
10361 <comparison-op> <arg1> [<arg2>] <switch> <result>
10363 and produces "result" if the comparison evaluates to true,
10364 and nothing if it doesn't.
10366 The supported <comparison-op> values are:
10368 >= true if switch is a later (or same) version than arg1
10370 < true if switch is an earlier version than arg1
10372 >< true if switch is arg1 or later, and earlier than arg2
10373 <> true if switch is earlier than arg1 or is arg2 or later
10375 If the switch is not present, the condition is false unless
10376 the first character of the <comparison-op> is '!'.
10379 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
10380 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
10382 static const char *
10383 version_compare_spec_function (int argc
, const char **argv
)
10387 const char *switch_value
= NULL
;
10392 fatal_error (input_location
, "too few arguments to %%:version-compare");
10393 if (argv
[0][0] == '\0')
10395 if ((argv
[0][1] == '<' || argv
[0][1] == '>') && argv
[0][0] != '!')
10397 if (argc
!= nargs
+ 3)
10398 fatal_error (input_location
, "too many arguments to %%:version-compare");
10400 switch_len
= strlen (argv
[nargs
+ 1]);
10401 for (i
= 0; i
< n_switches
; i
++)
10402 if (!strncmp (switches
[i
].part1
, argv
[nargs
+ 1], switch_len
)
10403 && check_live_switch (i
, switch_len
))
10404 switch_value
= switches
[i
].part1
+ switch_len
;
10406 if (switch_value
== NULL
)
10407 comp1
= comp2
= -1;
10410 comp1
= compare_version_strings (switch_value
, argv
[1]);
10412 comp2
= compare_version_strings (switch_value
, argv
[2]);
10414 comp2
= -1; /* This value unused. */
10417 switch (argv
[0][0] << 8 | argv
[0][1])
10419 case '>' << 8 | '=':
10420 result
= comp1
>= 0;
10422 case '!' << 8 | '<':
10423 result
= comp1
>= 0 || switch_value
== NULL
;
10426 result
= comp1
< 0;
10428 case '!' << 8 | '>':
10429 result
= comp1
< 0 || switch_value
== NULL
;
10431 case '>' << 8 | '<':
10432 result
= comp1
>= 0 && comp2
< 0;
10434 case '<' << 8 | '>':
10435 result
= comp1
< 0 || comp2
>= 0;
10439 fatal_error (input_location
,
10440 "unknown operator %qs in %%:version-compare", argv
[0]);
10445 return argv
[nargs
+ 2];
10448 /* %:include builtin spec function. This differs from %include in that it
10449 can be nested inside a spec, and thus be conditionalized. It takes
10450 one argument, the filename, and looks for it in the startfile path.
10451 The result is always NULL, i.e. an empty expansion. */
10453 static const char *
10454 include_spec_function (int argc
, const char **argv
)
10461 file
= find_a_file (&startfile_prefixes
, argv
[0], R_OK
, true);
10462 read_specs (file
? file
: argv
[0], false, false);
10467 /* %:find-file spec function. This function replaces its argument by
10468 the file found through find_file, that is the -print-file-name gcc
10470 static const char *
10471 find_file_spec_function (int argc
, const char **argv
)
10478 file
= find_file (argv
[0]);
10483 /* %:find-plugindir spec function. This function replaces its argument
10484 by the -iplugindir=<dir> option. `dir' is found through find_file, that
10485 is the -print-file-name gcc program option. */
10486 static const char *
10487 find_plugindir_spec_function (int argc
, const char **argv ATTRIBUTE_UNUSED
)
10489 const char *option
;
10494 option
= concat ("-iplugindir=", find_file ("plugin"), NULL
);
10499 /* %:print-asm-header spec function. Print a banner to say that the
10500 following output is from the assembler. */
10502 static const char *
10503 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED
,
10504 const char **argv ATTRIBUTE_UNUSED
)
10506 printf (_("Assembler options\n=================\n\n"));
10507 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
10512 /* Get a random number for -frandom-seed */
10514 static unsigned HOST_WIDE_INT
10515 get_random_number (void)
10517 unsigned HOST_WIDE_INT ret
= 0;
10520 fd
= open ("/dev/urandom", O_RDONLY
);
10523 read (fd
, &ret
, sizeof (HOST_WIDE_INT
));
10529 /* Get some more or less random data. */
10530 #ifdef HAVE_GETTIMEOFDAY
10534 gettimeofday (&tv
, NULL
);
10535 ret
= tv
.tv_sec
* 1000 + tv
.tv_usec
/ 1000;
10539 time_t now
= time (NULL
);
10541 if (now
!= (time_t)-1)
10542 ret
= (unsigned) now
;
10546 return ret
^ getpid ();
10549 /* %:compare-debug-dump-opt spec function. Save the last argument,
10550 expected to be the last -fdump-final-insns option, or generate a
10553 static const char *
10554 compare_debug_dump_opt_spec_function (int arg
,
10555 const char **argv ATTRIBUTE_UNUSED
)
10560 static char random_seed
[HOST_BITS_PER_WIDE_INT
/ 4 + 3];
10563 fatal_error (input_location
,
10564 "too many arguments to %%:compare-debug-dump-opt");
10566 do_spec_2 ("%{fdump-final-insns=*:%*}", NULL
);
10567 do_spec_1 (" ", 0, NULL
);
10569 if (argbuf
.length () > 0
10570 && strcmp (argv
[argbuf
.length () - 1], ".") != 0)
10572 if (!compare_debug
)
10575 name
= xstrdup (argv
[argbuf
.length () - 1]);
10580 if (argbuf
.length () > 0)
10581 do_spec_2 ("%B.gkd", NULL
);
10582 else if (!compare_debug
)
10585 do_spec_2 ("%{!save-temps*:%g.gkd}%{save-temps*:%B.gkd}", NULL
);
10587 do_spec_1 (" ", 0, NULL
);
10589 gcc_assert (argbuf
.length () > 0);
10591 name
= xstrdup (argbuf
.last ());
10593 char *arg
= quote_spec (xstrdup (name
));
10594 ret
= concat ("-fdump-final-insns=", arg
, NULL
);
10598 which
= compare_debug
< 0;
10599 debug_check_temp_file
[which
] = name
;
10603 unsigned HOST_WIDE_INT value
= get_random_number ();
10605 sprintf (random_seed
, HOST_WIDE_INT_PRINT_HEX
, value
);
10611 ret
= concat ("%{!frandom-seed=*:-frandom-seed=", random_seed
, "} ",
10622 /* %:compare-debug-self-opt spec function. Expands to the options
10623 that are to be passed in the second compilation of
10626 static const char *
10627 compare_debug_self_opt_spec_function (int arg
,
10628 const char **argv ATTRIBUTE_UNUSED
)
10631 fatal_error (input_location
,
10632 "too many arguments to %%:compare-debug-self-opt");
10634 if (compare_debug
>= 0)
10638 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
10639 %<fdump-final-insns=* -w -S -o %j \
10640 %{!fcompare-debug-second:-fcompare-debug-second} \
10641 ", compare_debug_opt
, NULL
);
10644 /* %:pass-through-libs spec function. Finds all -l options and input
10645 file names in the lib spec passed to it, and makes a list of them
10646 prepended with the plugin option to cause them to be passed through
10647 to the final link after all the new object files have been added. */
10650 pass_through_libs_spec_func (int argc
, const char **argv
)
10652 char *prepended
= xstrdup (" ");
10654 /* Shlemiel the painter's algorithm. Innately horrible, but at least
10655 we know that there will never be more than a handful of strings to
10656 concat, and it's only once per run, so it's not worth optimising. */
10657 for (n
= 0; n
< argc
; n
++)
10659 char *old
= prepended
;
10660 /* Anything that isn't an option is a full path to an output
10661 file; pass it through if it ends in '.a'. Among options,
10663 if (argv
[n
][0] == '-' && argv
[n
][1] == 'l')
10665 const char *lopt
= argv
[n
] + 2;
10666 /* Handle both joined and non-joined -l options. If for any
10667 reason there's a trailing -l with no joined or following
10668 arg just discard it. */
10669 if (!*lopt
&& ++n
>= argc
)
10673 prepended
= concat (prepended
, "-plugin-opt=-pass-through=-l",
10676 else if (!strcmp (".a", argv
[n
] + strlen (argv
[n
]) - 2))
10678 prepended
= concat (prepended
, "-plugin-opt=-pass-through=",
10679 argv
[n
], " ", NULL
);
10681 if (prepended
!= old
)
10688 not_actual_file_p (const char *name
)
10690 return (strcmp (name
, "-") == 0
10691 || strcmp (name
, HOST_BIT_BUCKET
) == 0);
10694 /* %:dumps spec function. Take an optional argument that overrides
10695 the default extension for -dumpbase and -dumpbase-ext.
10696 Return -dumpdir, -dumpbase and -dumpbase-ext, if needed. */
10698 dumps_spec_func (int argc
, const char **argv ATTRIBUTE_UNUSED
)
10700 const char *ext
= dumpbase_ext
;
10703 char *args
[3] = { NULL
, NULL
, NULL
};
10706 /* Do not compute a default for -dumpbase-ext when -dumpbase was
10707 given explicitly. */
10708 if (dumpbase
&& *dumpbase
&& !ext
)
10713 /* Do not override the explicitly-specified -dumpbase-ext with
10714 the specs-provided overrider. */
10718 else if (argc
!= 0)
10719 fatal_error (input_location
, "too many arguments for %%:dumps");
10723 p
= quote_spec_arg (xstrdup (dumpdir
));
10724 args
[nargs
++] = concat (" -dumpdir ", p
, NULL
);
10729 ext
= input_basename
+ basename_length
;
10731 /* Use the precomputed outbase, or compute dumpbase from
10732 input_basename, just like %b would. */
10735 if (dumpbase
&& *dumpbase
)
10737 base
= xstrdup (dumpbase
);
10738 p
= base
+ outbase_length
;
10739 gcc_checking_assert (strncmp (base
, outbase
, outbase_length
) == 0);
10740 gcc_checking_assert (strcmp (p
, ext
) == 0);
10742 else if (outbase_length
)
10744 base
= xstrndup (outbase
, outbase_length
);
10749 base
= xstrndup (input_basename
, suffixed_basename_length
);
10750 p
= base
+ basename_length
;
10753 if (compare_debug
< 0 || !p
|| strcmp (p
, ext
) != 0)
10759 if (compare_debug
< 0)
10764 p
= concat (base
, gk
, ext
, NULL
);
10770 base
= quote_spec_arg (base
);
10771 args
[nargs
++] = concat (" -dumpbase ", base
, NULL
);
10776 p
= quote_spec_arg (xstrdup (ext
));
10777 args
[nargs
++] = concat (" -dumpbase-ext ", p
, NULL
);
10781 const char *ret
= concat (args
[0], args
[1], args
[2], NULL
);
10783 free (args
[--nargs
]);
10788 /* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
10789 Otherwise, return NULL. */
10791 static const char *
10792 greater_than_spec_func (int argc
, const char **argv
)
10799 gcc_assert (argc
>= 2);
10801 long arg
= strtol (argv
[argc
- 2], &converted
, 10);
10802 gcc_assert (converted
!= argv
[argc
- 2]);
10804 long lim
= strtol (argv
[argc
- 1], &converted
, 10);
10805 gcc_assert (converted
!= argv
[argc
- 1]);
10813 /* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
10814 Otherwise, return NULL. */
10816 static const char *
10817 debug_level_greater_than_spec_func (int argc
, const char **argv
)
10822 fatal_error (input_location
,
10823 "wrong number of arguments to %%:debug-level-gt");
10825 long arg
= strtol (argv
[0], &converted
, 10);
10826 gcc_assert (converted
!= argv
[0]);
10828 if (debug_info_level
> arg
)
10834 /* Returns "" if dwarf_version is greater than ARGV[ARGC-1].
10835 Otherwise, return NULL. */
10837 static const char *
10838 dwarf_version_greater_than_spec_func (int argc
, const char **argv
)
10843 fatal_error (input_location
,
10844 "wrong number of arguments to %%:dwarf-version-gt");
10846 long arg
= strtol (argv
[0], &converted
, 10);
10847 gcc_assert (converted
!= argv
[0]);
10849 if (dwarf_version
> arg
)
10856 path_prefix_reset (path_prefix
*prefix
)
10858 struct prefix_list
*iter
, *next
;
10859 iter
= prefix
->plist
;
10863 free (const_cast <char *> (iter
->prefix
));
10868 prefix
->max_len
= 0;
10871 /* The function takes 3 arguments: OPTION name, file name and location
10872 where we search for Fortran modules.
10873 When the FILE is found by find_file, return OPTION=path_to_file. */
10875 static const char *
10876 find_fortran_preinclude_file (int argc
, const char **argv
)
10878 char *result
= NULL
;
10882 struct path_prefix prefixes
= { 0, 0, "preinclude" };
10884 /* Search first for 'finclude' folder location for a header file
10885 installed by the compiler (similar to omp_lib.h). */
10886 add_prefix (&prefixes
, argv
[2], NULL
, 0, 0, 0);
10887 #ifdef TOOL_INCLUDE_DIR
10888 /* Then search: <prefix>/<target>/<include>/finclude */
10889 add_prefix (&prefixes
, TOOL_INCLUDE_DIR
"/finclude/",
10892 #ifdef NATIVE_SYSTEM_HEADER_DIR
10893 /* Then search: <sysroot>/usr/include/finclude/<multilib> */
10894 add_sysrooted_hdrs_prefix (&prefixes
, NATIVE_SYSTEM_HEADER_DIR
"/finclude/",
10898 const char *path
= find_a_file (&include_prefixes
, argv
[1], R_OK
, false);
10900 result
= concat (argv
[0], path
, NULL
);
10903 path
= find_a_file (&prefixes
, argv
[1], R_OK
, false);
10905 result
= concat (argv
[0], path
, NULL
);
10908 path_prefix_reset (&prefixes
);
10912 /* If any character in ORIG fits QUOTE_P (_, P), reallocate the string
10913 so as to precede every one of them with a backslash. Return the
10914 original string or the reallocated one. */
10916 static inline char *
10917 quote_string (char *orig
, bool (*quote_p
)(char, void *), void *p
)
10919 int len
, number_of_space
= 0;
10921 for (len
= 0; orig
[len
]; len
++)
10922 if (quote_p (orig
[len
], p
))
10925 if (number_of_space
)
10927 char *new_spec
= (char *) xmalloc (len
+ number_of_space
+ 1);
10929 for (j
= 0, k
= 0; j
<= len
; j
++, k
++)
10931 if (quote_p (orig
[j
], p
))
10932 new_spec
[k
++] = '\\';
10933 new_spec
[k
] = orig
[j
];
10942 /* Return true iff C is any of the characters convert_white_space
10946 whitespace_to_convert_p (char c
, void *)
10948 return (c
== ' ' || c
== '\t');
10951 /* Insert backslash before spaces in ORIG (usually a file path), to
10952 avoid being broken by spec parser.
10954 This function is needed as do_spec_1 treats white space (' ' and '\t')
10955 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
10956 the file name should be treated as a single argument rather than being
10957 broken into multiple. Solution is to insert '\\' before the space in a
10960 This function converts and only converts all occurrence of ' '
10961 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
10963 "a b" -> "a\\ \\ b"
10965 "a\\ b" -> "a\\\\ b"
10967 orig: input null-terminating string that was allocated by xalloc. The
10968 memory it points to might be freed in this function. Behavior undefined
10969 if ORIG wasn't xalloced or was freed already at entry.
10971 Return: ORIG if no conversion needed. Otherwise a newly allocated string
10972 that was converted from ORIG. */
10975 convert_white_space (char *orig
)
10977 return quote_string (orig
, whitespace_to_convert_p
, NULL
);
10980 /* Return true iff C matches any of the spec active characters. */
10982 quote_spec_char_p (char c
, void *)
10999 /* Like convert_white_space, but deactivate all active spec chars by
11002 static inline char *
11003 quote_spec (char *orig
)
11005 return quote_string (orig
, quote_spec_char_p
, NULL
);
11008 /* Like quote_spec, but also turn an empty string into the spec for an
11011 static inline char *
11012 quote_spec_arg (char *orig
)
11017 return xstrdup ("%\"");
11020 return quote_spec (orig
);
11023 /* Restore all state within gcc.cc to the initial state, so that the driver
11024 code can be safely re-run in-process.
11026 Many const char * variables are referenced by static specs (see
11027 INIT_STATIC_SPEC above). These variables are restored to their default
11028 values by a simple loop over the static specs.
11030 For other variables, we directly restore them all to their initial
11031 values (often implicitly 0).
11033 Free the various obstacks in this file, along with "opts_obstack"
11036 This function also restores any environment variables that were changed. */
11039 driver::finalize ()
11042 diagnostic_finish (global_dc
);
11045 at_file_supplied
= 0;
11046 print_help_list
= 0;
11048 verbose_only_flag
= 0;
11049 print_subprocess_help
= 0;
11051 report_times_to_file
= NULL
;
11052 target_system_root
= DEFAULT_TARGET_SYSTEM_ROOT
;
11053 target_system_root_changed
= 0;
11054 target_sysroot_suffix
= 0;
11055 target_sysroot_hdrs_suffix
= 0;
11056 save_temps_flag
= SAVE_TEMPS_NONE
;
11057 save_temps_overrides_dumpdir
= false;
11058 dumpdir_trailing_dash_added
= false;
11061 free (dumpbase_ext
);
11063 dumpdir
= dumpbase
= dumpbase_ext
= outbase
= NULL
;
11064 dumpdir_length
= outbase_length
= 0;
11065 spec_machine
= DEFAULT_TARGET_MACHINE
;
11066 greatest_status
= 1;
11068 obstack_free (&obstack
, NULL
);
11069 obstack_free (&opts_obstack
, NULL
); /* in opts.cc */
11070 obstack_free (&collect_obstack
, NULL
);
11072 link_command_spec
= LINK_COMMAND_SPEC
;
11074 obstack_free (&multilib_obstack
, NULL
);
11076 user_specs_head
= NULL
;
11077 user_specs_tail
= NULL
;
11079 /* Within the "compilers" vec, the fields "suffix" and "spec" were
11080 statically allocated for the default compilers, but dynamically
11081 allocated for additional compilers. Delete them for the latter. */
11082 for (int i
= n_default_compilers
; i
< n_compilers
; i
++)
11084 free (const_cast <char *> (compilers
[i
].suffix
));
11085 free (const_cast <char *> (compilers
[i
].spec
));
11087 XDELETEVEC (compilers
);
11091 linker_options
.truncate (0);
11092 assembler_options
.truncate (0);
11093 preprocessor_options
.truncate (0);
11095 path_prefix_reset (&exec_prefixes
);
11096 path_prefix_reset (&startfile_prefixes
);
11097 path_prefix_reset (&include_prefixes
);
11099 machine_suffix
= 0;
11100 just_machine_suffix
= 0;
11101 gcc_exec_prefix
= 0;
11102 gcc_libexec_prefix
= 0;
11103 set_static_spec_shared (&md_exec_prefix
, MD_EXEC_PREFIX
);
11104 set_static_spec_shared (&md_startfile_prefix
, MD_STARTFILE_PREFIX
);
11105 set_static_spec_shared (&md_startfile_prefix_1
, MD_STARTFILE_PREFIX_1
);
11107 multilib_os_dir
= 0;
11110 /* Free any specs dynamically-allocated by set_spec.
11111 These will be at the head of the list, before the
11112 statically-allocated ones. */
11115 while (specs
!= static_specs
)
11117 spec_list
*next
= specs
->next
;
11118 free (const_cast <char *> (specs
->name
));
11124 for (unsigned i
= 0; i
< ARRAY_SIZE (static_specs
); i
++)
11126 spec_list
*sl
= &static_specs
[i
];
11129 free (const_cast <char *> (*(sl
->ptr_spec
)));
11130 sl
->alloc_p
= false;
11132 *(sl
->ptr_spec
) = sl
->default_ptr
;
11135 extra_specs
= NULL
;
11138 processing_spec_function
= 0;
11146 execution_count
= 0;
11149 temp_filename
= NULL
;
11150 temp_filename_length
= 0;
11151 always_delete_queue
= NULL
;
11152 failure_delete_queue
= NULL
;
11154 XDELETEVEC (switches
);
11157 n_switches_alloc
= 0;
11160 compare_debug_second
= 0;
11161 compare_debug_opt
= NULL
;
11162 for (int i
= 0; i
< 2; i
++)
11164 switches_debug_check
[i
] = NULL
;
11165 n_switches_debug_check
[i
] = 0;
11166 n_switches_alloc_debug_check
[i
] = 0;
11167 debug_check_temp_file
[i
] = NULL
;
11170 XDELETEVEC (infiles
);
11173 n_infiles_alloc
= 0;
11175 combine_inputs
= false;
11176 added_libraries
= 0;
11177 XDELETEVEC (outfiles
);
11180 last_language_n_infiles
= 0;
11181 gcc_input_filename
= NULL
;
11182 input_file_number
= 0;
11183 input_filename_length
= 0;
11184 basename_length
= 0;
11185 suffixed_basename_length
= 0;
11186 input_basename
= NULL
;
11187 input_suffix
= NULL
;
11188 /* We don't need to purge "input_stat", just to unset "input_stat_set". */
11189 input_stat_set
= 0;
11190 input_file_compiler
= NULL
;
11192 delete_this_arg
= 0;
11193 this_is_output_file
= 0;
11194 this_is_library_file
= 0;
11195 this_is_linker_script
= 0;
11196 input_from_pipe
= 0;
11197 suffix_subst
= NULL
;
11202 used_arg
.finalize ();
11206 Targets can provide configure-time default options in
11207 OPTION_DEFAULT_SPECS. The jit needs to access these, but
11208 they are expressed in the spec language.
11210 Run just enough of the driver to be able to expand these
11211 specs, and then call the callback CB on each
11212 such option. The options strings are *without* a leading
11213 '-' character e.g. ("march=x86-64"). Finally, clean up. */
11216 driver_get_configure_time_options (void (*cb
) (const char *option
,
11222 obstack_init (&obstack
);
11223 init_opts_obstack ();
11226 for (i
= 0; i
< ARRAY_SIZE (option_default_specs
); i
++)
11227 do_option_spec (option_default_specs
[i
].name
,
11228 option_default_specs
[i
].spec
);
11230 for (i
= 0; (int) i
< n_switches
; i
++)
11232 gcc_assert (switches
[i
].part1
);
11233 (*cb
) (switches
[i
].part1
, user_data
);
11236 obstack_free (&opts_obstack
, NULL
);
11237 obstack_free (&obstack
, NULL
);