Remove extra newline
[official-gcc.git] / gcc / gcc.c
blobb0d0308f1270b32c53b318fea77e2932acd3a25c
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2020 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This program is the user interface to the C compiler and possibly to
21 other compilers. It is used because compilation is a complicated procedure
22 which involves running several programs and passing temporary files between
23 them, forwarding the users switches to those programs selectively,
24 and deleting the temporary files at the end.
26 CC recognizes how to compile each input file by suffixes in the file names.
27 Once it knows which kind of compilation to perform, the procedure for
28 compilation is specified by a string called a "spec". */
30 #include "config.h"
31 #include "system.h"
32 #include "coretypes.h"
33 #include "multilib.h" /* before tm.h */
34 #include "tm.h"
35 #include "xregex.h"
36 #include "obstack.h"
37 #include "intl.h"
38 #include "prefix.h"
39 #include "opt-suggestions.h"
40 #include "gcc.h"
41 #include "diagnostic.h"
42 #include "flags.h"
43 #include "opts.h"
44 #include "filenames.h"
45 #include "spellcheck.h"
49 /* Manage the manipulation of env vars.
51 We poison "getenv" and "putenv", so that all enviroment-handling is
52 done through this class. Note that poisoning happens in the
53 preprocessor at the identifier level, and doesn't distinguish between
54 env.getenv ();
55 and
56 getenv ();
57 Hence we need to use "get" for the accessor method, not "getenv". */
59 struct env_manager
61 public:
62 void init (bool can_restore, bool debug);
63 const char *get (const char *name);
64 void xput (const char *string);
65 void restore ();
67 private:
68 bool m_can_restore;
69 bool m_debug;
70 struct kv
72 char *m_key;
73 char *m_value;
75 vec<kv> m_keys;
79 /* The singleton instance of class env_manager. */
81 static env_manager env;
83 /* Initializer for class env_manager.
85 We can't do this as a constructor since we have a statically
86 allocated instance ("env" above). */
88 void
89 env_manager::init (bool can_restore, bool debug)
91 m_can_restore = can_restore;
92 m_debug = debug;
95 /* Get the value of NAME within the environment. Essentially
96 a wrapper for ::getenv, but adding logging, and the possibility
97 of caching results. */
99 const char *
100 env_manager::get (const char *name)
102 const char *result = ::getenv (name);
103 if (m_debug)
104 fprintf (stderr, "env_manager::getenv (%s) -> %s\n", name, result);
105 return result;
108 /* Put the given KEY=VALUE entry STRING into the environment.
109 If the env_manager was initialized with CAN_RESTORE set, then
110 also record the old value of KEY within the environment, so that it
111 can be later restored. */
113 void
114 env_manager::xput (const char *string)
116 if (m_debug)
117 fprintf (stderr, "env_manager::xput (%s)\n", string);
118 if (verbose_flag)
119 fnotice (stderr, "%s\n", string);
121 if (m_can_restore)
123 char *equals = strchr (const_cast <char *> (string), '=');
124 gcc_assert (equals);
126 struct kv kv;
127 kv.m_key = xstrndup (string, equals - string);
128 const char *cur_value = ::getenv (kv.m_key);
129 if (m_debug)
130 fprintf (stderr, "saving old value: %s\n",cur_value);
131 kv.m_value = cur_value ? xstrdup (cur_value) : NULL;
132 m_keys.safe_push (kv);
135 ::putenv (CONST_CAST (char *, string));
138 /* Undo any xputenv changes made since last restore.
139 Can only be called if the env_manager was initialized with
140 CAN_RESTORE enabled. */
142 void
143 env_manager::restore ()
145 unsigned int i;
146 struct kv *item;
148 gcc_assert (m_can_restore);
150 FOR_EACH_VEC_ELT_REVERSE (m_keys, i, item)
152 if (m_debug)
153 printf ("restoring saved key: %s value: %s\n", item->m_key, item->m_value);
154 if (item->m_value)
155 ::setenv (item->m_key, item->m_value, 1);
156 else
157 ::unsetenv (item->m_key);
158 free (item->m_key);
159 free (item->m_value);
162 m_keys.truncate (0);
165 /* Forbid other uses of getenv and putenv. */
166 #if (GCC_VERSION >= 3000)
167 #pragma GCC poison getenv putenv
168 #endif
172 /* By default there is no special suffix for target executables. */
173 #ifdef TARGET_EXECUTABLE_SUFFIX
174 #define HAVE_TARGET_EXECUTABLE_SUFFIX
175 #else
176 #define TARGET_EXECUTABLE_SUFFIX ""
177 #endif
179 /* By default there is no special suffix for host executables. */
180 #ifdef HOST_EXECUTABLE_SUFFIX
181 #define HAVE_HOST_EXECUTABLE_SUFFIX
182 #else
183 #define HOST_EXECUTABLE_SUFFIX ""
184 #endif
186 /* By default, the suffix for target object files is ".o". */
187 #ifdef TARGET_OBJECT_SUFFIX
188 #define HAVE_TARGET_OBJECT_SUFFIX
189 #else
190 #define TARGET_OBJECT_SUFFIX ".o"
191 #endif
193 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
195 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
196 #ifndef LIBRARY_PATH_ENV
197 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
198 #endif
200 /* If a stage of compilation returns an exit status >= 1,
201 compilation of that file ceases. */
203 #define MIN_FATAL_STATUS 1
205 /* Flag set by cppspec.c to 1. */
206 int is_cpp_driver;
208 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
209 static bool at_file_supplied;
211 /* Definition of string containing the arguments given to configure. */
212 #include "configargs.h"
214 /* Flag saying to print the command line options understood by gcc and its
215 sub-processes. */
217 static int print_help_list;
219 /* Flag saying to print the version of gcc and its sub-processes. */
221 static int print_version;
223 /* Flag that stores string prefix for which we provide bash completion. */
225 static const char *completion = NULL;
227 /* Flag indicating whether we should ONLY print the command and
228 arguments (like verbose_flag) without executing the command.
229 Displayed arguments are quoted so that the generated command
230 line is suitable for execution. This is intended for use in
231 shell scripts to capture the driver-generated command line. */
232 static int verbose_only_flag;
234 /* Flag indicating how to print command line options of sub-processes. */
236 static int print_subprocess_help;
238 /* Linker suffix passed to -fuse-ld=... */
239 static const char *use_ld;
241 /* Whether we should report subprocess execution times to a file. */
243 FILE *report_times_to_file = NULL;
245 /* Nonzero means place this string before uses of /, so that include
246 and library files can be found in an alternate location. */
248 #ifdef TARGET_SYSTEM_ROOT
249 #define DEFAULT_TARGET_SYSTEM_ROOT (TARGET_SYSTEM_ROOT)
250 #else
251 #define DEFAULT_TARGET_SYSTEM_ROOT (0)
252 #endif
253 static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
255 /* Nonzero means pass the updated target_system_root to the compiler. */
257 static int target_system_root_changed;
259 /* Nonzero means append this string to target_system_root. */
261 static const char *target_sysroot_suffix = 0;
263 /* Nonzero means append this string to target_system_root for headers. */
265 static const char *target_sysroot_hdrs_suffix = 0;
267 /* Nonzero means write "temp" files in source directory
268 and use the source file's name in them, and don't delete them. */
270 static enum save_temps {
271 SAVE_TEMPS_NONE, /* no -save-temps */
272 SAVE_TEMPS_CWD, /* -save-temps in current directory */
273 SAVE_TEMPS_OBJ /* -save-temps in object directory */
274 } save_temps_flag;
276 /* Output file to use to get the object directory for -save-temps=obj */
277 static char *save_temps_prefix = 0;
278 static size_t save_temps_length = 0;
280 /* The compiler version. */
282 static const char *compiler_version;
284 /* The target version. */
286 static const char *const spec_version = DEFAULT_TARGET_VERSION;
288 /* The target machine. */
290 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
291 static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
293 /* List of offload targets. Separated by colon. Empty string for
294 -foffload=disable. */
296 static char *offload_targets = NULL;
298 /* Nonzero if cross-compiling.
299 When -b is used, the value comes from the `specs' file. */
301 #ifdef CROSS_DIRECTORY_STRUCTURE
302 static const char *cross_compile = "1";
303 #else
304 static const char *cross_compile = "0";
305 #endif
307 /* Greatest exit code of sub-processes that has been encountered up to
308 now. */
309 static int greatest_status = 1;
311 /* This is the obstack which we use to allocate many strings. */
313 static struct obstack obstack;
315 /* This is the obstack to build an environment variable to pass to
316 collect2 that describes all of the relevant switches of what to
317 pass the compiler in building the list of pointers to constructors
318 and destructors. */
320 static struct obstack collect_obstack;
322 /* Forward declaration for prototypes. */
323 struct path_prefix;
324 struct prefix_list;
326 static void init_spec (void);
327 static void store_arg (const char *, int, int);
328 static void insert_wrapper (const char *);
329 static char *load_specs (const char *);
330 static void read_specs (const char *, bool, bool);
331 static void set_spec (const char *, const char *, bool);
332 static struct compiler *lookup_compiler (const char *, size_t, const char *);
333 static char *build_search_list (const struct path_prefix *, const char *,
334 bool, bool);
335 static void xputenv (const char *);
336 static void putenv_from_prefixes (const struct path_prefix *, const char *,
337 bool);
338 static int access_check (const char *, int);
339 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
340 static void add_prefix (struct path_prefix *, const char *, const char *,
341 int, int, int);
342 static void add_sysrooted_prefix (struct path_prefix *, const char *,
343 const char *, int, int, int);
344 static char *skip_whitespace (char *);
345 static void delete_if_ordinary (const char *);
346 static void delete_temp_files (void);
347 static void delete_failure_queue (void);
348 static void clear_failure_queue (void);
349 static int check_live_switch (int, int);
350 static const char *handle_braces (const char *);
351 static inline bool input_suffix_matches (const char *, const char *);
352 static inline bool switch_matches (const char *, const char *, int);
353 static inline void mark_matching_switches (const char *, const char *, int);
354 static inline void process_marked_switches (void);
355 static const char *process_brace_body (const char *, const char *, const char *, int, int);
356 static const struct spec_function *lookup_spec_function (const char *);
357 static const char *eval_spec_function (const char *, const char *, const char *);
358 static const char *handle_spec_function (const char *, bool *, const char *);
359 static char *save_string (const char *, int);
360 static void set_collect_gcc_options (void);
361 static int do_spec_1 (const char *, int, const char *);
362 static int do_spec_2 (const char *, const char *);
363 static void do_option_spec (const char *, const char *);
364 static void do_self_spec (const char *);
365 static const char *find_file (const char *);
366 static int is_directory (const char *, bool);
367 static const char *validate_switches (const char *, bool);
368 static void validate_all_switches (void);
369 static inline void validate_switches_from_spec (const char *, bool);
370 static void give_switch (int, int);
371 static int default_arg (const char *, int);
372 static void set_multilib_dir (void);
373 static void print_multilib_info (void);
374 static void display_help (void);
375 static void add_preprocessor_option (const char *, int);
376 static void add_assembler_option (const char *, int);
377 static void add_linker_option (const char *, int);
378 static void process_command (unsigned int, struct cl_decoded_option *);
379 static int execute (void);
380 static void alloc_args (void);
381 static void clear_args (void);
382 static void fatal_signal (int);
383 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
384 static void init_gcc_specs (struct obstack *, const char *, const char *,
385 const char *);
386 #endif
387 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
388 static const char *convert_filename (const char *, int, int);
389 #endif
391 static void try_generate_repro (const char **argv);
392 static const char *getenv_spec_function (int, const char **);
393 static const char *if_exists_spec_function (int, const char **);
394 static const char *if_exists_else_spec_function (int, const char **);
395 static const char *sanitize_spec_function (int, const char **);
396 static const char *replace_outfile_spec_function (int, const char **);
397 static const char *remove_outfile_spec_function (int, const char **);
398 static const char *version_compare_spec_function (int, const char **);
399 static const char *include_spec_function (int, const char **);
400 static const char *find_file_spec_function (int, const char **);
401 static const char *find_plugindir_spec_function (int, const char **);
402 static const char *print_asm_header_spec_function (int, const char **);
403 static const char *compare_debug_dump_opt_spec_function (int, const char **);
404 static const char *compare_debug_self_opt_spec_function (int, const char **);
405 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
406 static const char *pass_through_libs_spec_func (int, const char **);
407 static const char *replace_extension_spec_func (int, const char **);
408 static const char *greater_than_spec_func (int, const char **);
409 static const char *debug_level_greater_than_spec_func (int, const char **);
410 static const char *find_fortran_preinclude_file (int, const char **);
411 static char *convert_white_space (char *);
413 /* The Specs Language
415 Specs are strings containing lines, each of which (if not blank)
416 is made up of a program name, and arguments separated by spaces.
417 The program name must be exact and start from root, since no path
418 is searched and it is unreliable to depend on the current working directory.
419 Redirection of input or output is not supported; the subprograms must
420 accept filenames saying what files to read and write.
422 In addition, the specs can contain %-sequences to substitute variable text
423 or for conditional text. Here is a table of all defined %-sequences.
424 Note that spaces are not generated automatically around the results of
425 expanding these sequences; therefore, you can concatenate them together
426 or with constant text in a single argument.
428 %% substitute one % into the program name or argument.
429 %i substitute the name of the input file being processed.
430 %b substitute the basename of the input file being processed.
431 This is the substring up to (and not including) the last period
432 and not including the directory unless -save-temps was specified
433 to put temporaries in a different location.
434 %B same as %b, but include the file suffix (text after the last period).
435 %gSUFFIX
436 substitute a file name that has suffix SUFFIX and is chosen
437 once per compilation, and mark the argument a la %d. To reduce
438 exposure to denial-of-service attacks, the file name is now
439 chosen in a way that is hard to predict even when previously
440 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
441 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
442 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
443 had been pre-processed. Previously, %g was simply substituted
444 with a file name chosen once per compilation, without regard
445 to any appended suffix (which was therefore treated just like
446 ordinary text), making such attacks more likely to succeed.
447 %|SUFFIX
448 like %g, but if -pipe is in effect, expands simply to "-".
449 %mSUFFIX
450 like %g, but if -pipe is in effect, expands to nothing. (We have both
451 %| and %m to accommodate differences between system assemblers; see
452 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
453 %uSUFFIX
454 like %g, but generates a new temporary file name even if %uSUFFIX
455 was already seen.
456 %USUFFIX
457 substitutes the last file name generated with %uSUFFIX, generating a
458 new one if there is no such last file name. In the absence of any
459 %uSUFFIX, this is just like %gSUFFIX, except they don't share
460 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
461 would involve the generation of two distinct file names, one
462 for each `%g.s' and another for each `%U.s'. Previously, %U was
463 simply substituted with a file name chosen for the previous %u,
464 without regard to any appended suffix.
465 %jSUFFIX
466 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
467 writable, and if save-temps is off; otherwise, substitute the name
468 of a temporary file, just like %u. This temporary file is not
469 meant for communication between processes, but rather as a junk
470 disposal mechanism.
471 %.SUFFIX
472 substitutes .SUFFIX for the suffixes of a matched switch's args when
473 it is subsequently output with %*. SUFFIX is terminated by the next
474 space or %.
475 %d marks the argument containing or following the %d as a
476 temporary file name, so that file will be deleted if GCC exits
477 successfully. Unlike %g, this contributes no text to the argument.
478 %w marks the argument containing or following the %w as the
479 "output file" of this compilation. This puts the argument
480 into the sequence of arguments that %o will substitute later.
481 %V indicates that this compilation produces no "output file".
482 %W{...}
483 like %{...} but marks the last argument supplied within as a file
484 to be deleted on failure.
485 %@{...}
486 like %{...} but puts the result into a FILE and substitutes @FILE
487 if an @file argument has been supplied.
488 %o substitutes the names of all the output files, with spaces
489 automatically placed around them. You should write spaces
490 around the %o as well or the results are undefined.
491 %o is for use in the specs for running the linker.
492 Input files whose names have no recognized suffix are not compiled
493 at all, but they are included among the output files, so they will
494 be linked.
495 %O substitutes the suffix for object files. Note that this is
496 handled specially when it immediately follows %g, %u, or %U
497 (with or without a suffix argument) because of the need for
498 those to form complete file names. The handling is such that
499 %O is treated exactly as if it had already been substituted,
500 except that %g, %u, and %U do not currently support additional
501 SUFFIX characters following %O as they would following, for
502 example, `.o'.
503 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
504 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
505 and -B options) and -imultilib as necessary.
506 %s current argument is the name of a library or startup file of some sort.
507 Search for that file in a standard list of directories
508 and substitute the full name found.
509 %eSTR Print STR as an error message. STR is terminated by a newline.
510 Use this when inconsistent options are detected.
511 %nSTR Print STR as a notice. STR is terminated by a newline.
512 %x{OPTION} Accumulate an option for %X.
513 %X Output the accumulated linker options specified by compilations.
514 %Y Output the accumulated assembler options specified by compilations.
515 %Z Output the accumulated preprocessor options specified by compilations.
516 %a process ASM_SPEC as a spec.
517 This allows config.h to specify part of the spec for running as.
518 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
519 used here. This can be used to run a post-processor after the
520 assembler has done its job.
521 %D Dump out a -L option for each directory in startfile_prefixes.
522 If multilib_dir is set, extra entries are generated with it affixed.
523 %l process LINK_SPEC as a spec.
524 %L process LIB_SPEC as a spec.
525 %M Output multilib_os_dir.
526 %G process LIBGCC_SPEC as a spec.
527 %R Output the concatenation of target_system_root and
528 target_sysroot_suffix.
529 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
530 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
531 %C process CPP_SPEC as a spec.
532 %1 process CC1_SPEC as a spec.
533 %2 process CC1PLUS_SPEC as a spec.
534 %* substitute the variable part of a matched option. (See below.)
535 Note that each comma in the substituted string is replaced by
536 a single space. A space is appended after the last substition
537 unless there is more text in current sequence.
538 %<S remove all occurrences of -S from the command line.
539 Note - this command is position dependent. % commands in the
540 spec string before this one will see -S, % commands in the
541 spec string after this one will not.
542 %>S Similar to "%<S", but keep it in the GCC command line.
543 %<S* remove all occurrences of all switches beginning with -S from the
544 command line.
545 %:function(args)
546 Call the named function FUNCTION, passing it ARGS. ARGS is
547 first processed as a nested spec string, then split into an
548 argument vector in the usual fashion. The function returns
549 a string which is processed as if it had appeared literally
550 as part of the current spec.
551 %{S} substitutes the -S switch, if that switch was given to GCC.
552 If that switch was not specified, this substitutes nothing.
553 Here S is a metasyntactic variable.
554 %{S*} substitutes all the switches specified to GCC whose names start
555 with -S. This is used for -o, -I, etc; switches that take
556 arguments. GCC considers `-o foo' as being one switch whose
557 name starts with `o'. %{o*} would substitute this text,
558 including the space; thus, two arguments would be generated.
559 %{S*&T*} likewise, but preserve order of S and T options (the order
560 of S and T in the spec is not significant). Can be any number
561 of ampersand-separated variables; for each the wild card is
562 optional. Useful for CPP as %{D*&U*&A*}.
564 %{S:X} substitutes X, if the -S switch was given to GCC.
565 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
566 %{S*:X} substitutes X if one or more switches whose names start
567 with -S was given to GCC. Normally X is substituted only
568 once, no matter how many such switches appeared. However,
569 if %* appears somewhere in X, then X will be substituted
570 once for each matching switch, with the %* replaced by the
571 part of that switch that matched the '*'. A space will be
572 appended after the last substition unless there is more
573 text in current sequence.
574 %{.S:X} substitutes X, if processing a file with suffix S.
575 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
576 %{,S:X} substitutes X, if processing a file which will use spec S.
577 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
579 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
580 combined with '!', '.', ',', and '*' as above binding stronger
581 than the OR.
582 If %* appears in X, all of the alternatives must be starred, and
583 only the first matching alternative is substituted.
584 %{%:function(args):X}
585 Call function named FUNCTION with args ARGS. If the function
586 returns non-NULL, then X is substituted, if it returns
587 NULL, it isn't substituted.
588 %{S:X; if S was given to GCC, substitutes X;
589 T:Y; else if T was given to GCC, substitutes Y;
590 :D} else substitutes D. There can be as many clauses as you need.
591 This may be combined with '.', '!', ',', '|', and '*' as above.
593 %(Spec) processes a specification defined in a specs file as *Spec:
595 The switch matching text S in a %{S}, %{S:X}, or similar construct can use
596 a backslash to ignore the special meaning of the character following it,
597 thus allowing literal matching of a character that is otherwise specially
598 treated. For example, %{std=iso9899\:1999:X} substitutes X if the
599 -std=iso9899:1999 option is given.
601 The conditional text X in a %{S:X} or similar construct may contain
602 other nested % constructs or spaces, or even newlines. They are
603 processed as usual, as described above. Trailing white space in X is
604 ignored. White space may also appear anywhere on the left side of the
605 colon in these constructs, except between . or * and the corresponding
606 word.
608 The -O, -f, -g, -m, and -W switches are handled specifically in these
609 constructs. If another value of -O or the negated form of a -f, -m, or
610 -W switch is found later in the command line, the earlier switch
611 value is ignored, except with {S*} where S is just one letter; this
612 passes all matching options.
614 The character | at the beginning of the predicate text is used to indicate
615 that a command should be piped to the following command, but only if -pipe
616 is specified.
618 Note that it is built into GCC which switches take arguments and which
619 do not. You might think it would be useful to generalize this to
620 allow each compiler's spec to say which switches take arguments. But
621 this cannot be done in a consistent fashion. GCC cannot even decide
622 which input files have been specified without knowing which switches
623 take arguments, and it must know which input files to compile in order
624 to tell which compilers to run.
626 GCC also knows implicitly that arguments starting in `-l' are to be
627 treated as compiler output files, and passed to the linker in their
628 proper position among the other output files. */
630 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
632 /* config.h can define ASM_SPEC to provide extra args to the assembler
633 or extra switch-translations. */
634 #ifndef ASM_SPEC
635 #define ASM_SPEC ""
636 #endif
638 /* config.h can define ASM_FINAL_SPEC to run a post processor after
639 the assembler has run. */
640 #ifndef ASM_FINAL_SPEC
641 #define ASM_FINAL_SPEC \
642 "%{gsplit-dwarf: \n\
643 objcopy --extract-dwo \
644 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
645 %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo} \n\
646 objcopy --strip-dwo \
647 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
649 #endif
651 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
652 or extra switch-translations. */
653 #ifndef CPP_SPEC
654 #define CPP_SPEC ""
655 #endif
657 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
658 or extra switch-translations. */
659 #ifndef CC1_SPEC
660 #define CC1_SPEC ""
661 #endif
663 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
664 or extra switch-translations. */
665 #ifndef CC1PLUS_SPEC
666 #define CC1PLUS_SPEC ""
667 #endif
669 /* config.h can define LINK_SPEC to provide extra args to the linker
670 or extra switch-translations. */
671 #ifndef LINK_SPEC
672 #define LINK_SPEC ""
673 #endif
675 /* config.h can define LIB_SPEC to override the default libraries. */
676 #ifndef LIB_SPEC
677 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
678 #endif
680 /* When using -fsplit-stack we need to wrap pthread_create, in order
681 to initialize the stack guard. We always use wrapping, rather than
682 shared library ordering, and we keep the wrapper function in
683 libgcc. This is not yet a real spec, though it could become one;
684 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
685 only works with GNU ld and gold. */
686 #ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
687 #define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
688 #else
689 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
690 #endif
692 #ifndef LIBASAN_SPEC
693 #define STATIC_LIBASAN_LIBS \
694 " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
695 #ifdef LIBASAN_EARLY_SPEC
696 #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
697 #elif defined(HAVE_LD_STATIC_DYNAMIC)
698 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
699 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
700 STATIC_LIBASAN_LIBS
701 #else
702 #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
703 #endif
704 #endif
706 #ifndef LIBASAN_EARLY_SPEC
707 #define LIBASAN_EARLY_SPEC ""
708 #endif
710 #ifndef LIBTSAN_SPEC
711 #define STATIC_LIBTSAN_LIBS \
712 " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
713 #ifdef LIBTSAN_EARLY_SPEC
714 #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
715 #elif defined(HAVE_LD_STATIC_DYNAMIC)
716 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
717 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
718 STATIC_LIBTSAN_LIBS
719 #else
720 #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
721 #endif
722 #endif
724 #ifndef LIBTSAN_EARLY_SPEC
725 #define LIBTSAN_EARLY_SPEC ""
726 #endif
728 #ifndef LIBLSAN_SPEC
729 #define STATIC_LIBLSAN_LIBS \
730 " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
731 #ifdef LIBLSAN_EARLY_SPEC
732 #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
733 #elif defined(HAVE_LD_STATIC_DYNAMIC)
734 #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
735 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
736 STATIC_LIBLSAN_LIBS
737 #else
738 #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
739 #endif
740 #endif
742 #ifndef LIBLSAN_EARLY_SPEC
743 #define LIBLSAN_EARLY_SPEC ""
744 #endif
746 #ifndef LIBUBSAN_SPEC
747 #define STATIC_LIBUBSAN_LIBS \
748 " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
749 #ifdef HAVE_LD_STATIC_DYNAMIC
750 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
751 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
752 STATIC_LIBUBSAN_LIBS
753 #else
754 #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
755 #endif
756 #endif
758 /* Linker options for compressed debug sections. */
759 #if HAVE_LD_COMPRESS_DEBUG == 0
760 /* No linker support. */
761 #define LINK_COMPRESS_DEBUG_SPEC \
762 " %{gz*:%e-gz is not supported in this configuration} "
763 #elif HAVE_LD_COMPRESS_DEBUG == 1
764 /* GNU style on input, GNU ld options. Reject, not useful. */
765 #define LINK_COMPRESS_DEBUG_SPEC \
766 " %{gz*:%e-gz is not supported in this configuration} "
767 #elif HAVE_LD_COMPRESS_DEBUG == 2
768 /* GNU style, GNU gold options. */
769 #define LINK_COMPRESS_DEBUG_SPEC \
770 " %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
771 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
772 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
773 #elif HAVE_LD_COMPRESS_DEBUG == 3
774 /* ELF gABI style. */
775 #define LINK_COMPRESS_DEBUG_SPEC \
776 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
777 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
778 " %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
779 #else
780 #error Unknown value for HAVE_LD_COMPRESS_DEBUG.
781 #endif
783 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
784 included. */
785 #ifndef LIBGCC_SPEC
786 #if defined(REAL_LIBGCC_SPEC)
787 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
788 #elif defined(LINK_LIBGCC_SPECIAL_1)
789 /* Have gcc do the search for libgcc.a. */
790 #define LIBGCC_SPEC "libgcc.a%s"
791 #else
792 #define LIBGCC_SPEC "-lgcc"
793 #endif
794 #endif
796 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
797 #ifndef STARTFILE_SPEC
798 #define STARTFILE_SPEC \
799 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
800 #endif
802 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
803 #ifndef ENDFILE_SPEC
804 #define ENDFILE_SPEC ""
805 #endif
807 #ifndef LINKER_NAME
808 #define LINKER_NAME "collect2"
809 #endif
811 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
812 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
813 #else
814 #define ASM_MAP ""
815 #endif
817 /* Assembler options for compressed debug sections. */
818 #if HAVE_LD_COMPRESS_DEBUG < 2
819 /* Reject if the linker cannot write compressed debug sections. */
820 #define ASM_COMPRESS_DEBUG_SPEC \
821 " %{gz*:%e-gz is not supported in this configuration} "
822 #else /* HAVE_LD_COMPRESS_DEBUG >= 2 */
823 #if HAVE_AS_COMPRESS_DEBUG == 0
824 /* No assembler support. Ignore silently. */
825 #define ASM_COMPRESS_DEBUG_SPEC \
826 " %{gz*:} "
827 #elif HAVE_AS_COMPRESS_DEBUG == 1
828 /* GNU style, GNU as options. */
829 #define ASM_COMPRESS_DEBUG_SPEC \
830 " %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "}" \
831 " %{gz=none:" AS_NO_COMPRESS_DEBUG_OPTION "}" \
832 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
833 #elif HAVE_AS_COMPRESS_DEBUG == 2
834 /* ELF gABI style. */
835 #define ASM_COMPRESS_DEBUG_SPEC \
836 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
837 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
838 " %{gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
839 #else
840 #error Unknown value for HAVE_AS_COMPRESS_DEBUG.
841 #endif
842 #endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */
844 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
845 to the assembler. */
846 #ifndef ASM_DEBUG_SPEC
847 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
848 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
849 # define ASM_DEBUG_SPEC \
850 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
851 ? "%{%:debug-level-gt(0):" \
852 "%{gdwarf*:--gdwarf2}%{!gdwarf*:%{g*:--gstabs}}}" ASM_MAP \
853 : "%{%:debug-level-gt(0):" \
854 "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
855 # else
856 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
857 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):--gstabs}}" ASM_MAP
858 # endif
859 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
860 # define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):--gdwarf2}}" ASM_MAP
861 # endif
862 # endif
863 #endif
864 #ifndef ASM_DEBUG_SPEC
865 # define ASM_DEBUG_SPEC ""
866 #endif
868 /* Here is the spec for running the linker, after compiling all files. */
870 /* This is overridable by the target in case they need to specify the
871 -lgcc and -lc order specially, yet not require them to override all
872 of LINK_COMMAND_SPEC. */
873 #ifndef LINK_GCC_C_SEQUENCE_SPEC
874 #define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
875 #endif
877 #ifndef LINK_SSP_SPEC
878 #ifdef TARGET_LIBC_PROVIDES_SSP
879 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
880 "|fstack-protector-strong|fstack-protector-explicit:}"
881 #else
882 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
883 "|fstack-protector-strong|fstack-protector-explicit" \
884 ":-lssp_nonshared -lssp}"
885 #endif
886 #endif
888 #ifdef ENABLE_DEFAULT_PIE
889 #define PIE_SPEC "!no-pie"
890 #define NO_FPIE1_SPEC "fno-pie"
891 #define FPIE1_SPEC NO_FPIE1_SPEC ":;"
892 #define NO_FPIE2_SPEC "fno-PIE"
893 #define FPIE2_SPEC NO_FPIE2_SPEC ":;"
894 #define NO_FPIE_SPEC NO_FPIE1_SPEC "|" NO_FPIE2_SPEC
895 #define FPIE_SPEC NO_FPIE_SPEC ":;"
896 #define NO_FPIC1_SPEC "fno-pic"
897 #define FPIC1_SPEC NO_FPIC1_SPEC ":;"
898 #define NO_FPIC2_SPEC "fno-PIC"
899 #define FPIC2_SPEC NO_FPIC2_SPEC ":;"
900 #define NO_FPIC_SPEC NO_FPIC1_SPEC "|" NO_FPIC2_SPEC
901 #define FPIC_SPEC NO_FPIC_SPEC ":;"
902 #define NO_FPIE1_AND_FPIC1_SPEC NO_FPIE1_SPEC "|" NO_FPIC1_SPEC
903 #define FPIE1_OR_FPIC1_SPEC NO_FPIE1_AND_FPIC1_SPEC ":;"
904 #define NO_FPIE2_AND_FPIC2_SPEC NO_FPIE2_SPEC "|" NO_FPIC2_SPEC
905 #define FPIE2_OR_FPIC2_SPEC NO_FPIE2_AND_FPIC2_SPEC ":;"
906 #define NO_FPIE_AND_FPIC_SPEC NO_FPIE_SPEC "|" NO_FPIC_SPEC
907 #define FPIE_OR_FPIC_SPEC NO_FPIE_AND_FPIC_SPEC ":;"
908 #else
909 #define PIE_SPEC "pie"
910 #define FPIE1_SPEC "fpie"
911 #define NO_FPIE1_SPEC FPIE1_SPEC ":;"
912 #define FPIE2_SPEC "fPIE"
913 #define NO_FPIE2_SPEC FPIE2_SPEC ":;"
914 #define FPIE_SPEC FPIE1_SPEC "|" FPIE2_SPEC
915 #define NO_FPIE_SPEC FPIE_SPEC ":;"
916 #define FPIC1_SPEC "fpic"
917 #define NO_FPIC1_SPEC FPIC1_SPEC ":;"
918 #define FPIC2_SPEC "fPIC"
919 #define NO_FPIC2_SPEC FPIC2_SPEC ":;"
920 #define FPIC_SPEC FPIC1_SPEC "|" FPIC2_SPEC
921 #define NO_FPIC_SPEC FPIC_SPEC ":;"
922 #define FPIE1_OR_FPIC1_SPEC FPIE1_SPEC "|" FPIC1_SPEC
923 #define NO_FPIE1_AND_FPIC1_SPEC FPIE1_OR_FPIC1_SPEC ":;"
924 #define FPIE2_OR_FPIC2_SPEC FPIE2_SPEC "|" FPIC2_SPEC
925 #define NO_FPIE2_AND_FPIC2_SPEC FPIE1_OR_FPIC2_SPEC ":;"
926 #define FPIE_OR_FPIC_SPEC FPIE_SPEC "|" FPIC_SPEC
927 #define NO_FPIE_AND_FPIC_SPEC FPIE_OR_FPIC_SPEC ":;"
928 #endif
930 #ifndef LINK_PIE_SPEC
931 #ifdef HAVE_LD_PIE
932 #ifndef LD_PIE_SPEC
933 #define LD_PIE_SPEC "-pie"
934 #endif
935 #else
936 #define LD_PIE_SPEC ""
937 #endif
938 #define LINK_PIE_SPEC "%{static|shared|r:;" PIE_SPEC ":" LD_PIE_SPEC "} "
939 #endif
941 #ifndef LINK_BUILDID_SPEC
942 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
943 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
944 # endif
945 #endif
947 #ifndef LTO_PLUGIN_SPEC
948 #define LTO_PLUGIN_SPEC ""
949 #endif
951 /* Conditional to test whether the LTO plugin is used or not.
952 FIXME: For slim LTO we will need to enable plugin unconditionally. This
953 still cause problems with PLUGIN_LD != LD and when plugin is built but
954 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
955 plugin only when LTO is enabled. We still honor explicit
956 -fuse-linker-plugin if the linker used understands -plugin. */
958 /* The linker has some plugin support. */
959 #if HAVE_LTO_PLUGIN > 0
960 /* The linker used has full plugin support, use LTO plugin by default. */
961 #if HAVE_LTO_PLUGIN == 2
962 #define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
963 #define PLUGIN_COND_CLOSE "}"
964 #else
965 /* The linker used has limited plugin support, use LTO plugin with explicit
966 -fuse-linker-plugin. */
967 #define PLUGIN_COND "fuse-linker-plugin"
968 #define PLUGIN_COND_CLOSE ""
969 #endif
970 #define LINK_PLUGIN_SPEC \
971 "%{" PLUGIN_COND": \
972 -plugin %(linker_plugin_file) \
973 -plugin-opt=%(lto_wrapper) \
974 -plugin-opt=-fresolution=%u.res \
975 " LTO_PLUGIN_SPEC "\
976 %{flinker-output=*:-plugin-opt=-linker-output-known} \
977 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
978 }" PLUGIN_COND_CLOSE
979 #else
980 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
981 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
982 %e-fuse-linker-plugin is not supported in this configuration}"
983 #endif
985 /* Linker command line options for -fsanitize= early on the command line. */
986 #ifndef SANITIZER_EARLY_SPEC
987 #define SANITIZER_EARLY_SPEC "\
988 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
989 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
990 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}}"
991 #endif
993 /* Linker command line options for -fsanitize= late on the command line. */
994 #ifndef SANITIZER_SPEC
995 #define SANITIZER_SPEC "\
996 %{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
997 %{static:%ecannot specify -static with -fsanitize=address}}\
998 %{%:sanitize(thread):" LIBTSAN_SPEC "\
999 %{static:%ecannot specify -static with -fsanitize=thread}}\
1000 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
1001 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}}"
1002 #endif
1004 #ifndef POST_LINK_SPEC
1005 #define POST_LINK_SPEC ""
1006 #endif
1008 /* This is the spec to use, once the code for creating the vtable
1009 verification runtime library, libvtv.so, has been created. Currently
1010 the vtable verification runtime functions are in libstdc++, so we use
1011 the spec just below this one. */
1012 #ifndef VTABLE_VERIFICATION_SPEC
1013 #if ENABLE_VTABLE_VERIFY
1014 #define VTABLE_VERIFICATION_SPEC "\
1015 %{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1016 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1017 #else
1018 #define VTABLE_VERIFICATION_SPEC "\
1019 %{fvtable-verify=none:} \
1020 %{fvtable-verify=std: \
1021 %e-fvtable-verify=std is not supported in this configuration} \
1022 %{fvtable-verify=preinit: \
1023 %e-fvtable-verify=preinit is not supported in this configuration}"
1024 #endif
1025 #endif
1027 /* -u* was put back because both BSD and SysV seem to support it. */
1028 /* %{static|no-pie|static-pie:} simply prevents an error message:
1029 1. If the target machine doesn't handle -static.
1030 2. If PIE isn't enabled by default.
1031 3. If the target machine doesn't handle -static-pie.
1033 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1034 scripts which exist in user specified directories, or in standard
1035 directories. */
1036 /* We pass any -flto flags on to the linker, which is expected
1037 to understand them. In practice, this means it had better be collect2. */
1038 /* %{e*} includes -export-dynamic; see comment in common.opt. */
1039 #ifndef LINK_COMMAND_SPEC
1040 #define LINK_COMMAND_SPEC "\
1041 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1042 %(linker) " \
1043 LINK_PLUGIN_SPEC \
1044 "%{flto|flto=*:%<fcompare-debug*} \
1045 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
1046 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
1047 "%X %{o*} %{e*} %{N} %{n} %{r}\
1048 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1049 %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
1050 VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
1051 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1052 %:include(libgomp.spec)%(link_gomp)}\
1053 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1054 %(mflib) " STACK_SPLIT_SPEC "\
1055 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
1056 %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1057 %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1058 #endif
1060 #ifndef LINK_LIBGCC_SPEC
1061 /* Generate -L options for startfile prefix list. */
1062 # define LINK_LIBGCC_SPEC "%D"
1063 #endif
1065 #ifndef STARTFILE_PREFIX_SPEC
1066 # define STARTFILE_PREFIX_SPEC ""
1067 #endif
1069 #ifndef SYSROOT_SPEC
1070 # define SYSROOT_SPEC "--sysroot=%R"
1071 #endif
1073 #ifndef SYSROOT_SUFFIX_SPEC
1074 # define SYSROOT_SUFFIX_SPEC ""
1075 #endif
1077 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1078 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
1079 #endif
1081 static const char *asm_debug = ASM_DEBUG_SPEC;
1082 static const char *cpp_spec = CPP_SPEC;
1083 static const char *cc1_spec = CC1_SPEC;
1084 static const char *cc1plus_spec = CC1PLUS_SPEC;
1085 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
1086 static const char *link_ssp_spec = LINK_SSP_SPEC;
1087 static const char *asm_spec = ASM_SPEC;
1088 static const char *asm_final_spec = ASM_FINAL_SPEC;
1089 static const char *link_spec = LINK_SPEC;
1090 static const char *lib_spec = LIB_SPEC;
1091 static const char *link_gomp_spec = "";
1092 static const char *libgcc_spec = LIBGCC_SPEC;
1093 static const char *endfile_spec = ENDFILE_SPEC;
1094 static const char *startfile_spec = STARTFILE_SPEC;
1095 static const char *linker_name_spec = LINKER_NAME;
1096 static const char *linker_plugin_file_spec = "";
1097 static const char *lto_wrapper_spec = "";
1098 static const char *lto_gcc_spec = "";
1099 static const char *post_link_spec = POST_LINK_SPEC;
1100 static const char *link_command_spec = LINK_COMMAND_SPEC;
1101 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
1102 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
1103 static const char *sysroot_spec = SYSROOT_SPEC;
1104 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
1105 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
1106 static const char *self_spec = "";
1108 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1109 There should be no need to override these in target dependent files,
1110 but we need to copy them to the specs file so that newer versions
1111 of the GCC driver can correctly drive older tool chains with the
1112 appropriate -B options. */
1114 /* When cpplib handles traditional preprocessing, get rid of this, and
1115 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1116 that we default the front end language better. */
1117 static const char *trad_capable_cpp =
1118 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1120 /* We don't wrap .d files in %W{} since a missing .d file, and
1121 therefore no dependency entry, confuses make into thinking a .o
1122 file that happens to exist is up-to-date. */
1123 static const char *cpp_unique_options =
1124 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1125 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1126 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1127 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1128 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1129 %{remap} %{g3|ggdb3|gstabs3|gxcoff3|gvms3:-dD}\
1130 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1131 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1132 %{E|M|MM:%W{o*}}";
1134 /* This contains cpp options which are common with cc1_options and are passed
1135 only when preprocessing only to avoid duplication. We pass the cc1 spec
1136 options to the preprocessor so that it the cc1 spec may manipulate
1137 options used to set target flags. Those special target flags settings may
1138 in turn cause preprocessor symbols to be defined specially. */
1139 static const char *cpp_options =
1140 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1141 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1142 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1143 %{undef} %{save-temps*:-fpch-preprocess}";
1145 /* This contains cpp options which are not passed when the preprocessor
1146 output will be used by another program. */
1147 static const char *cpp_debug_options = "%{d*}";
1149 /* NB: This is shared amongst all front-ends, except for Ada. */
1150 static const char *cc1_options =
1151 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1152 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1153 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
1154 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
1155 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
1156 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1157 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1158 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1159 %{-target-help:--target-help}\
1160 %{-version:--version}\
1161 %{-help=*:--help=%*}\
1162 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
1163 %{fsyntax-only:-o %j} %{-param*}\
1164 %{coverage:-fprofile-arcs -ftest-coverage}\
1165 %{fprofile-arcs|fprofile-generate*|coverage:\
1166 %{!fprofile-update=single:\
1167 %{pthread:-fprofile-update=prefer-atomic}}}";
1169 static const char *asm_options =
1170 "%{-target-help:%:print-asm-header()} "
1171 #if HAVE_GNU_AS
1172 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
1173 to the assembler equivalents. */
1174 "%{v} %{w:-W} %{I*} "
1175 #endif
1176 ASM_COMPRESS_DEBUG_SPEC
1177 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1179 static const char *invoke_as =
1180 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1181 "%{!fwpa*:\
1182 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1183 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1185 #else
1186 "%{!fwpa*:\
1187 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1188 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1190 #endif
1192 /* Some compilers have limits on line lengths, and the multilib_select
1193 and/or multilib_matches strings can be very long, so we build them at
1194 run time. */
1195 static struct obstack multilib_obstack;
1196 static const char *multilib_select;
1197 static const char *multilib_matches;
1198 static const char *multilib_defaults;
1199 static const char *multilib_exclusions;
1200 static const char *multilib_reuse;
1202 /* Check whether a particular argument is a default argument. */
1204 #ifndef MULTILIB_DEFAULTS
1205 #define MULTILIB_DEFAULTS { "" }
1206 #endif
1208 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
1210 #ifndef DRIVER_SELF_SPECS
1211 #define DRIVER_SELF_SPECS ""
1212 #endif
1214 /* Linking to libgomp implies pthreads. This is particularly important
1215 for targets that use different start files and suchlike. */
1216 #ifndef GOMP_SELF_SPECS
1217 #define GOMP_SELF_SPECS \
1218 "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1219 "-pthread}"
1220 #endif
1222 /* Likewise for -fgnu-tm. */
1223 #ifndef GTM_SELF_SPECS
1224 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1225 #endif
1227 static const char *const driver_self_specs[] = {
1228 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1229 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS
1232 #ifndef OPTION_DEFAULT_SPECS
1233 #define OPTION_DEFAULT_SPECS { "", "" }
1234 #endif
1236 struct default_spec
1238 const char *name;
1239 const char *spec;
1242 static const struct default_spec
1243 option_default_specs[] = { OPTION_DEFAULT_SPECS };
1245 struct user_specs
1247 struct user_specs *next;
1248 const char *filename;
1251 static struct user_specs *user_specs_head, *user_specs_tail;
1254 /* Record the mapping from file suffixes for compilation specs. */
1256 struct compiler
1258 const char *suffix; /* Use this compiler for input files
1259 whose names end in this suffix. */
1261 const char *spec; /* To use this compiler, run this spec. */
1263 const char *cpp_spec; /* If non-NULL, substitute this spec
1264 for `%C', rather than the usual
1265 cpp_spec. */
1266 int combinable; /* If nonzero, compiler can deal with
1267 multiple source files at once (IMA). */
1268 int needs_preprocessing; /* If nonzero, source files need to
1269 be run through a preprocessor. */
1272 /* Pointer to a vector of `struct compiler' that gives the spec for
1273 compiling a file, based on its suffix.
1274 A file that does not end in any of these suffixes will be passed
1275 unchanged to the loader and nothing else will be done to it.
1277 An entry containing two 0s is used to terminate the vector.
1279 If multiple entries match a file, the last matching one is used. */
1281 static struct compiler *compilers;
1283 /* Number of entries in `compilers', not counting the null terminator. */
1285 static int n_compilers;
1287 /* The default list of file name suffixes and their compilation specs. */
1289 static const struct compiler default_compilers[] =
1291 /* Add lists of suffixes of known languages here. If those languages
1292 were not present when we built the driver, we will hit these copies
1293 and be given a more meaningful error than "file not used since
1294 linking is not done". */
1295 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1296 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1297 {".mii", "#Objective-C++", 0, 0, 0},
1298 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1299 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1300 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1301 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1302 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1303 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1304 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1305 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1306 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1307 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1308 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1309 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1310 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1311 {".r", "#Ratfor", 0, 0, 0},
1312 {".go", "#Go", 0, 1, 0},
1313 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1314 /* Next come the entries for C. */
1315 {".c", "@c", 0, 0, 1},
1316 {"@c",
1317 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1318 external preprocessor if -save-temps is given. */
1319 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1320 %{!E:%{!M:%{!MM:\
1321 %{traditional:\
1322 %eGNU C no longer supports -traditional without -E}\
1323 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1324 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1325 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1326 %(cc1_options)}\
1327 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1328 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1329 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1330 {"-",
1331 "%{!E:%e-E or -x required when input is from standard input}\
1332 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1333 {".h", "@c-header", 0, 0, 0},
1334 {"@c-header",
1335 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1336 external preprocessor if -save-temps is given. */
1337 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1338 %{!E:%{!M:%{!MM:\
1339 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1340 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1341 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1342 %(cc1_options)\
1343 %{!fsyntax-only:%{!S:-o %g.s} \
1344 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1345 %W{o*:--output-pch=%*}}%V}}\
1346 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1347 cc1 %(cpp_unique_options) %(cc1_options)\
1348 %{!fsyntax-only:%{!S:-o %g.s} \
1349 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1350 %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
1351 {".i", "@cpp-output", 0, 0, 0},
1352 {"@cpp-output",
1353 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1354 {".s", "@assembler", 0, 0, 0},
1355 {"@assembler",
1356 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1357 {".sx", "@assembler-with-cpp", 0, 0, 0},
1358 {".S", "@assembler-with-cpp", 0, 0, 0},
1359 {"@assembler-with-cpp",
1360 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1361 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1362 %{E|M|MM:%(cpp_debug_options)}\
1363 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1364 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1365 #else
1366 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1367 %{E|M|MM:%(cpp_debug_options)}\
1368 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1369 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1370 #endif
1371 , 0, 0, 0},
1373 #include "specs.h"
1374 /* Mark end of table. */
1375 {0, 0, 0, 0, 0}
1378 /* Number of elements in default_compilers, not counting the terminator. */
1380 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1382 typedef char *char_p; /* For DEF_VEC_P. */
1384 /* A vector of options to give to the linker.
1385 These options are accumulated by %x,
1386 and substituted into the linker command with %X. */
1387 static vec<char_p> linker_options;
1389 /* A vector of options to give to the assembler.
1390 These options are accumulated by -Wa,
1391 and substituted into the assembler command with %Y. */
1392 static vec<char_p> assembler_options;
1394 /* A vector of options to give to the preprocessor.
1395 These options are accumulated by -Wp,
1396 and substituted into the preprocessor command with %Z. */
1397 static vec<char_p> preprocessor_options;
1399 static char *
1400 skip_whitespace (char *p)
1402 while (1)
1404 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1405 be considered whitespace. */
1406 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1407 return p + 1;
1408 else if (*p == '\n' || *p == ' ' || *p == '\t')
1409 p++;
1410 else if (*p == '#')
1412 while (*p != '\n')
1413 p++;
1414 p++;
1416 else
1417 break;
1420 return p;
1422 /* Structures to keep track of prefixes to try when looking for files. */
1424 struct prefix_list
1426 const char *prefix; /* String to prepend to the path. */
1427 struct prefix_list *next; /* Next in linked list. */
1428 int require_machine_suffix; /* Don't use without machine_suffix. */
1429 /* 2 means try both machine_suffix and just_machine_suffix. */
1430 int priority; /* Sort key - priority within list. */
1431 int os_multilib; /* 1 if OS multilib scheme should be used,
1432 0 for GCC multilib scheme. */
1435 struct path_prefix
1437 struct prefix_list *plist; /* List of prefixes to try */
1438 int max_len; /* Max length of a prefix in PLIST */
1439 const char *name; /* Name of this list (used in config stuff) */
1442 /* List of prefixes to try when looking for executables. */
1444 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1446 /* List of prefixes to try when looking for startup (crt0) files. */
1448 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1450 /* List of prefixes to try when looking for include files. */
1452 static struct path_prefix include_prefixes = { 0, 0, "include" };
1454 /* Suffix to attach to directories searched for commands.
1455 This looks like `MACHINE/VERSION/'. */
1457 static const char *machine_suffix = 0;
1459 /* Suffix to attach to directories searched for commands.
1460 This is just `MACHINE/'. */
1462 static const char *just_machine_suffix = 0;
1464 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1466 static const char *gcc_exec_prefix;
1468 /* Adjusted value of standard_libexec_prefix. */
1470 static const char *gcc_libexec_prefix;
1472 /* Default prefixes to attach to command names. */
1474 #ifndef STANDARD_STARTFILE_PREFIX_1
1475 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1476 #endif
1477 #ifndef STANDARD_STARTFILE_PREFIX_2
1478 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1479 #endif
1481 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1482 #undef MD_EXEC_PREFIX
1483 #undef MD_STARTFILE_PREFIX
1484 #undef MD_STARTFILE_PREFIX_1
1485 #endif
1487 /* If no prefixes defined, use the null string, which will disable them. */
1488 #ifndef MD_EXEC_PREFIX
1489 #define MD_EXEC_PREFIX ""
1490 #endif
1491 #ifndef MD_STARTFILE_PREFIX
1492 #define MD_STARTFILE_PREFIX ""
1493 #endif
1494 #ifndef MD_STARTFILE_PREFIX_1
1495 #define MD_STARTFILE_PREFIX_1 ""
1496 #endif
1498 /* These directories are locations set at configure-time based on the
1499 --prefix option provided to configure. Their initializers are
1500 defined in Makefile.in. These paths are not *directly* used when
1501 gcc_exec_prefix is set because, in that case, we know where the
1502 compiler has been installed, and use paths relative to that
1503 location instead. */
1504 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1505 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1506 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1507 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1509 /* For native compilers, these are well-known paths containing
1510 components that may be provided by the system. For cross
1511 compilers, these paths are not used. */
1512 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1513 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1514 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1515 static const char *const standard_startfile_prefix_1
1516 = STANDARD_STARTFILE_PREFIX_1;
1517 static const char *const standard_startfile_prefix_2
1518 = STANDARD_STARTFILE_PREFIX_2;
1520 /* A relative path to be used in finding the location of tools
1521 relative to the driver. */
1522 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1524 /* A prefix to be used when this is an accelerator compiler. */
1525 static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
1527 /* Subdirectory to use for locating libraries. Set by
1528 set_multilib_dir based on the compilation options. */
1530 static const char *multilib_dir;
1532 /* Subdirectory to use for locating libraries in OS conventions. Set by
1533 set_multilib_dir based on the compilation options. */
1535 static const char *multilib_os_dir;
1537 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1538 set_multilib_dir based on the compilation options. */
1540 static const char *multiarch_dir;
1542 /* Structure to keep track of the specs that have been defined so far.
1543 These are accessed using %(specname) in a compiler or link
1544 spec. */
1546 struct spec_list
1548 /* The following 2 fields must be first */
1549 /* to allow EXTRA_SPECS to be initialized */
1550 const char *name; /* name of the spec. */
1551 const char *ptr; /* available ptr if no static pointer */
1553 /* The following fields are not initialized */
1554 /* by EXTRA_SPECS */
1555 const char **ptr_spec; /* pointer to the spec itself. */
1556 struct spec_list *next; /* Next spec in linked list. */
1557 int name_len; /* length of the name */
1558 bool user_p; /* whether string come from file spec. */
1559 bool alloc_p; /* whether string was allocated */
1560 const char *default_ptr; /* The default value of *ptr_spec. */
1563 #define INIT_STATIC_SPEC(NAME,PTR) \
1564 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1565 *PTR }
1567 /* List of statically defined specs. */
1568 static struct spec_list static_specs[] =
1570 INIT_STATIC_SPEC ("asm", &asm_spec),
1571 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1572 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1573 INIT_STATIC_SPEC ("asm_options", &asm_options),
1574 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1575 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1576 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1577 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1578 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1579 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1580 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1581 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1582 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1583 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1584 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1585 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1586 INIT_STATIC_SPEC ("link", &link_spec),
1587 INIT_STATIC_SPEC ("lib", &lib_spec),
1588 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1589 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1590 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1591 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1592 INIT_STATIC_SPEC ("version", &compiler_version),
1593 INIT_STATIC_SPEC ("multilib", &multilib_select),
1594 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1595 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1596 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1597 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1598 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1599 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
1600 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1601 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1602 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1603 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1604 INIT_STATIC_SPEC ("post_link", &post_link_spec),
1605 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1606 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1607 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1608 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1609 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1610 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1611 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1612 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1613 INIT_STATIC_SPEC ("self_spec", &self_spec),
1616 #ifdef EXTRA_SPECS /* additional specs needed */
1617 /* Structure to keep track of just the first two args of a spec_list.
1618 That is all that the EXTRA_SPECS macro gives us. */
1619 struct spec_list_1
1621 const char *const name;
1622 const char *const ptr;
1625 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1626 static struct spec_list *extra_specs = (struct spec_list *) 0;
1627 #endif
1629 /* List of dynamically allocates specs that have been defined so far. */
1631 static struct spec_list *specs = (struct spec_list *) 0;
1633 /* List of static spec functions. */
1635 static const struct spec_function static_spec_functions[] =
1637 { "getenv", getenv_spec_function },
1638 { "if-exists", if_exists_spec_function },
1639 { "if-exists-else", if_exists_else_spec_function },
1640 { "sanitize", sanitize_spec_function },
1641 { "replace-outfile", replace_outfile_spec_function },
1642 { "remove-outfile", remove_outfile_spec_function },
1643 { "version-compare", version_compare_spec_function },
1644 { "include", include_spec_function },
1645 { "find-file", find_file_spec_function },
1646 { "find-plugindir", find_plugindir_spec_function },
1647 { "print-asm-header", print_asm_header_spec_function },
1648 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1649 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1650 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1651 { "pass-through-libs", pass_through_libs_spec_func },
1652 { "replace-extension", replace_extension_spec_func },
1653 { "gt", greater_than_spec_func },
1654 { "debug-level-gt", debug_level_greater_than_spec_func },
1655 { "fortran-preinclude-file", find_fortran_preinclude_file},
1656 #ifdef EXTRA_SPEC_FUNCTIONS
1657 EXTRA_SPEC_FUNCTIONS
1658 #endif
1659 { 0, 0 }
1662 static int processing_spec_function;
1664 /* Add appropriate libgcc specs to OBSTACK, taking into account
1665 various permutations of -shared-libgcc, -shared, and such. */
1667 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1669 #ifndef USE_LD_AS_NEEDED
1670 #define USE_LD_AS_NEEDED 0
1671 #endif
1673 static void
1674 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1675 const char *static_name, const char *eh_name)
1677 char *buf;
1679 #if USE_LD_AS_NEEDED
1680 buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
1681 "%{!static:%{!static-libgcc:%{!static-pie:"
1682 "%{!shared-libgcc:",
1683 static_name, " " LD_AS_NEEDED_OPTION " ",
1684 shared_name, " " LD_NO_AS_NEEDED_OPTION
1686 "%{shared-libgcc:",
1687 shared_name, "%{!shared: ", static_name, "}"
1688 "}}"
1689 #else
1690 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1691 "%{!static:%{!static-libgcc:"
1692 "%{!shared:"
1693 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1694 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1696 #ifdef LINK_EH_SPEC
1697 "%{shared:"
1698 "%{shared-libgcc:", shared_name, "}"
1699 "%{!shared-libgcc:", static_name, "}"
1701 #else
1702 "%{shared:", shared_name, "}"
1703 #endif
1704 #endif
1705 "}}", NULL);
1707 obstack_grow (obstack, buf, strlen (buf));
1708 free (buf);
1710 #endif /* ENABLE_SHARED_LIBGCC */
1712 /* Initialize the specs lookup routines. */
1714 static void
1715 init_spec (void)
1717 struct spec_list *next = (struct spec_list *) 0;
1718 struct spec_list *sl = (struct spec_list *) 0;
1719 int i;
1721 if (specs)
1722 return; /* Already initialized. */
1724 if (verbose_flag)
1725 fnotice (stderr, "Using built-in specs.\n");
1727 #ifdef EXTRA_SPECS
1728 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1730 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1732 sl = &extra_specs[i];
1733 sl->name = extra_specs_1[i].name;
1734 sl->ptr = extra_specs_1[i].ptr;
1735 sl->next = next;
1736 sl->name_len = strlen (sl->name);
1737 sl->ptr_spec = &sl->ptr;
1738 gcc_assert (sl->ptr_spec != NULL);
1739 sl->default_ptr = sl->ptr;
1740 next = sl;
1742 #endif
1744 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1746 sl = &static_specs[i];
1747 sl->next = next;
1748 next = sl;
1751 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1752 /* ??? If neither -shared-libgcc nor --static-libgcc was
1753 seen, then we should be making an educated guess. Some proposed
1754 heuristics for ELF include:
1756 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1757 program will be doing dynamic loading, which will likely
1758 need the shared libgcc.
1760 (2) If "-ldl", then it's also a fair bet that we're doing
1761 dynamic loading.
1763 (3) For each ET_DYN we're linking against (either through -lfoo
1764 or /some/path/foo.so), check to see whether it or one of
1765 its dependencies depends on a shared libgcc.
1767 (4) If "-shared"
1769 If the runtime is fixed to look for program headers instead
1770 of calling __register_frame_info at all, for each object,
1771 use the shared libgcc if any EH symbol referenced.
1773 If crtstuff is fixed to not invoke __register_frame_info
1774 automatically, for each object, use the shared libgcc if
1775 any non-empty unwind section found.
1777 Doing any of this probably requires invoking an external program to
1778 do the actual object file scanning. */
1780 const char *p = libgcc_spec;
1781 int in_sep = 1;
1783 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1784 when given the proper command line arguments. */
1785 while (*p)
1787 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1789 init_gcc_specs (&obstack,
1790 "-lgcc_s"
1791 #ifdef USE_LIBUNWIND_EXCEPTIONS
1792 " -lunwind"
1793 #endif
1795 "-lgcc",
1796 "-lgcc_eh"
1797 #ifdef USE_LIBUNWIND_EXCEPTIONS
1798 # ifdef HAVE_LD_STATIC_DYNAMIC
1799 " %{!static:%{!static-pie:" LD_STATIC_OPTION "}} -lunwind"
1800 " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION "}}"
1801 # else
1802 " -lunwind"
1803 # endif
1804 #endif
1807 p += 5;
1808 in_sep = 0;
1810 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1812 /* Ug. We don't know shared library extensions. Hope that
1813 systems that use this form don't do shared libraries. */
1814 init_gcc_specs (&obstack,
1815 "-lgcc_s",
1816 "libgcc.a%s",
1817 "libgcc_eh.a%s"
1818 #ifdef USE_LIBUNWIND_EXCEPTIONS
1819 " -lunwind"
1820 #endif
1822 p += 10;
1823 in_sep = 0;
1825 else
1827 obstack_1grow (&obstack, *p);
1828 in_sep = (*p == ' ');
1829 p += 1;
1833 obstack_1grow (&obstack, '\0');
1834 libgcc_spec = XOBFINISH (&obstack, const char *);
1836 #endif
1837 #ifdef USE_AS_TRADITIONAL_FORMAT
1838 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1840 static const char tf[] = "--traditional-format ";
1841 obstack_grow (&obstack, tf, sizeof (tf) - 1);
1842 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1843 asm_spec = XOBFINISH (&obstack, const char *);
1845 #endif
1847 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1848 defined LINKER_HASH_STYLE
1849 # ifdef LINK_BUILDID_SPEC
1850 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1851 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
1852 # endif
1853 # ifdef LINK_EH_SPEC
1854 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1855 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
1856 # endif
1857 # ifdef LINKER_HASH_STYLE
1858 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1859 before. */
1861 static const char hash_style[] = "--hash-style=";
1862 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1863 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
1864 obstack_1grow (&obstack, ' ');
1866 # endif
1867 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1868 link_spec = XOBFINISH (&obstack, const char *);
1869 #endif
1871 specs = sl;
1874 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1875 removed; If the spec starts with a + then SPEC is added to the end of the
1876 current spec. */
1878 static void
1879 set_spec (const char *name, const char *spec, bool user_p)
1881 struct spec_list *sl;
1882 const char *old_spec;
1883 int name_len = strlen (name);
1884 int i;
1886 /* If this is the first call, initialize the statically allocated specs. */
1887 if (!specs)
1889 struct spec_list *next = (struct spec_list *) 0;
1890 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1892 sl = &static_specs[i];
1893 sl->next = next;
1894 next = sl;
1896 specs = sl;
1899 /* See if the spec already exists. */
1900 for (sl = specs; sl; sl = sl->next)
1901 if (name_len == sl->name_len && !strcmp (sl->name, name))
1902 break;
1904 if (!sl)
1906 /* Not found - make it. */
1907 sl = XNEW (struct spec_list);
1908 sl->name = xstrdup (name);
1909 sl->name_len = name_len;
1910 sl->ptr_spec = &sl->ptr;
1911 sl->alloc_p = 0;
1912 *(sl->ptr_spec) = "";
1913 sl->next = specs;
1914 sl->default_ptr = NULL;
1915 specs = sl;
1918 old_spec = *(sl->ptr_spec);
1919 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1920 ? concat (old_spec, spec + 1, NULL)
1921 : xstrdup (spec));
1923 #ifdef DEBUG_SPECS
1924 if (verbose_flag)
1925 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1926 #endif
1928 /* Free the old spec. */
1929 if (old_spec && sl->alloc_p)
1930 free (CONST_CAST (char *, old_spec));
1932 sl->user_p = user_p;
1933 sl->alloc_p = true;
1936 /* Accumulate a command (program name and args), and run it. */
1938 typedef const char *const_char_p; /* For DEF_VEC_P. */
1940 /* Vector of pointers to arguments in the current line of specifications. */
1941 static vec<const_char_p> argbuf;
1943 /* Likewise, but for the current @file. */
1944 static vec<const_char_p> at_file_argbuf;
1946 /* Whether an @file is currently open. */
1947 static bool in_at_file = false;
1949 /* Were the options -c, -S or -E passed. */
1950 static int have_c = 0;
1952 /* Was the option -o passed. */
1953 static int have_o = 0;
1955 /* Was the option -E passed. */
1956 static int have_E = 0;
1958 /* Pointer to output file name passed in with -o. */
1959 static const char *output_file = 0;
1961 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1962 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1963 it here. */
1965 static struct temp_name {
1966 const char *suffix; /* suffix associated with the code. */
1967 int length; /* strlen (suffix). */
1968 int unique; /* Indicates whether %g or %u/%U was used. */
1969 const char *filename; /* associated filename. */
1970 int filename_length; /* strlen (filename). */
1971 struct temp_name *next;
1972 } *temp_names;
1974 /* Number of commands executed so far. */
1976 static int execution_count;
1978 /* Number of commands that exited with a signal. */
1980 static int signal_count;
1982 /* Allocate the argument vector. */
1984 static void
1985 alloc_args (void)
1987 argbuf.create (10);
1988 at_file_argbuf.create (10);
1991 /* Clear out the vector of arguments (after a command is executed). */
1993 static void
1994 clear_args (void)
1996 argbuf.truncate (0);
1997 at_file_argbuf.truncate (0);
2000 /* Add one argument to the vector at the end.
2001 This is done when a space is seen or at the end of the line.
2002 If DELETE_ALWAYS is nonzero, the arg is a filename
2003 and the file should be deleted eventually.
2004 If DELETE_FAILURE is nonzero, the arg is a filename
2005 and the file should be deleted if this compilation fails. */
2007 static void
2008 store_arg (const char *arg, int delete_always, int delete_failure)
2010 if (in_at_file)
2011 at_file_argbuf.safe_push (arg);
2012 else
2013 argbuf.safe_push (arg);
2015 if (delete_always || delete_failure)
2017 const char *p;
2018 /* If the temporary file we should delete is specified as
2019 part of a joined argument extract the filename. */
2020 if (arg[0] == '-'
2021 && (p = strrchr (arg, '=')))
2022 arg = p + 1;
2023 record_temp_file (arg, delete_always, delete_failure);
2027 /* Open a temporary @file into which subsequent arguments will be stored. */
2029 static void
2030 open_at_file (void)
2032 if (in_at_file)
2033 fatal_error (input_location, "cannot open nested response file");
2034 else
2035 in_at_file = true;
2038 /* Close the temporary @file and add @file to the argument list. */
2040 static void
2041 close_at_file (void)
2043 if (!in_at_file)
2044 fatal_error (input_location, "cannot close nonexistent response file");
2046 in_at_file = false;
2048 const unsigned int n_args = at_file_argbuf.length ();
2049 if (n_args == 0)
2050 return;
2052 char **argv = (char **) alloca (sizeof (char *) * (n_args + 1));
2053 char *temp_file = make_temp_file ("");
2054 char *at_argument = concat ("@", temp_file, NULL);
2055 FILE *f = fopen (temp_file, "w");
2056 int status;
2057 unsigned int i;
2059 /* Copy the strings over. */
2060 for (i = 0; i < n_args; i++)
2061 argv[i] = CONST_CAST (char *, at_file_argbuf[i]);
2062 argv[i] = NULL;
2064 at_file_argbuf.truncate (0);
2066 if (f == NULL)
2067 fatal_error (input_location, "could not open temporary response file %s",
2068 temp_file);
2070 status = writeargv (argv, f);
2072 if (status)
2073 fatal_error (input_location,
2074 "could not write to temporary response file %s",
2075 temp_file);
2077 status = fclose (f);
2079 if (status == EOF)
2080 fatal_error (input_location, "could not close temporary response file %s",
2081 temp_file);
2083 store_arg (at_argument, 0, 0);
2085 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
2088 /* Load specs from a file name named FILENAME, replacing occurrences of
2089 various different types of line-endings, \r\n, \n\r and just \r, with
2090 a single \n. */
2092 static char *
2093 load_specs (const char *filename)
2095 int desc;
2096 int readlen;
2097 struct stat statbuf;
2098 char *buffer;
2099 char *buffer_p;
2100 char *specs;
2101 char *specs_p;
2103 if (verbose_flag)
2104 fnotice (stderr, "Reading specs from %s\n", filename);
2106 /* Open and stat the file. */
2107 desc = open (filename, O_RDONLY, 0);
2108 if (desc < 0)
2110 failed:
2111 /* This leaves DESC open, but the OS will save us. */
2112 fatal_error (input_location, "cannot read spec file %qs: %m", filename);
2115 if (stat (filename, &statbuf) < 0)
2116 goto failed;
2118 /* Read contents of file into BUFFER. */
2119 buffer = XNEWVEC (char, statbuf.st_size + 1);
2120 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2121 if (readlen < 0)
2122 goto failed;
2123 buffer[readlen] = 0;
2124 close (desc);
2126 specs = XNEWVEC (char, readlen + 1);
2127 specs_p = specs;
2128 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2130 int skip = 0;
2131 char c = *buffer_p;
2132 if (c == '\r')
2134 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2135 skip = 1;
2136 else if (*(buffer_p + 1) == '\n') /* \r\n */
2137 skip = 1;
2138 else /* \r */
2139 c = '\n';
2141 if (! skip)
2142 *specs_p++ = c;
2144 *specs_p = '\0';
2146 free (buffer);
2147 return (specs);
2150 /* Read compilation specs from a file named FILENAME,
2151 replacing the default ones.
2153 A suffix which starts with `*' is a definition for
2154 one of the machine-specific sub-specs. The "suffix" should be
2155 *asm, *cc1, *cpp, *link, *startfile, etc.
2156 The corresponding spec is stored in asm_spec, etc.,
2157 rather than in the `compilers' vector.
2159 Anything invalid in the file is a fatal error. */
2161 static void
2162 read_specs (const char *filename, bool main_p, bool user_p)
2164 char *buffer;
2165 char *p;
2167 buffer = load_specs (filename);
2169 /* Scan BUFFER for specs, putting them in the vector. */
2170 p = buffer;
2171 while (1)
2173 char *suffix;
2174 char *spec;
2175 char *in, *out, *p1, *p2, *p3;
2177 /* Advance P in BUFFER to the next nonblank nocomment line. */
2178 p = skip_whitespace (p);
2179 if (*p == 0)
2180 break;
2182 /* Is this a special command that starts with '%'? */
2183 /* Don't allow this for the main specs file, since it would
2184 encourage people to overwrite it. */
2185 if (*p == '%' && !main_p)
2187 p1 = p;
2188 while (*p && *p != '\n')
2189 p++;
2191 /* Skip '\n'. */
2192 p++;
2194 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2195 && (p1[sizeof "%include" - 1] == ' '
2196 || p1[sizeof "%include" - 1] == '\t'))
2198 char *new_filename;
2200 p1 += sizeof ("%include");
2201 while (*p1 == ' ' || *p1 == '\t')
2202 p1++;
2204 if (*p1++ != '<' || p[-2] != '>')
2205 fatal_error (input_location,
2206 "specs %%include syntax malformed after "
2207 "%ld characters",
2208 (long) (p1 - buffer + 1));
2210 p[-2] = '\0';
2211 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2212 read_specs (new_filename ? new_filename : p1, false, user_p);
2213 continue;
2215 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2216 && (p1[sizeof "%include_noerr" - 1] == ' '
2217 || p1[sizeof "%include_noerr" - 1] == '\t'))
2219 char *new_filename;
2221 p1 += sizeof "%include_noerr";
2222 while (*p1 == ' ' || *p1 == '\t')
2223 p1++;
2225 if (*p1++ != '<' || p[-2] != '>')
2226 fatal_error (input_location,
2227 "specs %%include syntax malformed after "
2228 "%ld characters",
2229 (long) (p1 - buffer + 1));
2231 p[-2] = '\0';
2232 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2233 if (new_filename)
2234 read_specs (new_filename, false, user_p);
2235 else if (verbose_flag)
2236 fnotice (stderr, "could not find specs file %s\n", p1);
2237 continue;
2239 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2240 && (p1[sizeof "%rename" - 1] == ' '
2241 || p1[sizeof "%rename" - 1] == '\t'))
2243 int name_len;
2244 struct spec_list *sl;
2245 struct spec_list *newsl;
2247 /* Get original name. */
2248 p1 += sizeof "%rename";
2249 while (*p1 == ' ' || *p1 == '\t')
2250 p1++;
2252 if (! ISALPHA ((unsigned char) *p1))
2253 fatal_error (input_location,
2254 "specs %%rename syntax malformed after "
2255 "%ld characters",
2256 (long) (p1 - buffer));
2258 p2 = p1;
2259 while (*p2 && !ISSPACE ((unsigned char) *p2))
2260 p2++;
2262 if (*p2 != ' ' && *p2 != '\t')
2263 fatal_error (input_location,
2264 "specs %%rename syntax malformed after "
2265 "%ld characters",
2266 (long) (p2 - buffer));
2268 name_len = p2 - p1;
2269 *p2++ = '\0';
2270 while (*p2 == ' ' || *p2 == '\t')
2271 p2++;
2273 if (! ISALPHA ((unsigned char) *p2))
2274 fatal_error (input_location,
2275 "specs %%rename syntax malformed after "
2276 "%ld characters",
2277 (long) (p2 - buffer));
2279 /* Get new spec name. */
2280 p3 = p2;
2281 while (*p3 && !ISSPACE ((unsigned char) *p3))
2282 p3++;
2284 if (p3 != p - 1)
2285 fatal_error (input_location,
2286 "specs %%rename syntax malformed after "
2287 "%ld characters",
2288 (long) (p3 - buffer));
2289 *p3 = '\0';
2291 for (sl = specs; sl; sl = sl->next)
2292 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2293 break;
2295 if (!sl)
2296 fatal_error (input_location,
2297 "specs %s spec was not found to be renamed", p1);
2299 if (strcmp (p1, p2) == 0)
2300 continue;
2302 for (newsl = specs; newsl; newsl = newsl->next)
2303 if (strcmp (newsl->name, p2) == 0)
2304 fatal_error (input_location,
2305 "%s: attempt to rename spec %qs to "
2306 "already defined spec %qs",
2307 filename, p1, p2);
2309 if (verbose_flag)
2311 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
2312 #ifdef DEBUG_SPECS
2313 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2314 #endif
2317 set_spec (p2, *(sl->ptr_spec), user_p);
2318 if (sl->alloc_p)
2319 free (CONST_CAST (char *, *(sl->ptr_spec)));
2321 *(sl->ptr_spec) = "";
2322 sl->alloc_p = 0;
2323 continue;
2325 else
2326 fatal_error (input_location,
2327 "specs unknown %% command after %ld characters",
2328 (long) (p1 - buffer));
2331 /* Find the colon that should end the suffix. */
2332 p1 = p;
2333 while (*p1 && *p1 != ':' && *p1 != '\n')
2334 p1++;
2336 /* The colon shouldn't be missing. */
2337 if (*p1 != ':')
2338 fatal_error (input_location,
2339 "specs file malformed after %ld characters",
2340 (long) (p1 - buffer));
2342 /* Skip back over trailing whitespace. */
2343 p2 = p1;
2344 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2345 p2--;
2347 /* Copy the suffix to a string. */
2348 suffix = save_string (p, p2 - p);
2349 /* Find the next line. */
2350 p = skip_whitespace (p1 + 1);
2351 if (p[1] == 0)
2352 fatal_error (input_location,
2353 "specs file malformed after %ld characters",
2354 (long) (p - buffer));
2356 p1 = p;
2357 /* Find next blank line or end of string. */
2358 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2359 p1++;
2361 /* Specs end at the blank line and do not include the newline. */
2362 spec = save_string (p, p1 - p);
2363 p = p1;
2365 /* Delete backslash-newline sequences from the spec. */
2366 in = spec;
2367 out = spec;
2368 while (*in != 0)
2370 if (in[0] == '\\' && in[1] == '\n')
2371 in += 2;
2372 else if (in[0] == '#')
2373 while (*in && *in != '\n')
2374 in++;
2376 else
2377 *out++ = *in++;
2379 *out = 0;
2381 if (suffix[0] == '*')
2383 if (! strcmp (suffix, "*link_command"))
2384 link_command_spec = spec;
2385 else
2387 set_spec (suffix + 1, spec, user_p);
2388 free (spec);
2391 else
2393 /* Add this pair to the vector. */
2394 compilers
2395 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2397 compilers[n_compilers].suffix = suffix;
2398 compilers[n_compilers].spec = spec;
2399 n_compilers++;
2400 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2403 if (*suffix == 0)
2404 link_command_spec = spec;
2407 if (link_command_spec == 0)
2408 fatal_error (input_location, "spec file has no spec for linking");
2410 XDELETEVEC (buffer);
2413 /* Record the names of temporary files we tell compilers to write,
2414 and delete them at the end of the run. */
2416 /* This is the common prefix we use to make temp file names.
2417 It is chosen once for each run of this program.
2418 It is substituted into a spec by %g or %j.
2419 Thus, all temp file names contain this prefix.
2420 In practice, all temp file names start with this prefix.
2422 This prefix comes from the envvar TMPDIR if it is defined;
2423 otherwise, from the P_tmpdir macro if that is defined;
2424 otherwise, in /usr/tmp or /tmp;
2425 or finally the current directory if all else fails. */
2427 static const char *temp_filename;
2429 /* Length of the prefix. */
2431 static int temp_filename_length;
2433 /* Define the list of temporary files to delete. */
2435 struct temp_file
2437 const char *name;
2438 struct temp_file *next;
2441 /* Queue of files to delete on success or failure of compilation. */
2442 static struct temp_file *always_delete_queue;
2443 /* Queue of files to delete on failure of compilation. */
2444 static struct temp_file *failure_delete_queue;
2446 /* Record FILENAME as a file to be deleted automatically.
2447 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2448 otherwise delete it in any case.
2449 FAIL_DELETE nonzero means delete it if a compilation step fails;
2450 otherwise delete it in any case. */
2452 void
2453 record_temp_file (const char *filename, int always_delete, int fail_delete)
2455 char *const name = xstrdup (filename);
2457 if (always_delete)
2459 struct temp_file *temp;
2460 for (temp = always_delete_queue; temp; temp = temp->next)
2461 if (! filename_cmp (name, temp->name))
2463 free (name);
2464 goto already1;
2467 temp = XNEW (struct temp_file);
2468 temp->next = always_delete_queue;
2469 temp->name = name;
2470 always_delete_queue = temp;
2472 already1:;
2475 if (fail_delete)
2477 struct temp_file *temp;
2478 for (temp = failure_delete_queue; temp; temp = temp->next)
2479 if (! filename_cmp (name, temp->name))
2481 free (name);
2482 goto already2;
2485 temp = XNEW (struct temp_file);
2486 temp->next = failure_delete_queue;
2487 temp->name = name;
2488 failure_delete_queue = temp;
2490 already2:;
2494 /* Delete all the temporary files whose names we previously recorded. */
2496 #ifndef DELETE_IF_ORDINARY
2497 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2498 do \
2500 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2501 if (unlink (NAME) < 0) \
2502 if (VERBOSE_FLAG) \
2503 error ("%s: %m", (NAME)); \
2504 } while (0)
2505 #endif
2507 static void
2508 delete_if_ordinary (const char *name)
2510 struct stat st;
2511 #ifdef DEBUG
2512 int i, c;
2514 printf ("Delete %s? (y or n) ", name);
2515 fflush (stdout);
2516 i = getchar ();
2517 if (i != '\n')
2518 while ((c = getchar ()) != '\n' && c != EOF)
2521 if (i == 'y' || i == 'Y')
2522 #endif /* DEBUG */
2523 DELETE_IF_ORDINARY (name, st, verbose_flag);
2526 static void
2527 delete_temp_files (void)
2529 struct temp_file *temp;
2531 for (temp = always_delete_queue; temp; temp = temp->next)
2532 delete_if_ordinary (temp->name);
2533 always_delete_queue = 0;
2536 /* Delete all the files to be deleted on error. */
2538 static void
2539 delete_failure_queue (void)
2541 struct temp_file *temp;
2543 for (temp = failure_delete_queue; temp; temp = temp->next)
2544 delete_if_ordinary (temp->name);
2547 static void
2548 clear_failure_queue (void)
2550 failure_delete_queue = 0;
2553 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2554 returns non-NULL.
2555 If DO_MULTI is true iterate over the paths twice, first with multilib
2556 suffix then without, otherwise iterate over the paths once without
2557 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2558 to avoid visiting the same path twice, but we could do better. For
2559 instance, /usr/lib/../lib is considered different from /usr/lib.
2560 At least EXTRA_SPACE chars past the end of the path passed to
2561 CALLBACK are available for use by the callback.
2562 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2564 Returns the value returned by CALLBACK. */
2566 static void *
2567 for_each_path (const struct path_prefix *paths,
2568 bool do_multi,
2569 size_t extra_space,
2570 void *(*callback) (char *, void *),
2571 void *callback_info)
2573 struct prefix_list *pl;
2574 const char *multi_dir = NULL;
2575 const char *multi_os_dir = NULL;
2576 const char *multiarch_suffix = NULL;
2577 const char *multi_suffix;
2578 const char *just_multi_suffix;
2579 char *path = NULL;
2580 void *ret = NULL;
2581 bool skip_multi_dir = false;
2582 bool skip_multi_os_dir = false;
2584 multi_suffix = machine_suffix;
2585 just_multi_suffix = just_machine_suffix;
2586 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2588 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2589 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2590 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2592 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2593 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2594 if (multiarch_dir)
2595 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
2597 while (1)
2599 size_t multi_dir_len = 0;
2600 size_t multi_os_dir_len = 0;
2601 size_t multiarch_len = 0;
2602 size_t suffix_len;
2603 size_t just_suffix_len;
2604 size_t len;
2606 if (multi_dir)
2607 multi_dir_len = strlen (multi_dir);
2608 if (multi_os_dir)
2609 multi_os_dir_len = strlen (multi_os_dir);
2610 if (multiarch_suffix)
2611 multiarch_len = strlen (multiarch_suffix);
2612 suffix_len = strlen (multi_suffix);
2613 just_suffix_len = strlen (just_multi_suffix);
2615 if (path == NULL)
2617 len = paths->max_len + extra_space + 1;
2618 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
2619 path = XNEWVEC (char, len);
2622 for (pl = paths->plist; pl != 0; pl = pl->next)
2624 len = strlen (pl->prefix);
2625 memcpy (path, pl->prefix, len);
2627 /* Look first in MACHINE/VERSION subdirectory. */
2628 if (!skip_multi_dir)
2630 memcpy (path + len, multi_suffix, suffix_len + 1);
2631 ret = callback (path, callback_info);
2632 if (ret)
2633 break;
2636 /* Some paths are tried with just the machine (ie. target)
2637 subdir. This is used for finding as, ld, etc. */
2638 if (!skip_multi_dir
2639 && pl->require_machine_suffix == 2)
2641 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2642 ret = callback (path, callback_info);
2643 if (ret)
2644 break;
2647 /* Now try the multiarch path. */
2648 if (!skip_multi_dir
2649 && !pl->require_machine_suffix && multiarch_dir)
2651 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2652 ret = callback (path, callback_info);
2653 if (ret)
2654 break;
2657 /* Now try the base path. */
2658 if (!pl->require_machine_suffix
2659 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2661 const char *this_multi;
2662 size_t this_multi_len;
2664 if (pl->os_multilib)
2666 this_multi = multi_os_dir;
2667 this_multi_len = multi_os_dir_len;
2669 else
2671 this_multi = multi_dir;
2672 this_multi_len = multi_dir_len;
2675 if (this_multi_len)
2676 memcpy (path + len, this_multi, this_multi_len + 1);
2677 else
2678 path[len] = '\0';
2680 ret = callback (path, callback_info);
2681 if (ret)
2682 break;
2685 if (pl)
2686 break;
2688 if (multi_dir == NULL && multi_os_dir == NULL)
2689 break;
2691 /* Run through the paths again, this time without multilibs.
2692 Don't repeat any we have already seen. */
2693 if (multi_dir)
2695 free (CONST_CAST (char *, multi_dir));
2696 multi_dir = NULL;
2697 free (CONST_CAST (char *, multi_suffix));
2698 multi_suffix = machine_suffix;
2699 free (CONST_CAST (char *, just_multi_suffix));
2700 just_multi_suffix = just_machine_suffix;
2702 else
2703 skip_multi_dir = true;
2704 if (multi_os_dir)
2706 free (CONST_CAST (char *, multi_os_dir));
2707 multi_os_dir = NULL;
2709 else
2710 skip_multi_os_dir = true;
2713 if (multi_dir)
2715 free (CONST_CAST (char *, multi_dir));
2716 free (CONST_CAST (char *, multi_suffix));
2717 free (CONST_CAST (char *, just_multi_suffix));
2719 if (multi_os_dir)
2720 free (CONST_CAST (char *, multi_os_dir));
2721 if (ret != path)
2722 free (path);
2723 return ret;
2726 /* Callback for build_search_list. Adds path to obstack being built. */
2728 struct add_to_obstack_info {
2729 struct obstack *ob;
2730 bool check_dir;
2731 bool first_time;
2734 static void *
2735 add_to_obstack (char *path, void *data)
2737 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2739 if (info->check_dir && !is_directory (path, false))
2740 return NULL;
2742 if (!info->first_time)
2743 obstack_1grow (info->ob, PATH_SEPARATOR);
2745 obstack_grow (info->ob, path, strlen (path));
2747 info->first_time = false;
2748 return NULL;
2751 /* Add or change the value of an environment variable, outputting the
2752 change to standard error if in verbose mode. */
2753 static void
2754 xputenv (const char *string)
2756 env.xput (string);
2759 /* Build a list of search directories from PATHS.
2760 PREFIX is a string to prepend to the list.
2761 If CHECK_DIR_P is true we ensure the directory exists.
2762 If DO_MULTI is true, multilib paths are output first, then
2763 non-multilib paths.
2764 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2765 It is also used by the --print-search-dirs flag. */
2767 static char *
2768 build_search_list (const struct path_prefix *paths, const char *prefix,
2769 bool check_dir, bool do_multi)
2771 struct add_to_obstack_info info;
2773 info.ob = &collect_obstack;
2774 info.check_dir = check_dir;
2775 info.first_time = true;
2777 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2778 obstack_1grow (&collect_obstack, '=');
2780 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2782 obstack_1grow (&collect_obstack, '\0');
2783 return XOBFINISH (&collect_obstack, char *);
2786 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2787 for collect. */
2789 static void
2790 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2791 bool do_multi)
2793 xputenv (build_search_list (paths, env_var, true, do_multi));
2796 /* Check whether NAME can be accessed in MODE. This is like access,
2797 except that it never considers directories to be executable. */
2799 static int
2800 access_check (const char *name, int mode)
2802 if (mode == X_OK)
2804 struct stat st;
2806 if (stat (name, &st) < 0
2807 || S_ISDIR (st.st_mode))
2808 return -1;
2811 return access (name, mode);
2814 /* Callback for find_a_file. Appends the file name to the directory
2815 path. If the resulting file exists in the right mode, return the
2816 full pathname to the file. */
2818 struct file_at_path_info {
2819 const char *name;
2820 const char *suffix;
2821 int name_len;
2822 int suffix_len;
2823 int mode;
2826 static void *
2827 file_at_path (char *path, void *data)
2829 struct file_at_path_info *info = (struct file_at_path_info *) data;
2830 size_t len = strlen (path);
2832 memcpy (path + len, info->name, info->name_len);
2833 len += info->name_len;
2835 /* Some systems have a suffix for executable files.
2836 So try appending that first. */
2837 if (info->suffix_len)
2839 memcpy (path + len, info->suffix, info->suffix_len + 1);
2840 if (access_check (path, info->mode) == 0)
2841 return path;
2844 path[len] = '\0';
2845 if (access_check (path, info->mode) == 0)
2846 return path;
2848 return NULL;
2851 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2852 access to check permissions. If DO_MULTI is true, search multilib
2853 paths then non-multilib paths, otherwise do not search multilib paths.
2854 Return 0 if not found, otherwise return its name, allocated with malloc. */
2856 static char *
2857 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2858 bool do_multi)
2860 struct file_at_path_info info;
2862 #ifdef DEFAULT_ASSEMBLER
2863 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2864 return xstrdup (DEFAULT_ASSEMBLER);
2865 #endif
2867 #ifdef DEFAULT_LINKER
2868 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2869 return xstrdup (DEFAULT_LINKER);
2870 #endif
2872 /* Determine the filename to execute (special case for absolute paths). */
2874 if (IS_ABSOLUTE_PATH (name))
2876 if (access (name, mode) == 0)
2877 return xstrdup (name);
2879 return NULL;
2882 info.name = name;
2883 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2884 info.name_len = strlen (info.name);
2885 info.suffix_len = strlen (info.suffix);
2886 info.mode = mode;
2888 return (char*) for_each_path (pprefix, do_multi,
2889 info.name_len + info.suffix_len,
2890 file_at_path, &info);
2893 /* Ranking of prefixes in the sort list. -B prefixes are put before
2894 all others. */
2896 enum path_prefix_priority
2898 PREFIX_PRIORITY_B_OPT,
2899 PREFIX_PRIORITY_LAST
2902 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2903 order according to PRIORITY. Within each PRIORITY, new entries are
2904 appended.
2906 If WARN is nonzero, we will warn if no file is found
2907 through this prefix. WARN should point to an int
2908 which will be set to 1 if this entry is used.
2910 COMPONENT is the value to be passed to update_path.
2912 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2913 the complete value of machine_suffix.
2914 2 means try both machine_suffix and just_machine_suffix. */
2916 static void
2917 add_prefix (struct path_prefix *pprefix, const char *prefix,
2918 const char *component, /* enum prefix_priority */ int priority,
2919 int require_machine_suffix, int os_multilib)
2921 struct prefix_list *pl, **prev;
2922 int len;
2924 for (prev = &pprefix->plist;
2925 (*prev) != NULL && (*prev)->priority <= priority;
2926 prev = &(*prev)->next)
2929 /* Keep track of the longest prefix. */
2931 prefix = update_path (prefix, component);
2932 len = strlen (prefix);
2933 if (len > pprefix->max_len)
2934 pprefix->max_len = len;
2936 pl = XNEW (struct prefix_list);
2937 pl->prefix = prefix;
2938 pl->require_machine_suffix = require_machine_suffix;
2939 pl->priority = priority;
2940 pl->os_multilib = os_multilib;
2942 /* Insert after PREV. */
2943 pl->next = (*prev);
2944 (*prev) = pl;
2947 /* Same as add_prefix, but prepending target_system_root to prefix. */
2948 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2949 static void
2950 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2951 const char *component,
2952 /* enum prefix_priority */ int priority,
2953 int require_machine_suffix, int os_multilib)
2955 if (!IS_ABSOLUTE_PATH (prefix))
2956 fatal_error (input_location, "system path %qs is not absolute", prefix);
2958 if (target_system_root)
2960 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2961 size_t sysroot_len = strlen (target_system_root);
2963 if (sysroot_len > 0
2964 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2965 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2967 if (target_sysroot_suffix)
2968 prefix = concat (sysroot_no_trailing_dir_separator,
2969 target_sysroot_suffix, prefix, NULL);
2970 else
2971 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
2973 free (sysroot_no_trailing_dir_separator);
2975 /* We have to override this because GCC's notion of sysroot
2976 moves along with GCC. */
2977 component = "GCC";
2980 add_prefix (pprefix, prefix, component, priority,
2981 require_machine_suffix, os_multilib);
2984 /* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */
2986 static void
2987 add_sysrooted_hdrs_prefix (struct path_prefix *pprefix, const char *prefix,
2988 const char *component,
2989 /* enum prefix_priority */ int priority,
2990 int require_machine_suffix, int os_multilib)
2992 if (!IS_ABSOLUTE_PATH (prefix))
2993 fatal_error (input_location, "system path %qs is not absolute", prefix);
2995 if (target_system_root)
2997 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2998 size_t sysroot_len = strlen (target_system_root);
3000 if (sysroot_len > 0
3001 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
3002 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3004 if (target_sysroot_hdrs_suffix)
3005 prefix = concat (sysroot_no_trailing_dir_separator,
3006 target_sysroot_hdrs_suffix, prefix, NULL);
3007 else
3008 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
3010 free (sysroot_no_trailing_dir_separator);
3012 /* We have to override this because GCC's notion of sysroot
3013 moves along with GCC. */
3014 component = "GCC";
3017 add_prefix (pprefix, prefix, component, priority,
3018 require_machine_suffix, os_multilib);
3022 /* Execute the command specified by the arguments on the current line of spec.
3023 When using pipes, this includes several piped-together commands
3024 with `|' between them.
3026 Return 0 if successful, -1 if failed. */
3028 static int
3029 execute (void)
3031 int i;
3032 int n_commands; /* # of command. */
3033 char *string;
3034 struct pex_obj *pex;
3035 struct command
3037 const char *prog; /* program name. */
3038 const char **argv; /* vector of args. */
3040 const char *arg;
3042 struct command *commands; /* each command buffer with above info. */
3044 gcc_assert (!processing_spec_function);
3046 if (wrapper_string)
3048 string = find_a_file (&exec_prefixes,
3049 argbuf[0], X_OK, false);
3050 if (string)
3051 argbuf[0] = string;
3052 insert_wrapper (wrapper_string);
3055 /* Count # of piped commands. */
3056 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3057 if (strcmp (arg, "|") == 0)
3058 n_commands++;
3060 /* Get storage for each command. */
3061 commands = (struct command *) alloca (n_commands * sizeof (struct command));
3063 /* Split argbuf into its separate piped processes,
3064 and record info about each one.
3065 Also search for the programs that are to be run. */
3067 argbuf.safe_push (0);
3069 commands[0].prog = argbuf[0]; /* first command. */
3070 commands[0].argv = argbuf.address ();
3072 if (!wrapper_string)
3074 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
3075 if (string)
3076 commands[0].argv[0] = string;
3079 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3080 if (arg && strcmp (arg, "|") == 0)
3081 { /* each command. */
3082 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3083 fatal_error (input_location, "%<-pipe%> not supported");
3084 #endif
3085 argbuf[i] = 0; /* Termination of command args. */
3086 commands[n_commands].prog = argbuf[i + 1];
3087 commands[n_commands].argv
3088 = &(argbuf.address ())[i + 1];
3089 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
3090 X_OK, false);
3091 if (string)
3092 commands[n_commands].argv[0] = string;
3093 n_commands++;
3096 /* If -v, print what we are about to do, and maybe query. */
3098 if (verbose_flag)
3100 /* For help listings, put a blank line between sub-processes. */
3101 if (print_help_list)
3102 fputc ('\n', stderr);
3104 /* Print each piped command as a separate line. */
3105 for (i = 0; i < n_commands; i++)
3107 const char *const *j;
3109 if (verbose_only_flag)
3111 for (j = commands[i].argv; *j; j++)
3113 const char *p;
3114 for (p = *j; *p; ++p)
3115 if (!ISALNUM ((unsigned char) *p)
3116 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
3117 break;
3118 if (*p || !*j)
3120 fprintf (stderr, " \"");
3121 for (p = *j; *p; ++p)
3123 if (*p == '"' || *p == '\\' || *p == '$')
3124 fputc ('\\', stderr);
3125 fputc (*p, stderr);
3127 fputc ('"', stderr);
3129 /* If it's empty, print "". */
3130 else if (!**j)
3131 fprintf (stderr, " \"\"");
3132 else
3133 fprintf (stderr, " %s", *j);
3136 else
3137 for (j = commands[i].argv; *j; j++)
3138 /* If it's empty, print "". */
3139 if (!**j)
3140 fprintf (stderr, " \"\"");
3141 else
3142 fprintf (stderr, " %s", *j);
3144 /* Print a pipe symbol after all but the last command. */
3145 if (i + 1 != n_commands)
3146 fprintf (stderr, " |");
3147 fprintf (stderr, "\n");
3149 fflush (stderr);
3150 if (verbose_only_flag != 0)
3152 /* verbose_only_flag should act as if the spec was
3153 executed, so increment execution_count before
3154 returning. This prevents spurious warnings about
3155 unused linker input files, etc. */
3156 execution_count++;
3157 return 0;
3159 #ifdef DEBUG
3160 fnotice (stderr, "\nGo ahead? (y or n) ");
3161 fflush (stderr);
3162 i = getchar ();
3163 if (i != '\n')
3164 while (getchar () != '\n')
3167 if (i != 'y' && i != 'Y')
3168 return 0;
3169 #endif /* DEBUG */
3172 #ifdef ENABLE_VALGRIND_CHECKING
3173 /* Run the each command through valgrind. To simplify prepending the
3174 path to valgrind and the option "-q" (for quiet operation unless
3175 something triggers), we allocate a separate argv array. */
3177 for (i = 0; i < n_commands; i++)
3179 const char **argv;
3180 int argc;
3181 int j;
3183 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3186 argv = XALLOCAVEC (const char *, argc + 3);
3188 argv[0] = VALGRIND_PATH;
3189 argv[1] = "-q";
3190 for (j = 2; j < argc + 2; j++)
3191 argv[j] = commands[i].argv[j - 2];
3192 argv[j] = NULL;
3194 commands[i].argv = argv;
3195 commands[i].prog = argv[0];
3197 #endif
3199 /* Run each piped subprocess. */
3201 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3202 ? PEX_RECORD_TIMES : 0),
3203 progname, temp_filename);
3204 if (pex == NULL)
3205 fatal_error (input_location, "%<pex_init%> failed: %m");
3207 for (i = 0; i < n_commands; i++)
3209 const char *errmsg;
3210 int err;
3211 const char *string = commands[i].argv[0];
3213 errmsg = pex_run (pex,
3214 ((i + 1 == n_commands ? PEX_LAST : 0)
3215 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3216 string, CONST_CAST (char **, commands[i].argv),
3217 NULL, NULL, &err);
3218 if (errmsg != NULL)
3220 errno = err;
3221 fatal_error (input_location,
3222 err ? G_("cannot execute %qs: %s: %m")
3223 : G_("cannot execute %qs: %s"),
3224 string, errmsg);
3227 if (i && string != commands[i].prog)
3228 free (CONST_CAST (char *, string));
3231 execution_count++;
3233 /* Wait for all the subprocesses to finish. */
3236 int *statuses;
3237 struct pex_time *times = NULL;
3238 int ret_code = 0;
3240 statuses = (int *) alloca (n_commands * sizeof (int));
3241 if (!pex_get_status (pex, n_commands, statuses))
3242 fatal_error (input_location, "failed to get exit status: %m");
3244 if (report_times || report_times_to_file)
3246 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
3247 if (!pex_get_times (pex, n_commands, times))
3248 fatal_error (input_location, "failed to get process times: %m");
3251 pex_free (pex);
3253 for (i = 0; i < n_commands; ++i)
3255 int status = statuses[i];
3257 if (WIFSIGNALED (status))
3258 switch (WTERMSIG (status))
3260 case SIGINT:
3261 case SIGTERM:
3262 /* SIGQUIT and SIGKILL are not available on MinGW. */
3263 #ifdef SIGQUIT
3264 case SIGQUIT:
3265 #endif
3266 #ifdef SIGKILL
3267 case SIGKILL:
3268 #endif
3269 /* The user (or environment) did something to the
3270 inferior. Making this an ICE confuses the user into
3271 thinking there's a compiler bug. Much more likely is
3272 the user or OOM killer nuked it. */
3273 fatal_error (input_location,
3274 "%s signal terminated program %s",
3275 strsignal (WTERMSIG (status)),
3276 commands[i].prog);
3277 break;
3279 #ifdef SIGPIPE
3280 case SIGPIPE:
3281 /* SIGPIPE is a special case. It happens in -pipe mode
3282 when the compiler dies before the preprocessor is
3283 done, or the assembler dies before the compiler is
3284 done. There's generally been an error already, and
3285 this is just fallout. So don't generate another
3286 error unless we would otherwise have succeeded. */
3287 if (signal_count || greatest_status >= MIN_FATAL_STATUS)
3289 signal_count++;
3290 ret_code = -1;
3291 break;
3293 #endif
3294 /* FALLTHROUGH */
3296 default:
3297 /* The inferior failed to catch the signal. */
3298 internal_error_no_backtrace ("%s signal terminated program %s",
3299 strsignal (WTERMSIG (status)),
3300 commands[i].prog);
3302 else if (WIFEXITED (status)
3303 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3305 /* For ICEs in cc1, cc1obj, cc1plus see if it is
3306 reproducible or not. */
3307 const char *p;
3308 if (flag_report_bug
3309 && WEXITSTATUS (status) == ICE_EXIT_CODE
3310 && i == 0
3311 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR))
3312 && ! strncmp (p + 1, "cc1", 3))
3313 try_generate_repro (commands[0].argv);
3314 if (WEXITSTATUS (status) > greatest_status)
3315 greatest_status = WEXITSTATUS (status);
3316 ret_code = -1;
3319 if (report_times || report_times_to_file)
3321 struct pex_time *pt = &times[i];
3322 double ut, st;
3324 ut = ((double) pt->user_seconds
3325 + (double) pt->user_microseconds / 1.0e6);
3326 st = ((double) pt->system_seconds
3327 + (double) pt->system_microseconds / 1.0e6);
3329 if (ut + st != 0)
3331 if (report_times)
3332 fnotice (stderr, "# %s %.2f %.2f\n",
3333 commands[i].prog, ut, st);
3335 if (report_times_to_file)
3337 int c = 0;
3338 const char *const *j;
3340 fprintf (report_times_to_file, "%g %g", ut, st);
3342 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3344 const char *p;
3345 for (p = *j; *p; ++p)
3346 if (*p == '"' || *p == '\\' || *p == '$'
3347 || ISSPACE (*p))
3348 break;
3350 if (*p)
3352 fprintf (report_times_to_file, " \"");
3353 for (p = *j; *p; ++p)
3355 if (*p == '"' || *p == '\\' || *p == '$')
3356 fputc ('\\', report_times_to_file);
3357 fputc (*p, report_times_to_file);
3359 fputc ('"', report_times_to_file);
3361 else
3362 fprintf (report_times_to_file, " %s", *j);
3365 fputc ('\n', report_times_to_file);
3371 if (commands[0].argv[0] != commands[0].prog)
3372 free (CONST_CAST (char *, commands[0].argv[0]));
3374 return ret_code;
3378 /* Find all the switches given to us
3379 and make a vector describing them.
3380 The elements of the vector are strings, one per switch given.
3381 If a switch uses following arguments, then the `part1' field
3382 is the switch itself and the `args' field
3383 is a null-terminated vector containing the following arguments.
3384 Bits in the `live_cond' field are:
3385 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3386 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3387 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3388 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored.
3389 SWITCH_KEEP_FOR_GCC to indicate that this switch, otherwise ignored,
3390 should be included in COLLECT_GCC_OPTIONS.
3391 in all do_spec calls afterwards. Used for %<S from self specs.
3392 The `known' field describes whether this is an internal switch.
3393 The `validated' field describes whether any spec has looked at this switch;
3394 if it remains false at the end of the run, the switch must be meaningless.
3395 The `ordering' field is used to temporarily mark switches that have to be
3396 kept in a specific order. */
3398 #define SWITCH_LIVE (1 << 0)
3399 #define SWITCH_FALSE (1 << 1)
3400 #define SWITCH_IGNORE (1 << 2)
3401 #define SWITCH_IGNORE_PERMANENTLY (1 << 3)
3402 #define SWITCH_KEEP_FOR_GCC (1 << 4)
3404 struct switchstr
3406 const char *part1;
3407 const char **args;
3408 unsigned int live_cond;
3409 bool known;
3410 bool validated;
3411 bool ordering;
3414 static struct switchstr *switches;
3416 static int n_switches;
3418 static int n_switches_alloc;
3420 /* Set to zero if -fcompare-debug is disabled, positive if it's
3421 enabled and we're running the first compilation, negative if it's
3422 enabled and we're running the second compilation. For most of the
3423 time, it's in the range -1..1, but it can be temporarily set to 2
3424 or 3 to indicate that the -fcompare-debug flags didn't come from
3425 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3426 variable, until a synthesized -fcompare-debug flag is added to the
3427 command line. */
3428 int compare_debug;
3430 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3431 int compare_debug_second;
3433 /* Set to the flags that should be passed to the second compilation in
3434 a -fcompare-debug compilation. */
3435 const char *compare_debug_opt;
3437 static struct switchstr *switches_debug_check[2];
3439 static int n_switches_debug_check[2];
3441 static int n_switches_alloc_debug_check[2];
3443 static char *debug_check_temp_file[2];
3445 /* Language is one of three things:
3447 1) The name of a real programming language.
3448 2) NULL, indicating that no one has figured out
3449 what it is yet.
3450 3) '*', indicating that the file should be passed
3451 to the linker. */
3452 struct infile
3454 const char *name;
3455 const char *language;
3456 struct compiler *incompiler;
3457 bool compiled;
3458 bool preprocessed;
3461 /* Also a vector of input files specified. */
3463 static struct infile *infiles;
3465 int n_infiles;
3467 static int n_infiles_alloc;
3469 /* True if undefined environment variables encountered during spec processing
3470 are ok to ignore, typically when we're running for --help or --version. */
3472 static bool spec_undefvar_allowed;
3474 /* True if multiple input files are being compiled to a single
3475 assembly file. */
3477 static bool combine_inputs;
3479 /* This counts the number of libraries added by lang_specific_driver, so that
3480 we can tell if there were any user supplied any files or libraries. */
3482 static int added_libraries;
3484 /* And a vector of corresponding output files is made up later. */
3486 const char **outfiles;
3488 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3490 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3491 is true if we should look for an executable suffix. DO_OBJ
3492 is true if we should look for an object suffix. */
3494 static const char *
3495 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3496 int do_obj ATTRIBUTE_UNUSED)
3498 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3499 int i;
3500 #endif
3501 int len;
3503 if (name == NULL)
3504 return NULL;
3506 len = strlen (name);
3508 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3509 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3510 if (do_obj && len > 2
3511 && name[len - 2] == '.'
3512 && name[len - 1] == 'o')
3514 obstack_grow (&obstack, name, len - 2);
3515 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3516 name = XOBFINISH (&obstack, const char *);
3518 #endif
3520 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3521 /* If there is no filetype, make it the executable suffix (which includes
3522 the "."). But don't get confused if we have just "-o". */
3523 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3524 return name;
3526 for (i = len - 1; i >= 0; i--)
3527 if (IS_DIR_SEPARATOR (name[i]))
3528 break;
3530 for (i++; i < len; i++)
3531 if (name[i] == '.')
3532 return name;
3534 obstack_grow (&obstack, name, len);
3535 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3536 strlen (TARGET_EXECUTABLE_SUFFIX));
3537 name = XOBFINISH (&obstack, const char *);
3538 #endif
3540 return name;
3542 #endif
3544 /* Display the command line switches accepted by gcc. */
3545 static void
3546 display_help (void)
3548 printf (_("Usage: %s [options] file...\n"), progname);
3549 fputs (_("Options:\n"), stdout);
3551 fputs (_(" -pass-exit-codes Exit with highest error code from a phase.\n"), stdout);
3552 fputs (_(" --help Display this information.\n"), stdout);
3553 fputs (_(" --target-help Display target specific command line options.\n"), stdout);
3554 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"), stdout);
3555 fputs (_(" Display specific types of command line options.\n"), stdout);
3556 if (! verbose_flag)
3557 fputs (_(" (Use '-v --help' to display command line options of sub-processes).\n"), stdout);
3558 fputs (_(" --version Display compiler version information.\n"), stdout);
3559 fputs (_(" -dumpspecs Display all of the built in spec strings.\n"), stdout);
3560 fputs (_(" -dumpversion Display the version of the compiler.\n"), stdout);
3561 fputs (_(" -dumpmachine Display the compiler's target processor.\n"), stdout);
3562 fputs (_(" -print-search-dirs Display the directories in the compiler's search path.\n"), stdout);
3563 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library.\n"), stdout);
3564 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>.\n"), stdout);
3565 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n"), stdout);
3566 fputs (_("\
3567 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3568 a component in the library path.\n"), stdout);
3569 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc.\n"), stdout);
3570 fputs (_("\
3571 -print-multi-lib Display the mapping between command line options and\n\
3572 multiple library search directories.\n"), stdout);
3573 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries.\n"), stdout);
3574 fputs (_(" -print-sysroot Display the target libraries directory.\n"), stdout);
3575 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"), stdout);
3576 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler.\n"), stdout);
3577 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n"), stdout);
3578 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker.\n"), stdout);
3579 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler.\n"), stdout);
3580 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n"), stdout);
3581 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker.\n"), stdout);
3582 fputs (_(" -save-temps Do not delete intermediate files.\n"), stdout);
3583 fputs (_(" -save-temps=<arg> Do not delete intermediate files.\n"), stdout);
3584 fputs (_("\
3585 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3586 prefixes to other gcc components.\n"), stdout);
3587 fputs (_(" -pipe Use pipes rather than intermediate files.\n"), stdout);
3588 fputs (_(" -time Time the execution of each subprocess.\n"), stdout);
3589 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>.\n"), stdout);
3590 fputs (_(" -std=<standard> Assume that the input sources are for <standard>.\n"), stdout);
3591 fputs (_("\
3592 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3593 and libraries.\n"), stdout);
3594 fputs (_(" -B <directory> Add <directory> to the compiler's search paths.\n"), stdout);
3595 fputs (_(" -v Display the programs invoked by the compiler.\n"), stdout);
3596 fputs (_(" -### Like -v but options quoted and commands not executed.\n"), stdout);
3597 fputs (_(" -E Preprocess only; do not compile, assemble or link.\n"), stdout);
3598 fputs (_(" -S Compile only; do not assemble or link.\n"), stdout);
3599 fputs (_(" -c Compile and assemble, but do not link.\n"), stdout);
3600 fputs (_(" -o <file> Place the output into <file>.\n"), stdout);
3601 fputs (_(" -pie Create a dynamically linked position independent\n\
3602 executable.\n"), stdout);
3603 fputs (_(" -shared Create a shared library.\n"), stdout);
3604 fputs (_("\
3605 -x <language> Specify the language of the following input files.\n\
3606 Permissible languages include: c c++ assembler none\n\
3607 'none' means revert to the default behavior of\n\
3608 guessing the language based on the file's extension.\n\
3609 "), stdout);
3611 printf (_("\
3612 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3613 passed on to the various sub-processes invoked by %s. In order to pass\n\
3614 other options on to these processes the -W<letter> options must be used.\n\
3615 "), progname);
3617 /* The rest of the options are displayed by invocations of the various
3618 sub-processes. */
3621 static void
3622 add_preprocessor_option (const char *option, int len)
3624 preprocessor_options.safe_push (save_string (option, len));
3627 static void
3628 add_assembler_option (const char *option, int len)
3630 assembler_options.safe_push (save_string (option, len));
3633 static void
3634 add_linker_option (const char *option, int len)
3636 linker_options.safe_push (save_string (option, len));
3639 /* Allocate space for an input file in infiles. */
3641 static void
3642 alloc_infile (void)
3644 if (n_infiles_alloc == 0)
3646 n_infiles_alloc = 16;
3647 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3649 else if (n_infiles_alloc == n_infiles)
3651 n_infiles_alloc *= 2;
3652 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3656 /* Store an input file with the given NAME and LANGUAGE in
3657 infiles. */
3659 static void
3660 add_infile (const char *name, const char *language)
3662 alloc_infile ();
3663 infiles[n_infiles].name = name;
3664 infiles[n_infiles++].language = language;
3667 /* Allocate space for a switch in switches. */
3669 static void
3670 alloc_switch (void)
3672 if (n_switches_alloc == 0)
3674 n_switches_alloc = 16;
3675 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3677 else if (n_switches_alloc == n_switches)
3679 n_switches_alloc *= 2;
3680 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3684 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3685 as validated if VALIDATED and KNOWN if it is an internal switch. */
3687 static void
3688 save_switch (const char *opt, size_t n_args, const char *const *args,
3689 bool validated, bool known)
3691 alloc_switch ();
3692 switches[n_switches].part1 = opt + 1;
3693 if (n_args == 0)
3694 switches[n_switches].args = 0;
3695 else
3697 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3698 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3699 switches[n_switches].args[n_args] = NULL;
3702 switches[n_switches].live_cond = 0;
3703 switches[n_switches].validated = validated;
3704 switches[n_switches].known = known;
3705 switches[n_switches].ordering = 0;
3706 n_switches++;
3709 /* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3710 not set already. */
3712 static void
3713 set_source_date_epoch_envvar ()
3715 /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3716 of 64 bit integers. */
3717 char source_date_epoch[21];
3718 time_t tt;
3720 errno = 0;
3721 tt = time (NULL);
3722 if (tt < (time_t) 0 || errno != 0)
3723 tt = (time_t) 0;
3725 snprintf (source_date_epoch, 21, "%llu", (unsigned long long) tt);
3726 /* Using setenv instead of xputenv because we want the variable to remain
3727 after finalizing so that it's still set in the second run when using
3728 -fcompare-debug. */
3729 setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0);
3732 /* Handle an option DECODED that is unknown to the option-processing
3733 machinery. */
3735 static bool
3736 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3738 const char *opt = decoded->arg;
3739 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3740 && !(decoded->errors & CL_ERR_NEGATIVE))
3742 /* Leave unknown -Wno-* options for the compiler proper, to be
3743 diagnosed only if there are warnings. */
3744 save_switch (decoded->canonical_option[0],
3745 decoded->canonical_option_num_elements - 1,
3746 &decoded->canonical_option[1], false, true);
3747 return false;
3749 if (decoded->opt_index == OPT_SPECIAL_unknown)
3751 /* Give it a chance to define it a spec file. */
3752 save_switch (decoded->canonical_option[0],
3753 decoded->canonical_option_num_elements - 1,
3754 &decoded->canonical_option[1], false, false);
3755 return false;
3757 else
3758 return true;
3761 /* Handle an option DECODED that is not marked as CL_DRIVER.
3762 LANG_MASK will always be CL_DRIVER. */
3764 static void
3765 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3766 unsigned int lang_mask ATTRIBUTE_UNUSED)
3768 /* At this point, non-driver options are accepted (and expected to
3769 be passed down by specs) unless marked to be rejected by the
3770 driver. Options to be rejected by the driver but accepted by the
3771 compilers proper are treated just like completely unknown
3772 options. */
3773 const struct cl_option *option = &cl_options[decoded->opt_index];
3775 if (option->cl_reject_driver)
3776 error ("unrecognized command-line option %qs",
3777 decoded->orig_option_with_args_text);
3778 else
3779 save_switch (decoded->canonical_option[0],
3780 decoded->canonical_option_num_elements - 1,
3781 &decoded->canonical_option[1], false, true);
3784 static const char *spec_lang = 0;
3785 static int last_language_n_infiles;
3787 /* Parse -foffload option argument. */
3789 static void
3790 handle_foffload_option (const char *arg)
3792 const char *c, *cur, *n, *next, *end;
3793 char *target;
3795 /* If option argument starts with '-' then no target is specified and we
3796 do not need to parse it. */
3797 if (arg[0] == '-')
3798 return;
3800 end = strchr (arg, '=');
3801 if (end == NULL)
3802 end = strchr (arg, '\0');
3803 cur = arg;
3805 while (cur < end)
3807 next = strchr (cur, ',');
3808 if (next == NULL)
3809 next = end;
3810 next = (next > end) ? end : next;
3812 target = XNEWVEC (char, next - cur + 1);
3813 memcpy (target, cur, next - cur);
3814 target[next - cur] = '\0';
3816 /* If 'disable' is passed to the option, stop parsing the option and clean
3817 the list of offload targets. */
3818 if (strcmp (target, "disable") == 0)
3820 free (offload_targets);
3821 offload_targets = xstrdup ("");
3822 break;
3825 /* Check that GCC is configured to support the offload target. */
3826 c = OFFLOAD_TARGETS;
3827 while (c)
3829 n = strchr (c, ',');
3830 if (n == NULL)
3831 n = strchr (c, '\0');
3833 if (next - cur == n - c && strncmp (target, c, n - c) == 0)
3834 break;
3836 c = *n ? n + 1 : NULL;
3839 if (!c)
3840 fatal_error (input_location,
3841 "GCC is not configured to support %s as offload target",
3842 target);
3844 if (!offload_targets)
3846 offload_targets = target;
3847 target = NULL;
3849 else
3851 /* Check that the target hasn't already presented in the list. */
3852 c = offload_targets;
3855 n = strchr (c, ':');
3856 if (n == NULL)
3857 n = strchr (c, '\0');
3859 if (next - cur == n - c && strncmp (c, target, n - c) == 0)
3860 break;
3862 c = n + 1;
3864 while (*n);
3866 /* If duplicate is not found, append the target to the list. */
3867 if (c > n)
3869 size_t offload_targets_len = strlen (offload_targets);
3870 offload_targets
3871 = XRESIZEVEC (char, offload_targets,
3872 offload_targets_len + 1 + next - cur + 1);
3873 offload_targets[offload_targets_len++] = ':';
3874 memcpy (offload_targets + offload_targets_len, target, next - cur + 1);
3878 cur = next + 1;
3879 XDELETEVEC (target);
3883 /* Handle a driver option; arguments and return value as for
3884 handle_option. */
3886 static bool
3887 driver_handle_option (struct gcc_options *opts,
3888 struct gcc_options *opts_set,
3889 const struct cl_decoded_option *decoded,
3890 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
3891 location_t loc,
3892 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
3893 diagnostic_context *dc,
3894 void (*) (void))
3896 size_t opt_index = decoded->opt_index;
3897 const char *arg = decoded->arg;
3898 const char *compare_debug_replacement_opt;
3899 int value = decoded->value;
3900 bool validated = false;
3901 bool do_save = true;
3903 gcc_assert (opts == &global_options);
3904 gcc_assert (opts_set == &global_options_set);
3905 gcc_assert (kind == DK_UNSPECIFIED);
3906 gcc_assert (loc == UNKNOWN_LOCATION);
3907 gcc_assert (dc == global_dc);
3909 switch (opt_index)
3911 case OPT_dumpspecs:
3913 struct spec_list *sl;
3914 init_spec ();
3915 for (sl = specs; sl; sl = sl->next)
3916 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3917 if (link_command_spec)
3918 printf ("*link_command:\n%s\n\n", link_command_spec);
3919 exit (0);
3922 case OPT_dumpversion:
3923 printf ("%s\n", spec_version);
3924 exit (0);
3926 case OPT_dumpmachine:
3927 printf ("%s\n", spec_machine);
3928 exit (0);
3930 case OPT_dumpfullversion:
3931 printf ("%s\n", BASEVER);
3932 exit (0);
3934 case OPT__version:
3935 print_version = 1;
3937 /* CPP driver cannot obtain switch from cc1_options. */
3938 if (is_cpp_driver)
3939 add_preprocessor_option ("--version", strlen ("--version"));
3940 add_assembler_option ("--version", strlen ("--version"));
3941 add_linker_option ("--version", strlen ("--version"));
3942 break;
3944 case OPT__completion_:
3945 validated = true;
3946 completion = decoded->arg;
3947 break;
3949 case OPT__help:
3950 print_help_list = 1;
3952 /* CPP driver cannot obtain switch from cc1_options. */
3953 if (is_cpp_driver)
3954 add_preprocessor_option ("--help", 6);
3955 add_assembler_option ("--help", 6);
3956 add_linker_option ("--help", 6);
3957 break;
3959 case OPT__help_:
3960 print_subprocess_help = 2;
3961 break;
3963 case OPT__target_help:
3964 print_subprocess_help = 1;
3966 /* CPP driver cannot obtain switch from cc1_options. */
3967 if (is_cpp_driver)
3968 add_preprocessor_option ("--target-help", 13);
3969 add_assembler_option ("--target-help", 13);
3970 add_linker_option ("--target-help", 13);
3971 break;
3973 case OPT__no_sysroot_suffix:
3974 case OPT_pass_exit_codes:
3975 case OPT_print_search_dirs:
3976 case OPT_print_file_name_:
3977 case OPT_print_prog_name_:
3978 case OPT_print_multi_lib:
3979 case OPT_print_multi_directory:
3980 case OPT_print_sysroot:
3981 case OPT_print_multi_os_directory:
3982 case OPT_print_multiarch:
3983 case OPT_print_sysroot_headers_suffix:
3984 case OPT_time:
3985 case OPT_wrapper:
3986 /* These options set the variables specified in common.opt
3987 automatically, and do not need to be saved for spec
3988 processing. */
3989 do_save = false;
3990 break;
3992 case OPT_print_libgcc_file_name:
3993 print_file_name = "libgcc.a";
3994 do_save = false;
3995 break;
3997 case OPT_fuse_ld_bfd:
3998 use_ld = ".bfd";
3999 break;
4001 case OPT_fuse_ld_gold:
4002 use_ld = ".gold";
4003 break;
4005 case OPT_fcompare_debug_second:
4006 compare_debug_second = 1;
4007 break;
4009 case OPT_fcompare_debug:
4010 switch (value)
4012 case 0:
4013 compare_debug_replacement_opt = "-fcompare-debug=";
4014 arg = "";
4015 goto compare_debug_with_arg;
4017 case 1:
4018 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
4019 arg = "-gtoggle";
4020 goto compare_debug_with_arg;
4022 default:
4023 gcc_unreachable ();
4025 break;
4027 case OPT_fcompare_debug_:
4028 compare_debug_replacement_opt = decoded->canonical_option[0];
4029 compare_debug_with_arg:
4030 gcc_assert (decoded->canonical_option_num_elements == 1);
4031 gcc_assert (arg != NULL);
4032 if (*arg)
4033 compare_debug = 1;
4034 else
4035 compare_debug = -1;
4036 if (compare_debug < 0)
4037 compare_debug_opt = NULL;
4038 else
4039 compare_debug_opt = arg;
4040 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
4041 set_source_date_epoch_envvar ();
4042 return true;
4044 case OPT_fdiagnostics_color_:
4045 diagnostic_color_init (dc, value);
4046 break;
4048 case OPT_fdiagnostics_urls_:
4049 diagnostic_urls_init (dc, value);
4050 break;
4052 case OPT_fdiagnostics_format_:
4053 diagnostic_output_format_init (dc,
4054 (enum diagnostics_output_format)value);
4055 break;
4057 case OPT_Wa_:
4059 int prev, j;
4060 /* Pass the rest of this option to the assembler. */
4062 /* Split the argument at commas. */
4063 prev = 0;
4064 for (j = 0; arg[j]; j++)
4065 if (arg[j] == ',')
4067 add_assembler_option (arg + prev, j - prev);
4068 prev = j + 1;
4071 /* Record the part after the last comma. */
4072 add_assembler_option (arg + prev, j - prev);
4074 do_save = false;
4075 break;
4077 case OPT_Wp_:
4079 int prev, j;
4080 /* Pass the rest of this option to the preprocessor. */
4082 /* Split the argument at commas. */
4083 prev = 0;
4084 for (j = 0; arg[j]; j++)
4085 if (arg[j] == ',')
4087 add_preprocessor_option (arg + prev, j - prev);
4088 prev = j + 1;
4091 /* Record the part after the last comma. */
4092 add_preprocessor_option (arg + prev, j - prev);
4094 do_save = false;
4095 break;
4097 case OPT_Wl_:
4099 int prev, j;
4100 /* Split the argument at commas. */
4101 prev = 0;
4102 for (j = 0; arg[j]; j++)
4103 if (arg[j] == ',')
4105 add_infile (save_string (arg + prev, j - prev), "*");
4106 prev = j + 1;
4108 /* Record the part after the last comma. */
4109 add_infile (arg + prev, "*");
4111 do_save = false;
4112 break;
4114 case OPT_Xlinker:
4115 add_infile (arg, "*");
4116 do_save = false;
4117 break;
4119 case OPT_Xpreprocessor:
4120 add_preprocessor_option (arg, strlen (arg));
4121 do_save = false;
4122 break;
4124 case OPT_Xassembler:
4125 add_assembler_option (arg, strlen (arg));
4126 do_save = false;
4127 break;
4129 case OPT_l:
4130 /* POSIX allows separation of -l and the lib arg; canonicalize
4131 by concatenating -l with its arg */
4132 add_infile (concat ("-l", arg, NULL), "*");
4133 do_save = false;
4134 break;
4136 case OPT_L:
4137 /* Similarly, canonicalize -L for linkers that may not accept
4138 separate arguments. */
4139 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
4140 return true;
4142 case OPT_F:
4143 /* Likewise -F. */
4144 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
4145 return true;
4147 case OPT_save_temps:
4148 save_temps_flag = SAVE_TEMPS_CWD;
4149 validated = true;
4150 break;
4152 case OPT_save_temps_:
4153 if (strcmp (arg, "cwd") == 0)
4154 save_temps_flag = SAVE_TEMPS_CWD;
4155 else if (strcmp (arg, "obj") == 0
4156 || strcmp (arg, "object") == 0)
4157 save_temps_flag = SAVE_TEMPS_OBJ;
4158 else
4159 fatal_error (input_location, "%qs is an unknown %<-save-temps%> option",
4160 decoded->orig_option_with_args_text);
4161 break;
4163 case OPT_no_canonical_prefixes:
4164 /* Already handled as a special case, so ignored here. */
4165 do_save = false;
4166 break;
4168 case OPT_pipe:
4169 validated = true;
4170 /* These options set the variables specified in common.opt
4171 automatically, but do need to be saved for spec
4172 processing. */
4173 break;
4175 case OPT_specs_:
4177 struct user_specs *user = XNEW (struct user_specs);
4179 user->next = (struct user_specs *) 0;
4180 user->filename = arg;
4181 if (user_specs_tail)
4182 user_specs_tail->next = user;
4183 else
4184 user_specs_head = user;
4185 user_specs_tail = user;
4187 validated = true;
4188 break;
4190 case OPT__sysroot_:
4191 target_system_root = arg;
4192 target_system_root_changed = 1;
4193 do_save = false;
4194 break;
4196 case OPT_time_:
4197 if (report_times_to_file)
4198 fclose (report_times_to_file);
4199 report_times_to_file = fopen (arg, "a");
4200 do_save = false;
4201 break;
4203 case OPT____:
4204 /* "-###"
4205 This is similar to -v except that there is no execution
4206 of the commands and the echoed arguments are quoted. It
4207 is intended for use in shell scripts to capture the
4208 driver-generated command line. */
4209 verbose_only_flag++;
4210 verbose_flag = 1;
4211 do_save = false;
4212 break;
4214 case OPT_B:
4216 size_t len = strlen (arg);
4218 /* Catch the case where the user has forgotten to append a
4219 directory separator to the path. Note, they may be using
4220 -B to add an executable name prefix, eg "i386-elf-", in
4221 order to distinguish between multiple installations of
4222 GCC in the same directory. Hence we must check to see
4223 if appending a directory separator actually makes a
4224 valid directory name. */
4225 if (!IS_DIR_SEPARATOR (arg[len - 1])
4226 && is_directory (arg, false))
4228 char *tmp = XNEWVEC (char, len + 2);
4229 strcpy (tmp, arg);
4230 tmp[len] = DIR_SEPARATOR;
4231 tmp[++len] = 0;
4232 arg = tmp;
4235 add_prefix (&exec_prefixes, arg, NULL,
4236 PREFIX_PRIORITY_B_OPT, 0, 0);
4237 add_prefix (&startfile_prefixes, arg, NULL,
4238 PREFIX_PRIORITY_B_OPT, 0, 0);
4239 add_prefix (&include_prefixes, arg, NULL,
4240 PREFIX_PRIORITY_B_OPT, 0, 0);
4242 validated = true;
4243 break;
4245 case OPT_E:
4246 have_E = true;
4247 break;
4249 case OPT_x:
4250 spec_lang = arg;
4251 if (!strcmp (spec_lang, "none"))
4252 /* Suppress the warning if -xnone comes after the last input
4253 file, because alternate command interfaces like g++ might
4254 find it useful to place -xnone after each input file. */
4255 spec_lang = 0;
4256 else
4257 last_language_n_infiles = n_infiles;
4258 do_save = false;
4259 break;
4261 case OPT_o:
4262 have_o = 1;
4263 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4264 arg = convert_filename (arg, ! have_c, 0);
4265 #endif
4266 output_file = arg;
4267 /* Save the output name in case -save-temps=obj was used. */
4268 save_temps_prefix = xstrdup (arg);
4269 /* On some systems, ld cannot handle "-o" without a space. So
4270 split the option from its argument. */
4271 save_switch ("-o", 1, &arg, validated, true);
4272 return true;
4274 #ifdef ENABLE_DEFAULT_PIE
4275 case OPT_pie:
4276 /* -pie is turned on by default. */
4277 #endif
4279 case OPT_static_libgcc:
4280 case OPT_shared_libgcc:
4281 case OPT_static_libgfortran:
4282 case OPT_static_libstdc__:
4283 /* These are always valid, since gcc.c itself understands the
4284 first two, gfortranspec.c understands -static-libgfortran and
4285 g++spec.c understands -static-libstdc++ */
4286 validated = true;
4287 break;
4289 case OPT_fwpa:
4290 flag_wpa = "";
4291 break;
4293 case OPT_foffload_:
4294 handle_foffload_option (arg);
4295 break;
4297 default:
4298 /* Various driver options need no special processing at this
4299 point, having been handled in a prescan above or being
4300 handled by specs. */
4301 break;
4304 if (do_save)
4305 save_switch (decoded->canonical_option[0],
4306 decoded->canonical_option_num_elements - 1,
4307 &decoded->canonical_option[1], validated, true);
4308 return true;
4311 /* Put the driver's standard set of option handlers in *HANDLERS. */
4313 static void
4314 set_option_handlers (struct cl_option_handlers *handlers)
4316 handlers->unknown_option_callback = driver_unknown_option_callback;
4317 handlers->wrong_lang_callback = driver_wrong_lang_callback;
4318 handlers->num_handlers = 3;
4319 handlers->handlers[0].handler = driver_handle_option;
4320 handlers->handlers[0].mask = CL_DRIVER;
4321 handlers->handlers[1].handler = common_handle_option;
4322 handlers->handlers[1].mask = CL_COMMON;
4323 handlers->handlers[2].handler = target_handle_option;
4324 handlers->handlers[2].mask = CL_TARGET;
4327 /* Create the vector `switches' and its contents.
4328 Store its length in `n_switches'. */
4330 static void
4331 process_command (unsigned int decoded_options_count,
4332 struct cl_decoded_option *decoded_options)
4334 const char *temp;
4335 char *temp1;
4336 char *tooldir_prefix, *tooldir_prefix2;
4337 char *(*get_relative_prefix) (const char *, const char *,
4338 const char *) = NULL;
4339 struct cl_option_handlers handlers;
4340 unsigned int j;
4342 gcc_exec_prefix = env.get ("GCC_EXEC_PREFIX");
4344 n_switches = 0;
4345 n_infiles = 0;
4346 added_libraries = 0;
4348 /* Figure compiler version from version string. */
4350 compiler_version = temp1 = xstrdup (version_string);
4352 for (; *temp1; ++temp1)
4354 if (*temp1 == ' ')
4356 *temp1 = '\0';
4357 break;
4361 /* Handle any -no-canonical-prefixes flag early, to assign the function
4362 that builds relative prefixes. This function creates default search
4363 paths that are needed later in normal option handling. */
4365 for (j = 1; j < decoded_options_count; j++)
4367 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
4369 get_relative_prefix = make_relative_prefix_ignore_links;
4370 break;
4373 if (! get_relative_prefix)
4374 get_relative_prefix = make_relative_prefix;
4376 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
4377 see if we can create it from the pathname specified in
4378 decoded_options[0].arg. */
4380 gcc_libexec_prefix = standard_libexec_prefix;
4381 #ifndef VMS
4382 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
4383 if (!gcc_exec_prefix)
4385 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
4386 standard_bindir_prefix,
4387 standard_exec_prefix);
4388 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
4389 standard_bindir_prefix,
4390 standard_libexec_prefix);
4391 if (gcc_exec_prefix)
4392 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
4394 else
4396 /* make_relative_prefix requires a program name, but
4397 GCC_EXEC_PREFIX is typically a directory name with a trailing
4398 / (which is ignored by make_relative_prefix), so append a
4399 program name. */
4400 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
4401 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
4402 standard_exec_prefix,
4403 standard_libexec_prefix);
4405 /* The path is unrelocated, so fallback to the original setting. */
4406 if (!gcc_libexec_prefix)
4407 gcc_libexec_prefix = standard_libexec_prefix;
4409 free (tmp_prefix);
4411 #else
4412 #endif
4413 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4414 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4415 or an automatically created GCC_EXEC_PREFIX from
4416 decoded_options[0].arg. */
4418 /* Do language-specific adjustment/addition of flags. */
4419 lang_specific_driver (&decoded_options, &decoded_options_count,
4420 &added_libraries);
4422 if (gcc_exec_prefix)
4424 int len = strlen (gcc_exec_prefix);
4426 if (len > (int) sizeof ("/lib/gcc/") - 1
4427 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
4429 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
4430 if (IS_DIR_SEPARATOR (*temp)
4431 && filename_ncmp (temp + 1, "lib", 3) == 0
4432 && IS_DIR_SEPARATOR (temp[4])
4433 && filename_ncmp (temp + 5, "gcc", 3) == 0)
4434 len -= sizeof ("/lib/gcc/") - 1;
4437 set_std_prefix (gcc_exec_prefix, len);
4438 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
4439 PREFIX_PRIORITY_LAST, 0, 0);
4440 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
4441 PREFIX_PRIORITY_LAST, 0, 0);
4444 /* COMPILER_PATH and LIBRARY_PATH have values
4445 that are lists of directory names with colons. */
4447 temp = env.get ("COMPILER_PATH");
4448 if (temp)
4450 const char *startp, *endp;
4451 char *nstore = (char *) alloca (strlen (temp) + 3);
4453 startp = endp = temp;
4454 while (1)
4456 if (*endp == PATH_SEPARATOR || *endp == 0)
4458 strncpy (nstore, startp, endp - startp);
4459 if (endp == startp)
4460 strcpy (nstore, concat (".", dir_separator_str, NULL));
4461 else if (!IS_DIR_SEPARATOR (endp[-1]))
4463 nstore[endp - startp] = DIR_SEPARATOR;
4464 nstore[endp - startp + 1] = 0;
4466 else
4467 nstore[endp - startp] = 0;
4468 add_prefix (&exec_prefixes, nstore, 0,
4469 PREFIX_PRIORITY_LAST, 0, 0);
4470 add_prefix (&include_prefixes, nstore, 0,
4471 PREFIX_PRIORITY_LAST, 0, 0);
4472 if (*endp == 0)
4473 break;
4474 endp = startp = endp + 1;
4476 else
4477 endp++;
4481 temp = env.get (LIBRARY_PATH_ENV);
4482 if (temp && *cross_compile == '0')
4484 const char *startp, *endp;
4485 char *nstore = (char *) alloca (strlen (temp) + 3);
4487 startp = endp = temp;
4488 while (1)
4490 if (*endp == PATH_SEPARATOR || *endp == 0)
4492 strncpy (nstore, startp, endp - startp);
4493 if (endp == startp)
4494 strcpy (nstore, concat (".", dir_separator_str, NULL));
4495 else if (!IS_DIR_SEPARATOR (endp[-1]))
4497 nstore[endp - startp] = DIR_SEPARATOR;
4498 nstore[endp - startp + 1] = 0;
4500 else
4501 nstore[endp - startp] = 0;
4502 add_prefix (&startfile_prefixes, nstore, NULL,
4503 PREFIX_PRIORITY_LAST, 0, 1);
4504 if (*endp == 0)
4505 break;
4506 endp = startp = endp + 1;
4508 else
4509 endp++;
4513 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4514 temp = env.get ("LPATH");
4515 if (temp && *cross_compile == '0')
4517 const char *startp, *endp;
4518 char *nstore = (char *) alloca (strlen (temp) + 3);
4520 startp = endp = temp;
4521 while (1)
4523 if (*endp == PATH_SEPARATOR || *endp == 0)
4525 strncpy (nstore, startp, endp - startp);
4526 if (endp == startp)
4527 strcpy (nstore, concat (".", dir_separator_str, NULL));
4528 else if (!IS_DIR_SEPARATOR (endp[-1]))
4530 nstore[endp - startp] = DIR_SEPARATOR;
4531 nstore[endp - startp + 1] = 0;
4533 else
4534 nstore[endp - startp] = 0;
4535 add_prefix (&startfile_prefixes, nstore, NULL,
4536 PREFIX_PRIORITY_LAST, 0, 1);
4537 if (*endp == 0)
4538 break;
4539 endp = startp = endp + 1;
4541 else
4542 endp++;
4546 /* Process the options and store input files and switches in their
4547 vectors. */
4549 last_language_n_infiles = -1;
4551 set_option_handlers (&handlers);
4553 for (j = 1; j < decoded_options_count; j++)
4555 switch (decoded_options[j].opt_index)
4557 case OPT_S:
4558 case OPT_c:
4559 case OPT_E:
4560 have_c = 1;
4561 break;
4563 if (have_c)
4564 break;
4567 for (j = 1; j < decoded_options_count; j++)
4569 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4571 const char *arg = decoded_options[j].arg;
4572 const char *p = strrchr (arg, '@');
4573 char *fname;
4574 long offset;
4575 int consumed;
4576 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4577 arg = convert_filename (arg, 0, access (arg, F_OK));
4578 #endif
4579 /* For LTO static archive support we handle input file
4580 specifications that are composed of a filename and
4581 an offset like FNAME@OFFSET. */
4582 if (p
4583 && p != arg
4584 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4585 && strlen (p) == (unsigned int)consumed)
4587 fname = (char *)xmalloc (p - arg + 1);
4588 memcpy (fname, arg, p - arg);
4589 fname[p - arg] = '\0';
4590 /* Only accept non-stdin and existing FNAME parts, otherwise
4591 try with the full name. */
4592 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4594 free (fname);
4595 fname = xstrdup (arg);
4598 else
4599 fname = xstrdup (arg);
4601 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4603 bool resp = fname[0] == '@' && access (fname + 1, F_OK) < 0;
4604 error ("%s: %m", fname + resp);
4606 else
4607 add_infile (arg, spec_lang);
4609 free (fname);
4610 continue;
4613 read_cmdline_option (&global_options, &global_options_set,
4614 decoded_options + j, UNKNOWN_LOCATION,
4615 CL_DRIVER, &handlers, global_dc);
4618 /* If the user didn't specify any, default to all configured offload
4619 targets. */
4620 if (ENABLE_OFFLOADING && offload_targets == NULL)
4621 handle_foffload_option (OFFLOAD_TARGETS);
4623 if (output_file
4624 && strcmp (output_file, "-") != 0
4625 && strcmp (output_file, HOST_BIT_BUCKET) != 0)
4627 int i;
4628 for (i = 0; i < n_infiles; i++)
4629 if ((!infiles[i].language || infiles[i].language[0] != '*')
4630 && canonical_filename_eq (infiles[i].name, output_file))
4631 fatal_error (input_location,
4632 "input file %qs is the same as output file",
4633 output_file);
4636 if (output_file != NULL && output_file[0] == '\0')
4637 fatal_error (input_location, "output filename may not be empty");
4639 /* If -save-temps=obj and -o name, create the prefix to use for %b.
4640 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
4641 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4643 save_temps_length = strlen (save_temps_prefix);
4644 temp = strrchr (lbasename (save_temps_prefix), '.');
4645 if (temp)
4647 save_temps_length -= strlen (temp);
4648 save_temps_prefix[save_temps_length] = '\0';
4652 else if (save_temps_prefix != NULL)
4654 free (save_temps_prefix);
4655 save_temps_prefix = NULL;
4658 if (save_temps_flag && use_pipes)
4660 /* -save-temps overrides -pipe, so that temp files are produced */
4661 if (save_temps_flag)
4662 warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
4663 use_pipes = 0;
4666 if (!compare_debug)
4668 const char *gcd = env.get ("GCC_COMPARE_DEBUG");
4670 if (gcd && gcd[0] == '-')
4672 compare_debug = 2;
4673 compare_debug_opt = gcd;
4675 else if (gcd && *gcd && strcmp (gcd, "0"))
4677 compare_debug = 3;
4678 compare_debug_opt = "-gtoggle";
4681 else if (compare_debug < 0)
4683 compare_debug = 0;
4684 gcc_assert (!compare_debug_opt);
4687 /* Set up the search paths. We add directories that we expect to
4688 contain GNU Toolchain components before directories specified by
4689 the machine description so that we will find GNU components (like
4690 the GNU assembler) before those of the host system. */
4692 /* If we don't know where the toolchain has been installed, use the
4693 configured-in locations. */
4694 if (!gcc_exec_prefix)
4696 #ifndef OS2
4697 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4698 PREFIX_PRIORITY_LAST, 1, 0);
4699 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4700 PREFIX_PRIORITY_LAST, 2, 0);
4701 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4702 PREFIX_PRIORITY_LAST, 2, 0);
4703 #endif
4704 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4705 PREFIX_PRIORITY_LAST, 1, 0);
4708 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4709 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
4710 dir_separator_str, NULL);
4712 /* Look for tools relative to the location from which the driver is
4713 running, or, if that is not available, the configured prefix. */
4714 tooldir_prefix
4715 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4716 spec_host_machine, dir_separator_str, spec_version,
4717 accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL);
4718 free (tooldir_prefix2);
4720 add_prefix (&exec_prefixes,
4721 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4722 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4723 add_prefix (&startfile_prefixes,
4724 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4725 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4726 free (tooldir_prefix);
4728 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4729 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4730 then consider it to relocate with the rest of the GCC installation
4731 if GCC_EXEC_PREFIX is set.
4732 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4733 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4735 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
4736 standard_bindir_prefix,
4737 target_system_root);
4738 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4740 target_system_root = tmp_prefix;
4741 target_system_root_changed = 1;
4744 #endif
4746 /* More prefixes are enabled in main, after we read the specs file
4747 and determine whether this is cross-compilation or not. */
4749 if (n_infiles != 0 && n_infiles == last_language_n_infiles && spec_lang != 0)
4750 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4752 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4753 environment variable. */
4754 if (compare_debug == 2 || compare_debug == 3)
4756 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4757 save_switch (opt, 0, NULL, false, true);
4758 compare_debug = 1;
4761 /* Ensure we only invoke each subprocess once. */
4762 if (n_infiles == 0
4763 && (print_subprocess_help || print_help_list || print_version))
4765 /* Create a dummy input file, so that we can pass
4766 the help option on to the various sub-processes. */
4767 add_infile ("help-dummy", "c");
4770 /* Decide if undefined variable references are allowed in specs. */
4772 /* -v alone is safe. --version and --help alone or together are safe. Note
4773 that -v would make them unsafe, as they'd then be run for subprocesses as
4774 well, the location of which might depend on variables possibly coming
4775 from self-specs. Note also that the command name is counted in
4776 decoded_options_count. */
4778 unsigned help_version_count = 0;
4780 if (print_version)
4781 help_version_count++;
4783 if (print_help_list)
4784 help_version_count++;
4786 spec_undefvar_allowed =
4787 ((verbose_flag && decoded_options_count == 2)
4788 || help_version_count == decoded_options_count - 1);
4790 alloc_switch ();
4791 switches[n_switches].part1 = 0;
4792 alloc_infile ();
4793 infiles[n_infiles].name = 0;
4796 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4797 and place that in the environment. */
4799 static void
4800 set_collect_gcc_options (void)
4802 int i;
4803 int first_time;
4805 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4806 the compiler. */
4807 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4808 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4810 first_time = TRUE;
4811 for (i = 0; (int) i < n_switches; i++)
4813 const char *const *args;
4814 const char *p, *q;
4815 if (!first_time)
4816 obstack_grow (&collect_obstack, " ", 1);
4818 first_time = FALSE;
4820 /* Ignore elided switches. */
4821 if ((switches[i].live_cond
4822 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4823 == SWITCH_IGNORE)
4824 continue;
4826 obstack_grow (&collect_obstack, "'-", 2);
4827 q = switches[i].part1;
4828 while ((p = strchr (q, '\'')))
4830 obstack_grow (&collect_obstack, q, p - q);
4831 obstack_grow (&collect_obstack, "'\\''", 4);
4832 q = ++p;
4834 obstack_grow (&collect_obstack, q, strlen (q));
4835 obstack_grow (&collect_obstack, "'", 1);
4837 for (args = switches[i].args; args && *args; args++)
4839 obstack_grow (&collect_obstack, " '", 2);
4840 q = *args;
4841 while ((p = strchr (q, '\'')))
4843 obstack_grow (&collect_obstack, q, p - q);
4844 obstack_grow (&collect_obstack, "'\\''", 4);
4845 q = ++p;
4847 obstack_grow (&collect_obstack, q, strlen (q));
4848 obstack_grow (&collect_obstack, "'", 1);
4851 obstack_grow (&collect_obstack, "\0", 1);
4852 xputenv (XOBFINISH (&collect_obstack, char *));
4855 /* Process a spec string, accumulating and running commands. */
4857 /* These variables describe the input file name.
4858 input_file_number is the index on outfiles of this file,
4859 so that the output file name can be stored for later use by %o.
4860 input_basename is the start of the part of the input file
4861 sans all directory names, and basename_length is the number
4862 of characters starting there excluding the suffix .c or whatever. */
4864 static const char *gcc_input_filename;
4865 static int input_file_number;
4866 size_t input_filename_length;
4867 static int basename_length;
4868 static int suffixed_basename_length;
4869 static const char *input_basename;
4870 static const char *input_suffix;
4871 #ifndef HOST_LACKS_INODE_NUMBERS
4872 static struct stat input_stat;
4873 #endif
4874 static int input_stat_set;
4876 /* The compiler used to process the current input file. */
4877 static struct compiler *input_file_compiler;
4879 /* These are variables used within do_spec and do_spec_1. */
4881 /* Nonzero if an arg has been started and not yet terminated
4882 (with space, tab or newline). */
4883 static int arg_going;
4885 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4886 is a temporary file name. */
4887 static int delete_this_arg;
4889 /* Nonzero means %w has been seen; the next arg to be terminated
4890 is the output file name of this compilation. */
4891 static int this_is_output_file;
4893 /* Nonzero means %s has been seen; the next arg to be terminated
4894 is the name of a library file and we should try the standard
4895 search dirs for it. */
4896 static int this_is_library_file;
4898 /* Nonzero means %T has been seen; the next arg to be terminated
4899 is the name of a linker script and we should try all of the
4900 standard search dirs for it. If it is found insert a --script
4901 command line switch and then substitute the full path in place,
4902 otherwise generate an error message. */
4903 static int this_is_linker_script;
4905 /* Nonzero means that the input of this command is coming from a pipe. */
4906 static int input_from_pipe;
4908 /* Nonnull means substitute this for any suffix when outputting a switches
4909 arguments. */
4910 static const char *suffix_subst;
4912 /* If there is an argument being accumulated, terminate it and store it. */
4914 static void
4915 end_going_arg (void)
4917 if (arg_going)
4919 const char *string;
4921 obstack_1grow (&obstack, 0);
4922 string = XOBFINISH (&obstack, const char *);
4923 if (this_is_library_file)
4924 string = find_file (string);
4925 if (this_is_linker_script)
4927 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4929 if (full_script_path == NULL)
4931 error ("unable to locate default linker script %qs in the library search paths", string);
4932 /* Script was not found on search path. */
4933 return;
4935 store_arg ("--script", false, false);
4936 string = full_script_path;
4938 store_arg (string, delete_this_arg, this_is_output_file);
4939 if (this_is_output_file)
4940 outfiles[input_file_number] = string;
4941 arg_going = 0;
4946 /* Parse the WRAPPER string which is a comma separated list of the command line
4947 and insert them into the beginning of argbuf. */
4949 static void
4950 insert_wrapper (const char *wrapper)
4952 int n = 0;
4953 int i;
4954 char *buf = xstrdup (wrapper);
4955 char *p = buf;
4956 unsigned int old_length = argbuf.length ();
4960 n++;
4961 while (*p == ',')
4962 p++;
4964 while ((p = strchr (p, ',')) != NULL);
4966 argbuf.safe_grow (old_length + n);
4967 memmove (argbuf.address () + n,
4968 argbuf.address (),
4969 old_length * sizeof (const_char_p));
4971 i = 0;
4972 p = buf;
4975 while (*p == ',')
4977 *p = 0;
4978 p++;
4980 argbuf[i] = p;
4981 i++;
4983 while ((p = strchr (p, ',')) != NULL);
4984 gcc_assert (i == n);
4987 /* Process the spec SPEC and run the commands specified therein.
4988 Returns 0 if the spec is successfully processed; -1 if failed. */
4991 do_spec (const char *spec)
4993 int value;
4995 value = do_spec_2 (spec, NULL);
4997 /* Force out any unfinished command.
4998 If -pipe, this forces out the last command if it ended in `|'. */
4999 if (value == 0)
5001 if (argbuf.length () > 0
5002 && !strcmp (argbuf.last (), "|"))
5003 argbuf.pop ();
5005 set_collect_gcc_options ();
5007 if (argbuf.length () > 0)
5008 value = execute ();
5011 return value;
5014 /* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
5015 of a matched * pattern which may be re-injected by way of %*. */
5017 static int
5018 do_spec_2 (const char *spec, const char *soft_matched_part)
5020 int result;
5022 clear_args ();
5023 arg_going = 0;
5024 delete_this_arg = 0;
5025 this_is_output_file = 0;
5026 this_is_library_file = 0;
5027 this_is_linker_script = 0;
5028 input_from_pipe = 0;
5029 suffix_subst = NULL;
5031 result = do_spec_1 (spec, 0, soft_matched_part);
5033 end_going_arg ();
5035 return result;
5038 /* Process the given spec string and add any new options to the end
5039 of the switches/n_switches array. */
5041 static void
5042 do_option_spec (const char *name, const char *spec)
5044 unsigned int i, value_count, value_len;
5045 const char *p, *q, *value;
5046 char *tmp_spec, *tmp_spec_p;
5048 if (configure_default_options[0].name == NULL)
5049 return;
5051 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
5052 if (strcmp (configure_default_options[i].name, name) == 0)
5053 break;
5054 if (i == ARRAY_SIZE (configure_default_options))
5055 return;
5057 value = configure_default_options[i].value;
5058 value_len = strlen (value);
5060 /* Compute the size of the final spec. */
5061 value_count = 0;
5062 p = spec;
5063 while ((p = strstr (p, "%(VALUE)")) != NULL)
5065 p ++;
5066 value_count ++;
5069 /* Replace each %(VALUE) by the specified value. */
5070 tmp_spec = (char *) alloca (strlen (spec) + 1
5071 + value_count * (value_len - strlen ("%(VALUE)")));
5072 tmp_spec_p = tmp_spec;
5073 q = spec;
5074 while ((p = strstr (q, "%(VALUE)")) != NULL)
5076 memcpy (tmp_spec_p, q, p - q);
5077 tmp_spec_p = tmp_spec_p + (p - q);
5078 memcpy (tmp_spec_p, value, value_len);
5079 tmp_spec_p += value_len;
5080 q = p + strlen ("%(VALUE)");
5082 strcpy (tmp_spec_p, q);
5084 do_self_spec (tmp_spec);
5087 /* Process the given spec string and add any new options to the end
5088 of the switches/n_switches array. */
5090 static void
5091 do_self_spec (const char *spec)
5093 int i;
5095 do_spec_2 (spec, NULL);
5096 do_spec_1 (" ", 0, NULL);
5098 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
5099 do_self_specs adds the replacements to switches array, so it shouldn't
5100 be processed afterwards. */
5101 for (i = 0; i < n_switches; i++)
5102 if ((switches[i].live_cond & SWITCH_IGNORE))
5103 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
5105 if (argbuf.length () > 0)
5107 const char **argbuf_copy;
5108 struct cl_decoded_option *decoded_options;
5109 struct cl_option_handlers handlers;
5110 unsigned int decoded_options_count;
5111 unsigned int j;
5113 /* Create a copy of argbuf with a dummy argv[0] entry for
5114 decode_cmdline_options_to_array. */
5115 argbuf_copy = XNEWVEC (const char *,
5116 argbuf.length () + 1);
5117 argbuf_copy[0] = "";
5118 memcpy (argbuf_copy + 1, argbuf.address (),
5119 argbuf.length () * sizeof (const char *));
5121 decode_cmdline_options_to_array (argbuf.length () + 1,
5122 argbuf_copy,
5123 CL_DRIVER, &decoded_options,
5124 &decoded_options_count);
5125 free (argbuf_copy);
5127 set_option_handlers (&handlers);
5129 for (j = 1; j < decoded_options_count; j++)
5131 switch (decoded_options[j].opt_index)
5133 case OPT_SPECIAL_input_file:
5134 /* Specs should only generate options, not input
5135 files. */
5136 if (strcmp (decoded_options[j].arg, "-") != 0)
5137 fatal_error (input_location,
5138 "switch %qs does not start with %<-%>",
5139 decoded_options[j].arg);
5140 else
5141 fatal_error (input_location,
5142 "spec-generated switch is just %<-%>");
5143 break;
5145 case OPT_fcompare_debug_second:
5146 case OPT_fcompare_debug:
5147 case OPT_fcompare_debug_:
5148 case OPT_o:
5149 /* Avoid duplicate processing of some options from
5150 compare-debug specs; just save them here. */
5151 save_switch (decoded_options[j].canonical_option[0],
5152 (decoded_options[j].canonical_option_num_elements
5153 - 1),
5154 &decoded_options[j].canonical_option[1], false, true);
5155 break;
5157 default:
5158 read_cmdline_option (&global_options, &global_options_set,
5159 decoded_options + j, UNKNOWN_LOCATION,
5160 CL_DRIVER, &handlers, global_dc);
5161 break;
5165 free (decoded_options);
5167 alloc_switch ();
5168 switches[n_switches].part1 = 0;
5172 /* Callback for processing %D and %I specs. */
5174 struct spec_path_info {
5175 const char *option;
5176 const char *append;
5177 size_t append_len;
5178 bool omit_relative;
5179 bool separate_options;
5182 static void *
5183 spec_path (char *path, void *data)
5185 struct spec_path_info *info = (struct spec_path_info *) data;
5186 size_t len = 0;
5187 char save = 0;
5189 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
5190 return NULL;
5192 if (info->append_len != 0)
5194 len = strlen (path);
5195 memcpy (path + len, info->append, info->append_len + 1);
5198 if (!is_directory (path, true))
5199 return NULL;
5201 do_spec_1 (info->option, 1, NULL);
5202 if (info->separate_options)
5203 do_spec_1 (" ", 0, NULL);
5205 if (info->append_len == 0)
5207 len = strlen (path);
5208 save = path[len - 1];
5209 if (IS_DIR_SEPARATOR (path[len - 1]))
5210 path[len - 1] = '\0';
5213 do_spec_1 (path, 1, NULL);
5214 do_spec_1 (" ", 0, NULL);
5216 /* Must not damage the original path. */
5217 if (info->append_len == 0)
5218 path[len - 1] = save;
5220 return NULL;
5223 /* True if we should compile INFILE. */
5225 static bool
5226 compile_input_file_p (struct infile *infile)
5228 if ((!infile->language) || (infile->language[0] != '*'))
5229 if (infile->incompiler == input_file_compiler)
5230 return true;
5231 return false;
5234 /* Process each member of VEC as a spec. */
5236 static void
5237 do_specs_vec (vec<char_p> vec)
5239 unsigned ix;
5240 char *opt;
5242 FOR_EACH_VEC_ELT (vec, ix, opt)
5244 do_spec_1 (opt, 1, NULL);
5245 /* Make each accumulated option a separate argument. */
5246 do_spec_1 (" ", 0, NULL);
5250 /* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS. */
5252 static void
5253 putenv_COLLECT_AS_OPTIONS (vec<char_p> vec)
5255 if (vec.is_empty ())
5256 return;
5258 obstack_init (&collect_obstack);
5259 obstack_grow (&collect_obstack, "COLLECT_AS_OPTIONS=",
5260 strlen ("COLLECT_AS_OPTIONS="));
5262 char *opt;
5263 unsigned ix;
5265 FOR_EACH_VEC_ELT (vec, ix, opt)
5267 obstack_1grow (&collect_obstack, '\'');
5268 obstack_grow (&collect_obstack, opt, strlen (opt));
5269 obstack_1grow (&collect_obstack, '\'');
5270 if (ix < vec.length () - 1)
5271 obstack_1grow(&collect_obstack, ' ');
5274 obstack_1grow (&collect_obstack, '\0');
5275 xputenv (XOBFINISH (&collect_obstack, char *));
5278 /* Process the sub-spec SPEC as a portion of a larger spec.
5279 This is like processing a whole spec except that we do
5280 not initialize at the beginning and we do not supply a
5281 newline by default at the end.
5282 INSWITCH nonzero means don't process %-sequences in SPEC;
5283 in this case, % is treated as an ordinary character.
5284 This is used while substituting switches.
5285 INSWITCH nonzero also causes SPC not to terminate an argument.
5287 Value is zero unless a line was finished
5288 and the command on that line reported an error. */
5290 static int
5291 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
5293 const char *p = spec;
5294 int c;
5295 int i;
5296 int value;
5298 /* If it's an empty string argument to a switch, keep it as is. */
5299 if (inswitch && !*p)
5300 arg_going = 1;
5302 while ((c = *p++))
5303 /* If substituting a switch, treat all chars like letters.
5304 Otherwise, NL, SPC, TAB and % are special. */
5305 switch (inswitch ? 'a' : c)
5307 case '\n':
5308 end_going_arg ();
5310 if (argbuf.length () > 0
5311 && !strcmp (argbuf.last (), "|"))
5313 /* A `|' before the newline means use a pipe here,
5314 but only if -pipe was specified.
5315 Otherwise, execute now and don't pass the `|' as an arg. */
5316 if (use_pipes)
5318 input_from_pipe = 1;
5319 break;
5321 else
5322 argbuf.pop ();
5325 set_collect_gcc_options ();
5327 if (argbuf.length () > 0)
5329 value = execute ();
5330 if (value)
5331 return value;
5333 /* Reinitialize for a new command, and for a new argument. */
5334 clear_args ();
5335 arg_going = 0;
5336 delete_this_arg = 0;
5337 this_is_output_file = 0;
5338 this_is_library_file = 0;
5339 this_is_linker_script = 0;
5340 input_from_pipe = 0;
5341 break;
5343 case '|':
5344 end_going_arg ();
5346 /* Use pipe */
5347 obstack_1grow (&obstack, c);
5348 arg_going = 1;
5349 break;
5351 case '\t':
5352 case ' ':
5353 end_going_arg ();
5355 /* Reinitialize for a new argument. */
5356 delete_this_arg = 0;
5357 this_is_output_file = 0;
5358 this_is_library_file = 0;
5359 this_is_linker_script = 0;
5360 break;
5362 case '%':
5363 switch (c = *p++)
5365 case 0:
5366 fatal_error (input_location, "spec %qs invalid", spec);
5368 case 'b':
5369 if (save_temps_length)
5370 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5371 else
5372 obstack_grow (&obstack, input_basename, basename_length);
5373 if (compare_debug < 0)
5374 obstack_grow (&obstack, ".gk", 3);
5375 arg_going = 1;
5376 break;
5378 case 'B':
5379 if (save_temps_length)
5380 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5381 else
5382 obstack_grow (&obstack, input_basename, suffixed_basename_length);
5383 if (compare_debug < 0)
5384 obstack_grow (&obstack, ".gk", 3);
5385 arg_going = 1;
5386 break;
5388 case 'd':
5389 delete_this_arg = 2;
5390 break;
5392 /* Dump out the directories specified with LIBRARY_PATH,
5393 followed by the absolute directories
5394 that we search for startfiles. */
5395 case 'D':
5397 struct spec_path_info info;
5399 info.option = "-L";
5400 info.append_len = 0;
5401 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
5402 /* Used on systems which record the specified -L dirs
5403 and use them to search for dynamic linking.
5404 Relative directories always come from -B,
5405 and it is better not to use them for searching
5406 at run time. In particular, stage1 loses. */
5407 info.omit_relative = true;
5408 #else
5409 info.omit_relative = false;
5410 #endif
5411 info.separate_options = false;
5413 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5415 break;
5417 case 'e':
5418 /* %efoo means report an error with `foo' as error message
5419 and don't execute any more commands for this file. */
5421 const char *q = p;
5422 char *buf;
5423 while (*p != 0 && *p != '\n')
5424 p++;
5425 buf = (char *) alloca (p - q + 1);
5426 strncpy (buf, q, p - q);
5427 buf[p - q] = 0;
5428 error ("%s", _(buf));
5429 return -1;
5431 break;
5432 case 'n':
5433 /* %nfoo means report a notice with `foo' on stderr. */
5435 const char *q = p;
5436 char *buf;
5437 while (*p != 0 && *p != '\n')
5438 p++;
5439 buf = (char *) alloca (p - q + 1);
5440 strncpy (buf, q, p - q);
5441 buf[p - q] = 0;
5442 inform (UNKNOWN_LOCATION, "%s", _(buf));
5443 if (*p)
5444 p++;
5446 break;
5448 case 'j':
5450 struct stat st;
5452 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
5453 defined, and it is not a directory, and it is
5454 writable, use it. Otherwise, treat this like any
5455 other temporary file. */
5457 if ((!save_temps_flag)
5458 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
5459 && (access (HOST_BIT_BUCKET, W_OK) == 0))
5461 obstack_grow (&obstack, HOST_BIT_BUCKET,
5462 strlen (HOST_BIT_BUCKET));
5463 delete_this_arg = 0;
5464 arg_going = 1;
5465 break;
5468 goto create_temp_file;
5469 case '|':
5470 if (use_pipes)
5472 obstack_1grow (&obstack, '-');
5473 delete_this_arg = 0;
5474 arg_going = 1;
5476 /* consume suffix */
5477 while (*p == '.' || ISALNUM ((unsigned char) *p))
5478 p++;
5479 if (p[0] == '%' && p[1] == 'O')
5480 p += 2;
5482 break;
5484 goto create_temp_file;
5485 case 'm':
5486 if (use_pipes)
5488 /* consume suffix */
5489 while (*p == '.' || ISALNUM ((unsigned char) *p))
5490 p++;
5491 if (p[0] == '%' && p[1] == 'O')
5492 p += 2;
5494 break;
5496 goto create_temp_file;
5497 case 'g':
5498 case 'u':
5499 case 'U':
5500 create_temp_file:
5502 struct temp_name *t;
5503 int suffix_length;
5504 const char *suffix = p;
5505 char *saved_suffix = NULL;
5507 while (*p == '.' || ISALNUM ((unsigned char) *p))
5508 p++;
5509 suffix_length = p - suffix;
5510 if (p[0] == '%' && p[1] == 'O')
5512 p += 2;
5513 /* We don't support extra suffix characters after %O. */
5514 if (*p == '.' || ISALNUM ((unsigned char) *p))
5515 fatal_error (input_location,
5516 "spec %qs has invalid %<%%0%c%>", spec, *p);
5517 if (suffix_length == 0)
5518 suffix = TARGET_OBJECT_SUFFIX;
5519 else
5521 saved_suffix
5522 = XNEWVEC (char, suffix_length
5523 + strlen (TARGET_OBJECT_SUFFIX) + 1);
5524 strncpy (saved_suffix, suffix, suffix_length);
5525 strcpy (saved_suffix + suffix_length,
5526 TARGET_OBJECT_SUFFIX);
5528 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5531 if (compare_debug < 0)
5533 suffix = concat (".gk", suffix, NULL);
5534 suffix_length += 3;
5537 /* If -save-temps=obj and -o were specified, use that for the
5538 temp file. */
5539 if (save_temps_length)
5541 char *tmp;
5542 temp_filename_length
5543 = save_temps_length + suffix_length + 1;
5544 tmp = (char *) alloca (temp_filename_length);
5545 memcpy (tmp, save_temps_prefix, save_temps_length);
5546 memcpy (tmp + save_temps_length, suffix, suffix_length);
5547 tmp[save_temps_length + suffix_length] = '\0';
5548 temp_filename = save_string (tmp, save_temps_length
5549 + suffix_length);
5550 obstack_grow (&obstack, temp_filename,
5551 temp_filename_length);
5552 arg_going = 1;
5553 delete_this_arg = 0;
5554 break;
5557 /* If the gcc_input_filename has the same suffix specified
5558 for the %g, %u, or %U, and -save-temps is specified,
5559 we could end up using that file as an intermediate
5560 thus clobbering the user's source file (.e.g.,
5561 gcc -save-temps foo.s would clobber foo.s with the
5562 output of cpp0). So check for this condition and
5563 generate a temp file as the intermediate. */
5565 if (save_temps_flag)
5567 char *tmp;
5568 temp_filename_length = basename_length + suffix_length + 1;
5569 tmp = (char *) alloca (temp_filename_length);
5570 memcpy (tmp, input_basename, basename_length);
5571 memcpy (tmp + basename_length, suffix, suffix_length);
5572 tmp[basename_length + suffix_length] = '\0';
5573 temp_filename = tmp;
5575 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
5577 #ifndef HOST_LACKS_INODE_NUMBERS
5578 struct stat st_temp;
5580 /* Note, set_input() resets input_stat_set to 0. */
5581 if (input_stat_set == 0)
5583 input_stat_set = stat (gcc_input_filename,
5584 &input_stat);
5585 if (input_stat_set >= 0)
5586 input_stat_set = 1;
5589 /* If we have the stat for the gcc_input_filename
5590 and we can do the stat for the temp_filename
5591 then the they could still refer to the same
5592 file if st_dev/st_ino's are the same. */
5593 if (input_stat_set != 1
5594 || stat (temp_filename, &st_temp) < 0
5595 || input_stat.st_dev != st_temp.st_dev
5596 || input_stat.st_ino != st_temp.st_ino)
5597 #else
5598 /* Just compare canonical pathnames. */
5599 char* input_realname = lrealpath (gcc_input_filename);
5600 char* temp_realname = lrealpath (temp_filename);
5601 bool files_differ = filename_cmp (input_realname, temp_realname);
5602 free (input_realname);
5603 free (temp_realname);
5604 if (files_differ)
5605 #endif
5607 temp_filename
5608 = save_string (temp_filename,
5609 temp_filename_length - 1);
5610 obstack_grow (&obstack, temp_filename,
5611 temp_filename_length);
5612 arg_going = 1;
5613 delete_this_arg = 0;
5614 break;
5619 /* See if we already have an association of %g/%u/%U and
5620 suffix. */
5621 for (t = temp_names; t; t = t->next)
5622 if (t->length == suffix_length
5623 && strncmp (t->suffix, suffix, suffix_length) == 0
5624 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5625 break;
5627 /* Make a new association if needed. %u and %j
5628 require one. */
5629 if (t == 0 || c == 'u' || c == 'j')
5631 if (t == 0)
5633 t = XNEW (struct temp_name);
5634 t->next = temp_names;
5635 temp_names = t;
5637 t->length = suffix_length;
5638 if (saved_suffix)
5640 t->suffix = saved_suffix;
5641 saved_suffix = NULL;
5643 else
5644 t->suffix = save_string (suffix, suffix_length);
5645 t->unique = (c == 'u' || c == 'U' || c == 'j');
5646 temp_filename = make_temp_file (t->suffix);
5647 temp_filename_length = strlen (temp_filename);
5648 t->filename = temp_filename;
5649 t->filename_length = temp_filename_length;
5652 free (saved_suffix);
5654 obstack_grow (&obstack, t->filename, t->filename_length);
5655 delete_this_arg = 1;
5657 arg_going = 1;
5658 break;
5660 case 'i':
5661 if (combine_inputs)
5663 /* We are going to expand `%i' into `@FILE', where FILE
5664 is a newly-created temporary filename. The filenames
5665 that would usually be expanded in place of %o will be
5666 written to the temporary file. */
5667 if (at_file_supplied)
5668 open_at_file ();
5670 for (i = 0; (int) i < n_infiles; i++)
5671 if (compile_input_file_p (&infiles[i]))
5673 store_arg (infiles[i].name, 0, 0);
5674 infiles[i].compiled = true;
5677 if (at_file_supplied)
5678 close_at_file ();
5680 else
5682 obstack_grow (&obstack, gcc_input_filename,
5683 input_filename_length);
5684 arg_going = 1;
5686 break;
5688 case 'I':
5690 struct spec_path_info info;
5692 if (multilib_dir)
5694 do_spec_1 ("-imultilib", 1, NULL);
5695 /* Make this a separate argument. */
5696 do_spec_1 (" ", 0, NULL);
5697 do_spec_1 (multilib_dir, 1, NULL);
5698 do_spec_1 (" ", 0, NULL);
5701 if (multiarch_dir)
5703 do_spec_1 ("-imultiarch", 1, NULL);
5704 /* Make this a separate argument. */
5705 do_spec_1 (" ", 0, NULL);
5706 do_spec_1 (multiarch_dir, 1, NULL);
5707 do_spec_1 (" ", 0, NULL);
5710 if (gcc_exec_prefix)
5712 do_spec_1 ("-iprefix", 1, NULL);
5713 /* Make this a separate argument. */
5714 do_spec_1 (" ", 0, NULL);
5715 do_spec_1 (gcc_exec_prefix, 1, NULL);
5716 do_spec_1 (" ", 0, NULL);
5719 if (target_system_root_changed ||
5720 (target_system_root && target_sysroot_hdrs_suffix))
5722 do_spec_1 ("-isysroot", 1, NULL);
5723 /* Make this a separate argument. */
5724 do_spec_1 (" ", 0, NULL);
5725 do_spec_1 (target_system_root, 1, NULL);
5726 if (target_sysroot_hdrs_suffix)
5727 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5728 do_spec_1 (" ", 0, NULL);
5731 info.option = "-isystem";
5732 info.append = "include";
5733 info.append_len = strlen (info.append);
5734 info.omit_relative = false;
5735 info.separate_options = true;
5737 for_each_path (&include_prefixes, false, info.append_len,
5738 spec_path, &info);
5740 info.append = "include-fixed";
5741 if (*sysroot_hdrs_suffix_spec)
5742 info.append = concat (info.append, dir_separator_str,
5743 multilib_dir, NULL);
5744 info.append_len = strlen (info.append);
5745 for_each_path (&include_prefixes, false, info.append_len,
5746 spec_path, &info);
5748 break;
5750 case 'o':
5751 /* We are going to expand `%o' into `@FILE', where FILE
5752 is a newly-created temporary filename. The filenames
5753 that would usually be expanded in place of %o will be
5754 written to the temporary file. */
5755 if (at_file_supplied)
5756 open_at_file ();
5758 for (i = 0; i < n_infiles + lang_specific_extra_outfiles; i++)
5759 if (outfiles[i])
5760 store_arg (outfiles[i], 0, 0);
5762 if (at_file_supplied)
5763 close_at_file ();
5764 break;
5766 case 'O':
5767 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5768 arg_going = 1;
5769 break;
5771 case 's':
5772 this_is_library_file = 1;
5773 break;
5775 case 'T':
5776 this_is_linker_script = 1;
5777 break;
5779 case 'V':
5780 outfiles[input_file_number] = NULL;
5781 break;
5783 case 'w':
5784 this_is_output_file = 1;
5785 break;
5787 case 'W':
5789 unsigned int cur_index = argbuf.length ();
5790 /* Handle the {...} following the %W. */
5791 if (*p != '{')
5792 fatal_error (input_location,
5793 "spec %qs has invalid %<%%W%c%>", spec, *p);
5794 p = handle_braces (p + 1);
5795 if (p == 0)
5796 return -1;
5797 end_going_arg ();
5798 /* If any args were output, mark the last one for deletion
5799 on failure. */
5800 if (argbuf.length () != cur_index)
5801 record_temp_file (argbuf.last (), 0, 1);
5802 break;
5805 case '@':
5806 /* Handle the {...} following the %@. */
5807 if (*p != '{')
5808 fatal_error (input_location,
5809 "spec %qs has invalid %<%%@%c%>", spec, *p);
5810 if (at_file_supplied)
5811 open_at_file ();
5812 p = handle_braces (p + 1);
5813 if (at_file_supplied)
5814 close_at_file ();
5815 if (p == 0)
5816 return -1;
5817 break;
5819 /* %x{OPTION} records OPTION for %X to output. */
5820 case 'x':
5822 const char *p1 = p;
5823 char *string;
5824 char *opt;
5825 unsigned ix;
5827 /* Skip past the option value and make a copy. */
5828 if (*p != '{')
5829 fatal_error (input_location,
5830 "spec %qs has invalid %<%%x%c%>", spec, *p);
5831 while (*p++ != '}')
5833 string = save_string (p1 + 1, p - p1 - 2);
5835 /* See if we already recorded this option. */
5836 FOR_EACH_VEC_ELT (linker_options, ix, opt)
5837 if (! strcmp (string, opt))
5839 free (string);
5840 return 0;
5843 /* This option is new; add it. */
5844 add_linker_option (string, strlen (string));
5845 free (string);
5847 break;
5849 /* Dump out the options accumulated previously using %x. */
5850 case 'X':
5851 do_specs_vec (linker_options);
5852 break;
5854 /* Dump out the options accumulated previously using -Wa,. */
5855 case 'Y':
5856 do_specs_vec (assembler_options);
5857 break;
5859 /* Dump out the options accumulated previously using -Wp,. */
5860 case 'Z':
5861 do_specs_vec (preprocessor_options);
5862 break;
5864 /* Here are digits and numbers that just process
5865 a certain constant string as a spec. */
5867 case '1':
5868 value = do_spec_1 (cc1_spec, 0, NULL);
5869 if (value != 0)
5870 return value;
5871 break;
5873 case '2':
5874 value = do_spec_1 (cc1plus_spec, 0, NULL);
5875 if (value != 0)
5876 return value;
5877 break;
5879 case 'a':
5880 value = do_spec_1 (asm_spec, 0, NULL);
5881 if (value != 0)
5882 return value;
5883 break;
5885 case 'A':
5886 value = do_spec_1 (asm_final_spec, 0, NULL);
5887 if (value != 0)
5888 return value;
5889 break;
5891 case 'C':
5893 const char *const spec
5894 = (input_file_compiler->cpp_spec
5895 ? input_file_compiler->cpp_spec
5896 : cpp_spec);
5897 value = do_spec_1 (spec, 0, NULL);
5898 if (value != 0)
5899 return value;
5901 break;
5903 case 'E':
5904 value = do_spec_1 (endfile_spec, 0, NULL);
5905 if (value != 0)
5906 return value;
5907 break;
5909 case 'l':
5910 value = do_spec_1 (link_spec, 0, NULL);
5911 if (value != 0)
5912 return value;
5913 break;
5915 case 'L':
5916 value = do_spec_1 (lib_spec, 0, NULL);
5917 if (value != 0)
5918 return value;
5919 break;
5921 case 'M':
5922 if (multilib_os_dir == NULL)
5923 obstack_1grow (&obstack, '.');
5924 else
5925 obstack_grow (&obstack, multilib_os_dir,
5926 strlen (multilib_os_dir));
5927 break;
5929 case 'G':
5930 value = do_spec_1 (libgcc_spec, 0, NULL);
5931 if (value != 0)
5932 return value;
5933 break;
5935 case 'R':
5936 /* We assume there is a directory
5937 separator at the end of this string. */
5938 if (target_system_root)
5940 obstack_grow (&obstack, target_system_root,
5941 strlen (target_system_root));
5942 if (target_sysroot_suffix)
5943 obstack_grow (&obstack, target_sysroot_suffix,
5944 strlen (target_sysroot_suffix));
5946 break;
5948 case 'S':
5949 value = do_spec_1 (startfile_spec, 0, NULL);
5950 if (value != 0)
5951 return value;
5952 break;
5954 /* Here we define characters other than letters and digits. */
5956 case '{':
5957 p = handle_braces (p);
5958 if (p == 0)
5959 return -1;
5960 break;
5962 case ':':
5963 p = handle_spec_function (p, NULL, soft_matched_part);
5964 if (p == 0)
5965 return -1;
5966 break;
5968 case '%':
5969 obstack_1grow (&obstack, '%');
5970 break;
5972 case '.':
5974 unsigned len = 0;
5976 while (p[len] && p[len] != ' ' && p[len] != '%')
5977 len++;
5978 suffix_subst = save_string (p - 1, len + 1);
5979 p += len;
5981 break;
5983 /* Henceforth ignore the option(s) matching the pattern
5984 after the %<. */
5985 case '<':
5986 case '>':
5988 unsigned len = 0;
5989 int have_wildcard = 0;
5990 int i;
5991 int switch_option;
5993 if (c == '>')
5994 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
5995 else
5996 switch_option = SWITCH_IGNORE;
5998 while (p[len] && p[len] != ' ' && p[len] != '\t')
5999 len++;
6001 if (p[len-1] == '*')
6002 have_wildcard = 1;
6004 for (i = 0; i < n_switches; i++)
6005 if (!strncmp (switches[i].part1, p, len - have_wildcard)
6006 && (have_wildcard || switches[i].part1[len] == '\0'))
6008 switches[i].live_cond |= switch_option;
6009 /* User switch be validated from validate_all_switches.
6010 when the definition is seen from the spec file.
6011 If not defined anywhere, will be rejected. */
6012 if (switches[i].known)
6013 switches[i].validated = true;
6016 p += len;
6018 break;
6020 case '*':
6021 if (soft_matched_part)
6023 if (soft_matched_part[0])
6024 do_spec_1 (soft_matched_part, 1, NULL);
6025 /* Only insert a space after the substitution if it is at the
6026 end of the current sequence. So if:
6028 "%{foo=*:bar%*}%{foo=*:one%*two}"
6030 matches -foo=hello then it will produce:
6032 barhello onehellotwo
6034 if (*p == 0 || *p == '}')
6035 do_spec_1 (" ", 0, NULL);
6037 else
6038 /* Catch the case where a spec string contains something like
6039 '%{foo:%*}'. i.e. there is no * in the pattern on the left
6040 hand side of the :. */
6041 error ("spec failure: %<%%*%> has not been initialized by pattern match");
6042 break;
6044 /* Process a string found as the value of a spec given by name.
6045 This feature allows individual machine descriptions
6046 to add and use their own specs. */
6047 case '(':
6049 const char *name = p;
6050 struct spec_list *sl;
6051 int len;
6053 /* The string after the S/P is the name of a spec that is to be
6054 processed. */
6055 while (*p && *p != ')')
6056 p++;
6058 /* See if it's in the list. */
6059 for (len = p - name, sl = specs; sl; sl = sl->next)
6060 if (sl->name_len == len && !strncmp (sl->name, name, len))
6062 name = *(sl->ptr_spec);
6063 #ifdef DEBUG_SPECS
6064 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
6065 sl->name, name);
6066 #endif
6067 break;
6070 if (sl)
6072 value = do_spec_1 (name, 0, NULL);
6073 if (value != 0)
6074 return value;
6077 /* Discard the closing paren. */
6078 if (*p)
6079 p++;
6081 break;
6083 default:
6084 error ("spec failure: unrecognized spec option %qc", c);
6085 break;
6087 break;
6089 case '\\':
6090 /* Backslash: treat next character as ordinary. */
6091 c = *p++;
6093 /* Fall through. */
6094 default:
6095 /* Ordinary character: put it into the current argument. */
6096 obstack_1grow (&obstack, c);
6097 arg_going = 1;
6100 /* End of string. If we are processing a spec function, we need to
6101 end any pending argument. */
6102 if (processing_spec_function)
6103 end_going_arg ();
6105 return 0;
6108 /* Look up a spec function. */
6110 static const struct spec_function *
6111 lookup_spec_function (const char *name)
6113 const struct spec_function *sf;
6115 for (sf = static_spec_functions; sf->name != NULL; sf++)
6116 if (strcmp (sf->name, name) == 0)
6117 return sf;
6119 return NULL;
6122 /* Evaluate a spec function. */
6124 static const char *
6125 eval_spec_function (const char *func, const char *args,
6126 const char *soft_matched_part)
6128 const struct spec_function *sf;
6129 const char *funcval;
6131 /* Saved spec processing context. */
6132 vec<const_char_p> save_argbuf;
6134 int save_arg_going;
6135 int save_delete_this_arg;
6136 int save_this_is_output_file;
6137 int save_this_is_library_file;
6138 int save_input_from_pipe;
6139 int save_this_is_linker_script;
6140 const char *save_suffix_subst;
6142 int save_growing_size;
6143 void *save_growing_value = NULL;
6145 sf = lookup_spec_function (func);
6146 if (sf == NULL)
6147 fatal_error (input_location, "unknown spec function %qs", func);
6149 /* Push the spec processing context. */
6150 save_argbuf = argbuf;
6152 save_arg_going = arg_going;
6153 save_delete_this_arg = delete_this_arg;
6154 save_this_is_output_file = this_is_output_file;
6155 save_this_is_library_file = this_is_library_file;
6156 save_this_is_linker_script = this_is_linker_script;
6157 save_input_from_pipe = input_from_pipe;
6158 save_suffix_subst = suffix_subst;
6160 /* If we have some object growing now, finalize it so the args and function
6161 eval proceed from a cleared context. This is needed to prevent the first
6162 constructed arg from mistakenly including the growing value. We'll push
6163 this value back on the obstack once the function evaluation is done, to
6164 restore a consistent processing context for our caller. This is fine as
6165 the address of growing objects isn't guaranteed to remain stable until
6166 they are finalized, and we expect this situation to be rare enough for
6167 the extra copy not to be an issue. */
6168 save_growing_size = obstack_object_size (&obstack);
6169 if (save_growing_size > 0)
6170 save_growing_value = obstack_finish (&obstack);
6172 /* Create a new spec processing context, and build the function
6173 arguments. */
6175 alloc_args ();
6176 if (do_spec_2 (args, soft_matched_part) < 0)
6177 fatal_error (input_location, "error in arguments to spec function %qs",
6178 func);
6180 /* argbuf_index is an index for the next argument to be inserted, and
6181 so contains the count of the args already inserted. */
6183 funcval = (*sf->func) (argbuf.length (),
6184 argbuf.address ());
6186 /* Pop the spec processing context. */
6187 argbuf.release ();
6188 argbuf = save_argbuf;
6190 arg_going = save_arg_going;
6191 delete_this_arg = save_delete_this_arg;
6192 this_is_output_file = save_this_is_output_file;
6193 this_is_library_file = save_this_is_library_file;
6194 this_is_linker_script = save_this_is_linker_script;
6195 input_from_pipe = save_input_from_pipe;
6196 suffix_subst = save_suffix_subst;
6198 if (save_growing_size > 0)
6199 obstack_grow (&obstack, save_growing_value, save_growing_size);
6201 return funcval;
6204 /* Handle a spec function call of the form:
6206 %:function(args)
6208 ARGS is processed as a spec in a separate context and split into an
6209 argument vector in the normal fashion. The function returns a string
6210 containing a spec which we then process in the caller's context, or
6211 NULL if no processing is required.
6213 If RETVAL_NONNULL is not NULL, then store a bool whether function
6214 returned non-NULL.
6216 SOFT_MATCHED_PART holds the current value of a matched * pattern, which
6217 may be re-expanded with a %* as part of the function arguments. */
6219 static const char *
6220 handle_spec_function (const char *p, bool *retval_nonnull,
6221 const char *soft_matched_part)
6223 char *func, *args;
6224 const char *endp, *funcval;
6225 int count;
6227 processing_spec_function++;
6229 /* Get the function name. */
6230 for (endp = p; *endp != '\0'; endp++)
6232 if (*endp == '(') /* ) */
6233 break;
6234 /* Only allow [A-Za-z0-9], -, and _ in function names. */
6235 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
6236 fatal_error (input_location, "malformed spec function name");
6238 if (*endp != '(') /* ) */
6239 fatal_error (input_location, "no arguments for spec function");
6240 func = save_string (p, endp - p);
6241 p = ++endp;
6243 /* Get the arguments. */
6244 for (count = 0; *endp != '\0'; endp++)
6246 /* ( */
6247 if (*endp == ')')
6249 if (count == 0)
6250 break;
6251 count--;
6253 else if (*endp == '(') /* ) */
6254 count++;
6256 /* ( */
6257 if (*endp != ')')
6258 fatal_error (input_location, "malformed spec function arguments");
6259 args = save_string (p, endp - p);
6260 p = ++endp;
6262 /* p now points to just past the end of the spec function expression. */
6264 funcval = eval_spec_function (func, args, soft_matched_part);
6265 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
6266 p = NULL;
6267 if (retval_nonnull)
6268 *retval_nonnull = funcval != NULL;
6270 free (func);
6271 free (args);
6273 processing_spec_function--;
6275 return p;
6278 /* Inline subroutine of handle_braces. Returns true if the current
6279 input suffix matches the atom bracketed by ATOM and END_ATOM. */
6280 static inline bool
6281 input_suffix_matches (const char *atom, const char *end_atom)
6283 return (input_suffix
6284 && !strncmp (input_suffix, atom, end_atom - atom)
6285 && input_suffix[end_atom - atom] == '\0');
6288 /* Subroutine of handle_braces. Returns true if the current
6289 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
6290 static bool
6291 input_spec_matches (const char *atom, const char *end_atom)
6293 return (input_file_compiler
6294 && input_file_compiler->suffix
6295 && input_file_compiler->suffix[0] != '\0'
6296 && !strncmp (input_file_compiler->suffix + 1, atom,
6297 end_atom - atom)
6298 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
6301 /* Subroutine of handle_braces. Returns true if a switch
6302 matching the atom bracketed by ATOM and END_ATOM appeared on the
6303 command line. */
6304 static bool
6305 switch_matches (const char *atom, const char *end_atom, int starred)
6307 int i;
6308 int len = end_atom - atom;
6309 int plen = starred ? len : -1;
6311 for (i = 0; i < n_switches; i++)
6312 if (!strncmp (switches[i].part1, atom, len)
6313 && (starred || switches[i].part1[len] == '\0')
6314 && check_live_switch (i, plen))
6315 return true;
6317 /* Check if a switch with separated form matching the atom.
6318 We check -D and -U switches. */
6319 else if (switches[i].args != 0)
6321 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
6322 && *switches[i].part1 == atom[0])
6324 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
6325 && (starred || (switches[i].part1[1] == '\0'
6326 && switches[i].args[0][len - 1] == '\0'))
6327 && check_live_switch (i, (starred ? 1 : -1)))
6328 return true;
6332 return false;
6335 /* Inline subroutine of handle_braces. Mark all of the switches which
6336 match ATOM (extends to END_ATOM; STARRED indicates whether there
6337 was a star after the atom) for later processing. */
6338 static inline void
6339 mark_matching_switches (const char *atom, const char *end_atom, int starred)
6341 int i;
6342 int len = end_atom - atom;
6343 int plen = starred ? len : -1;
6345 for (i = 0; i < n_switches; i++)
6346 if (!strncmp (switches[i].part1, atom, len)
6347 && (starred || switches[i].part1[len] == '\0')
6348 && check_live_switch (i, plen))
6349 switches[i].ordering = 1;
6352 /* Inline subroutine of handle_braces. Process all the currently
6353 marked switches through give_switch, and clear the marks. */
6354 static inline void
6355 process_marked_switches (void)
6357 int i;
6359 for (i = 0; i < n_switches; i++)
6360 if (switches[i].ordering == 1)
6362 switches[i].ordering = 0;
6363 give_switch (i, 0);
6367 /* Handle a %{ ... } construct. P points just inside the leading {.
6368 Returns a pointer one past the end of the brace block, or 0
6369 if we call do_spec_1 and that returns -1. */
6371 static const char *
6372 handle_braces (const char *p)
6374 const char *atom, *end_atom;
6375 const char *d_atom = NULL, *d_end_atom = NULL;
6376 char *esc_buf = NULL, *d_esc_buf = NULL;
6377 int esc;
6378 const char *orig = p;
6380 bool a_is_suffix;
6381 bool a_is_spectype;
6382 bool a_is_starred;
6383 bool a_is_negated;
6384 bool a_matched;
6386 bool a_must_be_last = false;
6387 bool ordered_set = false;
6388 bool disjunct_set = false;
6389 bool disj_matched = false;
6390 bool disj_starred = true;
6391 bool n_way_choice = false;
6392 bool n_way_matched = false;
6394 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6398 if (a_must_be_last)
6399 goto invalid;
6401 /* Scan one "atom" (S in the description above of %{}, possibly
6402 with '!', '.', '@', ',', or '*' modifiers). */
6403 a_matched = false;
6404 a_is_suffix = false;
6405 a_is_starred = false;
6406 a_is_negated = false;
6407 a_is_spectype = false;
6409 SKIP_WHITE ();
6410 if (*p == '!')
6411 p++, a_is_negated = true;
6413 SKIP_WHITE ();
6414 if (*p == '%' && p[1] == ':')
6416 atom = NULL;
6417 end_atom = NULL;
6418 p = handle_spec_function (p + 2, &a_matched, NULL);
6420 else
6422 if (*p == '.')
6423 p++, a_is_suffix = true;
6424 else if (*p == ',')
6425 p++, a_is_spectype = true;
6427 atom = p;
6428 esc = 0;
6429 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
6430 || *p == ',' || *p == '.' || *p == '@' || *p == '\\')
6432 if (*p == '\\')
6434 p++;
6435 if (!*p)
6436 fatal_error (input_location,
6437 "braced spec %qs ends in escape", orig);
6438 esc++;
6440 p++;
6442 end_atom = p;
6444 if (esc)
6446 const char *ap;
6447 char *ep;
6449 if (esc_buf && esc_buf != d_esc_buf)
6450 free (esc_buf);
6451 esc_buf = NULL;
6452 ep = esc_buf = (char *) xmalloc (end_atom - atom - esc + 1);
6453 for (ap = atom; ap != end_atom; ap++, ep++)
6455 if (*ap == '\\')
6456 ap++;
6457 *ep = *ap;
6459 *ep = '\0';
6460 atom = esc_buf;
6461 end_atom = ep;
6464 if (*p == '*')
6465 p++, a_is_starred = 1;
6468 SKIP_WHITE ();
6469 switch (*p)
6471 case '&': case '}':
6472 /* Substitute the switch(es) indicated by the current atom. */
6473 ordered_set = true;
6474 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
6475 || a_is_spectype || atom == end_atom)
6476 goto invalid;
6478 mark_matching_switches (atom, end_atom, a_is_starred);
6480 if (*p == '}')
6481 process_marked_switches ();
6482 break;
6484 case '|': case ':':
6485 /* Substitute some text if the current atom appears as a switch
6486 or suffix. */
6487 disjunct_set = true;
6488 if (ordered_set)
6489 goto invalid;
6491 if (atom && atom == end_atom)
6493 if (!n_way_choice || disj_matched || *p == '|'
6494 || a_is_negated || a_is_suffix || a_is_spectype
6495 || a_is_starred)
6496 goto invalid;
6498 /* An empty term may appear as the last choice of an
6499 N-way choice set; it means "otherwise". */
6500 a_must_be_last = true;
6501 disj_matched = !n_way_matched;
6502 disj_starred = false;
6504 else
6506 if ((a_is_suffix || a_is_spectype) && a_is_starred)
6507 goto invalid;
6509 if (!a_is_starred)
6510 disj_starred = false;
6512 /* Don't bother testing this atom if we already have a
6513 match. */
6514 if (!disj_matched && !n_way_matched)
6516 if (atom == NULL)
6517 /* a_matched is already set by handle_spec_function. */;
6518 else if (a_is_suffix)
6519 a_matched = input_suffix_matches (atom, end_atom);
6520 else if (a_is_spectype)
6521 a_matched = input_spec_matches (atom, end_atom);
6522 else
6523 a_matched = switch_matches (atom, end_atom, a_is_starred);
6525 if (a_matched != a_is_negated)
6527 disj_matched = true;
6528 d_atom = atom;
6529 d_end_atom = end_atom;
6530 d_esc_buf = esc_buf;
6535 if (*p == ':')
6537 /* Found the body, that is, the text to substitute if the
6538 current disjunction matches. */
6539 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
6540 disj_matched && !n_way_matched);
6541 if (p == 0)
6542 goto done;
6544 /* If we have an N-way choice, reset state for the next
6545 disjunction. */
6546 if (*p == ';')
6548 n_way_choice = true;
6549 n_way_matched |= disj_matched;
6550 disj_matched = false;
6551 disj_starred = true;
6552 d_atom = d_end_atom = NULL;
6555 break;
6557 default:
6558 goto invalid;
6561 while (*p++ != '}');
6563 done:
6564 if (d_esc_buf && d_esc_buf != esc_buf)
6565 free (d_esc_buf);
6566 if (esc_buf)
6567 free (esc_buf);
6569 return p;
6571 invalid:
6572 fatal_error (input_location, "braced spec %qs is invalid at %qc", orig, *p);
6574 #undef SKIP_WHITE
6577 /* Subroutine of handle_braces. Scan and process a brace substitution body
6578 (X in the description of %{} syntax). P points one past the colon;
6579 ATOM and END_ATOM bracket the first atom which was found to be true
6580 (present) in the current disjunction; STARRED indicates whether all
6581 the atoms in the current disjunction were starred (for syntax validation);
6582 MATCHED indicates whether the disjunction matched or not, and therefore
6583 whether or not the body is to be processed through do_spec_1 or just
6584 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
6585 returns -1. */
6587 static const char *
6588 process_brace_body (const char *p, const char *atom, const char *end_atom,
6589 int starred, int matched)
6591 const char *body, *end_body;
6592 unsigned int nesting_level;
6593 bool have_subst = false;
6595 /* Locate the closing } or ;, honoring nested braces.
6596 Trim trailing whitespace. */
6597 body = p;
6598 nesting_level = 1;
6599 for (;;)
6601 if (*p == '{')
6602 nesting_level++;
6603 else if (*p == '}')
6605 if (!--nesting_level)
6606 break;
6608 else if (*p == ';' && nesting_level == 1)
6609 break;
6610 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
6611 have_subst = true;
6612 else if (*p == '\0')
6613 goto invalid;
6614 p++;
6617 end_body = p;
6618 while (end_body[-1] == ' ' || end_body[-1] == '\t')
6619 end_body--;
6621 if (have_subst && !starred)
6622 goto invalid;
6624 if (matched)
6626 /* Copy the substitution body to permanent storage and execute it.
6627 If have_subst is false, this is a simple matter of running the
6628 body through do_spec_1... */
6629 char *string = save_string (body, end_body - body);
6630 if (!have_subst)
6632 if (do_spec_1 (string, 0, NULL) < 0)
6634 free (string);
6635 return 0;
6638 else
6640 /* ... but if have_subst is true, we have to process the
6641 body once for each matching switch, with %* set to the
6642 variant part of the switch. */
6643 unsigned int hard_match_len = end_atom - atom;
6644 int i;
6646 for (i = 0; i < n_switches; i++)
6647 if (!strncmp (switches[i].part1, atom, hard_match_len)
6648 && check_live_switch (i, hard_match_len))
6650 if (do_spec_1 (string, 0,
6651 &switches[i].part1[hard_match_len]) < 0)
6653 free (string);
6654 return 0;
6656 /* Pass any arguments this switch has. */
6657 give_switch (i, 1);
6658 suffix_subst = NULL;
6661 free (string);
6664 return p;
6666 invalid:
6667 fatal_error (input_location, "braced spec body %qs is invalid", body);
6670 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6671 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
6672 spec, or -1 if either exact match or %* is used.
6674 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
6675 whose value does not begin with "no-" is obsoleted by the same value
6676 with the "no-", similarly for a switch with the "no-" prefix. */
6678 static int
6679 check_live_switch (int switchnum, int prefix_length)
6681 const char *name = switches[switchnum].part1;
6682 int i;
6684 /* If we already processed this switch and determined if it was
6685 live or not, return our past determination. */
6686 if (switches[switchnum].live_cond != 0)
6687 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6688 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
6689 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6690 == 0);
6692 /* In the common case of {<at-most-one-letter>*}, a negating
6693 switch would always match, so ignore that case. We will just
6694 send the conflicting switches to the compiler phase. */
6695 if (prefix_length >= 0 && prefix_length <= 1)
6696 return 1;
6698 /* Now search for duplicate in a manner that depends on the name. */
6699 switch (*name)
6701 case 'O':
6702 for (i = switchnum + 1; i < n_switches; i++)
6703 if (switches[i].part1[0] == 'O')
6705 switches[switchnum].validated = true;
6706 switches[switchnum].live_cond = SWITCH_FALSE;
6707 return 0;
6709 break;
6711 case 'W': case 'f': case 'm': case 'g':
6712 if (! strncmp (name + 1, "no-", 3))
6714 /* We have Xno-YYY, search for XYYY. */
6715 for (i = switchnum + 1; i < n_switches; i++)
6716 if (switches[i].part1[0] == name[0]
6717 && ! strcmp (&switches[i].part1[1], &name[4]))
6719 /* --specs are validated with the validate_switches mechanism. */
6720 if (switches[switchnum].known)
6721 switches[switchnum].validated = true;
6722 switches[switchnum].live_cond = SWITCH_FALSE;
6723 return 0;
6726 else
6728 /* We have XYYY, search for Xno-YYY. */
6729 for (i = switchnum + 1; i < n_switches; i++)
6730 if (switches[i].part1[0] == name[0]
6731 && switches[i].part1[1] == 'n'
6732 && switches[i].part1[2] == 'o'
6733 && switches[i].part1[3] == '-'
6734 && !strcmp (&switches[i].part1[4], &name[1]))
6736 /* --specs are validated with the validate_switches mechanism. */
6737 if (switches[switchnum].known)
6738 switches[switchnum].validated = true;
6739 switches[switchnum].live_cond = SWITCH_FALSE;
6740 return 0;
6743 break;
6746 /* Otherwise the switch is live. */
6747 switches[switchnum].live_cond |= SWITCH_LIVE;
6748 return 1;
6751 /* Pass a switch to the current accumulating command
6752 in the same form that we received it.
6753 SWITCHNUM identifies the switch; it is an index into
6754 the vector of switches gcc received, which is `switches'.
6755 This cannot fail since it never finishes a command line.
6757 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6759 static void
6760 give_switch (int switchnum, int omit_first_word)
6762 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6763 return;
6765 if (!omit_first_word)
6767 do_spec_1 ("-", 0, NULL);
6768 do_spec_1 (switches[switchnum].part1, 1, NULL);
6771 if (switches[switchnum].args != 0)
6773 const char **p;
6774 for (p = switches[switchnum].args; *p; p++)
6776 const char *arg = *p;
6778 do_spec_1 (" ", 0, NULL);
6779 if (suffix_subst)
6781 unsigned length = strlen (arg);
6782 int dot = 0;
6784 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6785 if (arg[length] == '.')
6787 (CONST_CAST (char *, arg))[length] = 0;
6788 dot = 1;
6789 break;
6791 do_spec_1 (arg, 1, NULL);
6792 if (dot)
6793 (CONST_CAST (char *, arg))[length] = '.';
6794 do_spec_1 (suffix_subst, 1, NULL);
6796 else
6797 do_spec_1 (arg, 1, NULL);
6801 do_spec_1 (" ", 0, NULL);
6802 switches[switchnum].validated = true;
6805 /* Print GCC configuration (e.g. version, thread model, target,
6806 configuration_arguments) to a given FILE. */
6808 static void
6809 print_configuration (FILE *file)
6811 int n;
6812 const char *thrmod;
6814 fnotice (file, "Target: %s\n", spec_machine);
6815 fnotice (file, "Configured with: %s\n", configuration_arguments);
6817 #ifdef THREAD_MODEL_SPEC
6818 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6819 but there's no point in doing all this processing just to get
6820 thread_model back. */
6821 obstack_init (&obstack);
6822 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6823 obstack_1grow (&obstack, '\0');
6824 thrmod = XOBFINISH (&obstack, const char *);
6825 #else
6826 thrmod = thread_model;
6827 #endif
6829 fnotice (file, "Thread model: %s\n", thrmod);
6830 fnotice (file, "Supported LTO compression algorithms: zlib");
6831 #ifdef HAVE_ZSTD_H
6832 fnotice (file, " zstd");
6833 #endif
6834 fnotice (file, "\n");
6836 /* compiler_version is truncated at the first space when initialized
6837 from version string, so truncate version_string at the first space
6838 before comparing. */
6839 for (n = 0; version_string[n]; n++)
6840 if (version_string[n] == ' ')
6841 break;
6843 if (! strncmp (version_string, compiler_version, n)
6844 && compiler_version[n] == 0)
6845 fnotice (file, "gcc version %s %s\n", version_string,
6846 pkgversion_string);
6847 else
6848 fnotice (file, "gcc driver version %s %sexecuting gcc version %s\n",
6849 version_string, pkgversion_string, compiler_version);
6853 #define RETRY_ICE_ATTEMPTS 3
6855 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
6857 static bool
6858 files_equal_p (char *file1, char *file2)
6860 struct stat st1, st2;
6861 off_t n, len;
6862 int fd1, fd2;
6863 const int bufsize = 8192;
6864 char *buf = XNEWVEC (char, bufsize);
6866 fd1 = open (file1, O_RDONLY);
6867 fd2 = open (file2, O_RDONLY);
6869 if (fd1 < 0 || fd2 < 0)
6870 goto error;
6872 if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
6873 goto error;
6875 if (st1.st_size != st2.st_size)
6876 goto error;
6878 for (n = st1.st_size; n; n -= len)
6880 len = n;
6881 if ((int) len > bufsize / 2)
6882 len = bufsize / 2;
6884 if (read (fd1, buf, len) != (int) len
6885 || read (fd2, buf + bufsize / 2, len) != (int) len)
6887 goto error;
6890 if (memcmp (buf, buf + bufsize / 2, len) != 0)
6891 goto error;
6894 free (buf);
6895 close (fd1);
6896 close (fd2);
6898 return 1;
6900 error:
6901 free (buf);
6902 close (fd1);
6903 close (fd2);
6904 return 0;
6907 /* Check that compiler's output doesn't differ across runs.
6908 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
6909 stdout and stderr for each compiler run. Return true if all of
6910 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
6912 static bool
6913 check_repro (char **temp_stdout_files, char **temp_stderr_files)
6915 int i;
6916 for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
6918 if (!files_equal_p (temp_stdout_files[i], temp_stdout_files[i + 1])
6919 || !files_equal_p (temp_stderr_files[i], temp_stderr_files[i + 1]))
6921 fnotice (stderr, "The bug is not reproducible, so it is"
6922 " likely a hardware or OS problem.\n");
6923 break;
6926 return i == RETRY_ICE_ATTEMPTS - 2;
6929 enum attempt_status {
6930 ATTEMPT_STATUS_FAIL_TO_RUN,
6931 ATTEMPT_STATUS_SUCCESS,
6932 ATTEMPT_STATUS_ICE
6936 /* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
6937 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
6938 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
6939 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
6940 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
6941 ATTEMPT_STATUS_SUCCESS otherwise. */
6943 static enum attempt_status
6944 run_attempt (const char **new_argv, const char *out_temp,
6945 const char *err_temp, int emit_system_info, int append)
6948 if (emit_system_info)
6950 FILE *file_out = fopen (err_temp, "a");
6951 print_configuration (file_out);
6952 fputs ("\n", file_out);
6953 fclose (file_out);
6956 int exit_status;
6957 const char *errmsg;
6958 struct pex_obj *pex;
6959 int err;
6960 int pex_flags = PEX_USE_PIPES | PEX_LAST;
6961 enum attempt_status status = ATTEMPT_STATUS_FAIL_TO_RUN;
6963 if (append)
6964 pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
6966 pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
6967 if (!pex)
6968 fatal_error (input_location, "%<pex_init%> failed: %m");
6970 errmsg = pex_run (pex, pex_flags, new_argv[0],
6971 CONST_CAST2 (char *const *, const char **, &new_argv[1]),
6972 out_temp, err_temp, &err);
6973 if (errmsg != NULL)
6975 errno = err;
6976 fatal_error (input_location,
6977 err ? G_ ("cannot execute %qs: %s: %m")
6978 : G_ ("cannot execute %qs: %s"),
6979 new_argv[0], errmsg);
6982 if (!pex_get_status (pex, 1, &exit_status))
6983 goto out;
6985 switch (WEXITSTATUS (exit_status))
6987 case ICE_EXIT_CODE:
6988 status = ATTEMPT_STATUS_ICE;
6989 break;
6991 case SUCCESS_EXIT_CODE:
6992 status = ATTEMPT_STATUS_SUCCESS;
6993 break;
6995 default:
6999 out:
7000 pex_free (pex);
7001 return status;
7004 /* This routine reads lines from IN file, adds C++ style comments
7005 at the begining of each line and writes result into OUT. */
7007 static void
7008 insert_comments (const char *file_in, const char *file_out)
7010 FILE *in = fopen (file_in, "rb");
7011 FILE *out = fopen (file_out, "wb");
7012 char line[256];
7014 bool add_comment = true;
7015 while (fgets (line, sizeof (line), in))
7017 if (add_comment)
7018 fputs ("// ", out);
7019 fputs (line, out);
7020 add_comment = strchr (line, '\n') != NULL;
7023 fclose (in);
7024 fclose (out);
7027 /* This routine adds preprocessed source code into the given ERR_FILE.
7028 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
7029 add information in report file. RUN_ATTEMPT should return
7030 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
7032 static void
7033 do_report_bug (const char **new_argv, const int nargs,
7034 char **out_file, char **err_file)
7036 int i, status;
7037 int fd = open (*out_file, O_RDWR | O_APPEND);
7038 if (fd < 0)
7039 return;
7040 write (fd, "\n//", 3);
7041 for (i = 0; i < nargs; i++)
7043 write (fd, " ", 1);
7044 write (fd, new_argv[i], strlen (new_argv[i]));
7046 write (fd, "\n\n", 2);
7047 close (fd);
7048 new_argv[nargs] = "-E";
7049 new_argv[nargs + 1] = NULL;
7051 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
7053 if (status == ATTEMPT_STATUS_SUCCESS)
7055 fnotice (stderr, "Preprocessed source stored into %s file,"
7056 " please attach this to your bugreport.\n", *out_file);
7057 /* Make sure it is not deleted. */
7058 free (*out_file);
7059 *out_file = NULL;
7063 /* Try to reproduce ICE. If bug is reproducible, generate report .err file
7064 containing GCC configuration, backtrace, compiler's command line options
7065 and preprocessed source code. */
7067 static void
7068 try_generate_repro (const char **argv)
7070 int i, nargs, out_arg = -1, quiet = 0, attempt;
7071 const char **new_argv;
7072 char *temp_files[RETRY_ICE_ATTEMPTS * 2];
7073 char **temp_stdout_files = &temp_files[0];
7074 char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
7076 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
7077 return;
7079 for (nargs = 0; argv[nargs] != NULL; ++nargs)
7080 /* Only retry compiler ICEs, not preprocessor ones. */
7081 if (! strcmp (argv[nargs], "-E"))
7082 return;
7083 else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
7085 if (out_arg == -1)
7086 out_arg = nargs;
7087 else
7088 return;
7090 /* If the compiler is going to output any time information,
7091 it might varry between invocations. */
7092 else if (! strcmp (argv[nargs], "-quiet"))
7093 quiet = 1;
7094 else if (! strcmp (argv[nargs], "-ftime-report"))
7095 return;
7097 if (out_arg == -1 || !quiet)
7098 return;
7100 memset (temp_files, '\0', sizeof (temp_files));
7101 new_argv = XALLOCAVEC (const char *, nargs + 4);
7102 memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
7103 new_argv[nargs++] = "-frandom-seed=0";
7104 new_argv[nargs++] = "-fdump-noaddr";
7105 new_argv[nargs] = NULL;
7106 if (new_argv[out_arg][2] == '\0')
7107 new_argv[out_arg + 1] = "-";
7108 else
7109 new_argv[out_arg] = "-o-";
7111 int status;
7112 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
7114 int emit_system_info = 0;
7115 int append = 0;
7116 temp_stdout_files[attempt] = make_temp_file (".out");
7117 temp_stderr_files[attempt] = make_temp_file (".err");
7119 if (attempt == RETRY_ICE_ATTEMPTS - 1)
7121 append = 1;
7122 emit_system_info = 1;
7125 status = run_attempt (new_argv, temp_stdout_files[attempt],
7126 temp_stderr_files[attempt], emit_system_info,
7127 append);
7129 if (status != ATTEMPT_STATUS_ICE)
7131 fnotice (stderr, "The bug is not reproducible, so it is"
7132 " likely a hardware or OS problem.\n");
7133 goto out;
7137 if (!check_repro (temp_stdout_files, temp_stderr_files))
7138 goto out;
7141 /* Insert commented out backtrace into report file. */
7142 char **stderr_commented = &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1];
7143 insert_comments (temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
7144 *stderr_commented);
7146 /* In final attempt we append compiler options and preprocesssed code to last
7147 generated .out file with configuration and backtrace. */
7148 char **err = &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1];
7149 do_report_bug (new_argv, nargs, stderr_commented, err);
7152 out:
7153 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
7154 if (temp_files[i])
7156 unlink (temp_stdout_files[i]);
7157 free (temp_stdout_files[i]);
7161 /* Search for a file named NAME trying various prefixes including the
7162 user's -B prefix and some standard ones.
7163 Return the absolute file name found. If nothing is found, return NAME. */
7165 static const char *
7166 find_file (const char *name)
7168 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
7169 return newname ? newname : name;
7172 /* Determine whether a directory exists. If LINKER, return 0 for
7173 certain fixed names not needed by the linker. */
7175 static int
7176 is_directory (const char *path1, bool linker)
7178 int len1;
7179 char *path;
7180 char *cp;
7181 struct stat st;
7183 /* Ensure the string ends with "/.". The resulting path will be a
7184 directory even if the given path is a symbolic link. */
7185 len1 = strlen (path1);
7186 path = (char *) alloca (3 + len1);
7187 memcpy (path, path1, len1);
7188 cp = path + len1;
7189 if (!IS_DIR_SEPARATOR (cp[-1]))
7190 *cp++ = DIR_SEPARATOR;
7191 *cp++ = '.';
7192 *cp = '\0';
7194 /* Exclude directories that the linker is known to search. */
7195 if (linker
7196 && IS_DIR_SEPARATOR (path[0])
7197 && ((cp - path == 6
7198 && filename_ncmp (path + 1, "lib", 3) == 0)
7199 || (cp - path == 10
7200 && filename_ncmp (path + 1, "usr", 3) == 0
7201 && IS_DIR_SEPARATOR (path[4])
7202 && filename_ncmp (path + 5, "lib", 3) == 0)))
7203 return 0;
7205 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
7208 /* Set up the various global variables to indicate that we're processing
7209 the input file named FILENAME. */
7211 void
7212 set_input (const char *filename)
7214 const char *p;
7216 gcc_input_filename = filename;
7217 input_filename_length = strlen (gcc_input_filename);
7218 input_basename = lbasename (gcc_input_filename);
7220 /* Find a suffix starting with the last period,
7221 and set basename_length to exclude that suffix. */
7222 basename_length = strlen (input_basename);
7223 suffixed_basename_length = basename_length;
7224 p = input_basename + basename_length;
7225 while (p != input_basename && *p != '.')
7226 --p;
7227 if (*p == '.' && p != input_basename)
7229 basename_length = p - input_basename;
7230 input_suffix = p + 1;
7232 else
7233 input_suffix = "";
7235 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
7236 we will need to do a stat on the gcc_input_filename. The
7237 INPUT_STAT_SET signals that the stat is needed. */
7238 input_stat_set = 0;
7241 /* On fatal signals, delete all the temporary files. */
7243 static void
7244 fatal_signal (int signum)
7246 signal (signum, SIG_DFL);
7247 delete_failure_queue ();
7248 delete_temp_files ();
7249 /* Get the same signal again, this time not handled,
7250 so its normal effect occurs. */
7251 kill (getpid (), signum);
7254 /* Compare the contents of the two files named CMPFILE[0] and
7255 CMPFILE[1]. Return zero if they're identical, nonzero
7256 otherwise. */
7258 static int
7259 compare_files (char *cmpfile[])
7261 int ret = 0;
7262 FILE *temp[2] = { NULL, NULL };
7263 int i;
7265 #if HAVE_MMAP_FILE
7267 size_t length[2];
7268 void *map[2] = { NULL, NULL };
7270 for (i = 0; i < 2; i++)
7272 struct stat st;
7274 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
7276 error ("%s: could not determine length of compare-debug file %s",
7277 gcc_input_filename, cmpfile[i]);
7278 ret = 1;
7279 break;
7282 length[i] = st.st_size;
7285 if (!ret && length[0] != length[1])
7287 error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename);
7288 ret = 1;
7291 if (!ret)
7292 for (i = 0; i < 2; i++)
7294 int fd = open (cmpfile[i], O_RDONLY);
7295 if (fd < 0)
7297 error ("%s: could not open compare-debug file %s",
7298 gcc_input_filename, cmpfile[i]);
7299 ret = 1;
7300 break;
7303 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
7304 close (fd);
7306 if (map[i] == (void *) MAP_FAILED)
7308 ret = -1;
7309 break;
7313 if (!ret)
7315 if (memcmp (map[0], map[1], length[0]) != 0)
7317 error ("%s: %<-fcompare-debug%> failure", gcc_input_filename);
7318 ret = 1;
7322 for (i = 0; i < 2; i++)
7323 if (map[i])
7324 munmap ((caddr_t) map[i], length[i]);
7326 if (ret >= 0)
7327 return ret;
7329 ret = 0;
7331 #endif
7333 for (i = 0; i < 2; i++)
7335 temp[i] = fopen (cmpfile[i], "r");
7336 if (!temp[i])
7338 error ("%s: could not open compare-debug file %s",
7339 gcc_input_filename, cmpfile[i]);
7340 ret = 1;
7341 break;
7345 if (!ret && temp[0] && temp[1])
7346 for (;;)
7348 int c0, c1;
7349 c0 = fgetc (temp[0]);
7350 c1 = fgetc (temp[1]);
7352 if (c0 != c1)
7354 error ("%s: %<-fcompare-debug%> failure",
7355 gcc_input_filename);
7356 ret = 1;
7357 break;
7360 if (c0 == EOF)
7361 break;
7364 for (i = 1; i >= 0; i--)
7366 if (temp[i])
7367 fclose (temp[i]);
7370 return ret;
7373 driver::driver (bool can_finalize, bool debug) :
7374 explicit_link_files (NULL),
7375 decoded_options (NULL)
7377 env.init (can_finalize, debug);
7380 driver::~driver ()
7382 XDELETEVEC (explicit_link_files);
7383 XDELETEVEC (decoded_options);
7386 /* driver::main is implemented as a series of driver:: method calls. */
7389 driver::main (int argc, char **argv)
7391 bool early_exit;
7393 set_progname (argv[0]);
7394 expand_at_files (&argc, &argv);
7395 decode_argv (argc, const_cast <const char **> (argv));
7396 global_initializations ();
7397 build_multilib_strings ();
7398 set_up_specs ();
7399 putenv_COLLECT_AS_OPTIONS (assembler_options);
7400 putenv_COLLECT_GCC (argv[0]);
7401 maybe_putenv_COLLECT_LTO_WRAPPER ();
7402 maybe_putenv_OFFLOAD_TARGETS ();
7403 handle_unrecognized_options ();
7405 if (completion)
7407 m_option_proposer.suggest_completion (completion);
7408 return 0;
7411 if (!maybe_print_and_exit ())
7412 return 0;
7414 early_exit = prepare_infiles ();
7415 if (early_exit)
7416 return get_exit_code ();
7418 do_spec_on_infiles ();
7419 maybe_run_linker (argv[0]);
7420 final_actions ();
7421 return get_exit_code ();
7424 /* Locate the final component of argv[0] after any leading path, and set
7425 the program name accordingly. */
7427 void
7428 driver::set_progname (const char *argv0) const
7430 const char *p = argv0 + strlen (argv0);
7431 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
7432 --p;
7433 progname = p;
7435 xmalloc_set_program_name (progname);
7438 /* Expand any @ files within the command-line args,
7439 setting at_file_supplied if any were expanded. */
7441 void
7442 driver::expand_at_files (int *argc, char ***argv) const
7444 char **old_argv = *argv;
7446 expandargv (argc, argv);
7448 /* Determine if any expansions were made. */
7449 if (*argv != old_argv)
7450 at_file_supplied = true;
7453 /* Decode the command-line arguments from argc/argv into the
7454 decoded_options array. */
7456 void
7457 driver::decode_argv (int argc, const char **argv)
7459 init_opts_obstack ();
7460 init_options_struct (&global_options, &global_options_set);
7462 decode_cmdline_options_to_array (argc, argv,
7463 CL_DRIVER,
7464 &decoded_options, &decoded_options_count);
7467 /* Perform various initializations and setup. */
7469 void
7470 driver::global_initializations ()
7472 /* Unlock the stdio streams. */
7473 unlock_std_streams ();
7475 gcc_init_libintl ();
7477 diagnostic_initialize (global_dc, 0);
7478 diagnostic_color_init (global_dc);
7479 diagnostic_urls_init (global_dc);
7481 #ifdef GCC_DRIVER_HOST_INITIALIZATION
7482 /* Perform host dependent initialization when needed. */
7483 GCC_DRIVER_HOST_INITIALIZATION;
7484 #endif
7486 if (atexit (delete_temp_files) != 0)
7487 fatal_error (input_location, "atexit failed");
7489 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
7490 signal (SIGINT, fatal_signal);
7491 #ifdef SIGHUP
7492 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
7493 signal (SIGHUP, fatal_signal);
7494 #endif
7495 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
7496 signal (SIGTERM, fatal_signal);
7497 #ifdef SIGPIPE
7498 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
7499 signal (SIGPIPE, fatal_signal);
7500 #endif
7501 #ifdef SIGCHLD
7502 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
7503 receive the signal. A different setting is inheritable */
7504 signal (SIGCHLD, SIG_DFL);
7505 #endif
7507 /* Parsing and gimplification sometimes need quite large stack.
7508 Increase stack size limits if possible. */
7509 stack_limit_increase (64 * 1024 * 1024);
7511 /* Allocate the argument vector. */
7512 alloc_args ();
7514 obstack_init (&obstack);
7517 /* Build multilib_select, et. al from the separate lines that make up each
7518 multilib selection. */
7520 void
7521 driver::build_multilib_strings () const
7524 const char *p;
7525 const char *const *q = multilib_raw;
7526 int need_space;
7528 obstack_init (&multilib_obstack);
7529 while ((p = *q++) != (char *) 0)
7530 obstack_grow (&multilib_obstack, p, strlen (p));
7532 obstack_1grow (&multilib_obstack, 0);
7533 multilib_select = XOBFINISH (&multilib_obstack, const char *);
7535 q = multilib_matches_raw;
7536 while ((p = *q++) != (char *) 0)
7537 obstack_grow (&multilib_obstack, p, strlen (p));
7539 obstack_1grow (&multilib_obstack, 0);
7540 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
7542 q = multilib_exclusions_raw;
7543 while ((p = *q++) != (char *) 0)
7544 obstack_grow (&multilib_obstack, p, strlen (p));
7546 obstack_1grow (&multilib_obstack, 0);
7547 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
7549 q = multilib_reuse_raw;
7550 while ((p = *q++) != (char *) 0)
7551 obstack_grow (&multilib_obstack, p, strlen (p));
7553 obstack_1grow (&multilib_obstack, 0);
7554 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
7556 need_space = FALSE;
7557 for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
7559 if (need_space)
7560 obstack_1grow (&multilib_obstack, ' ');
7561 obstack_grow (&multilib_obstack,
7562 multilib_defaults_raw[i],
7563 strlen (multilib_defaults_raw[i]));
7564 need_space = TRUE;
7567 obstack_1grow (&multilib_obstack, 0);
7568 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
7572 /* Set up the spec-handling machinery. */
7574 void
7575 driver::set_up_specs () const
7577 const char *spec_machine_suffix;
7578 char *specs_file;
7579 size_t i;
7581 #ifdef INIT_ENVIRONMENT
7582 /* Set up any other necessary machine specific environment variables. */
7583 xputenv (INIT_ENVIRONMENT);
7584 #endif
7586 /* Make a table of what switches there are (switches, n_switches).
7587 Make a table of specified input files (infiles, n_infiles).
7588 Decode switches that are handled locally. */
7590 process_command (decoded_options_count, decoded_options);
7592 /* Initialize the vector of specs to just the default.
7593 This means one element containing 0s, as a terminator. */
7595 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
7596 memcpy (compilers, default_compilers, sizeof default_compilers);
7597 n_compilers = n_default_compilers;
7599 /* Read specs from a file if there is one. */
7601 machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
7602 accel_dir_suffix, dir_separator_str, NULL);
7603 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
7605 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
7606 /* Read the specs file unless it is a default one. */
7607 if (specs_file != 0 && strcmp (specs_file, "specs"))
7608 read_specs (specs_file, true, false);
7609 else
7610 init_spec ();
7612 #ifdef ACCEL_COMPILER
7613 spec_machine_suffix = machine_suffix;
7614 #else
7615 spec_machine_suffix = just_machine_suffix;
7616 #endif
7618 /* We need to check standard_exec_prefix/spec_machine_suffix/specs
7619 for any override of as, ld and libraries. */
7620 specs_file = (char *) alloca (strlen (standard_exec_prefix)
7621 + strlen (spec_machine_suffix) + sizeof ("specs"));
7622 strcpy (specs_file, standard_exec_prefix);
7623 strcat (specs_file, spec_machine_suffix);
7624 strcat (specs_file, "specs");
7625 if (access (specs_file, R_OK) == 0)
7626 read_specs (specs_file, true, false);
7628 /* Process any configure-time defaults specified for the command line
7629 options, via OPTION_DEFAULT_SPECS. */
7630 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
7631 do_option_spec (option_default_specs[i].name,
7632 option_default_specs[i].spec);
7634 /* Process DRIVER_SELF_SPECS, adding any new options to the end
7635 of the command line. */
7637 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
7638 do_self_spec (driver_self_specs[i]);
7640 /* If not cross-compiling, look for executables in the standard
7641 places. */
7642 if (*cross_compile == '0')
7644 if (*md_exec_prefix)
7646 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
7647 PREFIX_PRIORITY_LAST, 0, 0);
7651 /* Process sysroot_suffix_spec. */
7652 if (*sysroot_suffix_spec != 0
7653 && !no_sysroot_suffix
7654 && do_spec_2 (sysroot_suffix_spec, NULL) == 0)
7656 if (argbuf.length () > 1)
7657 error ("spec failure: more than one argument to "
7658 "%<SYSROOT_SUFFIX_SPEC%>");
7659 else if (argbuf.length () == 1)
7660 target_sysroot_suffix = xstrdup (argbuf.last ());
7663 #ifdef HAVE_LD_SYSROOT
7664 /* Pass the --sysroot option to the linker, if it supports that. If
7665 there is a sysroot_suffix_spec, it has already been processed by
7666 this point, so target_system_root really is the system root we
7667 should be using. */
7668 if (target_system_root)
7670 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
7671 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
7672 set_spec ("link", XOBFINISH (&obstack, const char *), false);
7674 #endif
7676 /* Process sysroot_hdrs_suffix_spec. */
7677 if (*sysroot_hdrs_suffix_spec != 0
7678 && !no_sysroot_suffix
7679 && do_spec_2 (sysroot_hdrs_suffix_spec, NULL) == 0)
7681 if (argbuf.length () > 1)
7682 error ("spec failure: more than one argument "
7683 "to %<SYSROOT_HEADERS_SUFFIX_SPEC%>");
7684 else if (argbuf.length () == 1)
7685 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
7688 /* Look for startfiles in the standard places. */
7689 if (*startfile_prefix_spec != 0
7690 && do_spec_2 (startfile_prefix_spec, NULL) == 0
7691 && do_spec_1 (" ", 0, NULL) == 0)
7693 const char *arg;
7694 int ndx;
7695 FOR_EACH_VEC_ELT (argbuf, ndx, arg)
7696 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
7697 PREFIX_PRIORITY_LAST, 0, 1);
7699 /* We should eventually get rid of all these and stick to
7700 startfile_prefix_spec exclusively. */
7701 else if (*cross_compile == '0' || target_system_root)
7703 if (*md_startfile_prefix)
7704 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
7705 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7707 if (*md_startfile_prefix_1)
7708 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
7709 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7711 /* If standard_startfile_prefix is relative, base it on
7712 standard_exec_prefix. This lets us move the installed tree
7713 as a unit. If GCC_EXEC_PREFIX is defined, base
7714 standard_startfile_prefix on that as well.
7716 If the prefix is relative, only search it for native compilers;
7717 otherwise we will search a directory containing host libraries. */
7718 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
7719 add_sysrooted_prefix (&startfile_prefixes,
7720 standard_startfile_prefix, "BINUTILS",
7721 PREFIX_PRIORITY_LAST, 0, 1);
7722 else if (*cross_compile == '0')
7724 add_prefix (&startfile_prefixes,
7725 concat (gcc_exec_prefix
7726 ? gcc_exec_prefix : standard_exec_prefix,
7727 machine_suffix,
7728 standard_startfile_prefix, NULL),
7729 NULL, PREFIX_PRIORITY_LAST, 0, 1);
7732 /* Sysrooted prefixes are relocated because target_system_root is
7733 also relocated by gcc_exec_prefix. */
7734 if (*standard_startfile_prefix_1)
7735 add_sysrooted_prefix (&startfile_prefixes,
7736 standard_startfile_prefix_1, "BINUTILS",
7737 PREFIX_PRIORITY_LAST, 0, 1);
7738 if (*standard_startfile_prefix_2)
7739 add_sysrooted_prefix (&startfile_prefixes,
7740 standard_startfile_prefix_2, "BINUTILS",
7741 PREFIX_PRIORITY_LAST, 0, 1);
7744 /* Process any user specified specs in the order given on the command
7745 line. */
7746 for (struct user_specs *uptr = user_specs_head; uptr; uptr = uptr->next)
7748 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
7749 R_OK, true);
7750 read_specs (filename ? filename : uptr->filename, false, true);
7753 /* Process any user self specs. */
7755 struct spec_list *sl;
7756 for (sl = specs; sl; sl = sl->next)
7757 if (sl->name_len == sizeof "self_spec" - 1
7758 && !strcmp (sl->name, "self_spec"))
7759 do_self_spec (*sl->ptr_spec);
7762 if (compare_debug)
7764 enum save_temps save;
7766 if (!compare_debug_second)
7768 n_switches_debug_check[1] = n_switches;
7769 n_switches_alloc_debug_check[1] = n_switches_alloc;
7770 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
7771 n_switches_alloc);
7773 do_self_spec ("%:compare-debug-self-opt()");
7774 n_switches_debug_check[0] = n_switches;
7775 n_switches_alloc_debug_check[0] = n_switches_alloc;
7776 switches_debug_check[0] = switches;
7778 n_switches = n_switches_debug_check[1];
7779 n_switches_alloc = n_switches_alloc_debug_check[1];
7780 switches = switches_debug_check[1];
7783 /* Avoid crash when computing %j in this early. */
7784 save = save_temps_flag;
7785 save_temps_flag = SAVE_TEMPS_NONE;
7787 compare_debug = -compare_debug;
7788 do_self_spec ("%:compare-debug-self-opt()");
7790 save_temps_flag = save;
7792 if (!compare_debug_second)
7794 n_switches_debug_check[1] = n_switches;
7795 n_switches_alloc_debug_check[1] = n_switches_alloc;
7796 switches_debug_check[1] = switches;
7797 compare_debug = -compare_debug;
7798 n_switches = n_switches_debug_check[0];
7799 n_switches_alloc = n_switches_debug_check[0];
7800 switches = switches_debug_check[0];
7805 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
7806 if (gcc_exec_prefix)
7807 gcc_exec_prefix = concat (gcc_exec_prefix, spec_host_machine,
7808 dir_separator_str, spec_version,
7809 accel_dir_suffix, dir_separator_str, NULL);
7811 /* Now we have the specs.
7812 Set the `valid' bits for switches that match anything in any spec. */
7814 validate_all_switches ();
7816 /* Now that we have the switches and the specs, set
7817 the subdirectory based on the options. */
7818 set_multilib_dir ();
7821 /* Set up to remember the pathname of gcc and any options
7822 needed for collect. We use argv[0] instead of progname because
7823 we need the complete pathname. */
7825 void
7826 driver::putenv_COLLECT_GCC (const char *argv0) const
7828 obstack_init (&collect_obstack);
7829 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
7830 obstack_grow (&collect_obstack, argv0, strlen (argv0) + 1);
7831 xputenv (XOBFINISH (&collect_obstack, char *));
7834 /* Set up to remember the pathname of the lto wrapper. */
7836 void
7837 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
7839 char *lto_wrapper_file;
7841 if (have_c)
7842 lto_wrapper_file = NULL;
7843 else
7844 lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
7845 X_OK, false);
7846 if (lto_wrapper_file)
7848 lto_wrapper_file = convert_white_space (lto_wrapper_file);
7849 lto_wrapper_spec = lto_wrapper_file;
7850 obstack_init (&collect_obstack);
7851 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
7852 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
7853 obstack_grow (&collect_obstack, lto_wrapper_spec,
7854 strlen (lto_wrapper_spec) + 1);
7855 xputenv (XOBFINISH (&collect_obstack, char *));
7860 /* Set up to remember the names of offload targets. */
7862 void
7863 driver::maybe_putenv_OFFLOAD_TARGETS () const
7865 if (offload_targets && offload_targets[0] != '\0')
7867 obstack_grow (&collect_obstack, "OFFLOAD_TARGET_NAMES=",
7868 sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
7869 obstack_grow (&collect_obstack, offload_targets,
7870 strlen (offload_targets) + 1);
7871 xputenv (XOBFINISH (&collect_obstack, char *));
7874 free (offload_targets);
7875 offload_targets = NULL;
7878 /* Reject switches that no pass was interested in. */
7880 void
7881 driver::handle_unrecognized_options ()
7883 for (size_t i = 0; (int) i < n_switches; i++)
7884 if (! switches[i].validated)
7886 const char *hint = m_option_proposer.suggest_option (switches[i].part1);
7887 if (hint)
7888 error ("unrecognized command-line option %<-%s%>;"
7889 " did you mean %<-%s%>?",
7890 switches[i].part1, hint);
7891 else
7892 error ("unrecognized command-line option %<-%s%>",
7893 switches[i].part1);
7897 /* Handle the various -print-* options, returning 0 if the driver
7898 should exit, or nonzero if the driver should continue. */
7901 driver::maybe_print_and_exit () const
7903 if (print_search_dirs)
7905 printf (_("install: %s%s\n"),
7906 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
7907 gcc_exec_prefix ? "" : machine_suffix);
7908 printf (_("programs: %s\n"),
7909 build_search_list (&exec_prefixes, "", false, false));
7910 printf (_("libraries: %s\n"),
7911 build_search_list (&startfile_prefixes, "", false, true));
7912 return (0);
7915 if (print_file_name)
7917 printf ("%s\n", find_file (print_file_name));
7918 return (0);
7921 if (print_prog_name)
7923 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
7925 /* Append USE_LD to the default linker. */
7926 #ifdef DEFAULT_LINKER
7927 char *ld;
7928 # ifdef HAVE_HOST_EXECUTABLE_SUFFIX
7929 int len = (sizeof (DEFAULT_LINKER)
7930 - sizeof (HOST_EXECUTABLE_SUFFIX));
7931 ld = NULL;
7932 if (len > 0)
7934 char *default_linker = xstrdup (DEFAULT_LINKER);
7935 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
7936 HOST_EXECUTABLE_SUFFIX. */
7937 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
7939 default_linker[len] = '\0';
7940 ld = concat (default_linker, use_ld,
7941 HOST_EXECUTABLE_SUFFIX, NULL);
7944 if (ld == NULL)
7945 # endif
7946 ld = concat (DEFAULT_LINKER, use_ld, NULL);
7947 if (access (ld, X_OK) == 0)
7949 printf ("%s\n", ld);
7950 return (0);
7952 #endif
7953 print_prog_name = concat (print_prog_name, use_ld, NULL);
7955 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
7956 printf ("%s\n", (newname ? newname : print_prog_name));
7957 return (0);
7960 if (print_multi_lib)
7962 print_multilib_info ();
7963 return (0);
7966 if (print_multi_directory)
7968 if (multilib_dir == NULL)
7969 printf (".\n");
7970 else
7971 printf ("%s\n", multilib_dir);
7972 return (0);
7975 if (print_multiarch)
7977 if (multiarch_dir == NULL)
7978 printf ("\n");
7979 else
7980 printf ("%s\n", multiarch_dir);
7981 return (0);
7984 if (print_sysroot)
7986 if (target_system_root)
7988 if (target_sysroot_suffix)
7989 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
7990 else
7991 printf ("%s\n", target_system_root);
7993 return (0);
7996 if (print_multi_os_directory)
7998 if (multilib_os_dir == NULL)
7999 printf (".\n");
8000 else
8001 printf ("%s\n", multilib_os_dir);
8002 return (0);
8005 if (print_sysroot_headers_suffix)
8007 if (*sysroot_hdrs_suffix_spec)
8009 printf("%s\n", (target_sysroot_hdrs_suffix
8010 ? target_sysroot_hdrs_suffix
8011 : ""));
8012 return (0);
8014 else
8015 /* The error status indicates that only one set of fixed
8016 headers should be built. */
8017 fatal_error (input_location,
8018 "not configured with sysroot headers suffix");
8021 if (print_help_list)
8023 display_help ();
8025 if (! verbose_flag)
8027 printf (_("\nFor bug reporting instructions, please see:\n"));
8028 printf ("%s.\n", bug_report_url);
8030 return (0);
8033 /* We do not exit here. Instead we have created a fake input file
8034 called 'help-dummy' which needs to be compiled, and we pass this
8035 on the various sub-processes, along with the --help switch.
8036 Ensure their output appears after ours. */
8037 fputc ('\n', stdout);
8038 fflush (stdout);
8041 if (print_version)
8043 printf (_("%s %s%s\n"), progname, pkgversion_string,
8044 version_string);
8045 printf ("Copyright %s 2020 Free Software Foundation, Inc.\n",
8046 _("(C)"));
8047 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
8048 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
8049 stdout);
8050 if (! verbose_flag)
8051 return 0;
8053 /* We do not exit here. We use the same mechanism of --help to print
8054 the version of the sub-processes. */
8055 fputc ('\n', stdout);
8056 fflush (stdout);
8059 if (verbose_flag)
8061 print_configuration (stderr);
8062 if (n_infiles == 0)
8063 return (0);
8066 return 1;
8069 /* Figure out what to do with each input file.
8070 Return true if we need to exit early from "main", false otherwise. */
8072 bool
8073 driver::prepare_infiles ()
8075 size_t i;
8076 int lang_n_infiles = 0;
8078 if (n_infiles == added_libraries)
8079 fatal_error (input_location, "no input files");
8081 if (seen_error ())
8082 /* Early exit needed from main. */
8083 return true;
8085 /* Make a place to record the compiler output file names
8086 that correspond to the input files. */
8088 i = n_infiles;
8089 i += lang_specific_extra_outfiles;
8090 outfiles = XCNEWVEC (const char *, i);
8092 /* Record which files were specified explicitly as link input. */
8094 explicit_link_files = XCNEWVEC (char, n_infiles);
8096 combine_inputs = have_o || flag_wpa;
8098 for (i = 0; (int) i < n_infiles; i++)
8100 const char *name = infiles[i].name;
8101 struct compiler *compiler = lookup_compiler (name,
8102 strlen (name),
8103 infiles[i].language);
8105 if (compiler && !(compiler->combinable))
8106 combine_inputs = false;
8108 if (lang_n_infiles > 0 && compiler != input_file_compiler
8109 && infiles[i].language && infiles[i].language[0] != '*')
8110 infiles[i].incompiler = compiler;
8111 else if (compiler)
8113 lang_n_infiles++;
8114 input_file_compiler = compiler;
8115 infiles[i].incompiler = compiler;
8117 else
8119 /* Since there is no compiler for this input file, assume it is a
8120 linker file. */
8121 explicit_link_files[i] = 1;
8122 infiles[i].incompiler = NULL;
8124 infiles[i].compiled = false;
8125 infiles[i].preprocessed = false;
8128 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
8129 fatal_error (input_location,
8130 "cannot specify %<-o%> with %<-c%>, %<-S%> or %<-E%> "
8131 "with multiple files");
8133 /* No early exit needed from main; we can continue. */
8134 return false;
8137 /* Run the spec machinery on each input file. */
8139 void
8140 driver::do_spec_on_infiles () const
8142 size_t i;
8144 for (i = 0; (int) i < n_infiles; i++)
8146 int this_file_error = 0;
8148 /* Tell do_spec what to substitute for %i. */
8150 input_file_number = i;
8151 set_input (infiles[i].name);
8153 if (infiles[i].compiled)
8154 continue;
8156 /* Use the same thing in %o, unless cp->spec says otherwise. */
8158 outfiles[i] = gcc_input_filename;
8160 /* Figure out which compiler from the file's suffix. */
8162 input_file_compiler
8163 = lookup_compiler (infiles[i].name, input_filename_length,
8164 infiles[i].language);
8166 if (input_file_compiler)
8168 /* Ok, we found an applicable compiler. Run its spec. */
8170 if (input_file_compiler->spec[0] == '#')
8172 error ("%s: %s compiler not installed on this system",
8173 gcc_input_filename, &input_file_compiler->spec[1]);
8174 this_file_error = 1;
8176 else
8178 int value;
8180 if (compare_debug)
8182 free (debug_check_temp_file[0]);
8183 debug_check_temp_file[0] = NULL;
8185 free (debug_check_temp_file[1]);
8186 debug_check_temp_file[1] = NULL;
8189 value = do_spec (input_file_compiler->spec);
8190 infiles[i].compiled = true;
8191 if (value < 0)
8192 this_file_error = 1;
8193 else if (compare_debug && debug_check_temp_file[0])
8195 if (verbose_flag)
8196 inform (UNKNOWN_LOCATION,
8197 "recompiling with %<-fcompare-debug%>");
8199 compare_debug = -compare_debug;
8200 n_switches = n_switches_debug_check[1];
8201 n_switches_alloc = n_switches_alloc_debug_check[1];
8202 switches = switches_debug_check[1];
8204 value = do_spec (input_file_compiler->spec);
8206 compare_debug = -compare_debug;
8207 n_switches = n_switches_debug_check[0];
8208 n_switches_alloc = n_switches_alloc_debug_check[0];
8209 switches = switches_debug_check[0];
8211 if (value < 0)
8213 error ("during %<-fcompare-debug%> recompilation");
8214 this_file_error = 1;
8217 gcc_assert (debug_check_temp_file[1]
8218 && filename_cmp (debug_check_temp_file[0],
8219 debug_check_temp_file[1]));
8221 if (verbose_flag)
8222 inform (UNKNOWN_LOCATION, "comparing final insns dumps");
8224 if (compare_files (debug_check_temp_file))
8225 this_file_error = 1;
8228 if (compare_debug)
8230 free (debug_check_temp_file[0]);
8231 debug_check_temp_file[0] = NULL;
8233 free (debug_check_temp_file[1]);
8234 debug_check_temp_file[1] = NULL;
8239 /* If this file's name does not contain a recognized suffix,
8240 record it as explicit linker input. */
8242 else
8243 explicit_link_files[i] = 1;
8245 /* Clear the delete-on-failure queue, deleting the files in it
8246 if this compilation failed. */
8248 if (this_file_error)
8250 delete_failure_queue ();
8251 errorcount++;
8253 /* If this compilation succeeded, don't delete those files later. */
8254 clear_failure_queue ();
8257 /* Reset the input file name to the first compile/object file name, for use
8258 with %b in LINK_SPEC. We use the first input file that we can find
8259 a compiler to compile it instead of using infiles.language since for
8260 languages other than C we use aliases that we then lookup later. */
8261 if (n_infiles > 0)
8263 int i;
8265 for (i = 0; i < n_infiles ; i++)
8266 if (infiles[i].incompiler
8267 || (infiles[i].language && infiles[i].language[0] != '*'))
8269 set_input (infiles[i].name);
8270 break;
8274 if (!seen_error ())
8276 /* Make sure INPUT_FILE_NUMBER points to first available open
8277 slot. */
8278 input_file_number = n_infiles;
8279 if (lang_specific_pre_link ())
8280 errorcount++;
8284 /* If we have to run the linker, do it now. */
8286 void
8287 driver::maybe_run_linker (const char *argv0) const
8289 size_t i;
8290 int linker_was_run = 0;
8291 int num_linker_inputs;
8293 /* Determine if there are any linker input files. */
8294 num_linker_inputs = 0;
8295 for (i = 0; (int) i < n_infiles; i++)
8296 if (explicit_link_files[i] || outfiles[i] != NULL)
8297 num_linker_inputs++;
8299 /* Run ld to link all the compiler output files. */
8301 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
8303 int tmp = execution_count;
8305 detect_jobserver ();
8307 if (! have_c)
8309 #if HAVE_LTO_PLUGIN > 0
8310 #if HAVE_LTO_PLUGIN == 2
8311 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
8312 #else
8313 const char *fuse_linker_plugin = "fuse-linker-plugin";
8314 #endif
8315 #endif
8317 /* We'll use ld if we can't find collect2. */
8318 if (! strcmp (linker_name_spec, "collect2"))
8320 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
8321 if (s == NULL)
8322 linker_name_spec = "ld";
8325 #if HAVE_LTO_PLUGIN > 0
8326 #if HAVE_LTO_PLUGIN == 2
8327 if (!switch_matches (fno_use_linker_plugin,
8328 fno_use_linker_plugin
8329 + strlen (fno_use_linker_plugin), 0))
8330 #else
8331 if (switch_matches (fuse_linker_plugin,
8332 fuse_linker_plugin
8333 + strlen (fuse_linker_plugin), 0))
8334 #endif
8336 char *temp_spec = find_a_file (&exec_prefixes,
8337 LTOPLUGINSONAME, R_OK,
8338 false);
8339 if (!temp_spec)
8340 fatal_error (input_location,
8341 "%<-fuse-linker-plugin%>, but %s not found",
8342 LTOPLUGINSONAME);
8343 linker_plugin_file_spec = convert_white_space (temp_spec);
8345 #endif
8346 lto_gcc_spec = argv0;
8349 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
8350 for collect. */
8351 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
8352 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
8354 if (print_subprocess_help == 1)
8356 printf (_("\nLinker options\n==============\n\n"));
8357 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
8358 " to the linker.\n\n"));
8359 fflush (stdout);
8361 int value = do_spec (link_command_spec);
8362 if (value < 0)
8363 errorcount = 1;
8364 linker_was_run = (tmp != execution_count);
8367 /* If options said don't run linker,
8368 complain about input files to be given to the linker. */
8370 if (! linker_was_run && !seen_error ())
8371 for (i = 0; (int) i < n_infiles; i++)
8372 if (explicit_link_files[i]
8373 && !(infiles[i].language && infiles[i].language[0] == '*'))
8374 warning (0, "%s: linker input file unused because linking not done",
8375 outfiles[i]);
8378 /* The end of "main". */
8380 void
8381 driver::final_actions () const
8383 /* Delete some or all of the temporary files we made. */
8385 if (seen_error ())
8386 delete_failure_queue ();
8387 delete_temp_files ();
8389 if (print_help_list)
8391 printf (("\nFor bug reporting instructions, please see:\n"));
8392 printf ("%s\n", bug_report_url);
8396 /* Detect whether jobserver is active and working. If not drop
8397 --jobserver-auth from MAKEFLAGS. */
8399 void
8400 driver::detect_jobserver () const
8402 /* Detect jobserver and drop it if it's not working. */
8403 const char *makeflags = env.get ("MAKEFLAGS");
8404 if (makeflags != NULL)
8406 const char *needle = "--jobserver-auth=";
8407 const char *n = strstr (makeflags, needle);
8408 if (n != NULL)
8410 int rfd = -1;
8411 int wfd = -1;
8413 bool jobserver
8414 = (sscanf (n + strlen (needle), "%d,%d", &rfd, &wfd) == 2
8415 && rfd > 0
8416 && wfd > 0
8417 && is_valid_fd (rfd)
8418 && is_valid_fd (wfd));
8420 /* Drop the jobserver if it's not working now. */
8421 if (!jobserver)
8423 unsigned offset = n - makeflags;
8424 char *dup = xstrdup (makeflags);
8425 dup[offset] = '\0';
8427 const char *space = strchr (makeflags + offset, ' ');
8428 if (space != NULL)
8429 strcpy (dup + offset, space);
8430 xputenv (concat ("MAKEFLAGS=", dup, NULL));
8436 /* Determine what the exit code of the driver should be. */
8439 driver::get_exit_code () const
8441 return (signal_count != 0 ? 2
8442 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
8443 : 0);
8446 /* Find the proper compilation spec for the file name NAME,
8447 whose length is LENGTH. LANGUAGE is the specified language,
8448 or 0 if this file is to be passed to the linker. */
8450 static struct compiler *
8451 lookup_compiler (const char *name, size_t length, const char *language)
8453 struct compiler *cp;
8455 /* If this was specified by the user to be a linker input, indicate that. */
8456 if (language != 0 && language[0] == '*')
8457 return 0;
8459 /* Otherwise, look for the language, if one is spec'd. */
8460 if (language != 0)
8462 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8463 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
8465 if (name != NULL && strcmp (name, "-") == 0
8466 && (strcmp (cp->suffix, "@c-header") == 0
8467 || strcmp (cp->suffix, "@c++-header") == 0)
8468 && !have_E)
8469 fatal_error (input_location,
8470 "cannot use %<-%> as input filename for a "
8471 "precompiled header");
8473 return cp;
8476 error ("language %s not recognized", language);
8477 return 0;
8480 /* Look for a suffix. */
8481 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8483 if (/* The suffix `-' matches only the file name `-'. */
8484 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
8485 || (strlen (cp->suffix) < length
8486 /* See if the suffix matches the end of NAME. */
8487 && !strcmp (cp->suffix,
8488 name + length - strlen (cp->suffix))
8490 break;
8493 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
8494 /* Look again, but case-insensitively this time. */
8495 if (cp < compilers)
8496 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8498 if (/* The suffix `-' matches only the file name `-'. */
8499 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
8500 || (strlen (cp->suffix) < length
8501 /* See if the suffix matches the end of NAME. */
8502 && ((!strcmp (cp->suffix,
8503 name + length - strlen (cp->suffix))
8504 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
8505 && !strcasecmp (cp->suffix,
8506 name + length - strlen (cp->suffix)))
8508 break;
8510 #endif
8512 if (cp >= compilers)
8514 if (cp->spec[0] != '@')
8515 /* A non-alias entry: return it. */
8516 return cp;
8518 /* An alias entry maps a suffix to a language.
8519 Search for the language; pass 0 for NAME and LENGTH
8520 to avoid infinite recursion if language not found. */
8521 return lookup_compiler (NULL, 0, cp->spec + 1);
8523 return 0;
8526 static char *
8527 save_string (const char *s, int len)
8529 char *result = XNEWVEC (char, len + 1);
8531 gcc_checking_assert (strlen (s) >= (unsigned int) len);
8532 memcpy (result, s, len);
8533 result[len] = 0;
8534 return result;
8538 static inline void
8539 validate_switches_from_spec (const char *spec, bool user)
8541 const char *p = spec;
8542 char c;
8543 while ((c = *p++))
8544 if (c == '%'
8545 && (*p == '{'
8546 || *p == '<'
8547 || (*p == 'W' && *++p == '{')
8548 || (*p == '@' && *++p == '{')))
8549 /* We have a switch spec. */
8550 p = validate_switches (p + 1, user);
8553 static void
8554 validate_all_switches (void)
8556 struct compiler *comp;
8557 struct spec_list *spec;
8559 for (comp = compilers; comp->spec; comp++)
8560 validate_switches_from_spec (comp->spec, false);
8562 /* Look through the linked list of specs read from the specs file. */
8563 for (spec = specs; spec; spec = spec->next)
8564 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
8566 validate_switches_from_spec (link_command_spec, false);
8569 /* Look at the switch-name that comes after START
8570 and mark as valid all supplied switches that match it. */
8572 static const char *
8573 validate_switches (const char *start, bool user_spec)
8575 const char *p = start;
8576 const char *atom;
8577 size_t len;
8578 int i;
8579 bool suffix = false;
8580 bool starred = false;
8582 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
8584 next_member:
8585 SKIP_WHITE ();
8587 if (*p == '!')
8588 p++;
8590 SKIP_WHITE ();
8591 if (*p == '.' || *p == ',')
8592 suffix = true, p++;
8594 atom = p;
8595 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
8596 || *p == ',' || *p == '.' || *p == '@')
8597 p++;
8598 len = p - atom;
8600 if (*p == '*')
8601 starred = true, p++;
8603 SKIP_WHITE ();
8605 if (!suffix)
8607 /* Mark all matching switches as valid. */
8608 for (i = 0; i < n_switches; i++)
8609 if (!strncmp (switches[i].part1, atom, len)
8610 && (starred || switches[i].part1[len] == '\0')
8611 && (switches[i].known || user_spec))
8612 switches[i].validated = true;
8615 if (*p) p++;
8616 if (*p && (p[-1] == '|' || p[-1] == '&'))
8617 goto next_member;
8619 if (*p && p[-1] == ':')
8621 while (*p && *p != ';' && *p != '}')
8623 if (*p == '%')
8625 p++;
8626 if (*p == '{' || *p == '<')
8627 p = validate_switches (p+1, user_spec);
8628 else if (p[0] == 'W' && p[1] == '{')
8629 p = validate_switches (p+2, user_spec);
8630 else if (p[0] == '@' && p[1] == '{')
8631 p = validate_switches (p+2, user_spec);
8633 else
8634 p++;
8637 if (*p) p++;
8638 if (*p && p[-1] == ';')
8639 goto next_member;
8642 return p;
8643 #undef SKIP_WHITE
8646 struct mdswitchstr
8648 const char *str;
8649 int len;
8652 static struct mdswitchstr *mdswitches;
8653 static int n_mdswitches;
8655 /* Check whether a particular argument was used. The first time we
8656 canonicalize the switches to keep only the ones we care about. */
8658 struct used_arg_t
8660 public:
8661 int operator () (const char *p, int len);
8662 void finalize ();
8664 private:
8665 struct mswitchstr
8667 const char *str;
8668 const char *replace;
8669 int len;
8670 int rep_len;
8673 mswitchstr *mswitches;
8674 int n_mswitches;
8678 used_arg_t used_arg;
8681 used_arg_t::operator () (const char *p, int len)
8683 int i, j;
8685 if (!mswitches)
8687 struct mswitchstr *matches;
8688 const char *q;
8689 int cnt = 0;
8691 /* Break multilib_matches into the component strings of string
8692 and replacement string. */
8693 for (q = multilib_matches; *q != '\0'; q++)
8694 if (*q == ';')
8695 cnt++;
8697 matches
8698 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
8699 i = 0;
8700 q = multilib_matches;
8701 while (*q != '\0')
8703 matches[i].str = q;
8704 while (*q != ' ')
8706 if (*q == '\0')
8708 invalid_matches:
8709 fatal_error (input_location, "multilib spec %qs is invalid",
8710 multilib_matches);
8712 q++;
8714 matches[i].len = q - matches[i].str;
8716 matches[i].replace = ++q;
8717 while (*q != ';' && *q != '\0')
8719 if (*q == ' ')
8720 goto invalid_matches;
8721 q++;
8723 matches[i].rep_len = q - matches[i].replace;
8724 i++;
8725 if (*q == ';')
8726 q++;
8729 /* Now build a list of the replacement string for switches that we care
8730 about. Make sure we allocate at least one entry. This prevents
8731 xmalloc from calling fatal, and prevents us from re-executing this
8732 block of code. */
8733 mswitches
8734 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
8735 for (i = 0; i < n_switches; i++)
8736 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
8738 int xlen = strlen (switches[i].part1);
8739 for (j = 0; j < cnt; j++)
8740 if (xlen == matches[j].len
8741 && ! strncmp (switches[i].part1, matches[j].str, xlen))
8743 mswitches[n_mswitches].str = matches[j].replace;
8744 mswitches[n_mswitches].len = matches[j].rep_len;
8745 mswitches[n_mswitches].replace = (char *) 0;
8746 mswitches[n_mswitches].rep_len = 0;
8747 n_mswitches++;
8748 break;
8752 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
8753 on the command line nor any options mutually incompatible with
8754 them. */
8755 for (i = 0; i < n_mdswitches; i++)
8757 const char *r;
8759 for (q = multilib_options; *q != '\0'; *q && q++)
8761 while (*q == ' ')
8762 q++;
8764 r = q;
8765 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
8766 || strchr (" /", q[mdswitches[i].len]) == NULL)
8768 while (*q != ' ' && *q != '/' && *q != '\0')
8769 q++;
8770 if (*q != '/')
8771 break;
8772 q++;
8775 if (*q != ' ' && *q != '\0')
8777 while (*r != ' ' && *r != '\0')
8779 q = r;
8780 while (*q != ' ' && *q != '/' && *q != '\0')
8781 q++;
8783 if (used_arg (r, q - r))
8784 break;
8786 if (*q != '/')
8788 mswitches[n_mswitches].str = mdswitches[i].str;
8789 mswitches[n_mswitches].len = mdswitches[i].len;
8790 mswitches[n_mswitches].replace = (char *) 0;
8791 mswitches[n_mswitches].rep_len = 0;
8792 n_mswitches++;
8793 break;
8796 r = q + 1;
8798 break;
8804 for (i = 0; i < n_mswitches; i++)
8805 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
8806 return 1;
8808 return 0;
8811 void used_arg_t::finalize ()
8813 XDELETEVEC (mswitches);
8814 mswitches = NULL;
8815 n_mswitches = 0;
8819 static int
8820 default_arg (const char *p, int len)
8822 int i;
8824 for (i = 0; i < n_mdswitches; i++)
8825 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
8826 return 1;
8828 return 0;
8831 /* Work out the subdirectory to use based on the options. The format of
8832 multilib_select is a list of elements. Each element is a subdirectory
8833 name followed by a list of options followed by a semicolon. The format
8834 of multilib_exclusions is the same, but without the preceding
8835 directory. First gcc will check the exclusions, if none of the options
8836 beginning with an exclamation point are present, and all of the other
8837 options are present, then we will ignore this completely. Passing
8838 that, gcc will consider each multilib_select in turn using the same
8839 rules for matching the options. If a match is found, that subdirectory
8840 will be used.
8841 A subdirectory name is optionally followed by a colon and the corresponding
8842 multiarch name. */
8844 static void
8845 set_multilib_dir (void)
8847 const char *p;
8848 unsigned int this_path_len;
8849 const char *this_path, *this_arg;
8850 const char *start, *end;
8851 int not_arg;
8852 int ok, ndfltok, first;
8854 n_mdswitches = 0;
8855 start = multilib_defaults;
8856 while (*start == ' ' || *start == '\t')
8857 start++;
8858 while (*start != '\0')
8860 n_mdswitches++;
8861 while (*start != ' ' && *start != '\t' && *start != '\0')
8862 start++;
8863 while (*start == ' ' || *start == '\t')
8864 start++;
8867 if (n_mdswitches)
8869 int i = 0;
8871 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
8872 for (start = multilib_defaults; *start != '\0'; start = end + 1)
8874 while (*start == ' ' || *start == '\t')
8875 start++;
8877 if (*start == '\0')
8878 break;
8880 for (end = start + 1;
8881 *end != ' ' && *end != '\t' && *end != '\0'; end++)
8884 obstack_grow (&multilib_obstack, start, end - start);
8885 obstack_1grow (&multilib_obstack, 0);
8886 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
8887 mdswitches[i++].len = end - start;
8889 if (*end == '\0')
8890 break;
8894 p = multilib_exclusions;
8895 while (*p != '\0')
8897 /* Ignore newlines. */
8898 if (*p == '\n')
8900 ++p;
8901 continue;
8904 /* Check the arguments. */
8905 ok = 1;
8906 while (*p != ';')
8908 if (*p == '\0')
8910 invalid_exclusions:
8911 fatal_error (input_location, "multilib exclusions %qs is invalid",
8912 multilib_exclusions);
8915 if (! ok)
8917 ++p;
8918 continue;
8921 this_arg = p;
8922 while (*p != ' ' && *p != ';')
8924 if (*p == '\0')
8925 goto invalid_exclusions;
8926 ++p;
8929 if (*this_arg != '!')
8930 not_arg = 0;
8931 else
8933 not_arg = 1;
8934 ++this_arg;
8937 ok = used_arg (this_arg, p - this_arg);
8938 if (not_arg)
8939 ok = ! ok;
8941 if (*p == ' ')
8942 ++p;
8945 if (ok)
8946 return;
8948 ++p;
8951 first = 1;
8952 p = multilib_select;
8954 /* Append multilib reuse rules if any. With those rules, we can reuse
8955 one multilib for certain different options sets. */
8956 if (strlen (multilib_reuse) > 0)
8957 p = concat (p, multilib_reuse, NULL);
8959 while (*p != '\0')
8961 /* Ignore newlines. */
8962 if (*p == '\n')
8964 ++p;
8965 continue;
8968 /* Get the initial path. */
8969 this_path = p;
8970 while (*p != ' ')
8972 if (*p == '\0')
8974 invalid_select:
8975 fatal_error (input_location, "multilib select %qs %qs is invalid",
8976 multilib_select, multilib_reuse);
8978 ++p;
8980 this_path_len = p - this_path;
8982 /* Check the arguments. */
8983 ok = 1;
8984 ndfltok = 1;
8985 ++p;
8986 while (*p != ';')
8988 if (*p == '\0')
8989 goto invalid_select;
8991 if (! ok)
8993 ++p;
8994 continue;
8997 this_arg = p;
8998 while (*p != ' ' && *p != ';')
9000 if (*p == '\0')
9001 goto invalid_select;
9002 ++p;
9005 if (*this_arg != '!')
9006 not_arg = 0;
9007 else
9009 not_arg = 1;
9010 ++this_arg;
9013 /* If this is a default argument, we can just ignore it.
9014 This is true even if this_arg begins with '!'. Beginning
9015 with '!' does not mean that this argument is necessarily
9016 inappropriate for this library: it merely means that
9017 there is a more specific library which uses this
9018 argument. If this argument is a default, we need not
9019 consider that more specific library. */
9020 ok = used_arg (this_arg, p - this_arg);
9021 if (not_arg)
9022 ok = ! ok;
9024 if (! ok)
9025 ndfltok = 0;
9027 if (default_arg (this_arg, p - this_arg))
9028 ok = 1;
9030 if (*p == ' ')
9031 ++p;
9034 if (ok && first)
9036 if (this_path_len != 1
9037 || this_path[0] != '.')
9039 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
9040 char *q;
9042 strncpy (new_multilib_dir, this_path, this_path_len);
9043 new_multilib_dir[this_path_len] = '\0';
9044 q = strchr (new_multilib_dir, ':');
9045 if (q != NULL)
9046 *q = '\0';
9047 multilib_dir = new_multilib_dir;
9049 first = 0;
9052 if (ndfltok)
9054 const char *q = this_path, *end = this_path + this_path_len;
9056 while (q < end && *q != ':')
9057 q++;
9058 if (q < end)
9060 const char *q2 = q + 1, *ml_end = end;
9061 char *new_multilib_os_dir;
9063 while (q2 < end && *q2 != ':')
9064 q2++;
9065 if (*q2 == ':')
9066 ml_end = q2;
9067 if (ml_end - q == 1)
9068 multilib_os_dir = xstrdup (".");
9069 else
9071 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
9072 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
9073 new_multilib_os_dir[ml_end - q - 1] = '\0';
9074 multilib_os_dir = new_multilib_os_dir;
9077 if (q2 < end && *q2 == ':')
9079 char *new_multiarch_dir = XNEWVEC (char, end - q2);
9080 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
9081 new_multiarch_dir[end - q2 - 1] = '\0';
9082 multiarch_dir = new_multiarch_dir;
9084 break;
9088 ++p;
9091 if (multilib_dir == NULL && multilib_os_dir != NULL
9092 && strcmp (multilib_os_dir, ".") == 0)
9094 free (CONST_CAST (char *, multilib_os_dir));
9095 multilib_os_dir = NULL;
9097 else if (multilib_dir != NULL && multilib_os_dir == NULL)
9098 multilib_os_dir = multilib_dir;
9101 /* Print out the multiple library subdirectory selection
9102 information. This prints out a series of lines. Each line looks
9103 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
9104 required. Only the desired options are printed out, the negative
9105 matches. The options are print without a leading dash. There are
9106 no spaces to make it easy to use the information in the shell.
9107 Each subdirectory is printed only once. This assumes the ordering
9108 generated by the genmultilib script. Also, we leave out ones that match
9109 the exclusions. */
9111 static void
9112 print_multilib_info (void)
9114 const char *p = multilib_select;
9115 const char *last_path = 0, *this_path;
9116 int skip;
9117 unsigned int last_path_len = 0;
9119 while (*p != '\0')
9121 skip = 0;
9122 /* Ignore newlines. */
9123 if (*p == '\n')
9125 ++p;
9126 continue;
9129 /* Get the initial path. */
9130 this_path = p;
9131 while (*p != ' ')
9133 if (*p == '\0')
9135 invalid_select:
9136 fatal_error (input_location,
9137 "multilib select %qs is invalid", multilib_select);
9140 ++p;
9143 /* When --disable-multilib was used but target defines
9144 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
9145 with .:: for multiarch configurations) are there just to find
9146 multilib_os_dir, so skip them from output. */
9147 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
9148 skip = 1;
9150 /* Check for matches with the multilib_exclusions. We don't bother
9151 with the '!' in either list. If any of the exclusion rules match
9152 all of its options with the select rule, we skip it. */
9154 const char *e = multilib_exclusions;
9155 const char *this_arg;
9157 while (*e != '\0')
9159 int m = 1;
9160 /* Ignore newlines. */
9161 if (*e == '\n')
9163 ++e;
9164 continue;
9167 /* Check the arguments. */
9168 while (*e != ';')
9170 const char *q;
9171 int mp = 0;
9173 if (*e == '\0')
9175 invalid_exclusion:
9176 fatal_error (input_location,
9177 "multilib exclusion %qs is invalid",
9178 multilib_exclusions);
9181 if (! m)
9183 ++e;
9184 continue;
9187 this_arg = e;
9189 while (*e != ' ' && *e != ';')
9191 if (*e == '\0')
9192 goto invalid_exclusion;
9193 ++e;
9196 q = p + 1;
9197 while (*q != ';')
9199 const char *arg;
9200 int len = e - this_arg;
9202 if (*q == '\0')
9203 goto invalid_select;
9205 arg = q;
9207 while (*q != ' ' && *q != ';')
9209 if (*q == '\0')
9210 goto invalid_select;
9211 ++q;
9214 if (! strncmp (arg, this_arg,
9215 (len < q - arg) ? q - arg : len)
9216 || default_arg (this_arg, e - this_arg))
9218 mp = 1;
9219 break;
9222 if (*q == ' ')
9223 ++q;
9226 if (! mp)
9227 m = 0;
9229 if (*e == ' ')
9230 ++e;
9233 if (m)
9235 skip = 1;
9236 break;
9239 if (*e != '\0')
9240 ++e;
9244 if (! skip)
9246 /* If this is a duplicate, skip it. */
9247 skip = (last_path != 0
9248 && (unsigned int) (p - this_path) == last_path_len
9249 && ! filename_ncmp (last_path, this_path, last_path_len));
9251 last_path = this_path;
9252 last_path_len = p - this_path;
9255 /* If this directory requires any default arguments, we can skip
9256 it. We will already have printed a directory identical to
9257 this one which does not require that default argument. */
9258 if (! skip)
9260 const char *q;
9262 q = p + 1;
9263 while (*q != ';')
9265 const char *arg;
9267 if (*q == '\0')
9268 goto invalid_select;
9270 if (*q == '!')
9271 arg = NULL;
9272 else
9273 arg = q;
9275 while (*q != ' ' && *q != ';')
9277 if (*q == '\0')
9278 goto invalid_select;
9279 ++q;
9282 if (arg != NULL
9283 && default_arg (arg, q - arg))
9285 skip = 1;
9286 break;
9289 if (*q == ' ')
9290 ++q;
9294 if (! skip)
9296 const char *p1;
9298 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
9299 putchar (*p1);
9300 putchar (';');
9303 ++p;
9304 while (*p != ';')
9306 int use_arg;
9308 if (*p == '\0')
9309 goto invalid_select;
9311 if (skip)
9313 ++p;
9314 continue;
9317 use_arg = *p != '!';
9319 if (use_arg)
9320 putchar ('@');
9322 while (*p != ' ' && *p != ';')
9324 if (*p == '\0')
9325 goto invalid_select;
9326 if (use_arg)
9327 putchar (*p);
9328 ++p;
9331 if (*p == ' ')
9332 ++p;
9335 if (! skip)
9337 /* If there are extra options, print them now. */
9338 if (multilib_extra && *multilib_extra)
9340 int print_at = TRUE;
9341 const char *q;
9343 for (q = multilib_extra; *q != '\0'; q++)
9345 if (*q == ' ')
9346 print_at = TRUE;
9347 else
9349 if (print_at)
9350 putchar ('@');
9351 putchar (*q);
9352 print_at = FALSE;
9357 putchar ('\n');
9360 ++p;
9364 /* getenv built-in spec function.
9366 Returns the value of the environment variable given by its first argument,
9367 concatenated with the second argument. If the variable is not defined, a
9368 fatal error is issued unless such undefs are internally allowed, in which
9369 case the variable name prefixed by a '/' is used as the variable value.
9371 The leading '/' allows using the result at a spot where a full path would
9372 normally be expected and when the actual value doesn't really matter since
9373 undef vars are allowed. */
9375 static const char *
9376 getenv_spec_function (int argc, const char **argv)
9378 const char *value;
9379 const char *varname;
9381 char *result;
9382 char *ptr;
9383 size_t len;
9385 if (argc != 2)
9386 return NULL;
9388 varname = argv[0];
9389 value = env.get (varname);
9391 /* If the variable isn't defined and this is allowed, craft our expected
9392 return value. Assume variable names used in specs strings don't contain
9393 any active spec character so don't need escaping. */
9394 if (!value && spec_undefvar_allowed)
9396 result = XNEWVAR (char, strlen(varname) + 2);
9397 sprintf (result, "/%s", varname);
9398 return result;
9401 if (!value)
9402 fatal_error (input_location,
9403 "environment variable %qs not defined", varname);
9405 /* We have to escape every character of the environment variable so
9406 they are not interpreted as active spec characters. A
9407 particularly painful case is when we are reading a variable
9408 holding a windows path complete with \ separators. */
9409 len = strlen (value) * 2 + strlen (argv[1]) + 1;
9410 result = XNEWVAR (char, len);
9411 for (ptr = result; *value; ptr += 2)
9413 ptr[0] = '\\';
9414 ptr[1] = *value++;
9417 strcpy (ptr, argv[1]);
9419 return result;
9422 /* if-exists built-in spec function.
9424 Checks to see if the file specified by the absolute pathname in
9425 ARGS exists. Returns that pathname if found.
9427 The usual use for this function is to check for a library file
9428 (whose name has been expanded with %s). */
9430 static const char *
9431 if_exists_spec_function (int argc, const char **argv)
9433 /* Must have only one argument. */
9434 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
9435 return argv[0];
9437 return NULL;
9440 /* if-exists-else built-in spec function.
9442 This is like if-exists, but takes an additional argument which
9443 is returned if the first argument does not exist. */
9445 static const char *
9446 if_exists_else_spec_function (int argc, const char **argv)
9448 /* Must have exactly two arguments. */
9449 if (argc != 2)
9450 return NULL;
9452 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
9453 return argv[0];
9455 return argv[1];
9458 /* sanitize built-in spec function.
9460 This returns non-NULL, if sanitizing address, thread or
9461 any of the undefined behavior sanitizers. */
9463 static const char *
9464 sanitize_spec_function (int argc, const char **argv)
9466 if (argc != 1)
9467 return NULL;
9469 if (strcmp (argv[0], "address") == 0)
9470 return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
9471 if (strcmp (argv[0], "kernel-address") == 0)
9472 return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
9473 if (strcmp (argv[0], "thread") == 0)
9474 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
9475 if (strcmp (argv[0], "undefined") == 0)
9476 return ((flag_sanitize
9477 & (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT))
9478 && !flag_sanitize_undefined_trap_on_error) ? "" : NULL;
9479 if (strcmp (argv[0], "leak") == 0)
9480 return ((flag_sanitize
9481 & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
9482 == SANITIZE_LEAK) ? "" : NULL;
9483 return NULL;
9486 /* replace-outfile built-in spec function.
9488 This looks for the first argument in the outfiles array's name and
9489 replaces it with the second argument. */
9491 static const char *
9492 replace_outfile_spec_function (int argc, const char **argv)
9494 int i;
9495 /* Must have exactly two arguments. */
9496 if (argc != 2)
9497 abort ();
9499 for (i = 0; i < n_infiles; i++)
9501 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
9502 outfiles[i] = xstrdup (argv[1]);
9504 return NULL;
9507 /* remove-outfile built-in spec function.
9509 * This looks for the first argument in the outfiles array's name and
9510 * removes it. */
9512 static const char *
9513 remove_outfile_spec_function (int argc, const char **argv)
9515 int i;
9516 /* Must have exactly one argument. */
9517 if (argc != 1)
9518 abort ();
9520 for (i = 0; i < n_infiles; i++)
9522 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
9523 outfiles[i] = NULL;
9525 return NULL;
9528 /* Given two version numbers, compares the two numbers.
9529 A version number must match the regular expression
9530 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
9532 static int
9533 compare_version_strings (const char *v1, const char *v2)
9535 int rresult;
9536 regex_t r;
9538 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
9539 REG_EXTENDED | REG_NOSUB) != 0)
9540 abort ();
9541 rresult = regexec (&r, v1, 0, NULL, 0);
9542 if (rresult == REG_NOMATCH)
9543 fatal_error (input_location, "invalid version number %qs", v1);
9544 else if (rresult != 0)
9545 abort ();
9546 rresult = regexec (&r, v2, 0, NULL, 0);
9547 if (rresult == REG_NOMATCH)
9548 fatal_error (input_location, "invalid version number %qs", v2);
9549 else if (rresult != 0)
9550 abort ();
9552 return strverscmp (v1, v2);
9556 /* version_compare built-in spec function.
9558 This takes an argument of the following form:
9560 <comparison-op> <arg1> [<arg2>] <switch> <result>
9562 and produces "result" if the comparison evaluates to true,
9563 and nothing if it doesn't.
9565 The supported <comparison-op> values are:
9567 >= true if switch is a later (or same) version than arg1
9568 !> opposite of >=
9569 < true if switch is an earlier version than arg1
9570 !< opposite of <
9571 >< true if switch is arg1 or later, and earlier than arg2
9572 <> true if switch is earlier than arg1 or is arg2 or later
9574 If the switch is not present, the condition is false unless
9575 the first character of the <comparison-op> is '!'.
9577 For example,
9578 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
9579 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
9581 static const char *
9582 version_compare_spec_function (int argc, const char **argv)
9584 int comp1, comp2;
9585 size_t switch_len;
9586 const char *switch_value = NULL;
9587 int nargs = 1, i;
9588 bool result;
9590 if (argc < 3)
9591 fatal_error (input_location, "too few arguments to %%:version-compare");
9592 if (argv[0][0] == '\0')
9593 abort ();
9594 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
9595 nargs = 2;
9596 if (argc != nargs + 3)
9597 fatal_error (input_location, "too many arguments to %%:version-compare");
9599 switch_len = strlen (argv[nargs + 1]);
9600 for (i = 0; i < n_switches; i++)
9601 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
9602 && check_live_switch (i, switch_len))
9603 switch_value = switches[i].part1 + switch_len;
9605 if (switch_value == NULL)
9606 comp1 = comp2 = -1;
9607 else
9609 comp1 = compare_version_strings (switch_value, argv[1]);
9610 if (nargs == 2)
9611 comp2 = compare_version_strings (switch_value, argv[2]);
9612 else
9613 comp2 = -1; /* This value unused. */
9616 switch (argv[0][0] << 8 | argv[0][1])
9618 case '>' << 8 | '=':
9619 result = comp1 >= 0;
9620 break;
9621 case '!' << 8 | '<':
9622 result = comp1 >= 0 || switch_value == NULL;
9623 break;
9624 case '<' << 8:
9625 result = comp1 < 0;
9626 break;
9627 case '!' << 8 | '>':
9628 result = comp1 < 0 || switch_value == NULL;
9629 break;
9630 case '>' << 8 | '<':
9631 result = comp1 >= 0 && comp2 < 0;
9632 break;
9633 case '<' << 8 | '>':
9634 result = comp1 < 0 || comp2 >= 0;
9635 break;
9637 default:
9638 fatal_error (input_location,
9639 "unknown operator %qs in %%:version-compare", argv[0]);
9641 if (! result)
9642 return NULL;
9644 return argv[nargs + 2];
9647 /* %:include builtin spec function. This differs from %include in that it
9648 can be nested inside a spec, and thus be conditionalized. It takes
9649 one argument, the filename, and looks for it in the startfile path.
9650 The result is always NULL, i.e. an empty expansion. */
9652 static const char *
9653 include_spec_function (int argc, const char **argv)
9655 char *file;
9657 if (argc != 1)
9658 abort ();
9660 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
9661 read_specs (file ? file : argv[0], false, false);
9663 return NULL;
9666 /* %:find-file spec function. This function replaces its argument by
9667 the file found through find_file, that is the -print-file-name gcc
9668 program option. */
9669 static const char *
9670 find_file_spec_function (int argc, const char **argv)
9672 const char *file;
9674 if (argc != 1)
9675 abort ();
9677 file = find_file (argv[0]);
9678 return file;
9682 /* %:find-plugindir spec function. This function replaces its argument
9683 by the -iplugindir=<dir> option. `dir' is found through find_file, that
9684 is the -print-file-name gcc program option. */
9685 static const char *
9686 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
9688 const char *option;
9690 if (argc != 0)
9691 abort ();
9693 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
9694 return option;
9698 /* %:print-asm-header spec function. Print a banner to say that the
9699 following output is from the assembler. */
9701 static const char *
9702 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
9703 const char **argv ATTRIBUTE_UNUSED)
9705 printf (_("Assembler options\n=================\n\n"));
9706 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
9707 fflush (stdout);
9708 return NULL;
9711 /* Get a random number for -frandom-seed */
9713 static unsigned HOST_WIDE_INT
9714 get_random_number (void)
9716 unsigned HOST_WIDE_INT ret = 0;
9717 int fd;
9719 fd = open ("/dev/urandom", O_RDONLY);
9720 if (fd >= 0)
9722 read (fd, &ret, sizeof (HOST_WIDE_INT));
9723 close (fd);
9724 if (ret)
9725 return ret;
9728 /* Get some more or less random data. */
9729 #ifdef HAVE_GETTIMEOFDAY
9731 struct timeval tv;
9733 gettimeofday (&tv, NULL);
9734 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
9736 #else
9738 time_t now = time (NULL);
9740 if (now != (time_t)-1)
9741 ret = (unsigned) now;
9743 #endif
9745 return ret ^ getpid ();
9748 /* %:compare-debug-dump-opt spec function. Save the last argument,
9749 expected to be the last -fdump-final-insns option, or generate a
9750 temporary. */
9752 static const char *
9753 compare_debug_dump_opt_spec_function (int arg,
9754 const char **argv ATTRIBUTE_UNUSED)
9756 char *ret;
9757 char *name;
9758 int which;
9759 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
9761 if (arg != 0)
9762 fatal_error (input_location,
9763 "too many arguments to %%:compare-debug-dump-opt");
9765 do_spec_2 ("%{fdump-final-insns=*:%*}", NULL);
9766 do_spec_1 (" ", 0, NULL);
9768 if (argbuf.length () > 0
9769 && strcmp (argv[argbuf.length () - 1], "."))
9771 if (!compare_debug)
9772 return NULL;
9774 name = xstrdup (argv[argbuf.length () - 1]);
9775 ret = NULL;
9777 else
9779 const char *ext = NULL;
9781 if (argbuf.length () > 0)
9783 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}", NULL);
9784 ext = ".gkd";
9786 else if (!compare_debug)
9787 return NULL;
9788 else
9789 do_spec_2 ("%g.gkd", NULL);
9791 do_spec_1 (" ", 0, NULL);
9793 gcc_assert (argbuf.length () > 0);
9795 name = concat (argbuf.last (), ext, NULL);
9797 ret = concat ("-fdump-final-insns=", name, NULL);
9800 which = compare_debug < 0;
9801 debug_check_temp_file[which] = name;
9803 if (!which)
9805 unsigned HOST_WIDE_INT value = get_random_number ();
9807 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
9810 if (*random_seed)
9812 char *tmp = ret;
9813 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
9814 ret, NULL);
9815 free (tmp);
9818 if (which)
9819 *random_seed = 0;
9821 return ret;
9824 static const char *debug_auxbase_opt;
9826 /* %:compare-debug-self-opt spec function. Expands to the options
9827 that are to be passed in the second compilation of
9828 compare-debug. */
9830 static const char *
9831 compare_debug_self_opt_spec_function (int arg,
9832 const char **argv ATTRIBUTE_UNUSED)
9834 if (arg != 0)
9835 fatal_error (input_location,
9836 "too many arguments to %%:compare-debug-self-opt");
9838 if (compare_debug >= 0)
9839 return NULL;
9841 do_spec_2 ("%{c|S:%{o*:%*}}", NULL);
9842 do_spec_1 (" ", 0, NULL);
9844 if (argbuf.length () > 0)
9845 debug_auxbase_opt = concat ("-auxbase-strip ",
9846 argbuf.last (),
9847 NULL);
9848 else
9849 debug_auxbase_opt = NULL;
9851 return concat ("\
9852 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
9853 %<fdump-final-insns=* -w -S -o %j \
9854 %{!fcompare-debug-second:-fcompare-debug-second} \
9855 ", compare_debug_opt, NULL);
9858 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
9859 options that are to be passed in the second compilation of
9860 compare-debug. It expects, as an argument, the basename of the
9861 current input file name, with the .gk suffix appended to it. */
9863 static const char *
9864 compare_debug_auxbase_opt_spec_function (int arg,
9865 const char **argv)
9867 char *name;
9868 int len;
9870 if (arg == 0)
9871 fatal_error (input_location,
9872 "too few arguments to %%:compare-debug-auxbase-opt");
9874 if (arg != 1)
9875 fatal_error (input_location,
9876 "too many arguments to %%:compare-debug-auxbase-opt");
9878 if (compare_debug >= 0)
9879 return NULL;
9881 len = strlen (argv[0]);
9882 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
9883 fatal_error (input_location, "argument to %%:compare-debug-auxbase-opt "
9884 "does not end in %<.gk%>");
9886 if (debug_auxbase_opt)
9887 return debug_auxbase_opt;
9889 #define OPT "-auxbase "
9891 len -= 3;
9892 name = (char*) xmalloc (sizeof (OPT) + len);
9893 memcpy (name, OPT, sizeof (OPT) - 1);
9894 memcpy (name + sizeof (OPT) - 1, argv[0], len);
9895 name[sizeof (OPT) - 1 + len] = '\0';
9897 #undef OPT
9899 return name;
9902 /* %:pass-through-libs spec function. Finds all -l options and input
9903 file names in the lib spec passed to it, and makes a list of them
9904 prepended with the plugin option to cause them to be passed through
9905 to the final link after all the new object files have been added. */
9907 const char *
9908 pass_through_libs_spec_func (int argc, const char **argv)
9910 char *prepended = xstrdup (" ");
9911 int n;
9912 /* Shlemiel the painter's algorithm. Innately horrible, but at least
9913 we know that there will never be more than a handful of strings to
9914 concat, and it's only once per run, so it's not worth optimising. */
9915 for (n = 0; n < argc; n++)
9917 char *old = prepended;
9918 /* Anything that isn't an option is a full path to an output
9919 file; pass it through if it ends in '.a'. Among options,
9920 pass only -l. */
9921 if (argv[n][0] == '-' && argv[n][1] == 'l')
9923 const char *lopt = argv[n] + 2;
9924 /* Handle both joined and non-joined -l options. If for any
9925 reason there's a trailing -l with no joined or following
9926 arg just discard it. */
9927 if (!*lopt && ++n >= argc)
9928 break;
9929 else if (!*lopt)
9930 lopt = argv[n];
9931 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
9932 lopt, " ", NULL);
9934 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
9936 prepended = concat (prepended, "-plugin-opt=-pass-through=",
9937 argv[n], " ", NULL);
9939 if (prepended != old)
9940 free (old);
9942 return prepended;
9945 /* %:replace-extension spec function. Replaces the extension of the
9946 first argument with the second argument. */
9948 const char *
9949 replace_extension_spec_func (int argc, const char **argv)
9951 char *name;
9952 char *p;
9953 char *result;
9954 int i;
9956 if (argc != 2)
9957 fatal_error (input_location, "too few arguments to %%:replace-extension");
9959 name = xstrdup (argv[0]);
9961 for (i = strlen (name) - 1; i >= 0; i--)
9962 if (IS_DIR_SEPARATOR (name[i]))
9963 break;
9965 p = strrchr (name + i + 1, '.');
9966 if (p != NULL)
9967 *p = '\0';
9969 result = concat (name, argv[1], NULL);
9971 free (name);
9972 return result;
9975 /* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
9976 Otherwise, return NULL. */
9978 static const char *
9979 greater_than_spec_func (int argc, const char **argv)
9981 char *converted;
9983 if (argc == 1)
9984 return NULL;
9986 gcc_assert (argc >= 2);
9988 long arg = strtol (argv[argc - 2], &converted, 10);
9989 gcc_assert (converted != argv[argc - 2]);
9991 long lim = strtol (argv[argc - 1], &converted, 10);
9992 gcc_assert (converted != argv[argc - 1]);
9994 if (arg > lim)
9995 return "";
9997 return NULL;
10000 /* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
10001 Otherwise, return NULL. */
10003 static const char *
10004 debug_level_greater_than_spec_func (int argc, const char **argv)
10006 char *converted;
10008 if (argc != 1)
10009 fatal_error (input_location,
10010 "wrong number of arguments to %%:debug-level-gt");
10012 long arg = strtol (argv[0], &converted, 10);
10013 gcc_assert (converted != argv[0]);
10015 if (debug_info_level > arg)
10016 return "";
10018 return NULL;
10021 static void
10022 path_prefix_reset (path_prefix *prefix)
10024 struct prefix_list *iter, *next;
10025 iter = prefix->plist;
10026 while (iter)
10028 next = iter->next;
10029 free (const_cast <char *> (iter->prefix));
10030 XDELETE (iter);
10031 iter = next;
10033 prefix->plist = 0;
10034 prefix->max_len = 0;
10037 /* The function takes 3 arguments: OPTION name, file name and location
10038 where we search for Fortran modules.
10039 When the FILE is found by find_file, return OPTION=path_to_file. */
10041 static const char *
10042 find_fortran_preinclude_file (int argc, const char **argv)
10044 char *result = NULL;
10045 if (argc != 3)
10046 return NULL;
10048 struct path_prefix prefixes = { 0, 0, "preinclude" };
10050 /* Search first for 'finclude' folder location for a header file
10051 installed by the compiler (similar to omp_lib.h). */
10052 add_prefix (&prefixes, argv[2], NULL, 0, 0, 0);
10053 #ifdef TOOL_INCLUDE_DIR
10054 /* Then search: <prefix>/<target>/<include>/finclude */
10055 add_prefix (&prefixes, TOOL_INCLUDE_DIR "/finclude/",
10056 NULL, 0, 0, 0);
10057 #endif
10058 #ifdef NATIVE_SYSTEM_HEADER_DIR
10059 /* Then search: <sysroot>/usr/include/finclude/<multilib> */
10060 add_sysrooted_hdrs_prefix (&prefixes, NATIVE_SYSTEM_HEADER_DIR "/finclude/",
10061 NULL, 0, 0, 0);
10062 #endif
10064 const char *path = find_a_file (&include_prefixes, argv[1], R_OK, false);
10065 if (path != NULL)
10066 result = concat (argv[0], path, NULL);
10067 else
10069 path = find_a_file (&prefixes, argv[1], R_OK, false);
10070 if (path != NULL)
10071 result = concat (argv[0], path, NULL);
10074 path_prefix_reset (&prefixes);
10075 return result;
10079 /* Insert backslash before spaces in ORIG (usually a file path), to
10080 avoid being broken by spec parser.
10082 This function is needed as do_spec_1 treats white space (' ' and '\t')
10083 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
10084 the file name should be treated as a single argument rather than being
10085 broken into multiple. Solution is to insert '\\' before the space in a
10086 file name.
10088 This function converts and only converts all occurrence of ' '
10089 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
10090 "a b" -> "a\\ b"
10091 "a b" -> "a\\ \\ b"
10092 "a\tb" -> "a\\\tb"
10093 "a\\ b" -> "a\\\\ b"
10095 orig: input null-terminating string that was allocated by xalloc. The
10096 memory it points to might be freed in this function. Behavior undefined
10097 if ORIG wasn't xalloced or was freed already at entry.
10099 Return: ORIG if no conversion needed. Otherwise a newly allocated string
10100 that was converted from ORIG. */
10102 static char *
10103 convert_white_space (char *orig)
10105 int len, number_of_space = 0;
10107 for (len = 0; orig[len]; len++)
10108 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
10110 if (number_of_space)
10112 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
10113 int j, k;
10114 for (j = 0, k = 0; j <= len; j++, k++)
10116 if (orig[j] == ' ' || orig[j] == '\t')
10117 new_spec[k++] = '\\';
10118 new_spec[k] = orig[j];
10120 free (orig);
10121 return new_spec;
10123 else
10124 return orig;
10127 /* Restore all state within gcc.c to the initial state, so that the driver
10128 code can be safely re-run in-process.
10130 Many const char * variables are referenced by static specs (see
10131 INIT_STATIC_SPEC above). These variables are restored to their default
10132 values by a simple loop over the static specs.
10134 For other variables, we directly restore them all to their initial
10135 values (often implicitly 0).
10137 Free the various obstacks in this file, along with "opts_obstack"
10138 from opts.c.
10140 This function also restores any environment variables that were changed. */
10142 void
10143 driver::finalize ()
10145 env.restore ();
10146 diagnostic_finish (global_dc);
10148 is_cpp_driver = 0;
10149 at_file_supplied = 0;
10150 print_help_list = 0;
10151 print_version = 0;
10152 verbose_only_flag = 0;
10153 print_subprocess_help = 0;
10154 use_ld = NULL;
10155 report_times_to_file = NULL;
10156 target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
10157 target_system_root_changed = 0;
10158 target_sysroot_suffix = 0;
10159 target_sysroot_hdrs_suffix = 0;
10160 save_temps_flag = SAVE_TEMPS_NONE;
10161 save_temps_prefix = 0;
10162 save_temps_length = 0;
10163 spec_machine = DEFAULT_TARGET_MACHINE;
10164 greatest_status = 1;
10166 obstack_free (&obstack, NULL);
10167 obstack_free (&opts_obstack, NULL); /* in opts.c */
10168 obstack_free (&collect_obstack, NULL);
10170 link_command_spec = LINK_COMMAND_SPEC;
10172 obstack_free (&multilib_obstack, NULL);
10174 user_specs_head = NULL;
10175 user_specs_tail = NULL;
10177 /* Within the "compilers" vec, the fields "suffix" and "spec" were
10178 statically allocated for the default compilers, but dynamically
10179 allocated for additional compilers. Delete them for the latter. */
10180 for (int i = n_default_compilers; i < n_compilers; i++)
10182 free (const_cast <char *> (compilers[i].suffix));
10183 free (const_cast <char *> (compilers[i].spec));
10185 XDELETEVEC (compilers);
10186 compilers = NULL;
10187 n_compilers = 0;
10189 linker_options.truncate (0);
10190 assembler_options.truncate (0);
10191 preprocessor_options.truncate (0);
10193 path_prefix_reset (&exec_prefixes);
10194 path_prefix_reset (&startfile_prefixes);
10195 path_prefix_reset (&include_prefixes);
10197 machine_suffix = 0;
10198 just_machine_suffix = 0;
10199 gcc_exec_prefix = 0;
10200 gcc_libexec_prefix = 0;
10201 md_exec_prefix = MD_EXEC_PREFIX;
10202 md_startfile_prefix = MD_STARTFILE_PREFIX;
10203 md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
10204 multilib_dir = 0;
10205 multilib_os_dir = 0;
10206 multiarch_dir = 0;
10208 /* Free any specs dynamically-allocated by set_spec.
10209 These will be at the head of the list, before the
10210 statically-allocated ones. */
10211 if (specs)
10213 while (specs != static_specs)
10215 spec_list *next = specs->next;
10216 free (const_cast <char *> (specs->name));
10217 XDELETE (specs);
10218 specs = next;
10220 specs = 0;
10222 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
10224 spec_list *sl = &static_specs[i];
10225 if (sl->alloc_p)
10227 if (0)
10228 free (const_cast <char *> (*(sl->ptr_spec)));
10229 sl->alloc_p = false;
10231 *(sl->ptr_spec) = sl->default_ptr;
10233 #ifdef EXTRA_SPECS
10234 extra_specs = NULL;
10235 #endif
10237 processing_spec_function = 0;
10239 clear_args ();
10241 have_c = 0;
10242 have_o = 0;
10244 temp_names = NULL;
10245 execution_count = 0;
10246 signal_count = 0;
10248 temp_filename = NULL;
10249 temp_filename_length = 0;
10250 always_delete_queue = NULL;
10251 failure_delete_queue = NULL;
10253 XDELETEVEC (switches);
10254 switches = NULL;
10255 n_switches = 0;
10256 n_switches_alloc = 0;
10258 compare_debug = 0;
10259 compare_debug_second = 0;
10260 compare_debug_opt = NULL;
10261 for (int i = 0; i < 2; i++)
10263 switches_debug_check[i] = NULL;
10264 n_switches_debug_check[i] = 0;
10265 n_switches_alloc_debug_check[i] = 0;
10266 debug_check_temp_file[i] = NULL;
10269 XDELETEVEC (infiles);
10270 infiles = NULL;
10271 n_infiles = 0;
10272 n_infiles_alloc = 0;
10274 combine_inputs = false;
10275 added_libraries = 0;
10276 XDELETEVEC (outfiles);
10277 outfiles = NULL;
10278 spec_lang = 0;
10279 last_language_n_infiles = 0;
10280 gcc_input_filename = NULL;
10281 input_file_number = 0;
10282 input_filename_length = 0;
10283 basename_length = 0;
10284 suffixed_basename_length = 0;
10285 input_basename = NULL;
10286 input_suffix = NULL;
10287 /* We don't need to purge "input_stat", just to unset "input_stat_set". */
10288 input_stat_set = 0;
10289 input_file_compiler = NULL;
10290 arg_going = 0;
10291 delete_this_arg = 0;
10292 this_is_output_file = 0;
10293 this_is_library_file = 0;
10294 this_is_linker_script = 0;
10295 input_from_pipe = 0;
10296 suffix_subst = NULL;
10298 mdswitches = NULL;
10299 n_mdswitches = 0;
10301 debug_auxbase_opt = NULL;
10303 used_arg.finalize ();
10306 /* PR jit/64810.
10307 Targets can provide configure-time default options in
10308 OPTION_DEFAULT_SPECS. The jit needs to access these, but
10309 they are expressed in the spec language.
10311 Run just enough of the driver to be able to expand these
10312 specs, and then call the callback CB on each
10313 such option. The options strings are *without* a leading
10314 '-' character e.g. ("march=x86-64"). Finally, clean up. */
10316 void
10317 driver_get_configure_time_options (void (*cb) (const char *option,
10318 void *user_data),
10319 void *user_data)
10321 size_t i;
10323 obstack_init (&obstack);
10324 init_opts_obstack ();
10325 n_switches = 0;
10327 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
10328 do_option_spec (option_default_specs[i].name,
10329 option_default_specs[i].spec);
10331 for (i = 0; (int) i < n_switches; i++)
10333 gcc_assert (switches[i].part1);
10334 (*cb) (switches[i].part1, user_data);
10337 obstack_free (&opts_obstack, NULL);
10338 obstack_free (&obstack, NULL);
10339 n_switches = 0;