MATCH: Improve `A CMP 0 ? A : -A` set of patterns to use bitwise_equal_p.
[official-gcc.git] / gcc / gcc.cc
blobc6e600fa0d34712682f6457721c6d212caafcf26
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This program is the user interface to the C compiler and possibly to
21 other compilers. It is used because compilation is a complicated procedure
22 which involves running several programs and passing temporary files between
23 them, forwarding the users switches to those programs selectively,
24 and deleting the temporary files at the end.
26 CC recognizes how to compile each input file by suffixes in the file names.
27 Once it knows which kind of compilation to perform, the procedure for
28 compilation is specified by a string called a "spec". */
30 #define INCLUDE_STRING
31 #include "config.h"
32 #include "system.h"
33 #include "coretypes.h"
34 #include "multilib.h" /* before tm.h */
35 #include "tm.h"
36 #include "xregex.h"
37 #include "obstack.h"
38 #include "intl.h"
39 #include "prefix.h"
40 #include "opt-suggestions.h"
41 #include "gcc.h"
42 #include "diagnostic.h"
43 #include "flags.h"
44 #include "opts.h"
45 #include "filenames.h"
46 #include "spellcheck.h"
47 #include "opts-jobserver.h"
48 #include "common/common-target.h"
49 #include "diagnostic-text-art.h"
51 #ifndef MATH_LIBRARY
52 #define MATH_LIBRARY "m"
53 #endif
56 /* Manage the manipulation of env vars.
58 We poison "getenv" and "putenv", so that all enviroment-handling is
59 done through this class. Note that poisoning happens in the
60 preprocessor at the identifier level, and doesn't distinguish between
61 env.getenv ();
62 and
63 getenv ();
64 Hence we need to use "get" for the accessor method, not "getenv". */
66 struct env_manager
68 public:
69 void init (bool can_restore, bool debug);
70 const char *get (const char *name);
71 void xput (const char *string);
72 void restore ();
74 private:
75 bool m_can_restore;
76 bool m_debug;
77 struct kv
79 char *m_key;
80 char *m_value;
82 vec<kv> m_keys;
86 /* The singleton instance of class env_manager. */
88 static env_manager env;
90 /* Initializer for class env_manager.
92 We can't do this as a constructor since we have a statically
93 allocated instance ("env" above). */
95 void
96 env_manager::init (bool can_restore, bool debug)
98 m_can_restore = can_restore;
99 m_debug = debug;
102 /* Get the value of NAME within the environment. Essentially
103 a wrapper for ::getenv, but adding logging, and the possibility
104 of caching results. */
106 const char *
107 env_manager::get (const char *name)
109 const char *result = ::getenv (name);
110 if (m_debug)
111 fprintf (stderr, "env_manager::getenv (%s) -> %s\n", name, result);
112 return result;
115 /* Put the given KEY=VALUE entry STRING into the environment.
116 If the env_manager was initialized with CAN_RESTORE set, then
117 also record the old value of KEY within the environment, so that it
118 can be later restored. */
120 void
121 env_manager::xput (const char *string)
123 if (m_debug)
124 fprintf (stderr, "env_manager::xput (%s)\n", string);
125 if (verbose_flag)
126 fnotice (stderr, "%s\n", string);
128 if (m_can_restore)
130 char *equals = strchr (const_cast <char *> (string), '=');
131 gcc_assert (equals);
133 struct kv kv;
134 kv.m_key = xstrndup (string, equals - string);
135 const char *cur_value = ::getenv (kv.m_key);
136 if (m_debug)
137 fprintf (stderr, "saving old value: %s\n",cur_value);
138 kv.m_value = cur_value ? xstrdup (cur_value) : NULL;
139 m_keys.safe_push (kv);
142 ::putenv (CONST_CAST (char *, string));
145 /* Undo any xputenv changes made since last restore.
146 Can only be called if the env_manager was initialized with
147 CAN_RESTORE enabled. */
149 void
150 env_manager::restore ()
152 unsigned int i;
153 struct kv *item;
155 gcc_assert (m_can_restore);
157 FOR_EACH_VEC_ELT_REVERSE (m_keys, i, item)
159 if (m_debug)
160 printf ("restoring saved key: %s value: %s\n", item->m_key, item->m_value);
161 if (item->m_value)
162 ::setenv (item->m_key, item->m_value, 1);
163 else
164 ::unsetenv (item->m_key);
165 free (item->m_key);
166 free (item->m_value);
169 m_keys.truncate (0);
172 /* Forbid other uses of getenv and putenv. */
173 #if (GCC_VERSION >= 3000)
174 #pragma GCC poison getenv putenv
175 #endif
179 /* By default there is no special suffix for target executables. */
180 #ifdef TARGET_EXECUTABLE_SUFFIX
181 #define HAVE_TARGET_EXECUTABLE_SUFFIX
182 #else
183 #define TARGET_EXECUTABLE_SUFFIX ""
184 #endif
186 /* By default there is no special suffix for host executables. */
187 #ifdef HOST_EXECUTABLE_SUFFIX
188 #define HAVE_HOST_EXECUTABLE_SUFFIX
189 #else
190 #define HOST_EXECUTABLE_SUFFIX ""
191 #endif
193 /* By default, the suffix for target object files is ".o". */
194 #ifdef TARGET_OBJECT_SUFFIX
195 #define HAVE_TARGET_OBJECT_SUFFIX
196 #else
197 #define TARGET_OBJECT_SUFFIX ".o"
198 #endif
200 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
202 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
203 #ifndef LIBRARY_PATH_ENV
204 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
205 #endif
207 /* If a stage of compilation returns an exit status >= 1,
208 compilation of that file ceases. */
210 #define MIN_FATAL_STATUS 1
212 /* Flag set by cppspec.cc to 1. */
213 int is_cpp_driver;
215 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
216 static bool at_file_supplied;
218 /* Definition of string containing the arguments given to configure. */
219 #include "configargs.h"
221 /* Flag saying to print the command line options understood by gcc and its
222 sub-processes. */
224 static int print_help_list;
226 /* Flag saying to print the version of gcc and its sub-processes. */
228 static int print_version;
230 /* Flag that stores string prefix for which we provide bash completion. */
232 static const char *completion = NULL;
234 /* Flag indicating whether we should ONLY print the command and
235 arguments (like verbose_flag) without executing the command.
236 Displayed arguments are quoted so that the generated command
237 line is suitable for execution. This is intended for use in
238 shell scripts to capture the driver-generated command line. */
239 static int verbose_only_flag;
241 /* Flag indicating how to print command line options of sub-processes. */
243 static int print_subprocess_help;
245 /* Linker suffix passed to -fuse-ld=... */
246 static const char *use_ld;
248 /* Whether we should report subprocess execution times to a file. */
250 FILE *report_times_to_file = NULL;
252 /* Nonzero means place this string before uses of /, so that include
253 and library files can be found in an alternate location. */
255 #ifdef TARGET_SYSTEM_ROOT
256 #define DEFAULT_TARGET_SYSTEM_ROOT (TARGET_SYSTEM_ROOT)
257 #else
258 #define DEFAULT_TARGET_SYSTEM_ROOT (0)
259 #endif
260 static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
262 /* Nonzero means pass the updated target_system_root to the compiler. */
264 static int target_system_root_changed;
266 /* Nonzero means append this string to target_system_root. */
268 static const char *target_sysroot_suffix = 0;
270 /* Nonzero means append this string to target_system_root for headers. */
272 static const char *target_sysroot_hdrs_suffix = 0;
274 /* Nonzero means write "temp" files in source directory
275 and use the source file's name in them, and don't delete them. */
277 static enum save_temps {
278 SAVE_TEMPS_NONE, /* no -save-temps */
279 SAVE_TEMPS_CWD, /* -save-temps in current directory */
280 SAVE_TEMPS_DUMP, /* -save-temps in dumpdir */
281 SAVE_TEMPS_OBJ /* -save-temps in object directory */
282 } save_temps_flag;
284 /* Set this iff the dumppfx implied by a -save-temps=* option is to
285 override a -dumpdir option, if any. */
286 static bool save_temps_overrides_dumpdir = false;
288 /* -dumpdir, -dumpbase and -dumpbase-ext flags passed in, possibly
289 rearranged as they are to be passed down, e.g., dumpbase and
290 dumpbase_ext may be cleared if integrated with dumpdir or
291 dropped. */
292 static char *dumpdir, *dumpbase, *dumpbase_ext;
294 /* Usually the length of the string in dumpdir. However, during
295 linking, it may be shortened to omit a driver-added trailing dash,
296 by then replaced with a trailing period, that is still to be passed
297 to sub-processes in -dumpdir, but not to be generally used in spec
298 filename expansions. See maybe_run_linker. */
299 static size_t dumpdir_length = 0;
301 /* Set if the last character in dumpdir is (or was) a dash that the
302 driver added to dumpdir after dumpbase or linker output name. */
303 static bool dumpdir_trailing_dash_added = false;
305 /* Basename of dump and aux outputs, computed from dumpbase (given or
306 derived from output name), to override input_basename in non-%w %b
307 et al. */
308 static char *outbase;
309 static size_t outbase_length = 0;
311 /* The compiler version. */
313 static const char *compiler_version;
315 /* The target version. */
317 static const char *const spec_version = DEFAULT_TARGET_VERSION;
319 /* The target machine. */
321 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
322 static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
324 /* List of offload targets. Separated by colon. Empty string for
325 -foffload=disable. */
327 static char *offload_targets = NULL;
329 #if OFFLOAD_DEFAULTED
330 /* Set to true if -foffload has not been used and offload_targets
331 is set to the configured in default. */
332 static bool offload_targets_default;
333 #endif
335 /* Nonzero if cross-compiling.
336 When -b is used, the value comes from the `specs' file. */
338 #ifdef CROSS_DIRECTORY_STRUCTURE
339 static const char *cross_compile = "1";
340 #else
341 static const char *cross_compile = "0";
342 #endif
344 /* Greatest exit code of sub-processes that has been encountered up to
345 now. */
346 static int greatest_status = 1;
348 /* This is the obstack which we use to allocate many strings. */
350 static struct obstack obstack;
352 /* This is the obstack to build an environment variable to pass to
353 collect2 that describes all of the relevant switches of what to
354 pass the compiler in building the list of pointers to constructors
355 and destructors. */
357 static struct obstack collect_obstack;
359 /* Forward declaration for prototypes. */
360 struct path_prefix;
361 struct prefix_list;
363 static void init_spec (void);
364 static void store_arg (const char *, int, int);
365 static void insert_wrapper (const char *);
366 static char *load_specs (const char *);
367 static void read_specs (const char *, bool, bool);
368 static void set_spec (const char *, const char *, bool);
369 static struct compiler *lookup_compiler (const char *, size_t, const char *);
370 static char *build_search_list (const struct path_prefix *, const char *,
371 bool, bool);
372 static void xputenv (const char *);
373 static void putenv_from_prefixes (const struct path_prefix *, const char *,
374 bool);
375 static int access_check (const char *, int);
376 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
377 static char *find_a_program (const char *);
378 static void add_prefix (struct path_prefix *, const char *, const char *,
379 int, int, int);
380 static void add_sysrooted_prefix (struct path_prefix *, const char *,
381 const char *, int, int, int);
382 static char *skip_whitespace (char *);
383 static void delete_if_ordinary (const char *);
384 static void delete_temp_files (void);
385 static void delete_failure_queue (void);
386 static void clear_failure_queue (void);
387 static int check_live_switch (int, int);
388 static const char *handle_braces (const char *);
389 static inline bool input_suffix_matches (const char *, const char *);
390 static inline bool switch_matches (const char *, const char *, int);
391 static inline void mark_matching_switches (const char *, const char *, int);
392 static inline void process_marked_switches (void);
393 static const char *process_brace_body (const char *, const char *, const char *, int, int);
394 static const struct spec_function *lookup_spec_function (const char *);
395 static const char *eval_spec_function (const char *, const char *, const char *);
396 static const char *handle_spec_function (const char *, bool *, const char *);
397 static char *save_string (const char *, int);
398 static void set_collect_gcc_options (void);
399 static int do_spec_1 (const char *, int, const char *);
400 static int do_spec_2 (const char *, const char *);
401 static void do_option_spec (const char *, const char *);
402 static void do_self_spec (const char *);
403 static const char *find_file (const char *);
404 static int is_directory (const char *, bool);
405 static const char *validate_switches (const char *, bool, bool);
406 static void validate_all_switches (void);
407 static inline void validate_switches_from_spec (const char *, bool);
408 static void give_switch (int, int);
409 static int default_arg (const char *, int);
410 static void set_multilib_dir (void);
411 static void print_multilib_info (void);
412 static void display_help (void);
413 static void add_preprocessor_option (const char *, int);
414 static void add_assembler_option (const char *, int);
415 static void add_linker_option (const char *, int);
416 static void process_command (unsigned int, struct cl_decoded_option *);
417 static int execute (void);
418 static void alloc_args (void);
419 static void clear_args (void);
420 static void fatal_signal (int);
421 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
422 static void init_gcc_specs (struct obstack *, const char *, const char *,
423 const char *);
424 #endif
425 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
426 static const char *convert_filename (const char *, int, int);
427 #endif
429 static void try_generate_repro (const char **argv);
430 static const char *getenv_spec_function (int, const char **);
431 static const char *if_exists_spec_function (int, const char **);
432 static const char *if_exists_else_spec_function (int, const char **);
433 static const char *if_exists_then_else_spec_function (int, const char **);
434 static const char *sanitize_spec_function (int, const char **);
435 static const char *replace_outfile_spec_function (int, const char **);
436 static const char *remove_outfile_spec_function (int, const char **);
437 static const char *version_compare_spec_function (int, const char **);
438 static const char *include_spec_function (int, const char **);
439 static const char *find_file_spec_function (int, const char **);
440 static const char *find_plugindir_spec_function (int, const char **);
441 static const char *print_asm_header_spec_function (int, const char **);
442 static const char *compare_debug_dump_opt_spec_function (int, const char **);
443 static const char *compare_debug_self_opt_spec_function (int, const char **);
444 static const char *pass_through_libs_spec_func (int, const char **);
445 static const char *dumps_spec_func (int, const char **);
446 static const char *greater_than_spec_func (int, const char **);
447 static const char *debug_level_greater_than_spec_func (int, const char **);
448 static const char *dwarf_version_greater_than_spec_func (int, const char **);
449 static const char *find_fortran_preinclude_file (int, const char **);
450 static const char *join_spec_func (int, const char **);
451 static char *convert_white_space (char *);
452 static char *quote_spec (char *);
453 static char *quote_spec_arg (char *);
454 static bool not_actual_file_p (const char *);
457 /* The Specs Language
459 Specs are strings containing lines, each of which (if not blank)
460 is made up of a program name, and arguments separated by spaces.
461 The program name must be exact and start from root, since no path
462 is searched and it is unreliable to depend on the current working directory.
463 Redirection of input or output is not supported; the subprograms must
464 accept filenames saying what files to read and write.
466 In addition, the specs can contain %-sequences to substitute variable text
467 or for conditional text. Here is a table of all defined %-sequences.
468 Note that spaces are not generated automatically around the results of
469 expanding these sequences; therefore, you can concatenate them together
470 or with constant text in a single argument.
472 %% substitute one % into the program name or argument.
473 %" substitute an empty argument.
474 %i substitute the name of the input file being processed.
475 %b substitute the basename for outputs related with the input file
476 being processed. This is often a substring of the input file name,
477 up to (and not including) the last period but, unless %w is active,
478 it is affected by the directory selected by -save-temps=*, by
479 -dumpdir, and, in case of multiple compilations, even by -dumpbase
480 and -dumpbase-ext and, in case of linking, by the linker output
481 name. When %w is active, it derives the main output name only from
482 the input file base name; when it is not, it names aux/dump output
483 file.
484 %B same as %b, but include the input file suffix (text after the last
485 period).
486 %gSUFFIX
487 substitute a file name that has suffix SUFFIX and is chosen
488 once per compilation, and mark the argument a la %d. To reduce
489 exposure to denial-of-service attacks, the file name is now
490 chosen in a way that is hard to predict even when previously
491 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
492 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
493 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
494 had been pre-processed. Previously, %g was simply substituted
495 with a file name chosen once per compilation, without regard
496 to any appended suffix (which was therefore treated just like
497 ordinary text), making such attacks more likely to succeed.
498 %|SUFFIX
499 like %g, but if -pipe is in effect, expands simply to "-".
500 %mSUFFIX
501 like %g, but if -pipe is in effect, expands to nothing. (We have both
502 %| and %m to accommodate differences between system assemblers; see
503 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
504 %uSUFFIX
505 like %g, but generates a new temporary file name even if %uSUFFIX
506 was already seen.
507 %USUFFIX
508 substitutes the last file name generated with %uSUFFIX, generating a
509 new one if there is no such last file name. In the absence of any
510 %uSUFFIX, this is just like %gSUFFIX, except they don't share
511 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
512 would involve the generation of two distinct file names, one
513 for each `%g.s' and another for each `%U.s'. Previously, %U was
514 simply substituted with a file name chosen for the previous %u,
515 without regard to any appended suffix.
516 %jSUFFIX
517 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
518 writable, and if save-temps is off; otherwise, substitute the name
519 of a temporary file, just like %u. This temporary file is not
520 meant for communication between processes, but rather as a junk
521 disposal mechanism.
522 %.SUFFIX
523 substitutes .SUFFIX for the suffixes of a matched switch's args when
524 it is subsequently output with %*. SUFFIX is terminated by the next
525 space or %.
526 %d marks the argument containing or following the %d as a
527 temporary file name, so that file will be deleted if GCC exits
528 successfully. Unlike %g, this contributes no text to the argument.
529 %w marks the argument containing or following the %w as the
530 "output file" of this compilation. This puts the argument
531 into the sequence of arguments that %o will substitute later.
532 %V indicates that this compilation produces no "output file".
533 %W{...}
534 like %{...} but marks the last argument supplied within as a file
535 to be deleted on failure.
536 %@{...}
537 like %{...} but puts the result into a FILE and substitutes @FILE
538 if an @file argument has been supplied.
539 %o substitutes the names of all the output files, with spaces
540 automatically placed around them. You should write spaces
541 around the %o as well or the results are undefined.
542 %o is for use in the specs for running the linker.
543 Input files whose names have no recognized suffix are not compiled
544 at all, but they are included among the output files, so they will
545 be linked.
546 %O substitutes the suffix for object files. Note that this is
547 handled specially when it immediately follows %g, %u, or %U
548 (with or without a suffix argument) because of the need for
549 those to form complete file names. The handling is such that
550 %O is treated exactly as if it had already been substituted,
551 except that %g, %u, and %U do not currently support additional
552 SUFFIX characters following %O as they would following, for
553 example, `.o'.
554 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
555 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
556 and -B options) and -imultilib as necessary.
557 %s current argument is the name of a library or startup file of some sort.
558 Search for that file in a standard list of directories
559 and substitute the full name found.
560 %T current argument is the name of a linker script.
561 Search for that file in the current list of directories to scan for
562 libraries. If the file is located, insert a --script option into the
563 command line followed by the full path name found. If the file is
564 not found then generate an error message.
565 Note: the current working directory is not searched.
566 %eSTR Print STR as an error message. STR is terminated by a newline.
567 Use this when inconsistent options are detected.
568 %nSTR Print STR as a notice. STR is terminated by a newline.
569 %x{OPTION} Accumulate an option for %X.
570 %X Output the accumulated linker options specified by compilations.
571 %Y Output the accumulated assembler options specified by compilations.
572 %Z Output the accumulated preprocessor options specified by compilations.
573 %a process ASM_SPEC as a spec.
574 This allows config.h to specify part of the spec for running as.
575 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
576 used here. This can be used to run a post-processor after the
577 assembler has done its job.
578 %D Dump out a -L option for each directory in startfile_prefixes.
579 If multilib_dir is set, extra entries are generated with it affixed.
580 %l process LINK_SPEC as a spec.
581 %L process LIB_SPEC as a spec.
582 %M Output multilib_os_dir.
583 %G process LIBGCC_SPEC as a spec.
584 %R Output the concatenation of target_system_root and
585 target_sysroot_suffix.
586 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
587 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
588 %C process CPP_SPEC as a spec.
589 %1 process CC1_SPEC as a spec.
590 %2 process CC1PLUS_SPEC as a spec.
591 %* substitute the variable part of a matched option. (See below.)
592 Note that each comma in the substituted string is replaced by
593 a single space. A space is appended after the last substition
594 unless there is more text in current sequence.
595 %<S remove all occurrences of -S from the command line.
596 Note - this command is position dependent. % commands in the
597 spec string before this one will see -S, % commands in the
598 spec string after this one will not.
599 %>S Similar to "%<S", but keep it in the GCC command line.
600 %<S* remove all occurrences of all switches beginning with -S from the
601 command line.
602 %:function(args)
603 Call the named function FUNCTION, passing it ARGS. ARGS is
604 first processed as a nested spec string, then split into an
605 argument vector in the usual fashion. The function returns
606 a string which is processed as if it had appeared literally
607 as part of the current spec.
608 %{S} substitutes the -S switch, if that switch was given to GCC.
609 If that switch was not specified, this substitutes nothing.
610 Here S is a metasyntactic variable.
611 %{S*} substitutes all the switches specified to GCC whose names start
612 with -S. This is used for -o, -I, etc; switches that take
613 arguments. GCC considers `-o foo' as being one switch whose
614 name starts with `o'. %{o*} would substitute this text,
615 including the space; thus, two arguments would be generated.
616 %{S*&T*} likewise, but preserve order of S and T options (the order
617 of S and T in the spec is not significant). Can be any number
618 of ampersand-separated variables; for each the wild card is
619 optional. Useful for CPP as %{D*&U*&A*}.
621 %{S:X} substitutes X, if the -S switch was given to GCC.
622 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
623 %{S*:X} substitutes X if one or more switches whose names start
624 with -S was given to GCC. Normally X is substituted only
625 once, no matter how many such switches appeared. However,
626 if %* appears somewhere in X, then X will be substituted
627 once for each matching switch, with the %* replaced by the
628 part of that switch that matched the '*'. A space will be
629 appended after the last substition unless there is more
630 text in current sequence.
631 %{.S:X} substitutes X, if processing a file with suffix S.
632 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
633 %{,S:X} substitutes X, if processing a file which will use spec S.
634 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
636 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
637 combined with '!', '.', ',', and '*' as above binding stronger
638 than the OR.
639 If %* appears in X, all of the alternatives must be starred, and
640 only the first matching alternative is substituted.
641 %{%:function(args):X}
642 Call function named FUNCTION with args ARGS. If the function
643 returns non-NULL, then X is substituted, if it returns
644 NULL, it isn't substituted.
645 %{S:X; if S was given to GCC, substitutes X;
646 T:Y; else if T was given to GCC, substitutes Y;
647 :D} else substitutes D. There can be as many clauses as you need.
648 This may be combined with '.', '!', ',', '|', and '*' as above.
650 %(Spec) processes a specification defined in a specs file as *Spec:
652 The switch matching text S in a %{S}, %{S:X}, or similar construct can use
653 a backslash to ignore the special meaning of the character following it,
654 thus allowing literal matching of a character that is otherwise specially
655 treated. For example, %{std=iso9899\:1999:X} substitutes X if the
656 -std=iso9899:1999 option is given.
658 The conditional text X in a %{S:X} or similar construct may contain
659 other nested % constructs or spaces, or even newlines. They are
660 processed as usual, as described above. Trailing white space in X is
661 ignored. White space may also appear anywhere on the left side of the
662 colon in these constructs, except between . or * and the corresponding
663 word.
665 The -O, -f, -g, -m, and -W switches are handled specifically in these
666 constructs. If another value of -O or the negated form of a -f, -m, or
667 -W switch is found later in the command line, the earlier switch
668 value is ignored, except with {S*} where S is just one letter; this
669 passes all matching options.
671 The character | at the beginning of the predicate text is used to indicate
672 that a command should be piped to the following command, but only if -pipe
673 is specified.
675 Note that it is built into GCC which switches take arguments and which
676 do not. You might think it would be useful to generalize this to
677 allow each compiler's spec to say which switches take arguments. But
678 this cannot be done in a consistent fashion. GCC cannot even decide
679 which input files have been specified without knowing which switches
680 take arguments, and it must know which input files to compile in order
681 to tell which compilers to run.
683 GCC also knows implicitly that arguments starting in `-l' are to be
684 treated as compiler output files, and passed to the linker in their
685 proper position among the other output files. */
687 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
689 /* config.h can define ASM_SPEC to provide extra args to the assembler
690 or extra switch-translations. */
691 #ifndef ASM_SPEC
692 #define ASM_SPEC ""
693 #endif
695 /* config.h can define ASM_FINAL_SPEC to run a post processor after
696 the assembler has run. */
697 #ifndef ASM_FINAL_SPEC
698 #define ASM_FINAL_SPEC \
699 "%{gsplit-dwarf: \n\
700 objcopy --extract-dwo \
701 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
702 %b.dwo \n\
703 objcopy --strip-dwo \
704 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
706 #endif
708 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
709 or extra switch-translations. */
710 #ifndef CPP_SPEC
711 #define CPP_SPEC ""
712 #endif
714 /* Operating systems can define OS_CC1_SPEC to provide extra args to cc1 and
715 cc1plus or extra switch-translations. The OS_CC1_SPEC is appended
716 to CC1_SPEC in the initialization of cc1_spec. */
717 #ifndef OS_CC1_SPEC
718 #define OS_CC1_SPEC ""
719 #endif
721 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
722 or extra switch-translations. */
723 #ifndef CC1_SPEC
724 #define CC1_SPEC ""
725 #endif
727 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
728 or extra switch-translations. */
729 #ifndef CC1PLUS_SPEC
730 #define CC1PLUS_SPEC ""
731 #endif
733 /* config.h can define LINK_SPEC to provide extra args to the linker
734 or extra switch-translations. */
735 #ifndef LINK_SPEC
736 #define LINK_SPEC ""
737 #endif
739 /* config.h can define LIB_SPEC to override the default libraries. */
740 #ifndef LIB_SPEC
741 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
742 #endif
744 /* When using -fsplit-stack we need to wrap pthread_create, in order
745 to initialize the stack guard. We always use wrapping, rather than
746 shared library ordering, and we keep the wrapper function in
747 libgcc. This is not yet a real spec, though it could become one;
748 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
749 only works with GNU ld and gold. */
750 #ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
751 #define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
752 #else
753 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
754 #endif
756 #ifndef LIBASAN_SPEC
757 #define STATIC_LIBASAN_LIBS \
758 " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
759 #ifdef LIBASAN_EARLY_SPEC
760 #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
761 #elif defined(HAVE_LD_STATIC_DYNAMIC)
762 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
763 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
764 STATIC_LIBASAN_LIBS
765 #else
766 #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
767 #endif
768 #endif
770 #ifndef LIBASAN_EARLY_SPEC
771 #define LIBASAN_EARLY_SPEC ""
772 #endif
774 #ifndef LIBHWASAN_SPEC
775 #define STATIC_LIBHWASAN_LIBS \
776 " %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
777 #ifdef LIBHWASAN_EARLY_SPEC
778 #define LIBHWASAN_SPEC STATIC_LIBHWASAN_LIBS
779 #elif defined(HAVE_LD_STATIC_DYNAMIC)
780 #define LIBHWASAN_SPEC "%{static-libhwasan:" LD_STATIC_OPTION \
781 "} -lhwasan %{static-libhwasan:" LD_DYNAMIC_OPTION "}" \
782 STATIC_LIBHWASAN_LIBS
783 #else
784 #define LIBHWASAN_SPEC "-lhwasan" STATIC_LIBHWASAN_LIBS
785 #endif
786 #endif
788 #ifndef LIBHWASAN_EARLY_SPEC
789 #define LIBHWASAN_EARLY_SPEC ""
790 #endif
792 #ifndef LIBTSAN_SPEC
793 #define STATIC_LIBTSAN_LIBS \
794 " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
795 #ifdef LIBTSAN_EARLY_SPEC
796 #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
797 #elif defined(HAVE_LD_STATIC_DYNAMIC)
798 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
799 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
800 STATIC_LIBTSAN_LIBS
801 #else
802 #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
803 #endif
804 #endif
806 #ifndef LIBTSAN_EARLY_SPEC
807 #define LIBTSAN_EARLY_SPEC ""
808 #endif
810 #ifndef LIBLSAN_SPEC
811 #define STATIC_LIBLSAN_LIBS \
812 " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
813 #ifdef LIBLSAN_EARLY_SPEC
814 #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
815 #elif defined(HAVE_LD_STATIC_DYNAMIC)
816 #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
817 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
818 STATIC_LIBLSAN_LIBS
819 #else
820 #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
821 #endif
822 #endif
824 #ifndef LIBLSAN_EARLY_SPEC
825 #define LIBLSAN_EARLY_SPEC ""
826 #endif
828 #ifndef LIBUBSAN_SPEC
829 #define STATIC_LIBUBSAN_LIBS \
830 " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
831 #ifdef HAVE_LD_STATIC_DYNAMIC
832 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
833 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
834 STATIC_LIBUBSAN_LIBS
835 #else
836 #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
837 #endif
838 #endif
840 /* Linker options for compressed debug sections. */
841 #if HAVE_LD_COMPRESS_DEBUG == 0
842 /* No linker support. */
843 #define LINK_COMPRESS_DEBUG_SPEC \
844 " %{gz*:%e-gz is not supported in this configuration} "
845 #elif HAVE_LD_COMPRESS_DEBUG == 1
846 /* ELF gABI style. */
847 #define LINK_COMPRESS_DEBUG_SPEC \
848 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
849 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
850 " %{gz=zstd:%e-gz=zstd is not supported in this configuration} " \
851 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
852 #elif HAVE_LD_COMPRESS_DEBUG == 2
853 /* ELF gABI style and ZSTD. */
854 #define LINK_COMPRESS_DEBUG_SPEC \
855 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
856 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
857 " %{gz=zstd:" LD_COMPRESS_DEBUG_OPTION "=zstd}" \
858 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
859 #else
860 #error Unknown value for HAVE_LD_COMPRESS_DEBUG.
861 #endif
863 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
864 included. */
865 #ifndef LIBGCC_SPEC
866 #if defined(REAL_LIBGCC_SPEC)
867 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
868 #elif defined(LINK_LIBGCC_SPECIAL_1)
869 /* Have gcc do the search for libgcc.a. */
870 #define LIBGCC_SPEC "libgcc.a%s"
871 #else
872 #define LIBGCC_SPEC "-lgcc"
873 #endif
874 #endif
876 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
877 #ifndef STARTFILE_SPEC
878 #define STARTFILE_SPEC \
879 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
880 #endif
882 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
883 #ifndef ENDFILE_SPEC
884 #define ENDFILE_SPEC ""
885 #endif
887 #ifndef LINKER_NAME
888 #define LINKER_NAME "collect2"
889 #endif
891 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
892 #define ASM_MAP " %{ffile-prefix-map=*:--debug-prefix-map %*} %{fdebug-prefix-map=*:--debug-prefix-map %*}"
893 #else
894 #define ASM_MAP ""
895 #endif
897 /* Assembler options for compressed debug sections. */
898 #if HAVE_LD_COMPRESS_DEBUG == 0
899 /* Reject if the linker cannot write compressed debug sections. */
900 #define ASM_COMPRESS_DEBUG_SPEC \
901 " %{gz*:%e-gz is not supported in this configuration} "
902 #else /* HAVE_LD_COMPRESS_DEBUG >= 1 */
903 #if HAVE_AS_COMPRESS_DEBUG == 0
904 /* No assembler support. Ignore silently. */
905 #define ASM_COMPRESS_DEBUG_SPEC \
906 " %{gz*:} "
907 #elif HAVE_AS_COMPRESS_DEBUG == 1
908 /* ELF gABI style. */
909 #define ASM_COMPRESS_DEBUG_SPEC \
910 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
911 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
912 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
913 #elif HAVE_AS_COMPRESS_DEBUG == 2
914 /* ELF gABI style and ZSTD. */
915 #define ASM_COMPRESS_DEBUG_SPEC \
916 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
917 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
918 " %{gz=zstd:" AS_COMPRESS_DEBUG_OPTION "=zstd}" \
919 " %{gz=zlib-gnu:}" /* Ignore silently zlib-gnu option value. */
920 #else
921 #error Unknown value for HAVE_AS_COMPRESS_DEBUG.
922 #endif
923 #endif /* HAVE_LD_COMPRESS_DEBUG >= 1 */
925 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
926 to the assembler, when compiling assembly sources only. */
927 #ifndef ASM_DEBUG_SPEC
928 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
929 /* If --gdwarf-N is supported and as can handle even compiler generated
930 .debug_line with it, supply --gdwarf-N in ASM_DEBUG_OPTION_SPEC rather
931 than in ASM_DEBUG_SPEC, so that it applies to both .s and .c etc.
932 compilations. */
933 # define ASM_DEBUG_DWARF_OPTION ""
934 # elif defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && !defined(HAVE_LD_BROKEN_PE_DWARF5)
935 # define ASM_DEBUG_DWARF_OPTION "%{%:dwarf-version-gt(4):--gdwarf-5;" \
936 "%:dwarf-version-gt(3):--gdwarf-4;" \
937 "%:dwarf-version-gt(2):--gdwarf-3;" \
938 ":--gdwarf2}"
939 # else
940 # define ASM_DEBUG_DWARF_OPTION "--gdwarf2"
941 # endif
942 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
943 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):" \
944 ASM_DEBUG_DWARF_OPTION "}}" ASM_MAP
945 # endif
946 # endif
947 #ifndef ASM_DEBUG_SPEC
948 # define ASM_DEBUG_SPEC ""
949 #endif
951 /* Define ASM_DEBUG_OPTION_SPEC to be a spec suitable for translating '-g'
952 to the assembler when compiling all sources. */
953 #ifndef ASM_DEBUG_OPTION_SPEC
954 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
955 # define ASM_DEBUG_OPTION_DWARF_OPT \
956 "%{%:dwarf-version-gt(4):--gdwarf-5 ;" \
957 "%:dwarf-version-gt(3):--gdwarf-4 ;" \
958 "%:dwarf-version-gt(2):--gdwarf-3 ;" \
959 ":--gdwarf2 }"
960 # if defined(DWARF2_DEBUGGING_INFO)
961 # define ASM_DEBUG_OPTION_SPEC "%{g*:%{%:debug-level-gt(0):" \
962 ASM_DEBUG_OPTION_DWARF_OPT "}}"
963 # endif
964 # endif
965 #endif
966 #ifndef ASM_DEBUG_OPTION_SPEC
967 # define ASM_DEBUG_OPTION_SPEC ""
968 #endif
970 /* Here is the spec for running the linker, after compiling all files. */
972 /* This is overridable by the target in case they need to specify the
973 -lgcc and -lc order specially, yet not require them to override all
974 of LINK_COMMAND_SPEC. */
975 #ifndef LINK_GCC_C_SEQUENCE_SPEC
976 #define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
977 #endif
979 #ifndef LINK_SSP_SPEC
980 #ifdef TARGET_LIBC_PROVIDES_SSP
981 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
982 "|fstack-protector-strong|fstack-protector-explicit:}"
983 #else
984 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
985 "|fstack-protector-strong|fstack-protector-explicit" \
986 ":-lssp_nonshared -lssp}"
987 #endif
988 #endif
990 #ifdef ENABLE_DEFAULT_PIE
991 #define PIE_SPEC "!no-pie"
992 #define NO_FPIE1_SPEC "fno-pie"
993 #define FPIE1_SPEC NO_FPIE1_SPEC ":;"
994 #define NO_FPIE2_SPEC "fno-PIE"
995 #define FPIE2_SPEC NO_FPIE2_SPEC ":;"
996 #define NO_FPIE_SPEC NO_FPIE1_SPEC "|" NO_FPIE2_SPEC
997 #define FPIE_SPEC NO_FPIE_SPEC ":;"
998 #define NO_FPIC1_SPEC "fno-pic"
999 #define FPIC1_SPEC NO_FPIC1_SPEC ":;"
1000 #define NO_FPIC2_SPEC "fno-PIC"
1001 #define FPIC2_SPEC NO_FPIC2_SPEC ":;"
1002 #define NO_FPIC_SPEC NO_FPIC1_SPEC "|" NO_FPIC2_SPEC
1003 #define FPIC_SPEC NO_FPIC_SPEC ":;"
1004 #define NO_FPIE1_AND_FPIC1_SPEC NO_FPIE1_SPEC "|" NO_FPIC1_SPEC
1005 #define FPIE1_OR_FPIC1_SPEC NO_FPIE1_AND_FPIC1_SPEC ":;"
1006 #define NO_FPIE2_AND_FPIC2_SPEC NO_FPIE2_SPEC "|" NO_FPIC2_SPEC
1007 #define FPIE2_OR_FPIC2_SPEC NO_FPIE2_AND_FPIC2_SPEC ":;"
1008 #define NO_FPIE_AND_FPIC_SPEC NO_FPIE_SPEC "|" NO_FPIC_SPEC
1009 #define FPIE_OR_FPIC_SPEC NO_FPIE_AND_FPIC_SPEC ":;"
1010 #else
1011 #define PIE_SPEC "pie"
1012 #define FPIE1_SPEC "fpie"
1013 #define NO_FPIE1_SPEC FPIE1_SPEC ":;"
1014 #define FPIE2_SPEC "fPIE"
1015 #define NO_FPIE2_SPEC FPIE2_SPEC ":;"
1016 #define FPIE_SPEC FPIE1_SPEC "|" FPIE2_SPEC
1017 #define NO_FPIE_SPEC FPIE_SPEC ":;"
1018 #define FPIC1_SPEC "fpic"
1019 #define NO_FPIC1_SPEC FPIC1_SPEC ":;"
1020 #define FPIC2_SPEC "fPIC"
1021 #define NO_FPIC2_SPEC FPIC2_SPEC ":;"
1022 #define FPIC_SPEC FPIC1_SPEC "|" FPIC2_SPEC
1023 #define NO_FPIC_SPEC FPIC_SPEC ":;"
1024 #define FPIE1_OR_FPIC1_SPEC FPIE1_SPEC "|" FPIC1_SPEC
1025 #define NO_FPIE1_AND_FPIC1_SPEC FPIE1_OR_FPIC1_SPEC ":;"
1026 #define FPIE2_OR_FPIC2_SPEC FPIE2_SPEC "|" FPIC2_SPEC
1027 #define NO_FPIE2_AND_FPIC2_SPEC FPIE1_OR_FPIC2_SPEC ":;"
1028 #define FPIE_OR_FPIC_SPEC FPIE_SPEC "|" FPIC_SPEC
1029 #define NO_FPIE_AND_FPIC_SPEC FPIE_OR_FPIC_SPEC ":;"
1030 #endif
1032 #ifndef LINK_PIE_SPEC
1033 #ifdef HAVE_LD_PIE
1034 #ifndef LD_PIE_SPEC
1035 #define LD_PIE_SPEC "-pie"
1036 #endif
1037 #else
1038 #define LD_PIE_SPEC ""
1039 #endif
1040 #define LINK_PIE_SPEC "%{static|shared|r:;" PIE_SPEC ":" LD_PIE_SPEC "} "
1041 #endif
1043 #ifndef LINK_BUILDID_SPEC
1044 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
1045 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
1046 # endif
1047 #endif
1049 #ifndef LTO_PLUGIN_SPEC
1050 #define LTO_PLUGIN_SPEC ""
1051 #endif
1053 /* Conditional to test whether the LTO plugin is used or not.
1054 FIXME: For slim LTO we will need to enable plugin unconditionally. This
1055 still cause problems with PLUGIN_LD != LD and when plugin is built but
1056 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
1057 plugin only when LTO is enabled. We still honor explicit
1058 -fuse-linker-plugin if the linker used understands -plugin. */
1060 /* The linker has some plugin support. */
1061 #if HAVE_LTO_PLUGIN > 0
1062 /* The linker used has full plugin support, use LTO plugin by default. */
1063 #if HAVE_LTO_PLUGIN == 2
1064 #define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
1065 #define PLUGIN_COND_CLOSE "}"
1066 #else
1067 /* The linker used has limited plugin support, use LTO plugin with explicit
1068 -fuse-linker-plugin. */
1069 #define PLUGIN_COND "fuse-linker-plugin"
1070 #define PLUGIN_COND_CLOSE ""
1071 #endif
1072 #define LINK_PLUGIN_SPEC \
1073 "%{" PLUGIN_COND": \
1074 -plugin %(linker_plugin_file) \
1075 -plugin-opt=%(lto_wrapper) \
1076 -plugin-opt=-fresolution=%u.res \
1077 " LTO_PLUGIN_SPEC "\
1078 %{flinker-output=*:-plugin-opt=-linker-output-known} \
1079 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
1080 }" PLUGIN_COND_CLOSE
1081 #else
1082 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
1083 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
1084 %e-fuse-linker-plugin is not supported in this configuration}"
1085 #endif
1087 /* Linker command line options for -fsanitize= early on the command line. */
1088 #ifndef SANITIZER_EARLY_SPEC
1089 #define SANITIZER_EARLY_SPEC "\
1090 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
1091 %{%:sanitize(hwaddress):" LIBHWASAN_EARLY_SPEC "} \
1092 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
1093 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}"
1094 #endif
1096 /* Linker command line options for -fsanitize= late on the command line. */
1097 #ifndef SANITIZER_SPEC
1098 #define SANITIZER_SPEC "\
1099 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
1100 %{static:%ecannot specify -static with -fsanitize=address}}\
1101 %{%:sanitize(hwaddress):" LIBHWASAN_SPEC "\
1102 %{static:%ecannot specify -static with -fsanitize=hwaddress}}\
1103 %{%:sanitize(thread):" LIBTSAN_SPEC "\
1104 %{static:%ecannot specify -static with -fsanitize=thread}}\
1105 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
1106 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}"
1107 #endif
1109 #ifndef POST_LINK_SPEC
1110 #define POST_LINK_SPEC ""
1111 #endif
1113 /* This is the spec to use, once the code for creating the vtable
1114 verification runtime library, libvtv.so, has been created. Currently
1115 the vtable verification runtime functions are in libstdc++, so we use
1116 the spec just below this one. */
1117 #ifndef VTABLE_VERIFICATION_SPEC
1118 #if ENABLE_VTABLE_VERIFY
1119 #define VTABLE_VERIFICATION_SPEC "\
1120 %{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1121 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1122 #else
1123 #define VTABLE_VERIFICATION_SPEC "\
1124 %{fvtable-verify=none:} \
1125 %{fvtable-verify=std: \
1126 %e-fvtable-verify=std is not supported in this configuration} \
1127 %{fvtable-verify=preinit: \
1128 %e-fvtable-verify=preinit is not supported in this configuration}"
1129 #endif
1130 #endif
1132 /* -u* was put back because both BSD and SysV seem to support it. */
1133 /* %{static|no-pie|static-pie:} simply prevents an error message:
1134 1. If the target machine doesn't handle -static.
1135 2. If PIE isn't enabled by default.
1136 3. If the target machine doesn't handle -static-pie.
1138 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1139 scripts which exist in user specified directories, or in standard
1140 directories. */
1141 /* We pass any -flto flags on to the linker, which is expected
1142 to understand them. In practice, this means it had better be collect2. */
1143 /* %{e*} includes -export-dynamic; see comment in common.opt. */
1144 #ifndef LINK_COMMAND_SPEC
1145 #define LINK_COMMAND_SPEC "\
1146 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1147 %(linker) " \
1148 LINK_PLUGIN_SPEC \
1149 "%{flto|flto=*:%<fcompare-debug*} \
1150 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
1151 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
1152 "%X %{o*} %{e*} %{N} %{n} %{r}\
1153 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1154 %{static|no-pie|static-pie:} %@{L*} %(link_libgcc) " \
1155 VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
1156 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1157 %:include(libgomp.spec)%(link_gomp)}\
1158 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1159 " STACK_SPLIT_SPEC "\
1160 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
1161 %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1162 %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1163 #endif
1165 #ifndef LINK_LIBGCC_SPEC
1166 /* Generate -L options for startfile prefix list. */
1167 # define LINK_LIBGCC_SPEC "%D"
1168 #endif
1170 #ifndef STARTFILE_PREFIX_SPEC
1171 # define STARTFILE_PREFIX_SPEC ""
1172 #endif
1174 #ifndef SYSROOT_SPEC
1175 # define SYSROOT_SPEC "--sysroot=%R"
1176 #endif
1178 #ifndef SYSROOT_SUFFIX_SPEC
1179 # define SYSROOT_SUFFIX_SPEC ""
1180 #endif
1182 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1183 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
1184 #endif
1186 static const char *asm_debug = ASM_DEBUG_SPEC;
1187 static const char *asm_debug_option = ASM_DEBUG_OPTION_SPEC;
1188 static const char *cpp_spec = CPP_SPEC;
1189 static const char *cc1_spec = CC1_SPEC OS_CC1_SPEC;
1190 static const char *cc1plus_spec = CC1PLUS_SPEC;
1191 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
1192 static const char *link_ssp_spec = LINK_SSP_SPEC;
1193 static const char *asm_spec = ASM_SPEC;
1194 static const char *asm_final_spec = ASM_FINAL_SPEC;
1195 static const char *link_spec = LINK_SPEC;
1196 static const char *lib_spec = LIB_SPEC;
1197 static const char *link_gomp_spec = "";
1198 static const char *libgcc_spec = LIBGCC_SPEC;
1199 static const char *endfile_spec = ENDFILE_SPEC;
1200 static const char *startfile_spec = STARTFILE_SPEC;
1201 static const char *linker_name_spec = LINKER_NAME;
1202 static const char *linker_plugin_file_spec = "";
1203 static const char *lto_wrapper_spec = "";
1204 static const char *lto_gcc_spec = "";
1205 static const char *post_link_spec = POST_LINK_SPEC;
1206 static const char *link_command_spec = LINK_COMMAND_SPEC;
1207 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
1208 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
1209 static const char *sysroot_spec = SYSROOT_SPEC;
1210 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
1211 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
1212 static const char *self_spec = "";
1214 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1215 There should be no need to override these in target dependent files,
1216 but we need to copy them to the specs file so that newer versions
1217 of the GCC driver can correctly drive older tool chains with the
1218 appropriate -B options. */
1220 /* When cpplib handles traditional preprocessing, get rid of this, and
1221 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1222 that we default the front end language better. */
1223 static const char *trad_capable_cpp =
1224 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1226 /* We don't wrap .d files in %W{} since a missing .d file, and
1227 therefore no dependency entry, confuses make into thinking a .o
1228 file that happens to exist is up-to-date. */
1229 static const char *cpp_unique_options =
1230 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1231 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1232 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1233 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1234 %{Mmodules} %{Mno-modules}\
1235 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1236 %{remap} %{%:debug-level-gt(2):-dD}\
1237 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1238 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1239 %{E|M|MM:%W{o*}}\
1240 %{fdeps-format=*:%{!fdeps-file=*:-fdeps-file=%:join(%{!o:%b.ddi}%{o*:%.ddi%*})}}\
1241 %{fdeps-format=*:%{!fdeps-target=*:-fdeps-target=%:join(%{!o:%b.o}%{o*:%.o%*})}}";
1243 /* This contains cpp options which are common with cc1_options and are passed
1244 only when preprocessing only to avoid duplication. We pass the cc1 spec
1245 options to the preprocessor so that it the cc1 spec may manipulate
1246 options used to set target flags. Those special target flags settings may
1247 in turn cause preprocessor symbols to be defined specially. */
1248 static const char *cpp_options =
1249 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1250 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1251 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1252 %{undef} %{save-temps*:-fpch-preprocess}";
1254 /* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
1256 Make it easy for a language to override the argument for the
1257 %:dumps specs function call. */
1258 #define DUMPS_OPTIONS(EXTS) \
1259 "%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps(" EXTS ")"
1261 /* This contains cpp options which are not passed when the preprocessor
1262 output will be used by another program. */
1263 static const char *cpp_debug_options = DUMPS_OPTIONS ("");
1265 /* NB: This is shared amongst all front-ends, except for Ada. */
1266 static const char *cc1_options =
1267 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1268 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1269 %1 %{!Q:-quiet} %(cpp_debug_options) %{m*} %{aux-info*}\
1270 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1271 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1272 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1273 %{-target-help:--target-help}\
1274 %{-version:--version}\
1275 %{-help=*:--help=%*}\
1276 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %w%b.s}}}\
1277 %{fsyntax-only:-o %j} %{-param*}\
1278 %{coverage:-fprofile-arcs -ftest-coverage}\
1279 %{fprofile-arcs|fprofile-generate*|coverage:\
1280 %{!fprofile-update=single:\
1281 %{pthread:-fprofile-update=prefer-atomic}}}";
1283 static const char *asm_options =
1284 "%{-target-help:%:print-asm-header()} "
1285 #if HAVE_GNU_AS
1286 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
1287 to the assembler equivalents. */
1288 "%{v} %{w:-W} %{I*} "
1289 #endif
1290 "%(asm_debug_option)"
1291 ASM_COMPRESS_DEBUG_SPEC
1292 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1294 static const char *invoke_as =
1295 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1296 "%{!fwpa*:\
1297 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1298 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1300 #else
1301 "%{!fwpa*:\
1302 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1303 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1305 #endif
1307 /* Some compilers have limits on line lengths, and the multilib_select
1308 and/or multilib_matches strings can be very long, so we build them at
1309 run time. */
1310 static struct obstack multilib_obstack;
1311 static const char *multilib_select;
1312 static const char *multilib_matches;
1313 static const char *multilib_defaults;
1314 static const char *multilib_exclusions;
1315 static const char *multilib_reuse;
1317 /* Check whether a particular argument is a default argument. */
1319 #ifndef MULTILIB_DEFAULTS
1320 #define MULTILIB_DEFAULTS { "" }
1321 #endif
1323 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
1325 #ifndef DRIVER_SELF_SPECS
1326 #define DRIVER_SELF_SPECS ""
1327 #endif
1329 /* Linking to libgomp implies pthreads. This is particularly important
1330 for targets that use different start files and suchlike. */
1331 #ifndef GOMP_SELF_SPECS
1332 #define GOMP_SELF_SPECS \
1333 "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1334 "-pthread}"
1335 #endif
1337 /* Likewise for -fgnu-tm. */
1338 #ifndef GTM_SELF_SPECS
1339 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1340 #endif
1342 static const char *const driver_self_specs[] = {
1343 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1344 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS,
1345 /* This discards -fmultiflags at the end of self specs processing in the
1346 driver, so that it is effectively Ignored, without actually marking it as
1347 Ignored, which would get it discarded before self specs could remap it. */
1348 "%<fmultiflags"
1351 #ifndef OPTION_DEFAULT_SPECS
1352 #define OPTION_DEFAULT_SPECS { "", "" }
1353 #endif
1355 struct default_spec
1357 const char *name;
1358 const char *spec;
1361 static const struct default_spec
1362 option_default_specs[] = { OPTION_DEFAULT_SPECS };
1364 struct user_specs
1366 struct user_specs *next;
1367 const char *filename;
1370 static struct user_specs *user_specs_head, *user_specs_tail;
1373 /* Record the mapping from file suffixes for compilation specs. */
1375 struct compiler
1377 const char *suffix; /* Use this compiler for input files
1378 whose names end in this suffix. */
1380 const char *spec; /* To use this compiler, run this spec. */
1382 const char *cpp_spec; /* If non-NULL, substitute this spec
1383 for `%C', rather than the usual
1384 cpp_spec. */
1385 int combinable; /* If nonzero, compiler can deal with
1386 multiple source files at once (IMA). */
1387 int needs_preprocessing; /* If nonzero, source files need to
1388 be run through a preprocessor. */
1391 /* Pointer to a vector of `struct compiler' that gives the spec for
1392 compiling a file, based on its suffix.
1393 A file that does not end in any of these suffixes will be passed
1394 unchanged to the loader and nothing else will be done to it.
1396 An entry containing two 0s is used to terminate the vector.
1398 If multiple entries match a file, the last matching one is used. */
1400 static struct compiler *compilers;
1402 /* Number of entries in `compilers', not counting the null terminator. */
1404 static int n_compilers;
1406 /* The default list of file name suffixes and their compilation specs. */
1408 static const struct compiler default_compilers[] =
1410 /* Add lists of suffixes of known languages here. If those languages
1411 were not present when we built the driver, we will hit these copies
1412 and be given a more meaningful error than "file not used since
1413 linking is not done". */
1414 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1415 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1416 {".mii", "#Objective-C++", 0, 0, 0},
1417 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1418 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1419 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1420 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1421 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1422 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1423 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1424 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1425 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1426 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1427 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1428 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1429 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1430 {".r", "#Ratfor", 0, 0, 0},
1431 {".go", "#Go", 0, 1, 0},
1432 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1433 {".mod", "#Modula-2", 0, 0, 0}, {".m2i", "#Modula-2", 0, 0, 0},
1434 /* Next come the entries for C. */
1435 {".c", "@c", 0, 0, 1},
1436 {"@c",
1437 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1438 external preprocessor if -save-temps is given. */
1439 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1440 %{!E:%{!M:%{!MM:\
1441 %{traditional:\
1442 %eGNU C no longer supports -traditional without -E}\
1443 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1444 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1445 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1446 %(cc1_options)}\
1447 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1448 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1449 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1450 {"-",
1451 "%{!E:%e-E or -x required when input is from standard input}\
1452 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1453 {".h", "@c-header", 0, 0, 0},
1454 {"@c-header",
1455 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1456 external preprocessor if -save-temps is given. */
1457 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1458 %{!E:%{!M:%{!MM:\
1459 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1460 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1461 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1462 %(cc1_options)\
1463 %{!fsyntax-only:%{!S:-o %g.s} \
1464 %{!fdump-ada-spec*:%{!o*:--output-pch %w%i.gch}\
1465 %W{o*:--output-pch %w%*}}%{!S:%V}}}\
1466 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1467 cc1 %(cpp_unique_options) %(cc1_options)\
1468 %{!fsyntax-only:%{!S:-o %g.s} \
1469 %{!fdump-ada-spec*:%{!o*:--output-pch %w%i.gch}\
1470 %W{o*:--output-pch %w%*}}%{!S:%V}}}}}}}}", 0, 0, 0},
1471 {".i", "@cpp-output", 0, 0, 0},
1472 {"@cpp-output",
1473 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1474 {".s", "@assembler", 0, 0, 0},
1475 {"@assembler",
1476 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1477 {".sx", "@assembler-with-cpp", 0, 0, 0},
1478 {".S", "@assembler-with-cpp", 0, 0, 0},
1479 {"@assembler-with-cpp",
1480 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1481 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1482 %{E|M|MM:%(cpp_debug_options)}\
1483 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1484 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1485 #else
1486 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1487 %{E|M|MM:%(cpp_debug_options)}\
1488 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1489 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1490 #endif
1491 , 0, 0, 0},
1493 #include "specs.h"
1494 /* Mark end of table. */
1495 {0, 0, 0, 0, 0}
1498 /* Number of elements in default_compilers, not counting the terminator. */
1500 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1502 typedef char *char_p; /* For DEF_VEC_P. */
1504 /* A vector of options to give to the linker.
1505 These options are accumulated by %x,
1506 and substituted into the linker command with %X. */
1507 static vec<char_p> linker_options;
1509 /* A vector of options to give to the assembler.
1510 These options are accumulated by -Wa,
1511 and substituted into the assembler command with %Y. */
1512 static vec<char_p> assembler_options;
1514 /* A vector of options to give to the preprocessor.
1515 These options are accumulated by -Wp,
1516 and substituted into the preprocessor command with %Z. */
1517 static vec<char_p> preprocessor_options;
1519 static char *
1520 skip_whitespace (char *p)
1522 while (1)
1524 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1525 be considered whitespace. */
1526 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1527 return p + 1;
1528 else if (*p == '\n' || *p == ' ' || *p == '\t')
1529 p++;
1530 else if (*p == '#')
1532 while (*p != '\n')
1533 p++;
1534 p++;
1536 else
1537 break;
1540 return p;
1542 /* Structures to keep track of prefixes to try when looking for files. */
1544 struct prefix_list
1546 const char *prefix; /* String to prepend to the path. */
1547 struct prefix_list *next; /* Next in linked list. */
1548 int require_machine_suffix; /* Don't use without machine_suffix. */
1549 /* 2 means try both machine_suffix and just_machine_suffix. */
1550 int priority; /* Sort key - priority within list. */
1551 int os_multilib; /* 1 if OS multilib scheme should be used,
1552 0 for GCC multilib scheme. */
1555 struct path_prefix
1557 struct prefix_list *plist; /* List of prefixes to try */
1558 int max_len; /* Max length of a prefix in PLIST */
1559 const char *name; /* Name of this list (used in config stuff) */
1562 /* List of prefixes to try when looking for executables. */
1564 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1566 /* List of prefixes to try when looking for startup (crt0) files. */
1568 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1570 /* List of prefixes to try when looking for include files. */
1572 static struct path_prefix include_prefixes = { 0, 0, "include" };
1574 /* Suffix to attach to directories searched for commands.
1575 This looks like `MACHINE/VERSION/'. */
1577 static const char *machine_suffix = 0;
1579 /* Suffix to attach to directories searched for commands.
1580 This is just `MACHINE/'. */
1582 static const char *just_machine_suffix = 0;
1584 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1586 static const char *gcc_exec_prefix;
1588 /* Adjusted value of standard_libexec_prefix. */
1590 static const char *gcc_libexec_prefix;
1592 /* Default prefixes to attach to command names. */
1594 #ifndef STANDARD_STARTFILE_PREFIX_1
1595 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1596 #endif
1597 #ifndef STANDARD_STARTFILE_PREFIX_2
1598 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1599 #endif
1601 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1602 #undef MD_EXEC_PREFIX
1603 #undef MD_STARTFILE_PREFIX
1604 #undef MD_STARTFILE_PREFIX_1
1605 #endif
1607 /* If no prefixes defined, use the null string, which will disable them. */
1608 #ifndef MD_EXEC_PREFIX
1609 #define MD_EXEC_PREFIX ""
1610 #endif
1611 #ifndef MD_STARTFILE_PREFIX
1612 #define MD_STARTFILE_PREFIX ""
1613 #endif
1614 #ifndef MD_STARTFILE_PREFIX_1
1615 #define MD_STARTFILE_PREFIX_1 ""
1616 #endif
1618 /* These directories are locations set at configure-time based on the
1619 --prefix option provided to configure. Their initializers are
1620 defined in Makefile.in. These paths are not *directly* used when
1621 gcc_exec_prefix is set because, in that case, we know where the
1622 compiler has been installed, and use paths relative to that
1623 location instead. */
1624 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1625 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1626 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1627 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1629 /* For native compilers, these are well-known paths containing
1630 components that may be provided by the system. For cross
1631 compilers, these paths are not used. */
1632 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1633 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1634 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1635 static const char *const standard_startfile_prefix_1
1636 = STANDARD_STARTFILE_PREFIX_1;
1637 static const char *const standard_startfile_prefix_2
1638 = STANDARD_STARTFILE_PREFIX_2;
1640 /* A relative path to be used in finding the location of tools
1641 relative to the driver. */
1642 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1644 /* A prefix to be used when this is an accelerator compiler. */
1645 static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
1647 /* Subdirectory to use for locating libraries. Set by
1648 set_multilib_dir based on the compilation options. */
1650 static const char *multilib_dir;
1652 /* Subdirectory to use for locating libraries in OS conventions. Set by
1653 set_multilib_dir based on the compilation options. */
1655 static const char *multilib_os_dir;
1657 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1658 set_multilib_dir based on the compilation options. */
1660 static const char *multiarch_dir;
1662 /* Structure to keep track of the specs that have been defined so far.
1663 These are accessed using %(specname) in a compiler or link
1664 spec. */
1666 struct spec_list
1668 /* The following 2 fields must be first */
1669 /* to allow EXTRA_SPECS to be initialized */
1670 const char *name; /* name of the spec. */
1671 const char *ptr; /* available ptr if no static pointer */
1673 /* The following fields are not initialized */
1674 /* by EXTRA_SPECS */
1675 const char **ptr_spec; /* pointer to the spec itself. */
1676 struct spec_list *next; /* Next spec in linked list. */
1677 int name_len; /* length of the name */
1678 bool user_p; /* whether string come from file spec. */
1679 bool alloc_p; /* whether string was allocated */
1680 const char *default_ptr; /* The default value of *ptr_spec. */
1683 #define INIT_STATIC_SPEC(NAME,PTR) \
1684 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1685 *PTR }
1687 /* List of statically defined specs. */
1688 static struct spec_list static_specs[] =
1690 INIT_STATIC_SPEC ("asm", &asm_spec),
1691 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1692 INIT_STATIC_SPEC ("asm_debug_option", &asm_debug_option),
1693 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1694 INIT_STATIC_SPEC ("asm_options", &asm_options),
1695 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1696 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1697 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1698 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1699 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1700 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1701 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1702 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1703 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1704 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1705 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1706 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1707 INIT_STATIC_SPEC ("link", &link_spec),
1708 INIT_STATIC_SPEC ("lib", &lib_spec),
1709 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1710 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1711 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1712 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1713 INIT_STATIC_SPEC ("version", &compiler_version),
1714 INIT_STATIC_SPEC ("multilib", &multilib_select),
1715 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1716 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1717 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1718 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1719 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1720 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
1721 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1722 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1723 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1724 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1725 INIT_STATIC_SPEC ("post_link", &post_link_spec),
1726 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1727 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1728 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1729 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1730 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1731 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1732 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1733 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1734 INIT_STATIC_SPEC ("self_spec", &self_spec),
1737 #ifdef EXTRA_SPECS /* additional specs needed */
1738 /* Structure to keep track of just the first two args of a spec_list.
1739 That is all that the EXTRA_SPECS macro gives us. */
1740 struct spec_list_1
1742 const char *const name;
1743 const char *const ptr;
1746 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1747 static struct spec_list *extra_specs = (struct spec_list *) 0;
1748 #endif
1750 /* List of dynamically allocates specs that have been defined so far. */
1752 static struct spec_list *specs = (struct spec_list *) 0;
1754 /* List of static spec functions. */
1756 static const struct spec_function static_spec_functions[] =
1758 { "getenv", getenv_spec_function },
1759 { "if-exists", if_exists_spec_function },
1760 { "if-exists-else", if_exists_else_spec_function },
1761 { "if-exists-then-else", if_exists_then_else_spec_function },
1762 { "sanitize", sanitize_spec_function },
1763 { "replace-outfile", replace_outfile_spec_function },
1764 { "remove-outfile", remove_outfile_spec_function },
1765 { "version-compare", version_compare_spec_function },
1766 { "include", include_spec_function },
1767 { "find-file", find_file_spec_function },
1768 { "find-plugindir", find_plugindir_spec_function },
1769 { "print-asm-header", print_asm_header_spec_function },
1770 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1771 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1772 { "pass-through-libs", pass_through_libs_spec_func },
1773 { "dumps", dumps_spec_func },
1774 { "gt", greater_than_spec_func },
1775 { "debug-level-gt", debug_level_greater_than_spec_func },
1776 { "dwarf-version-gt", dwarf_version_greater_than_spec_func },
1777 { "fortran-preinclude-file", find_fortran_preinclude_file},
1778 { "join", join_spec_func},
1779 #ifdef EXTRA_SPEC_FUNCTIONS
1780 EXTRA_SPEC_FUNCTIONS
1781 #endif
1782 { 0, 0 }
1785 static int processing_spec_function;
1787 /* Add appropriate libgcc specs to OBSTACK, taking into account
1788 various permutations of -shared-libgcc, -shared, and such. */
1790 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1792 #ifndef USE_LD_AS_NEEDED
1793 #define USE_LD_AS_NEEDED 0
1794 #endif
1796 static void
1797 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1798 const char *static_name, const char *eh_name)
1800 char *buf;
1802 #if USE_LD_AS_NEEDED
1803 buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
1804 "%{!static:%{!static-libgcc:%{!static-pie:"
1805 "%{!shared-libgcc:",
1806 static_name, " " LD_AS_NEEDED_OPTION " ",
1807 shared_name, " " LD_NO_AS_NEEDED_OPTION
1809 "%{shared-libgcc:",
1810 shared_name, "%{!shared: ", static_name, "}"
1811 "}}"
1812 #else
1813 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1814 "%{!static:%{!static-libgcc:"
1815 "%{!shared:"
1816 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1817 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1819 #ifdef LINK_EH_SPEC
1820 "%{shared:"
1821 "%{shared-libgcc:", shared_name, "}"
1822 "%{!shared-libgcc:", static_name, "}"
1824 #else
1825 "%{shared:", shared_name, "}"
1826 #endif
1827 #endif
1828 "}}", NULL);
1830 obstack_grow (obstack, buf, strlen (buf));
1831 free (buf);
1833 #endif /* ENABLE_SHARED_LIBGCC */
1835 /* Initialize the specs lookup routines. */
1837 static void
1838 init_spec (void)
1840 struct spec_list *next = (struct spec_list *) 0;
1841 struct spec_list *sl = (struct spec_list *) 0;
1842 int i;
1844 if (specs)
1845 return; /* Already initialized. */
1847 if (verbose_flag)
1848 fnotice (stderr, "Using built-in specs.\n");
1850 #ifdef EXTRA_SPECS
1851 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1853 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1855 sl = &extra_specs[i];
1856 sl->name = extra_specs_1[i].name;
1857 sl->ptr = extra_specs_1[i].ptr;
1858 sl->next = next;
1859 sl->name_len = strlen (sl->name);
1860 sl->ptr_spec = &sl->ptr;
1861 gcc_assert (sl->ptr_spec != NULL);
1862 sl->default_ptr = sl->ptr;
1863 next = sl;
1865 #endif
1867 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1869 sl = &static_specs[i];
1870 sl->next = next;
1871 next = sl;
1874 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1875 /* ??? If neither -shared-libgcc nor --static-libgcc was
1876 seen, then we should be making an educated guess. Some proposed
1877 heuristics for ELF include:
1879 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1880 program will be doing dynamic loading, which will likely
1881 need the shared libgcc.
1883 (2) If "-ldl", then it's also a fair bet that we're doing
1884 dynamic loading.
1886 (3) For each ET_DYN we're linking against (either through -lfoo
1887 or /some/path/foo.so), check to see whether it or one of
1888 its dependencies depends on a shared libgcc.
1890 (4) If "-shared"
1892 If the runtime is fixed to look for program headers instead
1893 of calling __register_frame_info at all, for each object,
1894 use the shared libgcc if any EH symbol referenced.
1896 If crtstuff is fixed to not invoke __register_frame_info
1897 automatically, for each object, use the shared libgcc if
1898 any non-empty unwind section found.
1900 Doing any of this probably requires invoking an external program to
1901 do the actual object file scanning. */
1903 const char *p = libgcc_spec;
1904 int in_sep = 1;
1906 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1907 when given the proper command line arguments. */
1908 while (*p)
1910 if (in_sep && *p == '-' && startswith (p, "-lgcc"))
1912 init_gcc_specs (&obstack,
1913 "-lgcc_s"
1914 #ifdef USE_LIBUNWIND_EXCEPTIONS
1915 " -lunwind"
1916 #endif
1918 "-lgcc",
1919 "-lgcc_eh"
1920 #ifdef USE_LIBUNWIND_EXCEPTIONS
1921 # ifdef HAVE_LD_STATIC_DYNAMIC
1922 " %{!static:%{!static-pie:" LD_STATIC_OPTION "}} -lunwind"
1923 " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION "}}"
1924 # else
1925 " -lunwind"
1926 # endif
1927 #endif
1930 p += 5;
1931 in_sep = 0;
1933 else if (in_sep && *p == 'l' && startswith (p, "libgcc.a%s"))
1935 /* Ug. We don't know shared library extensions. Hope that
1936 systems that use this form don't do shared libraries. */
1937 init_gcc_specs (&obstack,
1938 "-lgcc_s",
1939 "libgcc.a%s",
1940 "libgcc_eh.a%s"
1941 #ifdef USE_LIBUNWIND_EXCEPTIONS
1942 " -lunwind"
1943 #endif
1945 p += 10;
1946 in_sep = 0;
1948 else
1950 obstack_1grow (&obstack, *p);
1951 in_sep = (*p == ' ');
1952 p += 1;
1956 obstack_1grow (&obstack, '\0');
1957 libgcc_spec = XOBFINISH (&obstack, const char *);
1959 #endif
1960 #ifdef USE_AS_TRADITIONAL_FORMAT
1961 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1963 static const char tf[] = "--traditional-format ";
1964 obstack_grow (&obstack, tf, sizeof (tf) - 1);
1965 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1966 asm_spec = XOBFINISH (&obstack, const char *);
1968 #endif
1970 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1971 defined LINKER_HASH_STYLE
1972 # ifdef LINK_BUILDID_SPEC
1973 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1974 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
1975 # endif
1976 # ifdef LINK_EH_SPEC
1977 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1978 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
1979 # endif
1980 # ifdef LINKER_HASH_STYLE
1981 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1982 before. */
1984 static const char hash_style[] = "--hash-style=";
1985 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1986 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
1987 obstack_1grow (&obstack, ' ');
1989 # endif
1990 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1991 link_spec = XOBFINISH (&obstack, const char *);
1992 #endif
1994 specs = sl;
1997 /* Update the entry for SPEC in the static_specs table to point to VALUE,
1998 ensuring that we free the previous value if necessary. Set alloc_p for the
1999 entry to ALLOC_P: this determines whether we take ownership of VALUE (i.e.
2000 whether we need to free it later on). */
2001 static void
2002 set_static_spec (const char **spec, const char *value, bool alloc_p)
2004 struct spec_list *sl = NULL;
2006 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
2008 if (static_specs[i].ptr_spec == spec)
2010 sl = static_specs + i;
2011 break;
2015 gcc_assert (sl);
2017 if (sl->alloc_p)
2019 const char *old = *spec;
2020 free (const_cast <char *> (old));
2023 *spec = value;
2024 sl->alloc_p = alloc_p;
2027 /* Update a static spec to a new string, taking ownership of that
2028 string's memory. */
2029 static void set_static_spec_owned (const char **spec, const char *val)
2031 return set_static_spec (spec, val, true);
2034 /* Update a static spec to point to a new value, but don't take
2035 ownership of (i.e. don't free) that string. */
2036 static void set_static_spec_shared (const char **spec, const char *val)
2038 return set_static_spec (spec, val, false);
2042 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
2043 removed; If the spec starts with a + then SPEC is added to the end of the
2044 current spec. */
2046 static void
2047 set_spec (const char *name, const char *spec, bool user_p)
2049 struct spec_list *sl;
2050 const char *old_spec;
2051 int name_len = strlen (name);
2052 int i;
2054 /* If this is the first call, initialize the statically allocated specs. */
2055 if (!specs)
2057 struct spec_list *next = (struct spec_list *) 0;
2058 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
2060 sl = &static_specs[i];
2061 sl->next = next;
2062 next = sl;
2064 specs = sl;
2067 /* See if the spec already exists. */
2068 for (sl = specs; sl; sl = sl->next)
2069 if (name_len == sl->name_len && !strcmp (sl->name, name))
2070 break;
2072 if (!sl)
2074 /* Not found - make it. */
2075 sl = XNEW (struct spec_list);
2076 sl->name = xstrdup (name);
2077 sl->name_len = name_len;
2078 sl->ptr_spec = &sl->ptr;
2079 sl->alloc_p = 0;
2080 *(sl->ptr_spec) = "";
2081 sl->next = specs;
2082 sl->default_ptr = NULL;
2083 specs = sl;
2086 old_spec = *(sl->ptr_spec);
2087 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
2088 ? concat (old_spec, spec + 1, NULL)
2089 : xstrdup (spec));
2091 #ifdef DEBUG_SPECS
2092 if (verbose_flag)
2093 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
2094 #endif
2096 /* Free the old spec. */
2097 if (old_spec && sl->alloc_p)
2098 free (CONST_CAST (char *, old_spec));
2100 sl->user_p = user_p;
2101 sl->alloc_p = true;
2104 /* Accumulate a command (program name and args), and run it. */
2106 typedef const char *const_char_p; /* For DEF_VEC_P. */
2108 /* Vector of pointers to arguments in the current line of specifications. */
2109 static vec<const_char_p> argbuf;
2111 /* Likewise, but for the current @file. */
2112 static vec<const_char_p> at_file_argbuf;
2114 /* Whether an @file is currently open. */
2115 static bool in_at_file = false;
2117 /* Were the options -c, -S or -E passed. */
2118 static int have_c = 0;
2120 /* Was the option -o passed. */
2121 static int have_o = 0;
2123 /* Was the option -E passed. */
2124 static int have_E = 0;
2126 /* Pointer to output file name passed in with -o. */
2127 static const char *output_file = 0;
2129 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
2130 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
2131 it here. */
2133 static struct temp_name {
2134 const char *suffix; /* suffix associated with the code. */
2135 int length; /* strlen (suffix). */
2136 int unique; /* Indicates whether %g or %u/%U was used. */
2137 const char *filename; /* associated filename. */
2138 int filename_length; /* strlen (filename). */
2139 struct temp_name *next;
2140 } *temp_names;
2142 /* Number of commands executed so far. */
2144 static int execution_count;
2146 /* Number of commands that exited with a signal. */
2148 static int signal_count;
2150 /* Allocate the argument vector. */
2152 static void
2153 alloc_args (void)
2155 argbuf.create (10);
2156 at_file_argbuf.create (10);
2159 /* Clear out the vector of arguments (after a command is executed). */
2161 static void
2162 clear_args (void)
2164 argbuf.truncate (0);
2165 at_file_argbuf.truncate (0);
2168 /* Add one argument to the vector at the end.
2169 This is done when a space is seen or at the end of the line.
2170 If DELETE_ALWAYS is nonzero, the arg is a filename
2171 and the file should be deleted eventually.
2172 If DELETE_FAILURE is nonzero, the arg is a filename
2173 and the file should be deleted if this compilation fails. */
2175 static void
2176 store_arg (const char *arg, int delete_always, int delete_failure)
2178 if (in_at_file)
2179 at_file_argbuf.safe_push (arg);
2180 else
2181 argbuf.safe_push (arg);
2183 if (delete_always || delete_failure)
2185 const char *p;
2186 /* If the temporary file we should delete is specified as
2187 part of a joined argument extract the filename. */
2188 if (arg[0] == '-'
2189 && (p = strrchr (arg, '=')))
2190 arg = p + 1;
2191 record_temp_file (arg, delete_always, delete_failure);
2195 /* Open a temporary @file into which subsequent arguments will be stored. */
2197 static void
2198 open_at_file (void)
2200 if (in_at_file)
2201 fatal_error (input_location, "cannot open nested response file");
2202 else
2203 in_at_file = true;
2206 /* Create a temporary @file name. */
2208 static char *make_at_file (void)
2210 static int fileno = 0;
2211 char filename[20];
2212 const char *base, *ext;
2214 if (!save_temps_flag)
2215 return make_temp_file ("");
2217 base = dumpbase;
2218 if (!(base && *base))
2219 base = dumpdir;
2220 if (!(base && *base))
2221 base = "a";
2223 sprintf (filename, ".args.%d", fileno++);
2224 ext = filename;
2226 if (base == dumpdir && dumpdir_trailing_dash_added)
2227 ext++;
2229 return concat (base, ext, NULL);
2232 /* Close the temporary @file and add @file to the argument list. */
2234 static void
2235 close_at_file (void)
2237 if (!in_at_file)
2238 fatal_error (input_location, "cannot close nonexistent response file");
2240 in_at_file = false;
2242 const unsigned int n_args = at_file_argbuf.length ();
2243 if (n_args == 0)
2244 return;
2246 char **argv = XALLOCAVEC (char *, n_args + 1);
2247 char *temp_file = make_at_file ();
2248 char *at_argument = concat ("@", temp_file, NULL);
2249 FILE *f = fopen (temp_file, "w");
2250 int status;
2251 unsigned int i;
2253 /* Copy the strings over. */
2254 for (i = 0; i < n_args; i++)
2255 argv[i] = CONST_CAST (char *, at_file_argbuf[i]);
2256 argv[i] = NULL;
2258 at_file_argbuf.truncate (0);
2260 if (f == NULL)
2261 fatal_error (input_location, "could not open temporary response file %s",
2262 temp_file);
2264 status = writeargv (argv, f);
2266 if (status)
2267 fatal_error (input_location,
2268 "could not write to temporary response file %s",
2269 temp_file);
2271 status = fclose (f);
2273 if (status == EOF)
2274 fatal_error (input_location, "could not close temporary response file %s",
2275 temp_file);
2277 store_arg (at_argument, 0, 0);
2279 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
2282 /* Load specs from a file name named FILENAME, replacing occurrences of
2283 various different types of line-endings, \r\n, \n\r and just \r, with
2284 a single \n. */
2286 static char *
2287 load_specs (const char *filename)
2289 int desc;
2290 int readlen;
2291 struct stat statbuf;
2292 char *buffer;
2293 char *buffer_p;
2294 char *specs;
2295 char *specs_p;
2297 if (verbose_flag)
2298 fnotice (stderr, "Reading specs from %s\n", filename);
2300 /* Open and stat the file. */
2301 desc = open (filename, O_RDONLY, 0);
2302 if (desc < 0)
2304 failed:
2305 /* This leaves DESC open, but the OS will save us. */
2306 fatal_error (input_location, "cannot read spec file %qs: %m", filename);
2309 if (stat (filename, &statbuf) < 0)
2310 goto failed;
2312 /* Read contents of file into BUFFER. */
2313 buffer = XNEWVEC (char, statbuf.st_size + 1);
2314 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2315 if (readlen < 0)
2316 goto failed;
2317 buffer[readlen] = 0;
2318 close (desc);
2320 specs = XNEWVEC (char, readlen + 1);
2321 specs_p = specs;
2322 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2324 int skip = 0;
2325 char c = *buffer_p;
2326 if (c == '\r')
2328 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2329 skip = 1;
2330 else if (*(buffer_p + 1) == '\n') /* \r\n */
2331 skip = 1;
2332 else /* \r */
2333 c = '\n';
2335 if (! skip)
2336 *specs_p++ = c;
2338 *specs_p = '\0';
2340 free (buffer);
2341 return (specs);
2344 /* Read compilation specs from a file named FILENAME,
2345 replacing the default ones.
2347 A suffix which starts with `*' is a definition for
2348 one of the machine-specific sub-specs. The "suffix" should be
2349 *asm, *cc1, *cpp, *link, *startfile, etc.
2350 The corresponding spec is stored in asm_spec, etc.,
2351 rather than in the `compilers' vector.
2353 Anything invalid in the file is a fatal error. */
2355 static void
2356 read_specs (const char *filename, bool main_p, bool user_p)
2358 char *buffer;
2359 char *p;
2361 buffer = load_specs (filename);
2363 /* Scan BUFFER for specs, putting them in the vector. */
2364 p = buffer;
2365 while (1)
2367 char *suffix;
2368 char *spec;
2369 char *in, *out, *p1, *p2, *p3;
2371 /* Advance P in BUFFER to the next nonblank nocomment line. */
2372 p = skip_whitespace (p);
2373 if (*p == 0)
2374 break;
2376 /* Is this a special command that starts with '%'? */
2377 /* Don't allow this for the main specs file, since it would
2378 encourage people to overwrite it. */
2379 if (*p == '%' && !main_p)
2381 p1 = p;
2382 while (*p && *p != '\n')
2383 p++;
2385 /* Skip '\n'. */
2386 p++;
2388 if (startswith (p1, "%include")
2389 && (p1[sizeof "%include" - 1] == ' '
2390 || p1[sizeof "%include" - 1] == '\t'))
2392 char *new_filename;
2394 p1 += sizeof ("%include");
2395 while (*p1 == ' ' || *p1 == '\t')
2396 p1++;
2398 if (*p1++ != '<' || p[-2] != '>')
2399 fatal_error (input_location,
2400 "specs %%include syntax malformed after "
2401 "%ld characters",
2402 (long) (p1 - buffer + 1));
2404 p[-2] = '\0';
2405 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2406 read_specs (new_filename ? new_filename : p1, false, user_p);
2407 continue;
2409 else if (startswith (p1, "%include_noerr")
2410 && (p1[sizeof "%include_noerr" - 1] == ' '
2411 || p1[sizeof "%include_noerr" - 1] == '\t'))
2413 char *new_filename;
2415 p1 += sizeof "%include_noerr";
2416 while (*p1 == ' ' || *p1 == '\t')
2417 p1++;
2419 if (*p1++ != '<' || p[-2] != '>')
2420 fatal_error (input_location,
2421 "specs %%include syntax malformed after "
2422 "%ld characters",
2423 (long) (p1 - buffer + 1));
2425 p[-2] = '\0';
2426 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2427 if (new_filename)
2428 read_specs (new_filename, false, user_p);
2429 else if (verbose_flag)
2430 fnotice (stderr, "could not find specs file %s\n", p1);
2431 continue;
2433 else if (startswith (p1, "%rename")
2434 && (p1[sizeof "%rename" - 1] == ' '
2435 || p1[sizeof "%rename" - 1] == '\t'))
2437 int name_len;
2438 struct spec_list *sl;
2439 struct spec_list *newsl;
2441 /* Get original name. */
2442 p1 += sizeof "%rename";
2443 while (*p1 == ' ' || *p1 == '\t')
2444 p1++;
2446 if (! ISALPHA ((unsigned char) *p1))
2447 fatal_error (input_location,
2448 "specs %%rename syntax malformed after "
2449 "%ld characters",
2450 (long) (p1 - buffer));
2452 p2 = p1;
2453 while (*p2 && !ISSPACE ((unsigned char) *p2))
2454 p2++;
2456 if (*p2 != ' ' && *p2 != '\t')
2457 fatal_error (input_location,
2458 "specs %%rename syntax malformed after "
2459 "%ld characters",
2460 (long) (p2 - buffer));
2462 name_len = p2 - p1;
2463 *p2++ = '\0';
2464 while (*p2 == ' ' || *p2 == '\t')
2465 p2++;
2467 if (! ISALPHA ((unsigned char) *p2))
2468 fatal_error (input_location,
2469 "specs %%rename syntax malformed after "
2470 "%ld characters",
2471 (long) (p2 - buffer));
2473 /* Get new spec name. */
2474 p3 = p2;
2475 while (*p3 && !ISSPACE ((unsigned char) *p3))
2476 p3++;
2478 if (p3 != p - 1)
2479 fatal_error (input_location,
2480 "specs %%rename syntax malformed after "
2481 "%ld characters",
2482 (long) (p3 - buffer));
2483 *p3 = '\0';
2485 for (sl = specs; sl; sl = sl->next)
2486 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2487 break;
2489 if (!sl)
2490 fatal_error (input_location,
2491 "specs %s spec was not found to be renamed", p1);
2493 if (strcmp (p1, p2) == 0)
2494 continue;
2496 for (newsl = specs; newsl; newsl = newsl->next)
2497 if (strcmp (newsl->name, p2) == 0)
2498 fatal_error (input_location,
2499 "%s: attempt to rename spec %qs to "
2500 "already defined spec %qs",
2501 filename, p1, p2);
2503 if (verbose_flag)
2505 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
2506 #ifdef DEBUG_SPECS
2507 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2508 #endif
2511 set_spec (p2, *(sl->ptr_spec), user_p);
2512 if (sl->alloc_p)
2513 free (CONST_CAST (char *, *(sl->ptr_spec)));
2515 *(sl->ptr_spec) = "";
2516 sl->alloc_p = 0;
2517 continue;
2519 else
2520 fatal_error (input_location,
2521 "specs unknown %% command after %ld characters",
2522 (long) (p1 - buffer));
2525 /* Find the colon that should end the suffix. */
2526 p1 = p;
2527 while (*p1 && *p1 != ':' && *p1 != '\n')
2528 p1++;
2530 /* The colon shouldn't be missing. */
2531 if (*p1 != ':')
2532 fatal_error (input_location,
2533 "specs file malformed after %ld characters",
2534 (long) (p1 - buffer));
2536 /* Skip back over trailing whitespace. */
2537 p2 = p1;
2538 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2539 p2--;
2541 /* Copy the suffix to a string. */
2542 suffix = save_string (p, p2 - p);
2543 /* Find the next line. */
2544 p = skip_whitespace (p1 + 1);
2545 if (p[1] == 0)
2546 fatal_error (input_location,
2547 "specs file malformed after %ld characters",
2548 (long) (p - buffer));
2550 p1 = p;
2551 /* Find next blank line or end of string. */
2552 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2553 p1++;
2555 /* Specs end at the blank line and do not include the newline. */
2556 spec = save_string (p, p1 - p);
2557 p = p1;
2559 /* Delete backslash-newline sequences from the spec. */
2560 in = spec;
2561 out = spec;
2562 while (*in != 0)
2564 if (in[0] == '\\' && in[1] == '\n')
2565 in += 2;
2566 else if (in[0] == '#')
2567 while (*in && *in != '\n')
2568 in++;
2570 else
2571 *out++ = *in++;
2573 *out = 0;
2575 if (suffix[0] == '*')
2577 if (! strcmp (suffix, "*link_command"))
2578 link_command_spec = spec;
2579 else
2581 set_spec (suffix + 1, spec, user_p);
2582 free (spec);
2585 else
2587 /* Add this pair to the vector. */
2588 compilers
2589 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2591 compilers[n_compilers].suffix = suffix;
2592 compilers[n_compilers].spec = spec;
2593 n_compilers++;
2594 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2597 if (*suffix == 0)
2598 link_command_spec = spec;
2601 if (link_command_spec == 0)
2602 fatal_error (input_location, "spec file has no spec for linking");
2604 XDELETEVEC (buffer);
2607 /* Record the names of temporary files we tell compilers to write,
2608 and delete them at the end of the run. */
2610 /* This is the common prefix we use to make temp file names.
2611 It is chosen once for each run of this program.
2612 It is substituted into a spec by %g or %j.
2613 Thus, all temp file names contain this prefix.
2614 In practice, all temp file names start with this prefix.
2616 This prefix comes from the envvar TMPDIR if it is defined;
2617 otherwise, from the P_tmpdir macro if that is defined;
2618 otherwise, in /usr/tmp or /tmp;
2619 or finally the current directory if all else fails. */
2621 static const char *temp_filename;
2623 /* Length of the prefix. */
2625 static int temp_filename_length;
2627 /* Define the list of temporary files to delete. */
2629 struct temp_file
2631 const char *name;
2632 struct temp_file *next;
2635 /* Queue of files to delete on success or failure of compilation. */
2636 static struct temp_file *always_delete_queue;
2637 /* Queue of files to delete on failure of compilation. */
2638 static struct temp_file *failure_delete_queue;
2640 /* Record FILENAME as a file to be deleted automatically.
2641 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2642 otherwise delete it in any case.
2643 FAIL_DELETE nonzero means delete it if a compilation step fails;
2644 otherwise delete it in any case. */
2646 void
2647 record_temp_file (const char *filename, int always_delete, int fail_delete)
2649 char *const name = xstrdup (filename);
2651 if (always_delete)
2653 struct temp_file *temp;
2654 for (temp = always_delete_queue; temp; temp = temp->next)
2655 if (! filename_cmp (name, temp->name))
2657 free (name);
2658 goto already1;
2661 temp = XNEW (struct temp_file);
2662 temp->next = always_delete_queue;
2663 temp->name = name;
2664 always_delete_queue = temp;
2666 already1:;
2669 if (fail_delete)
2671 struct temp_file *temp;
2672 for (temp = failure_delete_queue; temp; temp = temp->next)
2673 if (! filename_cmp (name, temp->name))
2675 free (name);
2676 goto already2;
2679 temp = XNEW (struct temp_file);
2680 temp->next = failure_delete_queue;
2681 temp->name = name;
2682 failure_delete_queue = temp;
2684 already2:;
2688 /* Delete all the temporary files whose names we previously recorded. */
2690 #ifndef DELETE_IF_ORDINARY
2691 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2692 do \
2694 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2695 if (unlink (NAME) < 0) \
2696 if (VERBOSE_FLAG) \
2697 error ("%s: %m", (NAME)); \
2698 } while (0)
2699 #endif
2701 static void
2702 delete_if_ordinary (const char *name)
2704 struct stat st;
2705 #ifdef DEBUG
2706 int i, c;
2708 printf ("Delete %s? (y or n) ", name);
2709 fflush (stdout);
2710 i = getchar ();
2711 if (i != '\n')
2712 while ((c = getchar ()) != '\n' && c != EOF)
2715 if (i == 'y' || i == 'Y')
2716 #endif /* DEBUG */
2717 DELETE_IF_ORDINARY (name, st, verbose_flag);
2720 static void
2721 delete_temp_files (void)
2723 struct temp_file *temp;
2725 for (temp = always_delete_queue; temp; temp = temp->next)
2726 delete_if_ordinary (temp->name);
2727 always_delete_queue = 0;
2730 /* Delete all the files to be deleted on error. */
2732 static void
2733 delete_failure_queue (void)
2735 struct temp_file *temp;
2737 for (temp = failure_delete_queue; temp; temp = temp->next)
2738 delete_if_ordinary (temp->name);
2741 static void
2742 clear_failure_queue (void)
2744 failure_delete_queue = 0;
2747 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2748 returns non-NULL.
2749 If DO_MULTI is true iterate over the paths twice, first with multilib
2750 suffix then without, otherwise iterate over the paths once without
2751 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2752 to avoid visiting the same path twice, but we could do better. For
2753 instance, /usr/lib/../lib is considered different from /usr/lib.
2754 At least EXTRA_SPACE chars past the end of the path passed to
2755 CALLBACK are available for use by the callback.
2756 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2758 Returns the value returned by CALLBACK. */
2760 static void *
2761 for_each_path (const struct path_prefix *paths,
2762 bool do_multi,
2763 size_t extra_space,
2764 void *(*callback) (char *, void *),
2765 void *callback_info)
2767 struct prefix_list *pl;
2768 const char *multi_dir = NULL;
2769 const char *multi_os_dir = NULL;
2770 const char *multiarch_suffix = NULL;
2771 const char *multi_suffix;
2772 const char *just_multi_suffix;
2773 char *path = NULL;
2774 void *ret = NULL;
2775 bool skip_multi_dir = false;
2776 bool skip_multi_os_dir = false;
2778 multi_suffix = machine_suffix;
2779 just_multi_suffix = just_machine_suffix;
2780 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2782 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2783 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2784 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2786 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2787 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2788 if (multiarch_dir)
2789 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
2791 while (1)
2793 size_t multi_dir_len = 0;
2794 size_t multi_os_dir_len = 0;
2795 size_t multiarch_len = 0;
2796 size_t suffix_len;
2797 size_t just_suffix_len;
2798 size_t len;
2800 if (multi_dir)
2801 multi_dir_len = strlen (multi_dir);
2802 if (multi_os_dir)
2803 multi_os_dir_len = strlen (multi_os_dir);
2804 if (multiarch_suffix)
2805 multiarch_len = strlen (multiarch_suffix);
2806 suffix_len = strlen (multi_suffix);
2807 just_suffix_len = strlen (just_multi_suffix);
2809 if (path == NULL)
2811 len = paths->max_len + extra_space + 1;
2812 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
2813 path = XNEWVEC (char, len);
2816 for (pl = paths->plist; pl != 0; pl = pl->next)
2818 len = strlen (pl->prefix);
2819 memcpy (path, pl->prefix, len);
2821 /* Look first in MACHINE/VERSION subdirectory. */
2822 if (!skip_multi_dir)
2824 memcpy (path + len, multi_suffix, suffix_len + 1);
2825 ret = callback (path, callback_info);
2826 if (ret)
2827 break;
2830 /* Some paths are tried with just the machine (ie. target)
2831 subdir. This is used for finding as, ld, etc. */
2832 if (!skip_multi_dir
2833 && pl->require_machine_suffix == 2)
2835 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2836 ret = callback (path, callback_info);
2837 if (ret)
2838 break;
2841 /* Now try the multiarch path. */
2842 if (!skip_multi_dir
2843 && !pl->require_machine_suffix && multiarch_dir)
2845 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2846 ret = callback (path, callback_info);
2847 if (ret)
2848 break;
2851 /* Now try the base path. */
2852 if (!pl->require_machine_suffix
2853 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2855 const char *this_multi;
2856 size_t this_multi_len;
2858 if (pl->os_multilib)
2860 this_multi = multi_os_dir;
2861 this_multi_len = multi_os_dir_len;
2863 else
2865 this_multi = multi_dir;
2866 this_multi_len = multi_dir_len;
2869 if (this_multi_len)
2870 memcpy (path + len, this_multi, this_multi_len + 1);
2871 else
2872 path[len] = '\0';
2874 ret = callback (path, callback_info);
2875 if (ret)
2876 break;
2879 if (pl)
2880 break;
2882 if (multi_dir == NULL && multi_os_dir == NULL)
2883 break;
2885 /* Run through the paths again, this time without multilibs.
2886 Don't repeat any we have already seen. */
2887 if (multi_dir)
2889 free (CONST_CAST (char *, multi_dir));
2890 multi_dir = NULL;
2891 free (CONST_CAST (char *, multi_suffix));
2892 multi_suffix = machine_suffix;
2893 free (CONST_CAST (char *, just_multi_suffix));
2894 just_multi_suffix = just_machine_suffix;
2896 else
2897 skip_multi_dir = true;
2898 if (multi_os_dir)
2900 free (CONST_CAST (char *, multi_os_dir));
2901 multi_os_dir = NULL;
2903 else
2904 skip_multi_os_dir = true;
2907 if (multi_dir)
2909 free (CONST_CAST (char *, multi_dir));
2910 free (CONST_CAST (char *, multi_suffix));
2911 free (CONST_CAST (char *, just_multi_suffix));
2913 if (multi_os_dir)
2914 free (CONST_CAST (char *, multi_os_dir));
2915 if (ret != path)
2916 free (path);
2917 return ret;
2920 /* Callback for build_search_list. Adds path to obstack being built. */
2922 struct add_to_obstack_info {
2923 struct obstack *ob;
2924 bool check_dir;
2925 bool first_time;
2928 static void *
2929 add_to_obstack (char *path, void *data)
2931 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2933 if (info->check_dir && !is_directory (path, false))
2934 return NULL;
2936 if (!info->first_time)
2937 obstack_1grow (info->ob, PATH_SEPARATOR);
2939 obstack_grow (info->ob, path, strlen (path));
2941 info->first_time = false;
2942 return NULL;
2945 /* Add or change the value of an environment variable, outputting the
2946 change to standard error if in verbose mode. */
2947 static void
2948 xputenv (const char *string)
2950 env.xput (string);
2953 /* Build a list of search directories from PATHS.
2954 PREFIX is a string to prepend to the list.
2955 If CHECK_DIR_P is true we ensure the directory exists.
2956 If DO_MULTI is true, multilib paths are output first, then
2957 non-multilib paths.
2958 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2959 It is also used by the --print-search-dirs flag. */
2961 static char *
2962 build_search_list (const struct path_prefix *paths, const char *prefix,
2963 bool check_dir, bool do_multi)
2965 struct add_to_obstack_info info;
2967 info.ob = &collect_obstack;
2968 info.check_dir = check_dir;
2969 info.first_time = true;
2971 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2972 obstack_1grow (&collect_obstack, '=');
2974 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2976 obstack_1grow (&collect_obstack, '\0');
2977 return XOBFINISH (&collect_obstack, char *);
2980 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2981 for collect. */
2983 static void
2984 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2985 bool do_multi)
2987 xputenv (build_search_list (paths, env_var, true, do_multi));
2990 /* Check whether NAME can be accessed in MODE. This is like access,
2991 except that it never considers directories to be executable. */
2993 static int
2994 access_check (const char *name, int mode)
2996 if (mode == X_OK)
2998 struct stat st;
3000 if (stat (name, &st) < 0
3001 || S_ISDIR (st.st_mode))
3002 return -1;
3005 return access (name, mode);
3008 /* Callback for find_a_file. Appends the file name to the directory
3009 path. If the resulting file exists in the right mode, return the
3010 full pathname to the file. */
3012 struct file_at_path_info {
3013 const char *name;
3014 const char *suffix;
3015 int name_len;
3016 int suffix_len;
3017 int mode;
3020 static void *
3021 file_at_path (char *path, void *data)
3023 struct file_at_path_info *info = (struct file_at_path_info *) data;
3024 size_t len = strlen (path);
3026 memcpy (path + len, info->name, info->name_len);
3027 len += info->name_len;
3029 /* Some systems have a suffix for executable files.
3030 So try appending that first. */
3031 if (info->suffix_len)
3033 memcpy (path + len, info->suffix, info->suffix_len + 1);
3034 if (access_check (path, info->mode) == 0)
3035 return path;
3038 path[len] = '\0';
3039 if (access_check (path, info->mode) == 0)
3040 return path;
3042 return NULL;
3045 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
3046 access to check permissions. If DO_MULTI is true, search multilib
3047 paths then non-multilib paths, otherwise do not search multilib paths.
3048 Return 0 if not found, otherwise return its name, allocated with malloc. */
3050 static char *
3051 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
3052 bool do_multi)
3054 struct file_at_path_info info;
3056 /* Find the filename in question (special case for absolute paths). */
3058 if (IS_ABSOLUTE_PATH (name))
3060 if (access (name, mode) == 0)
3061 return xstrdup (name);
3063 return NULL;
3066 info.name = name;
3067 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
3068 info.name_len = strlen (info.name);
3069 info.suffix_len = strlen (info.suffix);
3070 info.mode = mode;
3072 return (char*) for_each_path (pprefix, do_multi,
3073 info.name_len + info.suffix_len,
3074 file_at_path, &info);
3077 /* Specialization of find_a_file for programs that also takes into account
3078 configure-specified default programs. */
3080 static char*
3081 find_a_program (const char *name)
3083 /* Do not search if default matches query. */
3085 #ifdef DEFAULT_ASSEMBLER
3086 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, X_OK) == 0)
3087 return xstrdup (DEFAULT_ASSEMBLER);
3088 #endif
3090 #ifdef DEFAULT_LINKER
3091 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, X_OK) == 0)
3092 return xstrdup (DEFAULT_LINKER);
3093 #endif
3095 #ifdef DEFAULT_DSYMUTIL
3096 if (! strcmp (name, "dsymutil") && access (DEFAULT_DSYMUTIL, X_OK) == 0)
3097 return xstrdup (DEFAULT_DSYMUTIL);
3098 #endif
3100 return find_a_file (&exec_prefixes, name, X_OK, false);
3103 /* Ranking of prefixes in the sort list. -B prefixes are put before
3104 all others. */
3106 enum path_prefix_priority
3108 PREFIX_PRIORITY_B_OPT,
3109 PREFIX_PRIORITY_LAST
3112 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
3113 order according to PRIORITY. Within each PRIORITY, new entries are
3114 appended.
3116 If WARN is nonzero, we will warn if no file is found
3117 through this prefix. WARN should point to an int
3118 which will be set to 1 if this entry is used.
3120 COMPONENT is the value to be passed to update_path.
3122 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
3123 the complete value of machine_suffix.
3124 2 means try both machine_suffix and just_machine_suffix. */
3126 static void
3127 add_prefix (struct path_prefix *pprefix, const char *prefix,
3128 const char *component, /* enum prefix_priority */ int priority,
3129 int require_machine_suffix, int os_multilib)
3131 struct prefix_list *pl, **prev;
3132 int len;
3134 for (prev = &pprefix->plist;
3135 (*prev) != NULL && (*prev)->priority <= priority;
3136 prev = &(*prev)->next)
3139 /* Keep track of the longest prefix. */
3141 prefix = update_path (prefix, component);
3142 len = strlen (prefix);
3143 if (len > pprefix->max_len)
3144 pprefix->max_len = len;
3146 pl = XNEW (struct prefix_list);
3147 pl->prefix = prefix;
3148 pl->require_machine_suffix = require_machine_suffix;
3149 pl->priority = priority;
3150 pl->os_multilib = os_multilib;
3152 /* Insert after PREV. */
3153 pl->next = (*prev);
3154 (*prev) = pl;
3157 /* Same as add_prefix, but prepending target_system_root to prefix. */
3158 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
3159 static void
3160 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
3161 const char *component,
3162 /* enum prefix_priority */ int priority,
3163 int require_machine_suffix, int os_multilib)
3165 if (!IS_ABSOLUTE_PATH (prefix))
3166 fatal_error (input_location, "system path %qs is not absolute", prefix);
3168 if (target_system_root)
3170 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
3171 size_t sysroot_len = strlen (target_system_root);
3173 if (sysroot_len > 0
3174 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
3175 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3177 if (target_sysroot_suffix)
3178 prefix = concat (sysroot_no_trailing_dir_separator,
3179 target_sysroot_suffix, prefix, NULL);
3180 else
3181 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
3183 free (sysroot_no_trailing_dir_separator);
3185 /* We have to override this because GCC's notion of sysroot
3186 moves along with GCC. */
3187 component = "GCC";
3190 add_prefix (pprefix, prefix, component, priority,
3191 require_machine_suffix, os_multilib);
3194 /* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */
3196 static void
3197 add_sysrooted_hdrs_prefix (struct path_prefix *pprefix, const char *prefix,
3198 const char *component,
3199 /* enum prefix_priority */ int priority,
3200 int require_machine_suffix, int os_multilib)
3202 if (!IS_ABSOLUTE_PATH (prefix))
3203 fatal_error (input_location, "system path %qs is not absolute", prefix);
3205 if (target_system_root)
3207 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
3208 size_t sysroot_len = strlen (target_system_root);
3210 if (sysroot_len > 0
3211 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
3212 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3214 if (target_sysroot_hdrs_suffix)
3215 prefix = concat (sysroot_no_trailing_dir_separator,
3216 target_sysroot_hdrs_suffix, prefix, NULL);
3217 else
3218 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
3220 free (sysroot_no_trailing_dir_separator);
3222 /* We have to override this because GCC's notion of sysroot
3223 moves along with GCC. */
3224 component = "GCC";
3227 add_prefix (pprefix, prefix, component, priority,
3228 require_machine_suffix, os_multilib);
3232 /* Execute the command specified by the arguments on the current line of spec.
3233 When using pipes, this includes several piped-together commands
3234 with `|' between them.
3236 Return 0 if successful, -1 if failed. */
3238 static int
3239 execute (void)
3241 int i;
3242 int n_commands; /* # of command. */
3243 char *string;
3244 struct pex_obj *pex;
3245 struct command
3247 const char *prog; /* program name. */
3248 const char **argv; /* vector of args. */
3250 const char *arg;
3252 struct command *commands; /* each command buffer with above info. */
3254 gcc_assert (!processing_spec_function);
3256 if (wrapper_string)
3258 string = find_a_program (argbuf[0]);
3259 if (string)
3260 argbuf[0] = string;
3261 insert_wrapper (wrapper_string);
3264 /* Count # of piped commands. */
3265 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3266 if (strcmp (arg, "|") == 0)
3267 n_commands++;
3269 /* Get storage for each command. */
3270 commands = XALLOCAVEC (struct command, n_commands);
3272 /* Split argbuf into its separate piped processes,
3273 and record info about each one.
3274 Also search for the programs that are to be run. */
3276 argbuf.safe_push (0);
3278 commands[0].prog = argbuf[0]; /* first command. */
3279 commands[0].argv = argbuf.address ();
3281 if (!wrapper_string)
3283 string = find_a_program(commands[0].prog);
3284 if (string)
3285 commands[0].argv[0] = string;
3288 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3289 if (arg && strcmp (arg, "|") == 0)
3290 { /* each command. */
3291 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3292 fatal_error (input_location, "%<-pipe%> not supported");
3293 #endif
3294 argbuf[i] = 0; /* Termination of command args. */
3295 commands[n_commands].prog = argbuf[i + 1];
3296 commands[n_commands].argv
3297 = &(argbuf.address ())[i + 1];
3298 string = find_a_program(commands[n_commands].prog);
3299 if (string)
3300 commands[n_commands].argv[0] = string;
3301 n_commands++;
3304 /* If -v, print what we are about to do, and maybe query. */
3306 if (verbose_flag)
3308 /* For help listings, put a blank line between sub-processes. */
3309 if (print_help_list)
3310 fputc ('\n', stderr);
3312 /* Print each piped command as a separate line. */
3313 for (i = 0; i < n_commands; i++)
3315 const char *const *j;
3317 if (verbose_only_flag)
3319 for (j = commands[i].argv; *j; j++)
3321 const char *p;
3322 for (p = *j; *p; ++p)
3323 if (!ISALNUM ((unsigned char) *p)
3324 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
3325 break;
3326 if (*p || !*j)
3328 fprintf (stderr, " \"");
3329 for (p = *j; *p; ++p)
3331 if (*p == '"' || *p == '\\' || *p == '$')
3332 fputc ('\\', stderr);
3333 fputc (*p, stderr);
3335 fputc ('"', stderr);
3337 /* If it's empty, print "". */
3338 else if (!**j)
3339 fprintf (stderr, " \"\"");
3340 else
3341 fprintf (stderr, " %s", *j);
3344 else
3345 for (j = commands[i].argv; *j; j++)
3346 /* If it's empty, print "". */
3347 if (!**j)
3348 fprintf (stderr, " \"\"");
3349 else
3350 fprintf (stderr, " %s", *j);
3352 /* Print a pipe symbol after all but the last command. */
3353 if (i + 1 != n_commands)
3354 fprintf (stderr, " |");
3355 fprintf (stderr, "\n");
3357 fflush (stderr);
3358 if (verbose_only_flag != 0)
3360 /* verbose_only_flag should act as if the spec was
3361 executed, so increment execution_count before
3362 returning. This prevents spurious warnings about
3363 unused linker input files, etc. */
3364 execution_count++;
3365 return 0;
3367 #ifdef DEBUG
3368 fnotice (stderr, "\nGo ahead? (y or n) ");
3369 fflush (stderr);
3370 i = getchar ();
3371 if (i != '\n')
3372 while (getchar () != '\n')
3375 if (i != 'y' && i != 'Y')
3376 return 0;
3377 #endif /* DEBUG */
3380 #ifdef ENABLE_VALGRIND_CHECKING
3381 /* Run the each command through valgrind. To simplify prepending the
3382 path to valgrind and the option "-q" (for quiet operation unless
3383 something triggers), we allocate a separate argv array. */
3385 for (i = 0; i < n_commands; i++)
3387 const char **argv;
3388 int argc;
3389 int j;
3391 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3394 argv = XALLOCAVEC (const char *, argc + 3);
3396 argv[0] = VALGRIND_PATH;
3397 argv[1] = "-q";
3398 for (j = 2; j < argc + 2; j++)
3399 argv[j] = commands[i].argv[j - 2];
3400 argv[j] = NULL;
3402 commands[i].argv = argv;
3403 commands[i].prog = argv[0];
3405 #endif
3407 /* Run each piped subprocess. */
3409 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3410 ? PEX_RECORD_TIMES : 0),
3411 progname, temp_filename);
3412 if (pex == NULL)
3413 fatal_error (input_location, "%<pex_init%> failed: %m");
3415 for (i = 0; i < n_commands; i++)
3417 const char *errmsg;
3418 int err;
3419 const char *string = commands[i].argv[0];
3421 errmsg = pex_run (pex,
3422 ((i + 1 == n_commands ? PEX_LAST : 0)
3423 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3424 string, CONST_CAST (char **, commands[i].argv),
3425 NULL, NULL, &err);
3426 if (errmsg != NULL)
3428 errno = err;
3429 fatal_error (input_location,
3430 err ? G_("cannot execute %qs: %s: %m")
3431 : G_("cannot execute %qs: %s"),
3432 string, errmsg);
3435 if (i && string != commands[i].prog)
3436 free (CONST_CAST (char *, string));
3439 execution_count++;
3441 /* Wait for all the subprocesses to finish. */
3444 int *statuses;
3445 struct pex_time *times = NULL;
3446 int ret_code = 0;
3448 statuses = XALLOCAVEC (int, n_commands);
3449 if (!pex_get_status (pex, n_commands, statuses))
3450 fatal_error (input_location, "failed to get exit status: %m");
3452 if (report_times || report_times_to_file)
3454 times = XALLOCAVEC (struct pex_time, n_commands);
3455 if (!pex_get_times (pex, n_commands, times))
3456 fatal_error (input_location, "failed to get process times: %m");
3459 pex_free (pex);
3461 for (i = 0; i < n_commands; ++i)
3463 int status = statuses[i];
3465 if (WIFSIGNALED (status))
3466 switch (WTERMSIG (status))
3468 case SIGINT:
3469 case SIGTERM:
3470 /* SIGQUIT and SIGKILL are not available on MinGW. */
3471 #ifdef SIGQUIT
3472 case SIGQUIT:
3473 #endif
3474 #ifdef SIGKILL
3475 case SIGKILL:
3476 #endif
3477 /* The user (or environment) did something to the
3478 inferior. Making this an ICE confuses the user into
3479 thinking there's a compiler bug. Much more likely is
3480 the user or OOM killer nuked it. */
3481 fatal_error (input_location,
3482 "%s signal terminated program %s",
3483 strsignal (WTERMSIG (status)),
3484 commands[i].prog);
3485 break;
3487 #ifdef SIGPIPE
3488 case SIGPIPE:
3489 /* SIGPIPE is a special case. It happens in -pipe mode
3490 when the compiler dies before the preprocessor is
3491 done, or the assembler dies before the compiler is
3492 done. There's generally been an error already, and
3493 this is just fallout. So don't generate another
3494 error unless we would otherwise have succeeded. */
3495 if (signal_count || greatest_status >= MIN_FATAL_STATUS)
3497 signal_count++;
3498 ret_code = -1;
3499 break;
3501 #endif
3502 /* FALLTHROUGH */
3504 default:
3505 /* The inferior failed to catch the signal. */
3506 internal_error_no_backtrace ("%s signal terminated program %s",
3507 strsignal (WTERMSIG (status)),
3508 commands[i].prog);
3510 else if (WIFEXITED (status)
3511 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3513 /* For ICEs in cc1, cc1obj, cc1plus see if it is
3514 reproducible or not. */
3515 const char *p;
3516 if (flag_report_bug
3517 && WEXITSTATUS (status) == ICE_EXIT_CODE
3518 && i == 0
3519 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR))
3520 && startswith (p + 1, "cc1"))
3521 try_generate_repro (commands[0].argv);
3522 if (WEXITSTATUS (status) > greatest_status)
3523 greatest_status = WEXITSTATUS (status);
3524 ret_code = -1;
3527 if (report_times || report_times_to_file)
3529 struct pex_time *pt = &times[i];
3530 double ut, st;
3532 ut = ((double) pt->user_seconds
3533 + (double) pt->user_microseconds / 1.0e6);
3534 st = ((double) pt->system_seconds
3535 + (double) pt->system_microseconds / 1.0e6);
3537 if (ut + st != 0)
3539 if (report_times)
3540 fnotice (stderr, "# %s %.2f %.2f\n",
3541 commands[i].prog, ut, st);
3543 if (report_times_to_file)
3545 int c = 0;
3546 const char *const *j;
3548 fprintf (report_times_to_file, "%g %g", ut, st);
3550 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3552 const char *p;
3553 for (p = *j; *p; ++p)
3554 if (*p == '"' || *p == '\\' || *p == '$'
3555 || ISSPACE (*p))
3556 break;
3558 if (*p)
3560 fprintf (report_times_to_file, " \"");
3561 for (p = *j; *p; ++p)
3563 if (*p == '"' || *p == '\\' || *p == '$')
3564 fputc ('\\', report_times_to_file);
3565 fputc (*p, report_times_to_file);
3567 fputc ('"', report_times_to_file);
3569 else
3570 fprintf (report_times_to_file, " %s", *j);
3573 fputc ('\n', report_times_to_file);
3579 if (commands[0].argv[0] != commands[0].prog)
3580 free (CONST_CAST (char *, commands[0].argv[0]));
3582 return ret_code;
3586 static struct switchstr *switches;
3588 static int n_switches;
3590 static int n_switches_alloc;
3592 /* Set to zero if -fcompare-debug is disabled, positive if it's
3593 enabled and we're running the first compilation, negative if it's
3594 enabled and we're running the second compilation. For most of the
3595 time, it's in the range -1..1, but it can be temporarily set to 2
3596 or 3 to indicate that the -fcompare-debug flags didn't come from
3597 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3598 variable, until a synthesized -fcompare-debug flag is added to the
3599 command line. */
3600 int compare_debug;
3602 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3603 int compare_debug_second;
3605 /* Set to the flags that should be passed to the second compilation in
3606 a -fcompare-debug compilation. */
3607 const char *compare_debug_opt;
3609 static struct switchstr *switches_debug_check[2];
3611 static int n_switches_debug_check[2];
3613 static int n_switches_alloc_debug_check[2];
3615 static char *debug_check_temp_file[2];
3617 /* Language is one of three things:
3619 1) The name of a real programming language.
3620 2) NULL, indicating that no one has figured out
3621 what it is yet.
3622 3) '*', indicating that the file should be passed
3623 to the linker. */
3624 struct infile
3626 const char *name;
3627 const char *language;
3628 struct compiler *incompiler;
3629 bool compiled;
3630 bool preprocessed;
3633 /* Also a vector of input files specified. */
3635 static struct infile *infiles;
3637 int n_infiles;
3639 static int n_infiles_alloc;
3641 /* True if undefined environment variables encountered during spec processing
3642 are ok to ignore, typically when we're running for --help or --version. */
3644 static bool spec_undefvar_allowed;
3646 /* True if multiple input files are being compiled to a single
3647 assembly file. */
3649 static bool combine_inputs;
3651 /* This counts the number of libraries added by lang_specific_driver, so that
3652 we can tell if there were any user supplied any files or libraries. */
3654 static int added_libraries;
3656 /* And a vector of corresponding output files is made up later. */
3658 const char **outfiles;
3660 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3662 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3663 is true if we should look for an executable suffix. DO_OBJ
3664 is true if we should look for an object suffix. */
3666 static const char *
3667 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3668 int do_obj ATTRIBUTE_UNUSED)
3670 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3671 int i;
3672 #endif
3673 int len;
3675 if (name == NULL)
3676 return NULL;
3678 len = strlen (name);
3680 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3681 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3682 if (do_obj && len > 2
3683 && name[len - 2] == '.'
3684 && name[len - 1] == 'o')
3686 obstack_grow (&obstack, name, len - 2);
3687 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3688 name = XOBFINISH (&obstack, const char *);
3690 #endif
3692 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3693 /* If there is no filetype, make it the executable suffix (which includes
3694 the "."). But don't get confused if we have just "-o". */
3695 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || not_actual_file_p (name))
3696 return name;
3698 for (i = len - 1; i >= 0; i--)
3699 if (IS_DIR_SEPARATOR (name[i]))
3700 break;
3702 for (i++; i < len; i++)
3703 if (name[i] == '.')
3704 return name;
3706 obstack_grow (&obstack, name, len);
3707 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3708 strlen (TARGET_EXECUTABLE_SUFFIX));
3709 name = XOBFINISH (&obstack, const char *);
3710 #endif
3712 return name;
3714 #endif
3716 /* Display the command line switches accepted by gcc. */
3717 static void
3718 display_help (void)
3720 printf (_("Usage: %s [options] file...\n"), progname);
3721 fputs (_("Options:\n"), stdout);
3723 fputs (_(" -pass-exit-codes Exit with highest error code from a phase.\n"), stdout);
3724 fputs (_(" --help Display this information.\n"), stdout);
3725 fputs (_(" --target-help Display target specific command line options "
3726 "(including assembler and linker options).\n"), stdout);
3727 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"), stdout);
3728 fputs (_(" Display specific types of command line options.\n"), stdout);
3729 if (! verbose_flag)
3730 fputs (_(" (Use '-v --help' to display command line options of sub-processes).\n"), stdout);
3731 fputs (_(" --version Display compiler version information.\n"), stdout);
3732 fputs (_(" -dumpspecs Display all of the built in spec strings.\n"), stdout);
3733 fputs (_(" -dumpversion Display the version of the compiler.\n"), stdout);
3734 fputs (_(" -dumpmachine Display the compiler's target processor.\n"), stdout);
3735 fputs (_(" -foffload=<targets> Specify offloading targets.\n"), stdout);
3736 fputs (_(" -print-search-dirs Display the directories in the compiler's search path.\n"), stdout);
3737 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library.\n"), stdout);
3738 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>.\n"), stdout);
3739 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n"), stdout);
3740 fputs (_("\
3741 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3742 a component in the library path.\n"), stdout);
3743 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc.\n"), stdout);
3744 fputs (_("\
3745 -print-multi-lib Display the mapping between command line options and\n\
3746 multiple library search directories.\n"), stdout);
3747 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries.\n"), stdout);
3748 fputs (_(" -print-sysroot Display the target libraries directory.\n"), stdout);
3749 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"), stdout);
3750 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler.\n"), stdout);
3751 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n"), stdout);
3752 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker.\n"), stdout);
3753 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler.\n"), stdout);
3754 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n"), stdout);
3755 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker.\n"), stdout);
3756 fputs (_(" -save-temps Do not delete intermediate files.\n"), stdout);
3757 fputs (_(" -save-temps=<arg> Do not delete intermediate files.\n"), stdout);
3758 fputs (_("\
3759 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3760 prefixes to other gcc components.\n"), stdout);
3761 fputs (_(" -pipe Use pipes rather than intermediate files.\n"), stdout);
3762 fputs (_(" -time Time the execution of each subprocess.\n"), stdout);
3763 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>.\n"), stdout);
3764 fputs (_(" -std=<standard> Assume that the input sources are for <standard>.\n"), stdout);
3765 fputs (_("\
3766 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3767 and libraries.\n"), stdout);
3768 fputs (_(" -B <directory> Add <directory> to the compiler's search paths.\n"), stdout);
3769 fputs (_(" -v Display the programs invoked by the compiler.\n"), stdout);
3770 fputs (_(" -### Like -v but options quoted and commands not executed.\n"), stdout);
3771 fputs (_(" -E Preprocess only; do not compile, assemble or link.\n"), stdout);
3772 fputs (_(" -S Compile only; do not assemble or link.\n"), stdout);
3773 fputs (_(" -c Compile and assemble, but do not link.\n"), stdout);
3774 fputs (_(" -o <file> Place the output into <file>.\n"), stdout);
3775 fputs (_(" -pie Create a dynamically linked position independent\n\
3776 executable.\n"), stdout);
3777 fputs (_(" -shared Create a shared library.\n"), stdout);
3778 fputs (_("\
3779 -x <language> Specify the language of the following input files.\n\
3780 Permissible languages include: c c++ assembler none\n\
3781 'none' means revert to the default behavior of\n\
3782 guessing the language based on the file's extension.\n\
3783 "), stdout);
3785 printf (_("\
3786 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3787 passed on to the various sub-processes invoked by %s. In order to pass\n\
3788 other options on to these processes the -W<letter> options must be used.\n\
3789 "), progname);
3791 /* The rest of the options are displayed by invocations of the various
3792 sub-processes. */
3795 static void
3796 add_preprocessor_option (const char *option, int len)
3798 preprocessor_options.safe_push (save_string (option, len));
3801 static void
3802 add_assembler_option (const char *option, int len)
3804 assembler_options.safe_push (save_string (option, len));
3807 static void
3808 add_linker_option (const char *option, int len)
3810 linker_options.safe_push (save_string (option, len));
3813 /* Allocate space for an input file in infiles. */
3815 static void
3816 alloc_infile (void)
3818 if (n_infiles_alloc == 0)
3820 n_infiles_alloc = 16;
3821 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3823 else if (n_infiles_alloc == n_infiles)
3825 n_infiles_alloc *= 2;
3826 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3830 /* Store an input file with the given NAME and LANGUAGE in
3831 infiles. */
3833 static void
3834 add_infile (const char *name, const char *language)
3836 alloc_infile ();
3837 infiles[n_infiles].name = name;
3838 infiles[n_infiles++].language = language;
3841 /* Allocate space for a switch in switches. */
3843 static void
3844 alloc_switch (void)
3846 if (n_switches_alloc == 0)
3848 n_switches_alloc = 16;
3849 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3851 else if (n_switches_alloc == n_switches)
3853 n_switches_alloc *= 2;
3854 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3858 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3859 as validated if VALIDATED and KNOWN if it is an internal switch. */
3861 static void
3862 save_switch (const char *opt, size_t n_args, const char *const *args,
3863 bool validated, bool known)
3865 alloc_switch ();
3866 switches[n_switches].part1 = opt + 1;
3867 if (n_args == 0)
3868 switches[n_switches].args = 0;
3869 else
3871 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3872 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3873 switches[n_switches].args[n_args] = NULL;
3876 switches[n_switches].live_cond = 0;
3877 switches[n_switches].validated = validated;
3878 switches[n_switches].known = known;
3879 switches[n_switches].ordering = 0;
3880 n_switches++;
3883 /* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3884 not set already. */
3886 static void
3887 set_source_date_epoch_envvar ()
3889 /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3890 of 64 bit integers. */
3891 char source_date_epoch[21];
3892 time_t tt;
3894 errno = 0;
3895 tt = time (NULL);
3896 if (tt < (time_t) 0 || errno != 0)
3897 tt = (time_t) 0;
3899 snprintf (source_date_epoch, 21, "%llu", (unsigned long long) tt);
3900 /* Using setenv instead of xputenv because we want the variable to remain
3901 after finalizing so that it's still set in the second run when using
3902 -fcompare-debug. */
3903 setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0);
3906 /* Handle an option DECODED that is unknown to the option-processing
3907 machinery. */
3909 static bool
3910 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3912 const char *opt = decoded->arg;
3913 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3914 && !(decoded->errors & CL_ERR_NEGATIVE))
3916 /* Leave unknown -Wno-* options for the compiler proper, to be
3917 diagnosed only if there are warnings. */
3918 save_switch (decoded->canonical_option[0],
3919 decoded->canonical_option_num_elements - 1,
3920 &decoded->canonical_option[1], false, true);
3921 return false;
3923 if (decoded->opt_index == OPT_SPECIAL_unknown)
3925 /* Give it a chance to define it a spec file. */
3926 save_switch (decoded->canonical_option[0],
3927 decoded->canonical_option_num_elements - 1,
3928 &decoded->canonical_option[1], false, false);
3929 return false;
3931 else
3932 return true;
3935 /* Handle an option DECODED that is not marked as CL_DRIVER.
3936 LANG_MASK will always be CL_DRIVER. */
3938 static void
3939 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3940 unsigned int lang_mask ATTRIBUTE_UNUSED)
3942 /* At this point, non-driver options are accepted (and expected to
3943 be passed down by specs) unless marked to be rejected by the
3944 driver. Options to be rejected by the driver but accepted by the
3945 compilers proper are treated just like completely unknown
3946 options. */
3947 const struct cl_option *option = &cl_options[decoded->opt_index];
3949 if (option->cl_reject_driver)
3950 error ("unrecognized command-line option %qs",
3951 decoded->orig_option_with_args_text);
3952 else
3953 save_switch (decoded->canonical_option[0],
3954 decoded->canonical_option_num_elements - 1,
3955 &decoded->canonical_option[1], false, true);
3958 static const char *spec_lang = 0;
3959 static int last_language_n_infiles;
3962 /* Check that GCC is configured to support the offload target. */
3964 static bool
3965 check_offload_target_name (const char *target, ptrdiff_t len)
3967 const char *n, *c = OFFLOAD_TARGETS;
3968 while (c)
3970 n = strchr (c, ',');
3971 if (n == NULL)
3972 n = strchr (c, '\0');
3973 if (len == n - c && strncmp (target, c, n - c) == 0)
3974 break;
3975 c = *n ? n + 1 : NULL;
3977 if (!c)
3979 auto_vec<const char*> candidates;
3980 size_t olen = strlen (OFFLOAD_TARGETS) + 1;
3981 char *cand = XALLOCAVEC (char, olen);
3982 memcpy (cand, OFFLOAD_TARGETS, olen);
3983 for (c = strtok (cand, ","); c; c = strtok (NULL, ","))
3984 candidates.safe_push (c);
3985 candidates.safe_push ("default");
3986 candidates.safe_push ("disable");
3988 char *target2 = XALLOCAVEC (char, len + 1);
3989 memcpy (target2, target, len);
3990 target2[len] = '\0';
3992 error ("GCC is not configured to support %qs as %<-foffload=%> argument",
3993 target2);
3995 char *s;
3996 const char *hint = candidates_list_and_hint (target2, s, candidates);
3997 if (hint)
3998 inform (UNKNOWN_LOCATION,
3999 "valid %<-foffload=%> arguments are: %s; "
4000 "did you mean %qs?", s, hint);
4001 else
4002 inform (UNKNOWN_LOCATION, "valid %<-foffload=%> arguments are: %s", s);
4003 XDELETEVEC (s);
4004 return false;
4006 return true;
4009 /* Sanity check for -foffload-options. */
4011 static void
4012 check_foffload_target_names (const char *arg)
4014 const char *cur, *next, *end;
4015 /* If option argument starts with '-' then no target is specified and we
4016 do not need to parse it. */
4017 if (arg[0] == '-')
4018 return;
4019 end = strchr (arg, '=');
4020 if (end == NULL)
4022 error ("%<=%>options missing after %<-foffload-options=%>target");
4023 return;
4026 cur = arg;
4027 while (cur < end)
4029 next = strchr (cur, ',');
4030 if (next == NULL)
4031 next = end;
4032 next = (next > end) ? end : next;
4034 /* Retain non-supported targets after printing an error as those will not
4035 be processed; each enabled target only processes its triplet. */
4036 check_offload_target_name (cur, next - cur);
4037 cur = next + 1;
4041 /* Parse -foffload option argument. */
4043 static void
4044 handle_foffload_option (const char *arg)
4046 const char *c, *cur, *n, *next, *end;
4047 char *target;
4049 /* If option argument starts with '-' then no target is specified and we
4050 do not need to parse it. */
4051 if (arg[0] == '-')
4052 return;
4054 end = strchr (arg, '=');
4055 if (end == NULL)
4056 end = strchr (arg, '\0');
4057 cur = arg;
4059 while (cur < end)
4061 next = strchr (cur, ',');
4062 if (next == NULL)
4063 next = end;
4064 next = (next > end) ? end : next;
4066 target = XNEWVEC (char, next - cur + 1);
4067 memcpy (target, cur, next - cur);
4068 target[next - cur] = '\0';
4070 /* Reset offloading list and continue. */
4071 if (strcmp (target, "default") == 0)
4073 free (offload_targets);
4074 offload_targets = NULL;
4075 goto next_item;
4078 /* If 'disable' is passed to the option, clean the list of
4079 offload targets and return, even if more targets follow.
4080 Likewise if GCC is not configured to support that offload target. */
4081 if (strcmp (target, "disable") == 0
4082 || !check_offload_target_name (target, next - cur))
4084 free (offload_targets);
4085 offload_targets = xstrdup ("");
4086 return;
4089 if (!offload_targets)
4091 offload_targets = target;
4092 target = NULL;
4094 else
4096 /* Check that the target hasn't already presented in the list. */
4097 c = offload_targets;
4100 n = strchr (c, ':');
4101 if (n == NULL)
4102 n = strchr (c, '\0');
4104 if (next - cur == n - c && strncmp (c, target, n - c) == 0)
4105 break;
4107 c = n + 1;
4109 while (*n);
4111 /* If duplicate is not found, append the target to the list. */
4112 if (c > n)
4114 size_t offload_targets_len = strlen (offload_targets);
4115 offload_targets
4116 = XRESIZEVEC (char, offload_targets,
4117 offload_targets_len + 1 + next - cur + 1);
4118 offload_targets[offload_targets_len++] = ':';
4119 memcpy (offload_targets + offload_targets_len, target, next - cur + 1);
4122 next_item:
4123 cur = next + 1;
4124 XDELETEVEC (target);
4128 /* Forward certain options to offloading compilation. */
4130 static void
4131 forward_offload_option (size_t opt_index, const char *arg, bool validated)
4133 switch (opt_index)
4135 case OPT_l:
4136 /* Use a '_GCC_' prefix and standard name ('-l_GCC_m' irrespective of the
4137 host's 'MATH_LIBRARY', for example), so that the 'mkoffload's can tell
4138 this has been synthesized here, and translate/drop as necessary. */
4139 /* Note that certain libraries ('-lc', '-lgcc', '-lgomp', for example)
4140 are injected by default in offloading compilation, and therefore not
4141 forwarded here. */
4142 /* GCC libraries. */
4143 if (/* '-lgfortran' */ strcmp (arg, "gfortran") == 0 )
4144 save_switch (concat ("-foffload-options=-l_GCC_", arg, NULL),
4145 0, NULL, validated, true);
4146 /* Other libraries. */
4147 else
4149 /* The case will need special consideration where on the host
4150 '!need_math', but for offloading compilation still need
4151 '-foffload-options=-l_GCC_m'. The problem is that we don't get
4152 here anything like '-lm', because it's not synthesized in
4153 'gcc/fortran/gfortranspec.cc:lang_specific_driver', for example.
4154 Generally synthesizing '-foffload-options=-l_GCC_m' etc. in the
4155 language specific drivers is non-trivial, needs very careful
4156 review of their options handling. However, this issue is not
4157 actually relevant for the current set of supported host/offloading
4158 configurations. */
4159 int need_math = (MATH_LIBRARY[0] != '\0');
4160 if (/* '-lm' */ (need_math && strcmp (arg, MATH_LIBRARY) == 0))
4161 save_switch ("-foffload-options=-l_GCC_m",
4162 0, NULL, validated, true);
4164 break;
4165 default:
4166 gcc_unreachable ();
4170 /* Handle a driver option; arguments and return value as for
4171 handle_option. */
4173 static bool
4174 driver_handle_option (struct gcc_options *opts,
4175 struct gcc_options *opts_set,
4176 const struct cl_decoded_option *decoded,
4177 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
4178 location_t loc,
4179 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
4180 diagnostic_context *dc,
4181 void (*) (void))
4183 size_t opt_index = decoded->opt_index;
4184 const char *arg = decoded->arg;
4185 const char *compare_debug_replacement_opt;
4186 int value = decoded->value;
4187 bool validated = false;
4188 bool do_save = true;
4190 gcc_assert (opts == &global_options);
4191 gcc_assert (opts_set == &global_options_set);
4192 gcc_assert (kind == DK_UNSPECIFIED);
4193 gcc_assert (loc == UNKNOWN_LOCATION);
4194 gcc_assert (dc == global_dc);
4196 switch (opt_index)
4198 case OPT_dumpspecs:
4200 struct spec_list *sl;
4201 init_spec ();
4202 for (sl = specs; sl; sl = sl->next)
4203 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
4204 if (link_command_spec)
4205 printf ("*link_command:\n%s\n\n", link_command_spec);
4206 exit (0);
4209 case OPT_dumpversion:
4210 printf ("%s\n", spec_version);
4211 exit (0);
4213 case OPT_dumpmachine:
4214 printf ("%s\n", spec_machine);
4215 exit (0);
4217 case OPT_dumpfullversion:
4218 printf ("%s\n", BASEVER);
4219 exit (0);
4221 case OPT__version:
4222 print_version = 1;
4224 /* CPP driver cannot obtain switch from cc1_options. */
4225 if (is_cpp_driver)
4226 add_preprocessor_option ("--version", strlen ("--version"));
4227 add_assembler_option ("--version", strlen ("--version"));
4228 add_linker_option ("--version", strlen ("--version"));
4229 break;
4231 case OPT__completion_:
4232 validated = true;
4233 completion = decoded->arg;
4234 break;
4236 case OPT__help:
4237 print_help_list = 1;
4239 /* CPP driver cannot obtain switch from cc1_options. */
4240 if (is_cpp_driver)
4241 add_preprocessor_option ("--help", 6);
4242 add_assembler_option ("--help", 6);
4243 add_linker_option ("--help", 6);
4244 break;
4246 case OPT__help_:
4247 print_subprocess_help = 2;
4248 break;
4250 case OPT__target_help:
4251 print_subprocess_help = 1;
4253 /* CPP driver cannot obtain switch from cc1_options. */
4254 if (is_cpp_driver)
4255 add_preprocessor_option ("--target-help", 13);
4256 add_assembler_option ("--target-help", 13);
4257 add_linker_option ("--target-help", 13);
4258 break;
4260 case OPT__no_sysroot_suffix:
4261 case OPT_pass_exit_codes:
4262 case OPT_print_search_dirs:
4263 case OPT_print_file_name_:
4264 case OPT_print_prog_name_:
4265 case OPT_print_multi_lib:
4266 case OPT_print_multi_directory:
4267 case OPT_print_sysroot:
4268 case OPT_print_multi_os_directory:
4269 case OPT_print_multiarch:
4270 case OPT_print_sysroot_headers_suffix:
4271 case OPT_time:
4272 case OPT_wrapper:
4273 /* These options set the variables specified in common.opt
4274 automatically, and do not need to be saved for spec
4275 processing. */
4276 do_save = false;
4277 break;
4279 case OPT_print_libgcc_file_name:
4280 print_file_name = "libgcc.a";
4281 do_save = false;
4282 break;
4284 case OPT_fuse_ld_bfd:
4285 use_ld = ".bfd";
4286 break;
4288 case OPT_fuse_ld_gold:
4289 use_ld = ".gold";
4290 break;
4292 case OPT_fuse_ld_mold:
4293 use_ld = ".mold";
4294 break;
4296 case OPT_fcompare_debug_second:
4297 compare_debug_second = 1;
4298 break;
4300 case OPT_fcompare_debug:
4301 switch (value)
4303 case 0:
4304 compare_debug_replacement_opt = "-fcompare-debug=";
4305 arg = "";
4306 goto compare_debug_with_arg;
4308 case 1:
4309 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
4310 arg = "-gtoggle";
4311 goto compare_debug_with_arg;
4313 default:
4314 gcc_unreachable ();
4316 break;
4318 case OPT_fcompare_debug_:
4319 compare_debug_replacement_opt = decoded->canonical_option[0];
4320 compare_debug_with_arg:
4321 gcc_assert (decoded->canonical_option_num_elements == 1);
4322 gcc_assert (arg != NULL);
4323 if (*arg)
4324 compare_debug = 1;
4325 else
4326 compare_debug = -1;
4327 if (compare_debug < 0)
4328 compare_debug_opt = NULL;
4329 else
4330 compare_debug_opt = arg;
4331 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
4332 set_source_date_epoch_envvar ();
4333 return true;
4335 case OPT_fdiagnostics_color_:
4336 diagnostic_color_init (dc, value);
4337 break;
4339 case OPT_fdiagnostics_urls_:
4340 diagnostic_urls_init (dc, value);
4341 break;
4343 case OPT_fdiagnostics_format_:
4345 const char *basename = (opts->x_dump_base_name ? opts->x_dump_base_name
4346 : opts->x_main_input_basename);
4347 diagnostic_output_format_init (dc, basename,
4348 (enum diagnostics_output_format)value);
4349 break;
4352 case OPT_fdiagnostics_text_art_charset_:
4353 diagnostics_text_art_charset_init (dc,
4354 (enum diagnostic_text_art_charset)value);
4355 break;
4357 case OPT_Wa_:
4359 int prev, j;
4360 /* Pass the rest of this option to the assembler. */
4362 /* Split the argument at commas. */
4363 prev = 0;
4364 for (j = 0; arg[j]; j++)
4365 if (arg[j] == ',')
4367 add_assembler_option (arg + prev, j - prev);
4368 prev = j + 1;
4371 /* Record the part after the last comma. */
4372 add_assembler_option (arg + prev, j - prev);
4374 do_save = false;
4375 break;
4377 case OPT_Wp_:
4379 int prev, j;
4380 /* Pass the rest of this option to the preprocessor. */
4382 /* Split the argument at commas. */
4383 prev = 0;
4384 for (j = 0; arg[j]; j++)
4385 if (arg[j] == ',')
4387 add_preprocessor_option (arg + prev, j - prev);
4388 prev = j + 1;
4391 /* Record the part after the last comma. */
4392 add_preprocessor_option (arg + prev, j - prev);
4394 do_save = false;
4395 break;
4397 case OPT_Wl_:
4399 int prev, j;
4400 /* Split the argument at commas. */
4401 prev = 0;
4402 for (j = 0; arg[j]; j++)
4403 if (arg[j] == ',')
4405 add_infile (save_string (arg + prev, j - prev), "*");
4406 prev = j + 1;
4408 /* Record the part after the last comma. */
4409 add_infile (arg + prev, "*");
4411 do_save = false;
4412 break;
4414 case OPT_Xlinker:
4415 add_infile (arg, "*");
4416 do_save = false;
4417 break;
4419 case OPT_Xpreprocessor:
4420 add_preprocessor_option (arg, strlen (arg));
4421 do_save = false;
4422 break;
4424 case OPT_Xassembler:
4425 add_assembler_option (arg, strlen (arg));
4426 do_save = false;
4427 break;
4429 case OPT_l:
4430 /* POSIX allows separation of -l and the lib arg; canonicalize
4431 by concatenating -l with its arg */
4432 add_infile (concat ("-l", arg, NULL), "*");
4434 /* Forward to offloading compilation '-l[...]' flags for standard,
4435 well-known libraries. */
4436 /* Doing this processing here means that we don't get to see libraries
4437 injected via specs, such as '-lquadmath' injected via
4438 '[build]/[target]/libgfortran/libgfortran.spec'. However, this issue
4439 is not actually relevant for the current set of host/offloading
4440 configurations. */
4441 if (ENABLE_OFFLOADING)
4442 forward_offload_option (opt_index, arg, validated);
4444 do_save = false;
4445 break;
4447 case OPT_L:
4448 /* Similarly, canonicalize -L for linkers that may not accept
4449 separate arguments. */
4450 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
4451 return true;
4453 case OPT_F:
4454 /* Likewise -F. */
4455 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
4456 return true;
4458 case OPT_save_temps:
4459 if (!save_temps_flag)
4460 save_temps_flag = SAVE_TEMPS_DUMP;
4461 validated = true;
4462 break;
4464 case OPT_save_temps_:
4465 if (strcmp (arg, "cwd") == 0)
4466 save_temps_flag = SAVE_TEMPS_CWD;
4467 else if (strcmp (arg, "obj") == 0
4468 || strcmp (arg, "object") == 0)
4469 save_temps_flag = SAVE_TEMPS_OBJ;
4470 else
4471 fatal_error (input_location, "%qs is an unknown %<-save-temps%> option",
4472 decoded->orig_option_with_args_text);
4473 save_temps_overrides_dumpdir = true;
4474 break;
4476 case OPT_dumpdir:
4477 free (dumpdir);
4478 dumpdir = xstrdup (arg);
4479 save_temps_overrides_dumpdir = false;
4480 break;
4482 case OPT_dumpbase:
4483 free (dumpbase);
4484 dumpbase = xstrdup (arg);
4485 break;
4487 case OPT_dumpbase_ext:
4488 free (dumpbase_ext);
4489 dumpbase_ext = xstrdup (arg);
4490 break;
4492 case OPT_no_canonical_prefixes:
4493 /* Already handled as a special case, so ignored here. */
4494 do_save = false;
4495 break;
4497 case OPT_pipe:
4498 validated = true;
4499 /* These options set the variables specified in common.opt
4500 automatically, but do need to be saved for spec
4501 processing. */
4502 break;
4504 case OPT_specs_:
4506 struct user_specs *user = XNEW (struct user_specs);
4508 user->next = (struct user_specs *) 0;
4509 user->filename = arg;
4510 if (user_specs_tail)
4511 user_specs_tail->next = user;
4512 else
4513 user_specs_head = user;
4514 user_specs_tail = user;
4516 validated = true;
4517 break;
4519 case OPT__sysroot_:
4520 target_system_root = arg;
4521 target_system_root_changed = 1;
4522 /* Saving this option is useful to let self-specs decide to
4523 provide a default one. */
4524 do_save = true;
4525 validated = true;
4526 break;
4528 case OPT_time_:
4529 if (report_times_to_file)
4530 fclose (report_times_to_file);
4531 report_times_to_file = fopen (arg, "a");
4532 do_save = false;
4533 break;
4535 case OPT____:
4536 /* "-###"
4537 This is similar to -v except that there is no execution
4538 of the commands and the echoed arguments are quoted. It
4539 is intended for use in shell scripts to capture the
4540 driver-generated command line. */
4541 verbose_only_flag++;
4542 verbose_flag = 1;
4543 do_save = false;
4544 break;
4546 case OPT_B:
4548 size_t len = strlen (arg);
4550 /* Catch the case where the user has forgotten to append a
4551 directory separator to the path. Note, they may be using
4552 -B to add an executable name prefix, eg "i386-elf-", in
4553 order to distinguish between multiple installations of
4554 GCC in the same directory. Hence we must check to see
4555 if appending a directory separator actually makes a
4556 valid directory name. */
4557 if (!IS_DIR_SEPARATOR (arg[len - 1])
4558 && is_directory (arg, false))
4560 char *tmp = XNEWVEC (char, len + 2);
4561 strcpy (tmp, arg);
4562 tmp[len] = DIR_SEPARATOR;
4563 tmp[++len] = 0;
4564 arg = tmp;
4567 add_prefix (&exec_prefixes, arg, NULL,
4568 PREFIX_PRIORITY_B_OPT, 0, 0);
4569 add_prefix (&startfile_prefixes, arg, NULL,
4570 PREFIX_PRIORITY_B_OPT, 0, 0);
4571 add_prefix (&include_prefixes, arg, NULL,
4572 PREFIX_PRIORITY_B_OPT, 0, 0);
4574 validated = true;
4575 break;
4577 case OPT_E:
4578 have_E = true;
4579 break;
4581 case OPT_x:
4582 spec_lang = arg;
4583 if (!strcmp (spec_lang, "none"))
4584 /* Suppress the warning if -xnone comes after the last input
4585 file, because alternate command interfaces like g++ might
4586 find it useful to place -xnone after each input file. */
4587 spec_lang = 0;
4588 else
4589 last_language_n_infiles = n_infiles;
4590 do_save = false;
4591 break;
4593 case OPT_o:
4594 have_o = 1;
4595 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4596 arg = convert_filename (arg, ! have_c, 0);
4597 #endif
4598 output_file = arg;
4599 /* On some systems, ld cannot handle "-o" without a space. So
4600 split the option from its argument. */
4601 save_switch ("-o", 1, &arg, validated, true);
4602 return true;
4604 #ifdef ENABLE_DEFAULT_PIE
4605 case OPT_pie:
4606 /* -pie is turned on by default. */
4607 #endif
4609 case OPT_static_libgcc:
4610 case OPT_shared_libgcc:
4611 case OPT_static_libgfortran:
4612 case OPT_static_libquadmath:
4613 case OPT_static_libphobos:
4614 case OPT_static_libgm2:
4615 case OPT_static_libstdc__:
4616 /* These are always valid; gcc.cc itself understands the first two
4617 gfortranspec.cc understands -static-libgfortran,
4618 libgfortran.spec handles -static-libquadmath,
4619 d-spec.cc understands -static-libphobos,
4620 gm2spec.cc understands -static-libgm2,
4621 and g++spec.cc understands -static-libstdc++. */
4622 validated = true;
4623 break;
4625 case OPT_fwpa:
4626 flag_wpa = "";
4627 break;
4629 case OPT_foffload_options_:
4630 check_foffload_target_names (arg);
4631 break;
4633 case OPT_foffload_:
4634 handle_foffload_option (arg);
4635 if (arg[0] == '-' || NULL != strchr (arg, '='))
4636 save_switch (concat ("-foffload-options=", arg, NULL),
4637 0, NULL, validated, true);
4638 do_save = false;
4639 break;
4641 case OPT_gcodeview:
4642 add_infile ("--pdb=", "*");
4643 break;
4645 default:
4646 /* Various driver options need no special processing at this
4647 point, having been handled in a prescan above or being
4648 handled by specs. */
4649 break;
4652 if (do_save)
4653 save_switch (decoded->canonical_option[0],
4654 decoded->canonical_option_num_elements - 1,
4655 &decoded->canonical_option[1], validated, true);
4656 return true;
4659 /* Return true if F2 is F1 followed by a single suffix, i.e., by a
4660 period and additional characters other than a period. */
4662 static inline bool
4663 adds_single_suffix_p (const char *f2, const char *f1)
4665 size_t len = strlen (f1);
4667 return (strncmp (f1, f2, len) == 0
4668 && f2[len] == '.'
4669 && strchr (f2 + len + 1, '.') == NULL);
4672 /* Put the driver's standard set of option handlers in *HANDLERS. */
4674 static void
4675 set_option_handlers (struct cl_option_handlers *handlers)
4677 handlers->unknown_option_callback = driver_unknown_option_callback;
4678 handlers->wrong_lang_callback = driver_wrong_lang_callback;
4679 handlers->num_handlers = 3;
4680 handlers->handlers[0].handler = driver_handle_option;
4681 handlers->handlers[0].mask = CL_DRIVER;
4682 handlers->handlers[1].handler = common_handle_option;
4683 handlers->handlers[1].mask = CL_COMMON;
4684 handlers->handlers[2].handler = target_handle_option;
4685 handlers->handlers[2].mask = CL_TARGET;
4689 /* Return the index into infiles for the single non-library
4690 non-lto-wpa input file, -1 if there isn't any, or -2 if there is
4691 more than one. */
4692 static inline int
4693 single_input_file_index ()
4695 int ret = -1;
4697 for (int i = 0; i < n_infiles; i++)
4699 if (infiles[i].language
4700 && (infiles[i].language[0] == '*'
4701 || (flag_wpa
4702 && strcmp (infiles[i].language, "lto") == 0)))
4703 continue;
4705 if (ret != -1)
4706 return -2;
4708 ret = i;
4711 return ret;
4714 /* Create the vector `switches' and its contents.
4715 Store its length in `n_switches'. */
4717 static void
4718 process_command (unsigned int decoded_options_count,
4719 struct cl_decoded_option *decoded_options)
4721 const char *temp;
4722 char *temp1;
4723 char *tooldir_prefix, *tooldir_prefix2;
4724 char *(*get_relative_prefix) (const char *, const char *,
4725 const char *) = NULL;
4726 struct cl_option_handlers handlers;
4727 unsigned int j;
4729 gcc_exec_prefix = env.get ("GCC_EXEC_PREFIX");
4731 n_switches = 0;
4732 n_infiles = 0;
4733 added_libraries = 0;
4735 /* Figure compiler version from version string. */
4737 compiler_version = temp1 = xstrdup (version_string);
4739 for (; *temp1; ++temp1)
4741 if (*temp1 == ' ')
4743 *temp1 = '\0';
4744 break;
4748 /* Handle any -no-canonical-prefixes flag early, to assign the function
4749 that builds relative prefixes. This function creates default search
4750 paths that are needed later in normal option handling. */
4752 for (j = 1; j < decoded_options_count; j++)
4754 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
4756 get_relative_prefix = make_relative_prefix_ignore_links;
4757 break;
4760 if (! get_relative_prefix)
4761 get_relative_prefix = make_relative_prefix;
4763 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
4764 see if we can create it from the pathname specified in
4765 decoded_options[0].arg. */
4767 gcc_libexec_prefix = standard_libexec_prefix;
4768 #ifndef VMS
4769 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
4770 if (!gcc_exec_prefix)
4772 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
4773 standard_bindir_prefix,
4774 standard_exec_prefix);
4775 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
4776 standard_bindir_prefix,
4777 standard_libexec_prefix);
4778 if (gcc_exec_prefix)
4779 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
4781 else
4783 /* make_relative_prefix requires a program name, but
4784 GCC_EXEC_PREFIX is typically a directory name with a trailing
4785 / (which is ignored by make_relative_prefix), so append a
4786 program name. */
4787 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
4788 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
4789 standard_exec_prefix,
4790 standard_libexec_prefix);
4792 /* The path is unrelocated, so fallback to the original setting. */
4793 if (!gcc_libexec_prefix)
4794 gcc_libexec_prefix = standard_libexec_prefix;
4796 free (tmp_prefix);
4798 #else
4799 #endif
4800 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4801 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4802 or an automatically created GCC_EXEC_PREFIX from
4803 decoded_options[0].arg. */
4805 /* Do language-specific adjustment/addition of flags. */
4806 lang_specific_driver (&decoded_options, &decoded_options_count,
4807 &added_libraries);
4809 if (gcc_exec_prefix)
4811 int len = strlen (gcc_exec_prefix);
4813 if (len > (int) sizeof ("/lib/gcc/") - 1
4814 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
4816 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
4817 if (IS_DIR_SEPARATOR (*temp)
4818 && filename_ncmp (temp + 1, "lib", 3) == 0
4819 && IS_DIR_SEPARATOR (temp[4])
4820 && filename_ncmp (temp + 5, "gcc", 3) == 0)
4821 len -= sizeof ("/lib/gcc/") - 1;
4824 set_std_prefix (gcc_exec_prefix, len);
4825 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
4826 PREFIX_PRIORITY_LAST, 0, 0);
4827 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
4828 PREFIX_PRIORITY_LAST, 0, 0);
4831 /* COMPILER_PATH and LIBRARY_PATH have values
4832 that are lists of directory names with colons. */
4834 temp = env.get ("COMPILER_PATH");
4835 if (temp)
4837 const char *startp, *endp;
4838 char *nstore = (char *) alloca (strlen (temp) + 3);
4840 startp = endp = temp;
4841 while (1)
4843 if (*endp == PATH_SEPARATOR || *endp == 0)
4845 strncpy (nstore, startp, endp - startp);
4846 if (endp == startp)
4847 strcpy (nstore, concat (".", dir_separator_str, NULL));
4848 else if (!IS_DIR_SEPARATOR (endp[-1]))
4850 nstore[endp - startp] = DIR_SEPARATOR;
4851 nstore[endp - startp + 1] = 0;
4853 else
4854 nstore[endp - startp] = 0;
4855 add_prefix (&exec_prefixes, nstore, 0,
4856 PREFIX_PRIORITY_LAST, 0, 0);
4857 add_prefix (&include_prefixes, nstore, 0,
4858 PREFIX_PRIORITY_LAST, 0, 0);
4859 if (*endp == 0)
4860 break;
4861 endp = startp = endp + 1;
4863 else
4864 endp++;
4868 temp = env.get (LIBRARY_PATH_ENV);
4869 if (temp && *cross_compile == '0')
4871 const char *startp, *endp;
4872 char *nstore = (char *) alloca (strlen (temp) + 3);
4874 startp = endp = temp;
4875 while (1)
4877 if (*endp == PATH_SEPARATOR || *endp == 0)
4879 strncpy (nstore, startp, endp - startp);
4880 if (endp == startp)
4881 strcpy (nstore, concat (".", dir_separator_str, NULL));
4882 else if (!IS_DIR_SEPARATOR (endp[-1]))
4884 nstore[endp - startp] = DIR_SEPARATOR;
4885 nstore[endp - startp + 1] = 0;
4887 else
4888 nstore[endp - startp] = 0;
4889 add_prefix (&startfile_prefixes, nstore, NULL,
4890 PREFIX_PRIORITY_LAST, 0, 1);
4891 if (*endp == 0)
4892 break;
4893 endp = startp = endp + 1;
4895 else
4896 endp++;
4900 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4901 temp = env.get ("LPATH");
4902 if (temp && *cross_compile == '0')
4904 const char *startp, *endp;
4905 char *nstore = (char *) alloca (strlen (temp) + 3);
4907 startp = endp = temp;
4908 while (1)
4910 if (*endp == PATH_SEPARATOR || *endp == 0)
4912 strncpy (nstore, startp, endp - startp);
4913 if (endp == startp)
4914 strcpy (nstore, concat (".", dir_separator_str, NULL));
4915 else if (!IS_DIR_SEPARATOR (endp[-1]))
4917 nstore[endp - startp] = DIR_SEPARATOR;
4918 nstore[endp - startp + 1] = 0;
4920 else
4921 nstore[endp - startp] = 0;
4922 add_prefix (&startfile_prefixes, nstore, NULL,
4923 PREFIX_PRIORITY_LAST, 0, 1);
4924 if (*endp == 0)
4925 break;
4926 endp = startp = endp + 1;
4928 else
4929 endp++;
4933 /* Process the options and store input files and switches in their
4934 vectors. */
4936 last_language_n_infiles = -1;
4938 set_option_handlers (&handlers);
4940 for (j = 1; j < decoded_options_count; j++)
4942 switch (decoded_options[j].opt_index)
4944 case OPT_S:
4945 case OPT_c:
4946 case OPT_E:
4947 have_c = 1;
4948 break;
4950 if (have_c)
4951 break;
4954 for (j = 1; j < decoded_options_count; j++)
4956 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4958 const char *arg = decoded_options[j].arg;
4960 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4961 arg = convert_filename (arg, 0, access (arg, F_OK));
4962 #endif
4963 add_infile (arg, spec_lang);
4965 continue;
4968 read_cmdline_option (&global_options, &global_options_set,
4969 decoded_options + j, UNKNOWN_LOCATION,
4970 CL_DRIVER, &handlers, global_dc);
4973 /* If the user didn't specify any, default to all configured offload
4974 targets. */
4975 if (ENABLE_OFFLOADING && offload_targets == NULL)
4977 handle_foffload_option (OFFLOAD_TARGETS);
4978 #if OFFLOAD_DEFAULTED
4979 offload_targets_default = true;
4980 #endif
4983 /* Handle -gtoggle as it would later in toplev.cc:process_options to
4984 make the debug-level-gt spec function work as expected. */
4985 if (flag_gtoggle)
4987 if (debug_info_level == DINFO_LEVEL_NONE)
4988 debug_info_level = DINFO_LEVEL_NORMAL;
4989 else
4990 debug_info_level = DINFO_LEVEL_NONE;
4993 if (output_file
4994 && strcmp (output_file, "-") != 0
4995 && strcmp (output_file, HOST_BIT_BUCKET) != 0)
4997 int i;
4998 for (i = 0; i < n_infiles; i++)
4999 if ((!infiles[i].language || infiles[i].language[0] != '*')
5000 && canonical_filename_eq (infiles[i].name, output_file))
5001 fatal_error (input_location,
5002 "input file %qs is the same as output file",
5003 output_file);
5006 if (output_file != NULL && output_file[0] == '\0')
5007 fatal_error (input_location, "output filename may not be empty");
5009 /* -dumpdir and -save-temps=* both specify the location of aux/dump
5010 outputs; the one that appears last prevails. When compiling
5011 multiple sources, an explicit dumpbase (minus -ext) may be
5012 combined with an explicit or implicit dumpdir, whereas when
5013 linking, a specified or implied link output name (minus
5014 extension) may be combined with a prevailing -save-temps=* or an
5015 otherwise implied dumpdir, but not override a prevailing
5016 -dumpdir. Primary outputs (e.g., linker output when linking
5017 without -o, or .i, .s or .o outputs when processing multiple
5018 inputs with -E, -S or -c, respectively) are NOT affected by these
5019 -save-temps=/-dump* options, always landing in the current
5020 directory and with the same basename as the input when an output
5021 name is not given, but when they're intermediate outputs, they
5022 are named like other aux outputs, so the options affect their
5023 location and name.
5025 Here are some examples. There are several more in the
5026 documentation of -o and -dump*, and some quite exhaustive tests
5027 in gcc.misc-tests/outputs.exp.
5029 When compiling any number of sources, no -dump* nor
5030 -save-temps=*, all outputs in cwd without prefix:
5032 # gcc -c b.c -gsplit-dwarf
5033 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
5035 # gcc -c b.c d.c -gsplit-dwarf
5036 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
5037 && cc1 [-dumpdir ./] -dumpbase d.c -dumpbase-ext .c # d.o d.dwo
5039 When compiling and linking, no -dump* nor -save-temps=*, .o
5040 outputs are temporary, aux outputs land in the dir of the output,
5041 prefixed with the basename of the linker output:
5043 # gcc b.c d.c -o ab -gsplit-dwarf
5044 -> cc1 -dumpdir ab- -dumpbase b.c -dumpbase-ext .c # ab-b.dwo
5045 && cc1 -dumpdir ab- -dumpbase d.c -dumpbase-ext .c # ab-d.dwo
5046 && link ... -o ab
5048 # gcc b.c d.c [-o a.out] -gsplit-dwarf
5049 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.dwo
5050 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.dwo
5051 && link ... [-o a.out]
5053 When compiling and linking, a prevailing -dumpdir fully overrides
5054 the prefix of aux outputs given by the output name:
5056 # gcc -dumpdir f b.c d.c -gsplit-dwarf [-o [dir/]whatever]
5057 -> cc1 -dumpdir f -dumpbase b.c -dumpbase-ext .c # fb.dwo
5058 && cc1 -dumpdir f -dumpbase d.c -dumpbase-ext .c # fd.dwo
5059 && link ... [-o whatever]
5061 When compiling multiple inputs, an explicit -dumpbase is combined
5062 with -dumpdir, affecting aux outputs, but not the .o outputs:
5064 # gcc -dumpdir f -dumpbase g- b.c d.c -gsplit-dwarf -c
5065 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # b.o fg-b.dwo
5066 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # d.o fg-d.dwo
5068 When compiling and linking with -save-temps, the .o outputs that
5069 would have been temporary become aux outputs, so they get
5070 affected by -dump* flags:
5072 # gcc -dumpdir f -dumpbase g- -save-temps b.c d.c
5073 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # fg-b.o
5074 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # fg-d.o
5075 && link
5077 If -save-temps=* prevails over -dumpdir, however, the explicit
5078 -dumpdir is discarded, as if it wasn't there. The basename of
5079 the implicit linker output, a.out or a.exe, becomes a- as the aux
5080 output prefix for all compilations:
5082 # gcc [-dumpdir f] -save-temps=cwd b.c d.c
5083 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.o
5084 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.o
5085 && link
5087 A single -dumpbase, applying to multiple inputs, overrides the
5088 linker output name, implied or explicit, as the aux output prefix:
5090 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c
5091 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5092 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5093 && link
5095 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c -o dir/h.out
5096 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5097 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5098 && link -o dir/h.out
5100 Now, if the linker output is NOT overridden as a prefix, but
5101 -save-temps=* overrides implicit or explicit -dumpdir, the
5102 effective dump dir combines the dir selected by the -save-temps=*
5103 option with the basename of the specified or implied link output:
5105 # gcc [-dumpdir f] -save-temps=cwd b.c d.c -o dir/h.out
5106 -> cc1 -dumpdir h- -dumpbase b.c -dumpbase-ext .c # h-b.o
5107 && cc1 -dumpdir h- -dumpbase d.c -dumpbase-ext .c # h-d.o
5108 && link -o dir/h.out
5110 # gcc [-dumpdir f] -save-temps=obj b.c d.c -o dir/h.out
5111 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5112 && cc1 -dumpdir dir/h- -dumpbase d.c -dumpbase-ext .c # dir/h-d.o
5113 && link -o dir/h.out
5115 But then again, a single -dumpbase applying to multiple inputs
5116 gets used instead of the linker output basename in the combined
5117 dumpdir:
5119 # gcc [-dumpdir f] -dumpbase g- -save-temps=obj b.c d.c -o dir/h.out
5120 -> cc1 -dumpdir dir/g- -dumpbase b.c -dumpbase-ext .c # dir/g-b.o
5121 && cc1 -dumpdir dir/g- -dumpbase d.c -dumpbase-ext .c # dir/g-d.o
5122 && link -o dir/h.out
5124 With a single input being compiled, the output basename does NOT
5125 affect the dumpdir prefix.
5127 # gcc -save-temps=obj b.c -gsplit-dwarf -c -o dir/b.o
5128 -> cc1 -dumpdir dir/ -dumpbase b.c -dumpbase-ext .c # dir/b.o dir/b.dwo
5130 but when compiling and linking even a single file, it does:
5132 # gcc -save-temps=obj b.c -o dir/h.out
5133 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5135 unless an explicit -dumpdir prevails:
5137 # gcc -save-temps[=obj] -dumpdir g- b.c -o dir/h.out
5138 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5142 bool explicit_dumpdir = dumpdir;
5144 if ((!save_temps_overrides_dumpdir && explicit_dumpdir)
5145 || (output_file && not_actual_file_p (output_file)))
5147 /* Do nothing. */
5150 /* If -save-temps=obj and -o name, create the prefix to use for %b.
5151 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
5152 else if (save_temps_flag != SAVE_TEMPS_CWD && output_file != NULL)
5154 free (dumpdir);
5155 dumpdir = NULL;
5156 temp = lbasename (output_file);
5157 if (temp != output_file)
5158 dumpdir = xstrndup (output_file,
5159 strlen (output_file) - strlen (temp));
5161 else if (dumpdir)
5163 free (dumpdir);
5164 dumpdir = NULL;
5167 if (save_temps_flag)
5168 save_temps_flag = SAVE_TEMPS_DUMP;
5170 /* If there is any pathname component in an explicit -dumpbase, it
5171 overrides dumpdir entirely, so discard it right away. Although
5172 the presence of an explicit -dumpdir matters for the driver, it
5173 shouldn't matter for other processes, that get all that's needed
5174 from the -dumpdir and -dumpbase always passed to them. */
5175 if (dumpdir && dumpbase && lbasename (dumpbase) != dumpbase)
5177 free (dumpdir);
5178 dumpdir = NULL;
5181 /* Check that dumpbase_ext matches the end of dumpbase, drop it
5182 otherwise. */
5183 if (dumpbase_ext && dumpbase && *dumpbase)
5185 int lendb = strlen (dumpbase);
5186 int lendbx = strlen (dumpbase_ext);
5188 /* -dumpbase-ext must be a suffix proper; discard it if it
5189 matches all of -dumpbase, as that would make for an empty
5190 basename. */
5191 if (lendbx >= lendb
5192 || strcmp (dumpbase + lendb - lendbx, dumpbase_ext) != 0)
5194 free (dumpbase_ext);
5195 dumpbase_ext = NULL;
5199 /* -dumpbase with multiple sources goes into dumpdir. With a single
5200 source, it does only if linking and if dumpdir was not explicitly
5201 specified. */
5202 if (dumpbase && *dumpbase
5203 && (single_input_file_index () == -2
5204 || (!have_c && !explicit_dumpdir)))
5206 char *prefix;
5208 if (dumpbase_ext)
5209 /* We checked that they match above. */
5210 dumpbase[strlen (dumpbase) - strlen (dumpbase_ext)] = '\0';
5212 if (dumpdir)
5213 prefix = concat (dumpdir, dumpbase, "-", NULL);
5214 else
5215 prefix = concat (dumpbase, "-", NULL);
5217 free (dumpdir);
5218 free (dumpbase);
5219 free (dumpbase_ext);
5220 dumpbase = dumpbase_ext = NULL;
5221 dumpdir = prefix;
5222 dumpdir_trailing_dash_added = true;
5225 /* If dumpbase was not brought into dumpdir but we're linking, bring
5226 output_file into dumpdir unless dumpdir was explicitly specified.
5227 The test for !explicit_dumpdir is further below, because we want
5228 to use the obase computation for a ghost outbase, passed to
5229 GCC_COLLECT_OPTIONS. */
5230 else if (!have_c && (!explicit_dumpdir || (dumpbase && !*dumpbase)))
5232 /* If we get here, we know dumpbase was not specified, or it was
5233 specified as an empty string. If it was anything else, it
5234 would have combined with dumpdir above, because the condition
5235 for dumpbase to be used when present is broader than the
5236 condition that gets us here. */
5237 gcc_assert (!dumpbase || !*dumpbase);
5239 const char *obase;
5240 char *tofree = NULL;
5241 if (!output_file || not_actual_file_p (output_file))
5242 obase = "a";
5243 else
5245 obase = lbasename (output_file);
5246 size_t blen = strlen (obase), xlen;
5247 /* Drop the suffix if it's dumpbase_ext, if given,
5248 otherwise .exe or the target executable suffix, or if the
5249 output was explicitly named a.out, but not otherwise. */
5250 if (dumpbase_ext
5251 ? (blen > (xlen = strlen (dumpbase_ext))
5252 && strcmp ((temp = (obase + blen - xlen)),
5253 dumpbase_ext) == 0)
5254 : ((temp = strrchr (obase + 1, '.'))
5255 && (xlen = strlen (temp))
5256 && (strcmp (temp, ".exe") == 0
5257 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
5258 || strcmp (temp, TARGET_EXECUTABLE_SUFFIX) == 0
5259 #endif
5260 || strcmp (obase, "a.out") == 0)))
5262 tofree = xstrndup (obase, blen - xlen);
5263 obase = tofree;
5267 /* We wish to save this basename to the -dumpdir passed through
5268 GCC_COLLECT_OPTIONS within maybe_run_linker, for e.g. LTO,
5269 but we do NOT wish to add it to e.g. %b, so we keep
5270 outbase_length as zero. */
5271 gcc_assert (!outbase);
5272 outbase_length = 0;
5274 /* If we're building [dir1/]foo[.exe] out of a single input
5275 [dir2/]foo.c that shares the same basename, dump to
5276 [dir2/]foo.c.* rather than duplicating the basename into
5277 [dir2/]foo-foo.c.*. */
5278 int idxin;
5279 if (dumpbase
5280 || ((idxin = single_input_file_index ()) >= 0
5281 && adds_single_suffix_p (lbasename (infiles[idxin].name),
5282 obase)))
5284 if (obase == tofree)
5285 outbase = tofree;
5286 else
5288 outbase = xstrdup (obase);
5289 free (tofree);
5291 obase = tofree = NULL;
5293 else
5295 if (dumpdir)
5297 char *p = concat (dumpdir, obase, "-", NULL);
5298 free (dumpdir);
5299 dumpdir = p;
5301 else
5302 dumpdir = concat (obase, "-", NULL);
5304 dumpdir_trailing_dash_added = true;
5306 free (tofree);
5307 obase = tofree = NULL;
5310 if (!explicit_dumpdir || dumpbase)
5312 /* Absent -dumpbase and present -dumpbase-ext have been applied
5313 to the linker output name, so compute fresh defaults for each
5314 compilation. */
5315 free (dumpbase_ext);
5316 dumpbase_ext = NULL;
5320 /* Now, if we're compiling, or if we haven't used the dumpbase
5321 above, then outbase (%B) is derived from dumpbase, if given, or
5322 from the output name, given or implied. We can't precompute
5323 implied output names, but that's ok, since they're derived from
5324 input names. Just make sure we skip this if dumpbase is the
5325 empty string: we want to use input names then, so don't set
5326 outbase. */
5327 if ((dumpbase || have_c)
5328 && !(dumpbase && !*dumpbase))
5330 gcc_assert (!outbase);
5332 if (dumpbase)
5334 gcc_assert (single_input_file_index () != -2);
5335 /* We do not want lbasename here; dumpbase with dirnames
5336 overrides dumpdir entirely, even if dumpdir is
5337 specified. */
5338 if (dumpbase_ext)
5339 /* We've already checked above that the suffix matches. */
5340 outbase = xstrndup (dumpbase,
5341 strlen (dumpbase) - strlen (dumpbase_ext));
5342 else
5343 outbase = xstrdup (dumpbase);
5345 else if (output_file && !not_actual_file_p (output_file))
5347 outbase = xstrdup (lbasename (output_file));
5348 char *p = strrchr (outbase + 1, '.');
5349 if (p)
5350 *p = '\0';
5353 if (outbase)
5354 outbase_length = strlen (outbase);
5357 /* If there is any pathname component in an explicit -dumpbase, do
5358 not use dumpdir, but retain it to pass it on to the compiler. */
5359 if (dumpdir)
5360 dumpdir_length = strlen (dumpdir);
5361 else
5362 dumpdir_length = 0;
5364 /* Check that dumpbase_ext, if still present, still matches the end
5365 of dumpbase, if present, and drop it otherwise. We only retained
5366 it above when dumpbase was absent to maybe use it to drop the
5367 extension from output_name before combining it with dumpdir. We
5368 won't deal with -dumpbase-ext when -dumpbase is not explicitly
5369 given, even if just to activate backward-compatible dumpbase:
5370 dropping it on the floor is correct, expected and documented
5371 behavior. Attempting to deal with a -dumpbase-ext that might
5372 match the end of some input filename, or of the combination of
5373 the output basename with the suffix of the input filename,
5374 possible with an intermediate .gk extension for -fcompare-debug,
5375 is just calling for trouble. */
5376 if (dumpbase_ext)
5378 if (!dumpbase || !*dumpbase)
5380 free (dumpbase_ext);
5381 dumpbase_ext = NULL;
5383 else
5384 gcc_assert (strcmp (dumpbase + strlen (dumpbase)
5385 - strlen (dumpbase_ext), dumpbase_ext) == 0);
5388 if (save_temps_flag && use_pipes)
5390 /* -save-temps overrides -pipe, so that temp files are produced */
5391 if (save_temps_flag)
5392 warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
5393 use_pipes = 0;
5396 if (!compare_debug)
5398 const char *gcd = env.get ("GCC_COMPARE_DEBUG");
5400 if (gcd && gcd[0] == '-')
5402 compare_debug = 2;
5403 compare_debug_opt = gcd;
5405 else if (gcd && *gcd && strcmp (gcd, "0"))
5407 compare_debug = 3;
5408 compare_debug_opt = "-gtoggle";
5411 else if (compare_debug < 0)
5413 compare_debug = 0;
5414 gcc_assert (!compare_debug_opt);
5417 /* Set up the search paths. We add directories that we expect to
5418 contain GNU Toolchain components before directories specified by
5419 the machine description so that we will find GNU components (like
5420 the GNU assembler) before those of the host system. */
5422 /* If we don't know where the toolchain has been installed, use the
5423 configured-in locations. */
5424 if (!gcc_exec_prefix)
5426 #ifndef OS2
5427 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
5428 PREFIX_PRIORITY_LAST, 1, 0);
5429 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
5430 PREFIX_PRIORITY_LAST, 2, 0);
5431 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
5432 PREFIX_PRIORITY_LAST, 2, 0);
5433 #endif
5434 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
5435 PREFIX_PRIORITY_LAST, 1, 0);
5438 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
5439 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
5440 dir_separator_str, NULL);
5442 /* Look for tools relative to the location from which the driver is
5443 running, or, if that is not available, the configured prefix. */
5444 tooldir_prefix
5445 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
5446 spec_host_machine, dir_separator_str, spec_version,
5447 accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL);
5448 free (tooldir_prefix2);
5450 add_prefix (&exec_prefixes,
5451 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
5452 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
5453 add_prefix (&startfile_prefixes,
5454 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
5455 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
5456 free (tooldir_prefix);
5458 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
5459 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
5460 then consider it to relocate with the rest of the GCC installation
5461 if GCC_EXEC_PREFIX is set.
5462 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
5463 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
5465 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
5466 standard_bindir_prefix,
5467 target_system_root);
5468 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
5470 target_system_root = tmp_prefix;
5471 target_system_root_changed = 1;
5474 #endif
5476 /* More prefixes are enabled in main, after we read the specs file
5477 and determine whether this is cross-compilation or not. */
5479 if (n_infiles != 0 && n_infiles == last_language_n_infiles && spec_lang != 0)
5480 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
5482 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
5483 environment variable. */
5484 if (compare_debug == 2 || compare_debug == 3)
5486 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
5487 save_switch (opt, 0, NULL, false, true);
5488 compare_debug = 1;
5491 /* Ensure we only invoke each subprocess once. */
5492 if (n_infiles == 0
5493 && (print_subprocess_help || print_help_list || print_version))
5495 /* Create a dummy input file, so that we can pass
5496 the help option on to the various sub-processes. */
5497 add_infile ("help-dummy", "c");
5500 /* Decide if undefined variable references are allowed in specs. */
5502 /* -v alone is safe. --version and --help alone or together are safe. Note
5503 that -v would make them unsafe, as they'd then be run for subprocesses as
5504 well, the location of which might depend on variables possibly coming
5505 from self-specs. Note also that the command name is counted in
5506 decoded_options_count. */
5508 unsigned help_version_count = 0;
5510 if (print_version)
5511 help_version_count++;
5513 if (print_help_list)
5514 help_version_count++;
5516 spec_undefvar_allowed =
5517 ((verbose_flag && decoded_options_count == 2)
5518 || help_version_count == decoded_options_count - 1);
5520 alloc_switch ();
5521 switches[n_switches].part1 = 0;
5522 alloc_infile ();
5523 infiles[n_infiles].name = 0;
5526 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
5527 and place that in the environment. */
5529 static void
5530 set_collect_gcc_options (void)
5532 int i;
5533 int first_time;
5535 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5536 the compiler. */
5537 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5538 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5540 first_time = true;
5541 for (i = 0; (int) i < n_switches; i++)
5543 const char *const *args;
5544 const char *p, *q;
5545 if (!first_time)
5546 obstack_grow (&collect_obstack, " ", 1);
5548 first_time = false;
5550 /* Ignore elided switches. */
5551 if ((switches[i].live_cond
5552 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
5553 == SWITCH_IGNORE)
5554 continue;
5556 obstack_grow (&collect_obstack, "'-", 2);
5557 q = switches[i].part1;
5558 while ((p = strchr (q, '\'')))
5560 obstack_grow (&collect_obstack, q, p - q);
5561 obstack_grow (&collect_obstack, "'\\''", 4);
5562 q = ++p;
5564 obstack_grow (&collect_obstack, q, strlen (q));
5565 obstack_grow (&collect_obstack, "'", 1);
5567 for (args = switches[i].args; args && *args; args++)
5569 obstack_grow (&collect_obstack, " '", 2);
5570 q = *args;
5571 while ((p = strchr (q, '\'')))
5573 obstack_grow (&collect_obstack, q, p - q);
5574 obstack_grow (&collect_obstack, "'\\''", 4);
5575 q = ++p;
5577 obstack_grow (&collect_obstack, q, strlen (q));
5578 obstack_grow (&collect_obstack, "'", 1);
5582 if (dumpdir)
5584 if (!first_time)
5585 obstack_grow (&collect_obstack, " ", 1);
5586 first_time = false;
5588 obstack_grow (&collect_obstack, "'-dumpdir' '", 12);
5589 const char *p, *q;
5591 q = dumpdir;
5592 while ((p = strchr (q, '\'')))
5594 obstack_grow (&collect_obstack, q, p - q);
5595 obstack_grow (&collect_obstack, "'\\''", 4);
5596 q = ++p;
5598 obstack_grow (&collect_obstack, q, strlen (q));
5600 obstack_grow (&collect_obstack, "'", 1);
5603 obstack_grow (&collect_obstack, "\0", 1);
5604 xputenv (XOBFINISH (&collect_obstack, char *));
5607 /* Process a spec string, accumulating and running commands. */
5609 /* These variables describe the input file name.
5610 input_file_number is the index on outfiles of this file,
5611 so that the output file name can be stored for later use by %o.
5612 input_basename is the start of the part of the input file
5613 sans all directory names, and basename_length is the number
5614 of characters starting there excluding the suffix .c or whatever. */
5616 static const char *gcc_input_filename;
5617 static int input_file_number;
5618 size_t input_filename_length;
5619 static int basename_length;
5620 static int suffixed_basename_length;
5621 static const char *input_basename;
5622 static const char *input_suffix;
5623 #ifndef HOST_LACKS_INODE_NUMBERS
5624 static struct stat input_stat;
5625 #endif
5626 static int input_stat_set;
5628 /* The compiler used to process the current input file. */
5629 static struct compiler *input_file_compiler;
5631 /* These are variables used within do_spec and do_spec_1. */
5633 /* Nonzero if an arg has been started and not yet terminated
5634 (with space, tab or newline). */
5635 static int arg_going;
5637 /* Nonzero means %d or %g has been seen; the next arg to be terminated
5638 is a temporary file name. */
5639 static int delete_this_arg;
5641 /* Nonzero means %w has been seen; the next arg to be terminated
5642 is the output file name of this compilation. */
5643 static int this_is_output_file;
5645 /* Nonzero means %s has been seen; the next arg to be terminated
5646 is the name of a library file and we should try the standard
5647 search dirs for it. */
5648 static int this_is_library_file;
5650 /* Nonzero means %T has been seen; the next arg to be terminated
5651 is the name of a linker script and we should try all of the
5652 standard search dirs for it. If it is found insert a --script
5653 command line switch and then substitute the full path in place,
5654 otherwise generate an error message. */
5655 static int this_is_linker_script;
5657 /* Nonzero means that the input of this command is coming from a pipe. */
5658 static int input_from_pipe;
5660 /* Nonnull means substitute this for any suffix when outputting a switches
5661 arguments. */
5662 static const char *suffix_subst;
5664 /* If there is an argument being accumulated, terminate it and store it. */
5666 static void
5667 end_going_arg (void)
5669 if (arg_going)
5671 const char *string;
5673 obstack_1grow (&obstack, 0);
5674 string = XOBFINISH (&obstack, const char *);
5675 if (this_is_library_file)
5676 string = find_file (string);
5677 if (this_is_linker_script)
5679 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
5681 if (full_script_path == NULL)
5683 error ("unable to locate default linker script %qs in the library search paths", string);
5684 /* Script was not found on search path. */
5685 return;
5687 store_arg ("--script", false, false);
5688 string = full_script_path;
5690 store_arg (string, delete_this_arg, this_is_output_file);
5691 if (this_is_output_file)
5692 outfiles[input_file_number] = string;
5693 arg_going = 0;
5698 /* Parse the WRAPPER string which is a comma separated list of the command line
5699 and insert them into the beginning of argbuf. */
5701 static void
5702 insert_wrapper (const char *wrapper)
5704 int n = 0;
5705 int i;
5706 char *buf = xstrdup (wrapper);
5707 char *p = buf;
5708 unsigned int old_length = argbuf.length ();
5712 n++;
5713 while (*p == ',')
5714 p++;
5716 while ((p = strchr (p, ',')) != NULL);
5718 argbuf.safe_grow (old_length + n, true);
5719 memmove (argbuf.address () + n,
5720 argbuf.address (),
5721 old_length * sizeof (const_char_p));
5723 i = 0;
5724 p = buf;
5727 while (*p == ',')
5729 *p = 0;
5730 p++;
5732 argbuf[i] = p;
5733 i++;
5735 while ((p = strchr (p, ',')) != NULL);
5736 gcc_assert (i == n);
5739 /* Process the spec SPEC and run the commands specified therein.
5740 Returns 0 if the spec is successfully processed; -1 if failed. */
5743 do_spec (const char *spec)
5745 int value;
5747 value = do_spec_2 (spec, NULL);
5749 /* Force out any unfinished command.
5750 If -pipe, this forces out the last command if it ended in `|'. */
5751 if (value == 0)
5753 if (argbuf.length () > 0
5754 && !strcmp (argbuf.last (), "|"))
5755 argbuf.pop ();
5757 set_collect_gcc_options ();
5759 if (argbuf.length () > 0)
5760 value = execute ();
5763 return value;
5766 /* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
5767 of a matched * pattern which may be re-injected by way of %*. */
5769 static int
5770 do_spec_2 (const char *spec, const char *soft_matched_part)
5772 int result;
5774 clear_args ();
5775 arg_going = 0;
5776 delete_this_arg = 0;
5777 this_is_output_file = 0;
5778 this_is_library_file = 0;
5779 this_is_linker_script = 0;
5780 input_from_pipe = 0;
5781 suffix_subst = NULL;
5783 result = do_spec_1 (spec, 0, soft_matched_part);
5785 end_going_arg ();
5787 return result;
5790 /* Process the given spec string and add any new options to the end
5791 of the switches/n_switches array. */
5793 static void
5794 do_option_spec (const char *name, const char *spec)
5796 unsigned int i, value_count, value_len;
5797 const char *p, *q, *value;
5798 char *tmp_spec, *tmp_spec_p;
5800 if (configure_default_options[0].name == NULL)
5801 return;
5803 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
5804 if (strcmp (configure_default_options[i].name, name) == 0)
5805 break;
5806 if (i == ARRAY_SIZE (configure_default_options))
5807 return;
5809 value = configure_default_options[i].value;
5810 value_len = strlen (value);
5812 /* Compute the size of the final spec. */
5813 value_count = 0;
5814 p = spec;
5815 while ((p = strstr (p, "%(VALUE)")) != NULL)
5817 p ++;
5818 value_count ++;
5821 /* Replace each %(VALUE) by the specified value. */
5822 tmp_spec = (char *) alloca (strlen (spec) + 1
5823 + value_count * (value_len - strlen ("%(VALUE)")));
5824 tmp_spec_p = tmp_spec;
5825 q = spec;
5826 while ((p = strstr (q, "%(VALUE)")) != NULL)
5828 memcpy (tmp_spec_p, q, p - q);
5829 tmp_spec_p = tmp_spec_p + (p - q);
5830 memcpy (tmp_spec_p, value, value_len);
5831 tmp_spec_p += value_len;
5832 q = p + strlen ("%(VALUE)");
5834 strcpy (tmp_spec_p, q);
5836 do_self_spec (tmp_spec);
5839 /* Process the given spec string and add any new options to the end
5840 of the switches/n_switches array. */
5842 static void
5843 do_self_spec (const char *spec)
5845 int i;
5847 do_spec_2 (spec, NULL);
5848 do_spec_1 (" ", 0, NULL);
5850 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
5851 do_self_specs adds the replacements to switches array, so it shouldn't
5852 be processed afterwards. */
5853 for (i = 0; i < n_switches; i++)
5854 if ((switches[i].live_cond & SWITCH_IGNORE))
5855 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
5857 if (argbuf.length () > 0)
5859 const char **argbuf_copy;
5860 struct cl_decoded_option *decoded_options;
5861 struct cl_option_handlers handlers;
5862 unsigned int decoded_options_count;
5863 unsigned int j;
5865 /* Create a copy of argbuf with a dummy argv[0] entry for
5866 decode_cmdline_options_to_array. */
5867 argbuf_copy = XNEWVEC (const char *,
5868 argbuf.length () + 1);
5869 argbuf_copy[0] = "";
5870 memcpy (argbuf_copy + 1, argbuf.address (),
5871 argbuf.length () * sizeof (const char *));
5873 decode_cmdline_options_to_array (argbuf.length () + 1,
5874 argbuf_copy,
5875 CL_DRIVER, &decoded_options,
5876 &decoded_options_count);
5877 free (argbuf_copy);
5879 set_option_handlers (&handlers);
5881 for (j = 1; j < decoded_options_count; j++)
5883 switch (decoded_options[j].opt_index)
5885 case OPT_SPECIAL_input_file:
5886 /* Specs should only generate options, not input
5887 files. */
5888 if (strcmp (decoded_options[j].arg, "-") != 0)
5889 fatal_error (input_location,
5890 "switch %qs does not start with %<-%>",
5891 decoded_options[j].arg);
5892 else
5893 fatal_error (input_location,
5894 "spec-generated switch is just %<-%>");
5895 break;
5897 case OPT_fcompare_debug_second:
5898 case OPT_fcompare_debug:
5899 case OPT_fcompare_debug_:
5900 case OPT_o:
5901 /* Avoid duplicate processing of some options from
5902 compare-debug specs; just save them here. */
5903 save_switch (decoded_options[j].canonical_option[0],
5904 (decoded_options[j].canonical_option_num_elements
5905 - 1),
5906 &decoded_options[j].canonical_option[1], false, true);
5907 break;
5909 default:
5910 read_cmdline_option (&global_options, &global_options_set,
5911 decoded_options + j, UNKNOWN_LOCATION,
5912 CL_DRIVER, &handlers, global_dc);
5913 break;
5917 free (decoded_options);
5919 alloc_switch ();
5920 switches[n_switches].part1 = 0;
5924 /* Callback for processing %D and %I specs. */
5926 struct spec_path_info {
5927 const char *option;
5928 const char *append;
5929 size_t append_len;
5930 bool omit_relative;
5931 bool separate_options;
5934 static void *
5935 spec_path (char *path, void *data)
5937 struct spec_path_info *info = (struct spec_path_info *) data;
5938 size_t len = 0;
5939 char save = 0;
5941 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
5942 return NULL;
5944 if (info->append_len != 0)
5946 len = strlen (path);
5947 memcpy (path + len, info->append, info->append_len + 1);
5950 if (!is_directory (path, true))
5951 return NULL;
5953 do_spec_1 (info->option, 1, NULL);
5954 if (info->separate_options)
5955 do_spec_1 (" ", 0, NULL);
5957 if (info->append_len == 0)
5959 len = strlen (path);
5960 save = path[len - 1];
5961 if (IS_DIR_SEPARATOR (path[len - 1]))
5962 path[len - 1] = '\0';
5965 do_spec_1 (path, 1, NULL);
5966 do_spec_1 (" ", 0, NULL);
5968 /* Must not damage the original path. */
5969 if (info->append_len == 0)
5970 path[len - 1] = save;
5972 return NULL;
5975 /* True if we should compile INFILE. */
5977 static bool
5978 compile_input_file_p (struct infile *infile)
5980 if ((!infile->language) || (infile->language[0] != '*'))
5981 if (infile->incompiler == input_file_compiler)
5982 return true;
5983 return false;
5986 /* Process each member of VEC as a spec. */
5988 static void
5989 do_specs_vec (vec<char_p> vec)
5991 for (char *opt : vec)
5993 do_spec_1 (opt, 1, NULL);
5994 /* Make each accumulated option a separate argument. */
5995 do_spec_1 (" ", 0, NULL);
5999 /* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS. */
6001 static void
6002 putenv_COLLECT_AS_OPTIONS (vec<char_p> vec)
6004 if (vec.is_empty ())
6005 return;
6007 obstack_init (&collect_obstack);
6008 obstack_grow (&collect_obstack, "COLLECT_AS_OPTIONS=",
6009 strlen ("COLLECT_AS_OPTIONS="));
6011 char *opt;
6012 unsigned ix;
6014 FOR_EACH_VEC_ELT (vec, ix, opt)
6016 obstack_1grow (&collect_obstack, '\'');
6017 obstack_grow (&collect_obstack, opt, strlen (opt));
6018 obstack_1grow (&collect_obstack, '\'');
6019 if (ix < vec.length () - 1)
6020 obstack_1grow(&collect_obstack, ' ');
6023 obstack_1grow (&collect_obstack, '\0');
6024 xputenv (XOBFINISH (&collect_obstack, char *));
6027 /* Process the sub-spec SPEC as a portion of a larger spec.
6028 This is like processing a whole spec except that we do
6029 not initialize at the beginning and we do not supply a
6030 newline by default at the end.
6031 INSWITCH nonzero means don't process %-sequences in SPEC;
6032 in this case, % is treated as an ordinary character.
6033 This is used while substituting switches.
6034 INSWITCH nonzero also causes SPC not to terminate an argument.
6036 Value is zero unless a line was finished
6037 and the command on that line reported an error. */
6039 static int
6040 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
6042 const char *p = spec;
6043 int c;
6044 int i;
6045 int value;
6047 /* If it's an empty string argument to a switch, keep it as is. */
6048 if (inswitch && !*p)
6049 arg_going = 1;
6051 while ((c = *p++))
6052 /* If substituting a switch, treat all chars like letters.
6053 Otherwise, NL, SPC, TAB and % are special. */
6054 switch (inswitch ? 'a' : c)
6056 case '\n':
6057 end_going_arg ();
6059 if (argbuf.length () > 0
6060 && !strcmp (argbuf.last (), "|"))
6062 /* A `|' before the newline means use a pipe here,
6063 but only if -pipe was specified.
6064 Otherwise, execute now and don't pass the `|' as an arg. */
6065 if (use_pipes)
6067 input_from_pipe = 1;
6068 break;
6070 else
6071 argbuf.pop ();
6074 set_collect_gcc_options ();
6076 if (argbuf.length () > 0)
6078 value = execute ();
6079 if (value)
6080 return value;
6082 /* Reinitialize for a new command, and for a new argument. */
6083 clear_args ();
6084 arg_going = 0;
6085 delete_this_arg = 0;
6086 this_is_output_file = 0;
6087 this_is_library_file = 0;
6088 this_is_linker_script = 0;
6089 input_from_pipe = 0;
6090 break;
6092 case '|':
6093 end_going_arg ();
6095 /* Use pipe */
6096 obstack_1grow (&obstack, c);
6097 arg_going = 1;
6098 break;
6100 case '\t':
6101 case ' ':
6102 end_going_arg ();
6104 /* Reinitialize for a new argument. */
6105 delete_this_arg = 0;
6106 this_is_output_file = 0;
6107 this_is_library_file = 0;
6108 this_is_linker_script = 0;
6109 break;
6111 case '%':
6112 switch (c = *p++)
6114 case 0:
6115 fatal_error (input_location, "spec %qs invalid", spec);
6117 case 'b':
6118 /* Don't use %b in the linker command. */
6119 gcc_assert (suffixed_basename_length);
6120 if (!this_is_output_file && dumpdir_length)
6121 obstack_grow (&obstack, dumpdir, dumpdir_length);
6122 if (this_is_output_file || !outbase_length)
6123 obstack_grow (&obstack, input_basename, basename_length);
6124 else
6125 obstack_grow (&obstack, outbase, outbase_length);
6126 if (compare_debug < 0)
6127 obstack_grow (&obstack, ".gk", 3);
6128 arg_going = 1;
6129 break;
6131 case 'B':
6132 /* Don't use %B in the linker command. */
6133 gcc_assert (suffixed_basename_length);
6134 if (!this_is_output_file && dumpdir_length)
6135 obstack_grow (&obstack, dumpdir, dumpdir_length);
6136 if (this_is_output_file || !outbase_length)
6137 obstack_grow (&obstack, input_basename, basename_length);
6138 else
6139 obstack_grow (&obstack, outbase, outbase_length);
6140 if (compare_debug < 0)
6141 obstack_grow (&obstack, ".gk", 3);
6142 obstack_grow (&obstack, input_basename + basename_length,
6143 suffixed_basename_length - basename_length);
6145 arg_going = 1;
6146 break;
6148 case 'd':
6149 delete_this_arg = 2;
6150 break;
6152 /* Dump out the directories specified with LIBRARY_PATH,
6153 followed by the absolute directories
6154 that we search for startfiles. */
6155 case 'D':
6157 struct spec_path_info info;
6159 info.option = "-L";
6160 info.append_len = 0;
6161 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
6162 /* Used on systems which record the specified -L dirs
6163 and use them to search for dynamic linking.
6164 Relative directories always come from -B,
6165 and it is better not to use them for searching
6166 at run time. In particular, stage1 loses. */
6167 info.omit_relative = true;
6168 #else
6169 info.omit_relative = false;
6170 #endif
6171 info.separate_options = false;
6173 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
6175 break;
6177 case 'e':
6178 /* %efoo means report an error with `foo' as error message
6179 and don't execute any more commands for this file. */
6181 const char *q = p;
6182 char *buf;
6183 while (*p != 0 && *p != '\n')
6184 p++;
6185 buf = (char *) alloca (p - q + 1);
6186 strncpy (buf, q, p - q);
6187 buf[p - q] = 0;
6188 error ("%s", _(buf));
6189 return -1;
6191 break;
6192 case 'n':
6193 /* %nfoo means report a notice with `foo' on stderr. */
6195 const char *q = p;
6196 char *buf;
6197 while (*p != 0 && *p != '\n')
6198 p++;
6199 buf = (char *) alloca (p - q + 1);
6200 strncpy (buf, q, p - q);
6201 buf[p - q] = 0;
6202 inform (UNKNOWN_LOCATION, "%s", _(buf));
6203 if (*p)
6204 p++;
6206 break;
6208 case 'j':
6210 struct stat st;
6212 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
6213 defined, and it is not a directory, and it is
6214 writable, use it. Otherwise, treat this like any
6215 other temporary file. */
6217 if ((!save_temps_flag)
6218 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
6219 && (access (HOST_BIT_BUCKET, W_OK) == 0))
6221 obstack_grow (&obstack, HOST_BIT_BUCKET,
6222 strlen (HOST_BIT_BUCKET));
6223 delete_this_arg = 0;
6224 arg_going = 1;
6225 break;
6228 goto create_temp_file;
6229 case '|':
6230 if (use_pipes)
6232 obstack_1grow (&obstack, '-');
6233 delete_this_arg = 0;
6234 arg_going = 1;
6236 /* consume suffix */
6237 while (*p == '.' || ISALNUM ((unsigned char) *p))
6238 p++;
6239 if (p[0] == '%' && p[1] == 'O')
6240 p += 2;
6242 break;
6244 goto create_temp_file;
6245 case 'm':
6246 if (use_pipes)
6248 /* consume suffix */
6249 while (*p == '.' || ISALNUM ((unsigned char) *p))
6250 p++;
6251 if (p[0] == '%' && p[1] == 'O')
6252 p += 2;
6254 break;
6256 goto create_temp_file;
6257 case 'g':
6258 case 'u':
6259 case 'U':
6260 create_temp_file:
6262 struct temp_name *t;
6263 int suffix_length;
6264 const char *suffix = p;
6265 char *saved_suffix = NULL;
6267 while (*p == '.' || ISALNUM ((unsigned char) *p))
6268 p++;
6269 suffix_length = p - suffix;
6270 if (p[0] == '%' && p[1] == 'O')
6272 p += 2;
6273 /* We don't support extra suffix characters after %O. */
6274 if (*p == '.' || ISALNUM ((unsigned char) *p))
6275 fatal_error (input_location,
6276 "spec %qs has invalid %<%%0%c%>", spec, *p);
6277 if (suffix_length == 0)
6278 suffix = TARGET_OBJECT_SUFFIX;
6279 else
6281 saved_suffix
6282 = XNEWVEC (char, suffix_length
6283 + strlen (TARGET_OBJECT_SUFFIX) + 1);
6284 strncpy (saved_suffix, suffix, suffix_length);
6285 strcpy (saved_suffix + suffix_length,
6286 TARGET_OBJECT_SUFFIX);
6288 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
6291 if (compare_debug < 0)
6293 suffix = concat (".gk", suffix, NULL);
6294 suffix_length += 3;
6297 /* If -save-temps was specified, use that for the
6298 temp file. */
6299 if (save_temps_flag)
6301 char *tmp;
6302 bool adjusted_suffix = false;
6303 if (suffix_length
6304 && !outbase_length && !basename_length
6305 && !dumpdir_trailing_dash_added)
6307 adjusted_suffix = true;
6308 suffix++;
6309 suffix_length--;
6311 temp_filename_length
6312 = dumpdir_length + suffix_length + 1;
6313 if (outbase_length)
6314 temp_filename_length += outbase_length;
6315 else
6316 temp_filename_length += basename_length;
6317 tmp = (char *) alloca (temp_filename_length);
6318 if (dumpdir_length)
6319 memcpy (tmp, dumpdir, dumpdir_length);
6320 if (outbase_length)
6321 memcpy (tmp + dumpdir_length, outbase,
6322 outbase_length);
6323 else if (basename_length)
6324 memcpy (tmp + dumpdir_length, input_basename,
6325 basename_length);
6326 memcpy (tmp + temp_filename_length - suffix_length - 1,
6327 suffix, suffix_length);
6328 if (adjusted_suffix)
6330 adjusted_suffix = false;
6331 suffix--;
6332 suffix_length++;
6334 tmp[temp_filename_length - 1] = '\0';
6335 temp_filename = tmp;
6337 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
6339 #ifndef HOST_LACKS_INODE_NUMBERS
6340 struct stat st_temp;
6342 /* Note, set_input() resets input_stat_set to 0. */
6343 if (input_stat_set == 0)
6345 input_stat_set = stat (gcc_input_filename,
6346 &input_stat);
6347 if (input_stat_set >= 0)
6348 input_stat_set = 1;
6351 /* If we have the stat for the gcc_input_filename
6352 and we can do the stat for the temp_filename
6353 then the they could still refer to the same
6354 file if st_dev/st_ino's are the same. */
6355 if (input_stat_set != 1
6356 || stat (temp_filename, &st_temp) < 0
6357 || input_stat.st_dev != st_temp.st_dev
6358 || input_stat.st_ino != st_temp.st_ino)
6359 #else
6360 /* Just compare canonical pathnames. */
6361 char* input_realname = lrealpath (gcc_input_filename);
6362 char* temp_realname = lrealpath (temp_filename);
6363 bool files_differ = filename_cmp (input_realname, temp_realname);
6364 free (input_realname);
6365 free (temp_realname);
6366 if (files_differ)
6367 #endif
6369 temp_filename
6370 = save_string (temp_filename,
6371 temp_filename_length - 1);
6372 obstack_grow (&obstack, temp_filename,
6373 temp_filename_length);
6374 arg_going = 1;
6375 delete_this_arg = 0;
6376 break;
6381 /* See if we already have an association of %g/%u/%U and
6382 suffix. */
6383 for (t = temp_names; t; t = t->next)
6384 if (t->length == suffix_length
6385 && strncmp (t->suffix, suffix, suffix_length) == 0
6386 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
6387 break;
6389 /* Make a new association if needed. %u and %j
6390 require one. */
6391 if (t == 0 || c == 'u' || c == 'j')
6393 if (t == 0)
6395 t = XNEW (struct temp_name);
6396 t->next = temp_names;
6397 temp_names = t;
6399 t->length = suffix_length;
6400 if (saved_suffix)
6402 t->suffix = saved_suffix;
6403 saved_suffix = NULL;
6405 else
6406 t->suffix = save_string (suffix, suffix_length);
6407 t->unique = (c == 'u' || c == 'U' || c == 'j');
6408 temp_filename = make_temp_file (t->suffix);
6409 temp_filename_length = strlen (temp_filename);
6410 t->filename = temp_filename;
6411 t->filename_length = temp_filename_length;
6414 free (saved_suffix);
6416 obstack_grow (&obstack, t->filename, t->filename_length);
6417 delete_this_arg = 1;
6419 arg_going = 1;
6420 break;
6422 case 'i':
6423 if (combine_inputs)
6425 /* We are going to expand `%i' into `@FILE', where FILE
6426 is a newly-created temporary filename. The filenames
6427 that would usually be expanded in place of %o will be
6428 written to the temporary file. */
6429 if (at_file_supplied)
6430 open_at_file ();
6432 for (i = 0; (int) i < n_infiles; i++)
6433 if (compile_input_file_p (&infiles[i]))
6435 store_arg (infiles[i].name, 0, 0);
6436 infiles[i].compiled = true;
6439 if (at_file_supplied)
6440 close_at_file ();
6442 else
6444 obstack_grow (&obstack, gcc_input_filename,
6445 input_filename_length);
6446 arg_going = 1;
6448 break;
6450 case 'I':
6452 struct spec_path_info info;
6454 if (multilib_dir)
6456 do_spec_1 ("-imultilib", 1, NULL);
6457 /* Make this a separate argument. */
6458 do_spec_1 (" ", 0, NULL);
6459 do_spec_1 (multilib_dir, 1, NULL);
6460 do_spec_1 (" ", 0, NULL);
6463 if (multiarch_dir)
6465 do_spec_1 ("-imultiarch", 1, NULL);
6466 /* Make this a separate argument. */
6467 do_spec_1 (" ", 0, NULL);
6468 do_spec_1 (multiarch_dir, 1, NULL);
6469 do_spec_1 (" ", 0, NULL);
6472 if (gcc_exec_prefix)
6474 do_spec_1 ("-iprefix", 1, NULL);
6475 /* Make this a separate argument. */
6476 do_spec_1 (" ", 0, NULL);
6477 do_spec_1 (gcc_exec_prefix, 1, NULL);
6478 do_spec_1 (" ", 0, NULL);
6481 if (target_system_root_changed ||
6482 (target_system_root && target_sysroot_hdrs_suffix))
6484 do_spec_1 ("-isysroot", 1, NULL);
6485 /* Make this a separate argument. */
6486 do_spec_1 (" ", 0, NULL);
6487 do_spec_1 (target_system_root, 1, NULL);
6488 if (target_sysroot_hdrs_suffix)
6489 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
6490 do_spec_1 (" ", 0, NULL);
6493 info.option = "-isystem";
6494 info.append = "include";
6495 info.append_len = strlen (info.append);
6496 info.omit_relative = false;
6497 info.separate_options = true;
6499 for_each_path (&include_prefixes, false, info.append_len,
6500 spec_path, &info);
6502 info.append = "include-fixed";
6503 if (*sysroot_hdrs_suffix_spec)
6504 info.append = concat (info.append, dir_separator_str,
6505 multilib_dir, NULL);
6506 else if (multiarch_dir)
6508 /* For multiarch, search include-fixed/<multiarch-dir>
6509 before include-fixed. */
6510 info.append = concat (info.append, dir_separator_str,
6511 multiarch_dir, NULL);
6512 info.append_len = strlen (info.append);
6513 for_each_path (&include_prefixes, false, info.append_len,
6514 spec_path, &info);
6516 info.append = "include-fixed";
6518 info.append_len = strlen (info.append);
6519 for_each_path (&include_prefixes, false, info.append_len,
6520 spec_path, &info);
6522 break;
6524 case 'o':
6525 /* We are going to expand `%o' into `@FILE', where FILE
6526 is a newly-created temporary filename. The filenames
6527 that would usually be expanded in place of %o will be
6528 written to the temporary file. */
6529 if (at_file_supplied)
6530 open_at_file ();
6532 for (i = 0; i < n_infiles + lang_specific_extra_outfiles; i++)
6533 if (outfiles[i])
6534 store_arg (outfiles[i], 0, 0);
6536 if (at_file_supplied)
6537 close_at_file ();
6538 break;
6540 case 'O':
6541 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
6542 arg_going = 1;
6543 break;
6545 case 's':
6546 this_is_library_file = 1;
6547 break;
6549 case 'T':
6550 this_is_linker_script = 1;
6551 break;
6553 case 'V':
6554 outfiles[input_file_number] = NULL;
6555 break;
6557 case 'w':
6558 this_is_output_file = 1;
6559 break;
6561 case 'W':
6563 unsigned int cur_index = argbuf.length ();
6564 /* Handle the {...} following the %W. */
6565 if (*p != '{')
6566 fatal_error (input_location,
6567 "spec %qs has invalid %<%%W%c%>", spec, *p);
6568 p = handle_braces (p + 1);
6569 if (p == 0)
6570 return -1;
6571 end_going_arg ();
6572 /* If any args were output, mark the last one for deletion
6573 on failure. */
6574 if (argbuf.length () != cur_index)
6575 record_temp_file (argbuf.last (), 0, 1);
6576 break;
6579 case '@':
6580 /* Handle the {...} following the %@. */
6581 if (*p != '{')
6582 fatal_error (input_location,
6583 "spec %qs has invalid %<%%@%c%>", spec, *p);
6584 if (at_file_supplied)
6585 open_at_file ();
6586 p = handle_braces (p + 1);
6587 if (at_file_supplied)
6588 close_at_file ();
6589 if (p == 0)
6590 return -1;
6591 break;
6593 /* %x{OPTION} records OPTION for %X to output. */
6594 case 'x':
6596 const char *p1 = p;
6597 char *string;
6599 /* Skip past the option value and make a copy. */
6600 if (*p != '{')
6601 fatal_error (input_location,
6602 "spec %qs has invalid %<%%x%c%>", spec, *p);
6603 while (*p++ != '}')
6605 string = save_string (p1 + 1, p - p1 - 2);
6607 /* See if we already recorded this option. */
6608 for (const char *opt : linker_options)
6609 if (! strcmp (string, opt))
6611 free (string);
6612 return 0;
6615 /* This option is new; add it. */
6616 add_linker_option (string, strlen (string));
6617 free (string);
6619 break;
6621 /* Dump out the options accumulated previously using %x. */
6622 case 'X':
6623 do_specs_vec (linker_options);
6624 break;
6626 /* Dump out the options accumulated previously using -Wa,. */
6627 case 'Y':
6628 do_specs_vec (assembler_options);
6629 break;
6631 /* Dump out the options accumulated previously using -Wp,. */
6632 case 'Z':
6633 do_specs_vec (preprocessor_options);
6634 break;
6636 /* Here are digits and numbers that just process
6637 a certain constant string as a spec. */
6639 case '1':
6640 value = do_spec_1 (cc1_spec, 0, NULL);
6641 if (value != 0)
6642 return value;
6643 break;
6645 case '2':
6646 value = do_spec_1 (cc1plus_spec, 0, NULL);
6647 if (value != 0)
6648 return value;
6649 break;
6651 case 'a':
6652 value = do_spec_1 (asm_spec, 0, NULL);
6653 if (value != 0)
6654 return value;
6655 break;
6657 case 'A':
6658 value = do_spec_1 (asm_final_spec, 0, NULL);
6659 if (value != 0)
6660 return value;
6661 break;
6663 case 'C':
6665 const char *const spec
6666 = (input_file_compiler->cpp_spec
6667 ? input_file_compiler->cpp_spec
6668 : cpp_spec);
6669 value = do_spec_1 (spec, 0, NULL);
6670 if (value != 0)
6671 return value;
6673 break;
6675 case 'E':
6676 value = do_spec_1 (endfile_spec, 0, NULL);
6677 if (value != 0)
6678 return value;
6679 break;
6681 case 'l':
6682 value = do_spec_1 (link_spec, 0, NULL);
6683 if (value != 0)
6684 return value;
6685 break;
6687 case 'L':
6688 value = do_spec_1 (lib_spec, 0, NULL);
6689 if (value != 0)
6690 return value;
6691 break;
6693 case 'M':
6694 if (multilib_os_dir == NULL)
6695 obstack_1grow (&obstack, '.');
6696 else
6697 obstack_grow (&obstack, multilib_os_dir,
6698 strlen (multilib_os_dir));
6699 break;
6701 case 'G':
6702 value = do_spec_1 (libgcc_spec, 0, NULL);
6703 if (value != 0)
6704 return value;
6705 break;
6707 case 'R':
6708 /* We assume there is a directory
6709 separator at the end of this string. */
6710 if (target_system_root)
6712 obstack_grow (&obstack, target_system_root,
6713 strlen (target_system_root));
6714 if (target_sysroot_suffix)
6715 obstack_grow (&obstack, target_sysroot_suffix,
6716 strlen (target_sysroot_suffix));
6718 break;
6720 case 'S':
6721 value = do_spec_1 (startfile_spec, 0, NULL);
6722 if (value != 0)
6723 return value;
6724 break;
6726 /* Here we define characters other than letters and digits. */
6728 case '{':
6729 p = handle_braces (p);
6730 if (p == 0)
6731 return -1;
6732 break;
6734 case ':':
6735 p = handle_spec_function (p, NULL, soft_matched_part);
6736 if (p == 0)
6737 return -1;
6738 break;
6740 case '%':
6741 obstack_1grow (&obstack, '%');
6742 break;
6744 case '.':
6746 unsigned len = 0;
6748 while (p[len] && p[len] != ' ' && p[len] != '%')
6749 len++;
6750 suffix_subst = save_string (p - 1, len + 1);
6751 p += len;
6753 break;
6755 /* Henceforth ignore the option(s) matching the pattern
6756 after the %<. */
6757 case '<':
6758 case '>':
6760 unsigned len = 0;
6761 int have_wildcard = 0;
6762 int i;
6763 int switch_option;
6765 if (c == '>')
6766 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
6767 else
6768 switch_option = SWITCH_IGNORE;
6770 while (p[len] && p[len] != ' ' && p[len] != '\t')
6771 len++;
6773 if (p[len-1] == '*')
6774 have_wildcard = 1;
6776 for (i = 0; i < n_switches; i++)
6777 if (!strncmp (switches[i].part1, p, len - have_wildcard)
6778 && (have_wildcard || switches[i].part1[len] == '\0'))
6780 switches[i].live_cond |= switch_option;
6781 /* User switch be validated from validate_all_switches.
6782 when the definition is seen from the spec file.
6783 If not defined anywhere, will be rejected. */
6784 if (switches[i].known)
6785 switches[i].validated = true;
6788 p += len;
6790 break;
6792 case '*':
6793 if (soft_matched_part)
6795 if (soft_matched_part[0])
6796 do_spec_1 (soft_matched_part, 1, NULL);
6797 /* Only insert a space after the substitution if it is at the
6798 end of the current sequence. So if:
6800 "%{foo=*:bar%*}%{foo=*:one%*two}"
6802 matches -foo=hello then it will produce:
6804 barhello onehellotwo
6806 if (*p == 0 || *p == '}')
6807 do_spec_1 (" ", 0, NULL);
6809 else
6810 /* Catch the case where a spec string contains something like
6811 '%{foo:%*}'. i.e. there is no * in the pattern on the left
6812 hand side of the :. */
6813 error ("spec failure: %<%%*%> has not been initialized by pattern match");
6814 break;
6816 /* Process a string found as the value of a spec given by name.
6817 This feature allows individual machine descriptions
6818 to add and use their own specs. */
6819 case '(':
6821 const char *name = p;
6822 struct spec_list *sl;
6823 int len;
6825 /* The string after the S/P is the name of a spec that is to be
6826 processed. */
6827 while (*p && *p != ')')
6828 p++;
6830 /* See if it's in the list. */
6831 for (len = p - name, sl = specs; sl; sl = sl->next)
6832 if (sl->name_len == len && !strncmp (sl->name, name, len))
6834 name = *(sl->ptr_spec);
6835 #ifdef DEBUG_SPECS
6836 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
6837 sl->name, name);
6838 #endif
6839 break;
6842 if (sl)
6844 value = do_spec_1 (name, 0, NULL);
6845 if (value != 0)
6846 return value;
6849 /* Discard the closing paren. */
6850 if (*p)
6851 p++;
6853 break;
6855 case '"':
6856 /* End a previous argument, if there is one, then issue an
6857 empty argument. */
6858 end_going_arg ();
6859 arg_going = 1;
6860 end_going_arg ();
6861 break;
6863 default:
6864 error ("spec failure: unrecognized spec option %qc", c);
6865 break;
6867 break;
6869 case '\\':
6870 /* Backslash: treat next character as ordinary. */
6871 c = *p++;
6873 /* When adding more cases that previously matched default, make
6874 sure to adjust quote_spec_char_p as well. */
6876 /* Fall through. */
6877 default:
6878 /* Ordinary character: put it into the current argument. */
6879 obstack_1grow (&obstack, c);
6880 arg_going = 1;
6883 /* End of string. If we are processing a spec function, we need to
6884 end any pending argument. */
6885 if (processing_spec_function)
6886 end_going_arg ();
6888 return 0;
6891 /* Look up a spec function. */
6893 static const struct spec_function *
6894 lookup_spec_function (const char *name)
6896 const struct spec_function *sf;
6898 for (sf = static_spec_functions; sf->name != NULL; sf++)
6899 if (strcmp (sf->name, name) == 0)
6900 return sf;
6902 return NULL;
6905 /* Evaluate a spec function. */
6907 static const char *
6908 eval_spec_function (const char *func, const char *args,
6909 const char *soft_matched_part)
6911 const struct spec_function *sf;
6912 const char *funcval;
6914 /* Saved spec processing context. */
6915 vec<const_char_p> save_argbuf;
6917 int save_arg_going;
6918 int save_delete_this_arg;
6919 int save_this_is_output_file;
6920 int save_this_is_library_file;
6921 int save_input_from_pipe;
6922 int save_this_is_linker_script;
6923 const char *save_suffix_subst;
6925 int save_growing_size;
6926 void *save_growing_value = NULL;
6928 sf = lookup_spec_function (func);
6929 if (sf == NULL)
6930 fatal_error (input_location, "unknown spec function %qs", func);
6932 /* Push the spec processing context. */
6933 save_argbuf = argbuf;
6935 save_arg_going = arg_going;
6936 save_delete_this_arg = delete_this_arg;
6937 save_this_is_output_file = this_is_output_file;
6938 save_this_is_library_file = this_is_library_file;
6939 save_this_is_linker_script = this_is_linker_script;
6940 save_input_from_pipe = input_from_pipe;
6941 save_suffix_subst = suffix_subst;
6943 /* If we have some object growing now, finalize it so the args and function
6944 eval proceed from a cleared context. This is needed to prevent the first
6945 constructed arg from mistakenly including the growing value. We'll push
6946 this value back on the obstack once the function evaluation is done, to
6947 restore a consistent processing context for our caller. This is fine as
6948 the address of growing objects isn't guaranteed to remain stable until
6949 they are finalized, and we expect this situation to be rare enough for
6950 the extra copy not to be an issue. */
6951 save_growing_size = obstack_object_size (&obstack);
6952 if (save_growing_size > 0)
6953 save_growing_value = obstack_finish (&obstack);
6955 /* Create a new spec processing context, and build the function
6956 arguments. */
6958 alloc_args ();
6959 if (do_spec_2 (args, soft_matched_part) < 0)
6960 fatal_error (input_location, "error in arguments to spec function %qs",
6961 func);
6963 /* argbuf_index is an index for the next argument to be inserted, and
6964 so contains the count of the args already inserted. */
6966 funcval = (*sf->func) (argbuf.length (),
6967 argbuf.address ());
6969 /* Pop the spec processing context. */
6970 argbuf.release ();
6971 argbuf = save_argbuf;
6973 arg_going = save_arg_going;
6974 delete_this_arg = save_delete_this_arg;
6975 this_is_output_file = save_this_is_output_file;
6976 this_is_library_file = save_this_is_library_file;
6977 this_is_linker_script = save_this_is_linker_script;
6978 input_from_pipe = save_input_from_pipe;
6979 suffix_subst = save_suffix_subst;
6981 if (save_growing_size > 0)
6982 obstack_grow (&obstack, save_growing_value, save_growing_size);
6984 return funcval;
6987 /* Handle a spec function call of the form:
6989 %:function(args)
6991 ARGS is processed as a spec in a separate context and split into an
6992 argument vector in the normal fashion. The function returns a string
6993 containing a spec which we then process in the caller's context, or
6994 NULL if no processing is required.
6996 If RETVAL_NONNULL is not NULL, then store a bool whether function
6997 returned non-NULL.
6999 SOFT_MATCHED_PART holds the current value of a matched * pattern, which
7000 may be re-expanded with a %* as part of the function arguments. */
7002 static const char *
7003 handle_spec_function (const char *p, bool *retval_nonnull,
7004 const char *soft_matched_part)
7006 char *func, *args;
7007 const char *endp, *funcval;
7008 int count;
7010 processing_spec_function++;
7012 /* Get the function name. */
7013 for (endp = p; *endp != '\0'; endp++)
7015 if (*endp == '(') /* ) */
7016 break;
7017 /* Only allow [A-Za-z0-9], -, and _ in function names. */
7018 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
7019 fatal_error (input_location, "malformed spec function name");
7021 if (*endp != '(') /* ) */
7022 fatal_error (input_location, "no arguments for spec function");
7023 func = save_string (p, endp - p);
7024 p = ++endp;
7026 /* Get the arguments. */
7027 for (count = 0; *endp != '\0'; endp++)
7029 /* ( */
7030 if (*endp == ')')
7032 if (count == 0)
7033 break;
7034 count--;
7036 else if (*endp == '(') /* ) */
7037 count++;
7039 /* ( */
7040 if (*endp != ')')
7041 fatal_error (input_location, "malformed spec function arguments");
7042 args = save_string (p, endp - p);
7043 p = ++endp;
7045 /* p now points to just past the end of the spec function expression. */
7047 funcval = eval_spec_function (func, args, soft_matched_part);
7048 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
7049 p = NULL;
7050 if (retval_nonnull)
7051 *retval_nonnull = funcval != NULL;
7053 free (func);
7054 free (args);
7056 processing_spec_function--;
7058 return p;
7061 /* Inline subroutine of handle_braces. Returns true if the current
7062 input suffix matches the atom bracketed by ATOM and END_ATOM. */
7063 static inline bool
7064 input_suffix_matches (const char *atom, const char *end_atom)
7066 return (input_suffix
7067 && !strncmp (input_suffix, atom, end_atom - atom)
7068 && input_suffix[end_atom - atom] == '\0');
7071 /* Subroutine of handle_braces. Returns true if the current
7072 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
7073 static bool
7074 input_spec_matches (const char *atom, const char *end_atom)
7076 return (input_file_compiler
7077 && input_file_compiler->suffix
7078 && input_file_compiler->suffix[0] != '\0'
7079 && !strncmp (input_file_compiler->suffix + 1, atom,
7080 end_atom - atom)
7081 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
7084 /* Subroutine of handle_braces. Returns true if a switch
7085 matching the atom bracketed by ATOM and END_ATOM appeared on the
7086 command line. */
7087 static bool
7088 switch_matches (const char *atom, const char *end_atom, int starred)
7090 int i;
7091 int len = end_atom - atom;
7092 int plen = starred ? len : -1;
7094 for (i = 0; i < n_switches; i++)
7095 if (!strncmp (switches[i].part1, atom, len)
7096 && (starred || switches[i].part1[len] == '\0')
7097 && check_live_switch (i, plen))
7098 return true;
7100 /* Check if a switch with separated form matching the atom.
7101 We check -D and -U switches. */
7102 else if (switches[i].args != 0)
7104 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
7105 && *switches[i].part1 == atom[0])
7107 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
7108 && (starred || (switches[i].part1[1] == '\0'
7109 && switches[i].args[0][len - 1] == '\0'))
7110 && check_live_switch (i, (starred ? 1 : -1)))
7111 return true;
7115 return false;
7118 /* Inline subroutine of handle_braces. Mark all of the switches which
7119 match ATOM (extends to END_ATOM; STARRED indicates whether there
7120 was a star after the atom) for later processing. */
7121 static inline void
7122 mark_matching_switches (const char *atom, const char *end_atom, int starred)
7124 int i;
7125 int len = end_atom - atom;
7126 int plen = starred ? len : -1;
7128 for (i = 0; i < n_switches; i++)
7129 if (!strncmp (switches[i].part1, atom, len)
7130 && (starred || switches[i].part1[len] == '\0')
7131 && check_live_switch (i, plen))
7132 switches[i].ordering = 1;
7135 /* Inline subroutine of handle_braces. Process all the currently
7136 marked switches through give_switch, and clear the marks. */
7137 static inline void
7138 process_marked_switches (void)
7140 int i;
7142 for (i = 0; i < n_switches; i++)
7143 if (switches[i].ordering == 1)
7145 switches[i].ordering = 0;
7146 give_switch (i, 0);
7150 /* Handle a %{ ... } construct. P points just inside the leading {.
7151 Returns a pointer one past the end of the brace block, or 0
7152 if we call do_spec_1 and that returns -1. */
7154 static const char *
7155 handle_braces (const char *p)
7157 const char *atom, *end_atom;
7158 const char *d_atom = NULL, *d_end_atom = NULL;
7159 char *esc_buf = NULL, *d_esc_buf = NULL;
7160 int esc;
7161 const char *orig = p;
7163 bool a_is_suffix;
7164 bool a_is_spectype;
7165 bool a_is_starred;
7166 bool a_is_negated;
7167 bool a_matched;
7169 bool a_must_be_last = false;
7170 bool ordered_set = false;
7171 bool disjunct_set = false;
7172 bool disj_matched = false;
7173 bool disj_starred = true;
7174 bool n_way_choice = false;
7175 bool n_way_matched = false;
7177 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7181 if (a_must_be_last)
7182 goto invalid;
7184 /* Scan one "atom" (S in the description above of %{}, possibly
7185 with '!', '.', '@', ',', or '*' modifiers). */
7186 a_matched = false;
7187 a_is_suffix = false;
7188 a_is_starred = false;
7189 a_is_negated = false;
7190 a_is_spectype = false;
7192 SKIP_WHITE ();
7193 if (*p == '!')
7194 p++, a_is_negated = true;
7196 SKIP_WHITE ();
7197 if (*p == '%' && p[1] == ':')
7199 atom = NULL;
7200 end_atom = NULL;
7201 p = handle_spec_function (p + 2, &a_matched, NULL);
7203 else
7205 if (*p == '.')
7206 p++, a_is_suffix = true;
7207 else if (*p == ',')
7208 p++, a_is_spectype = true;
7210 atom = p;
7211 esc = 0;
7212 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7213 || *p == ',' || *p == '.' || *p == '@' || *p == '\\')
7215 if (*p == '\\')
7217 p++;
7218 if (!*p)
7219 fatal_error (input_location,
7220 "braced spec %qs ends in escape", orig);
7221 esc++;
7223 p++;
7225 end_atom = p;
7227 if (esc)
7229 const char *ap;
7230 char *ep;
7232 if (esc_buf && esc_buf != d_esc_buf)
7233 free (esc_buf);
7234 esc_buf = NULL;
7235 ep = esc_buf = (char *) xmalloc (end_atom - atom - esc + 1);
7236 for (ap = atom; ap != end_atom; ap++, ep++)
7238 if (*ap == '\\')
7239 ap++;
7240 *ep = *ap;
7242 *ep = '\0';
7243 atom = esc_buf;
7244 end_atom = ep;
7247 if (*p == '*')
7248 p++, a_is_starred = 1;
7251 SKIP_WHITE ();
7252 switch (*p)
7254 case '&': case '}':
7255 /* Substitute the switch(es) indicated by the current atom. */
7256 ordered_set = true;
7257 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
7258 || a_is_spectype || atom == end_atom)
7259 goto invalid;
7261 mark_matching_switches (atom, end_atom, a_is_starred);
7263 if (*p == '}')
7264 process_marked_switches ();
7265 break;
7267 case '|': case ':':
7268 /* Substitute some text if the current atom appears as a switch
7269 or suffix. */
7270 disjunct_set = true;
7271 if (ordered_set)
7272 goto invalid;
7274 if (atom && atom == end_atom)
7276 if (!n_way_choice || disj_matched || *p == '|'
7277 || a_is_negated || a_is_suffix || a_is_spectype
7278 || a_is_starred)
7279 goto invalid;
7281 /* An empty term may appear as the last choice of an
7282 N-way choice set; it means "otherwise". */
7283 a_must_be_last = true;
7284 disj_matched = !n_way_matched;
7285 disj_starred = false;
7287 else
7289 if ((a_is_suffix || a_is_spectype) && a_is_starred)
7290 goto invalid;
7292 if (!a_is_starred)
7293 disj_starred = false;
7295 /* Don't bother testing this atom if we already have a
7296 match. */
7297 if (!disj_matched && !n_way_matched)
7299 if (atom == NULL)
7300 /* a_matched is already set by handle_spec_function. */;
7301 else if (a_is_suffix)
7302 a_matched = input_suffix_matches (atom, end_atom);
7303 else if (a_is_spectype)
7304 a_matched = input_spec_matches (atom, end_atom);
7305 else
7306 a_matched = switch_matches (atom, end_atom, a_is_starred);
7308 if (a_matched != a_is_negated)
7310 disj_matched = true;
7311 d_atom = atom;
7312 d_end_atom = end_atom;
7313 d_esc_buf = esc_buf;
7318 if (*p == ':')
7320 /* Found the body, that is, the text to substitute if the
7321 current disjunction matches. */
7322 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
7323 disj_matched && !n_way_matched);
7324 if (p == 0)
7325 goto done;
7327 /* If we have an N-way choice, reset state for the next
7328 disjunction. */
7329 if (*p == ';')
7331 n_way_choice = true;
7332 n_way_matched |= disj_matched;
7333 disj_matched = false;
7334 disj_starred = true;
7335 d_atom = d_end_atom = NULL;
7338 break;
7340 default:
7341 goto invalid;
7344 while (*p++ != '}');
7346 done:
7347 if (d_esc_buf && d_esc_buf != esc_buf)
7348 free (d_esc_buf);
7349 if (esc_buf)
7350 free (esc_buf);
7352 return p;
7354 invalid:
7355 fatal_error (input_location, "braced spec %qs is invalid at %qc", orig, *p);
7357 #undef SKIP_WHITE
7360 /* Subroutine of handle_braces. Scan and process a brace substitution body
7361 (X in the description of %{} syntax). P points one past the colon;
7362 ATOM and END_ATOM bracket the first atom which was found to be true
7363 (present) in the current disjunction; STARRED indicates whether all
7364 the atoms in the current disjunction were starred (for syntax validation);
7365 MATCHED indicates whether the disjunction matched or not, and therefore
7366 whether or not the body is to be processed through do_spec_1 or just
7367 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
7368 returns -1. */
7370 static const char *
7371 process_brace_body (const char *p, const char *atom, const char *end_atom,
7372 int starred, int matched)
7374 const char *body, *end_body;
7375 unsigned int nesting_level;
7376 bool have_subst = false;
7378 /* Locate the closing } or ;, honoring nested braces.
7379 Trim trailing whitespace. */
7380 body = p;
7381 nesting_level = 1;
7382 for (;;)
7384 if (*p == '{')
7385 nesting_level++;
7386 else if (*p == '}')
7388 if (!--nesting_level)
7389 break;
7391 else if (*p == ';' && nesting_level == 1)
7392 break;
7393 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
7394 have_subst = true;
7395 else if (*p == '\0')
7396 goto invalid;
7397 p++;
7400 end_body = p;
7401 while (end_body[-1] == ' ' || end_body[-1] == '\t')
7402 end_body--;
7404 if (have_subst && !starred)
7405 goto invalid;
7407 if (matched)
7409 /* Copy the substitution body to permanent storage and execute it.
7410 If have_subst is false, this is a simple matter of running the
7411 body through do_spec_1... */
7412 char *string = save_string (body, end_body - body);
7413 if (!have_subst)
7415 if (do_spec_1 (string, 0, NULL) < 0)
7417 free (string);
7418 return 0;
7421 else
7423 /* ... but if have_subst is true, we have to process the
7424 body once for each matching switch, with %* set to the
7425 variant part of the switch. */
7426 unsigned int hard_match_len = end_atom - atom;
7427 int i;
7429 for (i = 0; i < n_switches; i++)
7430 if (!strncmp (switches[i].part1, atom, hard_match_len)
7431 && check_live_switch (i, hard_match_len))
7433 if (do_spec_1 (string, 0,
7434 &switches[i].part1[hard_match_len]) < 0)
7436 free (string);
7437 return 0;
7439 /* Pass any arguments this switch has. */
7440 give_switch (i, 1);
7441 suffix_subst = NULL;
7444 free (string);
7447 return p;
7449 invalid:
7450 fatal_error (input_location, "braced spec body %qs is invalid", body);
7453 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
7454 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
7455 spec, or -1 if either exact match or %* is used.
7457 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
7458 whose value does not begin with "no-" is obsoleted by the same value
7459 with the "no-", similarly for a switch with the "no-" prefix. */
7461 static int
7462 check_live_switch (int switchnum, int prefix_length)
7464 const char *name = switches[switchnum].part1;
7465 int i;
7467 /* If we already processed this switch and determined if it was
7468 live or not, return our past determination. */
7469 if (switches[switchnum].live_cond != 0)
7470 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
7471 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
7472 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
7473 == 0);
7475 /* In the common case of {<at-most-one-letter>*}, a negating
7476 switch would always match, so ignore that case. We will just
7477 send the conflicting switches to the compiler phase. */
7478 if (prefix_length >= 0 && prefix_length <= 1)
7479 return 1;
7481 /* Now search for duplicate in a manner that depends on the name. */
7482 switch (*name)
7484 case 'O':
7485 for (i = switchnum + 1; i < n_switches; i++)
7486 if (switches[i].part1[0] == 'O')
7488 switches[switchnum].validated = true;
7489 switches[switchnum].live_cond = SWITCH_FALSE;
7490 return 0;
7492 break;
7494 case 'W': case 'f': case 'm': case 'g':
7495 if (startswith (name + 1, "no-"))
7497 /* We have Xno-YYY, search for XYYY. */
7498 for (i = switchnum + 1; i < n_switches; i++)
7499 if (switches[i].part1[0] == name[0]
7500 && ! strcmp (&switches[i].part1[1], &name[4]))
7502 /* --specs are validated with the validate_switches mechanism. */
7503 if (switches[switchnum].known)
7504 switches[switchnum].validated = true;
7505 switches[switchnum].live_cond = SWITCH_FALSE;
7506 return 0;
7509 else
7511 /* We have XYYY, search for Xno-YYY. */
7512 for (i = switchnum + 1; i < n_switches; i++)
7513 if (switches[i].part1[0] == name[0]
7514 && switches[i].part1[1] == 'n'
7515 && switches[i].part1[2] == 'o'
7516 && switches[i].part1[3] == '-'
7517 && !strcmp (&switches[i].part1[4], &name[1]))
7519 /* --specs are validated with the validate_switches mechanism. */
7520 if (switches[switchnum].known)
7521 switches[switchnum].validated = true;
7522 switches[switchnum].live_cond = SWITCH_FALSE;
7523 return 0;
7526 break;
7529 /* Otherwise the switch is live. */
7530 switches[switchnum].live_cond |= SWITCH_LIVE;
7531 return 1;
7534 /* Pass a switch to the current accumulating command
7535 in the same form that we received it.
7536 SWITCHNUM identifies the switch; it is an index into
7537 the vector of switches gcc received, which is `switches'.
7538 This cannot fail since it never finishes a command line.
7540 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
7542 static void
7543 give_switch (int switchnum, int omit_first_word)
7545 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
7546 return;
7548 if (!omit_first_word)
7550 do_spec_1 ("-", 0, NULL);
7551 do_spec_1 (switches[switchnum].part1, 1, NULL);
7554 if (switches[switchnum].args != 0)
7556 const char **p;
7557 for (p = switches[switchnum].args; *p; p++)
7559 const char *arg = *p;
7561 do_spec_1 (" ", 0, NULL);
7562 if (suffix_subst)
7564 unsigned length = strlen (arg);
7565 int dot = 0;
7567 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
7568 if (arg[length] == '.')
7570 (CONST_CAST (char *, arg))[length] = 0;
7571 dot = 1;
7572 break;
7574 do_spec_1 (arg, 1, NULL);
7575 if (dot)
7576 (CONST_CAST (char *, arg))[length] = '.';
7577 do_spec_1 (suffix_subst, 1, NULL);
7579 else
7580 do_spec_1 (arg, 1, NULL);
7584 do_spec_1 (" ", 0, NULL);
7585 switches[switchnum].validated = true;
7588 /* Print GCC configuration (e.g. version, thread model, target,
7589 configuration_arguments) to a given FILE. */
7591 static void
7592 print_configuration (FILE *file)
7594 int n;
7595 const char *thrmod;
7597 fnotice (file, "Target: %s\n", spec_machine);
7598 fnotice (file, "Configured with: %s\n", configuration_arguments);
7600 #ifdef THREAD_MODEL_SPEC
7601 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7602 but there's no point in doing all this processing just to get
7603 thread_model back. */
7604 obstack_init (&obstack);
7605 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
7606 obstack_1grow (&obstack, '\0');
7607 thrmod = XOBFINISH (&obstack, const char *);
7608 #else
7609 thrmod = thread_model;
7610 #endif
7612 fnotice (file, "Thread model: %s\n", thrmod);
7613 fnotice (file, "Supported LTO compression algorithms: zlib");
7614 #ifdef HAVE_ZSTD_H
7615 fnotice (file, " zstd");
7616 #endif
7617 fnotice (file, "\n");
7619 /* compiler_version is truncated at the first space when initialized
7620 from version string, so truncate version_string at the first space
7621 before comparing. */
7622 for (n = 0; version_string[n]; n++)
7623 if (version_string[n] == ' ')
7624 break;
7626 if (! strncmp (version_string, compiler_version, n)
7627 && compiler_version[n] == 0)
7628 fnotice (file, "gcc version %s %s\n", version_string,
7629 pkgversion_string);
7630 else
7631 fnotice (file, "gcc driver version %s %sexecuting gcc version %s\n",
7632 version_string, pkgversion_string, compiler_version);
7636 #define RETRY_ICE_ATTEMPTS 3
7638 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
7640 static bool
7641 files_equal_p (char *file1, char *file2)
7643 struct stat st1, st2;
7644 off_t n, len;
7645 int fd1, fd2;
7646 const int bufsize = 8192;
7647 char *buf = XNEWVEC (char, bufsize);
7649 fd1 = open (file1, O_RDONLY);
7650 fd2 = open (file2, O_RDONLY);
7652 if (fd1 < 0 || fd2 < 0)
7653 goto error;
7655 if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
7656 goto error;
7658 if (st1.st_size != st2.st_size)
7659 goto error;
7661 for (n = st1.st_size; n; n -= len)
7663 len = n;
7664 if ((int) len > bufsize / 2)
7665 len = bufsize / 2;
7667 if (read (fd1, buf, len) != (int) len
7668 || read (fd2, buf + bufsize / 2, len) != (int) len)
7670 goto error;
7673 if (memcmp (buf, buf + bufsize / 2, len) != 0)
7674 goto error;
7677 free (buf);
7678 close (fd1);
7679 close (fd2);
7681 return 1;
7683 error:
7684 free (buf);
7685 close (fd1);
7686 close (fd2);
7687 return 0;
7690 /* Check that compiler's output doesn't differ across runs.
7691 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
7692 stdout and stderr for each compiler run. Return true if all of
7693 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
7695 static bool
7696 check_repro (char **temp_stdout_files, char **temp_stderr_files)
7698 int i;
7699 for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
7701 if (!files_equal_p (temp_stdout_files[i], temp_stdout_files[i + 1])
7702 || !files_equal_p (temp_stderr_files[i], temp_stderr_files[i + 1]))
7704 fnotice (stderr, "The bug is not reproducible, so it is"
7705 " likely a hardware or OS problem.\n");
7706 break;
7709 return i == RETRY_ICE_ATTEMPTS - 2;
7712 enum attempt_status {
7713 ATTEMPT_STATUS_FAIL_TO_RUN,
7714 ATTEMPT_STATUS_SUCCESS,
7715 ATTEMPT_STATUS_ICE
7719 /* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
7720 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
7721 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
7722 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
7723 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
7724 ATTEMPT_STATUS_SUCCESS otherwise. */
7726 static enum attempt_status
7727 run_attempt (const char **new_argv, const char *out_temp,
7728 const char *err_temp, int emit_system_info, int append)
7731 if (emit_system_info)
7733 FILE *file_out = fopen (err_temp, "a");
7734 print_configuration (file_out);
7735 fputs ("\n", file_out);
7736 fclose (file_out);
7739 int exit_status;
7740 const char *errmsg;
7741 struct pex_obj *pex;
7742 int err;
7743 int pex_flags = PEX_USE_PIPES | PEX_LAST;
7744 enum attempt_status status = ATTEMPT_STATUS_FAIL_TO_RUN;
7746 if (append)
7747 pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
7749 pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
7750 if (!pex)
7751 fatal_error (input_location, "%<pex_init%> failed: %m");
7753 errmsg = pex_run (pex, pex_flags, new_argv[0],
7754 CONST_CAST2 (char *const *, const char **, &new_argv[1]),
7755 out_temp, err_temp, &err);
7756 if (errmsg != NULL)
7758 errno = err;
7759 fatal_error (input_location,
7760 err ? G_ ("cannot execute %qs: %s: %m")
7761 : G_ ("cannot execute %qs: %s"),
7762 new_argv[0], errmsg);
7765 if (!pex_get_status (pex, 1, &exit_status))
7766 goto out;
7768 switch (WEXITSTATUS (exit_status))
7770 case ICE_EXIT_CODE:
7771 status = ATTEMPT_STATUS_ICE;
7772 break;
7774 case SUCCESS_EXIT_CODE:
7775 status = ATTEMPT_STATUS_SUCCESS;
7776 break;
7778 default:
7782 out:
7783 pex_free (pex);
7784 return status;
7787 /* This routine reads lines from IN file, adds C++ style comments
7788 at the begining of each line and writes result into OUT. */
7790 static void
7791 insert_comments (const char *file_in, const char *file_out)
7793 FILE *in = fopen (file_in, "rb");
7794 FILE *out = fopen (file_out, "wb");
7795 char line[256];
7797 bool add_comment = true;
7798 while (fgets (line, sizeof (line), in))
7800 if (add_comment)
7801 fputs ("// ", out);
7802 fputs (line, out);
7803 add_comment = strchr (line, '\n') != NULL;
7806 fclose (in);
7807 fclose (out);
7810 /* This routine adds preprocessed source code into the given ERR_FILE.
7811 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
7812 add information in report file. RUN_ATTEMPT should return
7813 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
7815 static void
7816 do_report_bug (const char **new_argv, const int nargs,
7817 char **out_file, char **err_file)
7819 int i, status;
7820 int fd = open (*out_file, O_RDWR | O_APPEND);
7821 if (fd < 0)
7822 return;
7823 write (fd, "\n//", 3);
7824 for (i = 0; i < nargs; i++)
7826 write (fd, " ", 1);
7827 write (fd, new_argv[i], strlen (new_argv[i]));
7829 write (fd, "\n\n", 2);
7830 close (fd);
7831 new_argv[nargs] = "-E";
7832 new_argv[nargs + 1] = NULL;
7834 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
7836 if (status == ATTEMPT_STATUS_SUCCESS)
7838 fnotice (stderr, "Preprocessed source stored into %s file,"
7839 " please attach this to your bugreport.\n", *out_file);
7840 /* Make sure it is not deleted. */
7841 free (*out_file);
7842 *out_file = NULL;
7846 /* Try to reproduce ICE. If bug is reproducible, generate report .err file
7847 containing GCC configuration, backtrace, compiler's command line options
7848 and preprocessed source code. */
7850 static void
7851 try_generate_repro (const char **argv)
7853 int i, nargs, out_arg = -1, quiet = 0, attempt;
7854 const char **new_argv;
7855 char *temp_files[RETRY_ICE_ATTEMPTS * 2];
7856 char **temp_stdout_files = &temp_files[0];
7857 char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
7859 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
7860 return;
7862 for (nargs = 0; argv[nargs] != NULL; ++nargs)
7863 /* Only retry compiler ICEs, not preprocessor ones. */
7864 if (! strcmp (argv[nargs], "-E"))
7865 return;
7866 else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
7868 if (out_arg == -1)
7869 out_arg = nargs;
7870 else
7871 return;
7873 /* If the compiler is going to output any time information,
7874 it might varry between invocations. */
7875 else if (! strcmp (argv[nargs], "-quiet"))
7876 quiet = 1;
7877 else if (! strcmp (argv[nargs], "-ftime-report"))
7878 return;
7880 if (out_arg == -1 || !quiet)
7881 return;
7883 memset (temp_files, '\0', sizeof (temp_files));
7884 new_argv = XALLOCAVEC (const char *, nargs + 4);
7885 memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
7886 new_argv[nargs++] = "-frandom-seed=0";
7887 new_argv[nargs++] = "-fdump-noaddr";
7888 new_argv[nargs] = NULL;
7889 if (new_argv[out_arg][2] == '\0')
7890 new_argv[out_arg + 1] = "-";
7891 else
7892 new_argv[out_arg] = "-o-";
7894 int status;
7895 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
7897 int emit_system_info = 0;
7898 int append = 0;
7899 temp_stdout_files[attempt] = make_temp_file (".out");
7900 temp_stderr_files[attempt] = make_temp_file (".err");
7902 if (attempt == RETRY_ICE_ATTEMPTS - 1)
7904 append = 1;
7905 emit_system_info = 1;
7908 status = run_attempt (new_argv, temp_stdout_files[attempt],
7909 temp_stderr_files[attempt], emit_system_info,
7910 append);
7912 if (status != ATTEMPT_STATUS_ICE)
7914 fnotice (stderr, "The bug is not reproducible, so it is"
7915 " likely a hardware or OS problem.\n");
7916 goto out;
7920 if (!check_repro (temp_stdout_files, temp_stderr_files))
7921 goto out;
7924 /* Insert commented out backtrace into report file. */
7925 char **stderr_commented = &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1];
7926 insert_comments (temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
7927 *stderr_commented);
7929 /* In final attempt we append compiler options and preprocesssed code to last
7930 generated .out file with configuration and backtrace. */
7931 char **err = &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1];
7932 do_report_bug (new_argv, nargs, stderr_commented, err);
7935 out:
7936 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
7937 if (temp_files[i])
7939 unlink (temp_stdout_files[i]);
7940 free (temp_stdout_files[i]);
7944 /* Search for a file named NAME trying various prefixes including the
7945 user's -B prefix and some standard ones.
7946 Return the absolute file name found. If nothing is found, return NAME. */
7948 static const char *
7949 find_file (const char *name)
7951 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
7952 return newname ? newname : name;
7955 /* Determine whether a directory exists. If LINKER, return 0 for
7956 certain fixed names not needed by the linker. */
7958 static int
7959 is_directory (const char *path1, bool linker)
7961 int len1;
7962 char *path;
7963 char *cp;
7964 struct stat st;
7966 /* Ensure the string ends with "/.". The resulting path will be a
7967 directory even if the given path is a symbolic link. */
7968 len1 = strlen (path1);
7969 path = (char *) alloca (3 + len1);
7970 memcpy (path, path1, len1);
7971 cp = path + len1;
7972 if (!IS_DIR_SEPARATOR (cp[-1]))
7973 *cp++ = DIR_SEPARATOR;
7974 *cp++ = '.';
7975 *cp = '\0';
7977 /* Exclude directories that the linker is known to search. */
7978 if (linker
7979 && IS_DIR_SEPARATOR (path[0])
7980 && ((cp - path == 6
7981 && filename_ncmp (path + 1, "lib", 3) == 0)
7982 || (cp - path == 10
7983 && filename_ncmp (path + 1, "usr", 3) == 0
7984 && IS_DIR_SEPARATOR (path[4])
7985 && filename_ncmp (path + 5, "lib", 3) == 0)))
7986 return 0;
7988 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
7991 /* Set up the various global variables to indicate that we're processing
7992 the input file named FILENAME. */
7994 void
7995 set_input (const char *filename)
7997 const char *p;
7999 gcc_input_filename = filename;
8000 input_filename_length = strlen (gcc_input_filename);
8001 input_basename = lbasename (gcc_input_filename);
8003 /* Find a suffix starting with the last period,
8004 and set basename_length to exclude that suffix. */
8005 basename_length = strlen (input_basename);
8006 suffixed_basename_length = basename_length;
8007 p = input_basename + basename_length;
8008 while (p != input_basename && *p != '.')
8009 --p;
8010 if (*p == '.' && p != input_basename)
8012 basename_length = p - input_basename;
8013 input_suffix = p + 1;
8015 else
8016 input_suffix = "";
8018 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
8019 we will need to do a stat on the gcc_input_filename. The
8020 INPUT_STAT_SET signals that the stat is needed. */
8021 input_stat_set = 0;
8024 /* On fatal signals, delete all the temporary files. */
8026 static void
8027 fatal_signal (int signum)
8029 signal (signum, SIG_DFL);
8030 delete_failure_queue ();
8031 delete_temp_files ();
8032 /* Get the same signal again, this time not handled,
8033 so its normal effect occurs. */
8034 kill (getpid (), signum);
8037 /* Compare the contents of the two files named CMPFILE[0] and
8038 CMPFILE[1]. Return zero if they're identical, nonzero
8039 otherwise. */
8041 static int
8042 compare_files (char *cmpfile[])
8044 int ret = 0;
8045 FILE *temp[2] = { NULL, NULL };
8046 int i;
8048 #if HAVE_MMAP_FILE
8050 size_t length[2];
8051 void *map[2] = { NULL, NULL };
8053 for (i = 0; i < 2; i++)
8055 struct stat st;
8057 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
8059 error ("%s: could not determine length of compare-debug file %s",
8060 gcc_input_filename, cmpfile[i]);
8061 ret = 1;
8062 break;
8065 length[i] = st.st_size;
8068 if (!ret && length[0] != length[1])
8070 error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename);
8071 ret = 1;
8074 if (!ret)
8075 for (i = 0; i < 2; i++)
8077 int fd = open (cmpfile[i], O_RDONLY);
8078 if (fd < 0)
8080 error ("%s: could not open compare-debug file %s",
8081 gcc_input_filename, cmpfile[i]);
8082 ret = 1;
8083 break;
8086 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
8087 close (fd);
8089 if (map[i] == (void *) MAP_FAILED)
8091 ret = -1;
8092 break;
8096 if (!ret)
8098 if (memcmp (map[0], map[1], length[0]) != 0)
8100 error ("%s: %<-fcompare-debug%> failure", gcc_input_filename);
8101 ret = 1;
8105 for (i = 0; i < 2; i++)
8106 if (map[i])
8107 munmap ((caddr_t) map[i], length[i]);
8109 if (ret >= 0)
8110 return ret;
8112 ret = 0;
8114 #endif
8116 for (i = 0; i < 2; i++)
8118 temp[i] = fopen (cmpfile[i], "r");
8119 if (!temp[i])
8121 error ("%s: could not open compare-debug file %s",
8122 gcc_input_filename, cmpfile[i]);
8123 ret = 1;
8124 break;
8128 if (!ret && temp[0] && temp[1])
8129 for (;;)
8131 int c0, c1;
8132 c0 = fgetc (temp[0]);
8133 c1 = fgetc (temp[1]);
8135 if (c0 != c1)
8137 error ("%s: %<-fcompare-debug%> failure",
8138 gcc_input_filename);
8139 ret = 1;
8140 break;
8143 if (c0 == EOF)
8144 break;
8147 for (i = 1; i >= 0; i--)
8149 if (temp[i])
8150 fclose (temp[i]);
8153 return ret;
8156 driver::driver (bool can_finalize, bool debug) :
8157 explicit_link_files (NULL),
8158 decoded_options (NULL)
8160 env.init (can_finalize, debug);
8163 driver::~driver ()
8165 XDELETEVEC (explicit_link_files);
8166 XDELETEVEC (decoded_options);
8169 /* driver::main is implemented as a series of driver:: method calls. */
8172 driver::main (int argc, char **argv)
8174 bool early_exit;
8176 set_progname (argv[0]);
8177 expand_at_files (&argc, &argv);
8178 decode_argv (argc, const_cast <const char **> (argv));
8179 global_initializations ();
8180 build_multilib_strings ();
8181 set_up_specs ();
8182 putenv_COLLECT_AS_OPTIONS (assembler_options);
8183 putenv_COLLECT_GCC (argv[0]);
8184 maybe_putenv_COLLECT_LTO_WRAPPER ();
8185 maybe_putenv_OFFLOAD_TARGETS ();
8186 handle_unrecognized_options ();
8188 if (completion)
8190 m_option_proposer.suggest_completion (completion);
8191 return 0;
8194 if (!maybe_print_and_exit ())
8195 return 0;
8197 early_exit = prepare_infiles ();
8198 if (early_exit)
8199 return get_exit_code ();
8201 do_spec_on_infiles ();
8202 maybe_run_linker (argv[0]);
8203 final_actions ();
8204 return get_exit_code ();
8207 /* Locate the final component of argv[0] after any leading path, and set
8208 the program name accordingly. */
8210 void
8211 driver::set_progname (const char *argv0) const
8213 const char *p = argv0 + strlen (argv0);
8214 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
8215 --p;
8216 progname = p;
8218 xmalloc_set_program_name (progname);
8221 /* Expand any @ files within the command-line args,
8222 setting at_file_supplied if any were expanded. */
8224 void
8225 driver::expand_at_files (int *argc, char ***argv) const
8227 char **old_argv = *argv;
8229 expandargv (argc, argv);
8231 /* Determine if any expansions were made. */
8232 if (*argv != old_argv)
8233 at_file_supplied = true;
8236 /* Decode the command-line arguments from argc/argv into the
8237 decoded_options array. */
8239 void
8240 driver::decode_argv (int argc, const char **argv)
8242 init_opts_obstack ();
8243 init_options_struct (&global_options, &global_options_set);
8245 decode_cmdline_options_to_array (argc, argv,
8246 CL_DRIVER,
8247 &decoded_options, &decoded_options_count);
8250 /* Perform various initializations and setup. */
8252 void
8253 driver::global_initializations ()
8255 /* Unlock the stdio streams. */
8256 unlock_std_streams ();
8258 gcc_init_libintl ();
8260 diagnostic_initialize (global_dc, 0);
8261 diagnostic_color_init (global_dc);
8262 diagnostic_urls_init (global_dc);
8264 #ifdef GCC_DRIVER_HOST_INITIALIZATION
8265 /* Perform host dependent initialization when needed. */
8266 GCC_DRIVER_HOST_INITIALIZATION;
8267 #endif
8269 if (atexit (delete_temp_files) != 0)
8270 fatal_error (input_location, "atexit failed");
8272 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
8273 signal (SIGINT, fatal_signal);
8274 #ifdef SIGHUP
8275 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
8276 signal (SIGHUP, fatal_signal);
8277 #endif
8278 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
8279 signal (SIGTERM, fatal_signal);
8280 #ifdef SIGPIPE
8281 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
8282 signal (SIGPIPE, fatal_signal);
8283 #endif
8284 #ifdef SIGCHLD
8285 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
8286 receive the signal. A different setting is inheritable */
8287 signal (SIGCHLD, SIG_DFL);
8288 #endif
8290 /* Parsing and gimplification sometimes need quite large stack.
8291 Increase stack size limits if possible. */
8292 stack_limit_increase (64 * 1024 * 1024);
8294 /* Allocate the argument vector. */
8295 alloc_args ();
8297 obstack_init (&obstack);
8300 /* Build multilib_select, et. al from the separate lines that make up each
8301 multilib selection. */
8303 void
8304 driver::build_multilib_strings () const
8307 const char *p;
8308 const char *const *q = multilib_raw;
8309 int need_space;
8311 obstack_init (&multilib_obstack);
8312 while ((p = *q++) != (char *) 0)
8313 obstack_grow (&multilib_obstack, p, strlen (p));
8315 obstack_1grow (&multilib_obstack, 0);
8316 multilib_select = XOBFINISH (&multilib_obstack, const char *);
8318 q = multilib_matches_raw;
8319 while ((p = *q++) != (char *) 0)
8320 obstack_grow (&multilib_obstack, p, strlen (p));
8322 obstack_1grow (&multilib_obstack, 0);
8323 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
8325 q = multilib_exclusions_raw;
8326 while ((p = *q++) != (char *) 0)
8327 obstack_grow (&multilib_obstack, p, strlen (p));
8329 obstack_1grow (&multilib_obstack, 0);
8330 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
8332 q = multilib_reuse_raw;
8333 while ((p = *q++) != (char *) 0)
8334 obstack_grow (&multilib_obstack, p, strlen (p));
8336 obstack_1grow (&multilib_obstack, 0);
8337 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
8339 need_space = false;
8340 for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
8342 if (need_space)
8343 obstack_1grow (&multilib_obstack, ' ');
8344 obstack_grow (&multilib_obstack,
8345 multilib_defaults_raw[i],
8346 strlen (multilib_defaults_raw[i]));
8347 need_space = true;
8350 obstack_1grow (&multilib_obstack, 0);
8351 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
8355 /* Set up the spec-handling machinery. */
8357 void
8358 driver::set_up_specs () const
8360 const char *spec_machine_suffix;
8361 char *specs_file;
8362 size_t i;
8364 #ifdef INIT_ENVIRONMENT
8365 /* Set up any other necessary machine specific environment variables. */
8366 xputenv (INIT_ENVIRONMENT);
8367 #endif
8369 /* Make a table of what switches there are (switches, n_switches).
8370 Make a table of specified input files (infiles, n_infiles).
8371 Decode switches that are handled locally. */
8373 process_command (decoded_options_count, decoded_options);
8375 /* Initialize the vector of specs to just the default.
8376 This means one element containing 0s, as a terminator. */
8378 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
8379 memcpy (compilers, default_compilers, sizeof default_compilers);
8380 n_compilers = n_default_compilers;
8382 /* Read specs from a file if there is one. */
8384 machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
8385 accel_dir_suffix, dir_separator_str, NULL);
8386 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
8388 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
8389 /* Read the specs file unless it is a default one. */
8390 if (specs_file != 0 && strcmp (specs_file, "specs"))
8391 read_specs (specs_file, true, false);
8392 else
8393 init_spec ();
8395 #ifdef ACCEL_COMPILER
8396 spec_machine_suffix = machine_suffix;
8397 #else
8398 spec_machine_suffix = just_machine_suffix;
8399 #endif
8401 /* We need to check standard_exec_prefix/spec_machine_suffix/specs
8402 for any override of as, ld and libraries. */
8403 specs_file = (char *) alloca (strlen (standard_exec_prefix)
8404 + strlen (spec_machine_suffix) + sizeof ("specs"));
8405 strcpy (specs_file, standard_exec_prefix);
8406 strcat (specs_file, spec_machine_suffix);
8407 strcat (specs_file, "specs");
8408 if (access (specs_file, R_OK) == 0)
8409 read_specs (specs_file, true, false);
8411 /* Process any configure-time defaults specified for the command line
8412 options, via OPTION_DEFAULT_SPECS. */
8413 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
8414 do_option_spec (option_default_specs[i].name,
8415 option_default_specs[i].spec);
8417 /* Process DRIVER_SELF_SPECS, adding any new options to the end
8418 of the command line. */
8420 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
8421 do_self_spec (driver_self_specs[i]);
8423 /* If not cross-compiling, look for executables in the standard
8424 places. */
8425 if (*cross_compile == '0')
8427 if (*md_exec_prefix)
8429 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
8430 PREFIX_PRIORITY_LAST, 0, 0);
8434 /* Process sysroot_suffix_spec. */
8435 if (*sysroot_suffix_spec != 0
8436 && !no_sysroot_suffix
8437 && do_spec_2 (sysroot_suffix_spec, NULL) == 0)
8439 if (argbuf.length () > 1)
8440 error ("spec failure: more than one argument to "
8441 "%<SYSROOT_SUFFIX_SPEC%>");
8442 else if (argbuf.length () == 1)
8443 target_sysroot_suffix = xstrdup (argbuf.last ());
8446 #ifdef HAVE_LD_SYSROOT
8447 /* Pass the --sysroot option to the linker, if it supports that. If
8448 there is a sysroot_suffix_spec, it has already been processed by
8449 this point, so target_system_root really is the system root we
8450 should be using. */
8451 if (target_system_root)
8453 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
8454 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
8455 set_spec ("link", XOBFINISH (&obstack, const char *), false);
8457 #endif
8459 /* Process sysroot_hdrs_suffix_spec. */
8460 if (*sysroot_hdrs_suffix_spec != 0
8461 && !no_sysroot_suffix
8462 && do_spec_2 (sysroot_hdrs_suffix_spec, NULL) == 0)
8464 if (argbuf.length () > 1)
8465 error ("spec failure: more than one argument "
8466 "to %<SYSROOT_HEADERS_SUFFIX_SPEC%>");
8467 else if (argbuf.length () == 1)
8468 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
8471 /* Look for startfiles in the standard places. */
8472 if (*startfile_prefix_spec != 0
8473 && do_spec_2 (startfile_prefix_spec, NULL) == 0
8474 && do_spec_1 (" ", 0, NULL) == 0)
8476 for (const char *arg : argbuf)
8477 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
8478 PREFIX_PRIORITY_LAST, 0, 1);
8480 /* We should eventually get rid of all these and stick to
8481 startfile_prefix_spec exclusively. */
8482 else if (*cross_compile == '0' || target_system_root)
8484 if (*md_startfile_prefix)
8485 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
8486 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
8488 if (*md_startfile_prefix_1)
8489 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
8490 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
8492 /* If standard_startfile_prefix is relative, base it on
8493 standard_exec_prefix. This lets us move the installed tree
8494 as a unit. If GCC_EXEC_PREFIX is defined, base
8495 standard_startfile_prefix on that as well.
8497 If the prefix is relative, only search it for native compilers;
8498 otherwise we will search a directory containing host libraries. */
8499 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
8500 add_sysrooted_prefix (&startfile_prefixes,
8501 standard_startfile_prefix, "BINUTILS",
8502 PREFIX_PRIORITY_LAST, 0, 1);
8503 else if (*cross_compile == '0')
8505 add_prefix (&startfile_prefixes,
8506 concat (gcc_exec_prefix
8507 ? gcc_exec_prefix : standard_exec_prefix,
8508 machine_suffix,
8509 standard_startfile_prefix, NULL),
8510 NULL, PREFIX_PRIORITY_LAST, 0, 1);
8513 /* Sysrooted prefixes are relocated because target_system_root is
8514 also relocated by gcc_exec_prefix. */
8515 if (*standard_startfile_prefix_1)
8516 add_sysrooted_prefix (&startfile_prefixes,
8517 standard_startfile_prefix_1, "BINUTILS",
8518 PREFIX_PRIORITY_LAST, 0, 1);
8519 if (*standard_startfile_prefix_2)
8520 add_sysrooted_prefix (&startfile_prefixes,
8521 standard_startfile_prefix_2, "BINUTILS",
8522 PREFIX_PRIORITY_LAST, 0, 1);
8525 /* Process any user specified specs in the order given on the command
8526 line. */
8527 for (struct user_specs *uptr = user_specs_head; uptr; uptr = uptr->next)
8529 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
8530 R_OK, true);
8531 read_specs (filename ? filename : uptr->filename, false, true);
8534 /* Process any user self specs. */
8536 struct spec_list *sl;
8537 for (sl = specs; sl; sl = sl->next)
8538 if (sl->name_len == sizeof "self_spec" - 1
8539 && !strcmp (sl->name, "self_spec"))
8540 do_self_spec (*sl->ptr_spec);
8543 if (compare_debug)
8545 enum save_temps save;
8547 if (!compare_debug_second)
8549 n_switches_debug_check[1] = n_switches;
8550 n_switches_alloc_debug_check[1] = n_switches_alloc;
8551 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
8552 n_switches_alloc);
8554 do_self_spec ("%:compare-debug-self-opt()");
8555 n_switches_debug_check[0] = n_switches;
8556 n_switches_alloc_debug_check[0] = n_switches_alloc;
8557 switches_debug_check[0] = switches;
8559 n_switches = n_switches_debug_check[1];
8560 n_switches_alloc = n_switches_alloc_debug_check[1];
8561 switches = switches_debug_check[1];
8564 /* Avoid crash when computing %j in this early. */
8565 save = save_temps_flag;
8566 save_temps_flag = SAVE_TEMPS_NONE;
8568 compare_debug = -compare_debug;
8569 do_self_spec ("%:compare-debug-self-opt()");
8571 save_temps_flag = save;
8573 if (!compare_debug_second)
8575 n_switches_debug_check[1] = n_switches;
8576 n_switches_alloc_debug_check[1] = n_switches_alloc;
8577 switches_debug_check[1] = switches;
8578 compare_debug = -compare_debug;
8579 n_switches = n_switches_debug_check[0];
8580 n_switches_alloc = n_switches_debug_check[0];
8581 switches = switches_debug_check[0];
8586 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
8587 if (gcc_exec_prefix)
8588 gcc_exec_prefix = concat (gcc_exec_prefix, spec_host_machine,
8589 dir_separator_str, spec_version,
8590 accel_dir_suffix, dir_separator_str, NULL);
8592 /* Now we have the specs.
8593 Set the `valid' bits for switches that match anything in any spec. */
8595 validate_all_switches ();
8597 /* Now that we have the switches and the specs, set
8598 the subdirectory based on the options. */
8599 set_multilib_dir ();
8602 /* Set up to remember the pathname of gcc and any options
8603 needed for collect. We use argv[0] instead of progname because
8604 we need the complete pathname. */
8606 void
8607 driver::putenv_COLLECT_GCC (const char *argv0) const
8609 obstack_init (&collect_obstack);
8610 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
8611 obstack_grow (&collect_obstack, argv0, strlen (argv0) + 1);
8612 xputenv (XOBFINISH (&collect_obstack, char *));
8615 /* Set up to remember the pathname of the lto wrapper. */
8617 void
8618 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
8620 char *lto_wrapper_file;
8622 if (have_c)
8623 lto_wrapper_file = NULL;
8624 else
8625 lto_wrapper_file = find_a_program ("lto-wrapper");
8626 if (lto_wrapper_file)
8628 lto_wrapper_file = convert_white_space (lto_wrapper_file);
8629 set_static_spec_owned (&lto_wrapper_spec, lto_wrapper_file);
8630 obstack_init (&collect_obstack);
8631 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
8632 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
8633 obstack_grow (&collect_obstack, lto_wrapper_spec,
8634 strlen (lto_wrapper_spec) + 1);
8635 xputenv (XOBFINISH (&collect_obstack, char *));
8640 /* Set up to remember the names of offload targets. */
8642 void
8643 driver::maybe_putenv_OFFLOAD_TARGETS () const
8645 if (offload_targets && offload_targets[0] != '\0')
8647 obstack_grow (&collect_obstack, "OFFLOAD_TARGET_NAMES=",
8648 sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
8649 obstack_grow (&collect_obstack, offload_targets,
8650 strlen (offload_targets) + 1);
8651 xputenv (XOBFINISH (&collect_obstack, char *));
8652 #if OFFLOAD_DEFAULTED
8653 if (offload_targets_default)
8654 xputenv ("OFFLOAD_TARGET_DEFAULT=1");
8655 #endif
8658 free (offload_targets);
8659 offload_targets = NULL;
8662 /* Reject switches that no pass was interested in. */
8664 void
8665 driver::handle_unrecognized_options ()
8667 for (size_t i = 0; (int) i < n_switches; i++)
8668 if (! switches[i].validated)
8670 const char *hint = m_option_proposer.suggest_option (switches[i].part1);
8671 if (hint)
8672 error ("unrecognized command-line option %<-%s%>;"
8673 " did you mean %<-%s%>?",
8674 switches[i].part1, hint);
8675 else
8676 error ("unrecognized command-line option %<-%s%>",
8677 switches[i].part1);
8681 /* Handle the various -print-* options, returning 0 if the driver
8682 should exit, or nonzero if the driver should continue. */
8685 driver::maybe_print_and_exit () const
8687 if (print_search_dirs)
8689 printf (_("install: %s%s\n"),
8690 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
8691 gcc_exec_prefix ? "" : machine_suffix);
8692 printf (_("programs: %s\n"),
8693 build_search_list (&exec_prefixes, "", false, false));
8694 printf (_("libraries: %s\n"),
8695 build_search_list (&startfile_prefixes, "", false, true));
8696 return (0);
8699 if (print_file_name)
8701 printf ("%s\n", find_file (print_file_name));
8702 return (0);
8705 if (print_prog_name)
8707 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
8709 /* Append USE_LD to the default linker. */
8710 #ifdef DEFAULT_LINKER
8711 char *ld;
8712 # ifdef HAVE_HOST_EXECUTABLE_SUFFIX
8713 int len = (sizeof (DEFAULT_LINKER)
8714 - sizeof (HOST_EXECUTABLE_SUFFIX));
8715 ld = NULL;
8716 if (len > 0)
8718 char *default_linker = xstrdup (DEFAULT_LINKER);
8719 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
8720 HOST_EXECUTABLE_SUFFIX. */
8721 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
8723 default_linker[len] = '\0';
8724 ld = concat (default_linker, use_ld,
8725 HOST_EXECUTABLE_SUFFIX, NULL);
8728 if (ld == NULL)
8729 # endif
8730 ld = concat (DEFAULT_LINKER, use_ld, NULL);
8731 if (access (ld, X_OK) == 0)
8733 printf ("%s\n", ld);
8734 return (0);
8736 #endif
8737 print_prog_name = concat (print_prog_name, use_ld, NULL);
8739 char *newname = find_a_program (print_prog_name);
8740 printf ("%s\n", (newname ? newname : print_prog_name));
8741 return (0);
8744 if (print_multi_lib)
8746 print_multilib_info ();
8747 return (0);
8750 if (print_multi_directory)
8752 if (multilib_dir == NULL)
8753 printf (".\n");
8754 else
8755 printf ("%s\n", multilib_dir);
8756 return (0);
8759 if (print_multiarch)
8761 if (multiarch_dir == NULL)
8762 printf ("\n");
8763 else
8764 printf ("%s\n", multiarch_dir);
8765 return (0);
8768 if (print_sysroot)
8770 if (target_system_root)
8772 if (target_sysroot_suffix)
8773 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
8774 else
8775 printf ("%s\n", target_system_root);
8777 return (0);
8780 if (print_multi_os_directory)
8782 if (multilib_os_dir == NULL)
8783 printf (".\n");
8784 else
8785 printf ("%s\n", multilib_os_dir);
8786 return (0);
8789 if (print_sysroot_headers_suffix)
8791 if (*sysroot_hdrs_suffix_spec)
8793 printf("%s\n", (target_sysroot_hdrs_suffix
8794 ? target_sysroot_hdrs_suffix
8795 : ""));
8796 return (0);
8798 else
8799 /* The error status indicates that only one set of fixed
8800 headers should be built. */
8801 fatal_error (input_location,
8802 "not configured with sysroot headers suffix");
8805 if (print_help_list)
8807 display_help ();
8809 if (! verbose_flag)
8811 printf (_("\nFor bug reporting instructions, please see:\n"));
8812 printf ("%s.\n", bug_report_url);
8814 return (0);
8817 /* We do not exit here. Instead we have created a fake input file
8818 called 'help-dummy' which needs to be compiled, and we pass this
8819 on the various sub-processes, along with the --help switch.
8820 Ensure their output appears after ours. */
8821 fputc ('\n', stdout);
8822 fflush (stdout);
8825 if (print_version)
8827 printf (_("%s %s%s\n"), progname, pkgversion_string,
8828 version_string);
8829 printf ("Copyright %s 2023 Free Software Foundation, Inc.\n",
8830 _("(C)"));
8831 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
8832 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
8833 stdout);
8834 if (! verbose_flag)
8835 return 0;
8837 /* We do not exit here. We use the same mechanism of --help to print
8838 the version of the sub-processes. */
8839 fputc ('\n', stdout);
8840 fflush (stdout);
8843 if (verbose_flag)
8845 print_configuration (stderr);
8846 if (n_infiles == 0)
8847 return (0);
8850 return 1;
8853 /* Figure out what to do with each input file.
8854 Return true if we need to exit early from "main", false otherwise. */
8856 bool
8857 driver::prepare_infiles ()
8859 size_t i;
8860 int lang_n_infiles = 0;
8862 if (n_infiles == added_libraries)
8863 fatal_error (input_location, "no input files");
8865 if (seen_error ())
8866 /* Early exit needed from main. */
8867 return true;
8869 /* Make a place to record the compiler output file names
8870 that correspond to the input files. */
8872 i = n_infiles;
8873 i += lang_specific_extra_outfiles;
8874 outfiles = XCNEWVEC (const char *, i);
8876 /* Record which files were specified explicitly as link input. */
8878 explicit_link_files = XCNEWVEC (char, n_infiles);
8880 combine_inputs = have_o || flag_wpa;
8882 for (i = 0; (int) i < n_infiles; i++)
8884 const char *name = infiles[i].name;
8885 struct compiler *compiler = lookup_compiler (name,
8886 strlen (name),
8887 infiles[i].language);
8889 if (compiler && !(compiler->combinable))
8890 combine_inputs = false;
8892 if (lang_n_infiles > 0 && compiler != input_file_compiler
8893 && infiles[i].language && infiles[i].language[0] != '*')
8894 infiles[i].incompiler = compiler;
8895 else if (compiler)
8897 lang_n_infiles++;
8898 input_file_compiler = compiler;
8899 infiles[i].incompiler = compiler;
8901 else
8903 /* Since there is no compiler for this input file, assume it is a
8904 linker file. */
8905 explicit_link_files[i] = 1;
8906 infiles[i].incompiler = NULL;
8908 infiles[i].compiled = false;
8909 infiles[i].preprocessed = false;
8912 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
8913 fatal_error (input_location,
8914 "cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> "
8915 "with multiple files");
8917 /* No early exit needed from main; we can continue. */
8918 return false;
8921 /* Run the spec machinery on each input file. */
8923 void
8924 driver::do_spec_on_infiles () const
8926 size_t i;
8928 for (i = 0; (int) i < n_infiles; i++)
8930 int this_file_error = 0;
8932 /* Tell do_spec what to substitute for %i. */
8934 input_file_number = i;
8935 set_input (infiles[i].name);
8937 if (infiles[i].compiled)
8938 continue;
8940 /* Use the same thing in %o, unless cp->spec says otherwise. */
8942 outfiles[i] = gcc_input_filename;
8944 /* Figure out which compiler from the file's suffix. */
8946 input_file_compiler
8947 = lookup_compiler (infiles[i].name, input_filename_length,
8948 infiles[i].language);
8950 if (input_file_compiler)
8952 /* Ok, we found an applicable compiler. Run its spec. */
8954 if (input_file_compiler->spec[0] == '#')
8956 error ("%s: %s compiler not installed on this system",
8957 gcc_input_filename, &input_file_compiler->spec[1]);
8958 this_file_error = 1;
8960 else
8962 int value;
8964 if (compare_debug)
8966 free (debug_check_temp_file[0]);
8967 debug_check_temp_file[0] = NULL;
8969 free (debug_check_temp_file[1]);
8970 debug_check_temp_file[1] = NULL;
8973 value = do_spec (input_file_compiler->spec);
8974 infiles[i].compiled = true;
8975 if (value < 0)
8976 this_file_error = 1;
8977 else if (compare_debug && debug_check_temp_file[0])
8979 if (verbose_flag)
8980 inform (UNKNOWN_LOCATION,
8981 "recompiling with %<-fcompare-debug%>");
8983 compare_debug = -compare_debug;
8984 n_switches = n_switches_debug_check[1];
8985 n_switches_alloc = n_switches_alloc_debug_check[1];
8986 switches = switches_debug_check[1];
8988 value = do_spec (input_file_compiler->spec);
8990 compare_debug = -compare_debug;
8991 n_switches = n_switches_debug_check[0];
8992 n_switches_alloc = n_switches_alloc_debug_check[0];
8993 switches = switches_debug_check[0];
8995 if (value < 0)
8997 error ("during %<-fcompare-debug%> recompilation");
8998 this_file_error = 1;
9001 gcc_assert (debug_check_temp_file[1]
9002 && filename_cmp (debug_check_temp_file[0],
9003 debug_check_temp_file[1]));
9005 if (verbose_flag)
9006 inform (UNKNOWN_LOCATION, "comparing final insns dumps");
9008 if (compare_files (debug_check_temp_file))
9009 this_file_error = 1;
9012 if (compare_debug)
9014 free (debug_check_temp_file[0]);
9015 debug_check_temp_file[0] = NULL;
9017 free (debug_check_temp_file[1]);
9018 debug_check_temp_file[1] = NULL;
9023 /* If this file's name does not contain a recognized suffix,
9024 record it as explicit linker input. */
9026 else
9027 explicit_link_files[i] = 1;
9029 /* Clear the delete-on-failure queue, deleting the files in it
9030 if this compilation failed. */
9032 if (this_file_error)
9034 delete_failure_queue ();
9035 errorcount++;
9037 /* If this compilation succeeded, don't delete those files later. */
9038 clear_failure_queue ();
9041 /* Reset the input file name to the first compile/object file name, for use
9042 with %b in LINK_SPEC. We use the first input file that we can find
9043 a compiler to compile it instead of using infiles.language since for
9044 languages other than C we use aliases that we then lookup later. */
9045 if (n_infiles > 0)
9047 int i;
9049 for (i = 0; i < n_infiles ; i++)
9050 if (infiles[i].incompiler
9051 || (infiles[i].language && infiles[i].language[0] != '*'))
9053 set_input (infiles[i].name);
9054 break;
9058 if (!seen_error ())
9060 /* Make sure INPUT_FILE_NUMBER points to first available open
9061 slot. */
9062 input_file_number = n_infiles;
9063 if (lang_specific_pre_link ())
9064 errorcount++;
9068 /* If we have to run the linker, do it now. */
9070 void
9071 driver::maybe_run_linker (const char *argv0) const
9073 size_t i;
9074 int linker_was_run = 0;
9075 int num_linker_inputs;
9077 /* Determine if there are any linker input files. */
9078 num_linker_inputs = 0;
9079 for (i = 0; (int) i < n_infiles; i++)
9080 if (explicit_link_files[i] || outfiles[i] != NULL)
9081 num_linker_inputs++;
9083 /* Arrange for temporary file names created during linking to take
9084 on names related with the linker output rather than with the
9085 inputs when appropriate. */
9086 if (outbase && *outbase)
9088 if (dumpdir)
9090 char *tofree = dumpdir;
9091 gcc_checking_assert (strlen (dumpdir) == dumpdir_length);
9092 dumpdir = concat (dumpdir, outbase, ".", NULL);
9093 free (tofree);
9095 else
9096 dumpdir = concat (outbase, ".", NULL);
9097 dumpdir_length += strlen (outbase) + 1;
9098 dumpdir_trailing_dash_added = true;
9100 else if (dumpdir_trailing_dash_added)
9102 gcc_assert (dumpdir[dumpdir_length - 1] == '-');
9103 dumpdir[dumpdir_length - 1] = '.';
9106 if (dumpdir_trailing_dash_added)
9108 gcc_assert (dumpdir_length > 0);
9109 gcc_assert (dumpdir[dumpdir_length - 1] == '.');
9110 dumpdir_length--;
9113 free (outbase);
9114 input_basename = outbase = NULL;
9115 outbase_length = suffixed_basename_length = basename_length = 0;
9117 /* Run ld to link all the compiler output files. */
9119 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
9121 int tmp = execution_count;
9123 detect_jobserver ();
9125 if (! have_c)
9127 #if HAVE_LTO_PLUGIN > 0
9128 #if HAVE_LTO_PLUGIN == 2
9129 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
9130 #else
9131 const char *fuse_linker_plugin = "fuse-linker-plugin";
9132 #endif
9133 #endif
9135 /* We'll use ld if we can't find collect2. */
9136 if (! strcmp (linker_name_spec, "collect2"))
9138 char *s = find_a_program ("collect2");
9139 if (s == NULL)
9140 set_static_spec_shared (&linker_name_spec, "ld");
9143 #if HAVE_LTO_PLUGIN > 0
9144 #if HAVE_LTO_PLUGIN == 2
9145 if (!switch_matches (fno_use_linker_plugin,
9146 fno_use_linker_plugin
9147 + strlen (fno_use_linker_plugin), 0))
9148 #else
9149 if (switch_matches (fuse_linker_plugin,
9150 fuse_linker_plugin
9151 + strlen (fuse_linker_plugin), 0))
9152 #endif
9154 char *temp_spec = find_a_file (&exec_prefixes,
9155 LTOPLUGINSONAME, R_OK,
9156 false);
9157 if (!temp_spec)
9158 fatal_error (input_location,
9159 "%<-fuse-linker-plugin%>, but %s not found",
9160 LTOPLUGINSONAME);
9161 linker_plugin_file_spec = convert_white_space (temp_spec);
9163 #endif
9164 set_static_spec_shared (&lto_gcc_spec, argv0);
9167 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
9168 for collect. */
9169 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
9170 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
9172 if (print_subprocess_help == 1)
9174 printf (_("\nLinker options\n==============\n\n"));
9175 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
9176 " to the linker.\n\n"));
9177 fflush (stdout);
9179 int value = do_spec (link_command_spec);
9180 if (value < 0)
9181 errorcount = 1;
9182 linker_was_run = (tmp != execution_count);
9185 /* If options said don't run linker,
9186 complain about input files to be given to the linker. */
9188 if (! linker_was_run && !seen_error ())
9189 for (i = 0; (int) i < n_infiles; i++)
9190 if (explicit_link_files[i]
9191 && !(infiles[i].language && infiles[i].language[0] == '*'))
9193 warning (0, "%s: linker input file unused because linking not done",
9194 outfiles[i]);
9195 if (access (outfiles[i], F_OK) < 0)
9196 /* This is can be an indication the user specifed an errorneous
9197 separated option value, (or used the wrong prefix for an
9198 option). */
9199 error ("%s: linker input file not found: %m", outfiles[i]);
9203 /* The end of "main". */
9205 void
9206 driver::final_actions () const
9208 /* Delete some or all of the temporary files we made. */
9210 if (seen_error ())
9211 delete_failure_queue ();
9212 delete_temp_files ();
9214 if (print_help_list)
9216 printf (("\nFor bug reporting instructions, please see:\n"));
9217 printf ("%s\n", bug_report_url);
9221 /* Detect whether jobserver is active and working. If not drop
9222 --jobserver-auth from MAKEFLAGS. */
9224 void
9225 driver::detect_jobserver () const
9227 jobserver_info jinfo;
9228 if (!jinfo.is_active && !jinfo.skipped_makeflags.empty ())
9229 xputenv (xstrdup (jinfo.skipped_makeflags.c_str ()));
9232 /* Determine what the exit code of the driver should be. */
9235 driver::get_exit_code () const
9237 return (signal_count != 0 ? 2
9238 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
9239 : 0);
9242 /* Find the proper compilation spec for the file name NAME,
9243 whose length is LENGTH. LANGUAGE is the specified language,
9244 or 0 if this file is to be passed to the linker. */
9246 static struct compiler *
9247 lookup_compiler (const char *name, size_t length, const char *language)
9249 struct compiler *cp;
9251 /* If this was specified by the user to be a linker input, indicate that. */
9252 if (language != 0 && language[0] == '*')
9253 return 0;
9255 /* Otherwise, look for the language, if one is spec'd. */
9256 if (language != 0)
9258 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9259 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
9261 if (name != NULL && strcmp (name, "-") == 0
9262 && (strcmp (cp->suffix, "@c-header") == 0
9263 || strcmp (cp->suffix, "@c++-header") == 0)
9264 && !have_E)
9265 fatal_error (input_location,
9266 "cannot use %<-%> as input filename for a "
9267 "precompiled header");
9269 return cp;
9272 error ("language %s not recognized", language);
9273 return 0;
9276 /* Look for a suffix. */
9277 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9279 if (/* The suffix `-' matches only the file name `-'. */
9280 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
9281 || (strlen (cp->suffix) < length
9282 /* See if the suffix matches the end of NAME. */
9283 && !strcmp (cp->suffix,
9284 name + length - strlen (cp->suffix))
9286 break;
9289 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
9290 /* Look again, but case-insensitively this time. */
9291 if (cp < compilers)
9292 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9294 if (/* The suffix `-' matches only the file name `-'. */
9295 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
9296 || (strlen (cp->suffix) < length
9297 /* See if the suffix matches the end of NAME. */
9298 && ((!strcmp (cp->suffix,
9299 name + length - strlen (cp->suffix))
9300 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
9301 && !strcasecmp (cp->suffix,
9302 name + length - strlen (cp->suffix)))
9304 break;
9306 #endif
9308 if (cp >= compilers)
9310 if (cp->spec[0] != '@')
9311 /* A non-alias entry: return it. */
9312 return cp;
9314 /* An alias entry maps a suffix to a language.
9315 Search for the language; pass 0 for NAME and LENGTH
9316 to avoid infinite recursion if language not found. */
9317 return lookup_compiler (NULL, 0, cp->spec + 1);
9319 return 0;
9322 static char *
9323 save_string (const char *s, int len)
9325 char *result = XNEWVEC (char, len + 1);
9327 gcc_checking_assert (strlen (s) >= (unsigned int) len);
9328 memcpy (result, s, len);
9329 result[len] = 0;
9330 return result;
9334 static inline void
9335 validate_switches_from_spec (const char *spec, bool user)
9337 const char *p = spec;
9338 char c;
9339 while ((c = *p++))
9340 if (c == '%'
9341 && (*p == '{'
9342 || *p == '<'
9343 || (*p == 'W' && *++p == '{')
9344 || (*p == '@' && *++p == '{')))
9345 /* We have a switch spec. */
9346 p = validate_switches (p + 1, user, *p == '{');
9349 static void
9350 validate_all_switches (void)
9352 struct compiler *comp;
9353 struct spec_list *spec;
9355 for (comp = compilers; comp->spec; comp++)
9356 validate_switches_from_spec (comp->spec, false);
9358 /* Look through the linked list of specs read from the specs file. */
9359 for (spec = specs; spec; spec = spec->next)
9360 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
9362 validate_switches_from_spec (link_command_spec, false);
9365 /* Look at the switch-name that comes after START and mark as valid
9366 all supplied switches that match it. If BRACED, handle other
9367 switches after '|' and '&', and specs after ':' until ';' or '}',
9368 going back for more switches after ';'. Without BRACED, handle
9369 only one atom. Return a pointer to whatever follows the handled
9370 items, after the closing brace if BRACED. */
9372 static const char *
9373 validate_switches (const char *start, bool user_spec, bool braced)
9375 const char *p = start;
9376 const char *atom;
9377 size_t len;
9378 int i;
9379 bool suffix;
9380 bool starred;
9382 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
9384 next_member:
9385 suffix = false;
9386 starred = false;
9388 SKIP_WHITE ();
9390 if (*p == '!')
9391 p++;
9393 SKIP_WHITE ();
9394 if (*p == '.' || *p == ',')
9395 suffix = true, p++;
9397 atom = p;
9398 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
9399 || *p == ',' || *p == '.' || *p == '@')
9400 p++;
9401 len = p - atom;
9403 if (*p == '*')
9404 starred = true, p++;
9406 SKIP_WHITE ();
9408 if (!suffix)
9410 /* Mark all matching switches as valid. */
9411 for (i = 0; i < n_switches; i++)
9412 if (!strncmp (switches[i].part1, atom, len)
9413 && (starred || switches[i].part1[len] == '\0')
9414 && (switches[i].known || user_spec))
9415 switches[i].validated = true;
9418 if (!braced)
9419 return p;
9421 if (*p) p++;
9422 if (*p && (p[-1] == '|' || p[-1] == '&'))
9423 goto next_member;
9425 if (*p && p[-1] == ':')
9427 while (*p && *p != ';' && *p != '}')
9429 if (*p == '%')
9431 p++;
9432 if (*p == '{' || *p == '<')
9433 p = validate_switches (p+1, user_spec, *p == '{');
9434 else if (p[0] == 'W' && p[1] == '{')
9435 p = validate_switches (p+2, user_spec, true);
9436 else if (p[0] == '@' && p[1] == '{')
9437 p = validate_switches (p+2, user_spec, true);
9439 else
9440 p++;
9443 if (*p) p++;
9444 if (*p && p[-1] == ';')
9445 goto next_member;
9448 return p;
9449 #undef SKIP_WHITE
9452 struct mdswitchstr
9454 const char *str;
9455 int len;
9458 static struct mdswitchstr *mdswitches;
9459 static int n_mdswitches;
9461 /* Check whether a particular argument was used. The first time we
9462 canonicalize the switches to keep only the ones we care about. */
9464 struct used_arg_t
9466 public:
9467 int operator () (const char *p, int len);
9468 void finalize ();
9470 private:
9471 struct mswitchstr
9473 const char *str;
9474 const char *replace;
9475 int len;
9476 int rep_len;
9479 mswitchstr *mswitches;
9480 int n_mswitches;
9484 used_arg_t used_arg;
9487 used_arg_t::operator () (const char *p, int len)
9489 int i, j;
9491 if (!mswitches)
9493 struct mswitchstr *matches;
9494 const char *q;
9495 int cnt = 0;
9497 /* Break multilib_matches into the component strings of string
9498 and replacement string. */
9499 for (q = multilib_matches; *q != '\0'; q++)
9500 if (*q == ';')
9501 cnt++;
9503 matches
9504 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
9505 i = 0;
9506 q = multilib_matches;
9507 while (*q != '\0')
9509 matches[i].str = q;
9510 while (*q != ' ')
9512 if (*q == '\0')
9514 invalid_matches:
9515 fatal_error (input_location, "multilib spec %qs is invalid",
9516 multilib_matches);
9518 q++;
9520 matches[i].len = q - matches[i].str;
9522 matches[i].replace = ++q;
9523 while (*q != ';' && *q != '\0')
9525 if (*q == ' ')
9526 goto invalid_matches;
9527 q++;
9529 matches[i].rep_len = q - matches[i].replace;
9530 i++;
9531 if (*q == ';')
9532 q++;
9535 /* Now build a list of the replacement string for switches that we care
9536 about. Make sure we allocate at least one entry. This prevents
9537 xmalloc from calling fatal, and prevents us from re-executing this
9538 block of code. */
9539 mswitches
9540 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
9541 for (i = 0; i < n_switches; i++)
9542 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
9544 int xlen = strlen (switches[i].part1);
9545 for (j = 0; j < cnt; j++)
9546 if (xlen == matches[j].len
9547 && ! strncmp (switches[i].part1, matches[j].str, xlen))
9549 mswitches[n_mswitches].str = matches[j].replace;
9550 mswitches[n_mswitches].len = matches[j].rep_len;
9551 mswitches[n_mswitches].replace = (char *) 0;
9552 mswitches[n_mswitches].rep_len = 0;
9553 n_mswitches++;
9554 break;
9558 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
9559 on the command line nor any options mutually incompatible with
9560 them. */
9561 for (i = 0; i < n_mdswitches; i++)
9563 const char *r;
9565 for (q = multilib_options; *q != '\0'; *q && q++)
9567 while (*q == ' ')
9568 q++;
9570 r = q;
9571 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
9572 || strchr (" /", q[mdswitches[i].len]) == NULL)
9574 while (*q != ' ' && *q != '/' && *q != '\0')
9575 q++;
9576 if (*q != '/')
9577 break;
9578 q++;
9581 if (*q != ' ' && *q != '\0')
9583 while (*r != ' ' && *r != '\0')
9585 q = r;
9586 while (*q != ' ' && *q != '/' && *q != '\0')
9587 q++;
9589 if (used_arg (r, q - r))
9590 break;
9592 if (*q != '/')
9594 mswitches[n_mswitches].str = mdswitches[i].str;
9595 mswitches[n_mswitches].len = mdswitches[i].len;
9596 mswitches[n_mswitches].replace = (char *) 0;
9597 mswitches[n_mswitches].rep_len = 0;
9598 n_mswitches++;
9599 break;
9602 r = q + 1;
9604 break;
9610 for (i = 0; i < n_mswitches; i++)
9611 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
9612 return 1;
9614 return 0;
9617 void used_arg_t::finalize ()
9619 XDELETEVEC (mswitches);
9620 mswitches = NULL;
9621 n_mswitches = 0;
9625 static int
9626 default_arg (const char *p, int len)
9628 int i;
9630 for (i = 0; i < n_mdswitches; i++)
9631 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
9632 return 1;
9634 return 0;
9637 /* Work out the subdirectory to use based on the options. The format of
9638 multilib_select is a list of elements. Each element is a subdirectory
9639 name followed by a list of options followed by a semicolon. The format
9640 of multilib_exclusions is the same, but without the preceding
9641 directory. First gcc will check the exclusions, if none of the options
9642 beginning with an exclamation point are present, and all of the other
9643 options are present, then we will ignore this completely. Passing
9644 that, gcc will consider each multilib_select in turn using the same
9645 rules for matching the options. If a match is found, that subdirectory
9646 will be used.
9647 A subdirectory name is optionally followed by a colon and the corresponding
9648 multiarch name. */
9650 static void
9651 set_multilib_dir (void)
9653 const char *p;
9654 unsigned int this_path_len;
9655 const char *this_path, *this_arg;
9656 const char *start, *end;
9657 int not_arg;
9658 int ok, ndfltok, first;
9660 n_mdswitches = 0;
9661 start = multilib_defaults;
9662 while (*start == ' ' || *start == '\t')
9663 start++;
9664 while (*start != '\0')
9666 n_mdswitches++;
9667 while (*start != ' ' && *start != '\t' && *start != '\0')
9668 start++;
9669 while (*start == ' ' || *start == '\t')
9670 start++;
9673 if (n_mdswitches)
9675 int i = 0;
9677 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
9678 for (start = multilib_defaults; *start != '\0'; start = end + 1)
9680 while (*start == ' ' || *start == '\t')
9681 start++;
9683 if (*start == '\0')
9684 break;
9686 for (end = start + 1;
9687 *end != ' ' && *end != '\t' && *end != '\0'; end++)
9690 obstack_grow (&multilib_obstack, start, end - start);
9691 obstack_1grow (&multilib_obstack, 0);
9692 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
9693 mdswitches[i++].len = end - start;
9695 if (*end == '\0')
9696 break;
9700 p = multilib_exclusions;
9701 while (*p != '\0')
9703 /* Ignore newlines. */
9704 if (*p == '\n')
9706 ++p;
9707 continue;
9710 /* Check the arguments. */
9711 ok = 1;
9712 while (*p != ';')
9714 if (*p == '\0')
9716 invalid_exclusions:
9717 fatal_error (input_location, "multilib exclusions %qs is invalid",
9718 multilib_exclusions);
9721 if (! ok)
9723 ++p;
9724 continue;
9727 this_arg = p;
9728 while (*p != ' ' && *p != ';')
9730 if (*p == '\0')
9731 goto invalid_exclusions;
9732 ++p;
9735 if (*this_arg != '!')
9736 not_arg = 0;
9737 else
9739 not_arg = 1;
9740 ++this_arg;
9743 ok = used_arg (this_arg, p - this_arg);
9744 if (not_arg)
9745 ok = ! ok;
9747 if (*p == ' ')
9748 ++p;
9751 if (ok)
9752 return;
9754 ++p;
9757 first = 1;
9758 p = multilib_select;
9760 /* Append multilib reuse rules if any. With those rules, we can reuse
9761 one multilib for certain different options sets. */
9762 if (strlen (multilib_reuse) > 0)
9763 p = concat (p, multilib_reuse, NULL);
9765 while (*p != '\0')
9767 /* Ignore newlines. */
9768 if (*p == '\n')
9770 ++p;
9771 continue;
9774 /* Get the initial path. */
9775 this_path = p;
9776 while (*p != ' ')
9778 if (*p == '\0')
9780 invalid_select:
9781 fatal_error (input_location, "multilib select %qs %qs is invalid",
9782 multilib_select, multilib_reuse);
9784 ++p;
9786 this_path_len = p - this_path;
9788 /* Check the arguments. */
9789 ok = 1;
9790 ndfltok = 1;
9791 ++p;
9792 while (*p != ';')
9794 if (*p == '\0')
9795 goto invalid_select;
9797 if (! ok)
9799 ++p;
9800 continue;
9803 this_arg = p;
9804 while (*p != ' ' && *p != ';')
9806 if (*p == '\0')
9807 goto invalid_select;
9808 ++p;
9811 if (*this_arg != '!')
9812 not_arg = 0;
9813 else
9815 not_arg = 1;
9816 ++this_arg;
9819 /* If this is a default argument, we can just ignore it.
9820 This is true even if this_arg begins with '!'. Beginning
9821 with '!' does not mean that this argument is necessarily
9822 inappropriate for this library: it merely means that
9823 there is a more specific library which uses this
9824 argument. If this argument is a default, we need not
9825 consider that more specific library. */
9826 ok = used_arg (this_arg, p - this_arg);
9827 if (not_arg)
9828 ok = ! ok;
9830 if (! ok)
9831 ndfltok = 0;
9833 if (default_arg (this_arg, p - this_arg))
9834 ok = 1;
9836 if (*p == ' ')
9837 ++p;
9840 if (ok && first)
9842 if (this_path_len != 1
9843 || this_path[0] != '.')
9845 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
9846 char *q;
9848 strncpy (new_multilib_dir, this_path, this_path_len);
9849 new_multilib_dir[this_path_len] = '\0';
9850 q = strchr (new_multilib_dir, ':');
9851 if (q != NULL)
9852 *q = '\0';
9853 multilib_dir = new_multilib_dir;
9855 first = 0;
9858 if (ndfltok)
9860 const char *q = this_path, *end = this_path + this_path_len;
9862 while (q < end && *q != ':')
9863 q++;
9864 if (q < end)
9866 const char *q2 = q + 1, *ml_end = end;
9867 char *new_multilib_os_dir;
9869 while (q2 < end && *q2 != ':')
9870 q2++;
9871 if (*q2 == ':')
9872 ml_end = q2;
9873 if (ml_end - q == 1)
9874 multilib_os_dir = xstrdup (".");
9875 else
9877 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
9878 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
9879 new_multilib_os_dir[ml_end - q - 1] = '\0';
9880 multilib_os_dir = new_multilib_os_dir;
9883 if (q2 < end && *q2 == ':')
9885 char *new_multiarch_dir = XNEWVEC (char, end - q2);
9886 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
9887 new_multiarch_dir[end - q2 - 1] = '\0';
9888 multiarch_dir = new_multiarch_dir;
9890 break;
9894 ++p;
9897 multilib_dir =
9898 targetm_common.compute_multilib (
9899 switches,
9900 n_switches,
9901 multilib_dir,
9902 multilib_defaults,
9903 multilib_select,
9904 multilib_matches,
9905 multilib_exclusions,
9906 multilib_reuse);
9908 if (multilib_dir == NULL && multilib_os_dir != NULL
9909 && strcmp (multilib_os_dir, ".") == 0)
9911 free (CONST_CAST (char *, multilib_os_dir));
9912 multilib_os_dir = NULL;
9914 else if (multilib_dir != NULL && multilib_os_dir == NULL)
9915 multilib_os_dir = multilib_dir;
9918 /* Print out the multiple library subdirectory selection
9919 information. This prints out a series of lines. Each line looks
9920 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
9921 required. Only the desired options are printed out, the negative
9922 matches. The options are print without a leading dash. There are
9923 no spaces to make it easy to use the information in the shell.
9924 Each subdirectory is printed only once. This assumes the ordering
9925 generated by the genmultilib script. Also, we leave out ones that match
9926 the exclusions. */
9928 static void
9929 print_multilib_info (void)
9931 const char *p = multilib_select;
9932 const char *last_path = 0, *this_path;
9933 int skip;
9934 int not_arg;
9935 unsigned int last_path_len = 0;
9937 while (*p != '\0')
9939 skip = 0;
9940 /* Ignore newlines. */
9941 if (*p == '\n')
9943 ++p;
9944 continue;
9947 /* Get the initial path. */
9948 this_path = p;
9949 while (*p != ' ')
9951 if (*p == '\0')
9953 invalid_select:
9954 fatal_error (input_location,
9955 "multilib select %qs is invalid", multilib_select);
9958 ++p;
9961 /* When --disable-multilib was used but target defines
9962 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
9963 with .:: for multiarch configurations) are there just to find
9964 multilib_os_dir, so skip them from output. */
9965 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
9966 skip = 1;
9968 /* Check for matches with the multilib_exclusions. We don't bother
9969 with the '!' in either list. If any of the exclusion rules match
9970 all of its options with the select rule, we skip it. */
9972 const char *e = multilib_exclusions;
9973 const char *this_arg;
9975 while (*e != '\0')
9977 int m = 1;
9978 /* Ignore newlines. */
9979 if (*e == '\n')
9981 ++e;
9982 continue;
9985 /* Check the arguments. */
9986 while (*e != ';')
9988 const char *q;
9989 int mp = 0;
9991 if (*e == '\0')
9993 invalid_exclusion:
9994 fatal_error (input_location,
9995 "multilib exclusion %qs is invalid",
9996 multilib_exclusions);
9999 if (! m)
10001 ++e;
10002 continue;
10005 this_arg = e;
10007 while (*e != ' ' && *e != ';')
10009 if (*e == '\0')
10010 goto invalid_exclusion;
10011 ++e;
10014 q = p + 1;
10015 while (*q != ';')
10017 const char *arg;
10018 int len = e - this_arg;
10020 if (*q == '\0')
10021 goto invalid_select;
10023 arg = q;
10025 while (*q != ' ' && *q != ';')
10027 if (*q == '\0')
10028 goto invalid_select;
10029 ++q;
10032 if (! strncmp (arg, this_arg,
10033 (len < q - arg) ? q - arg : len)
10034 || default_arg (this_arg, e - this_arg))
10036 mp = 1;
10037 break;
10040 if (*q == ' ')
10041 ++q;
10044 if (! mp)
10045 m = 0;
10047 if (*e == ' ')
10048 ++e;
10051 if (m)
10053 skip = 1;
10054 break;
10057 if (*e != '\0')
10058 ++e;
10062 if (! skip)
10064 /* If this is a duplicate, skip it. */
10065 skip = (last_path != 0
10066 && (unsigned int) (p - this_path) == last_path_len
10067 && ! filename_ncmp (last_path, this_path, last_path_len));
10069 last_path = this_path;
10070 last_path_len = p - this_path;
10073 /* If all required arguments are default arguments, and no default
10074 arguments appear in the ! argument list, then we can skip it.
10075 We will already have printed a directory identical to this one
10076 which does not require that default argument. */
10077 if (! skip)
10079 const char *q;
10080 bool default_arg_ok = false;
10082 q = p + 1;
10083 while (*q != ';')
10085 const char *arg;
10087 if (*q == '\0')
10088 goto invalid_select;
10090 if (*q == '!')
10092 not_arg = 1;
10093 q++;
10095 else
10096 not_arg = 0;
10097 arg = q;
10099 while (*q != ' ' && *q != ';')
10101 if (*q == '\0')
10102 goto invalid_select;
10103 ++q;
10106 if (default_arg (arg, q - arg))
10108 /* Stop checking if any default arguments appeared in not
10109 list. */
10110 if (not_arg)
10112 default_arg_ok = false;
10113 break;
10116 default_arg_ok = true;
10118 else if (!not_arg)
10120 /* Stop checking if any required argument is not provided by
10121 default arguments. */
10122 default_arg_ok = false;
10123 break;
10126 if (*q == ' ')
10127 ++q;
10130 /* Make sure all default argument is OK for this multi-lib set. */
10131 if (default_arg_ok)
10132 skip = 1;
10133 else
10134 skip = 0;
10137 if (! skip)
10139 const char *p1;
10141 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
10142 putchar (*p1);
10143 putchar (';');
10146 ++p;
10147 while (*p != ';')
10149 int use_arg;
10151 if (*p == '\0')
10152 goto invalid_select;
10154 if (skip)
10156 ++p;
10157 continue;
10160 use_arg = *p != '!';
10162 if (use_arg)
10163 putchar ('@');
10165 while (*p != ' ' && *p != ';')
10167 if (*p == '\0')
10168 goto invalid_select;
10169 if (use_arg)
10170 putchar (*p);
10171 ++p;
10174 if (*p == ' ')
10175 ++p;
10178 if (! skip)
10180 /* If there are extra options, print them now. */
10181 if (multilib_extra && *multilib_extra)
10183 int print_at = true;
10184 const char *q;
10186 for (q = multilib_extra; *q != '\0'; q++)
10188 if (*q == ' ')
10189 print_at = true;
10190 else
10192 if (print_at)
10193 putchar ('@');
10194 putchar (*q);
10195 print_at = false;
10200 putchar ('\n');
10203 ++p;
10207 /* getenv built-in spec function.
10209 Returns the value of the environment variable given by its first argument,
10210 concatenated with the second argument. If the variable is not defined, a
10211 fatal error is issued unless such undefs are internally allowed, in which
10212 case the variable name prefixed by a '/' is used as the variable value.
10214 The leading '/' allows using the result at a spot where a full path would
10215 normally be expected and when the actual value doesn't really matter since
10216 undef vars are allowed. */
10218 static const char *
10219 getenv_spec_function (int argc, const char **argv)
10221 const char *value;
10222 const char *varname;
10224 char *result;
10225 char *ptr;
10226 size_t len;
10228 if (argc != 2)
10229 return NULL;
10231 varname = argv[0];
10232 value = env.get (varname);
10234 /* If the variable isn't defined and this is allowed, craft our expected
10235 return value. Assume variable names used in specs strings don't contain
10236 any active spec character so don't need escaping. */
10237 if (!value && spec_undefvar_allowed)
10239 result = XNEWVAR (char, strlen(varname) + 2);
10240 sprintf (result, "/%s", varname);
10241 return result;
10244 if (!value)
10245 fatal_error (input_location,
10246 "environment variable %qs not defined", varname);
10248 /* We have to escape every character of the environment variable so
10249 they are not interpreted as active spec characters. A
10250 particularly painful case is when we are reading a variable
10251 holding a windows path complete with \ separators. */
10252 len = strlen (value) * 2 + strlen (argv[1]) + 1;
10253 result = XNEWVAR (char, len);
10254 for (ptr = result; *value; ptr += 2)
10256 ptr[0] = '\\';
10257 ptr[1] = *value++;
10260 strcpy (ptr, argv[1]);
10262 return result;
10265 /* if-exists built-in spec function.
10267 Checks to see if the file specified by the absolute pathname in
10268 ARGS exists. Returns that pathname if found.
10270 The usual use for this function is to check for a library file
10271 (whose name has been expanded with %s). */
10273 static const char *
10274 if_exists_spec_function (int argc, const char **argv)
10276 /* Must have only one argument. */
10277 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10278 return argv[0];
10280 return NULL;
10283 /* if-exists-else built-in spec function.
10285 This is like if-exists, but takes an additional argument which
10286 is returned if the first argument does not exist. */
10288 static const char *
10289 if_exists_else_spec_function (int argc, const char **argv)
10291 /* Must have exactly two arguments. */
10292 if (argc != 2)
10293 return NULL;
10295 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10296 return argv[0];
10298 return argv[1];
10301 /* if-exists-then-else built-in spec function.
10303 Checks to see if the file specified by the absolute pathname in
10304 the first arg exists. Returns the second arg if so, otherwise returns
10305 the third arg if it is present. */
10307 static const char *
10308 if_exists_then_else_spec_function (int argc, const char **argv)
10311 /* Must have two or three arguments. */
10312 if (argc != 2 && argc != 3)
10313 return NULL;
10315 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10316 return argv[1];
10318 if (argc == 3)
10319 return argv[2];
10321 return NULL;
10324 /* sanitize built-in spec function.
10326 This returns non-NULL, if sanitizing address, thread or
10327 any of the undefined behavior sanitizers. */
10329 static const char *
10330 sanitize_spec_function (int argc, const char **argv)
10332 if (argc != 1)
10333 return NULL;
10335 if (strcmp (argv[0], "address") == 0)
10336 return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
10337 if (strcmp (argv[0], "hwaddress") == 0)
10338 return (flag_sanitize & SANITIZE_USER_HWADDRESS) ? "" : NULL;
10339 if (strcmp (argv[0], "kernel-address") == 0)
10340 return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
10341 if (strcmp (argv[0], "kernel-hwaddress") == 0)
10342 return (flag_sanitize & SANITIZE_KERNEL_HWADDRESS) ? "" : NULL;
10343 if (strcmp (argv[0], "thread") == 0)
10344 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
10345 if (strcmp (argv[0], "undefined") == 0)
10346 return ((flag_sanitize
10347 & ~flag_sanitize_trap
10348 & (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)))
10349 ? "" : NULL;
10350 if (strcmp (argv[0], "leak") == 0)
10351 return ((flag_sanitize
10352 & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
10353 == SANITIZE_LEAK) ? "" : NULL;
10354 return NULL;
10357 /* replace-outfile built-in spec function.
10359 This looks for the first argument in the outfiles array's name and
10360 replaces it with the second argument. */
10362 static const char *
10363 replace_outfile_spec_function (int argc, const char **argv)
10365 int i;
10366 /* Must have exactly two arguments. */
10367 if (argc != 2)
10368 abort ();
10370 for (i = 0; i < n_infiles; i++)
10372 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
10373 outfiles[i] = xstrdup (argv[1]);
10375 return NULL;
10378 /* remove-outfile built-in spec function.
10380 * This looks for the first argument in the outfiles array's name and
10381 * removes it. */
10383 static const char *
10384 remove_outfile_spec_function (int argc, const char **argv)
10386 int i;
10387 /* Must have exactly one argument. */
10388 if (argc != 1)
10389 abort ();
10391 for (i = 0; i < n_infiles; i++)
10393 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
10394 outfiles[i] = NULL;
10396 return NULL;
10399 /* Given two version numbers, compares the two numbers.
10400 A version number must match the regular expression
10401 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
10403 static int
10404 compare_version_strings (const char *v1, const char *v2)
10406 int rresult;
10407 regex_t r;
10409 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
10410 REG_EXTENDED | REG_NOSUB) != 0)
10411 abort ();
10412 rresult = regexec (&r, v1, 0, NULL, 0);
10413 if (rresult == REG_NOMATCH)
10414 fatal_error (input_location, "invalid version number %qs", v1);
10415 else if (rresult != 0)
10416 abort ();
10417 rresult = regexec (&r, v2, 0, NULL, 0);
10418 if (rresult == REG_NOMATCH)
10419 fatal_error (input_location, "invalid version number %qs", v2);
10420 else if (rresult != 0)
10421 abort ();
10423 return strverscmp (v1, v2);
10427 /* version_compare built-in spec function.
10429 This takes an argument of the following form:
10431 <comparison-op> <arg1> [<arg2>] <switch> <result>
10433 and produces "result" if the comparison evaluates to true,
10434 and nothing if it doesn't.
10436 The supported <comparison-op> values are:
10438 >= true if switch is a later (or same) version than arg1
10439 !> opposite of >=
10440 < true if switch is an earlier version than arg1
10441 !< opposite of <
10442 >< true if switch is arg1 or later, and earlier than arg2
10443 <> true if switch is earlier than arg1 or is arg2 or later
10445 If the switch is not present, the condition is false unless
10446 the first character of the <comparison-op> is '!'.
10448 For example,
10449 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
10450 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
10452 static const char *
10453 version_compare_spec_function (int argc, const char **argv)
10455 int comp1, comp2;
10456 size_t switch_len;
10457 const char *switch_value = NULL;
10458 int nargs = 1, i;
10459 bool result;
10461 if (argc < 3)
10462 fatal_error (input_location, "too few arguments to %%:version-compare");
10463 if (argv[0][0] == '\0')
10464 abort ();
10465 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
10466 nargs = 2;
10467 if (argc != nargs + 3)
10468 fatal_error (input_location, "too many arguments to %%:version-compare");
10470 switch_len = strlen (argv[nargs + 1]);
10471 for (i = 0; i < n_switches; i++)
10472 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
10473 && check_live_switch (i, switch_len))
10474 switch_value = switches[i].part1 + switch_len;
10476 if (switch_value == NULL)
10477 comp1 = comp2 = -1;
10478 else
10480 comp1 = compare_version_strings (switch_value, argv[1]);
10481 if (nargs == 2)
10482 comp2 = compare_version_strings (switch_value, argv[2]);
10483 else
10484 comp2 = -1; /* This value unused. */
10487 switch (argv[0][0] << 8 | argv[0][1])
10489 case '>' << 8 | '=':
10490 result = comp1 >= 0;
10491 break;
10492 case '!' << 8 | '<':
10493 result = comp1 >= 0 || switch_value == NULL;
10494 break;
10495 case '<' << 8:
10496 result = comp1 < 0;
10497 break;
10498 case '!' << 8 | '>':
10499 result = comp1 < 0 || switch_value == NULL;
10500 break;
10501 case '>' << 8 | '<':
10502 result = comp1 >= 0 && comp2 < 0;
10503 break;
10504 case '<' << 8 | '>':
10505 result = comp1 < 0 || comp2 >= 0;
10506 break;
10508 default:
10509 fatal_error (input_location,
10510 "unknown operator %qs in %%:version-compare", argv[0]);
10512 if (! result)
10513 return NULL;
10515 return argv[nargs + 2];
10518 /* %:include builtin spec function. This differs from %include in that it
10519 can be nested inside a spec, and thus be conditionalized. It takes
10520 one argument, the filename, and looks for it in the startfile path.
10521 The result is always NULL, i.e. an empty expansion. */
10523 static const char *
10524 include_spec_function (int argc, const char **argv)
10526 char *file;
10528 if (argc != 1)
10529 abort ();
10531 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
10532 read_specs (file ? file : argv[0], false, false);
10534 return NULL;
10537 /* %:find-file spec function. This function replaces its argument by
10538 the file found through find_file, that is the -print-file-name gcc
10539 program option. */
10540 static const char *
10541 find_file_spec_function (int argc, const char **argv)
10543 const char *file;
10545 if (argc != 1)
10546 abort ();
10548 file = find_file (argv[0]);
10549 return file;
10553 /* %:find-plugindir spec function. This function replaces its argument
10554 by the -iplugindir=<dir> option. `dir' is found through find_file, that
10555 is the -print-file-name gcc program option. */
10556 static const char *
10557 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
10559 const char *option;
10561 if (argc != 0)
10562 abort ();
10564 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
10565 return option;
10569 /* %:print-asm-header spec function. Print a banner to say that the
10570 following output is from the assembler. */
10572 static const char *
10573 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
10574 const char **argv ATTRIBUTE_UNUSED)
10576 printf (_("Assembler options\n=================\n\n"));
10577 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
10578 fflush (stdout);
10579 return NULL;
10582 /* Get a random number for -frandom-seed */
10584 static unsigned HOST_WIDE_INT
10585 get_random_number (void)
10587 unsigned HOST_WIDE_INT ret = 0;
10588 int fd;
10590 fd = open ("/dev/urandom", O_RDONLY);
10591 if (fd >= 0)
10593 read (fd, &ret, sizeof (HOST_WIDE_INT));
10594 close (fd);
10595 if (ret)
10596 return ret;
10599 /* Get some more or less random data. */
10600 #ifdef HAVE_GETTIMEOFDAY
10602 struct timeval tv;
10604 gettimeofday (&tv, NULL);
10605 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
10607 #else
10609 time_t now = time (NULL);
10611 if (now != (time_t)-1)
10612 ret = (unsigned) now;
10614 #endif
10616 return ret ^ getpid ();
10619 /* %:compare-debug-dump-opt spec function. Save the last argument,
10620 expected to be the last -fdump-final-insns option, or generate a
10621 temporary. */
10623 static const char *
10624 compare_debug_dump_opt_spec_function (int arg,
10625 const char **argv ATTRIBUTE_UNUSED)
10627 char *ret;
10628 char *name;
10629 int which;
10630 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
10632 if (arg != 0)
10633 fatal_error (input_location,
10634 "too many arguments to %%:compare-debug-dump-opt");
10636 do_spec_2 ("%{fdump-final-insns=*:%*}", NULL);
10637 do_spec_1 (" ", 0, NULL);
10639 if (argbuf.length () > 0
10640 && strcmp (argv[argbuf.length () - 1], ".") != 0)
10642 if (!compare_debug)
10643 return NULL;
10645 name = xstrdup (argv[argbuf.length () - 1]);
10646 ret = NULL;
10648 else
10650 if (argbuf.length () > 0)
10651 do_spec_2 ("%B.gkd", NULL);
10652 else if (!compare_debug)
10653 return NULL;
10654 else
10655 do_spec_2 ("%{!save-temps*:%g.gkd}%{save-temps*:%B.gkd}", NULL);
10657 do_spec_1 (" ", 0, NULL);
10659 gcc_assert (argbuf.length () > 0);
10661 name = xstrdup (argbuf.last ());
10663 char *arg = quote_spec (xstrdup (name));
10664 ret = concat ("-fdump-final-insns=", arg, NULL);
10665 free (arg);
10668 which = compare_debug < 0;
10669 debug_check_temp_file[which] = name;
10671 if (!which)
10673 unsigned HOST_WIDE_INT value = get_random_number ();
10675 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
10678 if (*random_seed)
10680 char *tmp = ret;
10681 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
10682 ret, NULL);
10683 free (tmp);
10686 if (which)
10687 *random_seed = 0;
10689 return ret;
10692 /* %:compare-debug-self-opt spec function. Expands to the options
10693 that are to be passed in the second compilation of
10694 compare-debug. */
10696 static const char *
10697 compare_debug_self_opt_spec_function (int arg,
10698 const char **argv ATTRIBUTE_UNUSED)
10700 if (arg != 0)
10701 fatal_error (input_location,
10702 "too many arguments to %%:compare-debug-self-opt");
10704 if (compare_debug >= 0)
10705 return NULL;
10707 return concat ("\
10708 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
10709 %<fdump-final-insns=* -w -S -o %j \
10710 %{!fcompare-debug-second:-fcompare-debug-second} \
10711 ", compare_debug_opt, NULL);
10714 /* %:pass-through-libs spec function. Finds all -l options and input
10715 file names in the lib spec passed to it, and makes a list of them
10716 prepended with the plugin option to cause them to be passed through
10717 to the final link after all the new object files have been added. */
10719 const char *
10720 pass_through_libs_spec_func (int argc, const char **argv)
10722 char *prepended = xstrdup (" ");
10723 int n;
10724 /* Shlemiel the painter's algorithm. Innately horrible, but at least
10725 we know that there will never be more than a handful of strings to
10726 concat, and it's only once per run, so it's not worth optimising. */
10727 for (n = 0; n < argc; n++)
10729 char *old = prepended;
10730 /* Anything that isn't an option is a full path to an output
10731 file; pass it through if it ends in '.a'. Among options,
10732 pass only -l. */
10733 if (argv[n][0] == '-' && argv[n][1] == 'l')
10735 const char *lopt = argv[n] + 2;
10736 /* Handle both joined and non-joined -l options. If for any
10737 reason there's a trailing -l with no joined or following
10738 arg just discard it. */
10739 if (!*lopt && ++n >= argc)
10740 break;
10741 else if (!*lopt)
10742 lopt = argv[n];
10743 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
10744 lopt, " ", NULL);
10746 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
10748 prepended = concat (prepended, "-plugin-opt=-pass-through=",
10749 argv[n], " ", NULL);
10751 if (prepended != old)
10752 free (old);
10754 return prepended;
10757 static bool
10758 not_actual_file_p (const char *name)
10760 return (strcmp (name, "-") == 0
10761 || strcmp (name, HOST_BIT_BUCKET) == 0);
10764 /* %:dumps spec function. Take an optional argument that overrides
10765 the default extension for -dumpbase and -dumpbase-ext.
10766 Return -dumpdir, -dumpbase and -dumpbase-ext, if needed. */
10767 const char *
10768 dumps_spec_func (int argc, const char **argv ATTRIBUTE_UNUSED)
10770 const char *ext = dumpbase_ext;
10771 char *p;
10773 char *args[3] = { NULL, NULL, NULL };
10774 int nargs = 0;
10776 /* Do not compute a default for -dumpbase-ext when -dumpbase was
10777 given explicitly. */
10778 if (dumpbase && *dumpbase && !ext)
10779 ext = "";
10781 if (argc == 1)
10783 /* Do not override the explicitly-specified -dumpbase-ext with
10784 the specs-provided overrider. */
10785 if (!ext)
10786 ext = argv[0];
10788 else if (argc != 0)
10789 fatal_error (input_location, "too many arguments for %%:dumps");
10791 if (dumpdir)
10793 p = quote_spec_arg (xstrdup (dumpdir));
10794 args[nargs++] = concat (" -dumpdir ", p, NULL);
10795 free (p);
10798 if (!ext)
10799 ext = input_basename + basename_length;
10801 /* Use the precomputed outbase, or compute dumpbase from
10802 input_basename, just like %b would. */
10803 char *base;
10805 if (dumpbase && *dumpbase)
10807 base = xstrdup (dumpbase);
10808 p = base + outbase_length;
10809 gcc_checking_assert (strncmp (base, outbase, outbase_length) == 0);
10810 gcc_checking_assert (strcmp (p, ext) == 0);
10812 else if (outbase_length)
10814 base = xstrndup (outbase, outbase_length);
10815 p = NULL;
10817 else
10819 base = xstrndup (input_basename, suffixed_basename_length);
10820 p = base + basename_length;
10823 if (compare_debug < 0 || !p || strcmp (p, ext) != 0)
10825 if (p)
10826 *p = '\0';
10828 const char *gk;
10829 if (compare_debug < 0)
10830 gk = ".gk";
10831 else
10832 gk = "";
10834 p = concat (base, gk, ext, NULL);
10836 free (base);
10837 base = p;
10840 base = quote_spec_arg (base);
10841 args[nargs++] = concat (" -dumpbase ", base, NULL);
10842 free (base);
10844 if (*ext)
10846 p = quote_spec_arg (xstrdup (ext));
10847 args[nargs++] = concat (" -dumpbase-ext ", p, NULL);
10848 free (p);
10851 const char *ret = concat (args[0], args[1], args[2], NULL);
10852 while (nargs > 0)
10853 free (args[--nargs]);
10855 return ret;
10858 /* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
10859 Otherwise, return NULL. */
10861 static const char *
10862 greater_than_spec_func (int argc, const char **argv)
10864 char *converted;
10866 if (argc == 1)
10867 return NULL;
10869 gcc_assert (argc >= 2);
10871 long arg = strtol (argv[argc - 2], &converted, 10);
10872 gcc_assert (converted != argv[argc - 2]);
10874 long lim = strtol (argv[argc - 1], &converted, 10);
10875 gcc_assert (converted != argv[argc - 1]);
10877 if (arg > lim)
10878 return "";
10880 return NULL;
10883 /* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
10884 Otherwise, return NULL. */
10886 static const char *
10887 debug_level_greater_than_spec_func (int argc, const char **argv)
10889 char *converted;
10891 if (argc != 1)
10892 fatal_error (input_location,
10893 "wrong number of arguments to %%:debug-level-gt");
10895 long arg = strtol (argv[0], &converted, 10);
10896 gcc_assert (converted != argv[0]);
10898 if (debug_info_level > arg)
10899 return "";
10901 return NULL;
10904 /* Returns "" if dwarf_version is greater than ARGV[ARGC-1].
10905 Otherwise, return NULL. */
10907 static const char *
10908 dwarf_version_greater_than_spec_func (int argc, const char **argv)
10910 char *converted;
10912 if (argc != 1)
10913 fatal_error (input_location,
10914 "wrong number of arguments to %%:dwarf-version-gt");
10916 long arg = strtol (argv[0], &converted, 10);
10917 gcc_assert (converted != argv[0]);
10919 if (dwarf_version > arg)
10920 return "";
10922 return NULL;
10925 static void
10926 path_prefix_reset (path_prefix *prefix)
10928 struct prefix_list *iter, *next;
10929 iter = prefix->plist;
10930 while (iter)
10932 next = iter->next;
10933 free (const_cast <char *> (iter->prefix));
10934 XDELETE (iter);
10935 iter = next;
10937 prefix->plist = 0;
10938 prefix->max_len = 0;
10941 /* The function takes 3 arguments: OPTION name, file name and location
10942 where we search for Fortran modules.
10943 When the FILE is found by find_file, return OPTION=path_to_file. */
10945 static const char *
10946 find_fortran_preinclude_file (int argc, const char **argv)
10948 char *result = NULL;
10949 if (argc != 3)
10950 return NULL;
10952 struct path_prefix prefixes = { 0, 0, "preinclude" };
10954 /* Search first for 'finclude' folder location for a header file
10955 installed by the compiler (similar to omp_lib.h). */
10956 add_prefix (&prefixes, argv[2], NULL, 0, 0, 0);
10957 #ifdef TOOL_INCLUDE_DIR
10958 /* Then search: <prefix>/<target>/<include>/finclude */
10959 add_prefix (&prefixes, TOOL_INCLUDE_DIR "/finclude/",
10960 NULL, 0, 0, 0);
10961 #endif
10962 #ifdef NATIVE_SYSTEM_HEADER_DIR
10963 /* Then search: <sysroot>/usr/include/finclude/<multilib> */
10964 add_sysrooted_hdrs_prefix (&prefixes, NATIVE_SYSTEM_HEADER_DIR "/finclude/",
10965 NULL, 0, 0, 0);
10966 #endif
10968 const char *path = find_a_file (&include_prefixes, argv[1], R_OK, false);
10969 if (path != NULL)
10970 result = concat (argv[0], path, NULL);
10971 else
10973 path = find_a_file (&prefixes, argv[1], R_OK, false);
10974 if (path != NULL)
10975 result = concat (argv[0], path, NULL);
10978 path_prefix_reset (&prefixes);
10979 return result;
10982 /* The function takes any number of arguments and joins them together.
10984 This seems to be necessary to build "-fjoined=foo.b" from "-fseparate foo.a"
10985 with a %{fseparate*:-fjoined=%.b$*} rule without adding undesired spaces:
10986 when doing $* replacement we first replace $* with the rest of the switch
10987 (in this case ""), and then add any arguments as arguments after the result,
10988 resulting in "-fjoined= foo.b". Using this function with e.g.
10989 %{fseparate*:-fjoined=%:join(%.b$*)} gets multiple words as separate argv
10990 elements instead of separated by spaces, and we paste them together. */
10992 static const char *
10993 join_spec_func (int argc, const char **argv)
10995 if (argc == 1)
10996 return argv[0];
10997 for (int i = 0; i < argc; ++i)
10998 obstack_grow (&obstack, argv[i], strlen (argv[i]));
10999 obstack_1grow (&obstack, '\0');
11000 return XOBFINISH (&obstack, const char *);
11003 /* If any character in ORIG fits QUOTE_P (_, P), reallocate the string
11004 so as to precede every one of them with a backslash. Return the
11005 original string or the reallocated one. */
11007 static inline char *
11008 quote_string (char *orig, bool (*quote_p)(char, void *), void *p)
11010 int len, number_of_space = 0;
11012 for (len = 0; orig[len]; len++)
11013 if (quote_p (orig[len], p))
11014 number_of_space++;
11016 if (number_of_space)
11018 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
11019 int j, k;
11020 for (j = 0, k = 0; j <= len; j++, k++)
11022 if (quote_p (orig[j], p))
11023 new_spec[k++] = '\\';
11024 new_spec[k] = orig[j];
11026 free (orig);
11027 return new_spec;
11029 else
11030 return orig;
11033 /* Return true iff C is any of the characters convert_white_space
11034 should quote. */
11036 static inline bool
11037 whitespace_to_convert_p (char c, void *)
11039 return (c == ' ' || c == '\t');
11042 /* Insert backslash before spaces in ORIG (usually a file path), to
11043 avoid being broken by spec parser.
11045 This function is needed as do_spec_1 treats white space (' ' and '\t')
11046 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
11047 the file name should be treated as a single argument rather than being
11048 broken into multiple. Solution is to insert '\\' before the space in a
11049 file name.
11051 This function converts and only converts all occurrence of ' '
11052 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
11053 "a b" -> "a\\ b"
11054 "a b" -> "a\\ \\ b"
11055 "a\tb" -> "a\\\tb"
11056 "a\\ b" -> "a\\\\ b"
11058 orig: input null-terminating string that was allocated by xalloc. The
11059 memory it points to might be freed in this function. Behavior undefined
11060 if ORIG wasn't xalloced or was freed already at entry.
11062 Return: ORIG if no conversion needed. Otherwise a newly allocated string
11063 that was converted from ORIG. */
11065 static char *
11066 convert_white_space (char *orig)
11068 return quote_string (orig, whitespace_to_convert_p, NULL);
11071 /* Return true iff C matches any of the spec active characters. */
11072 static inline bool
11073 quote_spec_char_p (char c, void *)
11075 switch (c)
11077 case ' ':
11078 case '\t':
11079 case '\n':
11080 case '|':
11081 case '%':
11082 case '\\':
11083 return true;
11085 default:
11086 return false;
11090 /* Like convert_white_space, but deactivate all active spec chars by
11091 quoting them. */
11093 static inline char *
11094 quote_spec (char *orig)
11096 return quote_string (orig, quote_spec_char_p, NULL);
11099 /* Like quote_spec, but also turn an empty string into the spec for an
11100 empty argument. */
11102 static inline char *
11103 quote_spec_arg (char *orig)
11105 if (!*orig)
11107 free (orig);
11108 return xstrdup ("%\"");
11111 return quote_spec (orig);
11114 /* Restore all state within gcc.cc to the initial state, so that the driver
11115 code can be safely re-run in-process.
11117 Many const char * variables are referenced by static specs (see
11118 INIT_STATIC_SPEC above). These variables are restored to their default
11119 values by a simple loop over the static specs.
11121 For other variables, we directly restore them all to their initial
11122 values (often implicitly 0).
11124 Free the various obstacks in this file, along with "opts_obstack"
11125 from opts.cc.
11127 This function also restores any environment variables that were changed. */
11129 void
11130 driver::finalize ()
11132 env.restore ();
11133 diagnostic_finish (global_dc);
11135 is_cpp_driver = 0;
11136 at_file_supplied = 0;
11137 print_help_list = 0;
11138 print_version = 0;
11139 verbose_only_flag = 0;
11140 print_subprocess_help = 0;
11141 use_ld = NULL;
11142 report_times_to_file = NULL;
11143 target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
11144 target_system_root_changed = 0;
11145 target_sysroot_suffix = 0;
11146 target_sysroot_hdrs_suffix = 0;
11147 save_temps_flag = SAVE_TEMPS_NONE;
11148 save_temps_overrides_dumpdir = false;
11149 dumpdir_trailing_dash_added = false;
11150 free (dumpdir);
11151 free (dumpbase);
11152 free (dumpbase_ext);
11153 free (outbase);
11154 dumpdir = dumpbase = dumpbase_ext = outbase = NULL;
11155 dumpdir_length = outbase_length = 0;
11156 spec_machine = DEFAULT_TARGET_MACHINE;
11157 greatest_status = 1;
11159 obstack_free (&obstack, NULL);
11160 obstack_free (&opts_obstack, NULL); /* in opts.cc */
11161 obstack_free (&collect_obstack, NULL);
11163 link_command_spec = LINK_COMMAND_SPEC;
11165 obstack_free (&multilib_obstack, NULL);
11167 user_specs_head = NULL;
11168 user_specs_tail = NULL;
11170 /* Within the "compilers" vec, the fields "suffix" and "spec" were
11171 statically allocated for the default compilers, but dynamically
11172 allocated for additional compilers. Delete them for the latter. */
11173 for (int i = n_default_compilers; i < n_compilers; i++)
11175 free (const_cast <char *> (compilers[i].suffix));
11176 free (const_cast <char *> (compilers[i].spec));
11178 XDELETEVEC (compilers);
11179 compilers = NULL;
11180 n_compilers = 0;
11182 linker_options.truncate (0);
11183 assembler_options.truncate (0);
11184 preprocessor_options.truncate (0);
11186 path_prefix_reset (&exec_prefixes);
11187 path_prefix_reset (&startfile_prefixes);
11188 path_prefix_reset (&include_prefixes);
11190 machine_suffix = 0;
11191 just_machine_suffix = 0;
11192 gcc_exec_prefix = 0;
11193 gcc_libexec_prefix = 0;
11194 set_static_spec_shared (&md_exec_prefix, MD_EXEC_PREFIX);
11195 set_static_spec_shared (&md_startfile_prefix, MD_STARTFILE_PREFIX);
11196 set_static_spec_shared (&md_startfile_prefix_1, MD_STARTFILE_PREFIX_1);
11197 multilib_dir = 0;
11198 multilib_os_dir = 0;
11199 multiarch_dir = 0;
11201 /* Free any specs dynamically-allocated by set_spec.
11202 These will be at the head of the list, before the
11203 statically-allocated ones. */
11204 if (specs)
11206 while (specs != static_specs)
11208 spec_list *next = specs->next;
11209 free (const_cast <char *> (specs->name));
11210 XDELETE (specs);
11211 specs = next;
11213 specs = 0;
11215 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
11217 spec_list *sl = &static_specs[i];
11218 if (sl->alloc_p)
11220 free (const_cast <char *> (*(sl->ptr_spec)));
11221 sl->alloc_p = false;
11223 *(sl->ptr_spec) = sl->default_ptr;
11225 #ifdef EXTRA_SPECS
11226 extra_specs = NULL;
11227 #endif
11229 processing_spec_function = 0;
11231 clear_args ();
11233 have_c = 0;
11234 have_o = 0;
11236 temp_names = NULL;
11237 execution_count = 0;
11238 signal_count = 0;
11240 temp_filename = NULL;
11241 temp_filename_length = 0;
11242 always_delete_queue = NULL;
11243 failure_delete_queue = NULL;
11245 XDELETEVEC (switches);
11246 switches = NULL;
11247 n_switches = 0;
11248 n_switches_alloc = 0;
11250 compare_debug = 0;
11251 compare_debug_second = 0;
11252 compare_debug_opt = NULL;
11253 for (int i = 0; i < 2; i++)
11255 switches_debug_check[i] = NULL;
11256 n_switches_debug_check[i] = 0;
11257 n_switches_alloc_debug_check[i] = 0;
11258 debug_check_temp_file[i] = NULL;
11261 XDELETEVEC (infiles);
11262 infiles = NULL;
11263 n_infiles = 0;
11264 n_infiles_alloc = 0;
11266 combine_inputs = false;
11267 added_libraries = 0;
11268 XDELETEVEC (outfiles);
11269 outfiles = NULL;
11270 spec_lang = 0;
11271 last_language_n_infiles = 0;
11272 gcc_input_filename = NULL;
11273 input_file_number = 0;
11274 input_filename_length = 0;
11275 basename_length = 0;
11276 suffixed_basename_length = 0;
11277 input_basename = NULL;
11278 input_suffix = NULL;
11279 /* We don't need to purge "input_stat", just to unset "input_stat_set". */
11280 input_stat_set = 0;
11281 input_file_compiler = NULL;
11282 arg_going = 0;
11283 delete_this_arg = 0;
11284 this_is_output_file = 0;
11285 this_is_library_file = 0;
11286 this_is_linker_script = 0;
11287 input_from_pipe = 0;
11288 suffix_subst = NULL;
11290 mdswitches = NULL;
11291 n_mdswitches = 0;
11293 used_arg.finalize ();
11296 /* PR jit/64810.
11297 Targets can provide configure-time default options in
11298 OPTION_DEFAULT_SPECS. The jit needs to access these, but
11299 they are expressed in the spec language.
11301 Run just enough of the driver to be able to expand these
11302 specs, and then call the callback CB on each
11303 such option. The options strings are *without* a leading
11304 '-' character e.g. ("march=x86-64"). Finally, clean up. */
11306 void
11307 driver_get_configure_time_options (void (*cb) (const char *option,
11308 void *user_data),
11309 void *user_data)
11311 size_t i;
11313 obstack_init (&obstack);
11314 init_opts_obstack ();
11315 n_switches = 0;
11317 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
11318 do_option_spec (option_default_specs[i].name,
11319 option_default_specs[i].spec);
11321 for (i = 0; (int) i < n_switches; i++)
11323 gcc_assert (switches[i].part1);
11324 (*cb) (switches[i].part1, user_data);
11327 obstack_free (&opts_obstack, NULL);
11328 obstack_free (&obstack, NULL);
11329 n_switches = 0;