Hackfix and re-enable strtoull and wcstoull, see bug #3798.
[sdcc.git] / sdcc / support / cpp / gcc / gcc.cc
blob10645de2e7ec359e2cf6b203da7b2e0ff73309f6
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2022 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
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". */
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"
48 #define untested() { fprintf (stderr, "@@#\n@@@:%s:%d:%s\n", __FILE__, __LINE__, __func__); }
50 // sdcpp
51 extern bool flag_wpa;
52 bool flag_wpa;
54 /* Manage the manipulation of env vars.
56 We poison "getenv" and "putenv", so that all enviroment-handling is
57 done through this class. Note that poisoning happens in the
58 preprocessor at the identifier level, and doesn't distinguish between
59 env.getenv ();
60 and
61 getenv ();
62 Hence we need to use "get" for the accessor method, not "getenv". */
64 struct env_manager
66 public:
67 void init (bool can_restore, bool debug);
68 const char *get (const char *name);
69 void xput (const char *string);
70 void restore ();
72 private:
73 bool m_can_restore;
74 bool m_debug;
75 struct kv
77 char *m_key;
78 char *m_value;
80 vec<kv> m_keys;
84 /* The singleton instance of class env_manager. */
86 static env_manager env;
88 /* Initializer for class env_manager.
90 We can't do this as a constructor since we have a statically
91 allocated instance ("env" above). */
93 void
94 env_manager::init (bool can_restore, bool debug)
96 m_can_restore = can_restore;
97 m_debug = debug;
100 /* Get the value of NAME within the environment. Essentially
101 a wrapper for ::getenv, but adding logging, and the possibility
102 of caching results. */
104 const char *
105 env_manager::get (const char *name)
107 const char *result = ::getenv (name);
108 if (m_debug)
109 fprintf (stderr, "env_manager::getenv (%s) -> %s\n", name, result);
110 return result;
113 /* Put the given KEY=VALUE entry STRING into the environment.
114 If the env_manager was initialized with CAN_RESTORE set, then
115 also record the old value of KEY within the environment, so that it
116 can be later restored. */
118 void
119 env_manager::xput (const char *string)
121 if (m_debug)
122 fprintf (stderr, "env_manager::xput (%s)\n", string);
123 if (verbose_flag)
124 fnotice (stderr, "%s\n", string);
126 if (m_can_restore)
128 char *equals = strchr (const_cast <char *> (string), '=');
129 gcc_assert (equals);
131 struct kv kv;
132 kv.m_key = xstrndup (string, equals - string);
133 const char *cur_value = ::getenv (kv.m_key);
134 if (m_debug)
135 fprintf (stderr, "saving old value: %s\n",cur_value);
136 kv.m_value = cur_value ? xstrdup (cur_value) : NULL;
137 m_keys.safe_push (kv);
140 ::putenv (CONST_CAST (char *, string));
143 /* Undo any xputenv changes made since last restore.
144 Can only be called if the env_manager was initialized with
145 CAN_RESTORE enabled. */
147 void
148 env_manager::restore ()
150 unsigned int i;
151 struct kv *item;
153 gcc_assert (m_can_restore);
155 FOR_EACH_VEC_ELT_REVERSE (m_keys, i, item)
157 if (m_debug)
158 printf ("restoring saved key: %s value: %s\n", item->m_key, item->m_value);
159 if (item->m_value)
160 ::setenv (item->m_key, item->m_value, 1);
161 else
162 ::unsetenv (item->m_key);
163 free (item->m_key);
164 free (item->m_value);
167 m_keys.truncate (0);
170 /* Forbid other uses of getenv and putenv. */
171 #if (GCC_VERSION >= 3000)
172 #pragma GCC poison getenv putenv
173 #endif
175 /* By default there is no special suffix for target executables. */
176 #ifdef TARGET_EXECUTABLE_SUFFIX
177 #define HAVE_TARGET_EXECUTABLE_SUFFIX
178 #else
179 #define TARGET_EXECUTABLE_SUFFIX ""
180 #endif
182 /* By default there is no special suffix for host executables. */
183 #ifdef HOST_EXECUTABLE_SUFFIX
184 #define HAVE_HOST_EXECUTABLE_SUFFIX
185 #else
186 #define HOST_EXECUTABLE_SUFFIX ""
187 #endif
189 /* By default, the suffix for target object files is ".o". */
190 #ifdef TARGET_OBJECT_SUFFIX
191 #define HAVE_TARGET_OBJECT_SUFFIX
192 #else
193 #define TARGET_OBJECT_SUFFIX ".o"
194 #endif
196 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
198 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
199 #ifndef LIBRARY_PATH_ENV
200 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
201 #endif
203 /* If a stage of compilation returns an exit status >= 1,
204 compilation of that file ceases. */
206 #define MIN_FATAL_STATUS 1
208 /* Flag set by cppspec.cc to 1. */
209 int is_cpp_driver;
211 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
212 static bool at_file_supplied;
214 /* Definition of string containing the arguments given to configure. */
215 #include "configargs.h"
217 /* Flag saying to print the command line options understood by gcc and its
218 sub-processes. */
220 static int print_help_list;
222 /* Flag saying to print the version of gcc and its sub-processes. */
224 static int print_version;
226 /* Flag that stores string prefix for which we provide bash completion. */
228 static const char *completion = NULL;
230 /* Flag indicating whether we should ONLY print the command and
231 arguments (like verbose_flag) without executing the command.
232 Displayed arguments are quoted so that the generated command
233 line is suitable for execution. This is intended for use in
234 shell scripts to capture the driver-generated command line. */
235 static int verbose_only_flag;
237 /* Flag indicating how to print command line options of sub-processes. */
239 static int print_subprocess_help;
241 /* Linker suffix passed to -fuse-ld=... */
242 static const char *use_ld;
244 /* Whether we should report subprocess execution times to a file. */
246 FILE *report_times_to_file = NULL;
248 /* Nonzero means place this string before uses of /, so that include
249 and library files can be found in an alternate location. */
251 #ifdef TARGET_SYSTEM_ROOT
252 #define DEFAULT_TARGET_SYSTEM_ROOT (TARGET_SYSTEM_ROOT)
253 #else
254 #define DEFAULT_TARGET_SYSTEM_ROOT (0)
255 #endif
256 static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
258 /* Nonzero means pass the updated target_system_root to the compiler. */
260 static int target_system_root_changed;
262 /* Nonzero means append this string to target_system_root. */
264 static const char *target_sysroot_suffix = 0;
266 /* Nonzero means append this string to target_system_root for headers. */
268 static const char *target_sysroot_hdrs_suffix = 0;
270 /* Nonzero means write "temp" files in source directory
271 and use the source file's name in them, and don't delete them. */
273 static enum save_temps {
274 SAVE_TEMPS_NONE, /* no -save-temps */
275 SAVE_TEMPS_CWD, /* -save-temps in current directory */
276 SAVE_TEMPS_DUMP, /* -save-temps in dumpdir */
277 SAVE_TEMPS_OBJ /* -save-temps in object directory */
278 } save_temps_flag;
280 /* Set this iff the dumppfx implied by a -save-temps=* option is to
281 override a -dumpdir option, if any. */
282 static bool save_temps_overrides_dumpdir = false;
284 /* -dumpdir, -dumpbase and -dumpbase-ext flags passed in, possibly
285 rearranged as they are to be passed down, e.g., dumpbase and
286 dumpbase_ext may be cleared if integrated with dumpdir or
287 dropped. */
288 static char *dumpdir, *dumpbase, *dumpbase_ext;
290 /* Usually the length of the string in dumpdir. However, during
291 linking, it may be shortened to omit a driver-added trailing dash,
292 by then replaced with a trailing period, that is still to be passed
293 to sub-processes in -dumpdir, but not to be generally used in spec
294 filename expansions. See maybe_run_linker. */
295 static size_t dumpdir_length = 0;
297 /* Set if the last character in dumpdir is (or was) a dash that the
298 driver added to dumpdir after dumpbase or linker output name. */
299 static bool dumpdir_trailing_dash_added = false;
301 /* Basename of dump and aux outputs, computed from dumpbase (given or
302 derived from output name), to override input_basename in non-%w %b
303 et al. */
304 static char *outbase;
305 static size_t outbase_length = 0;
307 /* The compiler version. */
309 static const char *compiler_version;
311 /* The target version. */
313 static const char *const spec_version = DEFAULT_TARGET_VERSION;
315 /* The target machine. */
317 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
318 static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
320 /* List of offload targets. Separated by colon. Empty string for
321 -foffload=disable. */
323 static char *offload_targets = NULL;
325 #if OFFLOAD_DEFAULTED
326 /* Set to true if -foffload has not been used and offload_targets
327 is set to the configured in default. */
328 static bool offload_targets_default;
329 #endif
331 /* Nonzero if cross-compiling.
332 When -b is used, the value comes from the `specs' file. */
334 #ifdef CROSS_DIRECTORY_STRUCTURE
335 static const char *cross_compile = "1";
336 #else
337 static const char *cross_compile = "0";
338 #endif
340 /* Greatest exit code of sub-processes that has been encountered up to
341 now. */
342 static int greatest_status = 1;
344 /* This is the obstack which we use to allocate many strings. */
346 static struct obstack obstack;
348 /* This is the obstack to build an environment variable to pass to
349 collect2 that describes all of the relevant switches of what to
350 pass the compiler in building the list of pointers to constructors
351 and destructors. */
353 static struct obstack collect_obstack;
355 /* Forward declaration for prototypes. */
356 struct path_prefix;
357 struct prefix_list;
359 static void init_spec (void);
360 static void store_arg (const char *, int, int);
361 static void insert_wrapper (const char *);
362 static char *load_specs (const char *);
363 static void read_specs (const char *, bool, bool);
364 static void set_spec (const char *, const char *, bool);
365 static struct compiler *lookup_compiler (const char *, size_t, const char *);
366 static char *build_search_list (const struct path_prefix *, const char *,
367 bool, bool);
368 static void xputenv (const char *);
369 static void putenv_from_prefixes (const struct path_prefix *, const char *,
370 bool);
371 static int access_check (const char *, int);
372 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
373 static char *find_a_program (const char *);
374 static void add_prefix (struct path_prefix *, const char *, const char *,
375 int, int, int);
376 static void add_sysrooted_prefix (struct path_prefix *, const char *,
377 const char *, int, int, int);
378 static char *skip_whitespace (char *);
379 static void delete_if_ordinary (const char *);
380 static void delete_temp_files (void);
381 static void delete_failure_queue (void);
382 static void clear_failure_queue (void);
383 static int check_live_switch (int, int);
384 static const char *handle_braces (const char *);
385 static inline bool input_suffix_matches (const char *, const char *);
386 static inline bool switch_matches (const char *, const char *, int);
387 static inline void mark_matching_switches (const char *, const char *, int);
388 static inline void process_marked_switches (void);
389 static const char *process_brace_body (const char *, const char *, const char *, int, int);
390 static const struct spec_function *lookup_spec_function (const char *);
391 static const char *eval_spec_function (const char *, const char *, const char *);
392 static const char *handle_spec_function (const char *, bool *, const char *);
393 static char *save_string (const char *, int);
394 static void set_collect_gcc_options (void);
395 static int do_spec_1 (const char *, int, const char *);
396 static int do_spec_2 (const char *, const char *);
397 static void do_option_spec (const char *, const char *);
398 static void do_self_spec (const char *);
399 static const char *find_file (const char *);
400 static int is_directory (const char *, bool);
401 static const char *validate_switches (const char *, bool, bool);
402 static void validate_all_switches (void);
403 static inline void validate_switches_from_spec (const char *, bool);
404 static void give_switch (int, int);
405 static int default_arg (const char *, int);
406 static void set_multilib_dir (void);
407 static void print_multilib_info (void);
408 static void display_help (void);
409 static void add_preprocessor_option (const char *, int);
410 static void add_assembler_option (const char *, int);
411 static void add_linker_option (const char *, int);
412 static void process_command (unsigned int, struct cl_decoded_option *);
413 static int execute (void);
414 static void alloc_args (void);
415 static void clear_args (void);
416 static void fatal_signal (int);
417 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
418 static void init_gcc_specs (struct obstack *, const char *, const char *,
419 const char *);
420 #endif
421 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
422 static const char *convert_filename (const char *, int, int);
423 #endif
425 static void try_generate_repro (const char **argv);
426 static const char *getenv_spec_function (int, const char **);
427 static const char *if_exists_spec_function (int, const char **);
428 static const char *if_exists_else_spec_function (int, const char **);
429 static const char *if_exists_then_else_spec_function (int, const char **);
430 static const char *sanitize_spec_function (int, const char **);
431 static const char *replace_outfile_spec_function (int, const char **);
432 static const char *remove_outfile_spec_function (int, const char **);
433 static const char *version_compare_spec_function (int, const char **);
434 static const char *include_spec_function (int, const char **);
435 static const char *find_file_spec_function (int, const char **);
436 static const char *find_plugindir_spec_function (int, const char **);
437 static const char *print_asm_header_spec_function (int, const char **);
438 static const char *compare_debug_dump_opt_spec_function (int, const char **);
439 static const char *compare_debug_self_opt_spec_function (int, const char **);
440 static const char *pass_through_libs_spec_func (int, const char **);
441 static const char *dumps_spec_func (int, const char **);
442 static const char *greater_than_spec_func (int, const char **);
443 static const char *debug_level_greater_than_spec_func (int, const char **);
444 static const char *dwarf_version_greater_than_spec_func (int, const char **);
445 static const char *find_fortran_preinclude_file (int, const char **);
446 static char *convert_white_space (char *);
447 static char *quote_spec (char *);
448 static char *quote_spec_arg (char *);
449 static bool not_actual_file_p (const char *);
451 /* The Specs Language
453 Specs are strings containing lines, each of which (if not blank)
454 is made up of a program name, and arguments separated by spaces.
455 The program name must be exact and start from root, since no path
456 is searched and it is unreliable to depend on the current working directory.
457 Redirection of input or output is not supported; the subprograms must
458 accept filenames saying what files to read and write.
460 In addition, the specs can contain %-sequences to substitute variable text
461 or for conditional text. Here is a table of all defined %-sequences.
462 Note that spaces are not generated automatically around the results of
463 expanding these sequences; therefore, you can concatenate them together
464 or with constant text in a single argument.
466 %% substitute one % into the program name or argument.
467 %" substitute an empty argument.
468 %i substitute the name of the input file being processed.
469 %b substitute the basename for outputs related with the input file
470 being processed. This is often a substring of the input file name,
471 up to (and not including) the last period but, unless %w is active,
472 it is affected by the directory selected by -save-temps=*, by
473 -dumpdir, and, in case of multiple compilations, even by -dumpbase
474 and -dumpbase-ext and, in case of linking, by the linker output
475 name. When %w is active, it derives the main output name only from
476 the input file base name; when it is not, it names aux/dump output
477 file.
478 %B same as %b, but include the input file suffix (text after the last
479 period).
480 %gSUFFIX
481 substitute a file name that has suffix SUFFIX and is chosen
482 once per compilation, and mark the argument a la %d. To reduce
483 exposure to denial-of-service attacks, the file name is now
484 chosen in a way that is hard to predict even when previously
485 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
486 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
487 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
488 had been pre-processed. Previously, %g was simply substituted
489 with a file name chosen once per compilation, without regard
490 to any appended suffix (which was therefore treated just like
491 ordinary text), making such attacks more likely to succeed.
492 %|SUFFIX
493 like %g, but if -pipe is in effect, expands simply to "-".
494 %mSUFFIX
495 like %g, but if -pipe is in effect, expands to nothing. (We have both
496 %| and %m to accommodate differences between system assemblers; see
497 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
498 %uSUFFIX
499 like %g, but generates a new temporary file name even if %uSUFFIX
500 was already seen.
501 %USUFFIX
502 substitutes the last file name generated with %uSUFFIX, generating a
503 new one if there is no such last file name. In the absence of any
504 %uSUFFIX, this is just like %gSUFFIX, except they don't share
505 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
506 would involve the generation of two distinct file names, one
507 for each `%g.s' and another for each `%U.s'. Previously, %U was
508 simply substituted with a file name chosen for the previous %u,
509 without regard to any appended suffix.
510 %jSUFFIX
511 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
512 writable, and if save-temps is off; otherwise, substitute the name
513 of a temporary file, just like %u. This temporary file is not
514 meant for communication between processes, but rather as a junk
515 disposal mechanism.
516 %.SUFFIX
517 substitutes .SUFFIX for the suffixes of a matched switch's args when
518 it is subsequently output with %*. SUFFIX is terminated by the next
519 space or %.
520 %d marks the argument containing or following the %d as a
521 temporary file name, so that file will be deleted if GCC exits
522 successfully. Unlike %g, this contributes no text to the argument.
523 %w marks the argument containing or following the %w as the
524 "output file" of this compilation. This puts the argument
525 into the sequence of arguments that %o will substitute later.
526 %V indicates that this compilation produces no "output file".
527 %W{...}
528 like %{...} but marks the last argument supplied within as a file
529 to be deleted on failure.
530 %@{...}
531 like %{...} but puts the result into a FILE and substitutes @FILE
532 if an @file argument has been supplied.
533 %o substitutes the names of all the output files, with spaces
534 automatically placed around them. You should write spaces
535 around the %o as well or the results are undefined.
536 %o is for use in the specs for running the linker.
537 Input files whose names have no recognized suffix are not compiled
538 at all, but they are included among the output files, so they will
539 be linked.
540 %O substitutes the suffix for object files. Note that this is
541 handled specially when it immediately follows %g, %u, or %U
542 (with or without a suffix argument) because of the need for
543 those to form complete file names. The handling is such that
544 %O is treated exactly as if it had already been substituted,
545 except that %g, %u, and %U do not currently support additional
546 SUFFIX characters following %O as they would following, for
547 example, `.o'.
548 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
549 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
550 and -B options) and -imultilib as necessary.
551 %s current argument is the name of a library or startup file of some sort.
552 Search for that file in a standard list of directories
553 and substitute the full name found.
554 %T current argument is the name of a linker script.
555 Search for that file in the current list of directories to scan for
556 libraries. If the file is located, insert a --script option into the
557 command line followed by the full path name found. If the file is
558 not found then generate an error message.
559 Note: the current working directory is not searched.
560 %eSTR Print STR as an error message. STR is terminated by a newline.
561 Use this when inconsistent options are detected.
562 %nSTR Print STR as a notice. STR is terminated by a newline.
563 %x{OPTION} Accumulate an option for %X.
564 %X Output the accumulated linker options specified by compilations.
565 %Y Output the accumulated assembler options specified by compilations.
566 %Z Output the accumulated preprocessor options specified by compilations.
567 %a process ASM_SPEC as a spec.
568 This allows config.h to specify part of the spec for running as.
569 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
570 used here. This can be used to run a post-processor after the
571 assembler has done its job.
572 %D Dump out a -L option for each directory in startfile_prefixes.
573 If multilib_dir is set, extra entries are generated with it affixed.
574 %l process LINK_SPEC as a spec.
575 %L process LIB_SPEC as a spec.
576 %M Output multilib_os_dir.
577 %G process LIBGCC_SPEC as a spec.
578 %R Output the concatenation of target_system_root and
579 target_sysroot_suffix.
580 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
581 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
582 %C process CPP_SPEC as a spec.
583 %1 process CC1_SPEC as a spec.
584 %2 process CC1PLUS_SPEC as a spec.
585 %* substitute the variable part of a matched option. (See below.)
586 Note that each comma in the substituted string is replaced by
587 a single space. A space is appended after the last substition
588 unless there is more text in current sequence.
589 %<S remove all occurrences of -S from the command line.
590 Note - this command is position dependent. % commands in the
591 spec string before this one will see -S, % commands in the
592 spec string after this one will not.
593 %>S Similar to "%<S", but keep it in the GCC command line.
594 %<S* remove all occurrences of all switches beginning with -S from the
595 command line.
596 %:function(args)
597 Call the named function FUNCTION, passing it ARGS. ARGS is
598 first processed as a nested spec string, then split into an
599 argument vector in the usual fashion. The function returns
600 a string which is processed as if it had appeared literally
601 as part of the current spec.
602 %{S} substitutes the -S switch, if that switch was given to GCC.
603 If that switch was not specified, this substitutes nothing.
604 Here S is a metasyntactic variable.
605 %{S*} substitutes all the switches specified to GCC whose names start
606 with -S. This is used for -o, -I, etc; switches that take
607 arguments. GCC considers `-o foo' as being one switch whose
608 name starts with `o'. %{o*} would substitute this text,
609 including the space; thus, two arguments would be generated.
610 %{S*&T*} likewise, but preserve order of S and T options (the order
611 of S and T in the spec is not significant). Can be any number
612 of ampersand-separated variables; for each the wild card is
613 optional. Useful for CPP as %{D*&U*&A*}.
615 %{S:X} substitutes X, if the -S switch was given to GCC.
616 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
617 %{S*:X} substitutes X if one or more switches whose names start
618 with -S was given to GCC. Normally X is substituted only
619 once, no matter how many such switches appeared. However,
620 if %* appears somewhere in X, then X will be substituted
621 once for each matching switch, with the %* replaced by the
622 part of that switch that matched the '*'. A space will be
623 appended after the last substition unless there is more
624 text in current sequence.
625 %{.S:X} substitutes X, if processing a file with suffix S.
626 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
627 %{,S:X} substitutes X, if processing a file which will use spec S.
628 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
630 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
631 combined with '!', '.', ',', and '*' as above binding stronger
632 than the OR.
633 If %* appears in X, all of the alternatives must be starred, and
634 only the first matching alternative is substituted.
635 %{%:function(args):X}
636 Call function named FUNCTION with args ARGS. If the function
637 returns non-NULL, then X is substituted, if it returns
638 NULL, it isn't substituted.
639 %{S:X; if S was given to GCC, substitutes X;
640 T:Y; else if T was given to GCC, substitutes Y;
641 :D} else substitutes D. There can be as many clauses as you need.
642 This may be combined with '.', '!', ',', '|', and '*' as above.
644 %(Spec) processes a specification defined in a specs file as *Spec:
646 The switch matching text S in a %{S}, %{S:X}, or similar construct can use
647 a backslash to ignore the special meaning of the character following it,
648 thus allowing literal matching of a character that is otherwise specially
649 treated. For example, %{std=iso9899\:1999:X} substitutes X if the
650 -std=iso9899:1999 option is given.
652 The conditional text X in a %{S:X} or similar construct may contain
653 other nested % constructs or spaces, or even newlines. They are
654 processed as usual, as described above. Trailing white space in X is
655 ignored. White space may also appear anywhere on the left side of the
656 colon in these constructs, except between . or * and the corresponding
657 word.
659 The -O, -f, -g, -m, and -W switches are handled specifically in these
660 constructs. If another value of -O or the negated form of a -f, -m, or
661 -W switch is found later in the command line, the earlier switch
662 value is ignored, except with {S*} where S is just one letter; this
663 passes all matching options.
665 The character | at the beginning of the predicate text is used to indicate
666 that a command should be piped to the following command, but only if -pipe
667 is specified.
669 Note that it is built into GCC which switches take arguments and which
670 do not. You might think it would be useful to generalize this to
671 allow each compiler's spec to say which switches take arguments. But
672 this cannot be done in a consistent fashion. GCC cannot even decide
673 which input files have been specified without knowing which switches
674 take arguments, and it must know which input files to compile in order
675 to tell which compilers to run.
677 GCC also knows implicitly that arguments starting in `-l' are to be
678 treated as compiler output files, and passed to the linker in their
679 proper position among the other output files. */
681 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
683 /* config.h can define ASM_SPEC to provide extra args to the assembler
684 or extra switch-translations. */
685 #ifndef ASM_SPEC
686 #define ASM_SPEC ""
687 #endif
689 /* config.h can define ASM_FINAL_SPEC to run a post processor after
690 the assembler has run. */
691 #ifndef ASM_FINAL_SPEC
692 #define ASM_FINAL_SPEC \
693 "%{gsplit-dwarf: \n\
694 objcopy --extract-dwo \
695 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
696 %b.dwo \n\
697 objcopy --strip-dwo \
698 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
700 #endif
702 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
703 or extra switch-translations. */
704 #ifndef CPP_SPEC
705 #define CPP_SPEC ""
706 #endif
708 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
709 or extra switch-translations. */
710 #ifndef CC1_SPEC
711 #define CC1_SPEC ""
712 #endif
714 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
715 or extra switch-translations. */
716 #ifndef CC1PLUS_SPEC
717 #define CC1PLUS_SPEC ""
718 #endif
720 /* config.h can define LINK_SPEC to provide extra args to the linker
721 or extra switch-translations. */
722 #ifndef LINK_SPEC
723 #define LINK_SPEC ""
724 #endif
726 /* config.h can define LIB_SPEC to override the default libraries. */
727 #ifndef LIB_SPEC
728 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
729 #endif
731 /* When using -fsplit-stack we need to wrap pthread_create, in order
732 to initialize the stack guard. We always use wrapping, rather than
733 shared library ordering, and we keep the wrapper function in
734 libgcc. This is not yet a real spec, though it could become one;
735 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
736 only works with GNU ld and gold. */
737 #ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
738 #define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
739 #else
740 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
741 #endif
743 #ifndef LIBASAN_SPEC
744 #define STATIC_LIBASAN_LIBS \
745 " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
746 #ifdef LIBASAN_EARLY_SPEC
747 #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
748 #elif defined(HAVE_LD_STATIC_DYNAMIC)
749 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
750 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
751 STATIC_LIBASAN_LIBS
752 #else
753 #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
754 #endif
755 #endif
757 #ifndef LIBASAN_EARLY_SPEC
758 #define LIBASAN_EARLY_SPEC ""
759 #endif
761 #ifndef LIBHWASAN_SPEC
762 #define STATIC_LIBHWASAN_LIBS \
763 " %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
764 #ifdef LIBHWASAN_EARLY_SPEC
765 #define LIBHWASAN_SPEC STATIC_LIBHWASAN_LIBS
766 #elif defined(HAVE_LD_STATIC_DYNAMIC)
767 #define LIBHWASAN_SPEC "%{static-libhwasan:" LD_STATIC_OPTION \
768 "} -lhwasan %{static-libhwasan:" LD_DYNAMIC_OPTION "}" \
769 STATIC_LIBHWASAN_LIBS
770 #else
771 #define LIBHWASAN_SPEC "-lhwasan" STATIC_LIBHWASAN_LIBS
772 #endif
773 #endif
775 #ifndef LIBHWASAN_EARLY_SPEC
776 #define LIBHWASAN_EARLY_SPEC ""
777 #endif
779 #ifndef LIBTSAN_SPEC
780 #define STATIC_LIBTSAN_LIBS \
781 " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
782 #ifdef LIBTSAN_EARLY_SPEC
783 #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
784 #elif defined(HAVE_LD_STATIC_DYNAMIC)
785 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
786 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
787 STATIC_LIBTSAN_LIBS
788 #else
789 #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
790 #endif
791 #endif
793 #ifndef LIBTSAN_EARLY_SPEC
794 #define LIBTSAN_EARLY_SPEC ""
795 #endif
797 #ifndef LIBLSAN_SPEC
798 #define STATIC_LIBLSAN_LIBS \
799 " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
800 #ifdef LIBLSAN_EARLY_SPEC
801 #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
802 #elif defined(HAVE_LD_STATIC_DYNAMIC)
803 #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
804 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
805 STATIC_LIBLSAN_LIBS
806 #else
807 #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
808 #endif
809 #endif
811 #ifndef LIBLSAN_EARLY_SPEC
812 #define LIBLSAN_EARLY_SPEC ""
813 #endif
815 #ifndef LIBUBSAN_SPEC
816 #define STATIC_LIBUBSAN_LIBS \
817 " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
818 #ifdef HAVE_LD_STATIC_DYNAMIC
819 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
820 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
821 STATIC_LIBUBSAN_LIBS
822 #else
823 #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
824 #endif
825 #endif
827 /* Linker options for compressed debug sections. */
828 #if HAVE_LD_COMPRESS_DEBUG == 0
829 /* No linker support. */
830 #define LINK_COMPRESS_DEBUG_SPEC \
831 " %{gz*:%e-gz is not supported in this configuration} "
832 #elif HAVE_LD_COMPRESS_DEBUG == 1
833 /* GNU style on input, GNU ld options. Reject, not useful. */
834 #define LINK_COMPRESS_DEBUG_SPEC \
835 " %{gz*:%e-gz is not supported in this configuration} "
836 #elif HAVE_LD_COMPRESS_DEBUG == 2
837 /* GNU style, GNU gold options. */
838 #define LINK_COMPRESS_DEBUG_SPEC \
839 " %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
840 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
841 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
842 #elif HAVE_LD_COMPRESS_DEBUG == 3
843 /* ELF gABI style. */
844 #define LINK_COMPRESS_DEBUG_SPEC \
845 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
846 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
847 " %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
848 #else
849 #error Unknown value for HAVE_LD_COMPRESS_DEBUG.
850 #endif
852 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
853 included. */
854 #ifndef LIBGCC_SPEC
855 #if defined(REAL_LIBGCC_SPEC)
856 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
857 #elif defined(LINK_LIBGCC_SPECIAL_1)
858 /* Have gcc do the search for libgcc.a. */
859 #define LIBGCC_SPEC "libgcc.a%s"
860 #else
861 #define LIBGCC_SPEC "-lgcc"
862 #endif
863 #endif
865 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
866 #ifndef STARTFILE_SPEC
867 #define STARTFILE_SPEC \
868 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
869 #endif
871 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
872 #ifndef ENDFILE_SPEC
873 #define ENDFILE_SPEC ""
874 #endif
876 #ifndef LINKER_NAME
877 #define LINKER_NAME "collect2"
878 #endif
880 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
881 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
882 #else
883 #define ASM_MAP ""
884 #endif
886 /* Assembler options for compressed debug sections. */
887 #if HAVE_LD_COMPRESS_DEBUG < 2
888 /* Reject if the linker cannot write compressed debug sections. */
889 #define ASM_COMPRESS_DEBUG_SPEC \
890 " %{gz*:%e-gz is not supported in this configuration} "
891 #else /* HAVE_LD_COMPRESS_DEBUG >= 2 */
892 #if HAVE_AS_COMPRESS_DEBUG == 0
893 /* No assembler support. Ignore silently. */
894 #define ASM_COMPRESS_DEBUG_SPEC \
895 " %{gz*:} "
896 #elif HAVE_AS_COMPRESS_DEBUG == 1
897 /* GNU style, GNU as options. */
898 #define ASM_COMPRESS_DEBUG_SPEC \
899 " %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "}" \
900 " %{gz=none:" AS_NO_COMPRESS_DEBUG_OPTION "}" \
901 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
902 #elif HAVE_AS_COMPRESS_DEBUG == 2
903 /* ELF gABI style. */
904 #define ASM_COMPRESS_DEBUG_SPEC \
905 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
906 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
907 " %{gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
908 #else
909 #error Unknown value for HAVE_AS_COMPRESS_DEBUG.
910 #endif
911 #endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */
913 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
914 to the assembler, when compiling assembly sources only. */
915 #ifndef ASM_DEBUG_SPEC
916 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
917 /* If --gdwarf-N is supported and as can handle even compiler generated
918 .debug_line with it, supply --gdwarf-N in ASM_DEBUG_OPTION_SPEC rather
919 than in ASM_DEBUG_SPEC, so that it applies to both .s and .c etc.
920 compilations. */
921 # define ASM_DEBUG_DWARF_OPTION ""
922 # elif defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && !defined(HAVE_LD_BROKEN_PE_DWARF5)
923 # define ASM_DEBUG_DWARF_OPTION "%{%:dwarf-version-gt(4):--gdwarf-5;" \
924 "%:dwarf-version-gt(3):--gdwarf-4;" \
925 "%:dwarf-version-gt(2):--gdwarf-3;" \
926 ":--gdwarf2}"
927 # else
928 # define ASM_DEBUG_DWARF_OPTION "--gdwarf2"
929 # endif
930 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
931 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
932 # define ASM_DEBUG_SPEC \
933 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
934 ? "%{%:debug-level-gt(0):" \
935 "%{gdwarf*:" ASM_DEBUG_DWARF_OPTION "};" \
936 ":%{g*:--gstabs}}" ASM_MAP \
937 : "%{%:debug-level-gt(0):" \
938 "%{gstabs*:--gstabs;" \
939 ":%{g*:" ASM_DEBUG_DWARF_OPTION "}}}" ASM_MAP)
940 # else
941 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
942 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):--gstabs}}" ASM_MAP
943 # endif
944 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
945 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):" \
946 ASM_DEBUG_DWARF_OPTION "}}" ASM_MAP
947 # endif
948 # endif
949 #endif
950 #ifndef ASM_DEBUG_SPEC
951 # define ASM_DEBUG_SPEC ""
952 #endif
954 /* Define ASM_DEBUG_OPTION_SPEC to be a spec suitable for translating '-g'
955 to the assembler when compiling all sources. */
956 #ifndef ASM_DEBUG_OPTION_SPEC
957 # if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
958 # define ASM_DEBUG_OPTION_DWARF_OPT \
959 "%{%:dwarf-version-gt(4):--gdwarf-5 ;" \
960 "%:dwarf-version-gt(3):--gdwarf-4 ;" \
961 "%:dwarf-version-gt(2):--gdwarf-3 ;" \
962 ":--gdwarf2 }"
963 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO)
964 # define ASM_DEBUG_OPTION_SPEC \
965 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
966 ? "%{%:debug-level-gt(0):" \
967 "%{gdwarf*:" ASM_DEBUG_OPTION_DWARF_OPT "}}" \
968 : "%{%:debug-level-gt(0):" \
969 "%{!gstabs*:%{g*:" ASM_DEBUG_OPTION_DWARF_OPT "}}}")
970 # elif defined(DWARF2_DEBUGGING_INFO)
971 # define ASM_DEBUG_OPTION_SPEC "%{g*:%{%:debug-level-gt(0):" \
972 ASM_DEBUG_OPTION_DWARF_OPT "}}"
973 # endif
974 # endif
975 #endif
976 #ifndef ASM_DEBUG_OPTION_SPEC
977 # define ASM_DEBUG_OPTION_SPEC ""
978 #endif
980 /* Here is the spec for running the linker, after compiling all files. */
982 /* This is overridable by the target in case they need to specify the
983 -lgcc and -lc order specially, yet not require them to override all
984 of LINK_COMMAND_SPEC. */
985 #ifndef LINK_GCC_C_SEQUENCE_SPEC
986 #define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
987 #endif
989 #ifndef LINK_SSP_SPEC
990 #ifdef TARGET_LIBC_PROVIDES_SSP
991 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
992 "|fstack-protector-strong|fstack-protector-explicit:}"
993 #else
994 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
995 "|fstack-protector-strong|fstack-protector-explicit" \
996 ":-lssp_nonshared -lssp}"
997 #endif
998 #endif
1000 #ifdef ENABLE_DEFAULT_PIE
1001 #define PIE_SPEC "!no-pie"
1002 #define NO_FPIE1_SPEC "fno-pie"
1003 #define FPIE1_SPEC NO_FPIE1_SPEC ":;"
1004 #define NO_FPIE2_SPEC "fno-PIE"
1005 #define FPIE2_SPEC NO_FPIE2_SPEC ":;"
1006 #define NO_FPIE_SPEC NO_FPIE1_SPEC "|" NO_FPIE2_SPEC
1007 #define FPIE_SPEC NO_FPIE_SPEC ":;"
1008 #define NO_FPIC1_SPEC "fno-pic"
1009 #define FPIC1_SPEC NO_FPIC1_SPEC ":;"
1010 #define NO_FPIC2_SPEC "fno-PIC"
1011 #define FPIC2_SPEC NO_FPIC2_SPEC ":;"
1012 #define NO_FPIC_SPEC NO_FPIC1_SPEC "|" NO_FPIC2_SPEC
1013 #define FPIC_SPEC NO_FPIC_SPEC ":;"
1014 #define NO_FPIE1_AND_FPIC1_SPEC NO_FPIE1_SPEC "|" NO_FPIC1_SPEC
1015 #define FPIE1_OR_FPIC1_SPEC NO_FPIE1_AND_FPIC1_SPEC ":;"
1016 #define NO_FPIE2_AND_FPIC2_SPEC NO_FPIE2_SPEC "|" NO_FPIC2_SPEC
1017 #define FPIE2_OR_FPIC2_SPEC NO_FPIE2_AND_FPIC2_SPEC ":;"
1018 #define NO_FPIE_AND_FPIC_SPEC NO_FPIE_SPEC "|" NO_FPIC_SPEC
1019 #define FPIE_OR_FPIC_SPEC NO_FPIE_AND_FPIC_SPEC ":;"
1020 #else
1021 #define PIE_SPEC "pie"
1022 #define FPIE1_SPEC "fpie"
1023 #define NO_FPIE1_SPEC FPIE1_SPEC ":;"
1024 #define FPIE2_SPEC "fPIE"
1025 #define NO_FPIE2_SPEC FPIE2_SPEC ":;"
1026 #define FPIE_SPEC FPIE1_SPEC "|" FPIE2_SPEC
1027 #define NO_FPIE_SPEC FPIE_SPEC ":;"
1028 #define FPIC1_SPEC "fpic"
1029 #define NO_FPIC1_SPEC FPIC1_SPEC ":;"
1030 #define FPIC2_SPEC "fPIC"
1031 #define NO_FPIC2_SPEC FPIC2_SPEC ":;"
1032 #define FPIC_SPEC FPIC1_SPEC "|" FPIC2_SPEC
1033 #define NO_FPIC_SPEC FPIC_SPEC ":;"
1034 #define FPIE1_OR_FPIC1_SPEC FPIE1_SPEC "|" FPIC1_SPEC
1035 #define NO_FPIE1_AND_FPIC1_SPEC FPIE1_OR_FPIC1_SPEC ":;"
1036 #define FPIE2_OR_FPIC2_SPEC FPIE2_SPEC "|" FPIC2_SPEC
1037 #define NO_FPIE2_AND_FPIC2_SPEC FPIE1_OR_FPIC2_SPEC ":;"
1038 #define FPIE_OR_FPIC_SPEC FPIE_SPEC "|" FPIC_SPEC
1039 #define NO_FPIE_AND_FPIC_SPEC FPIE_OR_FPIC_SPEC ":;"
1040 #endif
1042 #ifndef LINK_PIE_SPEC
1043 #ifdef HAVE_LD_PIE
1044 #ifndef LD_PIE_SPEC
1045 #define LD_PIE_SPEC "-pie"
1046 #endif
1047 #else
1048 #define LD_PIE_SPEC ""
1049 #endif
1050 #define LINK_PIE_SPEC "%{static|shared|r:;" PIE_SPEC ":" LD_PIE_SPEC "} "
1051 #endif
1053 #ifndef LINK_BUILDID_SPEC
1054 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
1055 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
1056 # endif
1057 #endif
1059 #ifndef LTO_PLUGIN_SPEC
1060 #define LTO_PLUGIN_SPEC ""
1061 #endif
1063 /* Conditional to test whether the LTO plugin is used or not.
1064 FIXME: For slim LTO we will need to enable plugin unconditionally. This
1065 still cause problems with PLUGIN_LD != LD and when plugin is built but
1066 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
1067 plugin only when LTO is enabled. We still honor explicit
1068 -fuse-linker-plugin if the linker used understands -plugin. */
1070 /* The linker has some plugin support. */
1071 #if HAVE_LTO_PLUGIN > 0
1072 /* The linker used has full plugin support, use LTO plugin by default. */
1073 #if HAVE_LTO_PLUGIN == 2
1074 #define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
1075 #define PLUGIN_COND_CLOSE "}"
1076 #else
1077 /* The linker used has limited plugin support, use LTO plugin with explicit
1078 -fuse-linker-plugin. */
1079 #define PLUGIN_COND "fuse-linker-plugin"
1080 #define PLUGIN_COND_CLOSE ""
1081 #endif
1082 #define LINK_PLUGIN_SPEC \
1083 "%{" PLUGIN_COND": \
1084 -plugin %(linker_plugin_file) \
1085 -plugin-opt=%(lto_wrapper) \
1086 -plugin-opt=-fresolution=%u.res \
1087 " LTO_PLUGIN_SPEC "\
1088 %{flinker-output=*:-plugin-opt=-linker-output-known} \
1089 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
1090 }" PLUGIN_COND_CLOSE
1091 #else
1092 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
1093 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
1094 %e-fuse-linker-plugin is not supported in this configuration}"
1095 #endif
1097 /* Linker command line options for -fsanitize= early on the command line. */
1098 #ifndef SANITIZER_EARLY_SPEC
1099 #define SANITIZER_EARLY_SPEC "\
1100 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
1101 %{%:sanitize(hwaddress):" LIBHWASAN_EARLY_SPEC "} \
1102 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
1103 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}"
1104 #endif
1106 /* Linker command line options for -fsanitize= late on the command line. */
1107 #ifndef SANITIZER_SPEC
1108 #define SANITIZER_SPEC "\
1109 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
1110 %{static:%ecannot specify -static with -fsanitize=address}}\
1111 %{%:sanitize(hwaddress):" LIBHWASAN_SPEC "\
1112 %{static:%ecannot specify -static with -fsanitize=hwaddress}}\
1113 %{%:sanitize(thread):" LIBTSAN_SPEC "\
1114 %{static:%ecannot specify -static with -fsanitize=thread}}\
1115 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
1116 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}"
1117 #endif
1119 #ifndef POST_LINK_SPEC
1120 #define POST_LINK_SPEC ""
1121 #endif
1123 /* This is the spec to use, once the code for creating the vtable
1124 verification runtime library, libvtv.so, has been created. Currently
1125 the vtable verification runtime functions are in libstdc++, so we use
1126 the spec just below this one. */
1127 #ifndef VTABLE_VERIFICATION_SPEC
1128 #if ENABLE_VTABLE_VERIFY
1129 #define VTABLE_VERIFICATION_SPEC "\
1130 %{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1131 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1132 #else
1133 #define VTABLE_VERIFICATION_SPEC "\
1134 %{fvtable-verify=none:} \
1135 %{fvtable-verify=std: \
1136 %e-fvtable-verify=std is not supported in this configuration} \
1137 %{fvtable-verify=preinit: \
1138 %e-fvtable-verify=preinit is not supported in this configuration}"
1139 #endif
1140 #endif
1142 /* -u* was put back because both BSD and SysV seem to support it. */
1143 /* %{static|no-pie|static-pie:} simply prevents an error message:
1144 1. If the target machine doesn't handle -static.
1145 2. If PIE isn't enabled by default.
1146 3. If the target machine doesn't handle -static-pie.
1148 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1149 scripts which exist in user specified directories, or in standard
1150 directories. */
1151 /* We pass any -flto flags on to the linker, which is expected
1152 to understand them. In practice, this means it had better be collect2. */
1153 /* %{e*} includes -export-dynamic; see comment in common.opt. */
1154 #ifndef LINK_COMMAND_SPEC
1155 #define LINK_COMMAND_SPEC "\
1156 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1157 %(linker) " \
1158 LINK_PLUGIN_SPEC \
1159 "%{flto|flto=*:%<fcompare-debug*} \
1160 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
1161 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
1162 "%X %{o*} %{e*} %{N} %{n} %{r}\
1163 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1164 %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
1165 VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
1166 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1167 %:include(libgomp.spec)%(link_gomp)}\
1168 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1169 %(mflib) " STACK_SPLIT_SPEC "\
1170 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
1171 %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1172 %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1173 #endif
1175 #ifndef LINK_LIBGCC_SPEC
1176 /* Generate -L options for startfile prefix list. */
1177 # define LINK_LIBGCC_SPEC "%D"
1178 #endif
1180 #ifndef STARTFILE_PREFIX_SPEC
1181 # define STARTFILE_PREFIX_SPEC ""
1182 #endif
1184 #ifndef SYSROOT_SPEC
1185 # define SYSROOT_SPEC "--sysroot=%R"
1186 #endif
1188 #ifndef SYSROOT_SUFFIX_SPEC
1189 # define SYSROOT_SUFFIX_SPEC ""
1190 #endif
1192 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1193 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
1194 #endif
1196 static const char *asm_debug = ASM_DEBUG_SPEC;
1197 static const char *asm_debug_option = ASM_DEBUG_OPTION_SPEC;
1198 static const char *cpp_spec = CPP_SPEC;
1199 static const char *cc1_spec = CC1_SPEC;
1200 static const char *cc1plus_spec = CC1PLUS_SPEC;
1201 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
1202 static const char *link_ssp_spec = LINK_SSP_SPEC;
1203 static const char *asm_spec = ASM_SPEC;
1204 static const char *asm_final_spec = ASM_FINAL_SPEC;
1205 static const char *link_spec = LINK_SPEC;
1206 static const char *lib_spec = LIB_SPEC;
1207 static const char *link_gomp_spec = "";
1208 static const char *libgcc_spec = LIBGCC_SPEC;
1209 static const char *endfile_spec = ENDFILE_SPEC;
1210 static const char *startfile_spec = STARTFILE_SPEC;
1211 static const char *linker_name_spec = LINKER_NAME;
1212 static const char *linker_plugin_file_spec = "";
1213 static const char *lto_wrapper_spec = "";
1214 static const char *lto_gcc_spec = "";
1215 static const char *post_link_spec = POST_LINK_SPEC;
1216 static const char *link_command_spec = LINK_COMMAND_SPEC;
1217 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
1218 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
1219 static const char *sysroot_spec = SYSROOT_SPEC;
1220 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
1221 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
1222 static const char *self_spec = "";
1224 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1225 There should be no need to override these in target dependent files,
1226 but we need to copy them to the specs file so that newer versions
1227 of the GCC driver can correctly drive older tool chains with the
1228 appropriate -B options. */
1230 /* When cpplib handles traditional preprocessing, get rid of this, and
1231 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1232 that we default the front end language better. */
1233 static const char *trad_capable_cpp =
1234 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1236 /* We don't wrap .d files in %W{} since a missing .d file, and
1237 therefore no dependency entry, confuses make into thinking a .o
1238 file that happens to exist is up-to-date. */
1239 static const char *cpp_unique_options =
1240 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1241 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1242 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1243 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1244 %{Mmodules} %{Mno-modules}\
1245 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1246 %{remap} %{%:debug-level-gt(2):-dD}\
1247 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1248 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1249 %{E|M|MM:%W{o*}}";
1251 /* This contains cpp options which are common with cc1_options and are passed
1252 only when preprocessing only to avoid duplication. We pass the cc1 spec
1253 options to the preprocessor so that it the cc1 spec may manipulate
1254 options used to set target flags. Those special target flags settings may
1255 in turn cause preprocessor symbols to be defined specially. */
1256 static const char *cpp_options =
1257 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1258 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1259 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1260 %{undef} %{save-temps*:-fpch-preprocess}";
1262 /* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
1264 Make it easy for a language to override the argument for the
1265 %:dumps specs function call. */
1266 #define DUMPS_OPTIONS(EXTS) \
1267 "%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps(" EXTS ")"
1269 /* This contains cpp options which are not passed when the preprocessor
1270 output will be used by another program. */
1271 static const char *cpp_debug_options = DUMPS_OPTIONS ("");
1273 /* NB: This is shared amongst all front-ends, except for Ada. */
1274 static const char *cc1_options =
1275 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1276 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1277 %1 %{!Q:-quiet} %(cpp_debug_options) %{m*} %{aux-info*}\
1278 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1279 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1280 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1281 %{-target-help:--target-help}\
1282 %{-version:--version}\
1283 %{-help=*:--help=%*}\
1284 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %w%b.s}}}\
1285 %{fsyntax-only:-o %j} %{-param*}\
1286 %{coverage:-fprofile-arcs -ftest-coverage}\
1287 %{fprofile-arcs|fprofile-generate*|coverage:\
1288 %{!fprofile-update=single:\
1289 %{pthread:-fprofile-update=prefer-atomic}}}";
1291 static const char *asm_options =
1292 "%{-target-help:%:print-asm-header()} "
1293 #if HAVE_GNU_AS
1294 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
1295 to the assembler equivalents. */
1296 "%{v} %{w:-W} %{I*} "
1297 #endif
1298 "%(asm_debug_option)"
1299 ASM_COMPRESS_DEBUG_SPEC
1300 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1302 static const char *invoke_as =
1303 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1304 "%{!fwpa*:\
1305 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1306 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1308 #else
1309 "%{!fwpa*:\
1310 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1311 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1313 #endif
1315 /* Some compilers have limits on line lengths, and the multilib_select
1316 and/or multilib_matches strings can be very long, so we build them at
1317 run time. */
1318 static struct obstack multilib_obstack;
1319 static const char *multilib_select;
1320 static const char *multilib_matches;
1321 static const char *multilib_defaults;
1322 static const char *multilib_exclusions;
1323 static const char *multilib_reuse;
1325 /* Check whether a particular argument is a default argument. */
1327 #ifndef MULTILIB_DEFAULTS
1328 #define MULTILIB_DEFAULTS { "" }
1329 #endif
1331 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
1333 #ifndef DRIVER_SELF_SPECS
1334 #define DRIVER_SELF_SPECS ""
1335 #endif
1337 /* Linking to libgomp implies pthreads. This is particularly important
1338 for targets that use different start files and suchlike. */
1339 #ifndef GOMP_SELF_SPECS
1340 #define GOMP_SELF_SPECS \
1341 "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1342 "-pthread}"
1343 #endif
1345 /* Likewise for -fgnu-tm. */
1346 #ifndef GTM_SELF_SPECS
1347 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1348 #endif
1350 static const char *const driver_self_specs[] = {
1351 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1352 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS
1355 #ifndef OPTION_DEFAULT_SPECS
1356 #define OPTION_DEFAULT_SPECS { "", "" }
1357 #endif
1359 struct default_spec
1361 const char *name;
1362 const char *spec;
1365 static const struct default_spec
1366 option_default_specs[] = { OPTION_DEFAULT_SPECS };
1368 struct user_specs
1370 struct user_specs *next;
1371 const char *filename;
1374 static struct user_specs *user_specs_head, *user_specs_tail;
1376 /* Record the mapping from file suffixes for compilation specs. */
1378 struct compiler
1380 const char *suffix; /* Use this compiler for input files
1381 whose names end in this suffix. */
1383 const char *spec; /* To use this compiler, run this spec. */
1385 const char *cpp_spec; /* If non-NULL, substitute this spec
1386 for `%C', rather than the usual
1387 cpp_spec. */
1388 int combinable; /* If nonzero, compiler can deal with
1389 multiple source files at once (IMA). */
1390 int needs_preprocessing; /* If nonzero, source files need to
1391 be run through a preprocessor. */
1394 /* Pointer to a vector of `struct compiler' that gives the spec for
1395 compiling a file, based on its suffix.
1396 A file that does not end in any of these suffixes will be passed
1397 unchanged to the loader and nothing else will be done to it.
1399 An entry containing two 0s is used to terminate the vector.
1401 If multiple entries match a file, the last matching one is used. */
1403 static struct compiler *compilers;
1405 /* Number of entries in `compilers', not counting the null terminator. */
1407 static int n_compilers;
1409 /* The default list of file name suffixes and their compilation specs. */
1411 static const struct compiler default_compilers[] =
1413 /* Add lists of suffixes of known languages here. If those languages
1414 were not present when we built the driver, we will hit these copies
1415 and be given a more meaningful error than "file not used since
1416 linking is not done". */
1417 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1418 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1419 {".mii", "#Objective-C++", 0, 0, 0},
1420 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1421 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1422 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1423 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1424 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1425 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1426 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1427 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1428 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1429 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1430 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1431 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1432 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1433 {".r", "#Ratfor", 0, 0, 0},
1434 {".go", "#Go", 0, 1, 0},
1435 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1436 /* Next come the entries for C. */
1437 {".c", "@c", 0, 0, 1},
1438 {"@c",
1439 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1440 external preprocessor if -save-temps is given. */
1441 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1442 %{!E:%{!M:%{!MM:\
1443 %{traditional:\
1444 %eGNU C no longer supports -traditional without -E}\
1445 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1446 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1447 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1448 %(cc1_options)}\
1449 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1450 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1451 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1452 {"-",
1453 "%{!E:%e-E or -x required when input is from standard input}\
1454 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1455 {".h", "@c-header", 0, 0, 0},
1456 {"@c-header",
1457 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1458 external preprocessor if -save-temps is given. */
1459 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1460 %{!E:%{!M:%{!MM:\
1461 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1462 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1463 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1464 %(cc1_options)\
1465 %{!fsyntax-only:%{!S:-o %g.s} \
1466 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1467 %W{o*:--output-pch=%*}}%V}}\
1468 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1469 cc1 %(cpp_unique_options) %(cc1_options)\
1470 %{!fsyntax-only:%{!S:-o %g.s} \
1471 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1472 %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
1473 {".i", "@cpp-output", 0, 0, 0},
1474 {"@cpp-output",
1475 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1476 {".s", "@assembler", 0, 0, 0},
1477 {"@assembler",
1478 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1479 {".sx", "@assembler-with-cpp", 0, 0, 0},
1480 {".S", "@assembler-with-cpp", 0, 0, 0},
1481 {"@assembler-with-cpp",
1482 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1483 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1484 %{E|M|MM:%(cpp_debug_options)}\
1485 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1486 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1487 #else
1488 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1489 %{E|M|MM:%(cpp_debug_options)}\
1490 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1491 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1492 #endif
1493 , 0, 0, 0},
1495 #include "specs.h"
1496 /* Mark end of table. */
1497 {0, 0, 0, 0, 0}
1500 /* Number of elements in default_compilers, not counting the terminator. */
1502 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1504 typedef char *char_p; /* For DEF_VEC_P. */
1506 /* A vector of options to give to the linker.
1507 These options are accumulated by %x,
1508 and substituted into the linker command with %X. */
1509 static vec<char_p> linker_options;
1511 /* A vector of options to give to the assembler.
1512 These options are accumulated by -Wa,
1513 and substituted into the assembler command with %Y. */
1514 static vec<char_p> assembler_options;
1516 /* A vector of options to give to the preprocessor.
1517 These options are accumulated by -Wp,
1518 and substituted into the preprocessor command with %Z. */
1519 static vec<char_p> preprocessor_options;
1521 static char *
1522 skip_whitespace (char *p)
1524 while (1)
1526 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1527 be considered whitespace. */
1528 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1529 return p + 1;
1530 else if (*p == '\n' || *p == ' ' || *p == '\t')
1531 p++;
1532 else if (*p == '#')
1534 while (*p != '\n')
1535 p++;
1536 p++;
1538 else
1539 break;
1542 return p;
1544 /* Structures to keep track of prefixes to try when looking for files. */
1546 struct prefix_list
1548 const char *prefix; /* String to prepend to the path. */
1549 struct prefix_list *next; /* Next in linked list. */
1550 int require_machine_suffix; /* Don't use without machine_suffix. */
1551 /* 2 means try both machine_suffix and just_machine_suffix. */
1552 int priority; /* Sort key - priority within list. */
1553 int os_multilib; /* 1 if OS multilib scheme should be used,
1554 0 for GCC multilib scheme. */
1557 struct path_prefix
1559 struct prefix_list *plist; /* List of prefixes to try */
1560 int max_len; /* Max length of a prefix in PLIST */
1561 const char *name; /* Name of this list (used in config stuff) */
1564 /* List of prefixes to try when looking for executables. */
1566 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1568 /* List of prefixes to try when looking for startup (crt0) files. */
1570 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1572 /* List of prefixes to try when looking for include files. */
1574 static struct path_prefix include_prefixes = { 0, 0, "include" };
1576 /* Suffix to attach to directories searched for commands.
1577 This looks like `MACHINE/VERSION/'. */
1579 static const char *machine_suffix = 0;
1581 /* Suffix to attach to directories searched for commands.
1582 This is just `MACHINE/'. */
1584 static const char *just_machine_suffix = 0;
1586 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1588 static const char *gcc_exec_prefix;
1590 /* Adjusted value of standard_libexec_prefix. */
1592 static const char *gcc_libexec_prefix;
1594 /* Default prefixes to attach to command names. */
1596 #ifndef STANDARD_STARTFILE_PREFIX_1
1597 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1598 #endif
1599 #ifndef STANDARD_STARTFILE_PREFIX_2
1600 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1601 #endif
1603 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1604 #undef MD_EXEC_PREFIX
1605 #undef MD_STARTFILE_PREFIX
1606 #undef MD_STARTFILE_PREFIX_1
1607 #endif
1609 /* If no prefixes defined, use the null string, which will disable them. */
1610 #ifndef MD_EXEC_PREFIX
1611 #define MD_EXEC_PREFIX ""
1612 #endif
1613 #ifndef MD_STARTFILE_PREFIX
1614 #define MD_STARTFILE_PREFIX ""
1615 #endif
1616 #ifndef MD_STARTFILE_PREFIX_1
1617 #define MD_STARTFILE_PREFIX_1 ""
1618 #endif
1620 /* These directories are locations set at configure-time based on the
1621 --prefix option provided to configure. Their initializers are
1622 defined in Makefile.in. These paths are not *directly* used when
1623 gcc_exec_prefix is set because, in that case, we know where the
1624 compiler has been installed, and use paths relative to that
1625 location instead. */
1626 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1627 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1628 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1629 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1631 /* For native compilers, these are well-known paths containing
1632 components that may be provided by the system. For cross
1633 compilers, these paths are not used. */
1634 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1635 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1636 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1637 static const char *const standard_startfile_prefix_1
1638 = STANDARD_STARTFILE_PREFIX_1;
1639 static const char *const standard_startfile_prefix_2
1640 = STANDARD_STARTFILE_PREFIX_2;
1642 /* A relative path to be used in finding the location of tools
1643 relative to the driver. */
1644 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1646 /* A prefix to be used when this is an accelerator compiler. */
1647 static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
1649 /* Subdirectory to use for locating libraries. Set by
1650 set_multilib_dir based on the compilation options. */
1652 static const char *multilib_dir;
1654 /* Subdirectory to use for locating libraries in OS conventions. Set by
1655 set_multilib_dir based on the compilation options. */
1657 static const char *multilib_os_dir;
1659 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1660 set_multilib_dir based on the compilation options. */
1662 static const char *multiarch_dir;
1664 /* Structure to keep track of the specs that have been defined so far.
1665 These are accessed using %(specname) in a compiler or link
1666 spec. */
1668 struct spec_list
1670 /* The following 2 fields must be first */
1671 /* to allow EXTRA_SPECS to be initialized */
1672 const char *name; /* name of the spec. */
1673 const char *ptr; /* available ptr if no static pointer */
1675 /* The following fields are not initialized */
1676 /* by EXTRA_SPECS */
1677 const char **ptr_spec; /* pointer to the spec itself. */
1678 struct spec_list *next; /* Next spec in linked list. */
1679 int name_len; /* length of the name */
1680 bool user_p; /* whether string come from file spec. */
1681 bool alloc_p; /* whether string was allocated */
1682 const char *default_ptr; /* The default value of *ptr_spec. */
1685 #define INIT_STATIC_SPEC(NAME,PTR) \
1686 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1687 *PTR }
1689 /* List of statically defined specs. */
1690 static struct spec_list static_specs[] =
1692 INIT_STATIC_SPEC ("asm", &asm_spec),
1693 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1694 INIT_STATIC_SPEC ("asm_debug_option", &asm_debug_option),
1695 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1696 INIT_STATIC_SPEC ("asm_options", &asm_options),
1697 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1698 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1699 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1700 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1701 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1702 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1703 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1704 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1705 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1706 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1707 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1708 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1709 INIT_STATIC_SPEC ("link", &link_spec),
1710 INIT_STATIC_SPEC ("lib", &lib_spec),
1711 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1712 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1713 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1714 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1715 INIT_STATIC_SPEC ("version", &compiler_version),
1716 INIT_STATIC_SPEC ("multilib", &multilib_select),
1717 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1718 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1719 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1720 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1721 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1722 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
1723 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1724 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1725 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1726 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1727 INIT_STATIC_SPEC ("post_link", &post_link_spec),
1728 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1729 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1730 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1731 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1732 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1733 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1734 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1735 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1736 INIT_STATIC_SPEC ("self_spec", &self_spec),
1739 #ifdef EXTRA_SPECS /* additional specs needed */
1740 /* Structure to keep track of just the first two args of a spec_list.
1741 That is all that the EXTRA_SPECS macro gives us. */
1742 struct spec_list_1
1744 const char *const name;
1745 const char *const ptr;
1748 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1749 static struct spec_list *extra_specs = (struct spec_list *) 0;
1750 #endif
1752 /* List of dynamically allocates specs that have been defined so far. */
1754 static struct spec_list *specs = (struct spec_list *) 0;
1756 /* List of static spec functions. */
1758 static const struct spec_function static_spec_functions[] =
1760 { "getenv", getenv_spec_function },
1761 { "if-exists", if_exists_spec_function },
1762 { "if-exists-else", if_exists_else_spec_function },
1763 { "if-exists-then-else", if_exists_then_else_spec_function },
1764 { "sanitize", sanitize_spec_function },
1765 { "replace-outfile", replace_outfile_spec_function },
1766 { "remove-outfile", remove_outfile_spec_function },
1767 { "version-compare", version_compare_spec_function },
1768 { "include", include_spec_function },
1769 { "find-file", find_file_spec_function },
1770 { "find-plugindir", find_plugindir_spec_function },
1771 { "print-asm-header", print_asm_header_spec_function },
1772 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1773 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1774 { "pass-through-libs", pass_through_libs_spec_func },
1775 { "dumps", dumps_spec_func },
1776 { "gt", greater_than_spec_func },
1777 { "debug-level-gt", debug_level_greater_than_spec_func },
1778 { "dwarf-version-gt", dwarf_version_greater_than_spec_func },
1779 { "fortran-preinclude-file", find_fortran_preinclude_file},
1780 #ifdef EXTRA_SPEC_FUNCTIONS
1781 EXTRA_SPEC_FUNCTIONS
1782 #endif
1783 { 0, 0 }
1786 static int processing_spec_function;
1788 /* Add appropriate libgcc specs to OBSTACK, taking into account
1789 various permutations of -shared-libgcc, -shared, and such. */
1791 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1793 #ifndef USE_LD_AS_NEEDED
1794 #define USE_LD_AS_NEEDED 0
1795 #endif
1797 static void
1798 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1799 const char *static_name, const char *eh_name)
1801 char *buf;
1803 #if USE_LD_AS_NEEDED
1804 buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
1805 "%{!static:%{!static-libgcc:%{!static-pie:"
1806 "%{!shared-libgcc:",
1807 static_name, " " LD_AS_NEEDED_OPTION " ",
1808 shared_name, " " LD_NO_AS_NEEDED_OPTION
1810 "%{shared-libgcc:",
1811 shared_name, "%{!shared: ", static_name, "}"
1812 "}}"
1813 #else
1814 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1815 "%{!static:%{!static-libgcc:"
1816 "%{!shared:"
1817 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1818 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1820 #ifdef LINK_EH_SPEC
1821 "%{shared:"
1822 "%{shared-libgcc:", shared_name, "}"
1823 "%{!shared-libgcc:", static_name, "}"
1825 #else
1826 "%{shared:", shared_name, "}"
1827 #endif
1828 #endif
1829 "}}", NULL);
1831 obstack_grow (obstack, buf, strlen (buf));
1832 free (buf);
1834 #endif /* ENABLE_SHARED_LIBGCC */
1836 /* Initialize the specs lookup routines. */
1838 static void
1839 init_spec (void)
1841 struct spec_list *next = (struct spec_list *) 0;
1842 struct spec_list *sl = (struct spec_list *) 0;
1843 int i;
1845 if (specs)
1846 return; /* Already initialized. */
1848 if (verbose_flag)
1849 fnotice (stderr, "Using built-in specs.\n");
1851 #ifdef EXTRA_SPECS
1852 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1854 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1856 sl = &extra_specs[i];
1857 sl->name = extra_specs_1[i].name;
1858 sl->ptr = extra_specs_1[i].ptr;
1859 sl->next = next;
1860 sl->name_len = strlen (sl->name);
1861 sl->ptr_spec = &sl->ptr;
1862 gcc_assert (sl->ptr_spec != NULL);
1863 sl->default_ptr = sl->ptr;
1864 next = sl;
1866 #endif
1868 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1870 sl = &static_specs[i];
1871 sl->next = next;
1872 next = sl;
1875 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1876 /* ??? If neither -shared-libgcc nor --static-libgcc was
1877 seen, then we should be making an educated guess. Some proposed
1878 heuristics for ELF include:
1880 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1881 program will be doing dynamic loading, which will likely
1882 need the shared libgcc.
1884 (2) If "-ldl", then it's also a fair bet that we're doing
1885 dynamic loading.
1887 (3) For each ET_DYN we're linking against (either through -lfoo
1888 or /some/path/foo.so), check to see whether it or one of
1889 its dependencies depends on a shared libgcc.
1891 (4) If "-shared"
1893 If the runtime is fixed to look for program headers instead
1894 of calling __register_frame_info at all, for each object,
1895 use the shared libgcc if any EH symbol referenced.
1897 If crtstuff is fixed to not invoke __register_frame_info
1898 automatically, for each object, use the shared libgcc if
1899 any non-empty unwind section found.
1901 Doing any of this probably requires invoking an external program to
1902 do the actual object file scanning. */
1904 const char *p = libgcc_spec;
1905 int in_sep = 1;
1907 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1908 when given the proper command line arguments. */
1909 while (*p)
1911 if (in_sep && *p == '-' && startswith (p, "-lgcc"))
1913 init_gcc_specs (&obstack,
1914 "-lgcc_s"
1915 #ifdef USE_LIBUNWIND_EXCEPTIONS
1916 " -lunwind"
1917 #endif
1919 "-lgcc",
1920 "-lgcc_eh"
1921 #ifdef USE_LIBUNWIND_EXCEPTIONS
1922 # ifdef HAVE_LD_STATIC_DYNAMIC
1923 " %{!static:%{!static-pie:" LD_STATIC_OPTION "}} -lunwind"
1924 " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION "}}"
1925 # else
1926 " -lunwind"
1927 # endif
1928 #endif
1931 p += 5;
1932 in_sep = 0;
1934 else if (in_sep && *p == 'l' && startswith (p, "libgcc.a%s"))
1936 /* Ug. We don't know shared library extensions. Hope that
1937 systems that use this form don't do shared libraries. */
1938 init_gcc_specs (&obstack,
1939 "-lgcc_s",
1940 "libgcc.a%s",
1941 "libgcc_eh.a%s"
1942 #ifdef USE_LIBUNWIND_EXCEPTIONS
1943 " -lunwind"
1944 #endif
1946 p += 10;
1947 in_sep = 0;
1949 else
1951 obstack_1grow (&obstack, *p);
1952 in_sep = (*p == ' ');
1953 p += 1;
1957 obstack_1grow (&obstack, '\0');
1958 libgcc_spec = XOBFINISH (&obstack, const char *);
1960 #endif
1961 #ifdef USE_AS_TRADITIONAL_FORMAT
1962 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1964 static const char tf[] = "--traditional-format ";
1965 obstack_grow (&obstack, tf, sizeof (tf) - 1);
1966 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1967 asm_spec = XOBFINISH (&obstack, const char *);
1969 #endif
1971 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1972 defined LINKER_HASH_STYLE
1973 # ifdef LINK_BUILDID_SPEC
1974 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1975 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
1976 # endif
1977 # ifdef LINK_EH_SPEC
1978 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1979 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
1980 # endif
1981 # ifdef LINKER_HASH_STYLE
1982 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1983 before. */
1985 static const char hash_style[] = "--hash-style=";
1986 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1987 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
1988 obstack_1grow (&obstack, ' ');
1990 # endif
1991 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1992 link_spec = XOBFINISH (&obstack, const char *);
1993 #endif
1995 specs = sl;
1998 /* Update the entry for SPEC in the static_specs table to point to VALUE,
1999 ensuring that we free the previous value if necessary. Set alloc_p for the
2000 entry to ALLOC_P: this determines whether we take ownership of VALUE (i.e.
2001 whether we need to free it later on). */
2002 static void
2003 set_static_spec (const char **spec, const char *value, bool alloc_p)
2005 struct spec_list *sl = NULL;
2007 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
2009 if (static_specs[i].ptr_spec == spec)
2011 sl = static_specs + i;
2012 break;
2016 gcc_assert (sl);
2018 if (sl->alloc_p)
2020 const char *old = *spec;
2021 free (const_cast <char *> (old));
2024 *spec = value;
2025 sl->alloc_p = alloc_p;
2028 /* Update a static spec to a new string, taking ownership of that
2029 string's memory. */
2030 static void set_static_spec_owned (const char **spec, const char *val)
2032 return set_static_spec (spec, val, true);
2035 /* Update a static spec to point to a new value, but don't take
2036 ownership of (i.e. don't free) that string. */
2037 static void set_static_spec_shared (const char **spec, const char *val)
2039 return set_static_spec (spec, val, false);
2042 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
2043 removed; If the spec starts with a + then SPEC is added to the end of the
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);
3231 /* Execute the command specified by the arguments on the current line of spec.
3232 When using pipes, this includes several piped-together commands
3233 with `|' between them.
3235 Return 0 if successful, -1 if failed. */
3237 static int
3238 execute (void)
3240 int i;
3241 int n_commands; /* # of command. */
3242 char *string;
3243 struct pex_obj *pex;
3244 struct command
3246 const char *prog; /* program name. */
3247 const char **argv; /* vector of args. */
3249 const char *arg;
3251 struct command *commands; /* each command buffer with above info. */
3253 gcc_assert (!processing_spec_function);
3255 if (wrapper_string)
3257 string = find_a_program (argbuf[0]);
3258 if (string)
3259 argbuf[0] = string;
3260 insert_wrapper (wrapper_string);
3263 /* Count # of piped commands. */
3264 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3265 if (strcmp (arg, "|") == 0)
3266 n_commands++;
3268 /* Get storage for each command. */
3269 commands = XALLOCAVEC (struct command, n_commands);
3271 /* Split argbuf into its separate piped processes,
3272 and record info about each one.
3273 Also search for the programs that are to be run. */
3275 argbuf.safe_push (0);
3277 commands[0].prog = argbuf[0]; /* first command. */
3278 commands[0].argv = argbuf.address ();
3280 if (!wrapper_string)
3282 string = find_a_program(commands[0].prog);
3283 if (string)
3284 commands[0].argv[0] = string;
3287 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3288 if (arg && strcmp (arg, "|") == 0)
3289 { /* each command. */
3290 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3291 fatal_error (input_location, "%<-pipe%> not supported");
3292 #endif
3293 argbuf[i] = 0; /* Termination of command args. */
3294 commands[n_commands].prog = argbuf[i + 1];
3295 commands[n_commands].argv
3296 = &(argbuf.address ())[i + 1];
3297 string = find_a_program(commands[n_commands].prog);
3298 if (string)
3299 commands[n_commands].argv[0] = string;
3300 n_commands++;
3303 /* If -v, print what we are about to do, and maybe query. */
3305 if (verbose_flag)
3307 /* For help listings, put a blank line between sub-processes. */
3308 if (print_help_list)
3309 fputc ('\n', stderr);
3311 /* Print each piped command as a separate line. */
3312 for (i = 0; i < n_commands; i++)
3314 const char *const *j;
3316 if (verbose_only_flag)
3318 for (j = commands[i].argv; *j; j++)
3320 const char *p;
3321 for (p = *j; *p; ++p)
3322 if (!ISALNUM ((unsigned char) *p)
3323 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
3324 break;
3325 if (*p || !*j)
3327 fprintf (stderr, " \"");
3328 for (p = *j; *p; ++p)
3330 if (*p == '"' || *p == '\\' || *p == '$')
3331 fputc ('\\', stderr);
3332 fputc (*p, stderr);
3334 fputc ('"', stderr);
3336 /* If it's empty, print "". */
3337 else if (!**j)
3338 fprintf (stderr, " \"\"");
3339 else
3340 fprintf (stderr, " %s", *j);
3343 else
3344 for (j = commands[i].argv; *j; j++)
3345 /* If it's empty, print "". */
3346 if (!**j)
3347 fprintf (stderr, " \"\"");
3348 else
3349 fprintf (stderr, " %s", *j);
3351 /* Print a pipe symbol after all but the last command. */
3352 if (i + 1 != n_commands)
3353 fprintf (stderr, " |");
3354 fprintf (stderr, "\n");
3356 fflush (stderr);
3357 if (verbose_only_flag != 0)
3359 /* verbose_only_flag should act as if the spec was
3360 executed, so increment execution_count before
3361 returning. This prevents spurious warnings about
3362 unused linker input files, etc. */
3363 execution_count++;
3364 return 0;
3366 #ifdef DEBUG
3367 fnotice (stderr, "\nGo ahead? (y or n) ");
3368 fflush (stderr);
3369 i = getchar ();
3370 if (i != '\n')
3371 while (getchar () != '\n')
3374 if (i != 'y' && i != 'Y')
3375 return 0;
3376 #endif /* DEBUG */
3379 #ifdef ENABLE_VALGRIND_CHECKING
3380 /* Run the each command through valgrind. To simplify prepending the
3381 path to valgrind and the option "-q" (for quiet operation unless
3382 something triggers), we allocate a separate argv array. */
3384 for (i = 0; i < n_commands; i++)
3386 const char **argv;
3387 int argc;
3388 int j;
3390 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3393 argv = XALLOCAVEC (const char *, argc + 3);
3395 argv[0] = VALGRIND_PATH;
3396 argv[1] = "-q";
3397 for (j = 2; j < argc + 2; j++)
3398 argv[j] = commands[i].argv[j - 2];
3399 argv[j] = NULL;
3401 commands[i].argv = argv;
3402 commands[i].prog = argv[0];
3404 #endif
3406 /* Run each piped subprocess. */
3408 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3409 ? PEX_RECORD_TIMES : 0),
3410 progname, temp_filename);
3411 if (pex == NULL)
3412 fatal_error (input_location, "%<pex_init%> failed: %m");
3414 for (i = 0; i < n_commands; i++)
3416 const char *errmsg;
3417 int err;
3418 const char *string = commands[i].argv[0];
3420 errmsg = pex_run (pex,
3421 ((i + 1 == n_commands ? PEX_LAST : 0)
3422 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3423 string, CONST_CAST (char **, commands[i].argv),
3424 NULL, NULL, &err);
3425 if (errmsg != NULL)
3427 errno = err;
3428 fatal_error (input_location,
3429 err ? G_("cannot execute %qs: %s: %m")
3430 : G_("cannot execute %qs: %s"),
3431 string, errmsg);
3434 if (i && string != commands[i].prog)
3435 free (CONST_CAST (char *, string));
3438 execution_count++;
3440 /* Wait for all the subprocesses to finish. */
3443 int *statuses;
3444 struct pex_time *times = NULL;
3445 int ret_code = 0;
3447 statuses = XALLOCAVEC (int, n_commands);
3448 if (!pex_get_status (pex, n_commands, statuses))
3449 fatal_error (input_location, "failed to get exit status: %m");
3451 if (report_times || report_times_to_file)
3453 times = XALLOCAVEC (struct pex_time, n_commands);
3454 if (!pex_get_times (pex, n_commands, times))
3455 fatal_error (input_location, "failed to get process times: %m");
3458 pex_free (pex);
3460 for (i = 0; i < n_commands; ++i)
3462 int status = statuses[i];
3464 if (WIFSIGNALED (status))
3465 switch (WTERMSIG (status))
3467 case SIGINT:
3468 case SIGTERM:
3469 /* SIGQUIT and SIGKILL are not available on MinGW. */
3470 #ifdef SIGQUIT
3471 case SIGQUIT:
3472 #endif
3473 #ifdef SIGKILL
3474 case SIGKILL:
3475 #endif
3476 /* The user (or environment) did something to the
3477 inferior. Making this an ICE confuses the user into
3478 thinking there's a compiler bug. Much more likely is
3479 the user or OOM killer nuked it. */
3480 fatal_error (input_location,
3481 "%s signal terminated program %s",
3482 strsignal (WTERMSIG (status)),
3483 commands[i].prog);
3484 break;
3486 #ifdef SIGPIPE
3487 case SIGPIPE:
3488 /* SIGPIPE is a special case. It happens in -pipe mode
3489 when the compiler dies before the preprocessor is
3490 done, or the assembler dies before the compiler is
3491 done. There's generally been an error already, and
3492 this is just fallout. So don't generate another
3493 error unless we would otherwise have succeeded. */
3494 if (signal_count || greatest_status >= MIN_FATAL_STATUS)
3496 signal_count++;
3497 ret_code = -1;
3498 break;
3500 #endif
3501 /* FALLTHROUGH */
3503 default:
3504 /* The inferior failed to catch the signal. */
3505 internal_error_no_backtrace ("%s signal terminated program %s",
3506 strsignal (WTERMSIG (status)),
3507 commands[i].prog);
3509 else if (WIFEXITED (status)
3510 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3512 /* For ICEs in cc1, cc1obj, cc1plus see if it is
3513 reproducible or not. */
3514 const char *p;
3515 if (flag_report_bug
3516 && WEXITSTATUS (status) == ICE_EXIT_CODE
3517 && i == 0
3518 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR))
3519 && startswith (p + 1, "cc1"))
3520 try_generate_repro (commands[0].argv);
3521 if (WEXITSTATUS (status) > greatest_status)
3522 greatest_status = WEXITSTATUS (status);
3523 ret_code = -1;
3526 if (report_times || report_times_to_file)
3528 struct pex_time *pt = &times[i];
3529 double ut, st;
3531 ut = ((double) pt->user_seconds
3532 + (double) pt->user_microseconds / 1.0e6);
3533 st = ((double) pt->system_seconds
3534 + (double) pt->system_microseconds / 1.0e6);
3536 if (ut + st != 0)
3538 if (report_times)
3539 fnotice (stderr, "# %s %.2f %.2f\n",
3540 commands[i].prog, ut, st);
3542 if (report_times_to_file)
3544 int c = 0;
3545 const char *const *j;
3547 fprintf (report_times_to_file, "%g %g", ut, st);
3549 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3551 const char *p;
3552 for (p = *j; *p; ++p)
3553 if (*p == '"' || *p == '\\' || *p == '$'
3554 || ISSPACE (*p))
3555 break;
3557 if (*p)
3559 fprintf (report_times_to_file, " \"");
3560 for (p = *j; *p; ++p)
3562 if (*p == '"' || *p == '\\' || *p == '$')
3563 fputc ('\\', report_times_to_file);
3564 fputc (*p, report_times_to_file);
3566 fputc ('"', report_times_to_file);
3568 else
3569 fprintf (report_times_to_file, " %s", *j);
3572 fputc ('\n', report_times_to_file);
3578 if (commands[0].argv[0] != commands[0].prog)
3579 free (CONST_CAST (char *, commands[0].argv[0]));
3581 return ret_code;
3585 /* Find all the switches given to us
3586 and make a vector describing them.
3587 The elements of the vector are strings, one per switch given.
3588 If a switch uses following arguments, then the `part1' field
3589 is the switch itself and the `args' field
3590 is a null-terminated vector containing the following arguments.
3591 Bits in the `live_cond' field are:
3592 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3593 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3594 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3595 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored.
3596 SWITCH_KEEP_FOR_GCC to indicate that this switch, otherwise ignored,
3597 should be included in COLLECT_GCC_OPTIONS.
3598 in all do_spec calls afterwards. Used for %<S from self specs.
3599 The `known' field describes whether this is an internal switch.
3600 The `validated' field describes whether any spec has looked at this switch;
3601 if it remains false at the end of the run, the switch must be meaningless.
3602 The `ordering' field is used to temporarily mark switches that have to be
3603 kept in a specific order. */
3605 #define SWITCH_LIVE (1 << 0)
3606 #define SWITCH_FALSE (1 << 1)
3607 #define SWITCH_IGNORE (1 << 2)
3608 #define SWITCH_IGNORE_PERMANENTLY (1 << 3)
3609 #define SWITCH_KEEP_FOR_GCC (1 << 4)
3611 struct switchstr
3613 const char *part1;
3614 const char **args;
3615 unsigned int live_cond;
3616 bool known;
3617 bool validated;
3618 bool ordering;
3621 static struct switchstr *switches;
3623 static int n_switches;
3625 static int n_switches_alloc;
3627 /* Set to zero if -fcompare-debug is disabled, positive if it's
3628 enabled and we're running the first compilation, negative if it's
3629 enabled and we're running the second compilation. For most of the
3630 time, it's in the range -1..1, but it can be temporarily set to 2
3631 or 3 to indicate that the -fcompare-debug flags didn't come from
3632 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3633 variable, until a synthesized -fcompare-debug flag is added to the
3634 command line. */
3635 int compare_debug;
3637 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3638 int compare_debug_second;
3640 /* Set to the flags that should be passed to the second compilation in
3641 a -fcompare-debug compilation. */
3642 const char *compare_debug_opt;
3644 static struct switchstr *switches_debug_check[2];
3646 static int n_switches_debug_check[2];
3648 static int n_switches_alloc_debug_check[2];
3650 static char *debug_check_temp_file[2];
3652 /* Language is one of three things:
3654 1) The name of a real programming language.
3655 2) NULL, indicating that no one has figured out
3656 what it is yet.
3657 3) '*', indicating that the file should be passed
3658 to the linker. */
3659 struct infile
3661 const char *name;
3662 const char *language;
3663 struct compiler *incompiler;
3664 bool compiled;
3665 bool preprocessed;
3668 /* Also a vector of input files specified. */
3670 static struct infile *infiles;
3672 int n_infiles;
3674 static int n_infiles_alloc;
3676 /* True if undefined environment variables encountered during spec processing
3677 are ok to ignore, typically when we're running for --help or --version. */
3679 static bool spec_undefvar_allowed;
3681 /* True if multiple input files are being compiled to a single
3682 assembly file. */
3684 static bool combine_inputs;
3686 /* This counts the number of libraries added by lang_specific_driver, so that
3687 we can tell if there were any user supplied any files or libraries. */
3689 static int added_libraries;
3691 /* And a vector of corresponding output files is made up later. */
3693 const char **outfiles;
3695 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3697 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3698 is true if we should look for an executable suffix. DO_OBJ
3699 is true if we should look for an object suffix. */
3701 static const char *
3702 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3703 int do_obj ATTRIBUTE_UNUSED)
3705 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3706 int i;
3707 #endif
3708 int len;
3710 if (name == NULL)
3711 return NULL;
3713 len = strlen (name);
3715 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3716 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3717 if (do_obj && len > 2
3718 && name[len - 2] == '.'
3719 && name[len - 1] == 'o')
3721 obstack_grow (&obstack, name, len - 2);
3722 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3723 name = XOBFINISH (&obstack, const char *);
3725 #endif
3727 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3728 /* If there is no filetype, make it the executable suffix (which includes
3729 the "."). But don't get confused if we have just "-o". */
3730 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || not_actual_file_p (name))
3731 return name;
3733 for (i = len - 1; i >= 0; i--)
3734 if (IS_DIR_SEPARATOR (name[i]))
3735 break;
3737 for (i++; i < len; i++)
3738 if (name[i] == '.')
3739 return name;
3741 obstack_grow (&obstack, name, len);
3742 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3743 strlen (TARGET_EXECUTABLE_SUFFIX));
3744 name = XOBFINISH (&obstack, const char *);
3745 #endif
3747 return name;
3749 #endif
3751 /* Display the command line switches accepted by gcc. */
3752 static void
3753 display_help (void)
3755 printf (_("Usage: %s [options] file...\n"), progname);
3756 fputs (_("Options:\n"), stdout);
3758 fputs (_(" -pass-exit-codes Exit with highest error code from a phase.\n"), stdout);
3759 fputs (_(" --help Display this information.\n"), stdout);
3760 fputs (_(" --target-help Display target specific command line options "
3761 "(including assembler and linker options).\n"), stdout);
3762 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"), stdout);
3763 fputs (_(" Display specific types of command line options.\n"), stdout);
3764 if (! verbose_flag)
3765 fputs (_(" (Use '-v --help' to display command line options of sub-processes).\n"), stdout);
3766 fputs (_(" --version Display compiler version information.\n"), stdout);
3767 fputs (_(" -dumpspecs Display all of the built in spec strings.\n"), stdout);
3768 fputs (_(" -dumpversion Display the version of the compiler.\n"), stdout);
3769 fputs (_(" -dumpmachine Display the compiler's target processor.\n"), stdout);
3770 fputs (_(" -foffload=<targets> Specify offloading targets.\n"), stdout);
3771 fputs (_(" -print-search-dirs Display the directories in the compiler's search path.\n"), stdout);
3772 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library.\n"), stdout);
3773 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>.\n"), stdout);
3774 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n"), stdout);
3775 fputs (_("\
3776 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3777 a component in the library path.\n"), stdout);
3778 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc.\n"), stdout);
3779 fputs (_("\
3780 -print-multi-lib Display the mapping between command line options and\n\
3781 multiple library search directories.\n"), stdout);
3782 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries.\n"), stdout);
3783 fputs (_(" -print-sysroot Display the target libraries directory.\n"), stdout);
3784 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"), stdout);
3785 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler.\n"), stdout);
3786 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n"), stdout);
3787 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker.\n"), stdout);
3788 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler.\n"), stdout);
3789 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n"), stdout);
3790 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker.\n"), stdout);
3791 fputs (_(" -save-temps Do not delete intermediate files.\n"), stdout);
3792 fputs (_(" -save-temps=<arg> Do not delete intermediate files.\n"), stdout);
3793 fputs (_("\
3794 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3795 prefixes to other gcc components.\n"), stdout);
3796 fputs (_(" -pipe Use pipes rather than intermediate files.\n"), stdout);
3797 fputs (_(" -time Time the execution of each subprocess.\n"), stdout);
3798 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>.\n"), stdout);
3799 fputs (_(" -std=<standard> Assume that the input sources are for <standard>.\n"), stdout);
3800 fputs (_("\
3801 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3802 and libraries.\n"), stdout);
3803 fputs (_(" -B <directory> Add <directory> to the compiler's search paths.\n"), stdout);
3804 fputs (_(" -v Display the programs invoked by the compiler.\n"), stdout);
3805 fputs (_(" -### Like -v but options quoted and commands not executed.\n"), stdout);
3806 fputs (_(" -E Preprocess only; do not compile, assemble or link.\n"), stdout);
3807 fputs (_(" -S Compile only; do not assemble or link.\n"), stdout);
3808 fputs (_(" -c Compile and assemble, but do not link.\n"), stdout);
3809 fputs (_(" -o <file> Place the output into <file>.\n"), stdout);
3810 fputs (_(" -pie Create a dynamically linked position independent\n\
3811 executable.\n"), stdout);
3812 fputs (_(" -shared Create a shared library.\n"), stdout);
3813 fputs (_("\
3814 -x <language> Specify the language of the following input files.\n\
3815 Permissible languages include: c c++ assembler none\n\
3816 'none' means revert to the default behavior of\n\
3817 guessing the language based on the file's extension.\n\
3818 "), stdout);
3820 printf (_("\
3821 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3822 passed on to the various sub-processes invoked by %s. In order to pass\n\
3823 other options on to these processes the -W<letter> options must be used.\n\
3824 "), progname);
3826 /* The rest of the options are displayed by invocations of the various
3827 sub-processes. */
3830 static void
3831 add_preprocessor_option (const char *option, int len)
3833 preprocessor_options.safe_push (save_string (option, len));
3836 static void
3837 add_assembler_option (const char *option, int len)
3839 assembler_options.safe_push (save_string (option, len));
3842 static void
3843 add_linker_option (const char *option, int len)
3845 linker_options.safe_push (save_string (option, len));
3848 /* Allocate space for an input file in infiles. */
3850 static void
3851 alloc_infile (void)
3853 if (n_infiles_alloc == 0)
3855 n_infiles_alloc = 16;
3856 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3858 else if (n_infiles_alloc == n_infiles)
3860 n_infiles_alloc *= 2;
3861 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3865 /* Store an input file with the given NAME and LANGUAGE in
3866 infiles. */
3868 static void
3869 add_infile (const char *name, const char *language)
3871 alloc_infile ();
3872 infiles[n_infiles].name = name;
3873 infiles[n_infiles++].language = language;
3876 /* Allocate space for a switch in switches. */
3878 static void
3879 alloc_switch (void)
3881 if (n_switches_alloc == 0)
3883 n_switches_alloc = 16;
3884 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3886 else if (n_switches_alloc == n_switches)
3888 n_switches_alloc *= 2;
3889 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3893 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3894 as validated if VALIDATED and KNOWN if it is an internal switch. */
3896 static void
3897 save_switch (const char *opt, size_t n_args, const char *const *args,
3898 bool validated, bool known)
3900 alloc_switch ();
3901 switches[n_switches].part1 = opt + 1;
3902 if (n_args == 0)
3903 switches[n_switches].args = 0;
3904 else
3906 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3907 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3908 switches[n_switches].args[n_args] = NULL;
3911 switches[n_switches].live_cond = 0;
3912 switches[n_switches].validated = validated;
3913 switches[n_switches].known = known;
3914 switches[n_switches].ordering = 0;
3915 n_switches++;
3918 /* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3919 not set already. */
3921 static void
3922 set_source_date_epoch_envvar ()
3924 /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3925 of 64 bit integers. */
3926 char source_date_epoch[21];
3927 time_t tt;
3929 errno = 0;
3930 tt = time (NULL);
3931 if (tt < (time_t) 0 || errno != 0)
3932 tt = (time_t) 0;
3934 snprintf (source_date_epoch, 21, "%llu", (unsigned long long) tt);
3935 /* Using setenv instead of xputenv because we want the variable to remain
3936 after finalizing so that it's still set in the second run when using
3937 -fcompare-debug. */
3938 setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0);
3941 /* Handle an option DECODED that is unknown to the option-processing
3942 machinery. */
3944 static bool
3945 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3947 const char *opt = decoded->arg;
3948 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3949 && !(decoded->errors & CL_ERR_NEGATIVE))
3951 /* Leave unknown -Wno-* options for the compiler proper, to be
3952 diagnosed only if there are warnings. */
3953 save_switch (decoded->canonical_option[0],
3954 decoded->canonical_option_num_elements - 1,
3955 &decoded->canonical_option[1], false, true);
3956 return false;
3958 if (decoded->opt_index == OPT_SPECIAL_unknown)
3960 /* Give it a chance to define it a spec file. */
3961 save_switch (decoded->canonical_option[0],
3962 decoded->canonical_option_num_elements - 1,
3963 &decoded->canonical_option[1], false, false);
3964 return false;
3966 else
3967 return true;
3970 /* Handle an option DECODED that is not marked as CL_DRIVER.
3971 LANG_MASK will always be CL_DRIVER. */
3973 static void
3974 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3975 unsigned int lang_mask ATTRIBUTE_UNUSED)
3977 /* At this point, non-driver options are accepted (and expected to
3978 be passed down by specs) unless marked to be rejected by the
3979 driver. Options to be rejected by the driver but accepted by the
3980 compilers proper are treated just like completely unknown
3981 options. */
3982 const struct cl_option *option = &cl_options[decoded->opt_index];
3984 if (option->cl_reject_driver)
3985 error ("aaunrecognized command-line option %qs",
3986 decoded->orig_option_with_args_text);
3987 else
3988 save_switch (decoded->canonical_option[0],
3989 decoded->canonical_option_num_elements - 1,
3990 &decoded->canonical_option[1], false, true);
3993 static const char *spec_lang = 0;
3994 static int last_language_n_infiles;
3997 /* Check that GCC is configured to support the offload target. */
3999 static bool
4000 check_offload_target_name (const char *target, ptrdiff_t len)
4002 const char *n, *c = OFFLOAD_TARGETS;
4003 while (c)
4005 n = strchr (c, ',');
4006 if (n == NULL)
4007 n = strchr (c, '\0');
4008 if (len == n - c && strncmp (target, c, n - c) == 0)
4009 break;
4010 c = *n ? n + 1 : NULL;
4012 if (!c)
4014 auto_vec<const char*> candidates;
4015 size_t olen = strlen (OFFLOAD_TARGETS) + 1;
4016 char *cand = XALLOCAVEC (char, olen);
4017 memcpy (cand, OFFLOAD_TARGETS, olen);
4018 for (c = strtok (cand, ","); c; c = strtok (NULL, ","))
4019 candidates.safe_push (c);
4020 candidates.safe_push ("default");
4021 candidates.safe_push ("disable");
4023 char *target2 = XALLOCAVEC (char, len + 1);
4024 memcpy (target2, target, len);
4025 target2[len] = '\0';
4027 error ("GCC is not configured to support %qs as %<-foffload=%> argument",
4028 target2);
4030 char *s;
4031 const char *hint = candidates_list_and_hint (target2, s, candidates);
4032 if (hint)
4033 inform (UNKNOWN_LOCATION,
4034 "valid %<-foffload=%> arguments are: %s; "
4035 "did you mean %qs?", s, hint);
4036 else
4037 inform (UNKNOWN_LOCATION, "valid %<-foffload=%> arguments are: %s", s);
4038 XDELETEVEC (s);
4039 return false;
4041 return true;
4044 /* Sanity check for -foffload-options. */
4046 static void
4047 check_foffload_target_names (const char *arg)
4049 const char *cur, *next, *end;
4050 /* If option argument starts with '-' then no target is specified and we
4051 do not need to parse it. */
4052 if (arg[0] == '-')
4053 return;
4054 end = strchr (arg, '=');
4055 if (end == NULL)
4057 error ("%<=%>options missing after %<-foffload-options=%>target");
4058 return;
4061 cur = arg;
4062 while (cur < end)
4064 next = strchr (cur, ',');
4065 if (next == NULL)
4066 next = end;
4067 next = (next > end) ? end : next;
4069 /* Retain non-supported targets after printing an error as those will not
4070 be processed; each enabled target only processes its triplet. */
4071 check_offload_target_name (cur, next - cur);
4072 cur = next + 1;
4076 /* Parse -foffload option argument. */
4078 static void
4079 handle_foffload_option (const char *arg)
4081 const char *c, *cur, *n, *next, *end;
4082 char *target;
4084 /* If option argument starts with '-' then no target is specified and we
4085 do not need to parse it. */
4086 if (arg[0] == '-')
4087 return;
4089 end = strchr (arg, '=');
4090 if (end == NULL)
4091 end = strchr (arg, '\0');
4092 cur = arg;
4094 while (cur < end)
4096 next = strchr (cur, ',');
4097 if (next == NULL)
4098 next = end;
4099 next = (next > end) ? end : next;
4101 target = XNEWVEC (char, next - cur + 1);
4102 memcpy (target, cur, next - cur);
4103 target[next - cur] = '\0';
4105 /* Reset offloading list and continue. */
4106 if (strcmp (target, "default") == 0)
4108 free (offload_targets);
4109 offload_targets = NULL;
4110 goto next_item;
4113 /* If 'disable' is passed to the option, clean the list of
4114 offload targets and return, even if more targets follow.
4115 Likewise if GCC is not configured to support that offload target. */
4116 if (strcmp (target, "disable") == 0
4117 || !check_offload_target_name (target, next - cur))
4119 free (offload_targets);
4120 offload_targets = xstrdup ("");
4121 return;
4124 if (!offload_targets)
4126 offload_targets = target;
4127 target = NULL;
4129 else
4131 /* Check that the target hasn't already presented in the list. */
4132 c = offload_targets;
4135 n = strchr (c, ':');
4136 if (n == NULL)
4137 n = strchr (c, '\0');
4139 if (next - cur == n - c && strncmp (c, target, n - c) == 0)
4140 break;
4142 c = n + 1;
4144 while (*n);
4146 /* If duplicate is not found, append the target to the list. */
4147 if (c > n)
4149 size_t offload_targets_len = strlen (offload_targets);
4150 offload_targets
4151 = XRESIZEVEC (char, offload_targets,
4152 offload_targets_len + 1 + next - cur + 1);
4153 offload_targets[offload_targets_len++] = ':';
4154 memcpy (offload_targets + offload_targets_len, target, next - cur + 1);
4157 next_item:
4158 cur = next + 1;
4159 XDELETEVEC (target);
4163 /* Handle a driver option; arguments and return value as for
4164 handle_option. */
4166 static bool
4167 driver_handle_option (struct gcc_options *opts,
4168 struct gcc_options *opts_set,
4169 const struct cl_decoded_option *decoded,
4170 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
4171 location_t loc,
4172 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
4173 diagnostic_context *dc,
4174 void (*) (void))
4176 size_t opt_index = decoded->opt_index;
4177 const char *arg = decoded->arg;
4178 const char *compare_debug_replacement_opt;
4179 const char* orig = decoded->orig_option_with_args_text;
4180 int value = decoded->value;
4181 bool validated = false;
4182 bool do_save = true;
4184 gcc_assert (opts == &global_options);
4185 gcc_assert (opts_set == &global_options_set);
4186 gcc_assert (kind == DK_UNSPECIFIED);
4187 gcc_assert (loc == UNKNOWN_LOCATION);
4188 gcc_assert (dc == global_dc);
4190 switch (opt_index)
4192 case OPT_dumpspecs:
4194 struct spec_list *sl;
4195 init_spec ();
4196 for (sl = specs; sl; sl = sl->next)
4197 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
4198 if (link_command_spec)
4199 printf ("*link_command:\n%s\n\n", link_command_spec);
4200 exit (0);
4203 case OPT_dumpversion:
4204 printf ("%s\n", spec_version);
4205 exit (0);
4207 case OPT_dumpmachine:
4208 printf ("%s\n", spec_machine);
4209 exit (0);
4211 case OPT_dumpfullversion:
4212 printf ("%s\n", BASEVER);
4213 exit (0);
4215 case OPT__version:
4216 print_version = 1;
4218 /* CPP driver cannot obtain switch from cc1_options. */
4219 if (is_cpp_driver)
4220 add_preprocessor_option ("--version", strlen ("--version"));
4221 add_assembler_option ("--version", strlen ("--version"));
4222 add_linker_option ("--version", strlen ("--version"));
4223 break;
4225 case OPT__completion_:
4226 validated = true;
4227 completion = decoded->arg;
4228 break;
4230 case OPT__help:
4231 print_help_list = 1;
4233 /* CPP driver cannot obtain switch from cc1_options. */
4234 if (is_cpp_driver)
4235 add_preprocessor_option ("--help", 6);
4236 add_assembler_option ("--help", 6);
4237 add_linker_option ("--help", 6);
4238 break;
4240 case OPT__help_:
4241 print_subprocess_help = 2;
4242 break;
4244 case OPT__obj_ext_:
4245 validated = true;
4246 add_preprocessor_option (orig, strlen (orig));
4247 break;
4249 case OPT__target_help:
4250 print_subprocess_help = 1;
4252 /* CPP driver cannot obtain switch from cc1_options. */
4253 if (is_cpp_driver)
4254 add_preprocessor_option ("--target-help", 13);
4255 add_assembler_option ("--target-help", 13);
4256 add_linker_option ("--target-help", 13);
4257 break;
4259 case OPT__no_sysroot_suffix:
4260 case OPT_pass_exit_codes:
4261 case OPT_print_search_dirs:
4262 case OPT_print_file_name_:
4263 case OPT_print_prog_name_:
4264 case OPT_print_multi_lib:
4265 case OPT_print_multi_directory:
4266 case OPT_print_sysroot:
4267 case OPT_print_multi_os_directory:
4268 case OPT_print_multiarch:
4269 case OPT_print_sysroot_headers_suffix:
4270 case OPT_time:
4271 case OPT_wrapper:
4272 /* These options set the variables specified in common.opt
4273 automatically, and do not need to be saved for spec
4274 processing. */
4275 do_save = false;
4276 break;
4278 case OPT_print_libgcc_file_name:
4279 print_file_name = "libgcc.a";
4280 do_save = false;
4281 break;
4283 case OPT_fuse_ld_bfd:
4284 use_ld = ".bfd";
4285 break;
4287 case OPT_fuse_ld_gold:
4288 use_ld = ".gold";
4289 break;
4291 case OPT_fuse_ld_mold:
4292 use_ld = ".mold";
4293 break;
4295 case OPT_fcompare_debug_second:
4296 compare_debug_second = 1;
4297 break;
4299 case OPT_fcompare_debug:
4300 switch (value)
4302 case 0:
4303 compare_debug_replacement_opt = "-fcompare-debug=";
4304 arg = "";
4305 goto compare_debug_with_arg;
4307 case 1:
4308 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
4309 arg = "-gtoggle";
4310 goto compare_debug_with_arg;
4312 default:
4313 gcc_unreachable ();
4315 break;
4317 case OPT_fcompare_debug_:
4318 compare_debug_replacement_opt = decoded->canonical_option[0];
4319 compare_debug_with_arg:
4320 gcc_assert (decoded->canonical_option_num_elements == 1);
4321 gcc_assert (arg != NULL);
4322 if (*arg)
4323 compare_debug = 1;
4324 else
4325 compare_debug = -1;
4326 if (compare_debug < 0)
4327 compare_debug_opt = NULL;
4328 else
4329 compare_debug_opt = arg;
4330 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
4331 set_source_date_epoch_envvar ();
4332 return true;
4334 case OPT_fdiagnostics_color_:
4335 diagnostic_color_init (dc, value);
4336 break;
4338 case OPT_fdiagnostics_urls_:
4339 diagnostic_urls_init (dc, value);
4340 break;
4342 case OPT_fdiagnostics_format_:
4343 diagnostic_output_format_init (dc,
4344 (enum diagnostics_output_format)value);
4345 break;
4347 case OPT_Wa_:
4349 int prev, j;
4350 /* Pass the rest of this option to the assembler. */
4352 /* Split the argument at commas. */
4353 prev = 0;
4354 for (j = 0; arg[j]; j++)
4355 if (arg[j] == ',')
4357 add_assembler_option (arg + prev, j - prev);
4358 prev = j + 1;
4361 /* Record the part after the last comma. */
4362 add_assembler_option (arg + prev, j - prev);
4364 do_save = false;
4365 break;
4367 case OPT_Wp_:
4369 int prev, j;
4370 /* Pass the rest of this option to the preprocessor. */
4372 /* Split the argument at commas. */
4373 prev = 0;
4374 for (j = 0; arg[j]; j++)
4375 if (arg[j] == ',')
4377 add_preprocessor_option (arg + prev, j - prev);
4378 prev = j + 1;
4381 /* Record the part after the last comma. */
4382 add_preprocessor_option (arg + prev, j - prev);
4384 do_save = false;
4385 break;
4387 case OPT_Wl_:
4389 int prev, j;
4390 /* Split the argument at commas. */
4391 prev = 0;
4392 for (j = 0; arg[j]; j++)
4393 if (arg[j] == ',')
4395 add_infile (save_string (arg + prev, j - prev), "*");
4396 prev = j + 1;
4398 /* Record the part after the last comma. */
4399 add_infile (arg + prev, "*");
4401 do_save = false;
4402 break;
4404 case OPT_Xlinker:
4405 add_infile (arg, "*");
4406 do_save = false;
4407 break;
4409 case OPT_Xpreprocessor:
4410 add_preprocessor_option (arg, strlen (arg));
4411 do_save = false;
4412 break;
4414 case OPT_Xassembler:
4415 add_assembler_option (arg, strlen (arg));
4416 do_save = false;
4417 break;
4419 case OPT_l:
4420 /* POSIX allows separation of -l and the lib arg; canonicalize
4421 by concatenating -l with its arg */
4422 add_infile (concat ("-l", arg, NULL), "*");
4423 do_save = false;
4424 break;
4426 case OPT_L:
4427 /* Similarly, canonicalize -L for linkers that may not accept
4428 separate arguments. */
4429 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
4430 return true;
4432 case OPT_F:
4433 /* Likewise -F. */
4434 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
4435 return true;
4437 case OPT_save_temps:
4438 if (!save_temps_flag)
4439 save_temps_flag = SAVE_TEMPS_DUMP;
4440 validated = true;
4441 break;
4443 case OPT_save_temps_:
4444 if (strcmp (arg, "cwd") == 0)
4445 save_temps_flag = SAVE_TEMPS_CWD;
4446 else if (strcmp (arg, "obj") == 0
4447 || strcmp (arg, "object") == 0)
4448 save_temps_flag = SAVE_TEMPS_OBJ;
4449 else
4450 fatal_error (input_location, "%qs is an unknown %<-save-temps%> option",
4451 decoded->orig_option_with_args_text);
4452 save_temps_overrides_dumpdir = true;
4453 break;
4455 case OPT_dumpdir:
4456 free (dumpdir);
4457 dumpdir = xstrdup (arg);
4458 save_temps_overrides_dumpdir = false;
4459 break;
4461 case OPT_dumpbase:
4462 free (dumpbase);
4463 dumpbase = xstrdup (arg);
4464 break;
4466 case OPT_dumpbase_ext:
4467 free (dumpbase_ext);
4468 dumpbase_ext = xstrdup (arg);
4469 break;
4471 case OPT_no_canonical_prefixes:
4472 /* Already handled as a special case, so ignored here. */
4473 do_save = false;
4474 break;
4476 case OPT_pipe:
4477 validated = true;
4478 /* These options set the variables specified in common.opt
4479 automatically, but do need to be saved for spec
4480 processing. */
4481 break;
4483 case OPT_specs_:
4485 struct user_specs *user = XNEW (struct user_specs);
4487 user->next = (struct user_specs *) 0;
4488 user->filename = arg;
4489 if (user_specs_tail)
4490 user_specs_tail->next = user;
4491 else
4492 user_specs_head = user;
4493 user_specs_tail = user;
4495 validated = true;
4496 break;
4498 case OPT__sysroot_:
4499 target_system_root = arg;
4500 target_system_root_changed = 1;
4501 /* Saving this option is useful to let self-specs decide to
4502 provide a default one. */
4503 do_save = true;
4504 validated = true;
4505 break;
4507 case OPT_time_:
4508 if (report_times_to_file)
4509 fclose (report_times_to_file);
4510 report_times_to_file = fopen (arg, "a");
4511 do_save = false;
4512 break;
4514 case OPT____:
4515 /* "-###"
4516 This is similar to -v except that there is no execution
4517 of the commands and the echoed arguments are quoted. It
4518 is intended for use in shell scripts to capture the
4519 driver-generated command line. */
4520 verbose_only_flag++;
4521 verbose_flag = 1;
4522 do_save = false;
4523 break;
4525 case OPT_B:
4527 size_t len = strlen (arg);
4529 /* Catch the case where the user has forgotten to append a
4530 directory separator to the path. Note, they may be using
4531 -B to add an executable name prefix, eg "i386-elf-", in
4532 order to distinguish between multiple installations of
4533 GCC in the same directory. Hence we must check to see
4534 if appending a directory separator actually makes a
4535 valid directory name. */
4536 if (!IS_DIR_SEPARATOR (arg[len - 1])
4537 && is_directory (arg, false))
4539 char *tmp = XNEWVEC (char, len + 2);
4540 strcpy (tmp, arg);
4541 tmp[len] = DIR_SEPARATOR;
4542 tmp[++len] = 0;
4543 arg = tmp;
4546 add_prefix (&exec_prefixes, arg, NULL,
4547 PREFIX_PRIORITY_B_OPT, 0, 0);
4548 add_prefix (&startfile_prefixes, arg, NULL,
4549 PREFIX_PRIORITY_B_OPT, 0, 0);
4550 add_prefix (&include_prefixes, arg, NULL,
4551 PREFIX_PRIORITY_B_OPT, 0, 0);
4553 validated = true;
4554 break;
4556 case OPT_E:
4557 have_E = true;
4558 break;
4560 case OPT_x:
4561 spec_lang = arg;
4562 if (!strcmp (spec_lang, "none"))
4563 /* Suppress the warning if -xnone comes after the last input
4564 file, because alternate command interfaces like g++ might
4565 find it useful to place -xnone after each input file. */
4566 spec_lang = 0;
4567 else
4568 last_language_n_infiles = n_infiles;
4569 do_save = false;
4570 break;
4572 case OPT_o:
4573 have_o = 1;
4574 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4575 arg = convert_filename (arg, ! have_c, 0);
4576 #endif
4577 output_file = arg;
4578 /* On some systems, ld cannot handle "-o" without a space. So
4579 split the option from its argument. */
4580 save_switch ("-o", 1, &arg, validated, true);
4581 return true;
4583 #ifdef ENABLE_DEFAULT_PIE
4584 case OPT_pie:
4585 /* -pie is turned on by default. */
4586 #endif
4588 case OPT_static_libgcc:
4589 case OPT_shared_libgcc:
4590 case OPT_static_libgfortran:
4591 case OPT_static_libphobos:
4592 case OPT_static_libstdc__:
4593 /* These are always valid, since gcc.cc itself understands the
4594 first two, gfortranspec.cc understands -static-libgfortran,
4595 d-spec.cc understands -static-libphobos, and g++spec.cc
4596 understands -static-libstdc++ */
4597 validated = true;
4598 break;
4600 /// sdcpp case OPT_fwpa:
4601 /// sdcpp flag_wpa = "";
4602 /// sdcpp break;
4604 case OPT_foffload_options_:
4605 check_foffload_target_names (arg);
4606 break;
4608 case OPT_foffload_:
4609 handle_foffload_option (arg);
4610 if (arg[0] == '-' || NULL != strchr (arg, '='))
4611 save_switch (concat ("-foffload-options=", arg, NULL),
4612 0, NULL, validated, true);
4613 do_save = false;
4614 break;
4616 default:
4617 /* Various driver options need no special processing at this
4618 point, having been handled in a prescan above or being
4619 handled by specs. */
4620 break;
4623 if (do_save)
4624 save_switch (decoded->canonical_option[0],
4625 decoded->canonical_option_num_elements - 1,
4626 &decoded->canonical_option[1], validated, true);
4627 return true;
4630 /* Return true if F2 is F1 followed by a single suffix, i.e., by a
4631 period and additional characters other than a period. */
4633 static inline bool
4634 adds_single_suffix_p (const char *f2, const char *f1)
4636 size_t len = strlen (f1);
4638 return (strncmp (f1, f2, len) == 0
4639 && f2[len] == '.'
4640 && strchr (f2 + len + 1, '.') == NULL);
4643 /* Put the driver's standard set of option handlers in *HANDLERS. */
4645 static void
4646 set_option_handlers (struct cl_option_handlers *handlers)
4648 handlers->unknown_option_callback = driver_unknown_option_callback;
4649 handlers->wrong_lang_callback = driver_wrong_lang_callback;
4650 handlers->num_handlers = 3;
4651 handlers->handlers[0].handler = driver_handle_option;
4652 handlers->handlers[0].mask = CL_DRIVER;
4653 handlers->handlers[1].handler = common_handle_option;
4654 handlers->handlers[1].mask = CL_COMMON;
4655 // sdcpp handlers->handlers[2].handler = target_handle_option;
4656 handlers->handlers[2].mask = CL_TARGET;
4660 /* Return the index into infiles for the single non-library
4661 non-lto-wpa input file, -1 if there isn't any, or -2 if there is
4662 more than one. */
4663 static inline int
4664 single_input_file_index ()
4666 int ret = -1;
4668 for (int i = 0; i < n_infiles; i++)
4670 if (infiles[i].language
4671 && (infiles[i].language[0] == '*'
4672 || (flag_wpa
4673 && strcmp (infiles[i].language, "lto") == 0)))
4674 continue;
4676 if (ret != -1)
4677 return -2;
4679 ret = i;
4682 return ret;
4685 /* Create the vector `switches' and its contents.
4686 Store its length in `n_switches'. */
4688 static void
4689 process_command (unsigned int decoded_options_count,
4690 struct cl_decoded_option *decoded_options)
4692 const char *temp;
4693 char *temp1;
4694 char *tooldir_prefix, *tooldir_prefix2;
4695 char *(*get_relative_prefix) (const char *, const char *,
4696 const char *) = NULL;
4697 struct cl_option_handlers handlers;
4698 unsigned int j;
4700 gcc_exec_prefix = env.get ("GCC_EXEC_PREFIX");
4702 n_switches = 0;
4703 n_infiles = 0;
4704 added_libraries = 0;
4706 /* Figure compiler version from version string. */
4708 compiler_version = temp1 = xstrdup (version_string);
4710 for (; *temp1; ++temp1)
4712 if (*temp1 == ' ')
4714 *temp1 = '\0';
4715 break;
4719 /* Handle any -no-canonical-prefixes flag early, to assign the function
4720 that builds relative prefixes. This function creates default search
4721 paths that are needed later in normal option handling. */
4723 for (j = 1; j < decoded_options_count; j++)
4725 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
4727 get_relative_prefix = make_relative_prefix_ignore_links;
4728 break;
4731 if (! get_relative_prefix)
4732 get_relative_prefix = make_relative_prefix;
4734 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
4735 see if we can create it from the pathname specified in
4736 decoded_options[0].arg. */
4738 gcc_libexec_prefix = standard_libexec_prefix;
4739 #ifndef VMS
4740 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
4741 if (!gcc_exec_prefix)
4743 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
4744 standard_bindir_prefix,
4745 standard_exec_prefix);
4746 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
4747 standard_bindir_prefix,
4748 standard_libexec_prefix);
4749 if (gcc_exec_prefix)
4750 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
4752 else
4754 /* make_relative_prefix requires a program name, but
4755 GCC_EXEC_PREFIX is typically a directory name with a trailing
4756 / (which is ignored by make_relative_prefix), so append a
4757 program name. */
4758 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
4759 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
4760 standard_exec_prefix,
4761 standard_libexec_prefix);
4763 /* The path is unrelocated, so fallback to the original setting. */
4764 if (!gcc_libexec_prefix)
4765 gcc_libexec_prefix = standard_libexec_prefix;
4767 free (tmp_prefix);
4769 #else
4770 #endif
4771 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4772 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4773 or an automatically created GCC_EXEC_PREFIX from
4774 decoded_options[0].arg. */
4776 /* Do language-specific adjustment/addition of flags. */
4777 lang_specific_driver (&decoded_options, &decoded_options_count,
4778 &added_libraries);
4780 if (gcc_exec_prefix)
4782 int len = strlen (gcc_exec_prefix);
4784 if (len > (int) sizeof ("/lib/gcc/") - 1
4785 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
4787 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
4788 if (IS_DIR_SEPARATOR (*temp)
4789 && filename_ncmp (temp + 1, "lib", 3) == 0
4790 && IS_DIR_SEPARATOR (temp[4])
4791 && filename_ncmp (temp + 5, "gcc", 3) == 0)
4792 len -= sizeof ("/lib/gcc/") - 1;
4795 set_std_prefix (gcc_exec_prefix, len);
4796 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
4797 PREFIX_PRIORITY_LAST, 0, 0);
4798 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
4799 PREFIX_PRIORITY_LAST, 0, 0);
4802 /* COMPILER_PATH and LIBRARY_PATH have values
4803 that are lists of directory names with colons. */
4805 temp = env.get ("COMPILER_PATH");
4806 if (temp)
4808 const char *startp, *endp;
4809 char *nstore = (char *) alloca (strlen (temp) + 3);
4811 startp = endp = temp;
4812 while (1)
4814 if (*endp == PATH_SEPARATOR || *endp == 0)
4816 strncpy (nstore, startp, endp - startp);
4817 if (endp == startp)
4818 strcpy (nstore, concat (".", dir_separator_str, NULL));
4819 else if (!IS_DIR_SEPARATOR (endp[-1]))
4821 nstore[endp - startp] = DIR_SEPARATOR;
4822 nstore[endp - startp + 1] = 0;
4824 else
4825 nstore[endp - startp] = 0;
4826 add_prefix (&exec_prefixes, nstore, 0,
4827 PREFIX_PRIORITY_LAST, 0, 0);
4828 add_prefix (&include_prefixes, nstore, 0,
4829 PREFIX_PRIORITY_LAST, 0, 0);
4830 if (*endp == 0)
4831 break;
4832 endp = startp = endp + 1;
4834 else
4835 endp++;
4839 temp = env.get (LIBRARY_PATH_ENV);
4840 if (temp && *cross_compile == '0')
4842 const char *startp, *endp;
4843 char *nstore = (char *) alloca (strlen (temp) + 3);
4845 startp = endp = temp;
4846 while (1)
4848 if (*endp == PATH_SEPARATOR || *endp == 0)
4850 strncpy (nstore, startp, endp - startp);
4851 if (endp == startp)
4852 strcpy (nstore, concat (".", dir_separator_str, NULL));
4853 else if (!IS_DIR_SEPARATOR (endp[-1]))
4855 nstore[endp - startp] = DIR_SEPARATOR;
4856 nstore[endp - startp + 1] = 0;
4858 else
4859 nstore[endp - startp] = 0;
4860 add_prefix (&startfile_prefixes, nstore, NULL,
4861 PREFIX_PRIORITY_LAST, 0, 1);
4862 if (*endp == 0)
4863 break;
4864 endp = startp = endp + 1;
4866 else
4867 endp++;
4871 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4872 temp = env.get ("LPATH");
4873 if (temp && *cross_compile == '0')
4875 const char *startp, *endp;
4876 char *nstore = (char *) alloca (strlen (temp) + 3);
4878 startp = endp = temp;
4879 while (1)
4881 if (*endp == PATH_SEPARATOR || *endp == 0)
4883 strncpy (nstore, startp, endp - startp);
4884 if (endp == startp)
4885 strcpy (nstore, concat (".", dir_separator_str, NULL));
4886 else if (!IS_DIR_SEPARATOR (endp[-1]))
4888 nstore[endp - startp] = DIR_SEPARATOR;
4889 nstore[endp - startp + 1] = 0;
4891 else
4892 nstore[endp - startp] = 0;
4893 add_prefix (&startfile_prefixes, nstore, NULL,
4894 PREFIX_PRIORITY_LAST, 0, 1);
4895 if (*endp == 0)
4896 break;
4897 endp = startp = endp + 1;
4899 else
4900 endp++;
4904 /* Process the options and store input files and switches in their
4905 vectors. */
4907 last_language_n_infiles = -1;
4909 set_option_handlers (&handlers);
4911 for (j = 1; j < decoded_options_count; j++)
4913 switch (decoded_options[j].opt_index)
4915 case OPT_S:
4916 case OPT_c:
4917 case OPT_E:
4918 have_c = 1;
4919 break;
4921 if (have_c)
4922 break;
4925 for (j = 1; j < decoded_options_count; j++)
4927 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4929 const char *arg = decoded_options[j].arg;
4931 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4932 arg = convert_filename (arg, 0, access (arg, F_OK));
4933 #endif
4934 add_infile (arg, spec_lang);
4936 continue;
4939 read_cmdline_option (&global_options, &global_options_set,
4940 decoded_options + j, UNKNOWN_LOCATION,
4941 CL_DRIVER, &handlers, global_dc);
4944 /* If the user didn't specify any, default to all configured offload
4945 targets. */
4946 if (ENABLE_OFFLOADING && offload_targets == NULL)
4948 handle_foffload_option (OFFLOAD_TARGETS);
4949 #if OFFLOAD_DEFAULTED
4950 offload_targets_default = true;
4951 #endif
4954 /* Handle -gtoggle as it would later in toplev.cc:process_options to
4955 make the debug-level-gt spec function work as expected. */
4956 if (flag_gtoggle)
4958 if (debug_info_level == DINFO_LEVEL_NONE)
4959 debug_info_level = DINFO_LEVEL_NORMAL;
4960 else
4961 debug_info_level = DINFO_LEVEL_NONE;
4964 if (output_file
4965 && strcmp (output_file, "-") != 0
4966 && strcmp (output_file, HOST_BIT_BUCKET) != 0)
4968 int i;
4969 for (i = 0; i < n_infiles; i++)
4970 if ((!infiles[i].language || infiles[i].language[0] != '*')
4971 && canonical_filename_eq (infiles[i].name, output_file))
4972 fatal_error (input_location,
4973 "input file %qs is the same as output file",
4974 output_file);
4977 if (output_file != NULL && output_file[0] == '\0')
4978 fatal_error (input_location, "output filename may not be empty");
4980 /* -dumpdir and -save-temps=* both specify the location of aux/dump
4981 outputs; the one that appears last prevails. When compiling
4982 multiple sources, an explicit dumpbase (minus -ext) may be
4983 combined with an explicit or implicit dumpdir, whereas when
4984 linking, a specified or implied link output name (minus
4985 extension) may be combined with a prevailing -save-temps=* or an
4986 otherwise implied dumpdir, but not override a prevailing
4987 -dumpdir. Primary outputs (e.g., linker output when linking
4988 without -o, or .i, .s or .o outputs when processing multiple
4989 inputs with -E, -S or -c, respectively) are NOT affected by these
4990 -save-temps=/-dump* options, always landing in the current
4991 directory and with the same basename as the input when an output
4992 name is not given, but when they're intermediate outputs, they
4993 are named like other aux outputs, so the options affect their
4994 location and name.
4996 Here are some examples. There are several more in the
4997 documentation of -o and -dump*, and some quite exhaustive tests
4998 in gcc.misc-tests/outputs.exp.
5000 When compiling any number of sources, no -dump* nor
5001 -save-temps=*, all outputs in cwd without prefix:
5003 # gcc -c b.c -gsplit-dwarf
5004 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
5006 # gcc -c b.c d.c -gsplit-dwarf
5007 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
5008 && cc1 [-dumpdir ./] -dumpbase d.c -dumpbase-ext .c # d.o d.dwo
5010 When compiling and linking, no -dump* nor -save-temps=*, .o
5011 outputs are temporary, aux outputs land in the dir of the output,
5012 prefixed with the basename of the linker output:
5014 # gcc b.c d.c -o ab -gsplit-dwarf
5015 -> cc1 -dumpdir ab- -dumpbase b.c -dumpbase-ext .c # ab-b.dwo
5016 && cc1 -dumpdir ab- -dumpbase d.c -dumpbase-ext .c # ab-d.dwo
5017 && link ... -o ab
5019 # gcc b.c d.c [-o a.out] -gsplit-dwarf
5020 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.dwo
5021 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.dwo
5022 && link ... [-o a.out]
5024 When compiling and linking, a prevailing -dumpdir fully overrides
5025 the prefix of aux outputs given by the output name:
5027 # gcc -dumpdir f b.c d.c -gsplit-dwarf [-o [dir/]whatever]
5028 -> cc1 -dumpdir f -dumpbase b.c -dumpbase-ext .c # fb.dwo
5029 && cc1 -dumpdir f -dumpbase d.c -dumpbase-ext .c # fd.dwo
5030 && link ... [-o whatever]
5032 When compiling multiple inputs, an explicit -dumpbase is combined
5033 with -dumpdir, affecting aux outputs, but not the .o outputs:
5035 # gcc -dumpdir f -dumpbase g- b.c d.c -gsplit-dwarf -c
5036 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # b.o fg-b.dwo
5037 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # d.o fg-d.dwo
5039 When compiling and linking with -save-temps, the .o outputs that
5040 would have been temporary become aux outputs, so they get
5041 affected by -dump* flags:
5043 # gcc -dumpdir f -dumpbase g- -save-temps b.c d.c
5044 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # fg-b.o
5045 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # fg-d.o
5046 && link
5048 If -save-temps=* prevails over -dumpdir, however, the explicit
5049 -dumpdir is discarded, as if it wasn't there. The basename of
5050 the implicit linker output, a.out or a.exe, becomes a- as the aux
5051 output prefix for all compilations:
5053 # gcc [-dumpdir f] -save-temps=cwd b.c d.c
5054 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.o
5055 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.o
5056 && link
5058 A single -dumpbase, applying to multiple inputs, overrides the
5059 linker output name, implied or explicit, as the aux output prefix:
5061 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c
5062 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5063 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5064 && link
5066 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c -o dir/h.out
5067 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5068 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
5069 && link -o dir/h.out
5071 Now, if the linker output is NOT overridden as a prefix, but
5072 -save-temps=* overrides implicit or explicit -dumpdir, the
5073 effective dump dir combines the dir selected by the -save-temps=*
5074 option with the basename of the specified or implied link output:
5076 # gcc [-dumpdir f] -save-temps=cwd b.c d.c -o dir/h.out
5077 -> cc1 -dumpdir h- -dumpbase b.c -dumpbase-ext .c # h-b.o
5078 && cc1 -dumpdir h- -dumpbase d.c -dumpbase-ext .c # h-d.o
5079 && link -o dir/h.out
5081 # gcc [-dumpdir f] -save-temps=obj b.c d.c -o dir/h.out
5082 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5083 && cc1 -dumpdir dir/h- -dumpbase d.c -dumpbase-ext .c # dir/h-d.o
5084 && link -o dir/h.out
5086 But then again, a single -dumpbase applying to multiple inputs
5087 gets used instead of the linker output basename in the combined
5088 dumpdir:
5090 # gcc [-dumpdir f] -dumpbase g- -save-temps=obj b.c d.c -o dir/h.out
5091 -> cc1 -dumpdir dir/g- -dumpbase b.c -dumpbase-ext .c # dir/g-b.o
5092 && cc1 -dumpdir dir/g- -dumpbase d.c -dumpbase-ext .c # dir/g-d.o
5093 && link -o dir/h.out
5095 With a single input being compiled, the output basename does NOT
5096 affect the dumpdir prefix.
5098 # gcc -save-temps=obj b.c -gsplit-dwarf -c -o dir/b.o
5099 -> cc1 -dumpdir dir/ -dumpbase b.c -dumpbase-ext .c # dir/b.o dir/b.dwo
5101 but when compiling and linking even a single file, it does:
5103 # gcc -save-temps=obj b.c -o dir/h.out
5104 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5106 unless an explicit -dumpdir prevails:
5108 # gcc -save-temps[=obj] -dumpdir g- b.c -o dir/h.out
5109 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5113 bool explicit_dumpdir = dumpdir;
5115 if ((!save_temps_overrides_dumpdir && explicit_dumpdir)
5116 || (output_file && not_actual_file_p (output_file)))
5118 /* Do nothing. */
5121 /* If -save-temps=obj and -o name, create the prefix to use for %b.
5122 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
5123 else if (save_temps_flag != SAVE_TEMPS_CWD && output_file != NULL)
5125 free (dumpdir);
5126 dumpdir = NULL;
5127 temp = lbasename (output_file);
5128 if (temp != output_file)
5129 dumpdir = xstrndup (output_file,
5130 strlen (output_file) - strlen (temp));
5132 else if (dumpdir)
5134 free (dumpdir);
5135 dumpdir = NULL;
5138 if (save_temps_flag)
5139 save_temps_flag = SAVE_TEMPS_DUMP;
5141 /* If there is any pathname component in an explicit -dumpbase, it
5142 overrides dumpdir entirely, so discard it right away. Although
5143 the presence of an explicit -dumpdir matters for the driver, it
5144 shouldn't matter for other processes, that get all that's needed
5145 from the -dumpdir and -dumpbase always passed to them. */
5146 if (dumpdir && dumpbase && lbasename (dumpbase) != dumpbase)
5148 free (dumpdir);
5149 dumpdir = NULL;
5152 /* Check that dumpbase_ext matches the end of dumpbase, drop it
5153 otherwise. */
5154 if (dumpbase_ext && dumpbase && *dumpbase)
5156 int lendb = strlen (dumpbase);
5157 int lendbx = strlen (dumpbase_ext);
5159 /* -dumpbase-ext must be a suffix proper; discard it if it
5160 matches all of -dumpbase, as that would make for an empty
5161 basename. */
5162 if (lendbx >= lendb
5163 || strcmp (dumpbase + lendb - lendbx, dumpbase_ext) != 0)
5165 free (dumpbase_ext);
5166 dumpbase_ext = NULL;
5170 /* -dumpbase with multiple sources goes into dumpdir. With a single
5171 source, it does only if linking and if dumpdir was not explicitly
5172 specified. */
5173 if (dumpbase && *dumpbase
5174 && (single_input_file_index () == -2
5175 || (!have_c && !explicit_dumpdir)))
5177 char *prefix;
5179 if (dumpbase_ext)
5180 /* We checked that they match above. */
5181 dumpbase[strlen (dumpbase) - strlen (dumpbase_ext)] = '\0';
5183 if (dumpdir)
5184 prefix = concat (dumpdir, dumpbase, "-", NULL);
5185 else
5186 prefix = concat (dumpbase, "-", NULL);
5188 free (dumpdir);
5189 free (dumpbase);
5190 free (dumpbase_ext);
5191 dumpbase = dumpbase_ext = NULL;
5192 dumpdir = prefix;
5193 dumpdir_trailing_dash_added = true;
5196 /* If dumpbase was not brought into dumpdir but we're linking, bring
5197 output_file into dumpdir unless dumpdir was explicitly specified.
5198 The test for !explicit_dumpdir is further below, because we want
5199 to use the obase computation for a ghost outbase, passed to
5200 GCC_COLLECT_OPTIONS. */
5201 else if (!have_c && (!explicit_dumpdir || (dumpbase && !*dumpbase)))
5203 /* If we get here, we know dumpbase was not specified, or it was
5204 specified as an empty string. If it was anything else, it
5205 would have combined with dumpdir above, because the condition
5206 for dumpbase to be used when present is broader than the
5207 condition that gets us here. */
5208 gcc_assert (!dumpbase || !*dumpbase);
5210 const char *obase;
5211 char *tofree = NULL;
5212 if (!output_file || not_actual_file_p (output_file))
5213 obase = "a";
5214 else
5216 obase = lbasename (output_file);
5217 size_t blen = strlen (obase), xlen;
5218 /* Drop the suffix if it's dumpbase_ext, if given,
5219 otherwise .exe or the target executable suffix, or if the
5220 output was explicitly named a.out, but not otherwise. */
5221 if (dumpbase_ext
5222 ? (blen > (xlen = strlen (dumpbase_ext))
5223 && strcmp ((temp = (obase + blen - xlen)),
5224 dumpbase_ext) == 0)
5225 : ((temp = strrchr (obase + 1, '.'))
5226 && (xlen = strlen (temp))
5227 && (strcmp (temp, ".exe") == 0
5228 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
5229 || strcmp (temp, TARGET_EXECUTABLE_SUFFIX) == 0
5230 #endif
5231 || strcmp (obase, "a.out") == 0)))
5233 tofree = xstrndup (obase, blen - xlen);
5234 obase = tofree;
5238 /* We wish to save this basename to the -dumpdir passed through
5239 GCC_COLLECT_OPTIONS within maybe_run_linker, for e.g. LTO,
5240 but we do NOT wish to add it to e.g. %b, so we keep
5241 outbase_length as zero. */
5242 gcc_assert (!outbase);
5243 outbase_length = 0;
5245 /* If we're building [dir1/]foo[.exe] out of a single input
5246 [dir2/]foo.c that shares the same basename, dump to
5247 [dir2/]foo.c.* rather than duplicating the basename into
5248 [dir2/]foo-foo.c.*. */
5249 int idxin;
5250 if (dumpbase
5251 || ((idxin = single_input_file_index ()) >= 0
5252 && adds_single_suffix_p (lbasename (infiles[idxin].name),
5253 obase)))
5255 if (obase == tofree)
5256 outbase = tofree;
5257 else
5259 outbase = xstrdup (obase);
5260 free (tofree);
5262 obase = tofree = NULL;
5264 else
5266 if (dumpdir)
5268 char *p = concat (dumpdir, obase, "-", NULL);
5269 free (dumpdir);
5270 dumpdir = p;
5272 else
5273 dumpdir = concat (obase, "-", NULL);
5275 dumpdir_trailing_dash_added = true;
5277 free (tofree);
5278 obase = tofree = NULL;
5281 if (!explicit_dumpdir || dumpbase)
5283 /* Absent -dumpbase and present -dumpbase-ext have been applied
5284 to the linker output name, so compute fresh defaults for each
5285 compilation. */
5286 free (dumpbase_ext);
5287 dumpbase_ext = NULL;
5291 /* Now, if we're compiling, or if we haven't used the dumpbase
5292 above, then outbase (%B) is derived from dumpbase, if given, or
5293 from the output name, given or implied. We can't precompute
5294 implied output names, but that's ok, since they're derived from
5295 input names. Just make sure we skip this if dumpbase is the
5296 empty string: we want to use input names then, so don't set
5297 outbase. */
5298 if ((dumpbase || have_c)
5299 && !(dumpbase && !*dumpbase))
5301 gcc_assert (!outbase);
5303 if (dumpbase)
5305 gcc_assert (single_input_file_index () != -2);
5306 /* We do not want lbasename here; dumpbase with dirnames
5307 overrides dumpdir entirely, even if dumpdir is
5308 specified. */
5309 if (dumpbase_ext)
5310 /* We've already checked above that the suffix matches. */
5311 outbase = xstrndup (dumpbase,
5312 strlen (dumpbase) - strlen (dumpbase_ext));
5313 else
5314 outbase = xstrdup (dumpbase);
5316 else if (output_file && !not_actual_file_p (output_file))
5318 outbase = xstrdup (lbasename (output_file));
5319 char *p = strrchr (outbase + 1, '.');
5320 if (p)
5321 *p = '\0';
5324 if (outbase)
5325 outbase_length = strlen (outbase);
5328 /* If there is any pathname component in an explicit -dumpbase, do
5329 not use dumpdir, but retain it to pass it on to the compiler. */
5330 if (dumpdir)
5331 dumpdir_length = strlen (dumpdir);
5332 else
5333 dumpdir_length = 0;
5335 /* Check that dumpbase_ext, if still present, still matches the end
5336 of dumpbase, if present, and drop it otherwise. We only retained
5337 it above when dumpbase was absent to maybe use it to drop the
5338 extension from output_name before combining it with dumpdir. We
5339 won't deal with -dumpbase-ext when -dumpbase is not explicitly
5340 given, even if just to activate backward-compatible dumpbase:
5341 dropping it on the floor is correct, expected and documented
5342 behavior. Attempting to deal with a -dumpbase-ext that might
5343 match the end of some input filename, or of the combination of
5344 the output basename with the suffix of the input filename,
5345 possible with an intermediate .gk extension for -fcompare-debug,
5346 is just calling for trouble. */
5347 if (dumpbase_ext)
5349 if (!dumpbase || !*dumpbase)
5351 free (dumpbase_ext);
5352 dumpbase_ext = NULL;
5354 else
5355 gcc_assert (strcmp (dumpbase + strlen (dumpbase)
5356 - strlen (dumpbase_ext), dumpbase_ext) == 0);
5359 if (save_temps_flag && use_pipes)
5361 /* -save-temps overrides -pipe, so that temp files are produced */
5362 if (save_temps_flag)
5363 warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
5364 use_pipes = 0;
5367 if (!compare_debug)
5369 const char *gcd = env.get ("GCC_COMPARE_DEBUG");
5371 if (gcd && gcd[0] == '-')
5373 compare_debug = 2;
5374 compare_debug_opt = gcd;
5376 else if (gcd && *gcd && strcmp (gcd, "0"))
5378 compare_debug = 3;
5379 compare_debug_opt = "-gtoggle";
5382 else if (compare_debug < 0)
5384 compare_debug = 0;
5385 gcc_assert (!compare_debug_opt);
5388 /* Set up the search paths. We add directories that we expect to
5389 contain GNU Toolchain components before directories specified by
5390 the machine description so that we will find GNU components (like
5391 the GNU assembler) before those of the host system. */
5393 /* If we don't know where the toolchain has been installed, use the
5394 configured-in locations. */
5395 if (!gcc_exec_prefix)
5397 #ifndef OS2
5398 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
5399 PREFIX_PRIORITY_LAST, 1, 0);
5400 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
5401 PREFIX_PRIORITY_LAST, 2, 0);
5402 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
5403 PREFIX_PRIORITY_LAST, 2, 0);
5404 #endif
5405 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
5406 PREFIX_PRIORITY_LAST, 1, 0);
5409 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
5410 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
5411 dir_separator_str, NULL);
5413 /* Look for tools relative to the location from which the driver is
5414 running, or, if that is not available, the configured prefix. */
5415 tooldir_prefix
5416 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
5417 spec_host_machine, dir_separator_str, spec_version,
5418 accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL);
5419 free (tooldir_prefix2);
5421 add_prefix (&exec_prefixes,
5422 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
5423 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
5424 add_prefix (&startfile_prefixes,
5425 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
5426 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
5427 free (tooldir_prefix);
5429 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
5430 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
5431 then consider it to relocate with the rest of the GCC installation
5432 if GCC_EXEC_PREFIX is set.
5433 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
5434 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
5436 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
5437 standard_bindir_prefix,
5438 target_system_root);
5439 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
5441 target_system_root = tmp_prefix;
5442 target_system_root_changed = 1;
5445 #endif
5447 /* More prefixes are enabled in main, after we read the specs file
5448 and determine whether this is cross-compilation or not. */
5450 if (n_infiles != 0 && n_infiles == last_language_n_infiles && spec_lang != 0)
5451 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
5453 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
5454 environment variable. */
5455 if (compare_debug == 2 || compare_debug == 3)
5457 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
5458 save_switch (opt, 0, NULL, false, true);
5459 compare_debug = 1;
5462 /* Ensure we only invoke each subprocess once. */
5463 if (n_infiles == 0
5464 && (print_subprocess_help || print_help_list || print_version))
5466 /* Create a dummy input file, so that we can pass
5467 the help option on to the various sub-processes. */
5468 add_infile ("help-dummy", "c");
5471 /* Decide if undefined variable references are allowed in specs. */
5473 /* -v alone is safe. --version and --help alone or together are safe. Note
5474 that -v would make them unsafe, as they'd then be run for subprocesses as
5475 well, the location of which might depend on variables possibly coming
5476 from self-specs. Note also that the command name is counted in
5477 decoded_options_count. */
5479 unsigned help_version_count = 0;
5481 if (print_version)
5482 help_version_count++;
5484 if (print_help_list)
5485 help_version_count++;
5487 spec_undefvar_allowed =
5488 ((verbose_flag && decoded_options_count == 2)
5489 || help_version_count == decoded_options_count - 1);
5491 alloc_switch ();
5492 switches[n_switches].part1 = 0;
5493 alloc_infile ();
5494 infiles[n_infiles].name = 0;
5497 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
5498 and place that in the environment. */
5500 static void
5501 set_collect_gcc_options (void)
5503 int i;
5504 int first_time;
5506 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5507 the compiler. */
5508 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5509 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5511 first_time = TRUE;
5512 for (i = 0; (int) i < n_switches; i++)
5514 const char *const *args;
5515 const char *p, *q;
5516 if (!first_time)
5517 obstack_grow (&collect_obstack, " ", 1);
5519 first_time = FALSE;
5521 /* Ignore elided switches. */
5522 if ((switches[i].live_cond
5523 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
5524 == SWITCH_IGNORE)
5525 continue;
5527 obstack_grow (&collect_obstack, "'-", 2);
5528 q = switches[i].part1;
5529 while ((p = strchr (q, '\'')))
5531 obstack_grow (&collect_obstack, q, p - q);
5532 obstack_grow (&collect_obstack, "'\\''", 4);
5533 q = ++p;
5535 obstack_grow (&collect_obstack, q, strlen (q));
5536 obstack_grow (&collect_obstack, "'", 1);
5538 for (args = switches[i].args; args && *args; args++)
5540 obstack_grow (&collect_obstack, " '", 2);
5541 q = *args;
5542 while ((p = strchr (q, '\'')))
5544 obstack_grow (&collect_obstack, q, p - q);
5545 obstack_grow (&collect_obstack, "'\\''", 4);
5546 q = ++p;
5548 obstack_grow (&collect_obstack, q, strlen (q));
5549 obstack_grow (&collect_obstack, "'", 1);
5553 if (dumpdir)
5555 if (!first_time)
5556 obstack_grow (&collect_obstack, " ", 1);
5557 first_time = FALSE;
5559 obstack_grow (&collect_obstack, "'-dumpdir' '", 12);
5560 const char *p, *q;
5562 q = dumpdir;
5563 while ((p = strchr (q, '\'')))
5565 obstack_grow (&collect_obstack, q, p - q);
5566 obstack_grow (&collect_obstack, "'\\''", 4);
5567 q = ++p;
5569 obstack_grow (&collect_obstack, q, strlen (q));
5571 obstack_grow (&collect_obstack, "'", 1);
5574 obstack_grow (&collect_obstack, "\0", 1);
5575 xputenv (XOBFINISH (&collect_obstack, char *));
5578 /* Process a spec string, accumulating and running commands. */
5580 /* These variables describe the input file name.
5581 input_file_number is the index on outfiles of this file,
5582 so that the output file name can be stored for later use by %o.
5583 input_basename is the start of the part of the input file
5584 sans all directory names, and basename_length is the number
5585 of characters starting there excluding the suffix .c or whatever. */
5587 static const char *gcc_input_filename;
5588 static int input_file_number;
5589 size_t input_filename_length;
5590 static int basename_length;
5591 static int suffixed_basename_length;
5592 static const char *input_basename;
5593 static const char *input_suffix;
5594 #ifndef HOST_LACKS_INODE_NUMBERS
5595 static struct stat input_stat;
5596 #endif
5597 static int input_stat_set;
5599 /* The compiler used to process the current input file. */
5600 static struct compiler *input_file_compiler;
5602 /* These are variables used within do_spec and do_spec_1. */
5604 /* Nonzero if an arg has been started and not yet terminated
5605 (with space, tab or newline). */
5606 static int arg_going;
5608 /* Nonzero means %d or %g has been seen; the next arg to be terminated
5609 is a temporary file name. */
5610 static int delete_this_arg;
5612 /* Nonzero means %w has been seen; the next arg to be terminated
5613 is the output file name of this compilation. */
5614 static int this_is_output_file;
5616 /* Nonzero means %s has been seen; the next arg to be terminated
5617 is the name of a library file and we should try the standard
5618 search dirs for it. */
5619 static int this_is_library_file;
5621 /* Nonzero means %T has been seen; the next arg to be terminated
5622 is the name of a linker script and we should try all of the
5623 standard search dirs for it. If it is found insert a --script
5624 command line switch and then substitute the full path in place,
5625 otherwise generate an error message. */
5626 static int this_is_linker_script;
5628 /* Nonzero means that the input of this command is coming from a pipe. */
5629 static int input_from_pipe;
5631 /* Nonnull means substitute this for any suffix when outputting a switches
5632 arguments. */
5633 static const char *suffix_subst;
5635 /* If there is an argument being accumulated, terminate it and store it. */
5637 static void
5638 end_going_arg (void)
5640 if (arg_going)
5642 const char *string;
5644 obstack_1grow (&obstack, 0);
5645 string = XOBFINISH (&obstack, const char *);
5646 if (this_is_library_file)
5647 string = find_file (string);
5648 if (this_is_linker_script)
5650 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
5652 if (full_script_path == NULL)
5654 error ("unable to locate default linker script %qs in the library search paths", string);
5655 /* Script was not found on search path. */
5656 return;
5658 store_arg ("--script", false, false);
5659 string = full_script_path;
5661 store_arg (string, delete_this_arg, this_is_output_file);
5662 if (this_is_output_file)
5663 outfiles[input_file_number] = string;
5664 arg_going = 0;
5669 /* Parse the WRAPPER string which is a comma separated list of the command line
5670 and insert them into the beginning of argbuf. */
5672 static void
5673 insert_wrapper (const char *wrapper)
5675 int n = 0;
5676 int i;
5677 char *buf = xstrdup (wrapper);
5678 char *p = buf;
5679 unsigned int old_length = argbuf.length ();
5683 n++;
5684 while (*p == ',')
5685 p++;
5687 while ((p = strchr (p, ',')) != NULL);
5689 argbuf.safe_grow (old_length + n, true);
5690 memmove (argbuf.address () + n,
5691 argbuf.address (),
5692 old_length * sizeof (const_char_p));
5694 i = 0;
5695 p = buf;
5698 while (*p == ',')
5700 *p = 0;
5701 p++;
5703 argbuf[i] = p;
5704 i++;
5706 while ((p = strchr (p, ',')) != NULL);
5707 gcc_assert (i == n);
5710 /* Process the spec SPEC and run the commands specified therein.
5711 Returns 0 if the spec is successfully processed; -1 if failed. */
5714 do_spec (const char *spec)
5716 int value;
5718 value = do_spec_2 (spec, NULL);
5720 /* Force out any unfinished command.
5721 If -pipe, this forces out the last command if it ended in `|'. */
5722 if (value == 0)
5724 if (argbuf.length () > 0
5725 && !strcmp (argbuf.last (), "|"))
5726 argbuf.pop ();
5728 set_collect_gcc_options ();
5730 if (argbuf.length () > 0)
5731 value = execute ();
5734 return value;
5737 /* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
5738 of a matched * pattern which may be re-injected by way of %*. */
5740 static int
5741 do_spec_2 (const char *spec, const char *soft_matched_part)
5743 int result;
5745 clear_args ();
5746 arg_going = 0;
5747 delete_this_arg = 0;
5748 this_is_output_file = 0;
5749 this_is_library_file = 0;
5750 this_is_linker_script = 0;
5751 input_from_pipe = 0;
5752 suffix_subst = NULL;
5754 result = do_spec_1 (spec, 0, soft_matched_part);
5756 end_going_arg ();
5758 return result;
5761 /* Process the given spec string and add any new options to the end
5762 of the switches/n_switches array. */
5764 static void
5765 do_option_spec (const char *name, const char *spec)
5767 unsigned int i, value_count, value_len;
5768 const char *p, *q, *value;
5769 char *tmp_spec, *tmp_spec_p;
5771 if (configure_default_options[0].name == NULL)
5772 return;
5774 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
5775 if (strcmp (configure_default_options[i].name, name) == 0)
5776 break;
5777 if (i == ARRAY_SIZE (configure_default_options))
5778 return;
5780 value = configure_default_options[i].value;
5781 value_len = strlen (value);
5783 /* Compute the size of the final spec. */
5784 value_count = 0;
5785 p = spec;
5786 while ((p = strstr (p, "%(VALUE)")) != NULL)
5788 p ++;
5789 value_count ++;
5792 /* Replace each %(VALUE) by the specified value. */
5793 tmp_spec = (char *) alloca (strlen (spec) + 1
5794 + value_count * (value_len - strlen ("%(VALUE)")));
5795 tmp_spec_p = tmp_spec;
5796 q = spec;
5797 while ((p = strstr (q, "%(VALUE)")) != NULL)
5799 memcpy (tmp_spec_p, q, p - q);
5800 tmp_spec_p = tmp_spec_p + (p - q);
5801 memcpy (tmp_spec_p, value, value_len);
5802 tmp_spec_p += value_len;
5803 q = p + strlen ("%(VALUE)");
5805 strcpy (tmp_spec_p, q);
5807 do_self_spec (tmp_spec);
5810 /* Process the given spec string and add any new options to the end
5811 of the switches/n_switches array. */
5813 static void
5814 do_self_spec (const char *spec)
5816 int i;
5818 do_spec_2 (spec, NULL);
5819 do_spec_1 (" ", 0, NULL);
5821 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
5822 do_self_specs adds the replacements to switches array, so it shouldn't
5823 be processed afterwards. */
5824 for (i = 0; i < n_switches; i++)
5825 if ((switches[i].live_cond & SWITCH_IGNORE))
5826 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
5828 if (argbuf.length () > 0)
5830 const char **argbuf_copy;
5831 struct cl_decoded_option *decoded_options;
5832 struct cl_option_handlers handlers;
5833 unsigned int decoded_options_count;
5834 unsigned int j;
5836 /* Create a copy of argbuf with a dummy argv[0] entry for
5837 decode_cmdline_options_to_array. */
5838 argbuf_copy = XNEWVEC (const char *,
5839 argbuf.length () + 1);
5840 argbuf_copy[0] = "";
5841 memcpy (argbuf_copy + 1, argbuf.address (),
5842 argbuf.length () * sizeof (const char *));
5844 decode_cmdline_options_to_array (argbuf.length () + 1,
5845 argbuf_copy,
5846 CL_DRIVER, &decoded_options,
5847 &decoded_options_count);
5848 free (argbuf_copy);
5850 set_option_handlers (&handlers);
5852 for (j = 1; j < decoded_options_count; j++)
5854 switch (decoded_options[j].opt_index)
5856 case OPT_SPECIAL_input_file:
5857 /* Specs should only generate options, not input
5858 files. */
5859 if (strcmp (decoded_options[j].arg, "-") != 0)
5860 fatal_error (input_location,
5861 "switch %qs does not start with %<-%>",
5862 decoded_options[j].arg);
5863 else
5864 fatal_error (input_location,
5865 "spec-generated switch is just %<-%>");
5866 break;
5868 case OPT_fcompare_debug_second:
5869 case OPT_fcompare_debug:
5870 case OPT_fcompare_debug_:
5871 case OPT_o:
5872 /* Avoid duplicate processing of some options from
5873 compare-debug specs; just save them here. */
5874 save_switch (decoded_options[j].canonical_option[0],
5875 (decoded_options[j].canonical_option_num_elements
5876 - 1),
5877 &decoded_options[j].canonical_option[1], false, true);
5878 break;
5880 default:
5881 read_cmdline_option (&global_options, &global_options_set,
5882 decoded_options + j, UNKNOWN_LOCATION,
5883 CL_DRIVER, &handlers, global_dc);
5884 break;
5888 free (decoded_options);
5890 alloc_switch ();
5891 switches[n_switches].part1 = 0;
5895 /* Callback for processing %D and %I specs. */
5897 struct spec_path_info {
5898 const char *option;
5899 const char *append;
5900 size_t append_len;
5901 bool omit_relative;
5902 bool separate_options;
5905 static void *
5906 spec_path (char *path, void *data)
5908 struct spec_path_info *info = (struct spec_path_info *) data;
5909 size_t len = 0;
5910 char save = 0;
5912 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
5913 return NULL;
5915 if (info->append_len != 0)
5917 len = strlen (path);
5918 memcpy (path + len, info->append, info->append_len + 1);
5921 if (!is_directory (path, true))
5922 return NULL;
5924 do_spec_1 (info->option, 1, NULL);
5925 if (info->separate_options)
5926 do_spec_1 (" ", 0, NULL);
5928 if (info->append_len == 0)
5930 len = strlen (path);
5931 save = path[len - 1];
5932 if (IS_DIR_SEPARATOR (path[len - 1]))
5933 path[len - 1] = '\0';
5936 do_spec_1 (path, 1, NULL);
5937 do_spec_1 (" ", 0, NULL);
5939 /* Must not damage the original path. */
5940 if (info->append_len == 0)
5941 path[len - 1] = save;
5943 return NULL;
5946 /* True if we should compile INFILE. */
5948 static bool
5949 compile_input_file_p (struct infile *infile)
5951 if ((!infile->language) || (infile->language[0] != '*'))
5952 if (infile->incompiler == input_file_compiler)
5953 return true;
5954 return false;
5957 /* Process each member of VEC as a spec. */
5959 static void
5960 do_specs_vec (vec<char_p> vec)
5962 for (char *opt : vec)
5964 do_spec_1 (opt, 1, NULL);
5965 /* Make each accumulated option a separate argument. */
5966 do_spec_1 (" ", 0, NULL);
5970 /* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS. */
5972 static void
5973 putenv_COLLECT_AS_OPTIONS (vec<char_p> vec)
5975 if (vec.is_empty ())
5976 return;
5978 obstack_init (&collect_obstack);
5979 obstack_grow (&collect_obstack, "COLLECT_AS_OPTIONS=",
5980 strlen ("COLLECT_AS_OPTIONS="));
5982 char *opt;
5983 unsigned ix;
5985 FOR_EACH_VEC_ELT (vec, ix, opt)
5987 obstack_1grow (&collect_obstack, '\'');
5988 obstack_grow (&collect_obstack, opt, strlen (opt));
5989 obstack_1grow (&collect_obstack, '\'');
5990 if (ix < vec.length () - 1)
5991 obstack_1grow(&collect_obstack, ' ');
5994 obstack_1grow (&collect_obstack, '\0');
5995 xputenv (XOBFINISH (&collect_obstack, char *));
5998 /* Process the sub-spec SPEC as a portion of a larger spec.
5999 This is like processing a whole spec except that we do
6000 not initialize at the beginning and we do not supply a
6001 newline by default at the end.
6002 INSWITCH nonzero means don't process %-sequences in SPEC;
6003 in this case, % is treated as an ordinary character.
6004 This is used while substituting switches.
6005 INSWITCH nonzero also causes SPC not to terminate an argument.
6007 Value is zero unless a line was finished
6008 and the command on that line reported an error. */
6010 static int
6011 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
6013 const char *p = spec;
6014 int c;
6015 int i;
6016 int value;
6018 /* If it's an empty string argument to a switch, keep it as is. */
6019 if (inswitch && !*p)
6020 arg_going = 1;
6022 while ((c = *p++))
6023 /* If substituting a switch, treat all chars like letters.
6024 Otherwise, NL, SPC, TAB and % are special. */
6025 switch (inswitch ? 'a' : c)
6027 case '\n':
6028 end_going_arg ();
6030 if (argbuf.length () > 0
6031 && !strcmp (argbuf.last (), "|"))
6033 /* A `|' before the newline means use a pipe here,
6034 but only if -pipe was specified.
6035 Otherwise, execute now and don't pass the `|' as an arg. */
6036 if (use_pipes)
6038 input_from_pipe = 1;
6039 break;
6041 else
6042 argbuf.pop ();
6045 set_collect_gcc_options ();
6047 if (argbuf.length () > 0)
6049 value = execute ();
6050 if (value)
6051 return value;
6053 /* Reinitialize for a new command, and for a new argument. */
6054 clear_args ();
6055 arg_going = 0;
6056 delete_this_arg = 0;
6057 this_is_output_file = 0;
6058 this_is_library_file = 0;
6059 this_is_linker_script = 0;
6060 input_from_pipe = 0;
6061 break;
6063 case '|':
6064 end_going_arg ();
6066 /* Use pipe */
6067 obstack_1grow (&obstack, c);
6068 arg_going = 1;
6069 break;
6071 case '\t':
6072 case ' ':
6073 end_going_arg ();
6075 /* Reinitialize for a new argument. */
6076 delete_this_arg = 0;
6077 this_is_output_file = 0;
6078 this_is_library_file = 0;
6079 this_is_linker_script = 0;
6080 break;
6082 case '%':
6083 switch (c = *p++)
6085 case 0:
6086 fatal_error (input_location, "spec %qs invalid", spec);
6088 case 'b':
6089 /* Don't use %b in the linker command. */
6090 gcc_assert (suffixed_basename_length);
6091 if (!this_is_output_file && dumpdir_length)
6092 obstack_grow (&obstack, dumpdir, dumpdir_length);
6093 if (this_is_output_file || !outbase_length)
6094 obstack_grow (&obstack, input_basename, basename_length);
6095 else
6096 obstack_grow (&obstack, outbase, outbase_length);
6097 if (compare_debug < 0)
6098 obstack_grow (&obstack, ".gk", 3);
6099 arg_going = 1;
6100 break;
6102 case 'B':
6103 /* Don't use %B in the linker command. */
6104 gcc_assert (suffixed_basename_length);
6105 if (!this_is_output_file && dumpdir_length)
6106 obstack_grow (&obstack, dumpdir, dumpdir_length);
6107 if (this_is_output_file || !outbase_length)
6108 obstack_grow (&obstack, input_basename, basename_length);
6109 else
6110 obstack_grow (&obstack, outbase, outbase_length);
6111 if (compare_debug < 0)
6112 obstack_grow (&obstack, ".gk", 3);
6113 obstack_grow (&obstack, input_basename + basename_length,
6114 suffixed_basename_length - basename_length);
6116 arg_going = 1;
6117 break;
6119 case 'd':
6120 delete_this_arg = 2;
6121 break;
6123 /* Dump out the directories specified with LIBRARY_PATH,
6124 followed by the absolute directories
6125 that we search for startfiles. */
6126 case 'D':
6128 struct spec_path_info info;
6130 info.option = "-L";
6131 info.append_len = 0;
6132 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
6133 /* Used on systems which record the specified -L dirs
6134 and use them to search for dynamic linking.
6135 Relative directories always come from -B,
6136 and it is better not to use them for searching
6137 at run time. In particular, stage1 loses. */
6138 info.omit_relative = true;
6139 #else
6140 info.omit_relative = false;
6141 #endif
6142 info.separate_options = false;
6144 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
6146 break;
6148 case 'e':
6149 /* %efoo means report an error with `foo' as error message
6150 and don't execute any more commands for this file. */
6152 const char *q = p;
6153 char *buf;
6154 while (*p != 0 && *p != '\n')
6155 p++;
6156 buf = (char *) alloca (p - q + 1);
6157 strncpy (buf, q, p - q);
6158 buf[p - q] = 0;
6159 error ("%s", _(buf));
6160 return -1;
6162 break;
6163 case 'n':
6164 /* %nfoo means report a notice with `foo' on stderr. */
6166 const char *q = p;
6167 char *buf;
6168 while (*p != 0 && *p != '\n')
6169 p++;
6170 buf = (char *) alloca (p - q + 1);
6171 strncpy (buf, q, p - q);
6172 buf[p - q] = 0;
6173 inform (UNKNOWN_LOCATION, "%s", _(buf));
6174 if (*p)
6175 p++;
6177 break;
6179 case 'j':
6181 struct stat st;
6183 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
6184 defined, and it is not a directory, and it is
6185 writable, use it. Otherwise, treat this like any
6186 other temporary file. */
6188 if ((!save_temps_flag)
6189 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
6190 && (access (HOST_BIT_BUCKET, W_OK) == 0))
6192 obstack_grow (&obstack, HOST_BIT_BUCKET,
6193 strlen (HOST_BIT_BUCKET));
6194 delete_this_arg = 0;
6195 arg_going = 1;
6196 break;
6199 goto create_temp_file;
6200 case '|':
6201 if (use_pipes)
6203 obstack_1grow (&obstack, '-');
6204 delete_this_arg = 0;
6205 arg_going = 1;
6207 /* consume suffix */
6208 while (*p == '.' || ISALNUM ((unsigned char) *p))
6209 p++;
6210 if (p[0] == '%' && p[1] == 'O')
6211 p += 2;
6213 break;
6215 goto create_temp_file;
6216 case 'm':
6217 if (use_pipes)
6219 /* consume suffix */
6220 while (*p == '.' || ISALNUM ((unsigned char) *p))
6221 p++;
6222 if (p[0] == '%' && p[1] == 'O')
6223 p += 2;
6225 break;
6227 goto create_temp_file;
6228 case 'g':
6229 case 'u':
6230 case 'U':
6231 create_temp_file:
6233 struct temp_name *t;
6234 int suffix_length;
6235 const char *suffix = p;
6236 char *saved_suffix = NULL;
6238 while (*p == '.' || ISALNUM ((unsigned char) *p))
6239 p++;
6240 suffix_length = p - suffix;
6241 if (p[0] == '%' && p[1] == 'O')
6243 p += 2;
6244 /* We don't support extra suffix characters after %O. */
6245 if (*p == '.' || ISALNUM ((unsigned char) *p))
6246 fatal_error (input_location,
6247 "spec %qs has invalid %<%%0%c%>", spec, *p);
6248 if (suffix_length == 0)
6249 suffix = TARGET_OBJECT_SUFFIX;
6250 else
6252 saved_suffix
6253 = XNEWVEC (char, suffix_length
6254 + strlen (TARGET_OBJECT_SUFFIX) + 1);
6255 strncpy (saved_suffix, suffix, suffix_length);
6256 strcpy (saved_suffix + suffix_length,
6257 TARGET_OBJECT_SUFFIX);
6259 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
6262 if (compare_debug < 0)
6264 suffix = concat (".gk", suffix, NULL);
6265 suffix_length += 3;
6268 /* If -save-temps was specified, use that for the
6269 temp file. */
6270 if (save_temps_flag)
6272 char *tmp;
6273 bool adjusted_suffix = false;
6274 if (suffix_length
6275 && !outbase_length && !basename_length
6276 && !dumpdir_trailing_dash_added)
6278 adjusted_suffix = true;
6279 suffix++;
6280 suffix_length--;
6282 temp_filename_length
6283 = dumpdir_length + suffix_length + 1;
6284 if (outbase_length)
6285 temp_filename_length += outbase_length;
6286 else
6287 temp_filename_length += basename_length;
6288 tmp = (char *) alloca (temp_filename_length);
6289 if (dumpdir_length)
6290 memcpy (tmp, dumpdir, dumpdir_length);
6291 if (outbase_length)
6292 memcpy (tmp + dumpdir_length, outbase,
6293 outbase_length);
6294 else if (basename_length)
6295 memcpy (tmp + dumpdir_length, input_basename,
6296 basename_length);
6297 memcpy (tmp + temp_filename_length - suffix_length - 1,
6298 suffix, suffix_length);
6299 if (adjusted_suffix)
6301 adjusted_suffix = false;
6302 suffix--;
6303 suffix_length++;
6305 tmp[temp_filename_length - 1] = '\0';
6306 temp_filename = tmp;
6308 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
6310 #ifndef HOST_LACKS_INODE_NUMBERS
6311 struct stat st_temp;
6313 /* Note, set_input() resets input_stat_set to 0. */
6314 if (input_stat_set == 0)
6316 input_stat_set = stat (gcc_input_filename,
6317 &input_stat);
6318 if (input_stat_set >= 0)
6319 input_stat_set = 1;
6322 /* If we have the stat for the gcc_input_filename
6323 and we can do the stat for the temp_filename
6324 then the they could still refer to the same
6325 file if st_dev/st_ino's are the same. */
6326 if (input_stat_set != 1
6327 || stat (temp_filename, &st_temp) < 0
6328 || input_stat.st_dev != st_temp.st_dev
6329 || input_stat.st_ino != st_temp.st_ino)
6330 #else
6331 /* Just compare canonical pathnames. */
6332 char* input_realname = lrealpath (gcc_input_filename);
6333 char* temp_realname = lrealpath (temp_filename);
6334 bool files_differ = filename_cmp (input_realname, temp_realname);
6335 free (input_realname);
6336 free (temp_realname);
6337 if (files_differ)
6338 #endif
6340 temp_filename
6341 = save_string (temp_filename,
6342 temp_filename_length - 1);
6343 obstack_grow (&obstack, temp_filename,
6344 temp_filename_length);
6345 arg_going = 1;
6346 delete_this_arg = 0;
6347 break;
6352 /* See if we already have an association of %g/%u/%U and
6353 suffix. */
6354 for (t = temp_names; t; t = t->next)
6355 if (t->length == suffix_length
6356 && strncmp (t->suffix, suffix, suffix_length) == 0
6357 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
6358 break;
6360 /* Make a new association if needed. %u and %j
6361 require one. */
6362 if (t == 0 || c == 'u' || c == 'j')
6364 if (t == 0)
6366 t = XNEW (struct temp_name);
6367 t->next = temp_names;
6368 temp_names = t;
6370 t->length = suffix_length;
6371 if (saved_suffix)
6373 t->suffix = saved_suffix;
6374 saved_suffix = NULL;
6376 else
6377 t->suffix = save_string (suffix, suffix_length);
6378 t->unique = (c == 'u' || c == 'U' || c == 'j');
6379 temp_filename = make_temp_file (t->suffix);
6380 temp_filename_length = strlen (temp_filename);
6381 t->filename = temp_filename;
6382 t->filename_length = temp_filename_length;
6385 free (saved_suffix);
6387 obstack_grow (&obstack, t->filename, t->filename_length);
6388 delete_this_arg = 1;
6390 arg_going = 1;
6391 break;
6393 case 'i':
6394 if (combine_inputs)
6396 /* We are going to expand `%i' into `@FILE', where FILE
6397 is a newly-created temporary filename. The filenames
6398 that would usually be expanded in place of %o will be
6399 written to the temporary file. */
6400 if (at_file_supplied)
6401 open_at_file ();
6403 for (i = 0; (int) i < n_infiles; i++)
6404 if (compile_input_file_p (&infiles[i]))
6406 store_arg (infiles[i].name, 0, 0);
6407 infiles[i].compiled = true;
6410 if (at_file_supplied)
6411 close_at_file ();
6413 else
6415 obstack_grow (&obstack, gcc_input_filename,
6416 input_filename_length);
6417 arg_going = 1;
6419 break;
6421 case 'I':
6423 struct spec_path_info info;
6425 if (multilib_dir)
6427 do_spec_1 ("-imultilib", 1, NULL);
6428 /* Make this a separate argument. */
6429 do_spec_1 (" ", 0, NULL);
6430 do_spec_1 (multilib_dir, 1, NULL);
6431 do_spec_1 (" ", 0, NULL);
6434 if (multiarch_dir)
6436 do_spec_1 ("-imultiarch", 1, NULL);
6437 /* Make this a separate argument. */
6438 do_spec_1 (" ", 0, NULL);
6439 do_spec_1 (multiarch_dir, 1, NULL);
6440 do_spec_1 (" ", 0, NULL);
6443 if (gcc_exec_prefix)
6445 do_spec_1 ("-iprefix", 1, NULL);
6446 /* Make this a separate argument. */
6447 do_spec_1 (" ", 0, NULL);
6448 do_spec_1 (gcc_exec_prefix, 1, NULL);
6449 do_spec_1 (" ", 0, NULL);
6452 if (target_system_root_changed ||
6453 (target_system_root && target_sysroot_hdrs_suffix))
6455 do_spec_1 ("-isysroot", 1, NULL);
6456 /* Make this a separate argument. */
6457 do_spec_1 (" ", 0, NULL);
6458 do_spec_1 (target_system_root, 1, NULL);
6459 if (target_sysroot_hdrs_suffix)
6460 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
6461 do_spec_1 (" ", 0, NULL);
6464 info.option = "-isystem";
6465 info.append = "include";
6466 info.append_len = strlen (info.append);
6467 info.omit_relative = false;
6468 info.separate_options = true;
6470 for_each_path (&include_prefixes, false, info.append_len,
6471 spec_path, &info);
6473 info.append = "include-fixed";
6474 if (*sysroot_hdrs_suffix_spec)
6475 info.append = concat (info.append, dir_separator_str,
6476 multilib_dir, NULL);
6477 info.append_len = strlen (info.append);
6478 for_each_path (&include_prefixes, false, info.append_len,
6479 spec_path, &info);
6481 break;
6483 case 'o':
6484 /* We are going to expand `%o' into `@FILE', where FILE
6485 is a newly-created temporary filename. The filenames
6486 that would usually be expanded in place of %o will be
6487 written to the temporary file. */
6488 if (at_file_supplied)
6489 open_at_file ();
6491 for (i = 0; i < n_infiles + lang_specific_extra_outfiles; i++)
6492 if (outfiles[i])
6493 store_arg (outfiles[i], 0, 0);
6495 if (at_file_supplied)
6496 close_at_file ();
6497 break;
6499 case 'O':
6500 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
6501 arg_going = 1;
6502 break;
6504 case 's':
6505 this_is_library_file = 1;
6506 break;
6508 case 'T':
6509 this_is_linker_script = 1;
6510 break;
6512 case 'V':
6513 outfiles[input_file_number] = NULL;
6514 break;
6516 case 'w':
6517 this_is_output_file = 1;
6518 break;
6520 case 'W':
6522 unsigned int cur_index = argbuf.length ();
6523 /* Handle the {...} following the %W. */
6524 if (*p != '{')
6525 fatal_error (input_location,
6526 "spec %qs has invalid %<%%W%c%>", spec, *p);
6527 p = handle_braces (p + 1);
6528 if (p == 0)
6529 return -1;
6530 end_going_arg ();
6531 /* If any args were output, mark the last one for deletion
6532 on failure. */
6533 if (argbuf.length () != cur_index)
6534 record_temp_file (argbuf.last (), 0, 1);
6535 break;
6538 case '@':
6539 /* Handle the {...} following the %@. */
6540 if (*p != '{')
6541 fatal_error (input_location,
6542 "spec %qs has invalid %<%%@%c%>", spec, *p);
6543 if (at_file_supplied)
6544 open_at_file ();
6545 p = handle_braces (p + 1);
6546 if (at_file_supplied)
6547 close_at_file ();
6548 if (p == 0)
6549 return -1;
6550 break;
6552 /* %x{OPTION} records OPTION for %X to output. */
6553 case 'x':
6555 const char *p1 = p;
6556 char *string;
6558 /* Skip past the option value and make a copy. */
6559 if (*p != '{')
6560 fatal_error (input_location,
6561 "spec %qs has invalid %<%%x%c%>", spec, *p);
6562 while (*p++ != '}')
6564 string = save_string (p1 + 1, p - p1 - 2);
6566 /* See if we already recorded this option. */
6567 for (const char *opt : linker_options)
6568 if (! strcmp (string, opt))
6570 free (string);
6571 return 0;
6574 /* This option is new; add it. */
6575 add_linker_option (string, strlen (string));
6576 free (string);
6578 break;
6580 /* Dump out the options accumulated previously using %x. */
6581 case 'X':
6582 do_specs_vec (linker_options);
6583 break;
6585 /* Dump out the options accumulated previously using -Wa,. */
6586 case 'Y':
6587 do_specs_vec (assembler_options);
6588 break;
6590 /* Dump out the options accumulated previously using -Wp,. */
6591 case 'Z':
6592 do_specs_vec (preprocessor_options);
6593 break;
6595 /* Here are digits and numbers that just process
6596 a certain constant string as a spec. */
6598 case '1':
6599 value = do_spec_1 (cc1_spec, 0, NULL);
6600 if (value != 0)
6601 return value;
6602 break;
6604 case '2':
6605 value = do_spec_1 (cc1plus_spec, 0, NULL);
6606 if (value != 0)
6607 return value;
6608 break;
6610 case 'a':
6611 value = do_spec_1 (asm_spec, 0, NULL);
6612 if (value != 0)
6613 return value;
6614 break;
6616 case 'A':
6617 value = do_spec_1 (asm_final_spec, 0, NULL);
6618 if (value != 0)
6619 return value;
6620 break;
6622 case 'C':
6624 const char *const spec
6625 = (input_file_compiler->cpp_spec
6626 ? input_file_compiler->cpp_spec
6627 : cpp_spec);
6628 value = do_spec_1 (spec, 0, NULL);
6629 if (value != 0)
6630 return value;
6632 break;
6634 case 'E':
6635 value = do_spec_1 (endfile_spec, 0, NULL);
6636 if (value != 0)
6637 return value;
6638 break;
6640 case 'l':
6641 value = do_spec_1 (link_spec, 0, NULL);
6642 if (value != 0)
6643 return value;
6644 break;
6646 case 'L':
6647 value = do_spec_1 (lib_spec, 0, NULL);
6648 if (value != 0)
6649 return value;
6650 break;
6652 case 'M':
6653 if (multilib_os_dir == NULL)
6654 obstack_1grow (&obstack, '.');
6655 else
6656 obstack_grow (&obstack, multilib_os_dir,
6657 strlen (multilib_os_dir));
6658 break;
6660 case 'G':
6661 value = do_spec_1 (libgcc_spec, 0, NULL);
6662 if (value != 0)
6663 return value;
6664 break;
6666 case 'R':
6667 /* We assume there is a directory
6668 separator at the end of this string. */
6669 if (target_system_root)
6671 obstack_grow (&obstack, target_system_root,
6672 strlen (target_system_root));
6673 if (target_sysroot_suffix)
6674 obstack_grow (&obstack, target_sysroot_suffix,
6675 strlen (target_sysroot_suffix));
6677 break;
6679 case 'S':
6680 value = do_spec_1 (startfile_spec, 0, NULL);
6681 if (value != 0)
6682 return value;
6683 break;
6685 /* Here we define characters other than letters and digits. */
6687 case '{':
6688 p = handle_braces (p);
6689 if (p == 0)
6690 return -1;
6691 break;
6693 case ':':
6694 p = handle_spec_function (p, NULL, soft_matched_part);
6695 if (p == 0)
6696 return -1;
6697 break;
6699 case '%':
6700 obstack_1grow (&obstack, '%');
6701 break;
6703 case '.':
6705 unsigned len = 0;
6707 while (p[len] && p[len] != ' ' && p[len] != '%')
6708 len++;
6709 suffix_subst = save_string (p - 1, len + 1);
6710 p += len;
6712 break;
6714 /* Henceforth ignore the option(s) matching the pattern
6715 after the %<. */
6716 case '<':
6717 case '>':
6719 unsigned len = 0;
6720 int have_wildcard = 0;
6721 int i;
6722 int switch_option;
6724 if (c == '>')
6725 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
6726 else
6727 switch_option = SWITCH_IGNORE;
6729 while (p[len] && p[len] != ' ' && p[len] != '\t')
6730 len++;
6732 if (p[len-1] == '*')
6733 have_wildcard = 1;
6735 for (i = 0; i < n_switches; i++)
6736 if (!strncmp (switches[i].part1, p, len - have_wildcard)
6737 && (have_wildcard || switches[i].part1[len] == '\0'))
6739 switches[i].live_cond |= switch_option;
6740 /* User switch be validated from validate_all_switches.
6741 when the definition is seen from the spec file.
6742 If not defined anywhere, will be rejected. */
6743 if (switches[i].known)
6744 switches[i].validated = true;
6747 p += len;
6749 break;
6751 case '*':
6752 if (soft_matched_part)
6754 if (soft_matched_part[0])
6755 do_spec_1 (soft_matched_part, 1, NULL);
6756 /* Only insert a space after the substitution if it is at the
6757 end of the current sequence. So if:
6759 "%{foo=*:bar%*}%{foo=*:one%*two}"
6761 matches -foo=hello then it will produce:
6763 barhello onehellotwo
6765 if (*p == 0 || *p == '}')
6766 do_spec_1 (" ", 0, NULL);
6768 else
6769 /* Catch the case where a spec string contains something like
6770 '%{foo:%*}'. i.e. there is no * in the pattern on the left
6771 hand side of the :. */
6772 error ("spec failure: %<%%*%> has not been initialized by pattern match");
6773 break;
6775 /* Process a string found as the value of a spec given by name.
6776 This feature allows individual machine descriptions
6777 to add and use their own specs. */
6778 case '(':
6780 const char *name = p;
6781 struct spec_list *sl;
6782 int len;
6784 /* The string after the S/P is the name of a spec that is to be
6785 processed. */
6786 while (*p && *p != ')')
6787 p++;
6789 /* See if it's in the list. */
6790 for (len = p - name, sl = specs; sl; sl = sl->next)
6791 if (sl->name_len == len && !strncmp (sl->name, name, len))
6793 name = *(sl->ptr_spec);
6794 #ifdef DEBUG_SPECS
6795 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
6796 sl->name, name);
6797 #endif
6798 break;
6801 if (sl)
6803 value = do_spec_1 (name, 0, NULL);
6804 if (value != 0)
6805 return value;
6808 /* Discard the closing paren. */
6809 if (*p)
6810 p++;
6812 break;
6814 case '"':
6815 /* End a previous argument, if there is one, then issue an
6816 empty argument. */
6817 end_going_arg ();
6818 arg_going = 1;
6819 end_going_arg ();
6820 break;
6822 default:
6823 error ("spec failure: unrecognized spec option %qc", c);
6824 break;
6826 break;
6828 case '\\':
6829 /* Backslash: treat next character as ordinary. */
6830 c = *p++;
6832 /* When adding more cases that previously matched default, make
6833 sure to adjust quote_spec_char_p as well. */
6835 /* Fall through. */
6836 default:
6837 /* Ordinary character: put it into the current argument. */
6838 obstack_1grow (&obstack, c);
6839 arg_going = 1;
6842 /* End of string. If we are processing a spec function, we need to
6843 end any pending argument. */
6844 if (processing_spec_function)
6845 end_going_arg ();
6847 return 0;
6850 /* Look up a spec function. */
6852 static const struct spec_function *
6853 lookup_spec_function (const char *name)
6855 const struct spec_function *sf;
6857 for (sf = static_spec_functions; sf->name != NULL; sf++)
6858 if (strcmp (sf->name, name) == 0)
6859 return sf;
6861 return NULL;
6864 /* Evaluate a spec function. */
6866 static const char *
6867 eval_spec_function (const char *func, const char *args,
6868 const char *soft_matched_part)
6870 const struct spec_function *sf;
6871 const char *funcval;
6873 /* Saved spec processing context. */
6874 vec<const_char_p> save_argbuf;
6876 int save_arg_going;
6877 int save_delete_this_arg;
6878 int save_this_is_output_file;
6879 int save_this_is_library_file;
6880 int save_input_from_pipe;
6881 int save_this_is_linker_script;
6882 const char *save_suffix_subst;
6884 int save_growing_size;
6885 void *save_growing_value = NULL;
6887 sf = lookup_spec_function (func);
6888 if (sf == NULL)
6889 fatal_error (input_location, "unknown spec function %qs", func);
6891 /* Push the spec processing context. */
6892 save_argbuf = argbuf;
6894 save_arg_going = arg_going;
6895 save_delete_this_arg = delete_this_arg;
6896 save_this_is_output_file = this_is_output_file;
6897 save_this_is_library_file = this_is_library_file;
6898 save_this_is_linker_script = this_is_linker_script;
6899 save_input_from_pipe = input_from_pipe;
6900 save_suffix_subst = suffix_subst;
6902 /* If we have some object growing now, finalize it so the args and function
6903 eval proceed from a cleared context. This is needed to prevent the first
6904 constructed arg from mistakenly including the growing value. We'll push
6905 this value back on the obstack once the function evaluation is done, to
6906 restore a consistent processing context for our caller. This is fine as
6907 the address of growing objects isn't guaranteed to remain stable until
6908 they are finalized, and we expect this situation to be rare enough for
6909 the extra copy not to be an issue. */
6910 save_growing_size = obstack_object_size (&obstack);
6911 if (save_growing_size > 0)
6912 save_growing_value = obstack_finish (&obstack);
6914 /* Create a new spec processing context, and build the function
6915 arguments. */
6917 alloc_args ();
6918 if (do_spec_2 (args, soft_matched_part) < 0)
6919 fatal_error (input_location, "error in arguments to spec function %qs",
6920 func);
6922 /* argbuf_index is an index for the next argument to be inserted, and
6923 so contains the count of the args already inserted. */
6925 funcval = (*sf->func) (argbuf.length (),
6926 argbuf.address ());
6928 /* Pop the spec processing context. */
6929 argbuf.release ();
6930 argbuf = save_argbuf;
6932 arg_going = save_arg_going;
6933 delete_this_arg = save_delete_this_arg;
6934 this_is_output_file = save_this_is_output_file;
6935 this_is_library_file = save_this_is_library_file;
6936 this_is_linker_script = save_this_is_linker_script;
6937 input_from_pipe = save_input_from_pipe;
6938 suffix_subst = save_suffix_subst;
6940 if (save_growing_size > 0)
6941 obstack_grow (&obstack, save_growing_value, save_growing_size);
6943 return funcval;
6946 /* Handle a spec function call of the form:
6948 %:function(args)
6950 ARGS is processed as a spec in a separate context and split into an
6951 argument vector in the normal fashion. The function returns a string
6952 containing a spec which we then process in the caller's context, or
6953 NULL if no processing is required.
6955 If RETVAL_NONNULL is not NULL, then store a bool whether function
6956 returned non-NULL.
6958 SOFT_MATCHED_PART holds the current value of a matched * pattern, which
6959 may be re-expanded with a %* as part of the function arguments. */
6961 static const char *
6962 handle_spec_function (const char *p, bool *retval_nonnull,
6963 const char *soft_matched_part)
6965 char *func, *args;
6966 const char *endp, *funcval;
6967 int count;
6969 processing_spec_function++;
6971 /* Get the function name. */
6972 for (endp = p; *endp != '\0'; endp++)
6974 if (*endp == '(') /* ) */
6975 break;
6976 /* Only allow [A-Za-z0-9], -, and _ in function names. */
6977 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
6978 fatal_error (input_location, "malformed spec function name");
6980 if (*endp != '(') /* ) */
6981 fatal_error (input_location, "no arguments for spec function");
6982 func = save_string (p, endp - p);
6983 p = ++endp;
6985 /* Get the arguments. */
6986 for (count = 0; *endp != '\0'; endp++)
6988 /* ( */
6989 if (*endp == ')')
6991 if (count == 0)
6992 break;
6993 count--;
6995 else if (*endp == '(') /* ) */
6996 count++;
6998 /* ( */
6999 if (*endp != ')')
7000 fatal_error (input_location, "malformed spec function arguments");
7001 args = save_string (p, endp - p);
7002 p = ++endp;
7004 /* p now points to just past the end of the spec function expression. */
7006 funcval = eval_spec_function (func, args, soft_matched_part);
7007 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
7008 p = NULL;
7009 if (retval_nonnull)
7010 *retval_nonnull = funcval != NULL;
7012 free (func);
7013 free (args);
7015 processing_spec_function--;
7017 return p;
7020 /* Inline subroutine of handle_braces. Returns true if the current
7021 input suffix matches the atom bracketed by ATOM and END_ATOM. */
7022 static inline bool
7023 input_suffix_matches (const char *atom, const char *end_atom)
7025 return (input_suffix
7026 && !strncmp (input_suffix, atom, end_atom - atom)
7027 && input_suffix[end_atom - atom] == '\0');
7030 /* Subroutine of handle_braces. Returns true if the current
7031 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
7032 static bool
7033 input_spec_matches (const char *atom, const char *end_atom)
7035 return (input_file_compiler
7036 && input_file_compiler->suffix
7037 && input_file_compiler->suffix[0] != '\0'
7038 && !strncmp (input_file_compiler->suffix + 1, atom,
7039 end_atom - atom)
7040 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
7043 /* Subroutine of handle_braces. Returns true if a switch
7044 matching the atom bracketed by ATOM and END_ATOM appeared on the
7045 command line. */
7046 static bool
7047 switch_matches (const char *atom, const char *end_atom, int starred)
7049 int i;
7050 int len = end_atom - atom;
7051 int plen = starred ? len : -1;
7053 for (i = 0; i < n_switches; i++)
7054 if (!strncmp (switches[i].part1, atom, len)
7055 && (starred || switches[i].part1[len] == '\0')
7056 && check_live_switch (i, plen))
7057 return true;
7059 /* Check if a switch with separated form matching the atom.
7060 We check -D and -U switches. */
7061 else if (switches[i].args != 0)
7063 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
7064 && *switches[i].part1 == atom[0])
7066 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
7067 && (starred || (switches[i].part1[1] == '\0'
7068 && switches[i].args[0][len - 1] == '\0'))
7069 && check_live_switch (i, (starred ? 1 : -1)))
7070 return true;
7074 return false;
7077 /* Inline subroutine of handle_braces. Mark all of the switches which
7078 match ATOM (extends to END_ATOM; STARRED indicates whether there
7079 was a star after the atom) for later processing. */
7080 static inline void
7081 mark_matching_switches (const char *atom, const char *end_atom, int starred)
7083 int i;
7084 int len = end_atom - atom;
7085 int plen = starred ? len : -1;
7087 for (i = 0; i < n_switches; i++)
7088 if (!strncmp (switches[i].part1, atom, len)
7089 && (starred || switches[i].part1[len] == '\0')
7090 && check_live_switch (i, plen))
7091 switches[i].ordering = 1;
7094 /* Inline subroutine of handle_braces. Process all the currently
7095 marked switches through give_switch, and clear the marks. */
7096 static inline void
7097 process_marked_switches (void)
7099 int i;
7101 for (i = 0; i < n_switches; i++)
7102 if (switches[i].ordering == 1)
7104 switches[i].ordering = 0;
7105 give_switch (i, 0);
7109 /* Handle a %{ ... } construct. P points just inside the leading {.
7110 Returns a pointer one past the end of the brace block, or 0
7111 if we call do_spec_1 and that returns -1. */
7113 static const char *
7114 handle_braces (const char *p)
7116 const char *atom, *end_atom;
7117 const char *d_atom = NULL, *d_end_atom = NULL;
7118 char *esc_buf = NULL, *d_esc_buf = NULL;
7119 int esc;
7120 const char *orig = p;
7122 bool a_is_suffix;
7123 bool a_is_spectype;
7124 bool a_is_starred;
7125 bool a_is_negated;
7126 bool a_matched;
7128 bool a_must_be_last = false;
7129 bool ordered_set = false;
7130 bool disjunct_set = false;
7131 bool disj_matched = false;
7132 bool disj_starred = true;
7133 bool n_way_choice = false;
7134 bool n_way_matched = false;
7136 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7140 if (a_must_be_last)
7141 goto invalid;
7143 /* Scan one "atom" (S in the description above of %{}, possibly
7144 with '!', '.', '@', ',', or '*' modifiers). */
7145 a_matched = false;
7146 a_is_suffix = false;
7147 a_is_starred = false;
7148 a_is_negated = false;
7149 a_is_spectype = false;
7151 SKIP_WHITE ();
7152 if (*p == '!')
7153 p++, a_is_negated = true;
7155 SKIP_WHITE ();
7156 if (*p == '%' && p[1] == ':')
7158 atom = NULL;
7159 end_atom = NULL;
7160 p = handle_spec_function (p + 2, &a_matched, NULL);
7162 else
7164 if (*p == '.')
7165 p++, a_is_suffix = true;
7166 else if (*p == ',')
7167 p++, a_is_spectype = true;
7169 atom = p;
7170 esc = 0;
7171 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7172 || *p == ',' || *p == '.' || *p == '@' || *p == '\\')
7174 if (*p == '\\')
7176 p++;
7177 if (!*p)
7178 fatal_error (input_location,
7179 "braced spec %qs ends in escape", orig);
7180 esc++;
7182 p++;
7184 end_atom = p;
7186 if (esc)
7188 const char *ap;
7189 char *ep;
7191 if (esc_buf && esc_buf != d_esc_buf)
7192 free (esc_buf);
7193 esc_buf = NULL;
7194 ep = esc_buf = (char *) xmalloc (end_atom - atom - esc + 1);
7195 for (ap = atom; ap != end_atom; ap++, ep++)
7197 if (*ap == '\\')
7198 ap++;
7199 *ep = *ap;
7201 *ep = '\0';
7202 atom = esc_buf;
7203 end_atom = ep;
7206 if (*p == '*')
7207 p++, a_is_starred = 1;
7210 SKIP_WHITE ();
7211 switch (*p)
7213 case '&': case '}':
7214 /* Substitute the switch(es) indicated by the current atom. */
7215 ordered_set = true;
7216 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
7217 || a_is_spectype || atom == end_atom)
7218 goto invalid;
7220 mark_matching_switches (atom, end_atom, a_is_starred);
7222 if (*p == '}')
7223 process_marked_switches ();
7224 break;
7226 case '|': case ':':
7227 /* Substitute some text if the current atom appears as a switch
7228 or suffix. */
7229 disjunct_set = true;
7230 if (ordered_set)
7231 goto invalid;
7233 if (atom && atom == end_atom)
7235 if (!n_way_choice || disj_matched || *p == '|'
7236 || a_is_negated || a_is_suffix || a_is_spectype
7237 || a_is_starred)
7238 goto invalid;
7240 /* An empty term may appear as the last choice of an
7241 N-way choice set; it means "otherwise". */
7242 a_must_be_last = true;
7243 disj_matched = !n_way_matched;
7244 disj_starred = false;
7246 else
7248 if ((a_is_suffix || a_is_spectype) && a_is_starred)
7249 goto invalid;
7251 if (!a_is_starred)
7252 disj_starred = false;
7254 /* Don't bother testing this atom if we already have a
7255 match. */
7256 if (!disj_matched && !n_way_matched)
7258 if (atom == NULL)
7259 /* a_matched is already set by handle_spec_function. */;
7260 else if (a_is_suffix)
7261 a_matched = input_suffix_matches (atom, end_atom);
7262 else if (a_is_spectype)
7263 a_matched = input_spec_matches (atom, end_atom);
7264 else
7265 a_matched = switch_matches (atom, end_atom, a_is_starred);
7267 if (a_matched != a_is_negated)
7269 disj_matched = true;
7270 d_atom = atom;
7271 d_end_atom = end_atom;
7272 d_esc_buf = esc_buf;
7277 if (*p == ':')
7279 /* Found the body, that is, the text to substitute if the
7280 current disjunction matches. */
7281 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
7282 disj_matched && !n_way_matched);
7283 if (p == 0)
7284 goto done;
7286 /* If we have an N-way choice, reset state for the next
7287 disjunction. */
7288 if (*p == ';')
7290 n_way_choice = true;
7291 n_way_matched |= disj_matched;
7292 disj_matched = false;
7293 disj_starred = true;
7294 d_atom = d_end_atom = NULL;
7297 break;
7299 default:
7300 goto invalid;
7303 while (*p++ != '}');
7305 done:
7306 if (d_esc_buf && d_esc_buf != esc_buf)
7307 free (d_esc_buf);
7308 if (esc_buf)
7309 free (esc_buf);
7311 return p;
7313 invalid:
7314 fatal_error (input_location, "braced spec %qs is invalid at %qc", orig, *p);
7316 #undef SKIP_WHITE
7319 /* Subroutine of handle_braces. Scan and process a brace substitution body
7320 (X in the description of %{} syntax). P points one past the colon;
7321 ATOM and END_ATOM bracket the first atom which was found to be true
7322 (present) in the current disjunction; STARRED indicates whether all
7323 the atoms in the current disjunction were starred (for syntax validation);
7324 MATCHED indicates whether the disjunction matched or not, and therefore
7325 whether or not the body is to be processed through do_spec_1 or just
7326 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
7327 returns -1. */
7329 static const char *
7330 process_brace_body (const char *p, const char *atom, const char *end_atom,
7331 int starred, int matched)
7333 const char *body, *end_body;
7334 unsigned int nesting_level;
7335 bool have_subst = false;
7337 /* Locate the closing } or ;, honoring nested braces.
7338 Trim trailing whitespace. */
7339 body = p;
7340 nesting_level = 1;
7341 for (;;)
7343 if (*p == '{')
7344 nesting_level++;
7345 else if (*p == '}')
7347 if (!--nesting_level)
7348 break;
7350 else if (*p == ';' && nesting_level == 1)
7351 break;
7352 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
7353 have_subst = true;
7354 else if (*p == '\0')
7355 goto invalid;
7356 p++;
7359 end_body = p;
7360 while (end_body[-1] == ' ' || end_body[-1] == '\t')
7361 end_body--;
7363 if (have_subst && !starred)
7364 goto invalid;
7366 if (matched)
7368 /* Copy the substitution body to permanent storage and execute it.
7369 If have_subst is false, this is a simple matter of running the
7370 body through do_spec_1... */
7371 char *string = save_string (body, end_body - body);
7372 if (!have_subst)
7374 if (do_spec_1 (string, 0, NULL) < 0)
7376 free (string);
7377 return 0;
7380 else
7382 /* ... but if have_subst is true, we have to process the
7383 body once for each matching switch, with %* set to the
7384 variant part of the switch. */
7385 unsigned int hard_match_len = end_atom - atom;
7386 int i;
7388 for (i = 0; i < n_switches; i++)
7389 if (!strncmp (switches[i].part1, atom, hard_match_len)
7390 && check_live_switch (i, hard_match_len))
7392 if (do_spec_1 (string, 0,
7393 &switches[i].part1[hard_match_len]) < 0)
7395 free (string);
7396 return 0;
7398 /* Pass any arguments this switch has. */
7399 give_switch (i, 1);
7400 suffix_subst = NULL;
7403 free (string);
7406 return p;
7408 invalid:
7409 fatal_error (input_location, "braced spec body %qs is invalid", body);
7412 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
7413 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
7414 spec, or -1 if either exact match or %* is used.
7416 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
7417 whose value does not begin with "no-" is obsoleted by the same value
7418 with the "no-", similarly for a switch with the "no-" prefix. */
7420 static int
7421 check_live_switch (int switchnum, int prefix_length)
7423 const char *name = switches[switchnum].part1;
7424 int i;
7426 /* If we already processed this switch and determined if it was
7427 live or not, return our past determination. */
7428 if (switches[switchnum].live_cond != 0)
7429 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
7430 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
7431 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
7432 == 0);
7434 /* In the common case of {<at-most-one-letter>*}, a negating
7435 switch would always match, so ignore that case. We will just
7436 send the conflicting switches to the compiler phase. */
7437 if (prefix_length >= 0 && prefix_length <= 1)
7438 return 1;
7440 /* Now search for duplicate in a manner that depends on the name. */
7441 switch (*name)
7443 case 'O':
7444 for (i = switchnum + 1; i < n_switches; i++)
7445 if (switches[i].part1[0] == 'O')
7447 switches[switchnum].validated = true;
7448 switches[switchnum].live_cond = SWITCH_FALSE;
7449 return 0;
7451 break;
7453 case 'W': case 'f': case 'm': case 'g':
7454 if (startswith (name + 1, "no-"))
7456 /* We have Xno-YYY, search for XYYY. */
7457 for (i = switchnum + 1; i < n_switches; i++)
7458 if (switches[i].part1[0] == name[0]
7459 && ! strcmp (&switches[i].part1[1], &name[4]))
7461 /* --specs are validated with the validate_switches mechanism. */
7462 if (switches[switchnum].known)
7463 switches[switchnum].validated = true;
7464 switches[switchnum].live_cond = SWITCH_FALSE;
7465 return 0;
7468 else
7470 /* We have XYYY, search for Xno-YYY. */
7471 for (i = switchnum + 1; i < n_switches; i++)
7472 if (switches[i].part1[0] == name[0]
7473 && switches[i].part1[1] == 'n'
7474 && switches[i].part1[2] == 'o'
7475 && switches[i].part1[3] == '-'
7476 && !strcmp (&switches[i].part1[4], &name[1]))
7478 /* --specs are validated with the validate_switches mechanism. */
7479 if (switches[switchnum].known)
7480 switches[switchnum].validated = true;
7481 switches[switchnum].live_cond = SWITCH_FALSE;
7482 return 0;
7485 break;
7488 /* Otherwise the switch is live. */
7489 switches[switchnum].live_cond |= SWITCH_LIVE;
7490 return 1;
7493 /* Pass a switch to the current accumulating command
7494 in the same form that we received it.
7495 SWITCHNUM identifies the switch; it is an index into
7496 the vector of switches gcc received, which is `switches'.
7497 This cannot fail since it never finishes a command line.
7499 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
7501 static void
7502 give_switch (int switchnum, int omit_first_word)
7504 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
7505 return;
7507 if (!omit_first_word)
7509 do_spec_1 ("-", 0, NULL);
7510 do_spec_1 (switches[switchnum].part1, 1, NULL);
7513 if (switches[switchnum].args != 0)
7515 const char **p;
7516 for (p = switches[switchnum].args; *p; p++)
7518 const char *arg = *p;
7520 do_spec_1 (" ", 0, NULL);
7521 if (suffix_subst)
7523 unsigned length = strlen (arg);
7524 int dot = 0;
7526 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
7527 if (arg[length] == '.')
7529 (CONST_CAST (char *, arg))[length] = 0;
7530 dot = 1;
7531 break;
7533 do_spec_1 (arg, 1, NULL);
7534 if (dot)
7535 (CONST_CAST (char *, arg))[length] = '.';
7536 do_spec_1 (suffix_subst, 1, NULL);
7538 else
7539 do_spec_1 (arg, 1, NULL);
7543 do_spec_1 (" ", 0, NULL);
7544 switches[switchnum].validated = true;
7547 /* Print GCC configuration (e.g. version, thread model, target,
7548 configuration_arguments) to a given FILE. */
7550 static void
7551 print_configuration (FILE *file)
7553 int n;
7554 const char *thrmod;
7556 fnotice (file, "Target: %s\n", spec_machine);
7557 fnotice (file, "Configured with: %s\n", configuration_arguments);
7559 #ifdef THREAD_MODEL_SPEC
7560 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7561 but there's no point in doing all this processing just to get
7562 thread_model back. */
7563 obstack_init (&obstack);
7564 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
7565 obstack_1grow (&obstack, '\0');
7566 thrmod = XOBFINISH (&obstack, const char *);
7567 #else
7568 thrmod = thread_model;
7569 #endif
7571 fnotice (file, "Thread model: %s\n", thrmod);
7572 fnotice (file, "Supported LTO compression algorithms: zlib");
7573 #ifdef HAVE_ZSTD_H
7574 fnotice (file, " zstd");
7575 #endif
7576 fnotice (file, "\n");
7578 /* compiler_version is truncated at the first space when initialized
7579 from version string, so truncate version_string at the first space
7580 before comparing. */
7581 for (n = 0; version_string[n]; n++)
7582 if (version_string[n] == ' ')
7583 break;
7585 if (! strncmp (version_string, compiler_version, n)
7586 && compiler_version[n] == 0)
7587 fnotice (file, "gcc version %s %s\n", version_string,
7588 pkgversion_string);
7589 else
7590 fnotice (file, "gcc driver version %s %sexecuting gcc version %s\n",
7591 version_string, pkgversion_string, compiler_version);
7595 #define RETRY_ICE_ATTEMPTS 3
7597 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
7599 static bool
7600 files_equal_p (char *file1, char *file2)
7602 struct stat st1, st2;
7603 off_t n, len;
7604 int fd1, fd2;
7605 const int bufsize = 8192;
7606 char *buf = XNEWVEC (char, bufsize);
7608 fd1 = open (file1, O_RDONLY);
7609 fd2 = open (file2, O_RDONLY);
7611 if (fd1 < 0 || fd2 < 0)
7612 goto error;
7614 if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
7615 goto error;
7617 if (st1.st_size != st2.st_size)
7618 goto error;
7620 for (n = st1.st_size; n; n -= len)
7622 len = n;
7623 if ((int) len > bufsize / 2)
7624 len = bufsize / 2;
7626 if (read (fd1, buf, len) != (int) len
7627 || read (fd2, buf + bufsize / 2, len) != (int) len)
7629 goto error;
7632 if (memcmp (buf, buf + bufsize / 2, len) != 0)
7633 goto error;
7636 free (buf);
7637 close (fd1);
7638 close (fd2);
7640 return 1;
7642 error:
7643 free (buf);
7644 close (fd1);
7645 close (fd2);
7646 return 0;
7649 /* Check that compiler's output doesn't differ across runs.
7650 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
7651 stdout and stderr for each compiler run. Return true if all of
7652 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
7654 static bool
7655 check_repro (char **temp_stdout_files, char **temp_stderr_files)
7657 int i;
7658 for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
7660 if (!files_equal_p (temp_stdout_files[i], temp_stdout_files[i + 1])
7661 || !files_equal_p (temp_stderr_files[i], temp_stderr_files[i + 1]))
7663 fnotice (stderr, "The bug is not reproducible, so it is"
7664 " likely a hardware or OS problem.\n");
7665 break;
7668 return i == RETRY_ICE_ATTEMPTS - 2;
7671 enum attempt_status {
7672 ATTEMPT_STATUS_FAIL_TO_RUN,
7673 ATTEMPT_STATUS_SUCCESS,
7674 ATTEMPT_STATUS_ICE
7678 /* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
7679 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
7680 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
7681 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
7682 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
7683 ATTEMPT_STATUS_SUCCESS otherwise. */
7685 static enum attempt_status
7686 run_attempt (const char **new_argv, const char *out_temp,
7687 const char *err_temp, int emit_system_info, int append)
7690 if (emit_system_info)
7692 FILE *file_out = fopen (err_temp, "a");
7693 print_configuration (file_out);
7694 fputs ("\n", file_out);
7695 fclose (file_out);
7698 int exit_status;
7699 const char *errmsg;
7700 struct pex_obj *pex;
7701 int err;
7702 int pex_flags = PEX_USE_PIPES | PEX_LAST;
7703 enum attempt_status status = ATTEMPT_STATUS_FAIL_TO_RUN;
7705 if (append)
7706 pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
7708 pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
7709 if (!pex)
7710 fatal_error (input_location, "%<pex_init%> failed: %m");
7712 errmsg = pex_run (pex, pex_flags, new_argv[0],
7713 CONST_CAST2 (char *const *, const char **, &new_argv[1]),
7714 out_temp, err_temp, &err);
7715 if (errmsg != NULL)
7717 errno = err;
7718 fatal_error (input_location,
7719 err ? G_ ("cannot execute %qs: %s: %m")
7720 : G_ ("cannot execute %qs: %s"),
7721 new_argv[0], errmsg);
7724 if (!pex_get_status (pex, 1, &exit_status))
7725 goto out;
7727 switch (WEXITSTATUS (exit_status))
7729 case ICE_EXIT_CODE:
7730 status = ATTEMPT_STATUS_ICE;
7731 break;
7733 case SUCCESS_EXIT_CODE:
7734 status = ATTEMPT_STATUS_SUCCESS;
7735 break;
7737 default:
7741 out:
7742 pex_free (pex);
7743 return status;
7746 /* This routine reads lines from IN file, adds C++ style comments
7747 at the begining of each line and writes result into OUT. */
7749 static void
7750 insert_comments (const char *file_in, const char *file_out)
7752 FILE *in = fopen (file_in, "rb");
7753 FILE *out = fopen (file_out, "wb");
7754 char line[256];
7756 bool add_comment = true;
7757 while (fgets (line, sizeof (line), in))
7759 if (add_comment)
7760 fputs ("// ", out);
7761 fputs (line, out);
7762 add_comment = strchr (line, '\n') != NULL;
7765 fclose (in);
7766 fclose (out);
7769 /* This routine adds preprocessed source code into the given ERR_FILE.
7770 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
7771 add information in report file. RUN_ATTEMPT should return
7772 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
7774 static void
7775 do_report_bug (const char **new_argv, const int nargs,
7776 char **out_file, char **err_file)
7778 int i, status;
7779 ssize_t ret;
7780 int fd = open (*out_file, O_RDWR | O_APPEND);
7781 if (fd < 0)
7782 return;
7783 ret = write (fd, "\n//", 3);
7784 for (i = 0; i < nargs; i++)
7786 ret = write (fd, " ", 1);
7787 ret = write (fd, new_argv[i], strlen (new_argv[i]));
7789 ret = write (fd, "\n\n", 2);
7790 (void)ret;
7791 close (fd);
7792 new_argv[nargs] = "-E";
7793 new_argv[nargs + 1] = NULL;
7795 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
7797 if (status == ATTEMPT_STATUS_SUCCESS)
7799 fnotice (stderr, "Preprocessed source stored into %s file,"
7800 " please attach this to your bugreport.\n", *out_file);
7801 /* Make sure it is not deleted. */
7802 free (*out_file);
7803 *out_file = NULL;
7807 /* Try to reproduce ICE. If bug is reproducible, generate report .err file
7808 containing GCC configuration, backtrace, compiler's command line options
7809 and preprocessed source code. */
7811 static void
7812 try_generate_repro (const char **argv)
7814 int i, nargs, out_arg = -1, quiet = 0, attempt;
7815 const char **new_argv;
7816 char *temp_files[RETRY_ICE_ATTEMPTS * 2];
7817 char **temp_stdout_files = &temp_files[0];
7818 char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
7820 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
7821 return;
7823 for (nargs = 0; argv[nargs] != NULL; ++nargs)
7824 /* Only retry compiler ICEs, not preprocessor ones. */
7825 if (! strcmp (argv[nargs], "-E"))
7826 return;
7827 else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
7829 if (out_arg == -1)
7830 out_arg = nargs;
7831 else
7832 return;
7834 /* If the compiler is going to output any time information,
7835 it might varry between invocations. */
7836 else if (! strcmp (argv[nargs], "-quiet"))
7837 quiet = 1;
7838 else if (! strcmp (argv[nargs], "-ftime-report"))
7839 return;
7841 if (out_arg == -1 || !quiet)
7842 return;
7844 memset (temp_files, '\0', sizeof (temp_files));
7845 new_argv = XALLOCAVEC (const char *, nargs + 4);
7846 memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
7847 new_argv[nargs++] = "-frandom-seed=0";
7848 new_argv[nargs++] = "-fdump-noaddr";
7849 new_argv[nargs] = NULL;
7850 if (new_argv[out_arg][2] == '\0')
7851 new_argv[out_arg + 1] = "-";
7852 else
7853 new_argv[out_arg] = "-o-";
7855 int status;
7856 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
7858 int emit_system_info = 0;
7859 int append = 0;
7860 temp_stdout_files[attempt] = make_temp_file (".out");
7861 temp_stderr_files[attempt] = make_temp_file (".err");
7863 if (attempt == RETRY_ICE_ATTEMPTS - 1)
7865 append = 1;
7866 emit_system_info = 1;
7869 status = run_attempt (new_argv, temp_stdout_files[attempt],
7870 temp_stderr_files[attempt], emit_system_info,
7871 append);
7873 if (status != ATTEMPT_STATUS_ICE)
7875 fnotice (stderr, "The bug is not reproducible, so it is"
7876 " likely a hardware or OS problem.\n");
7877 goto out;
7881 if (!check_repro (temp_stdout_files, temp_stderr_files))
7882 goto out;
7885 /* Insert commented out backtrace into report file. */
7886 char **stderr_commented = &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1];
7887 insert_comments (temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
7888 *stderr_commented);
7890 /* In final attempt we append compiler options and preprocesssed code to last
7891 generated .out file with configuration and backtrace. */
7892 char **err = &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1];
7893 do_report_bug (new_argv, nargs, stderr_commented, err);
7896 out:
7897 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
7898 if (temp_files[i])
7900 unlink (temp_stdout_files[i]);
7901 free (temp_stdout_files[i]);
7905 /* Search for a file named NAME trying various prefixes including the
7906 user's -B prefix and some standard ones.
7907 Return the absolute file name found. If nothing is found, return NAME. */
7909 static const char *
7910 find_file (const char *name)
7912 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
7913 return newname ? newname : name;
7916 /* Determine whether a directory exists. If LINKER, return 0 for
7917 certain fixed names not needed by the linker. */
7919 static int
7920 is_directory (const char *path1, bool linker)
7922 int len1;
7923 char *path;
7924 char *cp;
7925 struct stat st;
7927 /* Ensure the string ends with "/.". The resulting path will be a
7928 directory even if the given path is a symbolic link. */
7929 len1 = strlen (path1);
7930 path = (char *) alloca (3 + len1);
7931 memcpy (path, path1, len1);
7932 cp = path + len1;
7933 if (!IS_DIR_SEPARATOR (cp[-1]))
7934 *cp++ = DIR_SEPARATOR;
7935 *cp++ = '.';
7936 *cp = '\0';
7938 /* Exclude directories that the linker is known to search. */
7939 if (linker
7940 && IS_DIR_SEPARATOR (path[0])
7941 && ((cp - path == 6
7942 && filename_ncmp (path + 1, "lib", 3) == 0)
7943 || (cp - path == 10
7944 && filename_ncmp (path + 1, "usr", 3) == 0
7945 && IS_DIR_SEPARATOR (path[4])
7946 && filename_ncmp (path + 5, "lib", 3) == 0)))
7947 return 0;
7949 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
7952 /* Set up the various global variables to indicate that we're processing
7953 the input file named FILENAME. */
7955 void
7956 set_input (const char *filename)
7958 const char *p;
7960 gcc_input_filename = filename;
7961 input_filename_length = strlen (gcc_input_filename);
7962 input_basename = lbasename (gcc_input_filename);
7964 /* Find a suffix starting with the last period,
7965 and set basename_length to exclude that suffix. */
7966 basename_length = strlen (input_basename);
7967 suffixed_basename_length = basename_length;
7968 p = input_basename + basename_length;
7969 while (p != input_basename && *p != '.')
7970 --p;
7971 if (*p == '.' && p != input_basename)
7973 basename_length = p - input_basename;
7974 input_suffix = p + 1;
7976 else
7977 input_suffix = "";
7979 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
7980 we will need to do a stat on the gcc_input_filename. The
7981 INPUT_STAT_SET signals that the stat is needed. */
7982 input_stat_set = 0;
7985 /* On fatal signals, delete all the temporary files. */
7987 static void
7988 fatal_signal (int signum)
7990 signal (signum, SIG_DFL);
7991 delete_failure_queue ();
7992 delete_temp_files ();
7993 /* Get the same signal again, this time not handled,
7994 so its normal effect occurs. */
7995 kill (getpid (), signum);
7998 /* Compare the contents of the two files named CMPFILE[0] and
7999 CMPFILE[1]. Return zero if they're identical, nonzero
8000 otherwise. */
8002 static int
8003 compare_files (char *cmpfile[])
8005 int ret = 0;
8006 FILE *temp[2] = { NULL, NULL };
8007 int i;
8009 #if HAVE_MMAP_FILE
8011 size_t length[2];
8012 void *map[2] = { NULL, NULL };
8014 for (i = 0; i < 2; i++)
8016 struct stat st;
8018 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
8020 error ("%s: could not determine length of compare-debug file %s",
8021 gcc_input_filename, cmpfile[i]);
8022 ret = 1;
8023 break;
8026 length[i] = st.st_size;
8029 if (!ret && length[0] != length[1])
8031 error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename);
8032 ret = 1;
8035 if (!ret)
8036 for (i = 0; i < 2; i++)
8038 int fd = open (cmpfile[i], O_RDONLY);
8039 if (fd < 0)
8041 error ("%s: could not open compare-debug file %s",
8042 gcc_input_filename, cmpfile[i]);
8043 ret = 1;
8044 break;
8047 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
8048 close (fd);
8050 if (map[i] == (void *) MAP_FAILED)
8052 ret = -1;
8053 break;
8057 if (!ret)
8059 if (memcmp (map[0], map[1], length[0]) != 0)
8061 error ("%s: %<-fcompare-debug%> failure", gcc_input_filename);
8062 ret = 1;
8066 for (i = 0; i < 2; i++)
8067 if (map[i])
8068 munmap ((caddr_t) map[i], length[i]);
8070 if (ret >= 0)
8071 return ret;
8073 ret = 0;
8075 #endif
8077 for (i = 0; i < 2; i++)
8079 temp[i] = fopen (cmpfile[i], "r");
8080 if (!temp[i])
8082 error ("%s: could not open compare-debug file %s",
8083 gcc_input_filename, cmpfile[i]);
8084 ret = 1;
8085 break;
8089 if (!ret && temp[0] && temp[1])
8090 for (;;)
8092 int c0, c1;
8093 c0 = fgetc (temp[0]);
8094 c1 = fgetc (temp[1]);
8096 if (c0 != c1)
8098 error ("%s: %<-fcompare-debug%> failure",
8099 gcc_input_filename);
8100 ret = 1;
8101 break;
8104 if (c0 == EOF)
8105 break;
8108 for (i = 1; i >= 0; i--)
8110 if (temp[i])
8111 fclose (temp[i]);
8114 return ret;
8117 driver::driver (bool can_finalize, bool debug) :
8118 explicit_link_files (NULL),
8119 decoded_options (NULL)
8121 env.init (can_finalize, debug);
8124 driver::~driver ()
8126 XDELETEVEC (explicit_link_files);
8127 XDELETEVEC (decoded_options);
8130 /* driver::main is implemented as a series of driver:: method calls. */
8133 driver::main (int argc, char **argv)
8135 bool early_exit;
8137 set_progname (argv[0]);
8138 expand_at_files (&argc, &argv);
8139 decode_argv (argc, const_cast <const char **> (argv));
8140 global_initializations ();
8141 build_multilib_strings ();
8142 set_up_specs ();
8143 putenv_COLLECT_AS_OPTIONS (assembler_options);
8144 putenv_COLLECT_GCC (argv[0]);
8145 maybe_putenv_COLLECT_LTO_WRAPPER ();
8146 maybe_putenv_OFFLOAD_TARGETS ();
8147 handle_unrecognized_options ();
8149 if (completion)
8151 // sdcpp m_option_proposer.suggest_completion (completion);
8152 return 0;
8155 if (!maybe_print_and_exit ())
8156 return 0;
8158 early_exit = prepare_infiles ();
8159 if (early_exit)
8160 return get_exit_code ();
8162 do_spec_on_infiles ();
8163 maybe_run_linker (argv[0]);
8164 final_actions ();
8165 return get_exit_code ();
8168 /* Locate the final component of argv[0] after any leading path, and set
8169 the program name accordingly. */
8171 void
8172 driver::set_progname (const char *argv0) const
8174 const char *p = argv0 + strlen (argv0);
8175 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
8176 --p;
8177 progname = p;
8179 xmalloc_set_program_name (progname);
8182 /* Expand any @ files within the command-line args,
8183 setting at_file_supplied if any were expanded. */
8185 void
8186 driver::expand_at_files (int *argc, char ***argv) const
8188 char **old_argv = *argv;
8190 expandargv (argc, argv);
8192 /* Determine if any expansions were made. */
8193 if (*argv != old_argv)
8194 at_file_supplied = true;
8197 /* Decode the command-line arguments from argc/argv into the
8198 decoded_options array. */
8200 void
8201 driver::decode_argv (int argc, const char **argv)
8203 init_opts_obstack ();
8204 init_options_struct (&global_options, &global_options_set);
8206 decode_cmdline_options_to_array (argc, argv,
8207 CL_DRIVER,
8208 &decoded_options, &decoded_options_count);
8211 /* Perform various initializations and setup. */
8213 void
8214 driver::global_initializations ()
8216 /* Unlock the stdio streams. */
8217 unlock_std_streams ();
8219 gcc_init_libintl ();
8221 diagnostic_initialize (global_dc, 0);
8222 diagnostic_color_init (global_dc);
8223 diagnostic_urls_init (global_dc);
8225 #ifdef GCC_DRIVER_HOST_INITIALIZATION
8226 /* Perform host dependent initialization when needed. */
8227 GCC_DRIVER_HOST_INITIALIZATION;
8228 #endif
8230 if (atexit (delete_temp_files) != 0)
8231 fatal_error (input_location, "atexit failed");
8233 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
8234 signal (SIGINT, fatal_signal);
8235 #ifdef SIGHUP
8236 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
8237 signal (SIGHUP, fatal_signal);
8238 #endif
8239 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
8240 signal (SIGTERM, fatal_signal);
8241 #ifdef SIGPIPE
8242 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
8243 signal (SIGPIPE, fatal_signal);
8244 #endif
8245 #ifdef SIGCHLD
8246 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
8247 receive the signal. A different setting is inheritable */
8248 signal (SIGCHLD, SIG_DFL);
8249 #endif
8251 /* Parsing and gimplification sometimes need quite large stack.
8252 Increase stack size limits if possible. */
8253 stack_limit_increase (64 * 1024 * 1024);
8255 /* Allocate the argument vector. */
8256 alloc_args ();
8258 obstack_init (&obstack);
8261 /* Build multilib_select, et. al from the separate lines that make up each
8262 multilib selection. */
8264 void
8265 driver::build_multilib_strings () const
8268 const char *p;
8269 const char *const *q = multilib_raw;
8270 int need_space;
8272 obstack_init (&multilib_obstack);
8273 while ((p = *q++) != (char *) 0)
8274 obstack_grow (&multilib_obstack, p, strlen (p));
8276 obstack_1grow (&multilib_obstack, 0);
8277 multilib_select = XOBFINISH (&multilib_obstack, const char *);
8279 q = multilib_matches_raw;
8280 while ((p = *q++) != (char *) 0)
8281 obstack_grow (&multilib_obstack, p, strlen (p));
8283 obstack_1grow (&multilib_obstack, 0);
8284 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
8286 q = multilib_exclusions_raw;
8287 while ((p = *q++) != (char *) 0)
8288 obstack_grow (&multilib_obstack, p, strlen (p));
8290 obstack_1grow (&multilib_obstack, 0);
8291 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
8293 q = multilib_reuse_raw;
8294 while ((p = *q++) != (char *) 0)
8295 obstack_grow (&multilib_obstack, p, strlen (p));
8297 obstack_1grow (&multilib_obstack, 0);
8298 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
8300 need_space = FALSE;
8301 for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
8303 if (need_space)
8304 obstack_1grow (&multilib_obstack, ' ');
8305 obstack_grow (&multilib_obstack,
8306 multilib_defaults_raw[i],
8307 strlen (multilib_defaults_raw[i]));
8308 need_space = TRUE;
8311 obstack_1grow (&multilib_obstack, 0);
8312 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
8316 /* Set up the spec-handling machinery. */
8318 void
8319 driver::set_up_specs () const
8321 const char *spec_machine_suffix;
8322 char *specs_file;
8323 size_t i;
8325 #ifdef INIT_ENVIRONMENT
8326 /* Set up any other necessary machine specific environment variables. */
8327 xputenv (INIT_ENVIRONMENT);
8328 #endif
8330 /* Make a table of what switches there are (switches, n_switches).
8331 Make a table of specified input files (infiles, n_infiles).
8332 Decode switches that are handled locally. */
8334 process_command (decoded_options_count, decoded_options);
8336 /* Initialize the vector of specs to just the default.
8337 This means one element containing 0s, as a terminator. */
8339 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
8340 memcpy (compilers, default_compilers, sizeof default_compilers);
8341 n_compilers = n_default_compilers;
8343 /* Read specs from a file if there is one. */
8345 machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
8346 accel_dir_suffix, dir_separator_str, NULL);
8347 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
8349 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
8350 /* Read the specs file unless it is a default one. */
8351 if (specs_file != 0 && strcmp (specs_file, "specs"))
8352 read_specs (specs_file, true, false);
8353 else
8354 init_spec ();
8356 #ifdef ACCEL_COMPILER
8357 spec_machine_suffix = machine_suffix;
8358 #else
8359 spec_machine_suffix = just_machine_suffix;
8360 #endif
8362 /* We need to check standard_exec_prefix/spec_machine_suffix/specs
8363 for any override of as, ld and libraries. */
8364 specs_file = (char *) alloca (strlen (standard_exec_prefix)
8365 + strlen (spec_machine_suffix) + sizeof ("specs"));
8366 strcpy (specs_file, standard_exec_prefix);
8367 strcat (specs_file, spec_machine_suffix);
8368 strcat (specs_file, "specs");
8369 if (access (specs_file, R_OK) == 0)
8370 read_specs (specs_file, true, false);
8372 /* Process any configure-time defaults specified for the command line
8373 options, via OPTION_DEFAULT_SPECS. */
8374 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
8375 do_option_spec (option_default_specs[i].name,
8376 option_default_specs[i].spec);
8378 /* Process DRIVER_SELF_SPECS, adding any new options to the end
8379 of the command line. */
8381 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
8382 do_self_spec (driver_self_specs[i]);
8384 /* If not cross-compiling, look for executables in the standard
8385 places. */
8386 if (*cross_compile == '0')
8388 if (*md_exec_prefix)
8390 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
8391 PREFIX_PRIORITY_LAST, 0, 0);
8395 /* Process sysroot_suffix_spec. */
8396 if (*sysroot_suffix_spec != 0
8397 && !no_sysroot_suffix
8398 && do_spec_2 (sysroot_suffix_spec, NULL) == 0)
8400 if (argbuf.length () > 1)
8401 error ("spec failure: more than one argument to "
8402 "%<SYSROOT_SUFFIX_SPEC%>");
8403 else if (argbuf.length () == 1)
8404 target_sysroot_suffix = xstrdup (argbuf.last ());
8407 #ifdef HAVE_LD_SYSROOT
8408 /* Pass the --sysroot option to the linker, if it supports that. If
8409 there is a sysroot_suffix_spec, it has already been processed by
8410 this point, so target_system_root really is the system root we
8411 should be using. */
8412 if (target_system_root)
8414 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
8415 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
8416 set_spec ("link", XOBFINISH (&obstack, const char *), false);
8418 #endif
8420 /* Process sysroot_hdrs_suffix_spec. */
8421 if (*sysroot_hdrs_suffix_spec != 0
8422 && !no_sysroot_suffix
8423 && do_spec_2 (sysroot_hdrs_suffix_spec, NULL) == 0)
8425 if (argbuf.length () > 1)
8426 error ("spec failure: more than one argument "
8427 "to %<SYSROOT_HEADERS_SUFFIX_SPEC%>");
8428 else if (argbuf.length () == 1)
8429 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
8432 /* Look for startfiles in the standard places. */
8433 if (*startfile_prefix_spec != 0
8434 && do_spec_2 (startfile_prefix_spec, NULL) == 0
8435 && do_spec_1 (" ", 0, NULL) == 0)
8437 for (const char *arg : argbuf)
8438 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
8439 PREFIX_PRIORITY_LAST, 0, 1);
8441 /* We should eventually get rid of all these and stick to
8442 startfile_prefix_spec exclusively. */
8443 else if (*cross_compile == '0' || target_system_root)
8445 if (*md_startfile_prefix)
8446 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
8447 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
8449 if (*md_startfile_prefix_1)
8450 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
8451 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
8453 /* If standard_startfile_prefix is relative, base it on
8454 standard_exec_prefix. This lets us move the installed tree
8455 as a unit. If GCC_EXEC_PREFIX is defined, base
8456 standard_startfile_prefix on that as well.
8458 If the prefix is relative, only search it for native compilers;
8459 otherwise we will search a directory containing host libraries. */
8460 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
8461 add_sysrooted_prefix (&startfile_prefixes,
8462 standard_startfile_prefix, "BINUTILS",
8463 PREFIX_PRIORITY_LAST, 0, 1);
8464 else if (*cross_compile == '0')
8466 add_prefix (&startfile_prefixes,
8467 concat (gcc_exec_prefix
8468 ? gcc_exec_prefix : standard_exec_prefix,
8469 machine_suffix,
8470 standard_startfile_prefix, NULL),
8471 NULL, PREFIX_PRIORITY_LAST, 0, 1);
8474 /* Sysrooted prefixes are relocated because target_system_root is
8475 also relocated by gcc_exec_prefix. */
8476 if (*standard_startfile_prefix_1)
8477 add_sysrooted_prefix (&startfile_prefixes,
8478 standard_startfile_prefix_1, "BINUTILS",
8479 PREFIX_PRIORITY_LAST, 0, 1);
8480 if (*standard_startfile_prefix_2)
8481 add_sysrooted_prefix (&startfile_prefixes,
8482 standard_startfile_prefix_2, "BINUTILS",
8483 PREFIX_PRIORITY_LAST, 0, 1);
8486 /* Process any user specified specs in the order given on the command
8487 line. */
8488 for (struct user_specs *uptr = user_specs_head; uptr; uptr = uptr->next)
8490 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
8491 R_OK, true);
8492 read_specs (filename ? filename : uptr->filename, false, true);
8495 /* Process any user self specs. */
8497 struct spec_list *sl;
8498 for (sl = specs; sl; sl = sl->next)
8499 if (sl->name_len == sizeof "self_spec" - 1
8500 && !strcmp (sl->name, "self_spec"))
8501 do_self_spec (*sl->ptr_spec);
8504 if (compare_debug)
8506 enum save_temps save;
8508 if (!compare_debug_second)
8510 n_switches_debug_check[1] = n_switches;
8511 n_switches_alloc_debug_check[1] = n_switches_alloc;
8512 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
8513 n_switches_alloc);
8515 do_self_spec ("%:compare-debug-self-opt()");
8516 n_switches_debug_check[0] = n_switches;
8517 n_switches_alloc_debug_check[0] = n_switches_alloc;
8518 switches_debug_check[0] = switches;
8520 n_switches = n_switches_debug_check[1];
8521 n_switches_alloc = n_switches_alloc_debug_check[1];
8522 switches = switches_debug_check[1];
8525 /* Avoid crash when computing %j in this early. */
8526 save = save_temps_flag;
8527 save_temps_flag = SAVE_TEMPS_NONE;
8529 compare_debug = -compare_debug;
8530 do_self_spec ("%:compare-debug-self-opt()");
8532 save_temps_flag = save;
8534 if (!compare_debug_second)
8536 n_switches_debug_check[1] = n_switches;
8537 n_switches_alloc_debug_check[1] = n_switches_alloc;
8538 switches_debug_check[1] = switches;
8539 compare_debug = -compare_debug;
8540 n_switches = n_switches_debug_check[0];
8541 n_switches_alloc = n_switches_debug_check[0];
8542 switches = switches_debug_check[0];
8547 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
8548 if (gcc_exec_prefix)
8549 gcc_exec_prefix = concat (gcc_exec_prefix, spec_host_machine,
8550 dir_separator_str, spec_version,
8551 accel_dir_suffix, dir_separator_str, NULL);
8553 /* Now we have the specs.
8554 Set the `valid' bits for switches that match anything in any spec. */
8556 validate_all_switches ();
8558 /* Now that we have the switches and the specs, set
8559 the subdirectory based on the options. */
8560 set_multilib_dir ();
8563 /* Set up to remember the pathname of gcc and any options
8564 needed for collect. We use argv[0] instead of progname because
8565 we need the complete pathname. */
8567 void
8568 driver::putenv_COLLECT_GCC (const char *argv0) const
8570 obstack_init (&collect_obstack);
8571 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
8572 obstack_grow (&collect_obstack, argv0, strlen (argv0) + 1);
8573 xputenv (XOBFINISH (&collect_obstack, char *));
8576 /* Set up to remember the pathname of the lto wrapper. */
8578 void
8579 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
8581 char *lto_wrapper_file;
8583 if (have_c)
8584 lto_wrapper_file = NULL;
8585 else
8586 lto_wrapper_file = find_a_program ("lto-wrapper");
8587 if (lto_wrapper_file)
8589 lto_wrapper_file = convert_white_space (lto_wrapper_file);
8590 set_static_spec_owned (&lto_wrapper_spec, lto_wrapper_file);
8591 obstack_init (&collect_obstack);
8592 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
8593 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
8594 obstack_grow (&collect_obstack, lto_wrapper_spec,
8595 strlen (lto_wrapper_spec) + 1);
8596 xputenv (XOBFINISH (&collect_obstack, char *));
8601 /* Set up to remember the names of offload targets. */
8603 void
8604 driver::maybe_putenv_OFFLOAD_TARGETS () const
8606 if (offload_targets && offload_targets[0] != '\0')
8608 obstack_grow (&collect_obstack, "OFFLOAD_TARGET_NAMES=",
8609 sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
8610 obstack_grow (&collect_obstack, offload_targets,
8611 strlen (offload_targets) + 1);
8612 xputenv (XOBFINISH (&collect_obstack, char *));
8613 #if OFFLOAD_DEFAULTED
8614 if (offload_targets_default)
8615 xputenv ("OFFLOAD_TARGET_DEFAULT=1");
8616 #endif
8619 free (offload_targets);
8620 offload_targets = NULL;
8623 /* Reject switches that no pass was interested in. */
8625 void
8626 driver::handle_unrecognized_options ()
8628 for (size_t i = 0; (int) i < n_switches; i++)
8629 if (! switches[i].validated)
8631 const char *hint = 0; // sdcpp m_option_proposer.suggest_option (switches[i].part1);
8632 if (hint)
8633 error ("bbunrecognized command-line option %<-%s%>;"
8634 " did you mean %<-%s%>?",
8635 switches[i].part1, hint);
8636 else
8637 error ("ccunrecognized command-line option %<-%s%>",
8638 switches[i].part1);
8640 else
8645 /* Handle the various -print-* options, returning 0 if the driver
8646 should exit, or nonzero if the driver should continue. */
8649 driver::maybe_print_and_exit () const
8651 if (print_search_dirs)
8653 printf (_("install: %s%s\n"),
8654 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
8655 gcc_exec_prefix ? "" : machine_suffix);
8656 printf (_("programs: %s\n"),
8657 build_search_list (&exec_prefixes, "", false, false));
8658 printf (_("libraries: %s\n"),
8659 build_search_list (&startfile_prefixes, "", false, true));
8660 return (0);
8663 if (print_file_name)
8665 printf ("%s\n", find_file (print_file_name));
8666 return (0);
8669 if (print_prog_name)
8671 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
8673 /* Append USE_LD to the default linker. */
8674 #ifdef DEFAULT_LINKER
8675 char *ld;
8676 # ifdef HAVE_HOST_EXECUTABLE_SUFFIX
8677 int len = (sizeof (DEFAULT_LINKER)
8678 - sizeof (HOST_EXECUTABLE_SUFFIX));
8679 ld = NULL;
8680 if (len > 0)
8682 char *default_linker = xstrdup (DEFAULT_LINKER);
8683 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
8684 HOST_EXECUTABLE_SUFFIX. */
8685 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
8687 default_linker[len] = '\0';
8688 ld = concat (default_linker, use_ld,
8689 HOST_EXECUTABLE_SUFFIX, NULL);
8692 if (ld == NULL)
8693 # endif
8694 ld = concat (DEFAULT_LINKER, use_ld, NULL);
8695 if (access (ld, X_OK) == 0)
8697 printf ("%s\n", ld);
8698 return (0);
8700 #endif
8701 print_prog_name = concat (print_prog_name, use_ld, NULL);
8703 char *newname = find_a_program (print_prog_name);
8704 printf ("%s\n", (newname ? newname : print_prog_name));
8705 return (0);
8708 if (print_multi_lib)
8710 print_multilib_info ();
8711 return (0);
8714 if (print_multi_directory)
8716 if (multilib_dir == NULL)
8717 printf (".\n");
8718 else
8719 printf ("%s\n", multilib_dir);
8720 return (0);
8723 if (print_multiarch)
8725 if (multiarch_dir == NULL)
8726 printf ("\n");
8727 else
8728 printf ("%s\n", multiarch_dir);
8729 return (0);
8732 if (print_sysroot)
8734 if (target_system_root)
8736 if (target_sysroot_suffix)
8737 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
8738 else
8739 printf ("%s\n", target_system_root);
8741 return (0);
8744 if (print_multi_os_directory)
8746 if (multilib_os_dir == NULL)
8747 printf (".\n");
8748 else
8749 printf ("%s\n", multilib_os_dir);
8750 return (0);
8753 if (print_sysroot_headers_suffix)
8755 if (*sysroot_hdrs_suffix_spec)
8757 printf("%s\n", (target_sysroot_hdrs_suffix
8758 ? target_sysroot_hdrs_suffix
8759 : ""));
8760 return (0);
8762 else
8763 /* The error status indicates that only one set of fixed
8764 headers should be built. */
8765 fatal_error (input_location,
8766 "not configured with sysroot headers suffix");
8769 if (print_help_list)
8771 display_help ();
8773 if (! verbose_flag)
8775 printf (_("\nFor bug reporting instructions, please see:\n"));
8776 printf ("%s.\n", bug_report_url);
8778 return (0);
8781 /* We do not exit here. Instead we have created a fake input file
8782 called 'help-dummy' which needs to be compiled, and we pass this
8783 on the various sub-processes, along with the --help switch.
8784 Ensure their output appears after ours. */
8785 fputc ('\n', stdout);
8786 fflush (stdout);
8789 if (print_version)
8791 printf (_("%s %s%s\n"), progname, pkgversion_string,
8792 version_string);
8793 printf ("Copyright %s 2022 Free Software Foundation, Inc.\n",
8794 _("(C)"));
8795 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
8796 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
8797 stdout);
8798 if (! verbose_flag)
8799 return 0;
8801 /* We do not exit here. We use the same mechanism of --help to print
8802 the version of the sub-processes. */
8803 fputc ('\n', stdout);
8804 fflush (stdout);
8807 if (verbose_flag)
8809 print_configuration (stderr);
8810 if (n_infiles == 0)
8811 return (0);
8814 return 1;
8817 /* Figure out what to do with each input file.
8818 Return true if we need to exit early from "main", false otherwise. */
8820 bool
8821 driver::prepare_infiles ()
8823 size_t i;
8824 int lang_n_infiles = 0;
8826 if (n_infiles == added_libraries)
8827 fatal_error (input_location, "no input files");
8829 if (seen_error ())
8830 /* Early exit needed from main. */
8831 return true;
8833 /* Make a place to record the compiler output file names
8834 that correspond to the input files. */
8836 i = n_infiles;
8837 i += lang_specific_extra_outfiles;
8838 outfiles = XCNEWVEC (const char *, i);
8840 /* Record which files were specified explicitly as link input. */
8842 explicit_link_files = XCNEWVEC (char, n_infiles);
8844 combine_inputs = have_o || flag_wpa;
8846 for (i = 0; (int) i < n_infiles; i++)
8848 const char *name = infiles[i].name;
8849 struct compiler *compiler = lookup_compiler (name,
8850 strlen (name),
8851 infiles[i].language);
8853 if (compiler && !(compiler->combinable))
8854 combine_inputs = false;
8856 if (lang_n_infiles > 0 && compiler != input_file_compiler
8857 && infiles[i].language && infiles[i].language[0] != '*')
8858 infiles[i].incompiler = compiler;
8859 else if (compiler)
8861 lang_n_infiles++;
8862 input_file_compiler = compiler;
8863 infiles[i].incompiler = compiler;
8865 else
8867 /* Since there is no compiler for this input file, assume it is a
8868 linker file. */
8869 explicit_link_files[i] = 1;
8870 infiles[i].incompiler = NULL;
8872 infiles[i].compiled = false;
8873 infiles[i].preprocessed = false;
8876 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
8877 fatal_error (input_location,
8878 "cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> "
8879 "with multiple files");
8881 /* No early exit needed from main; we can continue. */
8882 return false;
8885 /* Run the spec machinery on each input file. */
8887 void
8888 driver::do_spec_on_infiles () const
8890 size_t i;
8892 for (i = 0; (int) i < n_infiles; i++)
8894 int this_file_error = 0;
8896 /* Tell do_spec what to substitute for %i. */
8898 input_file_number = i;
8899 set_input (infiles[i].name);
8901 if (infiles[i].compiled)
8902 continue;
8904 /* Use the same thing in %o, unless cp->spec says otherwise. */
8906 outfiles[i] = gcc_input_filename;
8908 /* Figure out which compiler from the file's suffix. */
8910 input_file_compiler
8911 = lookup_compiler (infiles[i].name, input_filename_length,
8912 infiles[i].language);
8914 if (input_file_compiler)
8916 /* Ok, we found an applicable compiler. Run its spec. */
8918 if (input_file_compiler->spec[0] == '#')
8920 error ("%s: %s compiler not installed on this system",
8921 gcc_input_filename, &input_file_compiler->spec[1]);
8922 this_file_error = 1;
8924 else
8926 int value;
8928 if (compare_debug)
8930 free (debug_check_temp_file[0]);
8931 debug_check_temp_file[0] = NULL;
8933 free (debug_check_temp_file[1]);
8934 debug_check_temp_file[1] = NULL;
8937 value = do_spec (input_file_compiler->spec);
8938 infiles[i].compiled = true;
8939 if (value < 0)
8940 this_file_error = 1;
8941 else if (compare_debug && debug_check_temp_file[0])
8943 if (verbose_flag)
8944 inform (UNKNOWN_LOCATION,
8945 "recompiling with %<-fcompare-debug%>");
8947 compare_debug = -compare_debug;
8948 n_switches = n_switches_debug_check[1];
8949 n_switches_alloc = n_switches_alloc_debug_check[1];
8950 switches = switches_debug_check[1];
8952 value = do_spec (input_file_compiler->spec);
8954 compare_debug = -compare_debug;
8955 n_switches = n_switches_debug_check[0];
8956 n_switches_alloc = n_switches_alloc_debug_check[0];
8957 switches = switches_debug_check[0];
8959 if (value < 0)
8961 error ("during %<-fcompare-debug%> recompilation");
8962 this_file_error = 1;
8965 gcc_assert (debug_check_temp_file[1]
8966 && filename_cmp (debug_check_temp_file[0],
8967 debug_check_temp_file[1]));
8969 if (verbose_flag)
8970 inform (UNKNOWN_LOCATION, "comparing final insns dumps");
8972 if (compare_files (debug_check_temp_file))
8973 this_file_error = 1;
8976 if (compare_debug)
8978 free (debug_check_temp_file[0]);
8979 debug_check_temp_file[0] = NULL;
8981 free (debug_check_temp_file[1]);
8982 debug_check_temp_file[1] = NULL;
8987 /* If this file's name does not contain a recognized suffix,
8988 record it as explicit linker input. */
8990 else
8991 explicit_link_files[i] = 1;
8993 /* Clear the delete-on-failure queue, deleting the files in it
8994 if this compilation failed. */
8996 if (this_file_error)
8998 delete_failure_queue ();
8999 errorcount++;
9001 /* If this compilation succeeded, don't delete those files later. */
9002 clear_failure_queue ();
9005 /* Reset the input file name to the first compile/object file name, for use
9006 with %b in LINK_SPEC. We use the first input file that we can find
9007 a compiler to compile it instead of using infiles.language since for
9008 languages other than C we use aliases that we then lookup later. */
9009 if (n_infiles > 0)
9011 int i;
9013 for (i = 0; i < n_infiles ; i++)
9014 if (infiles[i].incompiler
9015 || (infiles[i].language && infiles[i].language[0] != '*'))
9017 set_input (infiles[i].name);
9018 break;
9022 if (!seen_error ())
9024 /* Make sure INPUT_FILE_NUMBER points to first available open
9025 slot. */
9026 input_file_number = n_infiles;
9027 if (lang_specific_pre_link ())
9028 errorcount++;
9032 /* If we have to run the linker, do it now. */
9034 void
9035 driver::maybe_run_linker (const char *argv0) const
9037 size_t i;
9038 int linker_was_run = 0;
9039 int num_linker_inputs;
9041 /* Determine if there are any linker input files. */
9042 num_linker_inputs = 0;
9043 for (i = 0; (int) i < n_infiles; i++)
9044 if (explicit_link_files[i] || outfiles[i] != NULL)
9045 num_linker_inputs++;
9047 /* Arrange for temporary file names created during linking to take
9048 on names related with the linker output rather than with the
9049 inputs when appropriate. */
9050 if (outbase && *outbase)
9052 if (dumpdir)
9054 char *tofree = dumpdir;
9055 gcc_checking_assert (strlen (dumpdir) == dumpdir_length);
9056 dumpdir = concat (dumpdir, outbase, ".", NULL);
9057 free (tofree);
9059 else
9060 dumpdir = concat (outbase, ".", NULL);
9061 dumpdir_length += strlen (outbase) + 1;
9062 dumpdir_trailing_dash_added = true;
9064 else if (dumpdir_trailing_dash_added)
9066 gcc_assert (dumpdir[dumpdir_length - 1] == '-');
9067 dumpdir[dumpdir_length - 1] = '.';
9070 if (dumpdir_trailing_dash_added)
9072 gcc_assert (dumpdir_length > 0);
9073 gcc_assert (dumpdir[dumpdir_length - 1] == '.');
9074 dumpdir_length--;
9077 free (outbase);
9078 input_basename = outbase = NULL;
9079 outbase_length = suffixed_basename_length = basename_length = 0;
9081 /* Run ld to link all the compiler output files. */
9083 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
9085 int tmp = execution_count;
9087 detect_jobserver ();
9089 if (! have_c)
9091 #if HAVE_LTO_PLUGIN > 0
9092 #if HAVE_LTO_PLUGIN == 2
9093 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
9094 #else
9095 const char *fuse_linker_plugin = "fuse-linker-plugin";
9096 #endif
9097 #endif
9099 /* We'll use ld if we can't find collect2. */
9100 if (! strcmp (linker_name_spec, "collect2"))
9102 char *s = find_a_program ("collect2");
9103 if (s == NULL)
9104 set_static_spec_shared (&linker_name_spec, "ld");
9107 #if HAVE_LTO_PLUGIN > 0
9108 #if HAVE_LTO_PLUGIN == 2
9109 if (!switch_matches (fno_use_linker_plugin,
9110 fno_use_linker_plugin
9111 + strlen (fno_use_linker_plugin), 0))
9112 #else
9113 if (switch_matches (fuse_linker_plugin,
9114 fuse_linker_plugin
9115 + strlen (fuse_linker_plugin), 0))
9116 #endif
9118 char *temp_spec = find_a_file (&exec_prefixes,
9119 LTOPLUGINSONAME, R_OK,
9120 false);
9121 if (!temp_spec)
9122 fatal_error (input_location,
9123 "%<-fuse-linker-plugin%>, but %s not found",
9124 LTOPLUGINSONAME);
9125 linker_plugin_file_spec = convert_white_space (temp_spec);
9127 #endif
9128 set_static_spec_shared (&lto_gcc_spec, argv0);
9131 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
9132 for collect. */
9133 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
9134 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
9136 if (print_subprocess_help == 1)
9138 printf (_("\nLinker options\n==============\n\n"));
9139 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
9140 " to the linker.\n\n"));
9141 fflush (stdout);
9143 int value = do_spec (link_command_spec);
9144 if (value < 0)
9145 errorcount = 1;
9146 linker_was_run = (tmp != execution_count);
9149 /* If options said don't run linker,
9150 complain about input files to be given to the linker. */
9152 if (! linker_was_run && !seen_error ())
9153 for (i = 0; (int) i < n_infiles; i++)
9154 if (explicit_link_files[i]
9155 && !(infiles[i].language && infiles[i].language[0] == '*'))
9157 warning (0, "%s: linker input file unused because linking not done",
9158 outfiles[i]);
9159 if (access (outfiles[i], F_OK) < 0)
9160 /* This is can be an indication the user specifed an errorneous
9161 separated option value, (or used the wrong prefix for an
9162 option). */
9163 error ("%s: linker input file not found: %m", outfiles[i]);
9167 /* The end of "main". */
9169 void
9170 driver::final_actions () const
9172 /* Delete some or all of the temporary files we made. */
9174 if (seen_error ())
9175 delete_failure_queue ();
9176 delete_temp_files ();
9178 if (print_help_list)
9180 printf (("\nFor bug reporting instructions, please see:\n"));
9181 printf ("%s\n", bug_report_url);
9185 /* Detect whether jobserver is active and working. If not drop
9186 --jobserver-auth from MAKEFLAGS. */
9188 void
9189 driver::detect_jobserver () const
9191 /* Detect jobserver and drop it if it's not working. */
9192 const char *makeflags = env.get ("MAKEFLAGS");
9193 if (makeflags != NULL)
9195 const char *needle = "--jobserver-auth=";
9196 const char *n = strstr (makeflags, needle);
9197 if (n != NULL)
9199 int rfd = -1;
9200 int wfd = -1;
9202 bool jobserver
9203 = (sscanf (n + strlen (needle), "%d,%d", &rfd, &wfd) == 2
9204 && rfd > 0
9205 && wfd > 0
9206 && is_valid_fd (rfd)
9207 && is_valid_fd (wfd));
9209 /* Drop the jobserver if it's not working now. */
9210 if (!jobserver)
9212 unsigned offset = n - makeflags;
9213 char *dup = xstrdup (makeflags);
9214 dup[offset] = '\0';
9216 const char *space = strchr (makeflags + offset, ' ');
9217 if (space != NULL)
9218 strcpy (dup + offset, space);
9219 xputenv (concat ("MAKEFLAGS=", dup, NULL));
9225 /* Determine what the exit code of the driver should be. */
9228 driver::get_exit_code () const
9230 return (signal_count != 0 ? 2
9231 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
9232 : 0);
9235 /* Find the proper compilation spec for the file name NAME,
9236 whose length is LENGTH. LANGUAGE is the specified language,
9237 or 0 if this file is to be passed to the linker. */
9239 static struct compiler *
9240 lookup_compiler (const char *name, size_t length, const char *language)
9242 struct compiler *cp;
9244 /* If this was specified by the user to be a linker input, indicate that. */
9245 if (language != 0 && language[0] == '*')
9246 return 0;
9248 /* Otherwise, look for the language, if one is spec'd. */
9249 if (language != 0)
9251 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9252 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
9254 if (name != NULL && strcmp (name, "-") == 0
9255 && (strcmp (cp->suffix, "@c-header") == 0
9256 || strcmp (cp->suffix, "@c++-header") == 0)
9257 && !have_E)
9258 fatal_error (input_location,
9259 "cannot use %<-%> as input filename for a "
9260 "precompiled header");
9262 return cp;
9265 error ("language %s not recognized", language);
9266 return 0;
9269 /* Look for a suffix. */
9270 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9272 if (/* The suffix `-' matches only the file name `-'. */
9273 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
9274 || (strlen (cp->suffix) < length
9275 /* See if the suffix matches the end of NAME. */
9276 && !strcmp (cp->suffix,
9277 name + length - strlen (cp->suffix))
9279 break;
9282 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
9283 /* Look again, but case-insensitively this time. */
9284 if (cp < compilers)
9285 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
9287 if (/* The suffix `-' matches only the file name `-'. */
9288 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
9289 || (strlen (cp->suffix) < length
9290 /* See if the suffix matches the end of NAME. */
9291 && ((!strcmp (cp->suffix,
9292 name + length - strlen (cp->suffix))
9293 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
9294 && !strcasecmp (cp->suffix,
9295 name + length - strlen (cp->suffix)))
9297 break;
9299 #endif
9301 if (cp >= compilers)
9303 if (cp->spec[0] != '@')
9304 /* A non-alias entry: return it. */
9305 return cp;
9307 /* An alias entry maps a suffix to a language.
9308 Search for the language; pass 0 for NAME and LENGTH
9309 to avoid infinite recursion if language not found. */
9310 return lookup_compiler (NULL, 0, cp->spec + 1);
9312 return 0;
9315 static char *
9316 save_string (const char *s, int len)
9318 char *result = XNEWVEC (char, len + 1);
9320 gcc_checking_assert (strlen (s) >= (unsigned int) len);
9321 memcpy (result, s, len);
9322 result[len] = 0;
9323 return result;
9326 static inline void
9327 validate_switches_from_spec (const char *spec, bool user)
9329 const char *p = spec;
9330 char c;
9331 while ((c = *p++))
9332 if (c == '%'
9333 && (*p == '{'
9334 || *p == '<'
9335 || (*p == 'W' && *++p == '{')
9336 || (*p == '@' && *++p == '{')))
9337 /* We have a switch spec. */
9338 p = validate_switches (p + 1, user, *p == '{');
9341 static void
9342 validate_all_switches (void)
9344 struct compiler *comp;
9345 struct spec_list *spec;
9347 for (comp = compilers; comp->spec; comp++)
9348 validate_switches_from_spec (comp->spec, false);
9350 /* Look through the linked list of specs read from the specs file. */
9351 for (spec = specs; spec; spec = spec->next)
9352 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
9354 validate_switches_from_spec (link_command_spec, false);
9357 /* Look at the switch-name that comes after START and mark as valid
9358 all supplied switches that match it. If BRACED, handle other
9359 switches after '|' and '&', and specs after ':' until ';' or '}',
9360 going back for more switches after ';'. Without BRACED, handle
9361 only one atom. Return a pointer to whatever follows the handled
9362 items, after the closing brace if BRACED. */
9364 static const char *
9365 validate_switches (const char *start, bool user_spec, bool braced)
9367 const char *p = start;
9368 const char *atom;
9369 size_t len;
9370 int i;
9371 bool suffix = false;
9372 bool starred = false;
9374 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
9376 next_member:
9377 SKIP_WHITE ();
9379 if (*p == '!')
9380 p++;
9382 SKIP_WHITE ();
9383 if (*p == '.' || *p == ',')
9384 suffix = true, p++;
9386 atom = p;
9387 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
9388 || *p == ',' || *p == '.' || *p == '@')
9389 p++;
9390 len = p - atom;
9392 if (*p == '*')
9393 starred = true, p++;
9395 SKIP_WHITE ();
9397 if (!suffix)
9399 /* Mark all matching switches as valid. */
9400 for (i = 0; i < n_switches; i++)
9401 if (!strncmp (switches[i].part1, atom, len)
9402 && (starred || switches[i].part1[len] == '\0')
9403 && (switches[i].known || user_spec)){
9404 switches[i].validated = true;
9408 if (!braced)
9409 return p;
9411 if (*p) p++;
9412 if (*p && (p[-1] == '|' || p[-1] == '&'))
9413 goto next_member;
9415 if (*p && p[-1] == ':')
9417 while (*p && *p != ';' && *p != '}')
9419 if (*p == '%')
9421 p++;
9422 if (*p == '{' || *p == '<')
9423 p = validate_switches (p+1, user_spec, *p == '{');
9424 else if (p[0] == 'W' && p[1] == '{')
9425 p = validate_switches (p+2, user_spec, true);
9426 else if (p[0] == '@' && p[1] == '{')
9427 p = validate_switches (p+2, user_spec, true);
9429 else
9430 p++;
9433 if (*p) p++;
9434 if (*p && p[-1] == ';')
9435 goto next_member;
9438 return p;
9439 #undef SKIP_WHITE
9442 struct mdswitchstr
9444 const char *str;
9445 int len;
9448 static struct mdswitchstr *mdswitches;
9449 static int n_mdswitches;
9451 /* Check whether a particular argument was used. The first time we
9452 canonicalize the switches to keep only the ones we care about. */
9454 struct used_arg_t
9456 public:
9457 int operator () (const char *p, int len);
9458 void finalize ();
9460 private:
9461 struct mswitchstr
9463 const char *str;
9464 const char *replace;
9465 int len;
9466 int rep_len;
9469 mswitchstr *mswitches;
9470 int n_mswitches;
9474 used_arg_t used_arg;
9477 used_arg_t::operator () (const char *p, int len)
9479 int i, j;
9481 if (!mswitches)
9483 struct mswitchstr *matches;
9484 const char *q;
9485 int cnt = 0;
9487 /* Break multilib_matches into the component strings of string
9488 and replacement string. */
9489 for (q = multilib_matches; *q != '\0'; q++)
9490 if (*q == ';')
9491 cnt++;
9493 matches
9494 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
9495 i = 0;
9496 q = multilib_matches;
9497 while (*q != '\0')
9499 matches[i].str = q;
9500 while (*q != ' ')
9502 if (*q == '\0')
9504 invalid_matches:
9505 fatal_error (input_location, "multilib spec %qs is invalid",
9506 multilib_matches);
9508 q++;
9510 matches[i].len = q - matches[i].str;
9512 matches[i].replace = ++q;
9513 while (*q != ';' && *q != '\0')
9515 if (*q == ' ')
9516 goto invalid_matches;
9517 q++;
9519 matches[i].rep_len = q - matches[i].replace;
9520 i++;
9521 if (*q == ';')
9522 q++;
9525 /* Now build a list of the replacement string for switches that we care
9526 about. Make sure we allocate at least one entry. This prevents
9527 xmalloc from calling fatal, and prevents us from re-executing this
9528 block of code. */
9529 mswitches
9530 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
9531 for (i = 0; i < n_switches; i++)
9532 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
9534 int xlen = strlen (switches[i].part1);
9535 for (j = 0; j < cnt; j++)
9536 if (xlen == matches[j].len
9537 && ! strncmp (switches[i].part1, matches[j].str, xlen))
9539 mswitches[n_mswitches].str = matches[j].replace;
9540 mswitches[n_mswitches].len = matches[j].rep_len;
9541 mswitches[n_mswitches].replace = (char *) 0;
9542 mswitches[n_mswitches].rep_len = 0;
9543 n_mswitches++;
9544 break;
9548 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
9549 on the command line nor any options mutually incompatible with
9550 them. */
9551 for (i = 0; i < n_mdswitches; i++)
9553 const char *r;
9555 for (q = multilib_options; *q != '\0'; *q && q++)
9557 while (*q == ' ')
9558 q++;
9560 r = q;
9561 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
9562 || strchr (" /", q[mdswitches[i].len]) == NULL)
9564 while (*q != ' ' && *q != '/' && *q != '\0')
9565 q++;
9566 if (*q != '/')
9567 break;
9568 q++;
9571 if (*q != ' ' && *q != '\0')
9573 while (*r != ' ' && *r != '\0')
9575 q = r;
9576 while (*q != ' ' && *q != '/' && *q != '\0')
9577 q++;
9579 if (used_arg (r, q - r))
9580 break;
9582 if (*q != '/')
9584 mswitches[n_mswitches].str = mdswitches[i].str;
9585 mswitches[n_mswitches].len = mdswitches[i].len;
9586 mswitches[n_mswitches].replace = (char *) 0;
9587 mswitches[n_mswitches].rep_len = 0;
9588 n_mswitches++;
9589 break;
9592 r = q + 1;
9594 break;
9600 for (i = 0; i < n_mswitches; i++)
9601 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
9602 return 1;
9604 return 0;
9607 void used_arg_t::finalize ()
9609 XDELETEVEC (mswitches);
9610 mswitches = NULL;
9611 n_mswitches = 0;
9615 static int
9616 default_arg (const char *p, int len)
9618 int i;
9620 for (i = 0; i < n_mdswitches; i++)
9621 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
9622 return 1;
9624 return 0;
9627 /* Work out the subdirectory to use based on the options. The format of
9628 multilib_select is a list of elements. Each element is a subdirectory
9629 name followed by a list of options followed by a semicolon. The format
9630 of multilib_exclusions is the same, but without the preceding
9631 directory. First gcc will check the exclusions, if none of the options
9632 beginning with an exclamation point are present, and all of the other
9633 options are present, then we will ignore this completely. Passing
9634 that, gcc will consider each multilib_select in turn using the same
9635 rules for matching the options. If a match is found, that subdirectory
9636 will be used.
9637 A subdirectory name is optionally followed by a colon and the corresponding
9638 multiarch name. */
9640 static void
9641 set_multilib_dir (void)
9643 const char *p;
9644 unsigned int this_path_len;
9645 const char *this_path, *this_arg;
9646 const char *start, *end;
9647 int not_arg;
9648 int ok, ndfltok, first;
9650 n_mdswitches = 0;
9651 start = multilib_defaults;
9652 while (*start == ' ' || *start == '\t')
9653 start++;
9654 while (*start != '\0')
9656 n_mdswitches++;
9657 while (*start != ' ' && *start != '\t' && *start != '\0')
9658 start++;
9659 while (*start == ' ' || *start == '\t')
9660 start++;
9663 if (n_mdswitches)
9665 int i = 0;
9667 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
9668 for (start = multilib_defaults; *start != '\0'; start = end + 1)
9670 while (*start == ' ' || *start == '\t')
9671 start++;
9673 if (*start == '\0')
9674 break;
9676 for (end = start + 1;
9677 *end != ' ' && *end != '\t' && *end != '\0'; end++)
9680 obstack_grow (&multilib_obstack, start, end - start);
9681 obstack_1grow (&multilib_obstack, 0);
9682 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
9683 mdswitches[i++].len = end - start;
9685 if (*end == '\0')
9686 break;
9690 p = multilib_exclusions;
9691 while (*p != '\0')
9693 /* Ignore newlines. */
9694 if (*p == '\n')
9696 ++p;
9697 continue;
9700 /* Check the arguments. */
9701 ok = 1;
9702 while (*p != ';')
9704 if (*p == '\0')
9706 invalid_exclusions:
9707 fatal_error (input_location, "multilib exclusions %qs is invalid",
9708 multilib_exclusions);
9711 if (! ok)
9713 ++p;
9714 continue;
9717 this_arg = p;
9718 while (*p != ' ' && *p != ';')
9720 if (*p == '\0')
9721 goto invalid_exclusions;
9722 ++p;
9725 if (*this_arg != '!')
9726 not_arg = 0;
9727 else
9729 not_arg = 1;
9730 ++this_arg;
9733 ok = used_arg (this_arg, p - this_arg);
9734 if (not_arg)
9735 ok = ! ok;
9737 if (*p == ' ')
9738 ++p;
9741 if (ok)
9742 return;
9744 ++p;
9747 first = 1;
9748 p = multilib_select;
9750 /* Append multilib reuse rules if any. With those rules, we can reuse
9751 one multilib for certain different options sets. */
9752 if (strlen (multilib_reuse) > 0)
9753 p = concat (p, multilib_reuse, NULL);
9755 while (*p != '\0')
9757 /* Ignore newlines. */
9758 if (*p == '\n')
9760 ++p;
9761 continue;
9764 /* Get the initial path. */
9765 this_path = p;
9766 while (*p != ' ')
9768 if (*p == '\0')
9770 invalid_select:
9771 fatal_error (input_location, "multilib select %qs %qs is invalid",
9772 multilib_select, multilib_reuse);
9774 ++p;
9776 this_path_len = p - this_path;
9778 /* Check the arguments. */
9779 ok = 1;
9780 ndfltok = 1;
9781 ++p;
9782 while (*p != ';')
9784 if (*p == '\0')
9785 goto invalid_select;
9787 if (! ok)
9789 ++p;
9790 continue;
9793 this_arg = p;
9794 while (*p != ' ' && *p != ';')
9796 if (*p == '\0')
9797 goto invalid_select;
9798 ++p;
9801 if (*this_arg != '!')
9802 not_arg = 0;
9803 else
9805 not_arg = 1;
9806 ++this_arg;
9809 /* If this is a default argument, we can just ignore it.
9810 This is true even if this_arg begins with '!'. Beginning
9811 with '!' does not mean that this argument is necessarily
9812 inappropriate for this library: it merely means that
9813 there is a more specific library which uses this
9814 argument. If this argument is a default, we need not
9815 consider that more specific library. */
9816 ok = used_arg (this_arg, p - this_arg);
9817 if (not_arg)
9818 ok = ! ok;
9820 if (! ok)
9821 ndfltok = 0;
9823 if (default_arg (this_arg, p - this_arg))
9824 ok = 1;
9826 if (*p == ' ')
9827 ++p;
9830 if (ok && first)
9832 if (this_path_len != 1
9833 || this_path[0] != '.')
9835 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
9836 char *q;
9838 strncpy (new_multilib_dir, this_path, this_path_len);
9839 new_multilib_dir[this_path_len] = '\0';
9840 q = strchr (new_multilib_dir, ':');
9841 if (q != NULL)
9842 *q = '\0';
9843 multilib_dir = new_multilib_dir;
9845 first = 0;
9848 if (ndfltok)
9850 const char *q = this_path, *end = this_path + this_path_len;
9852 while (q < end && *q != ':')
9853 q++;
9854 if (q < end)
9856 const char *q2 = q + 1, *ml_end = end;
9857 char *new_multilib_os_dir;
9859 while (q2 < end && *q2 != ':')
9860 q2++;
9861 if (*q2 == ':')
9862 ml_end = q2;
9863 if (ml_end - q == 1)
9864 multilib_os_dir = xstrdup (".");
9865 else
9867 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
9868 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
9869 new_multilib_os_dir[ml_end - q - 1] = '\0';
9870 multilib_os_dir = new_multilib_os_dir;
9873 if (q2 < end && *q2 == ':')
9875 char *new_multiarch_dir = XNEWVEC (char, end - q2);
9876 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
9877 new_multiarch_dir[end - q2 - 1] = '\0';
9878 multiarch_dir = new_multiarch_dir;
9880 break;
9884 ++p;
9887 if (multilib_dir == NULL && multilib_os_dir != NULL
9888 && strcmp (multilib_os_dir, ".") == 0)
9890 free (CONST_CAST (char *, multilib_os_dir));
9891 multilib_os_dir = NULL;
9893 else if (multilib_dir != NULL && multilib_os_dir == NULL)
9894 multilib_os_dir = multilib_dir;
9897 /* Print out the multiple library subdirectory selection
9898 information. This prints out a series of lines. Each line looks
9899 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
9900 required. Only the desired options are printed out, the negative
9901 matches. The options are print without a leading dash. There are
9902 no spaces to make it easy to use the information in the shell.
9903 Each subdirectory is printed only once. This assumes the ordering
9904 generated by the genmultilib script. Also, we leave out ones that match
9905 the exclusions. */
9907 static void
9908 print_multilib_info (void)
9910 const char *p = multilib_select;
9911 const char *last_path = 0, *this_path;
9912 int skip;
9913 int not_arg;
9914 unsigned int last_path_len = 0;
9916 while (*p != '\0')
9918 skip = 0;
9919 /* Ignore newlines. */
9920 if (*p == '\n')
9922 ++p;
9923 continue;
9926 /* Get the initial path. */
9927 this_path = p;
9928 while (*p != ' ')
9930 if (*p == '\0')
9932 invalid_select:
9933 fatal_error (input_location,
9934 "multilib select %qs is invalid", multilib_select);
9937 ++p;
9940 /* When --disable-multilib was used but target defines
9941 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
9942 with .:: for multiarch configurations) are there just to find
9943 multilib_os_dir, so skip them from output. */
9944 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
9945 skip = 1;
9947 /* Check for matches with the multilib_exclusions. We don't bother
9948 with the '!' in either list. If any of the exclusion rules match
9949 all of its options with the select rule, we skip it. */
9951 const char *e = multilib_exclusions;
9952 const char *this_arg;
9954 while (*e != '\0')
9956 int m = 1;
9957 /* Ignore newlines. */
9958 if (*e == '\n')
9960 ++e;
9961 continue;
9964 /* Check the arguments. */
9965 while (*e != ';')
9967 const char *q;
9968 int mp = 0;
9970 if (*e == '\0')
9972 invalid_exclusion:
9973 fatal_error (input_location,
9974 "multilib exclusion %qs is invalid",
9975 multilib_exclusions);
9978 if (! m)
9980 ++e;
9981 continue;
9984 this_arg = e;
9986 while (*e != ' ' && *e != ';')
9988 if (*e == '\0')
9989 goto invalid_exclusion;
9990 ++e;
9993 q = p + 1;
9994 while (*q != ';')
9996 const char *arg;
9997 int len = e - this_arg;
9999 if (*q == '\0')
10000 goto invalid_select;
10002 arg = q;
10004 while (*q != ' ' && *q != ';')
10006 if (*q == '\0')
10007 goto invalid_select;
10008 ++q;
10011 if (! strncmp (arg, this_arg,
10012 (len < q - arg) ? q - arg : len)
10013 || default_arg (this_arg, e - this_arg))
10015 mp = 1;
10016 break;
10019 if (*q == ' ')
10020 ++q;
10023 if (! mp)
10024 m = 0;
10026 if (*e == ' ')
10027 ++e;
10030 if (m)
10032 skip = 1;
10033 break;
10036 if (*e != '\0')
10037 ++e;
10041 if (! skip)
10043 /* If this is a duplicate, skip it. */
10044 skip = (last_path != 0
10045 && (unsigned int) (p - this_path) == last_path_len
10046 && ! filename_ncmp (last_path, this_path, last_path_len));
10048 last_path = this_path;
10049 last_path_len = p - this_path;
10052 /* If all required arguments are default arguments, and no default
10053 arguments appear in the ! argument list, then we can skip it.
10054 We will already have printed a directory identical to this one
10055 which does not require that default argument. */
10056 if (! skip)
10058 const char *q;
10059 bool default_arg_ok = false;
10061 q = p + 1;
10062 while (*q != ';')
10064 const char *arg;
10066 if (*q == '\0')
10067 goto invalid_select;
10069 if (*q == '!')
10071 not_arg = 1;
10072 q++;
10074 else
10075 not_arg = 0;
10076 arg = q;
10078 while (*q != ' ' && *q != ';')
10080 if (*q == '\0')
10081 goto invalid_select;
10082 ++q;
10085 if (default_arg (arg, q - arg))
10087 /* Stop checking if any default arguments appeared in not
10088 list. */
10089 if (not_arg)
10091 default_arg_ok = false;
10092 break;
10095 default_arg_ok = true;
10097 else if (!not_arg)
10099 /* Stop checking if any required argument is not provided by
10100 default arguments. */
10101 default_arg_ok = false;
10102 break;
10105 if (*q == ' ')
10106 ++q;
10109 /* Make sure all default argument is OK for this multi-lib set. */
10110 if (default_arg_ok)
10111 skip = 1;
10112 else
10113 skip = 0;
10116 if (! skip)
10118 const char *p1;
10120 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
10121 putchar (*p1);
10122 putchar (';');
10125 ++p;
10126 while (*p != ';')
10128 int use_arg;
10130 if (*p == '\0')
10131 goto invalid_select;
10133 if (skip)
10135 ++p;
10136 continue;
10139 use_arg = *p != '!';
10141 if (use_arg)
10142 putchar ('@');
10144 while (*p != ' ' && *p != ';')
10146 if (*p == '\0')
10147 goto invalid_select;
10148 if (use_arg)
10149 putchar (*p);
10150 ++p;
10153 if (*p == ' ')
10154 ++p;
10157 if (! skip)
10159 /* If there are extra options, print them now. */
10160 if (multilib_extra && *multilib_extra)
10162 int print_at = TRUE;
10163 const char *q;
10165 for (q = multilib_extra; *q != '\0'; q++)
10167 if (*q == ' ')
10168 print_at = TRUE;
10169 else
10171 if (print_at)
10172 putchar ('@');
10173 putchar (*q);
10174 print_at = FALSE;
10179 putchar ('\n');
10182 ++p;
10186 /* getenv built-in spec function.
10188 Returns the value of the environment variable given by its first argument,
10189 concatenated with the second argument. If the variable is not defined, a
10190 fatal error is issued unless such undefs are internally allowed, in which
10191 case the variable name prefixed by a '/' is used as the variable value.
10193 The leading '/' allows using the result at a spot where a full path would
10194 normally be expected and when the actual value doesn't really matter since
10195 undef vars are allowed. */
10197 static const char *
10198 getenv_spec_function (int argc, const char **argv)
10200 const char *value;
10201 const char *varname;
10203 char *result;
10204 char *ptr;
10205 size_t len;
10207 if (argc != 2)
10208 return NULL;
10210 varname = argv[0];
10211 value = env.get (varname);
10213 /* If the variable isn't defined and this is allowed, craft our expected
10214 return value. Assume variable names used in specs strings don't contain
10215 any active spec character so don't need escaping. */
10216 if (!value && spec_undefvar_allowed)
10218 result = XNEWVAR (char, strlen(varname) + 2);
10219 sprintf (result, "/%s", varname);
10220 return result;
10223 if (!value)
10224 fatal_error (input_location,
10225 "environment variable %qs not defined", varname);
10227 /* We have to escape every character of the environment variable so
10228 they are not interpreted as active spec characters. A
10229 particularly painful case is when we are reading a variable
10230 holding a windows path complete with \ separators. */
10231 len = strlen (value) * 2 + strlen (argv[1]) + 1;
10232 result = XNEWVAR (char, len);
10233 for (ptr = result; *value; ptr += 2)
10235 ptr[0] = '\\';
10236 ptr[1] = *value++;
10239 strcpy (ptr, argv[1]);
10241 return result;
10244 /* if-exists built-in spec function.
10246 Checks to see if the file specified by the absolute pathname in
10247 ARGS exists. Returns that pathname if found.
10249 The usual use for this function is to check for a library file
10250 (whose name has been expanded with %s). */
10252 static const char *
10253 if_exists_spec_function (int argc, const char **argv)
10255 /* Must have only one argument. */
10256 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10257 return argv[0];
10259 return NULL;
10262 /* if-exists-else built-in spec function.
10264 This is like if-exists, but takes an additional argument which
10265 is returned if the first argument does not exist. */
10267 static const char *
10268 if_exists_else_spec_function (int argc, const char **argv)
10270 /* Must have exactly two arguments. */
10271 if (argc != 2)
10272 return NULL;
10274 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10275 return argv[0];
10277 return argv[1];
10280 /* if-exists-then-else built-in spec function.
10282 Checks to see if the file specified by the absolute pathname in
10283 the first arg exists. Returns the second arg if so, otherwise returns
10284 the third arg if it is present. */
10286 static const char *
10287 if_exists_then_else_spec_function (int argc, const char **argv)
10290 /* Must have two or three arguments. */
10291 if (argc != 2 && argc != 3)
10292 return NULL;
10294 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
10295 return argv[1];
10297 if (argc == 3)
10298 return argv[2];
10300 return NULL;
10303 /* sanitize built-in spec function.
10305 This returns non-NULL, if sanitizing address, thread or
10306 any of the undefined behavior sanitizers. */
10308 static const char *
10309 sanitize_spec_function (int argc, const char **argv)
10311 if (argc != 1)
10312 return NULL;
10314 if (strcmp (argv[0], "address") == 0)
10315 return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
10316 if (strcmp (argv[0], "hwaddress") == 0)
10317 return (flag_sanitize & SANITIZE_USER_HWADDRESS) ? "" : NULL;
10318 if (strcmp (argv[0], "kernel-address") == 0)
10319 return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
10320 if (strcmp (argv[0], "kernel-hwaddress") == 0)
10321 return (flag_sanitize & SANITIZE_KERNEL_HWADDRESS) ? "" : NULL;
10322 if (strcmp (argv[0], "thread") == 0)
10323 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
10324 if (strcmp (argv[0], "undefined") == 0)
10325 return ((flag_sanitize
10326 & (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT))
10327 && !flag_sanitize_undefined_trap_on_error) ? "" : NULL;
10328 if (strcmp (argv[0], "leak") == 0)
10329 return ((flag_sanitize
10330 & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
10331 == SANITIZE_LEAK) ? "" : NULL;
10332 return NULL;
10335 /* replace-outfile built-in spec function.
10337 This looks for the first argument in the outfiles array's name and
10338 replaces it with the second argument. */
10340 static const char *
10341 replace_outfile_spec_function (int argc, const char **argv)
10343 int i;
10344 /* Must have exactly two arguments. */
10345 if (argc != 2)
10346 abort ();
10348 for (i = 0; i < n_infiles; i++)
10350 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
10351 outfiles[i] = xstrdup (argv[1]);
10353 return NULL;
10356 /* remove-outfile built-in spec function.
10358 * This looks for the first argument in the outfiles array's name and
10359 * removes it. */
10361 static const char *
10362 remove_outfile_spec_function (int argc, const char **argv)
10364 int i;
10365 /* Must have exactly one argument. */
10366 if (argc != 1)
10367 abort ();
10369 for (i = 0; i < n_infiles; i++)
10371 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
10372 outfiles[i] = NULL;
10374 return NULL;
10377 /* Given two version numbers, compares the two numbers.
10378 A version number must match the regular expression
10379 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
10381 static int
10382 compare_version_strings (const char *v1, const char *v2)
10384 int rresult;
10385 regex_t r;
10387 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
10388 REG_EXTENDED | REG_NOSUB) != 0)
10389 abort ();
10390 rresult = regexec (&r, v1, 0, NULL, 0);
10391 if (rresult == REG_NOMATCH)
10392 fatal_error (input_location, "invalid version number %qs", v1);
10393 else if (rresult != 0)
10394 abort ();
10395 rresult = regexec (&r, v2, 0, NULL, 0);
10396 if (rresult == REG_NOMATCH)
10397 fatal_error (input_location, "invalid version number %qs", v2);
10398 else if (rresult != 0)
10399 abort ();
10401 return strverscmp (v1, v2);
10405 /* version_compare built-in spec function.
10407 This takes an argument of the following form:
10409 <comparison-op> <arg1> [<arg2>] <switch> <result>
10411 and produces "result" if the comparison evaluates to true,
10412 and nothing if it doesn't.
10414 The supported <comparison-op> values are:
10416 >= true if switch is a later (or same) version than arg1
10417 !> opposite of >=
10418 < true if switch is an earlier version than arg1
10419 !< opposite of <
10420 >< true if switch is arg1 or later, and earlier than arg2
10421 <> true if switch is earlier than arg1 or is arg2 or later
10423 If the switch is not present, the condition is false unless
10424 the first character of the <comparison-op> is '!'.
10426 For example,
10427 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
10428 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
10430 static const char *
10431 version_compare_spec_function (int argc, const char **argv)
10433 int comp1, comp2;
10434 size_t switch_len;
10435 const char *switch_value = NULL;
10436 int nargs = 1, i;
10437 bool result;
10439 if (argc < 3)
10440 fatal_error (input_location, "too few arguments to %%:version-compare");
10441 if (argv[0][0] == '\0')
10442 abort ();
10443 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
10444 nargs = 2;
10445 if (argc != nargs + 3)
10446 fatal_error (input_location, "too many arguments to %%:version-compare");
10448 switch_len = strlen (argv[nargs + 1]);
10449 for (i = 0; i < n_switches; i++)
10450 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
10451 && check_live_switch (i, switch_len))
10452 switch_value = switches[i].part1 + switch_len;
10454 if (switch_value == NULL)
10455 comp1 = comp2 = -1;
10456 else
10458 comp1 = compare_version_strings (switch_value, argv[1]);
10459 if (nargs == 2)
10460 comp2 = compare_version_strings (switch_value, argv[2]);
10461 else
10462 comp2 = -1; /* This value unused. */
10465 switch (argv[0][0] << 8 | argv[0][1])
10467 case '>' << 8 | '=':
10468 result = comp1 >= 0;
10469 break;
10470 case '!' << 8 | '<':
10471 result = comp1 >= 0 || switch_value == NULL;
10472 break;
10473 case '<' << 8:
10474 result = comp1 < 0;
10475 break;
10476 case '!' << 8 | '>':
10477 result = comp1 < 0 || switch_value == NULL;
10478 break;
10479 case '>' << 8 | '<':
10480 result = comp1 >= 0 && comp2 < 0;
10481 break;
10482 case '<' << 8 | '>':
10483 result = comp1 < 0 || comp2 >= 0;
10484 break;
10486 default:
10487 fatal_error (input_location,
10488 "unknown operator %qs in %%:version-compare", argv[0]);
10490 if (! result)
10491 return NULL;
10493 return argv[nargs + 2];
10496 /* %:include builtin spec function. This differs from %include in that it
10497 can be nested inside a spec, and thus be conditionalized. It takes
10498 one argument, the filename, and looks for it in the startfile path.
10499 The result is always NULL, i.e. an empty expansion. */
10501 static const char *
10502 include_spec_function (int argc, const char **argv)
10504 char *file;
10506 if (argc != 1)
10507 abort ();
10509 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
10510 read_specs (file ? file : argv[0], false, false);
10512 return NULL;
10515 /* %:find-file spec function. This function replaces its argument by
10516 the file found through find_file, that is the -print-file-name gcc
10517 program option. */
10518 static const char *
10519 find_file_spec_function (int argc, const char **argv)
10521 const char *file;
10523 if (argc != 1)
10524 abort ();
10526 file = find_file (argv[0]);
10527 return file;
10531 /* %:find-plugindir spec function. This function replaces its argument
10532 by the -iplugindir=<dir> option. `dir' is found through find_file, that
10533 is the -print-file-name gcc program option. */
10534 static const char *
10535 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
10537 const char *option;
10539 if (argc != 0)
10540 abort ();
10542 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
10543 return option;
10547 /* %:print-asm-header spec function. Print a banner to say that the
10548 following output is from the assembler. */
10550 static const char *
10551 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
10552 const char **argv ATTRIBUTE_UNUSED)
10554 printf (_("Assembler options\n=================\n\n"));
10555 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
10556 fflush (stdout);
10557 return NULL;
10560 /* Get a random number for -frandom-seed */
10562 static unsigned HOST_WIDE_INT
10563 get_random_number (void)
10565 unsigned HOST_WIDE_INT ret = 0;
10566 int fd;
10568 fd = open ("/dev/urandom", O_RDONLY);
10569 if (fd >= 0)
10571 ssize_t r = read (fd, &ret, sizeof (HOST_WIDE_INT));
10572 close (fd);
10573 if (ret && r == sizeof (HOST_WIDE_INT))
10574 return ret;
10577 /* Get some more or less random data. */
10578 #ifdef HAVE_GETTIMEOFDAY
10580 struct timeval tv;
10582 gettimeofday (&tv, NULL);
10583 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
10585 #else
10587 time_t now = time (NULL);
10589 if (now != (time_t)-1)
10590 ret = (unsigned) now;
10592 #endif
10594 return ret ^ getpid ();
10597 /* %:compare-debug-dump-opt spec function. Save the last argument,
10598 expected to be the last -fdump-final-insns option, or generate a
10599 temporary. */
10601 static const char *
10602 compare_debug_dump_opt_spec_function (int arg,
10603 const char **argv ATTRIBUTE_UNUSED)
10605 char *ret;
10606 char *name;
10607 int which;
10608 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
10610 if (arg != 0)
10611 fatal_error (input_location,
10612 "too many arguments to %%:compare-debug-dump-opt");
10614 do_spec_2 ("%{fdump-final-insns=*:%*}", NULL);
10615 do_spec_1 (" ", 0, NULL);
10617 if (argbuf.length () > 0
10618 && strcmp (argv[argbuf.length () - 1], ".") != 0)
10620 if (!compare_debug)
10621 return NULL;
10623 name = xstrdup (argv[argbuf.length () - 1]);
10624 ret = NULL;
10626 else
10628 if (argbuf.length () > 0)
10629 do_spec_2 ("%B.gkd", NULL);
10630 else if (!compare_debug)
10631 return NULL;
10632 else
10633 do_spec_2 ("%{!save-temps*:%g.gkd}%{save-temps*:%B.gkd}", NULL);
10635 do_spec_1 (" ", 0, NULL);
10637 gcc_assert (argbuf.length () > 0);
10639 name = xstrdup (argbuf.last ());
10641 char *arg = quote_spec (xstrdup (name));
10642 ret = concat ("-fdump-final-insns=", arg, NULL);
10643 free (arg);
10646 which = compare_debug < 0;
10647 debug_check_temp_file[which] = name;
10649 if (!which)
10651 unsigned HOST_WIDE_INT value = get_random_number ();
10653 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
10656 if (*random_seed)
10658 char *tmp = ret;
10659 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
10660 ret, NULL);
10661 free (tmp);
10664 if (which)
10665 *random_seed = 0;
10667 return ret;
10670 /* %:compare-debug-self-opt spec function. Expands to the options
10671 that are to be passed in the second compilation of
10672 compare-debug. */
10674 static const char *
10675 compare_debug_self_opt_spec_function (int arg,
10676 const char **argv ATTRIBUTE_UNUSED)
10678 if (arg != 0)
10679 fatal_error (input_location,
10680 "too many arguments to %%:compare-debug-self-opt");
10682 if (compare_debug >= 0)
10683 return NULL;
10685 return concat ("\
10686 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
10687 %<fdump-final-insns=* -w -S -o %j \
10688 %{!fcompare-debug-second:-fcompare-debug-second} \
10689 ", compare_debug_opt, NULL);
10692 /* %:pass-through-libs spec function. Finds all -l options and input
10693 file names in the lib spec passed to it, and makes a list of them
10694 prepended with the plugin option to cause them to be passed through
10695 to the final link after all the new object files have been added. */
10697 const char *
10698 pass_through_libs_spec_func (int argc, const char **argv)
10700 char *prepended = xstrdup (" ");
10701 int n;
10702 /* Shlemiel the painter's algorithm. Innately horrible, but at least
10703 we know that there will never be more than a handful of strings to
10704 concat, and it's only once per run, so it's not worth optimising. */
10705 for (n = 0; n < argc; n++)
10707 char *old = prepended;
10708 /* Anything that isn't an option is a full path to an output
10709 file; pass it through if it ends in '.a'. Among options,
10710 pass only -l. */
10711 if (argv[n][0] == '-' && argv[n][1] == 'l')
10713 const char *lopt = argv[n] + 2;
10714 /* Handle both joined and non-joined -l options. If for any
10715 reason there's a trailing -l with no joined or following
10716 arg just discard it. */
10717 if (!*lopt && ++n >= argc)
10718 break;
10719 else if (!*lopt)
10720 lopt = argv[n];
10721 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
10722 lopt, " ", NULL);
10724 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
10726 prepended = concat (prepended, "-plugin-opt=-pass-through=",
10727 argv[n], " ", NULL);
10729 if (prepended != old)
10730 free (old);
10732 return prepended;
10735 static bool
10736 not_actual_file_p (const char *name)
10738 return (strcmp (name, "-") == 0
10739 || strcmp (name, HOST_BIT_BUCKET) == 0);
10742 /* %:dumps spec function. Take an optional argument that overrides
10743 the default extension for -dumpbase and -dumpbase-ext.
10744 Return -dumpdir, -dumpbase and -dumpbase-ext, if needed. */
10745 const char *
10746 dumps_spec_func (int argc, const char **argv ATTRIBUTE_UNUSED)
10748 const char *ext = dumpbase_ext;
10749 char *p;
10751 char *args[3] = { NULL, NULL, NULL };
10752 int nargs = 0;
10754 /* Do not compute a default for -dumpbase-ext when -dumpbase was
10755 given explicitly. */
10756 if (dumpbase && *dumpbase && !ext)
10757 ext = "";
10759 if (argc == 1)
10761 /* Do not override the explicitly-specified -dumpbase-ext with
10762 the specs-provided overrider. */
10763 if (!ext)
10764 ext = argv[0];
10766 else if (argc != 0)
10767 fatal_error (input_location, "too many arguments for %%:dumps");
10769 if (dumpdir)
10771 p = quote_spec_arg (xstrdup (dumpdir));
10772 args[nargs++] = concat (" -dumpdir ", p, NULL);
10773 free (p);
10776 if (!ext)
10777 ext = input_basename + basename_length;
10779 /* Use the precomputed outbase, or compute dumpbase from
10780 input_basename, just like %b would. */
10781 char *base;
10783 if (dumpbase && *dumpbase)
10785 base = xstrdup (dumpbase);
10786 p = base + outbase_length;
10787 gcc_checking_assert (strncmp (base, outbase, outbase_length) == 0);
10788 gcc_checking_assert (strcmp (p, ext) == 0);
10790 else if (outbase_length)
10792 base = xstrndup (outbase, outbase_length);
10793 p = NULL;
10795 else
10797 base = xstrndup (input_basename, suffixed_basename_length);
10798 p = base + basename_length;
10801 if (compare_debug < 0 || !p || strcmp (p, ext) != 0)
10803 if (p)
10804 *p = '\0';
10806 const char *gk;
10807 if (compare_debug < 0)
10808 gk = ".gk";
10809 else
10810 gk = "";
10812 p = concat (base, gk, ext, NULL);
10814 free (base);
10815 base = p;
10818 base = quote_spec_arg (base);
10819 args[nargs++] = concat (" -dumpbase ", base, NULL);
10820 free (base);
10822 if (*ext)
10824 p = quote_spec_arg (xstrdup (ext));
10825 args[nargs++] = concat (" -dumpbase-ext ", p, NULL);
10826 free (p);
10829 const char *ret = concat (args[0], args[1], args[2], NULL);
10830 while (nargs > 0)
10831 free (args[--nargs]);
10833 return ret;
10836 /* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
10837 Otherwise, return NULL. */
10839 static const char *
10840 greater_than_spec_func (int argc, const char **argv)
10842 char *converted;
10844 if (argc == 1)
10845 return NULL;
10847 gcc_assert (argc >= 2);
10849 long arg = strtol (argv[argc - 2], &converted, 10);
10850 gcc_assert (converted != argv[argc - 2]);
10852 long lim = strtol (argv[argc - 1], &converted, 10);
10853 gcc_assert (converted != argv[argc - 1]);
10855 if (arg > lim)
10856 return "";
10858 return NULL;
10861 /* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
10862 Otherwise, return NULL. */
10864 static const char *
10865 debug_level_greater_than_spec_func (int argc, const char **argv)
10867 char *converted;
10869 if (argc != 1)
10870 fatal_error (input_location,
10871 "wrong number of arguments to %%:debug-level-gt");
10873 long arg = strtol (argv[0], &converted, 10);
10874 gcc_assert (converted != argv[0]);
10876 if (debug_info_level > arg)
10877 return "";
10879 return NULL;
10882 /* Returns "" if dwarf_version is greater than ARGV[ARGC-1].
10883 Otherwise, return NULL. */
10885 static const char *
10886 dwarf_version_greater_than_spec_func (int argc, const char **argv)
10888 char *converted;
10890 if (argc != 1)
10891 fatal_error (input_location,
10892 "wrong number of arguments to %%:dwarf-version-gt");
10894 long arg = strtol (argv[0], &converted, 10);
10895 gcc_assert (converted != argv[0]);
10897 if (dwarf_version > arg)
10898 return "";
10900 return NULL;
10903 static void
10904 path_prefix_reset (path_prefix *prefix)
10906 struct prefix_list *iter, *next;
10907 iter = prefix->plist;
10908 while (iter)
10910 next = iter->next;
10911 free (const_cast <char *> (iter->prefix));
10912 XDELETE (iter);
10913 iter = next;
10915 prefix->plist = 0;
10916 prefix->max_len = 0;
10919 /* The function takes 3 arguments: OPTION name, file name and location
10920 where we search for Fortran modules.
10921 When the FILE is found by find_file, return OPTION=path_to_file. */
10923 static const char *
10924 find_fortran_preinclude_file (int argc, const char **argv)
10926 char *result = NULL;
10927 if (argc != 3)
10928 return NULL;
10930 struct path_prefix prefixes = { 0, 0, "preinclude" };
10932 /* Search first for 'finclude' folder location for a header file
10933 installed by the compiler (similar to omp_lib.h). */
10934 add_prefix (&prefixes, argv[2], NULL, 0, 0, 0);
10935 #ifdef TOOL_INCLUDE_DIR
10936 /* Then search: <prefix>/<target>/<include>/finclude */
10937 add_prefix (&prefixes, TOOL_INCLUDE_DIR "/finclude/",
10938 NULL, 0, 0, 0);
10939 #endif
10940 #ifdef NATIVE_SYSTEM_HEADER_DIR
10941 /* Then search: <sysroot>/usr/include/finclude/<multilib> */
10942 add_sysrooted_hdrs_prefix (&prefixes, NATIVE_SYSTEM_HEADER_DIR "/finclude/",
10943 NULL, 0, 0, 0);
10944 #endif
10946 const char *path = find_a_file (&include_prefixes, argv[1], R_OK, false);
10947 if (path != NULL)
10948 result = concat (argv[0], path, NULL);
10949 else
10951 path = find_a_file (&prefixes, argv[1], R_OK, false);
10952 if (path != NULL)
10953 result = concat (argv[0], path, NULL);
10956 path_prefix_reset (&prefixes);
10957 return result;
10960 /* If any character in ORIG fits QUOTE_P (_, P), reallocate the string
10961 so as to precede every one of them with a backslash. Return the
10962 original string or the reallocated one. */
10964 static inline char *
10965 quote_string (char *orig, bool (*quote_p)(char, void *), void *p)
10967 int len, number_of_space = 0;
10969 for (len = 0; orig[len]; len++)
10970 if (quote_p (orig[len], p))
10971 number_of_space++;
10973 if (number_of_space)
10975 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
10976 int j, k;
10977 for (j = 0, k = 0; j <= len; j++, k++)
10979 if (quote_p (orig[j], p))
10980 new_spec[k++] = '\\';
10981 new_spec[k] = orig[j];
10983 free (orig);
10984 return new_spec;
10986 else
10987 return orig;
10990 /* Return true iff C is any of the characters convert_white_space
10991 should quote. */
10993 static inline bool
10994 whitespace_to_convert_p (char c, void *)
10996 return (c == ' ' || c == '\t');
10999 /* Insert backslash before spaces in ORIG (usually a file path), to
11000 avoid being broken by spec parser.
11002 This function is needed as do_spec_1 treats white space (' ' and '\t')
11003 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
11004 the file name should be treated as a single argument rather than being
11005 broken into multiple. Solution is to insert '\\' before the space in a
11006 file name.
11008 This function converts and only converts all occurrence of ' '
11009 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
11010 "a b" -> "a\\ b"
11011 "a b" -> "a\\ \\ b"
11012 "a\tb" -> "a\\\tb"
11013 "a\\ b" -> "a\\\\ b"
11015 orig: input null-terminating string that was allocated by xalloc. The
11016 memory it points to might be freed in this function. Behavior undefined
11017 if ORIG wasn't xalloced or was freed already at entry.
11019 Return: ORIG if no conversion needed. Otherwise a newly allocated string
11020 that was converted from ORIG. */
11022 static char *
11023 convert_white_space (char *orig)
11025 return quote_string (orig, whitespace_to_convert_p, NULL);
11028 /* Return true iff C matches any of the spec active characters. */
11029 static inline bool
11030 quote_spec_char_p (char c, void *)
11032 switch (c)
11034 case ' ':
11035 case '\t':
11036 case '\n':
11037 case '|':
11038 case '%':
11039 case '\\':
11040 return true;
11042 default:
11043 return false;
11047 /* Like convert_white_space, but deactivate all active spec chars by
11048 quoting them. */
11050 static inline char *
11051 quote_spec (char *orig)
11053 return quote_string (orig, quote_spec_char_p, NULL);
11056 /* Like quote_spec, but also turn an empty string into the spec for an
11057 empty argument. */
11059 static inline char *
11060 quote_spec_arg (char *orig)
11062 if (!*orig)
11064 free (orig);
11065 return xstrdup ("%\"");
11068 return quote_spec (orig);
11071 /* Restore all state within gcc.cc to the initial state, so that the driver
11072 code can be safely re-run in-process.
11074 Many const char * variables are referenced by static specs (see
11075 INIT_STATIC_SPEC above). These variables are restored to their default
11076 values by a simple loop over the static specs.
11078 For other variables, we directly restore them all to their initial
11079 values (often implicitly 0).
11081 Free the various obstacks in this file, along with "opts_obstack"
11082 from opts.cc.
11084 This function also restores any environment variables that were changed. */
11086 void
11087 driver::finalize ()
11089 env.restore ();
11090 diagnostic_finish (global_dc);
11092 is_cpp_driver = 0;
11093 at_file_supplied = 0;
11094 print_help_list = 0;
11095 print_version = 0;
11096 verbose_only_flag = 0;
11097 print_subprocess_help = 0;
11098 use_ld = NULL;
11099 report_times_to_file = NULL;
11100 target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
11101 target_system_root_changed = 0;
11102 target_sysroot_suffix = 0;
11103 target_sysroot_hdrs_suffix = 0;
11104 save_temps_flag = SAVE_TEMPS_NONE;
11105 save_temps_overrides_dumpdir = false;
11106 dumpdir_trailing_dash_added = false;
11107 free (dumpdir);
11108 free (dumpbase);
11109 free (dumpbase_ext);
11110 free (outbase);
11111 dumpdir = dumpbase = dumpbase_ext = outbase = NULL;
11112 dumpdir_length = outbase_length = 0;
11113 spec_machine = DEFAULT_TARGET_MACHINE;
11114 greatest_status = 1;
11116 obstack_free (&obstack, NULL);
11117 obstack_free (&opts_obstack, NULL); /* in opts.cc */
11118 obstack_free (&collect_obstack, NULL);
11120 link_command_spec = LINK_COMMAND_SPEC;
11122 obstack_free (&multilib_obstack, NULL);
11124 user_specs_head = NULL;
11125 user_specs_tail = NULL;
11127 /* Within the "compilers" vec, the fields "suffix" and "spec" were
11128 statically allocated for the default compilers, but dynamically
11129 allocated for additional compilers. Delete them for the latter. */
11130 for (int i = n_default_compilers; i < n_compilers; i++)
11132 free (const_cast <char *> (compilers[i].suffix));
11133 free (const_cast <char *> (compilers[i].spec));
11135 XDELETEVEC (compilers);
11136 compilers = NULL;
11137 n_compilers = 0;
11139 linker_options.truncate (0);
11140 assembler_options.truncate (0);
11141 preprocessor_options.truncate (0);
11143 path_prefix_reset (&exec_prefixes);
11144 path_prefix_reset (&startfile_prefixes);
11145 path_prefix_reset (&include_prefixes);
11147 machine_suffix = 0;
11148 just_machine_suffix = 0;
11149 gcc_exec_prefix = 0;
11150 gcc_libexec_prefix = 0;
11151 set_static_spec_shared (&md_exec_prefix, MD_EXEC_PREFIX);
11152 set_static_spec_shared (&md_startfile_prefix, MD_STARTFILE_PREFIX);
11153 set_static_spec_shared (&md_startfile_prefix_1, MD_STARTFILE_PREFIX_1);
11154 multilib_dir = 0;
11155 multilib_os_dir = 0;
11156 multiarch_dir = 0;
11158 /* Free any specs dynamically-allocated by set_spec.
11159 These will be at the head of the list, before the
11160 statically-allocated ones. */
11161 if (specs)
11163 while (specs != static_specs)
11165 spec_list *next = specs->next;
11166 free (const_cast <char *> (specs->name));
11167 XDELETE (specs);
11168 specs = next;
11170 specs = 0;
11172 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
11174 spec_list *sl = &static_specs[i];
11175 if (sl->alloc_p)
11177 free (const_cast <char *> (*(sl->ptr_spec)));
11178 sl->alloc_p = false;
11180 *(sl->ptr_spec) = sl->default_ptr;
11182 #ifdef EXTRA_SPECS
11183 extra_specs = NULL;
11184 #endif
11186 processing_spec_function = 0;
11188 clear_args ();
11190 have_c = 0;
11191 have_o = 0;
11193 temp_names = NULL;
11194 execution_count = 0;
11195 signal_count = 0;
11197 temp_filename = NULL;
11198 temp_filename_length = 0;
11199 always_delete_queue = NULL;
11200 failure_delete_queue = NULL;
11202 XDELETEVEC (switches);
11203 switches = NULL;
11204 n_switches = 0;
11205 n_switches_alloc = 0;
11207 compare_debug = 0;
11208 compare_debug_second = 0;
11209 compare_debug_opt = NULL;
11210 for (int i = 0; i < 2; i++)
11212 switches_debug_check[i] = NULL;
11213 n_switches_debug_check[i] = 0;
11214 n_switches_alloc_debug_check[i] = 0;
11215 debug_check_temp_file[i] = NULL;
11218 XDELETEVEC (infiles);
11219 infiles = NULL;
11220 n_infiles = 0;
11221 n_infiles_alloc = 0;
11223 combine_inputs = false;
11224 added_libraries = 0;
11225 XDELETEVEC (outfiles);
11226 outfiles = NULL;
11227 spec_lang = 0;
11228 last_language_n_infiles = 0;
11229 gcc_input_filename = NULL;
11230 input_file_number = 0;
11231 input_filename_length = 0;
11232 basename_length = 0;
11233 suffixed_basename_length = 0;
11234 input_basename = NULL;
11235 input_suffix = NULL;
11236 /* We don't need to purge "input_stat", just to unset "input_stat_set". */
11237 input_stat_set = 0;
11238 input_file_compiler = NULL;
11239 arg_going = 0;
11240 delete_this_arg = 0;
11241 this_is_output_file = 0;
11242 this_is_library_file = 0;
11243 this_is_linker_script = 0;
11244 input_from_pipe = 0;
11245 suffix_subst = NULL;
11247 mdswitches = NULL;
11248 n_mdswitches = 0;
11250 used_arg.finalize ();
11253 /* PR jit/64810.
11254 Targets can provide configure-time default options in
11255 OPTION_DEFAULT_SPECS. The jit needs to access these, but
11256 they are expressed in the spec language.
11258 Run just enough of the driver to be able to expand these
11259 specs, and then call the callback CB on each
11260 such option. The options strings are *without* a leading
11261 '-' character e.g. ("march=x86-64"). Finally, clean up. */
11263 void
11264 driver_get_configure_time_options (void (*cb) (const char *option,
11265 void *user_data),
11266 void *user_data)
11268 size_t i;
11270 obstack_init (&obstack);
11271 init_opts_obstack ();
11272 n_switches = 0;
11274 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
11275 do_option_spec (option_default_specs[i].name,
11276 option_default_specs[i].spec);
11278 for (i = 0; (int) i < n_switches; i++)
11280 gcc_assert (switches[i].part1);
11281 (*cb) (switches[i].part1, user_data);
11284 obstack_free (&opts_obstack, NULL);
11285 obstack_free (&obstack, NULL);
11286 n_switches = 0;