c++: template instantiation during fold_for_warn [PR94038]
[gcc.git] / gcc / gcc.c
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2020 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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.
10
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.
15
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/>. */
19
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.
25
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". */
29
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"
46
47 \f
48
49 /* Manage the manipulation of env vars.
50
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". */
58
59 struct env_manager
60 {
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 ();
66
67 private:
68 bool m_can_restore;
69 bool m_debug;
70 struct kv
71 {
72 char *m_key;
73 char *m_value;
74 };
75 vec<kv> m_keys;
76
77 };
78
79 /* The singleton instance of class env_manager. */
80
81 static env_manager env;
82
83 /* Initializer for class env_manager.
84
85 We can't do this as a constructor since we have a statically
86 allocated instance ("env" above). */
87
88 void
89 env_manager::init (bool can_restore, bool debug)
90 {
91 m_can_restore = can_restore;
92 m_debug = debug;
93 }
94
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. */
98
99 const char *
100 env_manager::get (const char *name)
101 {
102 const char *result = ::getenv (name);
103 if (m_debug)
104 fprintf (stderr, "env_manager::getenv (%s) -> %s\n", name, result);
105 return result;
106 }
107
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. */
112
113 void
114 env_manager::xput (const char *string)
115 {
116 if (m_debug)
117 fprintf (stderr, "env_manager::xput (%s)\n", string);
118 if (verbose_flag)
119 fnotice (stderr, "%s\n", string);
120
121 if (m_can_restore)
122 {
123 char *equals = strchr (const_cast <char *> (string), '=');
124 gcc_assert (equals);
125
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);
133 }
134
135 ::putenv (CONST_CAST (char *, string));
136 }
137
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. */
141
142 void
143 env_manager::restore ()
144 {
145 unsigned int i;
146 struct kv *item;
147
148 gcc_assert (m_can_restore);
149
150 FOR_EACH_VEC_ELT_REVERSE (m_keys, i, item)
151 {
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);
160 }
161
162 m_keys.truncate (0);
163 }
164
165 /* Forbid other uses of getenv and putenv. */
166 #if (GCC_VERSION >= 3000)
167 #pragma GCC poison getenv putenv
168 #endif
169
170 \f
171
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
178
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
185
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
192
193 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
194
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
199
200 /* If a stage of compilation returns an exit status >= 1,
201 compilation of that file ceases. */
202
203 #define MIN_FATAL_STATUS 1
204
205 /* Flag set by cppspec.c to 1. */
206 int is_cpp_driver;
207
208 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
209 static bool at_file_supplied;
210
211 /* Definition of string containing the arguments given to configure. */
212 #include "configargs.h"
213
214 /* Flag saying to print the command line options understood by gcc and its
215 sub-processes. */
216
217 static int print_help_list;
218
219 /* Flag saying to print the version of gcc and its sub-processes. */
220
221 static int print_version;
222
223 /* Flag that stores string prefix for which we provide bash completion. */
224
225 static const char *completion = NULL;
226
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;
233
234 /* Flag indicating how to print command line options of sub-processes. */
235
236 static int print_subprocess_help;
237
238 /* Linker suffix passed to -fuse-ld=... */
239 static const char *use_ld;
240
241 /* Whether we should report subprocess execution times to a file. */
242
243 FILE *report_times_to_file = NULL;
244
245 /* Nonzero means place this string before uses of /, so that include
246 and library files can be found in an alternate location. */
247
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;
254
255 /* Nonzero means pass the updated target_system_root to the compiler. */
256
257 static int target_system_root_changed;
258
259 /* Nonzero means append this string to target_system_root. */
260
261 static const char *target_sysroot_suffix = 0;
262
263 /* Nonzero means append this string to target_system_root for headers. */
264
265 static const char *target_sysroot_hdrs_suffix = 0;
266
267 /* Nonzero means write "temp" files in source directory
268 and use the source file's name in them, and don't delete them. */
269
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;
275
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;
279
280 /* The compiler version. */
281
282 static const char *compiler_version;
283
284 /* The target version. */
285
286 static const char *const spec_version = DEFAULT_TARGET_VERSION;
287
288 /* The target machine. */
289
290 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
291 static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
292
293 /* List of offload targets. Separated by colon. Empty string for
294 -foffload=disable. */
295
296 static char *offload_targets = NULL;
297
298 /* Nonzero if cross-compiling.
299 When -b is used, the value comes from the `specs' file. */
300
301 #ifdef CROSS_DIRECTORY_STRUCTURE
302 static const char *cross_compile = "1";
303 #else
304 static const char *cross_compile = "0";
305 #endif
306
307 /* Greatest exit code of sub-processes that has been encountered up to
308 now. */
309 static int greatest_status = 1;
310
311 /* This is the obstack which we use to allocate many strings. */
312
313 static struct obstack obstack;
314
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. */
319
320 static struct obstack collect_obstack;
321
322 /* Forward declaration for prototypes. */
323 struct path_prefix;
324 struct prefix_list;
325
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
390
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 *);
412 \f
413 /* The Specs Language
414
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.
421
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.
427
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*}.
563
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.
578
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.
592
593 %(Spec) processes a specification defined in a specs file as *Spec:
594
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.
600
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.
607
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.
613
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.
617
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.
625
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. */
629 \f
630 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
631
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
637
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} \
648 }"
649 #endif
650
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
656
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
662
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
668
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
674
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
679
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
691
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
705
706 #ifndef LIBASAN_EARLY_SPEC
707 #define LIBASAN_EARLY_SPEC ""
708 #endif
709
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
723
724 #ifndef LIBTSAN_EARLY_SPEC
725 #define LIBTSAN_EARLY_SPEC ""
726 #endif
727
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
741
742 #ifndef LIBLSAN_EARLY_SPEC
743 #define LIBLSAN_EARLY_SPEC ""
744 #endif
745
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
757
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
782
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
795
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
801
802 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
803 #ifndef ENDFILE_SPEC
804 #define ENDFILE_SPEC ""
805 #endif
806
807 #ifndef LINKER_NAME
808 #define LINKER_NAME "collect2"
809 #endif
810
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
816
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 */
843
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
867
868 /* Here is the spec for running the linker, after compiling all files. */
869
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
876
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
887
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
929
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
940
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
946
947 #ifndef LTO_PLUGIN_SPEC
948 #define LTO_PLUGIN_SPEC ""
949 #endif
950
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. */
957
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
984
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
992
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
1003
1004 #ifndef POST_LINK_SPEC
1005 #define POST_LINK_SPEC ""
1006 #endif
1007
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
1026
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.
1032 */
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
1059
1060 #ifndef LINK_LIBGCC_SPEC
1061 /* Generate -L options for startfile prefix list. */
1062 # define LINK_LIBGCC_SPEC "%D"
1063 #endif
1064
1065 #ifndef STARTFILE_PREFIX_SPEC
1066 # define STARTFILE_PREFIX_SPEC ""
1067 #endif
1068
1069 #ifndef SYSROOT_SPEC
1070 # define SYSROOT_SPEC "--sysroot=%R"
1071 #endif
1072
1073 #ifndef SYSROOT_SUFFIX_SPEC
1074 # define SYSROOT_SUFFIX_SPEC ""
1075 #endif
1076
1077 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
1078 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
1079 #endif
1080
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 = "";
1107
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. */
1113
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}";
1119
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*}}";
1133
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}";
1144
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*}";
1148
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}}}";
1168
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}";
1178
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 }\
1184 }";
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 }\
1189 }";
1190 #endif
1191
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;
1201
1202 /* Check whether a particular argument is a default argument. */
1203
1204 #ifndef MULTILIB_DEFAULTS
1205 #define MULTILIB_DEFAULTS { "" }
1206 #endif
1207
1208 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
1209
1210 #ifndef DRIVER_SELF_SPECS
1211 #define DRIVER_SELF_SPECS ""
1212 #endif
1213
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
1221
1222 /* Likewise for -fgnu-tm. */
1223 #ifndef GTM_SELF_SPECS
1224 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
1225 #endif
1226
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
1230 };
1231
1232 #ifndef OPTION_DEFAULT_SPECS
1233 #define OPTION_DEFAULT_SPECS { "", "" }
1234 #endif
1235
1236 struct default_spec
1237 {
1238 const char *name;
1239 const char *spec;
1240 };
1241
1242 static const struct default_spec
1243 option_default_specs[] = { OPTION_DEFAULT_SPECS };
1244
1245 struct user_specs
1246 {
1247 struct user_specs *next;
1248 const char *filename;
1249 };
1250
1251 static struct user_specs *user_specs_head, *user_specs_tail;
1252
1253 \f
1254 /* Record the mapping from file suffixes for compilation specs. */
1255
1256 struct compiler
1257 {
1258 const char *suffix; /* Use this compiler for input files
1259 whose names end in this suffix. */
1260
1261 const char *spec; /* To use this compiler, run this spec. */
1262
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. */
1270 };
1271
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.
1276
1277 An entry containing two 0s is used to terminate the vector.
1278
1279 If multiple entries match a file, the last matching one is used. */
1280
1281 static struct compiler *compilers;
1282
1283 /* Number of entries in `compilers', not counting the null terminator. */
1284
1285 static int n_compilers;
1286
1287 /* The default list of file name suffixes and their compilation specs. */
1288
1289 static const struct compiler default_compilers[] =
1290 {
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},
1372
1373 #include "specs.h"
1374 /* Mark end of table. */
1375 {0, 0, 0, 0, 0}
1376 };
1377
1378 /* Number of elements in default_compilers, not counting the terminator. */
1379
1380 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1381
1382 typedef char *char_p; /* For DEF_VEC_P. */
1383
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;
1388
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;
1393
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;
1398 \f
1399 static char *
1400 skip_whitespace (char *p)
1401 {
1402 while (1)
1403 {
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 == '#')
1411 {
1412 while (*p != '\n')
1413 p++;
1414 p++;
1415 }
1416 else
1417 break;
1418 }
1419
1420 return p;
1421 }
1422 /* Structures to keep track of prefixes to try when looking for files. */
1423
1424 struct prefix_list
1425 {
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. */
1433 };
1434
1435 struct path_prefix
1436 {
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) */
1440 };
1441
1442 /* List of prefixes to try when looking for executables. */
1443
1444 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1445
1446 /* List of prefixes to try when looking for startup (crt0) files. */
1447
1448 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1449
1450 /* List of prefixes to try when looking for include files. */
1451
1452 static struct path_prefix include_prefixes = { 0, 0, "include" };
1453
1454 /* Suffix to attach to directories searched for commands.
1455 This looks like `MACHINE/VERSION/'. */
1456
1457 static const char *machine_suffix = 0;
1458
1459 /* Suffix to attach to directories searched for commands.
1460 This is just `MACHINE/'. */
1461
1462 static const char *just_machine_suffix = 0;
1463
1464 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1465
1466 static const char *gcc_exec_prefix;
1467
1468 /* Adjusted value of standard_libexec_prefix. */
1469
1470 static const char *gcc_libexec_prefix;
1471
1472 /* Default prefixes to attach to command names. */
1473
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
1480
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
1486
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
1497
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;
1508
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;
1519
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;
1523
1524 /* A prefix to be used when this is an accelerator compiler. */
1525 static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
1526
1527 /* Subdirectory to use for locating libraries. Set by
1528 set_multilib_dir based on the compilation options. */
1529
1530 static const char *multilib_dir;
1531
1532 /* Subdirectory to use for locating libraries in OS conventions. Set by
1533 set_multilib_dir based on the compilation options. */
1534
1535 static const char *multilib_os_dir;
1536
1537 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1538 set_multilib_dir based on the compilation options. */
1539
1540 static const char *multiarch_dir;
1541 \f
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. */
1545
1546 struct spec_list
1547 {
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 */
1552
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. */
1561 };
1562
1563 #define INIT_STATIC_SPEC(NAME,PTR) \
1564 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1565 *PTR }
1566
1567 /* List of statically defined specs. */
1568 static struct spec_list static_specs[] =
1569 {
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),
1614 };
1615
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
1620 {
1621 const char *const name;
1622 const char *const ptr;
1623 };
1624
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
1628
1629 /* List of dynamically allocates specs that have been defined so far. */
1630
1631 static struct spec_list *specs = (struct spec_list *) 0;
1632 \f
1633 /* List of static spec functions. */
1634
1635 static const struct spec_function static_spec_functions[] =
1636 {
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 }
1660 };
1661
1662 static int processing_spec_function;
1663 \f
1664 /* Add appropriate libgcc specs to OBSTACK, taking into account
1665 various permutations of -shared-libgcc, -shared, and such. */
1666
1667 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1668
1669 #ifndef USE_LD_AS_NEEDED
1670 #define USE_LD_AS_NEEDED 0
1671 #endif
1672
1673 static void
1674 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1675 const char *static_name, const char *eh_name)
1676 {
1677 char *buf;
1678
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
1685 "}"
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, "}"
1695 "}"
1696 #ifdef LINK_EH_SPEC
1697 "%{shared:"
1698 "%{shared-libgcc:", shared_name, "}"
1699 "%{!shared-libgcc:", static_name, "}"
1700 "}"
1701 #else
1702 "%{shared:", shared_name, "}"
1703 #endif
1704 #endif
1705 "}}", NULL);
1706
1707 obstack_grow (obstack, buf, strlen (buf));
1708 free (buf);
1709 }
1710 #endif /* ENABLE_SHARED_LIBGCC */
1711
1712 /* Initialize the specs lookup routines. */
1713
1714 static void
1715 init_spec (void)
1716 {
1717 struct spec_list *next = (struct spec_list *) 0;
1718 struct spec_list *sl = (struct spec_list *) 0;
1719 int i;
1720
1721 if (specs)
1722 return; /* Already initialized. */
1723
1724 if (verbose_flag)
1725 fnotice (stderr, "Using built-in specs.\n");
1726
1727 #ifdef EXTRA_SPECS
1728 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1729
1730 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1731 {
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;
1741 }
1742 #endif
1743
1744 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1745 {
1746 sl = &static_specs[i];
1747 sl->next = next;
1748 next = sl;
1749 }
1750
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:
1755
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.
1759
1760 (2) If "-ldl", then it's also a fair bet that we're doing
1761 dynamic loading.
1762
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.
1766
1767 (4) If "-shared"
1768
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.
1772
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.
1776
1777 Doing any of this probably requires invoking an external program to
1778 do the actual object file scanning. */
1779 {
1780 const char *p = libgcc_spec;
1781 int in_sep = 1;
1782
1783 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1784 when given the proper command line arguments. */
1785 while (*p)
1786 {
1787 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1788 {
1789 init_gcc_specs (&obstack,
1790 "-lgcc_s"
1791 #ifdef USE_LIBUNWIND_EXCEPTIONS
1792 " -lunwind"
1793 #endif
1794 ,
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
1805 );
1806
1807 p += 5;
1808 in_sep = 0;
1809 }
1810 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1811 {
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
1821 );
1822 p += 10;
1823 in_sep = 0;
1824 }
1825 else
1826 {
1827 obstack_1grow (&obstack, *p);
1828 in_sep = (*p == ' ');
1829 p += 1;
1830 }
1831 }
1832
1833 obstack_1grow (&obstack, '\0');
1834 libgcc_spec = XOBFINISH (&obstack, const char *);
1835 }
1836 #endif
1837 #ifdef USE_AS_TRADITIONAL_FORMAT
1838 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1839 {
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 *);
1844 }
1845 #endif
1846
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. */
1860 {
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, ' ');
1865 }
1866 # endif
1867 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1868 link_spec = XOBFINISH (&obstack, const char *);
1869 #endif
1870
1871 specs = sl;
1872 }
1873 \f
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. */
1877
1878 static void
1879 set_spec (const char *name, const char *spec, bool user_p)
1880 {
1881 struct spec_list *sl;
1882 const char *old_spec;
1883 int name_len = strlen (name);
1884 int i;
1885
1886 /* If this is the first call, initialize the statically allocated specs. */
1887 if (!specs)
1888 {
1889 struct spec_list *next = (struct spec_list *) 0;
1890 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1891 {
1892 sl = &static_specs[i];
1893 sl->next = next;
1894 next = sl;
1895 }
1896 specs = sl;
1897 }
1898
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;
1903
1904 if (!sl)
1905 {
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;
1916 }
1917
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));
1922
1923 #ifdef DEBUG_SPECS
1924 if (verbose_flag)
1925 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1926 #endif
1927
1928 /* Free the old spec. */
1929 if (old_spec && sl->alloc_p)
1930 free (CONST_CAST (char *, old_spec));
1931
1932 sl->user_p = user_p;
1933 sl->alloc_p = true;
1934 }
1935 \f
1936 /* Accumulate a command (program name and args), and run it. */
1937
1938 typedef const char *const_char_p; /* For DEF_VEC_P. */
1939
1940 /* Vector of pointers to arguments in the current line of specifications. */
1941 static vec<const_char_p> argbuf;
1942
1943 /* Likewise, but for the current @file. */
1944 static vec<const_char_p> at_file_argbuf;
1945
1946 /* Whether an @file is currently open. */
1947 static bool in_at_file = false;
1948
1949 /* Were the options -c, -S or -E passed. */
1950 static int have_c = 0;
1951
1952 /* Was the option -o passed. */
1953 static int have_o = 0;
1954
1955 /* Was the option -E passed. */
1956 static int have_E = 0;
1957
1958 /* Pointer to output file name passed in with -o. */
1959 static const char *output_file = 0;
1960
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. */
1964
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;
1973
1974 /* Number of commands executed so far. */
1975
1976 static int execution_count;
1977
1978 /* Number of commands that exited with a signal. */
1979
1980 static int signal_count;
1981 \f
1982 /* Allocate the argument vector. */
1983
1984 static void
1985 alloc_args (void)
1986 {
1987 argbuf.create (10);
1988 at_file_argbuf.create (10);
1989 }
1990
1991 /* Clear out the vector of arguments (after a command is executed). */
1992
1993 static void
1994 clear_args (void)
1995 {
1996 argbuf.truncate (0);
1997 at_file_argbuf.truncate (0);
1998 }
1999
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. */
2006
2007 static void
2008 store_arg (const char *arg, int delete_always, int delete_failure)
2009 {
2010 if (in_at_file)
2011 at_file_argbuf.safe_push (arg);
2012 else
2013 argbuf.safe_push (arg);
2014
2015 if (delete_always || delete_failure)
2016 {
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);
2024 }
2025 }
2026
2027 /* Open a temporary @file into which subsequent arguments will be stored. */
2028
2029 static void
2030 open_at_file (void)
2031 {
2032 if (in_at_file)
2033 fatal_error (input_location, "cannot open nested response file");
2034 else
2035 in_at_file = true;
2036 }
2037
2038 /* Close the temporary @file and add @file to the argument list. */
2039
2040 static void
2041 close_at_file (void)
2042 {
2043 if (!in_at_file)
2044 fatal_error (input_location, "cannot close nonexistent response file");
2045
2046 in_at_file = false;
2047
2048 const unsigned int n_args = at_file_argbuf.length ();
2049 if (n_args == 0)
2050 return;
2051
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;
2058
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;
2063
2064 at_file_argbuf.truncate (0);
2065
2066 if (f == NULL)
2067 fatal_error (input_location, "could not open temporary response file %s",
2068 temp_file);
2069
2070 status = writeargv (argv, f);
2071
2072 if (status)
2073 fatal_error (input_location,
2074 "could not write to temporary response file %s",
2075 temp_file);
2076
2077 status = fclose (f);
2078
2079 if (status == EOF)
2080 fatal_error (input_location, "could not close temporary response file %s",
2081 temp_file);
2082
2083 store_arg (at_argument, 0, 0);
2084
2085 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
2086 }
2087 \f
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. */
2091
2092 static char *
2093 load_specs (const char *filename)
2094 {
2095 int desc;
2096 int readlen;
2097 struct stat statbuf;
2098 char *buffer;
2099 char *buffer_p;
2100 char *specs;
2101 char *specs_p;
2102
2103 if (verbose_flag)
2104 fnotice (stderr, "Reading specs from %s\n", filename);
2105
2106 /* Open and stat the file. */
2107 desc = open (filename, O_RDONLY, 0);
2108 if (desc < 0)
2109 {
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);
2113 }
2114
2115 if (stat (filename, &statbuf) < 0)
2116 goto failed;
2117
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);
2125
2126 specs = XNEWVEC (char, readlen + 1);
2127 specs_p = specs;
2128 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2129 {
2130 int skip = 0;
2131 char c = *buffer_p;
2132 if (c == '\r')
2133 {
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';
2140 }
2141 if (! skip)
2142 *specs_p++ = c;
2143 }
2144 *specs_p = '\0';
2145
2146 free (buffer);
2147 return (specs);
2148 }
2149
2150 /* Read compilation specs from a file named FILENAME,
2151 replacing the default ones.
2152
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.
2158
2159 Anything invalid in the file is a fatal error. */
2160
2161 static void
2162 read_specs (const char *filename, bool main_p, bool user_p)
2163 {
2164 char *buffer;
2165 char *p;
2166
2167 buffer = load_specs (filename);
2168
2169 /* Scan BUFFER for specs, putting them in the vector. */
2170 p = buffer;
2171 while (1)
2172 {
2173 char *suffix;
2174 char *spec;
2175 char *in, *out, *p1, *p2, *p3;
2176
2177 /* Advance P in BUFFER to the next nonblank nocomment line. */
2178 p = skip_whitespace (p);
2179 if (*p == 0)
2180 break;
2181
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)
2186 {
2187 p1 = p;
2188 while (*p && *p != '\n')
2189 p++;
2190
2191 /* Skip '\n'. */
2192 p++;
2193
2194 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2195 && (p1[sizeof "%include" - 1] == ' '
2196 || p1[sizeof "%include" - 1] == '\t'))
2197 {
2198 char *new_filename;
2199
2200 p1 += sizeof ("%include");
2201 while (*p1 == ' ' || *p1 == '\t')
2202 p1++;
2203
2204 if (*p1++ != '<' || p[-2] != '>')
2205 fatal_error (input_location,
2206 "specs %%include syntax malformed after "
2207 "%ld characters",
2208 (long) (p1 - buffer + 1));
2209
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;
2214 }
2215 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2216 && (p1[sizeof "%include_noerr" - 1] == ' '
2217 || p1[sizeof "%include_noerr" - 1] == '\t'))
2218 {
2219 char *new_filename;
2220
2221 p1 += sizeof "%include_noerr";
2222 while (*p1 == ' ' || *p1 == '\t')
2223 p1++;
2224
2225 if (*p1++ != '<' || p[-2] != '>')
2226 fatal_error (input_location,
2227 "specs %%include syntax malformed after "
2228 "%ld characters",
2229 (long) (p1 - buffer + 1));
2230
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;
2238 }
2239 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2240 && (p1[sizeof "%rename" - 1] == ' '
2241 || p1[sizeof "%rename" - 1] == '\t'))
2242 {
2243 int name_len;
2244 struct spec_list *sl;
2245 struct spec_list *newsl;
2246
2247 /* Get original name. */
2248 p1 += sizeof "%rename";
2249 while (*p1 == ' ' || *p1 == '\t')
2250 p1++;
2251
2252 if (! ISALPHA ((unsigned char) *p1))
2253 fatal_error (input_location,
2254 "specs %%rename syntax malformed after "
2255 "%ld characters",
2256 (long) (p1 - buffer));
2257
2258 p2 = p1;
2259 while (*p2 && !ISSPACE ((unsigned char) *p2))
2260 p2++;
2261
2262 if (*p2 != ' ' && *p2 != '\t')
2263 fatal_error (input_location,
2264 "specs %%rename syntax malformed after "
2265 "%ld characters",
2266 (long) (p2 - buffer));
2267
2268 name_len = p2 - p1;
2269 *p2++ = '\0';
2270 while (*p2 == ' ' || *p2 == '\t')
2271 p2++;
2272
2273 if (! ISALPHA ((unsigned char) *p2))
2274 fatal_error (input_location,
2275 "specs %%rename syntax malformed after "
2276 "%ld characters",
2277 (long) (p2 - buffer));
2278
2279 /* Get new spec name. */
2280 p3 = p2;
2281 while (*p3 && !ISSPACE ((unsigned char) *p3))
2282 p3++;
2283
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';
2290
2291 for (sl = specs; sl; sl = sl->next)
2292 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2293 break;
2294
2295 if (!sl)
2296 fatal_error (input_location,
2297 "specs %s spec was not found to be renamed", p1);
2298
2299 if (strcmp (p1, p2) == 0)
2300 continue;
2301
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);
2308
2309 if (verbose_flag)
2310 {
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
2315 }
2316
2317 set_spec (p2, *(sl->ptr_spec), user_p);
2318 if (sl->alloc_p)
2319 free (CONST_CAST (char *, *(sl->ptr_spec)));
2320
2321 *(sl->ptr_spec) = "";
2322 sl->alloc_p = 0;
2323 continue;
2324 }
2325 else
2326 fatal_error (input_location,
2327 "specs unknown %% command after %ld characters",
2328 (long) (p1 - buffer));
2329 }
2330
2331 /* Find the colon that should end the suffix. */
2332 p1 = p;
2333 while (*p1 && *p1 != ':' && *p1 != '\n')
2334 p1++;
2335
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));
2341
2342 /* Skip back over trailing whitespace. */
2343 p2 = p1;
2344 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2345 p2--;
2346
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));
2355
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++;
2360
2361 /* Specs end at the blank line and do not include the newline. */
2362 spec = save_string (p, p1 - p);
2363 p = p1;
2364
2365 /* Delete backslash-newline sequences from the spec. */
2366 in = spec;
2367 out = spec;
2368 while (*in != 0)
2369 {
2370 if (in[0] == '\\' && in[1] == '\n')
2371 in += 2;
2372 else if (in[0] == '#')
2373 while (*in && *in != '\n')
2374 in++;
2375
2376 else
2377 *out++ = *in++;
2378 }
2379 *out = 0;
2380
2381 if (suffix[0] == '*')
2382 {
2383 if (! strcmp (suffix, "*link_command"))
2384 link_command_spec = spec;
2385 else
2386 {
2387 set_spec (suffix + 1, spec, user_p);
2388 free (spec);
2389 }
2390 }
2391 else
2392 {
2393 /* Add this pair to the vector. */
2394 compilers
2395 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2396
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]);
2401 }
2402
2403 if (*suffix == 0)
2404 link_command_spec = spec;
2405 }
2406
2407 if (link_command_spec == 0)
2408 fatal_error (input_location, "spec file has no spec for linking");
2409
2410 XDELETEVEC (buffer);
2411 }
2412 \f
2413 /* Record the names of temporary files we tell compilers to write,
2414 and delete them at the end of the run. */
2415
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.
2421
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. */
2426
2427 static const char *temp_filename;
2428
2429 /* Length of the prefix. */
2430
2431 static int temp_filename_length;
2432
2433 /* Define the list of temporary files to delete. */
2434
2435 struct temp_file
2436 {
2437 const char *name;
2438 struct temp_file *next;
2439 };
2440
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;
2445
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. */
2451
2452 void
2453 record_temp_file (const char *filename, int always_delete, int fail_delete)
2454 {
2455 char *const name = xstrdup (filename);
2456
2457 if (always_delete)
2458 {
2459 struct temp_file *temp;
2460 for (temp = always_delete_queue; temp; temp = temp->next)
2461 if (! filename_cmp (name, temp->name))
2462 {
2463 free (name);
2464 goto already1;
2465 }
2466
2467 temp = XNEW (struct temp_file);
2468 temp->next = always_delete_queue;
2469 temp->name = name;
2470 always_delete_queue = temp;
2471
2472 already1:;
2473 }
2474
2475 if (fail_delete)
2476 {
2477 struct temp_file *temp;
2478 for (temp = failure_delete_queue; temp; temp = temp->next)
2479 if (! filename_cmp (name, temp->name))
2480 {
2481 free (name);
2482 goto already2;
2483 }
2484
2485 temp = XNEW (struct temp_file);
2486 temp->next = failure_delete_queue;
2487 temp->name = name;
2488 failure_delete_queue = temp;
2489
2490 already2:;
2491 }
2492 }
2493
2494 /* Delete all the temporary files whose names we previously recorded. */
2495
2496 #ifndef DELETE_IF_ORDINARY
2497 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2498 do \
2499 { \
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
2506
2507 static void
2508 delete_if_ordinary (const char *name)
2509 {
2510 struct stat st;
2511 #ifdef DEBUG
2512 int i, c;
2513
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)
2519 ;
2520
2521 if (i == 'y' || i == 'Y')
2522 #endif /* DEBUG */
2523 DELETE_IF_ORDINARY (name, st, verbose_flag);
2524 }
2525
2526 static void
2527 delete_temp_files (void)
2528 {
2529 struct temp_file *temp;
2530
2531 for (temp = always_delete_queue; temp; temp = temp->next)
2532 delete_if_ordinary (temp->name);
2533 always_delete_queue = 0;
2534 }
2535
2536 /* Delete all the files to be deleted on error. */
2537
2538 static void
2539 delete_failure_queue (void)
2540 {
2541 struct temp_file *temp;
2542
2543 for (temp = failure_delete_queue; temp; temp = temp->next)
2544 delete_if_ordinary (temp->name);
2545 }
2546
2547 static void
2548 clear_failure_queue (void)
2549 {
2550 failure_delete_queue = 0;
2551 }
2552 \f
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.
2563
2564 Returns the value returned by CALLBACK. */
2565
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)
2572 {
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;
2583
2584 multi_suffix = machine_suffix;
2585 just_multi_suffix = just_machine_suffix;
2586 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2587 {
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);
2591 }
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);
2596
2597 while (1)
2598 {
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;
2605
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);
2614
2615 if (path == NULL)
2616 {
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);
2620 }
2621
2622 for (pl = paths->plist; pl != 0; pl = pl->next)
2623 {
2624 len = strlen (pl->prefix);
2625 memcpy (path, pl->prefix, len);
2626
2627 /* Look first in MACHINE/VERSION subdirectory. */
2628 if (!skip_multi_dir)
2629 {
2630 memcpy (path + len, multi_suffix, suffix_len + 1);
2631 ret = callback (path, callback_info);
2632 if (ret)
2633 break;
2634 }
2635
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)
2640 {
2641 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2642 ret = callback (path, callback_info);
2643 if (ret)
2644 break;
2645 }
2646
2647 /* Now try the multiarch path. */
2648 if (!skip_multi_dir
2649 && !pl->require_machine_suffix && multiarch_dir)
2650 {
2651 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2652 ret = callback (path, callback_info);
2653 if (ret)
2654 break;
2655 }
2656
2657 /* Now try the base path. */
2658 if (!pl->require_machine_suffix
2659 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2660 {
2661 const char *this_multi;
2662 size_t this_multi_len;
2663
2664 if (pl->os_multilib)
2665 {
2666 this_multi = multi_os_dir;
2667 this_multi_len = multi_os_dir_len;
2668 }
2669 else
2670 {
2671 this_multi = multi_dir;
2672 this_multi_len = multi_dir_len;
2673 }
2674
2675 if (this_multi_len)
2676 memcpy (path + len, this_multi, this_multi_len + 1);
2677 else
2678 path[len] = '\0';
2679
2680 ret = callback (path, callback_info);
2681 if (ret)
2682 break;
2683 }
2684 }
2685 if (pl)
2686 break;
2687
2688 if (multi_dir == NULL && multi_os_dir == NULL)
2689 break;
2690
2691 /* Run through the paths again, this time without multilibs.
2692 Don't repeat any we have already seen. */
2693 if (multi_dir)
2694 {
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;
2701 }
2702 else
2703 skip_multi_dir = true;
2704 if (multi_os_dir)
2705 {
2706 free (CONST_CAST (char *, multi_os_dir));
2707 multi_os_dir = NULL;
2708 }
2709 else
2710 skip_multi_os_dir = true;
2711 }
2712
2713 if (multi_dir)
2714 {
2715 free (CONST_CAST (char *, multi_dir));
2716 free (CONST_CAST (char *, multi_suffix));
2717 free (CONST_CAST (char *, just_multi_suffix));
2718 }
2719 if (multi_os_dir)
2720 free (CONST_CAST (char *, multi_os_dir));
2721 if (ret != path)
2722 free (path);
2723 return ret;
2724 }
2725
2726 /* Callback for build_search_list. Adds path to obstack being built. */
2727
2728 struct add_to_obstack_info {
2729 struct obstack *ob;
2730 bool check_dir;
2731 bool first_time;
2732 };
2733
2734 static void *
2735 add_to_obstack (char *path, void *data)
2736 {
2737 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2738
2739 if (info->check_dir && !is_directory (path, false))
2740 return NULL;
2741
2742 if (!info->first_time)
2743 obstack_1grow (info->ob, PATH_SEPARATOR);
2744
2745 obstack_grow (info->ob, path, strlen (path));
2746
2747 info->first_time = false;
2748 return NULL;
2749 }
2750
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)
2755 {
2756 env.xput (string);
2757 }
2758
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. */
2766
2767 static char *
2768 build_search_list (const struct path_prefix *paths, const char *prefix,
2769 bool check_dir, bool do_multi)
2770 {
2771 struct add_to_obstack_info info;
2772
2773 info.ob = &collect_obstack;
2774 info.check_dir = check_dir;
2775 info.first_time = true;
2776
2777 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2778 obstack_1grow (&collect_obstack, '=');
2779
2780 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2781
2782 obstack_1grow (&collect_obstack, '\0');
2783 return XOBFINISH (&collect_obstack, char *);
2784 }
2785
2786 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2787 for collect. */
2788
2789 static void
2790 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2791 bool do_multi)
2792 {
2793 xputenv (build_search_list (paths, env_var, true, do_multi));
2794 }
2795 \f
2796 /* Check whether NAME can be accessed in MODE. This is like access,
2797 except that it never considers directories to be executable. */
2798
2799 static int
2800 access_check (const char *name, int mode)
2801 {
2802 if (mode == X_OK)
2803 {
2804 struct stat st;
2805
2806 if (stat (name, &st) < 0
2807 || S_ISDIR (st.st_mode))
2808 return -1;
2809 }
2810
2811 return access (name, mode);
2812 }
2813
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. */
2817
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;
2824 };
2825
2826 static void *
2827 file_at_path (char *path, void *data)
2828 {
2829 struct file_at_path_info *info = (struct file_at_path_info *) data;
2830 size_t len = strlen (path);
2831
2832 memcpy (path + len, info->name, info->name_len);
2833 len += info->name_len;
2834
2835 /* Some systems have a suffix for executable files.
2836 So try appending that first. */
2837 if (info->suffix_len)
2838 {
2839 memcpy (path + len, info->suffix, info->suffix_len + 1);
2840 if (access_check (path, info->mode) == 0)
2841 return path;
2842 }
2843
2844 path[len] = '\0';
2845 if (access_check (path, info->mode) == 0)
2846 return path;
2847
2848 return NULL;
2849 }
2850
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. */
2855
2856 static char *
2857 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2858 bool do_multi)
2859 {
2860 struct file_at_path_info info;
2861
2862 #ifdef DEFAULT_ASSEMBLER
2863 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2864 return xstrdup (DEFAULT_ASSEMBLER);
2865 #endif
2866
2867 #ifdef DEFAULT_LINKER
2868 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2869 return xstrdup (DEFAULT_LINKER);
2870 #endif
2871
2872 /* Determine the filename to execute (special case for absolute paths). */
2873
2874 if (IS_ABSOLUTE_PATH (name))
2875 {
2876 if (access (name, mode) == 0)
2877 return xstrdup (name);
2878
2879 return NULL;
2880 }
2881
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;
2887
2888 return (char*) for_each_path (pprefix, do_multi,
2889 info.name_len + info.suffix_len,
2890 file_at_path, &info);
2891 }
2892
2893 /* Ranking of prefixes in the sort list. -B prefixes are put before
2894 all others. */
2895
2896 enum path_prefix_priority
2897 {
2898 PREFIX_PRIORITY_B_OPT,
2899 PREFIX_PRIORITY_LAST
2900 };
2901
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.
2905
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.
2909
2910 COMPONENT is the value to be passed to update_path.
2911
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. */
2915
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)
2920 {
2921 struct prefix_list *pl, **prev;
2922 int len;
2923
2924 for (prev = &pprefix->plist;
2925 (*prev) != NULL && (*prev)->priority <= priority;
2926 prev = &(*prev)->next)
2927 ;
2928
2929 /* Keep track of the longest prefix. */
2930
2931 prefix = update_path (prefix, component);
2932 len = strlen (prefix);
2933 if (len > pprefix->max_len)
2934 pprefix->max_len = len;
2935
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;
2941
2942 /* Insert after PREV. */
2943 pl->next = (*prev);
2944 (*prev) = pl;
2945 }
2946
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)
2954 {
2955 if (!IS_ABSOLUTE_PATH (prefix))
2956 fatal_error (input_location, "system path %qs is not absolute", prefix);
2957
2958 if (target_system_root)
2959 {
2960 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2961 size_t sysroot_len = strlen (target_system_root);
2962
2963 if (sysroot_len > 0
2964 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2965 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2966
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);
2972
2973 free (sysroot_no_trailing_dir_separator);
2974
2975 /* We have to override this because GCC's notion of sysroot
2976 moves along with GCC. */
2977 component = "GCC";
2978 }
2979
2980 add_prefix (pprefix, prefix, component, priority,
2981 require_machine_suffix, os_multilib);
2982 }
2983
2984 /* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */
2985
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)
2991 {
2992 if (!IS_ABSOLUTE_PATH (prefix))
2993 fatal_error (input_location, "system path %qs is not absolute", prefix);
2994
2995 if (target_system_root)
2996 {
2997 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2998 size_t sysroot_len = strlen (target_system_root);
2999
3000 if (sysroot_len > 0
3001 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
3002 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3003
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);
3009
3010 free (sysroot_no_trailing_dir_separator);
3011
3012 /* We have to override this because GCC's notion of sysroot
3013 moves along with GCC. */
3014 component = "GCC";
3015 }
3016
3017 add_prefix (pprefix, prefix, component, priority,
3018 require_machine_suffix, os_multilib);
3019 }
3020
3021 \f
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.
3025
3026 Return 0 if successful, -1 if failed. */
3027
3028 static int
3029 execute (void)
3030 {
3031 int i;
3032 int n_commands; /* # of command. */
3033 char *string;
3034 struct pex_obj *pex;
3035 struct command
3036 {
3037 const char *prog; /* program name. */
3038 const char **argv; /* vector of args. */
3039 };
3040 const char *arg;
3041
3042 struct command *commands; /* each command buffer with above info. */
3043
3044 gcc_assert (!processing_spec_function);
3045
3046 if (wrapper_string)
3047 {
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);
3053 }
3054
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++;
3059
3060 /* Get storage for each command. */
3061 commands = (struct command *) alloca (n_commands * sizeof (struct command));
3062
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. */
3066
3067 argbuf.safe_push (0);
3068
3069 commands[0].prog = argbuf[0]; /* first command. */
3070 commands[0].argv = argbuf.address ();
3071
3072 if (!wrapper_string)
3073 {
3074 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
3075 if (string)
3076 commands[0].argv[0] = string;
3077 }
3078
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++;
3094 }
3095
3096 /* If -v, print what we are about to do, and maybe query. */
3097
3098 if (verbose_flag)
3099 {
3100 /* For help listings, put a blank line between sub-processes. */
3101 if (print_help_list)
3102 fputc ('\n', stderr);
3103
3104 /* Print each piped command as a separate line. */
3105 for (i = 0; i < n_commands; i++)
3106 {
3107 const char *const *j;
3108
3109 if (verbose_only_flag)
3110 {
3111 for (j = commands[i].argv; *j; j++)
3112 {
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)
3119 {
3120 fprintf (stderr, " \"");
3121 for (p = *j; *p; ++p)
3122 {
3123 if (*p == '"' || *p == '\\' || *p == '$')
3124 fputc ('\\', stderr);
3125 fputc (*p, stderr);
3126 }
3127 fputc ('"', stderr);
3128 }
3129 /* If it's empty, print "". */
3130 else if (!**j)
3131 fprintf (stderr, " \"\"");
3132 else
3133 fprintf (stderr, " %s", *j);
3134 }
3135 }
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);
3143
3144 /* Print a pipe symbol after all but the last command. */
3145 if (i + 1 != n_commands)
3146 fprintf (stderr, " |");
3147 fprintf (stderr, "\n");
3148 }
3149 fflush (stderr);
3150 if (verbose_only_flag != 0)
3151 {
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;
3158 }
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')
3165 ;
3166
3167 if (i != 'y' && i != 'Y')
3168 return 0;
3169 #endif /* DEBUG */
3170 }
3171
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. */
3176
3177 for (i = 0; i < n_commands; i++)
3178 {
3179 const char **argv;
3180 int argc;
3181 int j;
3182
3183 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3184 ;
3185
3186 argv = XALLOCAVEC (const char *, argc + 3);
3187
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;
3193
3194 commands[i].argv = argv;
3195 commands[i].prog = argv[0];
3196 }
3197 #endif
3198
3199 /* Run each piped subprocess. */
3200
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");
3206
3207 for (i = 0; i < n_commands; i++)
3208 {
3209 const char *errmsg;
3210 int err;
3211 const char *string = commands[i].argv[0];
3212
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)
3219 {
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);
3225 }
3226
3227 if (i && string != commands[i].prog)
3228 free (CONST_CAST (char *, string));
3229 }
3230
3231 execution_count++;
3232
3233 /* Wait for all the subprocesses to finish. */
3234
3235 {
3236 int *statuses;
3237 struct pex_time *times = NULL;
3238 int ret_code = 0;
3239
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");
3243
3244 if (report_times || report_times_to_file)
3245 {
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");
3249 }
3250
3251 pex_free (pex);
3252
3253 for (i = 0; i < n_commands; ++i)
3254 {
3255 int status = statuses[i];
3256
3257 if (WIFSIGNALED (status))
3258 switch (WTERMSIG (status))
3259 {
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;
3278
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)
3288 {
3289 signal_count++;
3290 ret_code = -1;
3291 break;
3292 }
3293 #endif
3294 /* FALLTHROUGH */
3295
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);
3301 }
3302 else if (WIFEXITED (status)
3303 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3304 {
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;
3317 }
3318
3319 if (report_times || report_times_to_file)
3320 {
3321 struct pex_time *pt = &times[i];
3322 double ut, st;
3323
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);
3328
3329 if (ut + st != 0)
3330 {
3331 if (report_times)
3332 fnotice (stderr, "# %s %.2f %.2f\n",
3333 commands[i].prog, ut, st);
3334
3335 if (report_times_to_file)
3336 {
3337 int c = 0;
3338 const char *const *j;
3339
3340 fprintf (report_times_to_file, "%g %g", ut, st);
3341
3342 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3343 {
3344 const char *p;
3345 for (p = *j; *p; ++p)
3346 if (*p == '"' || *p == '\\' || *p == '$'
3347 || ISSPACE (*p))
3348 break;
3349
3350 if (*p)
3351 {
3352 fprintf (report_times_to_file, " \"");
3353 for (p = *j; *p; ++p)
3354 {
3355 if (*p == '"' || *p == '\\' || *p == '$')
3356 fputc ('\\', report_times_to_file);
3357 fputc (*p, report_times_to_file);
3358 }
3359 fputc ('"', report_times_to_file);
3360 }
3361 else
3362 fprintf (report_times_to_file, " %s", *j);
3363 }
3364
3365 fputc ('\n', report_times_to_file);
3366 }
3367 }
3368 }
3369 }
3370
3371 if (commands[0].argv[0] != commands[0].prog)
3372 free (CONST_CAST (char *, commands[0].argv[0]));
3373
3374 return ret_code;
3375 }
3376 }
3377 \f
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. */
3397
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)
3403
3404 struct switchstr
3405 {
3406 const char *part1;
3407 const char **args;
3408 unsigned int live_cond;
3409 bool known;
3410 bool validated;
3411 bool ordering;
3412 };
3413
3414 static struct switchstr *switches;
3415
3416 static int n_switches;
3417
3418 static int n_switches_alloc;
3419
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;
3429
3430 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3431 int compare_debug_second;
3432
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;
3436
3437 static struct switchstr *switches_debug_check[2];
3438
3439 static int n_switches_debug_check[2];
3440
3441 static int n_switches_alloc_debug_check[2];
3442
3443 static char *debug_check_temp_file[2];
3444
3445 /* Language is one of three things:
3446
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
3453 {
3454 const char *name;
3455 const char *language;
3456 struct compiler *incompiler;
3457 bool compiled;
3458 bool preprocessed;
3459 };
3460
3461 /* Also a vector of input files specified. */
3462
3463 static struct infile *infiles;
3464
3465 int n_infiles;
3466
3467 static int n_infiles_alloc;
3468
3469 /* True if undefined environment variables encountered during spec processing
3470 are ok to ignore, typically when we're running for --help or --version. */
3471
3472 static bool spec_undefvar_allowed;
3473
3474 /* True if multiple input files are being compiled to a single
3475 assembly file. */
3476
3477 static bool combine_inputs;
3478
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. */
3481
3482 static int added_libraries;
3483
3484 /* And a vector of corresponding output files is made up later. */
3485
3486 const char **outfiles;
3487 \f
3488 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3489
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. */
3493
3494 static const char *
3495 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3496 int do_obj ATTRIBUTE_UNUSED)
3497 {
3498 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3499 int i;
3500 #endif
3501 int len;
3502
3503 if (name == NULL)
3504 return NULL;
3505
3506 len = strlen (name);
3507
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')
3513 {
3514 obstack_grow (&obstack, name, len - 2);
3515 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3516 name = XOBFINISH (&obstack, const char *);
3517 }
3518 #endif
3519
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;
3525
3526 for (i = len - 1; i >= 0; i--)
3527 if (IS_DIR_SEPARATOR (name[i]))
3528 break;
3529
3530 for (i++; i < len; i++)
3531 if (name[i] == '.')
3532 return name;
3533
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
3539
3540 return name;
3541 }
3542 #endif
3543 \f
3544 /* Display the command line switches accepted by gcc. */
3545 static void
3546 display_help (void)
3547 {
3548 printf (_("Usage: %s [options] file...\n"), progname);
3549 fputs (_("Options:\n"), stdout);
3550
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);
3610
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);
3616
3617 /* The rest of the options are displayed by invocations of the various
3618 sub-processes. */
3619 }
3620
3621 static void
3622 add_preprocessor_option (const char *option, int len)
3623 {
3624 preprocessor_options.safe_push (save_string (option, len));
3625 }
3626
3627 static void
3628 add_assembler_option (const char *option, int len)
3629 {
3630 assembler_options.safe_push (save_string (option, len));
3631 }
3632
3633 static void
3634 add_linker_option (const char *option, int len)
3635 {
3636 linker_options.safe_push (save_string (option, len));
3637 }
3638 \f
3639 /* Allocate space for an input file in infiles. */
3640
3641 static void
3642 alloc_infile (void)
3643 {
3644 if (n_infiles_alloc == 0)
3645 {
3646 n_infiles_alloc = 16;
3647 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3648 }
3649 else if (n_infiles_alloc == n_infiles)
3650 {
3651 n_infiles_alloc *= 2;
3652 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3653 }
3654 }
3655
3656 /* Store an input file with the given NAME and LANGUAGE in
3657 infiles. */
3658
3659 static void
3660 add_infile (const char *name, const char *language)
3661 {
3662 alloc_infile ();
3663 infiles[n_infiles].name = name;
3664 infiles[n_infiles++].language = language;
3665 }
3666
3667 /* Allocate space for a switch in switches. */
3668
3669 static void
3670 alloc_switch (void)
3671 {
3672 if (n_switches_alloc == 0)
3673 {
3674 n_switches_alloc = 16;
3675 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3676 }
3677 else if (n_switches_alloc == n_switches)
3678 {
3679 n_switches_alloc *= 2;
3680 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3681 }
3682 }
3683
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. */
3686
3687 static void
3688 save_switch (const char *opt, size_t n_args, const char *const *args,
3689 bool validated, bool known)
3690 {
3691 alloc_switch ();
3692 switches[n_switches].part1 = opt + 1;
3693 if (n_args == 0)
3694 switches[n_switches].args = 0;
3695 else
3696 {
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;
3700 }
3701
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++;
3707 }
3708
3709 /* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3710 not set already. */
3711
3712 static void
3713 set_source_date_epoch_envvar ()
3714 {
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;
3719
3720 errno = 0;
3721 tt = time (NULL);
3722 if (tt < (time_t) 0 || errno != 0)
3723 tt = (time_t) 0;
3724
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);
3730 }
3731
3732 /* Handle an option DECODED that is unknown to the option-processing
3733 machinery. */
3734
3735 static bool
3736 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3737 {
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))
3741 {
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;
3748 }
3749 if (decoded->opt_index == OPT_SPECIAL_unknown)
3750 {
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;
3756 }
3757 else
3758 return true;
3759 }
3760
3761 /* Handle an option DECODED that is not marked as CL_DRIVER.
3762 LANG_MASK will always be CL_DRIVER. */
3763
3764 static void
3765 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3766 unsigned int lang_mask ATTRIBUTE_UNUSED)
3767 {
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];
3774
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);
3782 }
3783
3784 static const char *spec_lang = 0;
3785 static int last_language_n_infiles;
3786
3787 /* Parse -foffload option argument. */
3788
3789 static void
3790 handle_foffload_option (const char *arg)
3791 {
3792 const char *c, *cur, *n, *next, *end;
3793 char *target;
3794
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;
3799
3800 end = strchr (arg, '=');
3801 if (end == NULL)
3802 end = strchr (arg, '\0');
3803 cur = arg;
3804
3805 while (cur < end)
3806 {
3807 next = strchr (cur, ',');
3808 if (next == NULL)
3809 next = end;
3810 next = (next > end) ? end : next;
3811
3812 target = XNEWVEC (char, next - cur + 1);
3813 memcpy (target, cur, next - cur);
3814 target[next - cur] = '\0';
3815
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)
3819 {
3820 free (offload_targets);
3821 offload_targets = xstrdup ("");
3822 break;
3823 }
3824
3825 /* Check that GCC is configured to support the offload target. */
3826 c = OFFLOAD_TARGETS;
3827 while (c)
3828 {
3829 n = strchr (c, ',');
3830 if (n == NULL)
3831 n = strchr (c, '\0');
3832
3833 if (next - cur == n - c && strncmp (target, c, n - c) == 0)
3834 break;
3835
3836 c = *n ? n + 1 : NULL;
3837 }
3838
3839 if (!c)
3840 fatal_error (input_location,
3841 "GCC is not configured to support %s as offload target",
3842 target);
3843
3844 if (!offload_targets)
3845 {
3846 offload_targets = target;
3847 target = NULL;
3848 }
3849 else
3850 {
3851 /* Check that the target hasn't already presented in the list. */
3852 c = offload_targets;
3853 do
3854 {
3855 n = strchr (c, ':');
3856 if (n == NULL)
3857 n = strchr (c, '\0');
3858
3859 if (next - cur == n - c && strncmp (c, target, n - c) == 0)
3860 break;
3861
3862 c = n + 1;
3863 }
3864 while (*n);
3865
3866 /* If duplicate is not found, append the target to the list. */
3867 if (c > n)
3868 {
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);
3875 }
3876 }
3877
3878 cur = next + 1;
3879 XDELETEVEC (target);
3880 }
3881 }
3882
3883 /* Handle a driver option; arguments and return value as for
3884 handle_option. */
3885
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))
3895 {
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;
3902
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);
3908
3909 switch (opt_index)
3910 {
3911 case OPT_dumpspecs:
3912 {
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);
3920 }
3921
3922 case OPT_dumpversion:
3923 printf ("%s\n", spec_version);
3924 exit (0);
3925
3926 case OPT_dumpmachine:
3927 printf ("%s\n", spec_machine);
3928 exit (0);
3929
3930 case OPT_dumpfullversion:
3931 printf ("%s\n", BASEVER);
3932 exit (0);
3933
3934 case OPT__version:
3935 print_version = 1;
3936
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;
3943
3944 case OPT__completion_:
3945 validated = true;
3946 completion = decoded->arg;
3947 break;
3948
3949 case OPT__help:
3950 print_help_list = 1;
3951
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;
3958
3959 case OPT__help_:
3960 print_subprocess_help = 2;
3961 break;
3962
3963 case OPT__target_help:
3964 print_subprocess_help = 1;
3965
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;
3972
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;
3991
3992 case OPT_print_libgcc_file_name:
3993 print_file_name = "libgcc.a";
3994 do_save = false;
3995 break;
3996
3997 case OPT_fuse_ld_bfd:
3998 use_ld = ".bfd";
3999 break;
4000
4001 case OPT_fuse_ld_gold:
4002 use_ld = ".gold";
4003 break;
4004
4005 case OPT_fcompare_debug_second:
4006 compare_debug_second = 1;
4007 break;
4008
4009 case OPT_fcompare_debug:
4010 switch (value)
4011 {
4012 case 0:
4013 compare_debug_replacement_opt = "-fcompare-debug=";
4014 arg = "";
4015 goto compare_debug_with_arg;
4016
4017 case 1:
4018 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
4019 arg = "-gtoggle";
4020 goto compare_debug_with_arg;
4021
4022 default:
4023 gcc_unreachable ();
4024 }
4025 break;
4026
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;
4043
4044 case OPT_fdiagnostics_color_:
4045 diagnostic_color_init (dc, value);
4046 break;
4047
4048 case OPT_fdiagnostics_urls_:
4049 diagnostic_urls_init (dc, value);
4050 break;
4051
4052 case OPT_fdiagnostics_format_:
4053 diagnostic_output_format_init (dc,
4054 (enum diagnostics_output_format)value);
4055 break;
4056
4057 case OPT_Wa_:
4058 {
4059 int prev, j;
4060 /* Pass the rest of this option to the assembler. */
4061
4062 /* Split the argument at commas. */
4063 prev = 0;
4064 for (j = 0; arg[j]; j++)
4065 if (arg[j] == ',')
4066 {
4067 add_assembler_option (arg + prev, j - prev);
4068 prev = j + 1;
4069 }
4070
4071 /* Record the part after the last comma. */
4072 add_assembler_option (arg + prev, j - prev);
4073 }
4074 do_save = false;
4075 break;
4076
4077 case OPT_Wp_:
4078 {
4079 int prev, j;
4080 /* Pass the rest of this option to the preprocessor. */
4081
4082 /* Split the argument at commas. */
4083 prev = 0;
4084 for (j = 0; arg[j]; j++)
4085 if (arg[j] == ',')
4086 {
4087 add_preprocessor_option (arg + prev, j - prev);
4088 prev = j + 1;
4089 }
4090
4091 /* Record the part after the last comma. */
4092 add_preprocessor_option (arg + prev, j - prev);
4093 }
4094 do_save = false;
4095 break;
4096
4097 case OPT_Wl_:
4098 {
4099 int prev, j;
4100 /* Split the argument at commas. */
4101 prev = 0;
4102 for (j = 0; arg[j]; j++)
4103 if (arg[j] == ',')
4104 {
4105 add_infile (save_string (arg + prev, j - prev), "*");
4106 prev = j + 1;
4107 }
4108 /* Record the part after the last comma. */
4109 add_infile (arg + prev, "*");
4110 }
4111 do_save = false;
4112 break;
4113
4114 case OPT_Xlinker:
4115 add_infile (arg, "*");
4116 do_save = false;
4117 break;
4118
4119 case OPT_Xpreprocessor:
4120 add_preprocessor_option (arg, strlen (arg));
4121 do_save = false;
4122 break;
4123
4124 case OPT_Xassembler:
4125 add_assembler_option (arg, strlen (arg));
4126 do_save = false;
4127 break;
4128
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;
4135
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;
4141
4142 case OPT_F:
4143 /* Likewise -F. */
4144 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
4145 return true;
4146
4147 case OPT_save_temps:
4148 save_temps_flag = SAVE_TEMPS_CWD;
4149 validated = true;
4150 break;
4151
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;
4162
4163 case OPT_no_canonical_prefixes:
4164 /* Already handled as a special case, so ignored here. */
4165 do_save = false;
4166 break;
4167
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;
4174
4175 case OPT_specs_:
4176 {
4177 struct user_specs *user = XNEW (struct user_specs);
4178
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;
4186 }
4187 validated = true;
4188 break;
4189
4190 case OPT__sysroot_:
4191 target_system_root = arg;
4192 target_system_root_changed = 1;
4193 do_save = false;
4194 break;
4195
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;
4202
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;
4213
4214 case OPT_B:
4215 {
4216 size_t len = strlen (arg);
4217
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))
4227 {
4228 char *tmp = XNEWVEC (char, len + 2);
4229 strcpy (tmp, arg);
4230 tmp[len] = DIR_SEPARATOR;
4231 tmp[++len] = 0;
4232 arg = tmp;
4233 }
4234
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);
4241 }
4242 validated = true;
4243 break;
4244
4245 case OPT_E:
4246 have_E = true;
4247 break;
4248
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;
4260
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;
4273
4274 #ifdef ENABLE_DEFAULT_PIE
4275 case OPT_pie:
4276 /* -pie is turned on by default. */
4277 #endif
4278
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;
4288
4289 case OPT_fwpa:
4290 flag_wpa = "";
4291 break;
4292
4293 case OPT_foffload_:
4294 handle_foffload_option (arg);
4295 break;
4296
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;
4302 }
4303
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;
4309 }
4310
4311 /* Put the driver's standard set of option handlers in *HANDLERS. */
4312
4313 static void
4314 set_option_handlers (struct cl_option_handlers *handlers)
4315 {
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;
4325 }
4326
4327 /* Create the vector `switches' and its contents.
4328 Store its length in `n_switches'. */
4329
4330 static void
4331 process_command (unsigned int decoded_options_count,
4332 struct cl_decoded_option *decoded_options)
4333 {
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;
4341
4342 gcc_exec_prefix = env.get ("GCC_EXEC_PREFIX");
4343
4344 n_switches = 0;
4345 n_infiles = 0;
4346 added_libraries = 0;
4347
4348 /* Figure compiler version from version string. */
4349
4350 compiler_version = temp1 = xstrdup (version_string);
4351
4352 for (; *temp1; ++temp1)
4353 {
4354 if (*temp1 == ' ')
4355 {
4356 *temp1 = '\0';
4357 break;
4358 }
4359 }
4360
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. */
4364
4365 for (j = 1; j < decoded_options_count; j++)
4366 {
4367 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
4368 {
4369 get_relative_prefix = make_relative_prefix_ignore_links;
4370 break;
4371 }
4372 }
4373 if (! get_relative_prefix)
4374 get_relative_prefix = make_relative_prefix;
4375
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. */
4379
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)
4384 {
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));
4393 }
4394 else
4395 {
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);
4404
4405 /* The path is unrelocated, so fallback to the original setting. */
4406 if (!gcc_libexec_prefix)
4407 gcc_libexec_prefix = standard_libexec_prefix;
4408
4409 free (tmp_prefix);
4410 }
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. */
4417
4418 /* Do language-specific adjustment/addition of flags. */
4419 lang_specific_driver (&decoded_options, &decoded_options_count,
4420 &added_libraries);
4421
4422 if (gcc_exec_prefix)
4423 {
4424 int len = strlen (gcc_exec_prefix);
4425
4426 if (len > (int) sizeof ("/lib/gcc/") - 1
4427 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
4428 {
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;
4435 }
4436
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);
4442 }
4443
4444 /* COMPILER_PATH and LIBRARY_PATH have values
4445 that are lists of directory names with colons. */
4446
4447 temp = env.get ("COMPILER_PATH");
4448 if (temp)
4449 {
4450 const char *startp, *endp;
4451 char *nstore = (char *) alloca (strlen (temp) + 3);
4452
4453 startp = endp = temp;
4454 while (1)
4455 {
4456 if (*endp == PATH_SEPARATOR || *endp == 0)
4457 {
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]))
4462 {
4463 nstore[endp - startp] = DIR_SEPARATOR;
4464 nstore[endp - startp + 1] = 0;
4465 }
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;
4475 }
4476 else
4477 endp++;
4478 }
4479 }
4480
4481 temp = env.get (LIBRARY_PATH_ENV);
4482 if (temp && *cross_compile == '0')
4483 {
4484 const char *startp, *endp;
4485 char *nstore = (char *) alloca (strlen (temp) + 3);
4486
4487 startp = endp = temp;
4488 while (1)
4489 {
4490 if (*endp == PATH_SEPARATOR || *endp == 0)
4491 {
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]))
4496 {
4497 nstore[endp - startp] = DIR_SEPARATOR;
4498 nstore[endp - startp + 1] = 0;
4499 }
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;
4507 }
4508 else
4509 endp++;
4510 }
4511 }
4512
4513 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4514 temp = env.get ("LPATH");
4515 if (temp && *cross_compile == '0')
4516 {
4517 const char *startp, *endp;
4518 char *nstore = (char *) alloca (strlen (temp) + 3);
4519
4520 startp = endp = temp;
4521 while (1)
4522 {
4523 if (*endp == PATH_SEPARATOR || *endp == 0)
4524 {
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]))
4529 {
4530 nstore[endp - startp] = DIR_SEPARATOR;
4531 nstore[endp - startp + 1] = 0;
4532 }
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;
4540 }
4541 else
4542 endp++;
4543 }
4544 }
4545
4546 /* Process the options and store input files and switches in their
4547 vectors. */
4548
4549 last_language_n_infiles = -1;
4550
4551 set_option_handlers (&handlers);
4552
4553 for (j = 1; j < decoded_options_count; j++)
4554 {
4555 switch (decoded_options[j].opt_index)
4556 {
4557 case OPT_S:
4558 case OPT_c:
4559 case OPT_E:
4560 have_c = 1;
4561 break;
4562 }
4563 if (have_c)
4564 break;
4565 }
4566
4567 for (j = 1; j < decoded_options_count; j++)
4568 {
4569 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4570 {
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)
4586 {
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)
4593 {
4594 free (fname);
4595 fname = xstrdup (arg);
4596 }
4597 }
4598 else
4599 fname = xstrdup (arg);
4600
4601 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4602 {
4603 bool resp = fname[0] == '@' && access (fname + 1, F_OK) < 0;
4604 error ("%s: %m", fname + resp);
4605 }
4606 else
4607 add_infile (arg, spec_lang);
4608
4609 free (fname);
4610 continue;
4611 }
4612
4613 read_cmdline_option (&global_options, &global_options_set,
4614 decoded_options + j, UNKNOWN_LOCATION,
4615 CL_DRIVER, &handlers, global_dc);
4616 }
4617
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);
4622
4623 if (output_file
4624 && strcmp (output_file, "-") != 0
4625 && strcmp (output_file, HOST_BIT_BUCKET) != 0)
4626 {
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);
4634 }
4635
4636 if (output_file != NULL && output_file[0] == '\0')
4637 fatal_error (input_location, "output filename may not be empty");
4638
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)
4642 {
4643 save_temps_length = strlen (save_temps_prefix);
4644 temp = strrchr (lbasename (save_temps_prefix), '.');
4645 if (temp)
4646 {
4647 save_temps_length -= strlen (temp);
4648 save_temps_prefix[save_temps_length] = '\0';
4649 }
4650
4651 }
4652 else if (save_temps_prefix != NULL)
4653 {
4654 free (save_temps_prefix);
4655 save_temps_prefix = NULL;
4656 }
4657
4658 if (save_temps_flag && use_pipes)
4659 {
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;
4664 }
4665
4666 if (!compare_debug)
4667 {
4668 const char *gcd = env.get ("GCC_COMPARE_DEBUG");
4669
4670 if (gcd && gcd[0] == '-')
4671 {
4672 compare_debug = 2;
4673 compare_debug_opt = gcd;
4674 }
4675 else if (gcd && *gcd && strcmp (gcd, "0"))
4676 {
4677 compare_debug = 3;
4678 compare_debug_opt = "-gtoggle";
4679 }
4680 }
4681 else if (compare_debug < 0)
4682 {
4683 compare_debug = 0;
4684 gcc_assert (!compare_debug_opt);
4685 }
4686
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. */
4691
4692 /* If we don't know where the toolchain has been installed, use the
4693 configured-in locations. */
4694 if (!gcc_exec_prefix)
4695 {
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);
4706 }
4707
4708 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4709 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
4710 dir_separator_str, NULL);
4711
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);
4719
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);
4727
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)
4734 {
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)
4739 {
4740 target_system_root = tmp_prefix;
4741 target_system_root_changed = 1;
4742 }
4743 }
4744 #endif
4745
4746 /* More prefixes are enabled in main, after we read the specs file
4747 and determine whether this is cross-compilation or not. */
4748
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);
4751
4752 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4753 environment variable. */
4754 if (compare_debug == 2 || compare_debug == 3)
4755 {
4756 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4757 save_switch (opt, 0, NULL, false, true);
4758 compare_debug = 1;
4759 }
4760
4761 /* Ensure we only invoke each subprocess once. */
4762 if (n_infiles == 0
4763 && (print_subprocess_help || print_help_list || print_version))
4764 {
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");
4768 }
4769
4770 /* Decide if undefined variable references are allowed in specs. */
4771
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. */
4777
4778 unsigned help_version_count = 0;
4779
4780 if (print_version)
4781 help_version_count++;
4782
4783 if (print_help_list)
4784 help_version_count++;
4785
4786 spec_undefvar_allowed =
4787 ((verbose_flag && decoded_options_count == 2)
4788 || help_version_count == decoded_options_count - 1);
4789
4790 alloc_switch ();
4791 switches[n_switches].part1 = 0;
4792 alloc_infile ();
4793 infiles[n_infiles].name = 0;
4794 }
4795
4796 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4797 and place that in the environment. */
4798
4799 static void
4800 set_collect_gcc_options (void)
4801 {
4802 int i;
4803 int first_time;
4804
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);
4809
4810 first_time = TRUE;
4811 for (i = 0; (int) i < n_switches; i++)
4812 {
4813 const char *const *args;
4814 const char *p, *q;
4815 if (!first_time)
4816 obstack_grow (&collect_obstack, " ", 1);
4817
4818 first_time = FALSE;
4819
4820 /* Ignore elided switches. */
4821 if ((switches[i].live_cond
4822 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4823 == SWITCH_IGNORE)
4824 continue;
4825
4826 obstack_grow (&collect_obstack, "'-", 2);
4827 q = switches[i].part1;
4828 while ((p = strchr (q, '\'')))
4829 {
4830 obstack_grow (&collect_obstack, q, p - q);
4831 obstack_grow (&collect_obstack, "'\\''", 4);
4832 q = ++p;
4833 }
4834 obstack_grow (&collect_obstack, q, strlen (q));
4835 obstack_grow (&collect_obstack, "'", 1);
4836
4837 for (args = switches[i].args; args && *args; args++)
4838 {
4839 obstack_grow (&collect_obstack, " '", 2);
4840 q = *args;
4841 while ((p = strchr (q, '\'')))
4842 {
4843 obstack_grow (&collect_obstack, q, p - q);
4844 obstack_grow (&collect_obstack, "'\\''", 4);
4845 q = ++p;
4846 }
4847 obstack_grow (&collect_obstack, q, strlen (q));
4848 obstack_grow (&collect_obstack, "'", 1);
4849 }
4850 }
4851 obstack_grow (&collect_obstack, "\0", 1);
4852 xputenv (XOBFINISH (&collect_obstack, char *));
4853 }
4854 \f
4855 /* Process a spec string, accumulating and running commands. */
4856
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. */
4863
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;
4875
4876 /* The compiler used to process the current input file. */
4877 static struct compiler *input_file_compiler;
4878
4879 /* These are variables used within do_spec and do_spec_1. */
4880
4881 /* Nonzero if an arg has been started and not yet terminated
4882 (with space, tab or newline). */
4883 static int arg_going;
4884
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;
4888
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;
4892
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;
4897
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;
4904
4905 /* Nonzero means that the input of this command is coming from a pipe. */
4906 static int input_from_pipe;
4907
4908 /* Nonnull means substitute this for any suffix when outputting a switches
4909 arguments. */
4910 static const char *suffix_subst;
4911
4912 /* If there is an argument being accumulated, terminate it and store it. */
4913
4914 static void
4915 end_going_arg (void)
4916 {
4917 if (arg_going)
4918 {
4919 const char *string;
4920
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)
4926 {
4927 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4928
4929 if (full_script_path == NULL)
4930 {
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;
4934 }
4935 store_arg ("--script", false, false);
4936 string = full_script_path;
4937 }
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;
4942 }
4943 }
4944
4945
4946 /* Parse the WRAPPER string which is a comma separated list of the command line
4947 and insert them into the beginning of argbuf. */
4948
4949 static void
4950 insert_wrapper (const char *wrapper)
4951 {
4952 int n = 0;
4953 int i;
4954 char *buf = xstrdup (wrapper);
4955 char *p = buf;
4956 unsigned int old_length = argbuf.length ();
4957
4958 do
4959 {
4960 n++;
4961 while (*p == ',')
4962 p++;
4963 }
4964 while ((p = strchr (p, ',')) != NULL);
4965
4966 argbuf.safe_grow (old_length + n);
4967 memmove (argbuf.address () + n,
4968 argbuf.address (),
4969 old_length * sizeof (const_char_p));
4970
4971 i = 0;
4972 p = buf;
4973 do
4974 {
4975 while (*p == ',')
4976 {
4977 *p = 0;
4978 p++;
4979 }
4980 argbuf[i] = p;
4981 i++;
4982 }
4983 while ((p = strchr (p, ',')) != NULL);
4984 gcc_assert (i == n);
4985 }
4986
4987 /* Process the spec SPEC and run the commands specified therein.
4988 Returns 0 if the spec is successfully processed; -1 if failed. */
4989
4990 int
4991 do_spec (const char *spec)
4992 {
4993 int value;
4994
4995 value = do_spec_2 (spec, NULL);
4996
4997 /* Force out any unfinished command.
4998 If -pipe, this forces out the last command if it ended in `|'. */
4999 if (value == 0)
5000 {
5001 if (argbuf.length () > 0
5002 && !strcmp (argbuf.last (), "|"))
5003 argbuf.pop ();
5004
5005 set_collect_gcc_options ();
5006
5007 if (argbuf.length () > 0)
5008 value = execute ();
5009 }
5010
5011 return value;
5012 }
5013
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 %*. */
5016
5017 static int
5018 do_spec_2 (const char *spec, const char *soft_matched_part)
5019 {
5020 int result;
5021
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;
5030
5031 result = do_spec_1 (spec, 0, soft_matched_part);
5032
5033 end_going_arg ();
5034
5035 return result;
5036 }
5037
5038 /* Process the given spec string and add any new options to the end
5039 of the switches/n_switches array. */
5040
5041 static void
5042 do_option_spec (const char *name, const char *spec)
5043 {
5044 unsigned int i, value_count, value_len;
5045 const char *p, *q, *value;
5046 char *tmp_spec, *tmp_spec_p;
5047
5048 if (configure_default_options[0].name == NULL)
5049 return;
5050
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;
5056
5057 value = configure_default_options[i].value;
5058 value_len = strlen (value);
5059
5060 /* Compute the size of the final spec. */
5061 value_count = 0;
5062 p = spec;
5063 while ((p = strstr (p, "%(VALUE)")) != NULL)
5064 {
5065 p ++;
5066 value_count ++;
5067 }
5068
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)
5075 {
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)");
5081 }
5082 strcpy (tmp_spec_p, q);
5083
5084 do_self_spec (tmp_spec);
5085 }
5086
5087 /* Process the given spec string and add any new options to the end
5088 of the switches/n_switches array. */
5089
5090 static void
5091 do_self_spec (const char *spec)
5092 {
5093 int i;
5094
5095 do_spec_2 (spec, NULL);
5096 do_spec_1 (" ", 0, NULL);
5097
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;
5104
5105 if (argbuf.length () > 0)
5106 {
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;
5112
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 *));
5120
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);
5126
5127 set_option_handlers (&handlers);
5128
5129 for (j = 1; j < decoded_options_count; j++)
5130 {
5131 switch (decoded_options[j].opt_index)
5132 {
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;
5144
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;
5156
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;
5162 }
5163 }
5164
5165 free (decoded_options);
5166
5167 alloc_switch ();
5168 switches[n_switches].part1 = 0;
5169 }
5170 }
5171
5172 /* Callback for processing %D and %I specs. */
5173
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;
5180 };
5181
5182 static void *
5183 spec_path (char *path, void *data)
5184 {
5185 struct spec_path_info *info = (struct spec_path_info *) data;
5186 size_t len = 0;
5187 char save = 0;
5188
5189 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
5190 return NULL;
5191
5192 if (info->append_len != 0)
5193 {
5194 len = strlen (path);
5195 memcpy (path + len, info->append, info->append_len + 1);
5196 }
5197
5198 if (!is_directory (path, true))
5199 return NULL;
5200
5201 do_spec_1 (info->option, 1, NULL);
5202 if (info->separate_options)
5203 do_spec_1 (" ", 0, NULL);
5204
5205 if (info->append_len == 0)
5206 {
5207 len = strlen (path);
5208 save = path[len - 1];
5209 if (IS_DIR_SEPARATOR (path[len - 1]))
5210 path[len - 1] = '\0';
5211 }
5212
5213 do_spec_1 (path, 1, NULL);
5214 do_spec_1 (" ", 0, NULL);
5215
5216 /* Must not damage the original path. */
5217 if (info->append_len == 0)
5218 path[len - 1] = save;
5219
5220 return NULL;
5221 }
5222
5223 /* True if we should compile INFILE. */
5224
5225 static bool
5226 compile_input_file_p (struct infile *infile)
5227 {
5228 if ((!infile->language) || (infile->language[0] != '*'))
5229 if (infile->incompiler == input_file_compiler)
5230 return true;
5231 return false;
5232 }
5233
5234 /* Process each member of VEC as a spec. */
5235
5236 static void
5237 do_specs_vec (vec<char_p> vec)
5238 {
5239 unsigned ix;
5240 char *opt;
5241
5242 FOR_EACH_VEC_ELT (vec, ix, opt)
5243 {
5244 do_spec_1 (opt, 1, NULL);
5245 /* Make each accumulated option a separate argument. */
5246 do_spec_1 (" ", 0, NULL);
5247 }
5248 }
5249
5250 /* Add options passed via -Xassembler or -Wa to COLLECT_AS_OPTIONS. */
5251
5252 static void
5253 putenv_COLLECT_AS_OPTIONS (vec<char_p> vec)
5254 {
5255 if (vec.is_empty ())
5256 return;
5257
5258 obstack_init (&collect_obstack);
5259 obstack_grow (&collect_obstack, "COLLECT_AS_OPTIONS=",
5260 strlen ("COLLECT_AS_OPTIONS="));
5261
5262 char *opt;
5263 unsigned ix;
5264
5265 FOR_EACH_VEC_ELT (vec, ix, opt)
5266 {
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, ' ');
5272 }
5273
5274 obstack_1grow (&collect_obstack, '\0');
5275 xputenv (XOBFINISH (&collect_obstack, char *));
5276 }
5277
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.
5286
5287 Value is zero unless a line was finished
5288 and the command on that line reported an error. */
5289
5290 static int
5291 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
5292 {
5293 const char *p = spec;
5294 int c;
5295 int i;
5296 int value;
5297
5298 /* If it's an empty string argument to a switch, keep it as is. */
5299 if (inswitch && !*p)
5300 arg_going = 1;
5301
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)
5306 {
5307 case '\n':
5308 end_going_arg ();
5309
5310 if (argbuf.length () > 0
5311 && !strcmp (argbuf.last (), "|"))
5312 {
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)
5317 {
5318 input_from_pipe = 1;
5319 break;
5320 }
5321 else
5322 argbuf.pop ();
5323 }
5324
5325 set_collect_gcc_options ();
5326
5327 if (argbuf.length () > 0)
5328 {
5329 value = execute ();
5330 if (value)
5331 return value;
5332 }
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;
5342
5343 case '|':
5344 end_going_arg ();
5345
5346 /* Use pipe */
5347 obstack_1grow (&obstack, c);
5348 arg_going = 1;
5349 break;
5350
5351 case '\t':
5352 case ' ':
5353 end_going_arg ();
5354
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;
5361
5362 case '%':
5363 switch (c = *p++)
5364 {
5365 case 0:
5366 fatal_error (input_location, "spec %qs invalid", spec);
5367
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;
5377
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;
5387
5388 case 'd':
5389 delete_this_arg = 2;
5390 break;
5391
5392 /* Dump out the directories specified with LIBRARY_PATH,
5393 followed by the absolute directories
5394 that we search for startfiles. */
5395 case 'D':
5396 {
5397 struct spec_path_info info;
5398
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;
5412
5413 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5414 }
5415 break;
5416
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. */
5420 {
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;
5430 }
5431 break;
5432 case 'n':
5433 /* %nfoo means report a notice with `foo' on stderr. */
5434 {
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++;
5445 }
5446 break;
5447
5448 case 'j':
5449 {
5450 struct stat st;
5451
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. */
5456
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))
5460 {
5461 obstack_grow (&obstack, HOST_BIT_BUCKET,
5462 strlen (HOST_BIT_BUCKET));
5463 delete_this_arg = 0;
5464 arg_going = 1;
5465 break;
5466 }
5467 }
5468 goto create_temp_file;
5469 case '|':
5470 if (use_pipes)
5471 {
5472 obstack_1grow (&obstack, '-');
5473 delete_this_arg = 0;
5474 arg_going = 1;
5475
5476 /* consume suffix */
5477 while (*p == '.' || ISALNUM ((unsigned char) *p))
5478 p++;
5479 if (p[0] == '%' && p[1] == 'O')
5480 p += 2;
5481
5482 break;
5483 }
5484 goto create_temp_file;
5485 case 'm':
5486 if (use_pipes)
5487 {
5488 /* consume suffix */
5489 while (*p == '.' || ISALNUM ((unsigned char) *p))
5490 p++;
5491 if (p[0] == '%' && p[1] == 'O')
5492 p += 2;
5493
5494 break;
5495 }
5496 goto create_temp_file;
5497 case 'g':
5498 case 'u':
5499 case 'U':
5500 create_temp_file:
5501 {
5502 struct temp_name *t;
5503 int suffix_length;
5504 const char *suffix = p;
5505 char *saved_suffix = NULL;
5506
5507 while (*p == '.' || ISALNUM ((unsigned char) *p))
5508 p++;
5509 suffix_length = p - suffix;
5510 if (p[0] == '%' && p[1] == 'O')
5511 {
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
5520 {
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);
5527 }
5528 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5529 }
5530
5531 if (compare_debug < 0)
5532 {
5533 suffix = concat (".gk", suffix, NULL);
5534 suffix_length += 3;
5535 }
5536
5537 /* If -save-temps=obj and -o were specified, use that for the
5538 temp file. */
5539 if (save_temps_length)
5540 {
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;
5555 }
5556
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. */
5564
5565 if (save_temps_flag)
5566 {
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;
5574
5575 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
5576 {
5577 #ifndef HOST_LACKS_INODE_NUMBERS
5578 struct stat st_temp;
5579
5580 /* Note, set_input() resets input_stat_set to 0. */
5581 if (input_stat_set == 0)
5582 {
5583 input_stat_set = stat (gcc_input_filename,
5584 &input_stat);
5585 if (input_stat_set >= 0)
5586 input_stat_set = 1;
5587 }
5588
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
5606 {
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;
5615 }
5616 }
5617 }
5618
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;
5626
5627 /* Make a new association if needed. %u and %j
5628 require one. */
5629 if (t == 0 || c == 'u' || c == 'j')
5630 {
5631 if (t == 0)
5632 {
5633 t = XNEW (struct temp_name);
5634 t->next = temp_names;
5635 temp_names = t;
5636 }
5637 t->length = suffix_length;
5638 if (saved_suffix)
5639 {
5640 t->suffix = saved_suffix;
5641 saved_suffix = NULL;
5642 }
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;
5650 }
5651
5652 free (saved_suffix);
5653
5654 obstack_grow (&obstack, t->filename, t->filename_length);
5655 delete_this_arg = 1;
5656 }
5657 arg_going = 1;
5658 break;
5659
5660 case 'i':
5661 if (combine_inputs)
5662 {
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 ();
5669
5670 for (i = 0; (int) i < n_infiles; i++)
5671 if (compile_input_file_p (&infiles[i]))
5672 {
5673 store_arg (infiles[i].name, 0, 0);
5674 infiles[i].compiled = true;
5675 }
5676
5677 if (at_file_supplied)
5678 close_at_file ();
5679 }
5680 else
5681 {
5682 obstack_grow (&obstack, gcc_input_filename,
5683 input_filename_length);
5684 arg_going = 1;
5685 }
5686 break;
5687
5688 case 'I':
5689 {
5690 struct spec_path_info info;
5691
5692 if (multilib_dir)
5693 {
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);
5699 }
5700
5701 if (multiarch_dir)
5702 {
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);
5708 }
5709
5710 if (gcc_exec_prefix)
5711 {
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);
5717 }
5718
5719 if (target_system_root_changed ||
5720 (target_system_root && target_sysroot_hdrs_suffix))
5721 {
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);
5729 }
5730
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;
5736
5737 for_each_path (&include_prefixes, false, info.append_len,
5738 spec_path, &info);
5739
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);
5747 }
5748 break;
5749
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 ();
5757
5758 for (i = 0; i < n_infiles + lang_specific_extra_outfiles; i++)
5759 if (outfiles[i])
5760 store_arg (outfiles[i], 0, 0);
5761
5762 if (at_file_supplied)
5763 close_at_file ();
5764 break;
5765
5766 case 'O':
5767 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5768 arg_going = 1;
5769 break;
5770
5771 case 's':
5772 this_is_library_file = 1;
5773 break;
5774
5775 case 'T':
5776 this_is_linker_script = 1;
5777 break;
5778
5779 case 'V':
5780 outfiles[input_file_number] = NULL;
5781 break;
5782
5783 case 'w':
5784 this_is_output_file = 1;
5785 break;
5786
5787 case 'W':
5788 {
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;
5803 }
5804
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;
5818
5819 /* %x{OPTION} records OPTION for %X to output. */
5820 case 'x':
5821 {
5822 const char *p1 = p;
5823 char *string;
5824 char *opt;
5825 unsigned ix;
5826
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++ != '}')
5832 ;
5833 string = save_string (p1 + 1, p - p1 - 2);
5834
5835 /* See if we already recorded this option. */
5836 FOR_EACH_VEC_ELT (linker_options, ix, opt)
5837 if (! strcmp (string, opt))
5838 {
5839 free (string);
5840 return 0;
5841 }
5842
5843 /* This option is new; add it. */
5844 add_linker_option (string, strlen (string));
5845 free (string);
5846 }
5847 break;
5848
5849 /* Dump out the options accumulated previously using %x. */
5850 case 'X':
5851 do_specs_vec (linker_options);
5852 break;
5853
5854 /* Dump out the options accumulated previously using -Wa,. */
5855 case 'Y':
5856 do_specs_vec (assembler_options);
5857 break;
5858
5859 /* Dump out the options accumulated previously using -Wp,. */
5860 case 'Z':
5861 do_specs_vec (preprocessor_options);
5862 break;
5863
5864 /* Here are digits and numbers that just process
5865 a certain constant string as a spec. */
5866
5867 case '1':
5868 value = do_spec_1 (cc1_spec, 0, NULL);
5869 if (value != 0)
5870 return value;
5871 break;
5872
5873 case '2':
5874 value = do_spec_1 (cc1plus_spec, 0, NULL);
5875 if (value != 0)
5876 return value;
5877 break;
5878
5879 case 'a':
5880 value = do_spec_1 (asm_spec, 0, NULL);
5881 if (value != 0)
5882 return value;
5883 break;
5884
5885 case 'A':
5886 value = do_spec_1 (asm_final_spec, 0, NULL);
5887 if (value != 0)
5888 return value;
5889 break;
5890
5891 case 'C':
5892 {
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;
5900 }
5901 break;
5902
5903 case 'E':
5904 value = do_spec_1 (endfile_spec, 0, NULL);
5905 if (value != 0)
5906 return value;
5907 break;
5908
5909 case 'l':
5910 value = do_spec_1 (link_spec, 0, NULL);
5911 if (value != 0)
5912 return value;
5913 break;
5914
5915 case 'L':
5916 value = do_spec_1 (lib_spec, 0, NULL);
5917 if (value != 0)
5918 return value;
5919 break;
5920
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;
5928
5929 case 'G':
5930 value = do_spec_1 (libgcc_spec, 0, NULL);
5931 if (value != 0)
5932 return value;
5933 break;
5934
5935 case 'R':
5936 /* We assume there is a directory
5937 separator at the end of this string. */
5938 if (target_system_root)
5939 {
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));
5945 }
5946 break;
5947
5948 case 'S':
5949 value = do_spec_1 (startfile_spec, 0, NULL);
5950 if (value != 0)
5951 return value;
5952 break;
5953
5954 /* Here we define characters other than letters and digits. */
5955
5956 case '{':
5957 p = handle_braces (p);
5958 if (p == 0)
5959 return -1;
5960 break;
5961
5962 case ':':
5963 p = handle_spec_function (p, NULL, soft_matched_part);
5964 if (p == 0)
5965 return -1;
5966 break;
5967
5968 case '%':
5969 obstack_1grow (&obstack, '%');
5970 break;
5971
5972 case '.':
5973 {
5974 unsigned len = 0;
5975
5976 while (p[len] && p[len] != ' ' && p[len] != '%')
5977 len++;
5978 suffix_subst = save_string (p - 1, len + 1);
5979 p += len;
5980 }
5981 break;
5982
5983 /* Henceforth ignore the option(s) matching the pattern
5984 after the %<. */
5985 case '<':
5986 case '>':
5987 {
5988 unsigned len = 0;
5989 int have_wildcard = 0;
5990 int i;
5991 int switch_option;
5992
5993 if (c == '>')
5994 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
5995 else
5996 switch_option = SWITCH_IGNORE;
5997
5998 while (p[len] && p[len] != ' ' && p[len] != '\t')
5999 len++;
6000
6001 if (p[len-1] == '*')
6002 have_wildcard = 1;
6003
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'))
6007 {
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;
6014 }
6015
6016 p += len;
6017 }
6018 break;
6019
6020 case '*':
6021 if (soft_matched_part)
6022 {
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:
6027
6028 "%{foo=*:bar%*}%{foo=*:one%*two}"
6029
6030 matches -foo=hello then it will produce:
6031
6032 barhello onehellotwo
6033 */
6034 if (*p == 0 || *p == '}')
6035 do_spec_1 (" ", 0, NULL);
6036 }
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;
6043
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 '(':
6048 {
6049 const char *name = p;
6050 struct spec_list *sl;
6051 int len;
6052
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++;
6057
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))
6061 {
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;
6068 }
6069
6070 if (sl)
6071 {
6072 value = do_spec_1 (name, 0, NULL);
6073 if (value != 0)
6074 return value;
6075 }
6076
6077 /* Discard the closing paren. */
6078 if (*p)
6079 p++;
6080 }
6081 break;
6082
6083 default:
6084 error ("spec failure: unrecognized spec option %qc", c);
6085 break;
6086 }
6087 break;
6088
6089 case '\\':
6090 /* Backslash: treat next character as ordinary. */
6091 c = *p++;
6092
6093 /* Fall through. */
6094 default:
6095 /* Ordinary character: put it into the current argument. */
6096 obstack_1grow (&obstack, c);
6097 arg_going = 1;
6098 }
6099
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 ();
6104
6105 return 0;
6106 }
6107
6108 /* Look up a spec function. */
6109
6110 static const struct spec_function *
6111 lookup_spec_function (const char *name)
6112 {
6113 const struct spec_function *sf;
6114
6115 for (sf = static_spec_functions; sf->name != NULL; sf++)
6116 if (strcmp (sf->name, name) == 0)
6117 return sf;
6118
6119 return NULL;
6120 }
6121
6122 /* Evaluate a spec function. */
6123
6124 static const char *
6125 eval_spec_function (const char *func, const char *args,
6126 const char *soft_matched_part)
6127 {
6128 const struct spec_function *sf;
6129 const char *funcval;
6130
6131 /* Saved spec processing context. */
6132 vec<const_char_p> save_argbuf;
6133
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;
6141
6142 int save_growing_size;
6143 void *save_growing_value = NULL;
6144
6145 sf = lookup_spec_function (func);
6146 if (sf == NULL)
6147 fatal_error (input_location, "unknown spec function %qs", func);
6148
6149 /* Push the spec processing context. */
6150 save_argbuf = argbuf;
6151
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;
6159
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);
6171
6172 /* Create a new spec processing context, and build the function
6173 arguments. */
6174
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);
6179
6180 /* argbuf_index is an index for the next argument to be inserted, and
6181 so contains the count of the args already inserted. */
6182
6183 funcval = (*sf->func) (argbuf.length (),
6184 argbuf.address ());
6185
6186 /* Pop the spec processing context. */
6187 argbuf.release ();
6188 argbuf = save_argbuf;
6189
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;
6197
6198 if (save_growing_size > 0)
6199 obstack_grow (&obstack, save_growing_value, save_growing_size);
6200
6201 return funcval;
6202 }
6203
6204 /* Handle a spec function call of the form:
6205
6206 %:function(args)
6207
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.
6212
6213 If RETVAL_NONNULL is not NULL, then store a bool whether function
6214 returned non-NULL.
6215
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. */
6218
6219 static const char *
6220 handle_spec_function (const char *p, bool *retval_nonnull,
6221 const char *soft_matched_part)
6222 {
6223 char *func, *args;
6224 const char *endp, *funcval;
6225 int count;
6226
6227 processing_spec_function++;
6228
6229 /* Get the function name. */
6230 for (endp = p; *endp != '\0'; endp++)
6231 {
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");
6237 }
6238 if (*endp != '(') /* ) */
6239 fatal_error (input_location, "no arguments for spec function");
6240 func = save_string (p, endp - p);
6241 p = ++endp;
6242
6243 /* Get the arguments. */
6244 for (count = 0; *endp != '\0'; endp++)
6245 {
6246 /* ( */
6247 if (*endp == ')')
6248 {
6249 if (count == 0)
6250 break;
6251 count--;
6252 }
6253 else if (*endp == '(') /* ) */
6254 count++;
6255 }
6256 /* ( */
6257 if (*endp != ')')
6258 fatal_error (input_location, "malformed spec function arguments");
6259 args = save_string (p, endp - p);
6260 p = ++endp;
6261
6262 /* p now points to just past the end of the spec function expression. */
6263
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;
6269
6270 free (func);
6271 free (args);
6272
6273 processing_spec_function--;
6274
6275 return p;
6276 }
6277
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)
6282 {
6283 return (input_suffix
6284 && !strncmp (input_suffix, atom, end_atom - atom)
6285 && input_suffix[end_atom - atom] == '\0');
6286 }
6287
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)
6292 {
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');
6299 }
6300
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)
6306 {
6307 int i;
6308 int len = end_atom - atom;
6309 int plen = starred ? len : -1;
6310
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;
6316
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)
6320 {
6321 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
6322 && *switches[i].part1 == atom[0])
6323 {
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;
6329 }
6330 }
6331
6332 return false;
6333 }
6334
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)
6340 {
6341 int i;
6342 int len = end_atom - atom;
6343 int plen = starred ? len : -1;
6344
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;
6350 }
6351
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)
6356 {
6357 int i;
6358
6359 for (i = 0; i < n_switches; i++)
6360 if (switches[i].ordering == 1)
6361 {
6362 switches[i].ordering = 0;
6363 give_switch (i, 0);
6364 }
6365 }
6366
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. */
6370
6371 static const char *
6372 handle_braces (const char *p)
6373 {
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;
6379
6380 bool a_is_suffix;
6381 bool a_is_spectype;
6382 bool a_is_starred;
6383 bool a_is_negated;
6384 bool a_matched;
6385
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;
6393
6394 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6395
6396 do
6397 {
6398 if (a_must_be_last)
6399 goto invalid;
6400
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;
6408
6409 SKIP_WHITE ();
6410 if (*p == '!')
6411 p++, a_is_negated = true;
6412
6413 SKIP_WHITE ();
6414 if (*p == '%' && p[1] == ':')
6415 {
6416 atom = NULL;
6417 end_atom = NULL;
6418 p = handle_spec_function (p + 2, &a_matched, NULL);
6419 }
6420 else
6421 {
6422 if (*p == '.')
6423 p++, a_is_suffix = true;
6424 else if (*p == ',')
6425 p++, a_is_spectype = true;
6426
6427 atom = p;
6428 esc = 0;
6429 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
6430 || *p == ',' || *p == '.' || *p == '@' || *p == '\\')
6431 {
6432 if (*p == '\\')
6433 {
6434 p++;
6435 if (!*p)
6436 fatal_error (input_location,
6437 "braced spec %qs ends in escape", orig);
6438 esc++;
6439 }
6440 p++;
6441 }
6442 end_atom = p;
6443
6444 if (esc)
6445 {
6446 const char *ap;
6447 char *ep;
6448
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++)
6454 {
6455 if (*ap == '\\')
6456 ap++;
6457 *ep = *ap;
6458 }
6459 *ep = '\0';
6460 atom = esc_buf;
6461 end_atom = ep;
6462 }
6463
6464 if (*p == '*')
6465 p++, a_is_starred = 1;
6466 }
6467
6468 SKIP_WHITE ();
6469 switch (*p)
6470 {
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;
6477
6478 mark_matching_switches (atom, end_atom, a_is_starred);
6479
6480 if (*p == '}')
6481 process_marked_switches ();
6482 break;
6483
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;
6490
6491 if (atom && atom == end_atom)
6492 {
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;
6497
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;
6503 }
6504 else
6505 {
6506 if ((a_is_suffix || a_is_spectype) && a_is_starred)
6507 goto invalid;
6508
6509 if (!a_is_starred)
6510 disj_starred = false;
6511
6512 /* Don't bother testing this atom if we already have a
6513 match. */
6514 if (!disj_matched && !n_way_matched)
6515 {
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);
6524
6525 if (a_matched != a_is_negated)
6526 {
6527 disj_matched = true;
6528 d_atom = atom;
6529 d_end_atom = end_atom;
6530 d_esc_buf = esc_buf;
6531 }
6532 }
6533 }
6534
6535 if (*p == ':')
6536 {
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;
6543
6544 /* If we have an N-way choice, reset state for the next
6545 disjunction. */
6546 if (*p == ';')
6547 {
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;
6553 }
6554 }
6555 break;
6556
6557 default:
6558 goto invalid;
6559 }
6560 }
6561 while (*p++ != '}');
6562
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);
6568
6569 return p;
6570
6571 invalid:
6572 fatal_error (input_location, "braced spec %qs is invalid at %qc", orig, *p);
6573
6574 #undef SKIP_WHITE
6575 }
6576
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. */
6586
6587 static const char *
6588 process_brace_body (const char *p, const char *atom, const char *end_atom,
6589 int starred, int matched)
6590 {
6591 const char *body, *end_body;
6592 unsigned int nesting_level;
6593 bool have_subst = false;
6594
6595 /* Locate the closing } or ;, honoring nested braces.
6596 Trim trailing whitespace. */
6597 body = p;
6598 nesting_level = 1;
6599 for (;;)
6600 {
6601 if (*p == '{')
6602 nesting_level++;
6603 else if (*p == '}')
6604 {
6605 if (!--nesting_level)
6606 break;
6607 }
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++;
6615 }
6616
6617 end_body = p;
6618 while (end_body[-1] == ' ' || end_body[-1] == '\t')
6619 end_body--;
6620
6621 if (have_subst && !starred)
6622 goto invalid;
6623
6624 if (matched)
6625 {
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)
6631 {
6632 if (do_spec_1 (string, 0, NULL) < 0)
6633 {
6634 free (string);
6635 return 0;
6636 }
6637 }
6638 else
6639 {
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;
6645
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))
6649 {
6650 if (do_spec_1 (string, 0,
6651 &switches[i].part1[hard_match_len]) < 0)
6652 {
6653 free (string);
6654 return 0;
6655 }
6656 /* Pass any arguments this switch has. */
6657 give_switch (i, 1);
6658 suffix_subst = NULL;
6659 }
6660 }
6661 free (string);
6662 }
6663
6664 return p;
6665
6666 invalid:
6667 fatal_error (input_location, "braced spec body %qs is invalid", body);
6668 }
6669 \f
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.
6673
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. */
6677
6678 static int
6679 check_live_switch (int switchnum, int prefix_length)
6680 {
6681 const char *name = switches[switchnum].part1;
6682 int i;
6683
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);
6691
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;
6697
6698 /* Now search for duplicate in a manner that depends on the name. */
6699 switch (*name)
6700 {
6701 case 'O':
6702 for (i = switchnum + 1; i < n_switches; i++)
6703 if (switches[i].part1[0] == 'O')
6704 {
6705 switches[switchnum].validated = true;
6706 switches[switchnum].live_cond = SWITCH_FALSE;
6707 return 0;
6708 }
6709 break;
6710
6711 case 'W': case 'f': case 'm': case 'g':
6712 if (! strncmp (name + 1, "no-", 3))
6713 {
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]))
6718 {
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;
6724 }
6725 }
6726 else
6727 {
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]))
6735 {
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;
6741 }
6742 }
6743 break;
6744 }
6745
6746 /* Otherwise the switch is live. */
6747 switches[switchnum].live_cond |= SWITCH_LIVE;
6748 return 1;
6749 }
6750 \f
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.
6756
6757 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6758
6759 static void
6760 give_switch (int switchnum, int omit_first_word)
6761 {
6762 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6763 return;
6764
6765 if (!omit_first_word)
6766 {
6767 do_spec_1 ("-", 0, NULL);
6768 do_spec_1 (switches[switchnum].part1, 1, NULL);
6769 }
6770
6771 if (switches[switchnum].args != 0)
6772 {
6773 const char **p;
6774 for (p = switches[switchnum].args; *p; p++)
6775 {
6776 const char *arg = *p;
6777
6778 do_spec_1 (" ", 0, NULL);
6779 if (suffix_subst)
6780 {
6781 unsigned length = strlen (arg);
6782 int dot = 0;
6783
6784 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6785 if (arg[length] == '.')
6786 {
6787 (CONST_CAST (char *, arg))[length] = 0;
6788 dot = 1;
6789 break;
6790 }
6791 do_spec_1 (arg, 1, NULL);
6792 if (dot)
6793 (CONST_CAST (char *, arg))[length] = '.';
6794 do_spec_1 (suffix_subst, 1, NULL);
6795 }
6796 else
6797 do_spec_1 (arg, 1, NULL);
6798 }
6799 }
6800
6801 do_spec_1 (" ", 0, NULL);
6802 switches[switchnum].validated = true;
6803 }
6804 \f
6805 /* Print GCC configuration (e.g. version, thread model, target,
6806 configuration_arguments) to a given FILE. */
6807
6808 static void
6809 print_configuration (FILE *file)
6810 {
6811 int n;
6812 const char *thrmod;
6813
6814 fnotice (file, "Target: %s\n", spec_machine);
6815 fnotice (file, "Configured with: %s\n", configuration_arguments);
6816
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
6828
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");
6835
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;
6842
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);
6850
6851 }
6852
6853 #define RETRY_ICE_ATTEMPTS 3
6854
6855 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
6856
6857 static bool
6858 files_equal_p (char *file1, char *file2)
6859 {
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);
6865
6866 fd1 = open (file1, O_RDONLY);
6867 fd2 = open (file2, O_RDONLY);
6868
6869 if (fd1 < 0 || fd2 < 0)
6870 goto error;
6871
6872 if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
6873 goto error;
6874
6875 if (st1.st_size != st2.st_size)
6876 goto error;
6877
6878 for (n = st1.st_size; n; n -= len)
6879 {
6880 len = n;
6881 if ((int) len > bufsize / 2)
6882 len = bufsize / 2;
6883
6884 if (read (fd1, buf, len) != (int) len
6885 || read (fd2, buf + bufsize / 2, len) != (int) len)
6886 {
6887 goto error;
6888 }
6889
6890 if (memcmp (buf, buf + bufsize / 2, len) != 0)
6891 goto error;
6892 }
6893
6894 free (buf);
6895 close (fd1);
6896 close (fd2);
6897
6898 return 1;
6899
6900 error:
6901 free (buf);
6902 close (fd1);
6903 close (fd2);
6904 return 0;
6905 }
6906
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. */
6911
6912 static bool
6913 check_repro (char **temp_stdout_files, char **temp_stderr_files)
6914 {
6915 int i;
6916 for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
6917 {
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]))
6920 {
6921 fnotice (stderr, "The bug is not reproducible, so it is"
6922 " likely a hardware or OS problem.\n");
6923 break;
6924 }
6925 }
6926 return i == RETRY_ICE_ATTEMPTS - 2;
6927 }
6928
6929 enum attempt_status {
6930 ATTEMPT_STATUS_FAIL_TO_RUN,
6931 ATTEMPT_STATUS_SUCCESS,
6932 ATTEMPT_STATUS_ICE
6933 };
6934
6935
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. */
6942
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)
6946 {
6947
6948 if (emit_system_info)
6949 {
6950 FILE *file_out = fopen (err_temp, "a");
6951 print_configuration (file_out);
6952 fputs ("\n", file_out);
6953 fclose (file_out);
6954 }
6955
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;
6962
6963 if (append)
6964 pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
6965
6966 pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
6967 if (!pex)
6968 fatal_error (input_location, "%<pex_init%> failed: %m");
6969
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)
6974 {
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);
6980 }
6981
6982 if (!pex_get_status (pex, 1, &exit_status))
6983 goto out;
6984
6985 switch (WEXITSTATUS (exit_status))
6986 {
6987 case ICE_EXIT_CODE:
6988 status = ATTEMPT_STATUS_ICE;
6989 break;
6990
6991 case SUCCESS_EXIT_CODE:
6992 status = ATTEMPT_STATUS_SUCCESS;
6993 break;
6994
6995 default:
6996 ;
6997 }
6998
6999 out:
7000 pex_free (pex);
7001 return status;
7002 }
7003
7004 /* This routine reads lines from IN file, adds C++ style comments
7005 at the begining of each line and writes result into OUT. */
7006
7007 static void
7008 insert_comments (const char *file_in, const char *file_out)
7009 {
7010 FILE *in = fopen (file_in, "rb");
7011 FILE *out = fopen (file_out, "wb");
7012 char line[256];
7013
7014 bool add_comment = true;
7015 while (fgets (line, sizeof (line), in))
7016 {
7017 if (add_comment)
7018 fputs ("// ", out);
7019 fputs (line, out);
7020 add_comment = strchr (line, '\n') != NULL;
7021 }
7022
7023 fclose (in);
7024 fclose (out);
7025 }
7026
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. */
7031
7032 static void
7033 do_report_bug (const char **new_argv, const int nargs,
7034 char **out_file, char **err_file)
7035 {
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++)
7042 {
7043 write (fd, " ", 1);
7044 write (fd, new_argv[i], strlen (new_argv[i]));
7045 }
7046 write (fd, "\n\n", 2);
7047 close (fd);
7048 new_argv[nargs] = "-E";
7049 new_argv[nargs + 1] = NULL;
7050
7051 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
7052
7053 if (status == ATTEMPT_STATUS_SUCCESS)
7054 {
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;
7060 }
7061 }
7062
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. */
7066
7067 static void
7068 try_generate_repro (const char **argv)
7069 {
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];
7075
7076 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
7077 return;
7078
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')
7084 {
7085 if (out_arg == -1)
7086 out_arg = nargs;
7087 else
7088 return;
7089 }
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;
7096
7097 if (out_arg == -1 || !quiet)
7098 return;
7099
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-";
7110
7111 int status;
7112 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
7113 {
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");
7118
7119 if (attempt == RETRY_ICE_ATTEMPTS - 1)
7120 {
7121 append = 1;
7122 emit_system_info = 1;
7123 }
7124
7125 status = run_attempt (new_argv, temp_stdout_files[attempt],
7126 temp_stderr_files[attempt], emit_system_info,
7127 append);
7128
7129 if (status != ATTEMPT_STATUS_ICE)
7130 {
7131 fnotice (stderr, "The bug is not reproducible, so it is"
7132 " likely a hardware or OS problem.\n");
7133 goto out;
7134 }
7135 }
7136
7137 if (!check_repro (temp_stdout_files, temp_stderr_files))
7138 goto out;
7139
7140 {
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);
7145
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);
7150 }
7151
7152 out:
7153 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
7154 if (temp_files[i])
7155 {
7156 unlink (temp_stdout_files[i]);
7157 free (temp_stdout_files[i]);
7158 }
7159 }
7160
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. */
7164
7165 static const char *
7166 find_file (const char *name)
7167 {
7168 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
7169 return newname ? newname : name;
7170 }
7171
7172 /* Determine whether a directory exists. If LINKER, return 0 for
7173 certain fixed names not needed by the linker. */
7174
7175 static int
7176 is_directory (const char *path1, bool linker)
7177 {
7178 int len1;
7179 char *path;
7180 char *cp;
7181 struct stat st;
7182
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';
7193
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;
7204
7205 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
7206 }
7207
7208 /* Set up the various global variables to indicate that we're processing
7209 the input file named FILENAME. */
7210
7211 void
7212 set_input (const char *filename)
7213 {
7214 const char *p;
7215
7216 gcc_input_filename = filename;
7217 input_filename_length = strlen (gcc_input_filename);
7218 input_basename = lbasename (gcc_input_filename);
7219
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)
7228 {
7229 basename_length = p - input_basename;
7230 input_suffix = p + 1;
7231 }
7232 else
7233 input_suffix = "";
7234
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;
7239 }
7240 \f
7241 /* On fatal signals, delete all the temporary files. */
7242
7243 static void
7244 fatal_signal (int signum)
7245 {
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);
7252 }
7253
7254 /* Compare the contents of the two files named CMPFILE[0] and
7255 CMPFILE[1]. Return zero if they're identical, nonzero
7256 otherwise. */
7257
7258 static int
7259 compare_files (char *cmpfile[])
7260 {
7261 int ret = 0;
7262 FILE *temp[2] = { NULL, NULL };
7263 int i;
7264
7265 #if HAVE_MMAP_FILE
7266 {
7267 size_t length[2];
7268 void *map[2] = { NULL, NULL };
7269
7270 for (i = 0; i < 2; i++)
7271 {
7272 struct stat st;
7273
7274 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
7275 {
7276 error ("%s: could not determine length of compare-debug file %s",
7277 gcc_input_filename, cmpfile[i]);
7278 ret = 1;
7279 break;
7280 }
7281
7282 length[i] = st.st_size;
7283 }
7284
7285 if (!ret && length[0] != length[1])
7286 {
7287 error ("%s: %<-fcompare-debug%> failure (length)", gcc_input_filename);
7288 ret = 1;
7289 }
7290
7291 if (!ret)
7292 for (i = 0; i < 2; i++)
7293 {
7294 int fd = open (cmpfile[i], O_RDONLY);
7295 if (fd < 0)
7296 {
7297 error ("%s: could not open compare-debug file %s",
7298 gcc_input_filename, cmpfile[i]);
7299 ret = 1;
7300 break;
7301 }
7302
7303 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
7304 close (fd);
7305
7306 if (map[i] == (void *) MAP_FAILED)
7307 {
7308 ret = -1;
7309 break;
7310 }
7311 }
7312
7313 if (!ret)
7314 {
7315 if (memcmp (map[0], map[1], length[0]) != 0)
7316 {
7317 error ("%s: %<-fcompare-debug%> failure", gcc_input_filename);
7318 ret = 1;
7319 }
7320 }
7321
7322 for (i = 0; i < 2; i++)
7323 if (map[i])
7324 munmap ((caddr_t) map[i], length[i]);
7325
7326 if (ret >= 0)
7327 return ret;
7328
7329 ret = 0;
7330 }
7331 #endif
7332
7333 for (i = 0; i < 2; i++)
7334 {
7335 temp[i] = fopen (cmpfile[i], "r");
7336 if (!temp[i])
7337 {
7338 error ("%s: could not open compare-debug file %s",
7339 gcc_input_filename, cmpfile[i]);
7340 ret = 1;
7341 break;
7342 }
7343 }
7344
7345 if (!ret && temp[0] && temp[1])
7346 for (;;)
7347 {
7348 int c0, c1;
7349 c0 = fgetc (temp[0]);
7350 c1 = fgetc (temp[1]);
7351
7352 if (c0 != c1)
7353 {
7354 error ("%s: %<-fcompare-debug%> failure",
7355 gcc_input_filename);
7356 ret = 1;
7357 break;
7358 }
7359
7360 if (c0 == EOF)
7361 break;
7362 }
7363
7364 for (i = 1; i >= 0; i--)
7365 {
7366 if (temp[i])
7367 fclose (temp[i]);
7368 }
7369
7370 return ret;
7371 }
7372
7373 driver::driver (bool can_finalize, bool debug) :
7374 explicit_link_files (NULL),
7375 decoded_options (NULL)
7376 {
7377 env.init (can_finalize, debug);
7378 }
7379
7380 driver::~driver ()
7381 {
7382 XDELETEVEC (explicit_link_files);
7383 XDELETEVEC (decoded_options);
7384 }
7385
7386 /* driver::main is implemented as a series of driver:: method calls. */
7387
7388 int
7389 driver::main (int argc, char **argv)
7390 {
7391 bool early_exit;
7392
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 ();
7404
7405 if (completion)
7406 {
7407 m_option_proposer.suggest_completion (completion);
7408 return 0;
7409 }
7410
7411 if (!maybe_print_and_exit ())
7412 return 0;
7413
7414 early_exit = prepare_infiles ();
7415 if (early_exit)
7416 return get_exit_code ();
7417
7418 do_spec_on_infiles ();
7419 maybe_run_linker (argv[0]);
7420 final_actions ();
7421 return get_exit_code ();
7422 }
7423
7424 /* Locate the final component of argv[0] after any leading path, and set
7425 the program name accordingly. */
7426
7427 void
7428 driver::set_progname (const char *argv0) const
7429 {
7430 const char *p = argv0 + strlen (argv0);
7431 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
7432 --p;
7433 progname = p;
7434
7435 xmalloc_set_program_name (progname);
7436 }
7437
7438 /* Expand any @ files within the command-line args,
7439 setting at_file_supplied if any were expanded. */
7440
7441 void
7442 driver::expand_at_files (int *argc, char ***argv) const
7443 {
7444 char **old_argv = *argv;
7445
7446 expandargv (argc, argv);
7447
7448 /* Determine if any expansions were made. */
7449 if (*argv != old_argv)
7450 at_file_supplied = true;
7451 }
7452
7453 /* Decode the command-line arguments from argc/argv into the
7454 decoded_options array. */
7455
7456 void
7457 driver::decode_argv (int argc, const char **argv)
7458 {
7459 init_opts_obstack ();
7460 init_options_struct (&global_options, &global_options_set);
7461
7462 decode_cmdline_options_to_array (argc, argv,
7463 CL_DRIVER,
7464 &decoded_options, &decoded_options_count);
7465 }
7466
7467 /* Perform various initializations and setup. */
7468
7469 void
7470 driver::global_initializations ()
7471 {
7472 /* Unlock the stdio streams. */
7473 unlock_std_streams ();
7474
7475 gcc_init_libintl ();
7476
7477 diagnostic_initialize (global_dc, 0);
7478 diagnostic_color_init (global_dc);
7479 diagnostic_urls_init (global_dc);
7480
7481 #ifdef GCC_DRIVER_HOST_INITIALIZATION
7482 /* Perform host dependent initialization when needed. */
7483 GCC_DRIVER_HOST_INITIALIZATION;
7484 #endif
7485
7486 if (atexit (delete_temp_files) != 0)
7487 fatal_error (input_location, "atexit failed");
7488
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
7506
7507 /* Parsing and gimplification sometimes need quite large stack.
7508 Increase stack size limits if possible. */
7509 stack_limit_increase (64 * 1024 * 1024);
7510
7511 /* Allocate the argument vector. */
7512 alloc_args ();
7513
7514 obstack_init (&obstack);
7515 }
7516
7517 /* Build multilib_select, et. al from the separate lines that make up each
7518 multilib selection. */
7519
7520 void
7521 driver::build_multilib_strings () const
7522 {
7523 {
7524 const char *p;
7525 const char *const *q = multilib_raw;
7526 int need_space;
7527
7528 obstack_init (&multilib_obstack);
7529 while ((p = *q++) != (char *) 0)
7530 obstack_grow (&multilib_obstack, p, strlen (p));
7531
7532 obstack_1grow (&multilib_obstack, 0);
7533 multilib_select = XOBFINISH (&multilib_obstack, const char *);
7534
7535 q = multilib_matches_raw;
7536 while ((p = *q++) != (char *) 0)
7537 obstack_grow (&multilib_obstack, p, strlen (p));
7538
7539 obstack_1grow (&multilib_obstack, 0);
7540 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
7541
7542 q = multilib_exclusions_raw;
7543 while ((p = *q++) != (char *) 0)
7544 obstack_grow (&multilib_obstack, p, strlen (p));
7545
7546 obstack_1grow (&multilib_obstack, 0);
7547 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
7548
7549 q = multilib_reuse_raw;
7550 while ((p = *q++) != (char *) 0)
7551 obstack_grow (&multilib_obstack, p, strlen (p));
7552
7553 obstack_1grow (&multilib_obstack, 0);
7554 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
7555
7556 need_space = FALSE;
7557 for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
7558 {
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;
7565 }
7566
7567 obstack_1grow (&multilib_obstack, 0);
7568 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
7569 }
7570 }
7571
7572 /* Set up the spec-handling machinery. */
7573
7574 void
7575 driver::set_up_specs () const
7576 {
7577 const char *spec_machine_suffix;
7578 char *specs_file;
7579 size_t i;
7580
7581 #ifdef INIT_ENVIRONMENT
7582 /* Set up any other necessary machine specific environment variables. */
7583 xputenv (INIT_ENVIRONMENT);
7584 #endif
7585
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. */
7589
7590 process_command (decoded_options_count, decoded_options);
7591
7592 /* Initialize the vector of specs to just the default.
7593 This means one element containing 0s, as a terminator. */
7594
7595 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
7596 memcpy (compilers, default_compilers, sizeof default_compilers);
7597 n_compilers = n_default_compilers;
7598
7599 /* Read specs from a file if there is one. */
7600
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);
7604
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 ();
7611
7612 #ifdef ACCEL_COMPILER
7613 spec_machine_suffix = machine_suffix;
7614 #else
7615 spec_machine_suffix = just_machine_suffix;
7616 #endif
7617
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);
7627
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);
7633
7634 /* Process DRIVER_SELF_SPECS, adding any new options to the end
7635 of the command line. */
7636
7637 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
7638 do_self_spec (driver_self_specs[i]);
7639
7640 /* If not cross-compiling, look for executables in the standard
7641 places. */
7642 if (*cross_compile == '0')
7643 {
7644 if (*md_exec_prefix)
7645 {
7646 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
7647 PREFIX_PRIORITY_LAST, 0, 0);
7648 }
7649 }
7650
7651 /* Process sysroot_suffix_spec. */
7652 if (*sysroot_suffix_spec != 0
7653 && !no_sysroot_suffix
7654 && do_spec_2 (sysroot_suffix_spec, NULL) == 0)
7655 {
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 ());
7661 }
7662
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)
7669 {
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);
7673 }
7674 #endif
7675
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)
7680 {
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 ());
7686 }
7687
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)
7692 {
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);
7698 }
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)
7702 {
7703 if (*md_startfile_prefix)
7704 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
7705 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7706
7707 if (*md_startfile_prefix_1)
7708 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
7709 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7710
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.
7715
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')
7723 {
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);
7730 }
7731
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);
7742 }
7743
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)
7747 {
7748 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
7749 R_OK, true);
7750 read_specs (filename ? filename : uptr->filename, false, true);
7751 }
7752
7753 /* Process any user self specs. */
7754 {
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);
7760 }
7761
7762 if (compare_debug)
7763 {
7764 enum save_temps save;
7765
7766 if (!compare_debug_second)
7767 {
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);
7772
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;
7777
7778 n_switches = n_switches_debug_check[1];
7779 n_switches_alloc = n_switches_alloc_debug_check[1];
7780 switches = switches_debug_check[1];
7781 }
7782
7783 /* Avoid crash when computing %j in this early. */
7784 save = save_temps_flag;
7785 save_temps_flag = SAVE_TEMPS_NONE;
7786
7787 compare_debug = -compare_debug;
7788 do_self_spec ("%:compare-debug-self-opt()");
7789
7790 save_temps_flag = save;
7791
7792 if (!compare_debug_second)
7793 {
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];
7801 }
7802 }
7803
7804
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);
7810
7811 /* Now we have the specs.
7812 Set the `valid' bits for switches that match anything in any spec. */
7813
7814 validate_all_switches ();
7815
7816 /* Now that we have the switches and the specs, set
7817 the subdirectory based on the options. */
7818 set_multilib_dir ();
7819 }
7820
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. */
7824
7825 void
7826 driver::putenv_COLLECT_GCC (const char *argv0) const
7827 {
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 *));
7832 }
7833
7834 /* Set up to remember the pathname of the lto wrapper. */
7835
7836 void
7837 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
7838 {
7839 char *lto_wrapper_file;
7840
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)
7847 {
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 *));
7856 }
7857
7858 }
7859
7860 /* Set up to remember the names of offload targets. */
7861
7862 void
7863 driver::maybe_putenv_OFFLOAD_TARGETS () const
7864 {
7865 if (offload_targets && offload_targets[0] != '\0')
7866 {
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 *));
7872 }
7873
7874 free (offload_targets);
7875 offload_targets = NULL;
7876 }
7877
7878 /* Reject switches that no pass was interested in. */
7879
7880 void
7881 driver::handle_unrecognized_options ()
7882 {
7883 for (size_t i = 0; (int) i < n_switches; i++)
7884 if (! switches[i].validated)
7885 {
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);
7894 }
7895 }
7896
7897 /* Handle the various -print-* options, returning 0 if the driver
7898 should exit, or nonzero if the driver should continue. */
7899
7900 int
7901 driver::maybe_print_and_exit () const
7902 {
7903 if (print_search_dirs)
7904 {
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);
7913 }
7914
7915 if (print_file_name)
7916 {
7917 printf ("%s\n", find_file (print_file_name));
7918 return (0);
7919 }
7920
7921 if (print_prog_name)
7922 {
7923 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
7924 {
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)
7933 {
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))
7938 {
7939 default_linker[len] = '\0';
7940 ld = concat (default_linker, use_ld,
7941 HOST_EXECUTABLE_SUFFIX, NULL);
7942 }
7943 }
7944 if (ld == NULL)
7945 # endif
7946 ld = concat (DEFAULT_LINKER, use_ld, NULL);
7947 if (access (ld, X_OK) == 0)
7948 {
7949 printf ("%s\n", ld);
7950 return (0);
7951 }
7952 #endif
7953 print_prog_name = concat (print_prog_name, use_ld, NULL);
7954 }
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);
7958 }
7959
7960 if (print_multi_lib)
7961 {
7962 print_multilib_info ();
7963 return (0);
7964 }
7965
7966 if (print_multi_directory)
7967 {
7968 if (multilib_dir == NULL)
7969 printf (".\n");
7970 else
7971 printf ("%s\n", multilib_dir);
7972 return (0);
7973 }
7974
7975 if (print_multiarch)
7976 {
7977 if (multiarch_dir == NULL)
7978 printf ("\n");
7979 else
7980 printf ("%s\n", multiarch_dir);
7981 return (0);
7982 }
7983
7984 if (print_sysroot)
7985 {
7986 if (target_system_root)
7987 {
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);
7992 }
7993 return (0);
7994 }
7995
7996 if (print_multi_os_directory)
7997 {
7998 if (multilib_os_dir == NULL)
7999 printf (".\n");
8000 else
8001 printf ("%s\n", multilib_os_dir);
8002 return (0);
8003 }
8004
8005 if (print_sysroot_headers_suffix)
8006 {
8007 if (*sysroot_hdrs_suffix_spec)
8008 {
8009 printf("%s\n", (target_sysroot_hdrs_suffix
8010 ? target_sysroot_hdrs_suffix
8011 : ""));
8012 return (0);
8013 }
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");
8019 }
8020
8021 if (print_help_list)
8022 {
8023 display_help ();
8024
8025 if (! verbose_flag)
8026 {
8027 printf (_("\nFor bug reporting instructions, please see:\n"));
8028 printf ("%s.\n", bug_report_url);
8029
8030 return (0);
8031 }
8032
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);
8039 }
8040
8041 if (print_version)
8042 {
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;
8052
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);
8057 }
8058
8059 if (verbose_flag)
8060 {
8061 print_configuration (stderr);
8062 if (n_infiles == 0)
8063 return (0);
8064 }
8065
8066 return 1;
8067 }
8068
8069 /* Figure out what to do with each input file.
8070 Return true if we need to exit early from "main", false otherwise. */
8071
8072 bool
8073 driver::prepare_infiles ()
8074 {
8075 size_t i;
8076 int lang_n_infiles = 0;
8077
8078 if (n_infiles == added_libraries)
8079 fatal_error (input_location, "no input files");
8080
8081 if (seen_error ())
8082 /* Early exit needed from main. */
8083 return true;
8084
8085 /* Make a place to record the compiler output file names
8086 that correspond to the input files. */
8087
8088 i = n_infiles;
8089 i += lang_specific_extra_outfiles;
8090 outfiles = XCNEWVEC (const char *, i);
8091
8092 /* Record which files were specified explicitly as link input. */
8093
8094 explicit_link_files = XCNEWVEC (char, n_infiles);
8095
8096 combine_inputs = have_o || flag_wpa;
8097
8098 for (i = 0; (int) i < n_infiles; i++)
8099 {
8100 const char *name = infiles[i].name;
8101 struct compiler *compiler = lookup_compiler (name,
8102 strlen (name),
8103 infiles[i].language);
8104
8105 if (compiler && !(compiler->combinable))
8106 combine_inputs = false;
8107
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)
8112 {
8113 lang_n_infiles++;
8114 input_file_compiler = compiler;
8115 infiles[i].incompiler = compiler;
8116 }
8117 else
8118 {
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;
8123 }
8124 infiles[i].compiled = false;
8125 infiles[i].preprocessed = false;
8126 }
8127
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");
8132
8133 /* No early exit needed from main; we can continue. */
8134 return false;
8135 }
8136
8137 /* Run the spec machinery on each input file. */
8138
8139 void
8140 driver::do_spec_on_infiles () const
8141 {
8142 size_t i;
8143
8144 for (i = 0; (int) i < n_infiles; i++)
8145 {
8146 int this_file_error = 0;
8147
8148 /* Tell do_spec what to substitute for %i. */
8149
8150 input_file_number = i;
8151 set_input (infiles[i].name);
8152
8153 if (infiles[i].compiled)
8154 continue;
8155
8156 /* Use the same thing in %o, unless cp->spec says otherwise. */
8157
8158 outfiles[i] = gcc_input_filename;
8159
8160 /* Figure out which compiler from the file's suffix. */
8161
8162 input_file_compiler
8163 = lookup_compiler (infiles[i].name, input_filename_length,
8164 infiles[i].language);
8165
8166 if (input_file_compiler)
8167 {
8168 /* Ok, we found an applicable compiler. Run its spec. */
8169
8170 if (input_file_compiler->spec[0] == '#')
8171 {
8172 error ("%s: %s compiler not installed on this system",
8173 gcc_input_filename, &input_file_compiler->spec[1]);
8174 this_file_error = 1;
8175 }
8176 else
8177 {
8178 int value;
8179
8180 if (compare_debug)
8181 {
8182 free (debug_check_temp_file[0]);
8183 debug_check_temp_file[0] = NULL;
8184
8185 free (debug_check_temp_file[1]);
8186 debug_check_temp_file[1] = NULL;
8187 }
8188
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])
8194 {
8195 if (verbose_flag)
8196 inform (UNKNOWN_LOCATION,
8197 "recompiling with %<-fcompare-debug%>");
8198
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];
8203
8204 value = do_spec (input_file_compiler->spec);
8205
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];
8210
8211 if (value < 0)
8212 {
8213 error ("during %<-fcompare-debug%> recompilation");
8214 this_file_error = 1;
8215 }
8216
8217 gcc_assert (debug_check_temp_file[1]
8218 && filename_cmp (debug_check_temp_file[0],
8219 debug_check_temp_file[1]));
8220
8221 if (verbose_flag)
8222 inform (UNKNOWN_LOCATION, "comparing final insns dumps");
8223
8224 if (compare_files (debug_check_temp_file))
8225 this_file_error = 1;
8226 }
8227
8228 if (compare_debug)
8229 {
8230 free (debug_check_temp_file[0]);
8231 debug_check_temp_file[0] = NULL;
8232
8233 free (debug_check_temp_file[1]);
8234 debug_check_temp_file[1] = NULL;
8235 }
8236 }
8237 }
8238
8239 /* If this file's name does not contain a recognized suffix,
8240 record it as explicit linker input. */
8241
8242 else
8243 explicit_link_files[i] = 1;
8244
8245 /* Clear the delete-on-failure queue, deleting the files in it
8246 if this compilation failed. */
8247
8248 if (this_file_error)
8249 {
8250 delete_failure_queue ();
8251 errorcount++;
8252 }
8253 /* If this compilation succeeded, don't delete those files later. */
8254 clear_failure_queue ();
8255 }
8256
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)
8262 {
8263 int i;
8264
8265 for (i = 0; i < n_infiles ; i++)
8266 if (infiles[i].incompiler
8267 || (infiles[i].language && infiles[i].language[0] != '*'))
8268 {
8269 set_input (infiles[i].name);
8270 break;
8271 }
8272 }
8273
8274 if (!seen_error ())
8275 {
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++;
8281 }
8282 }
8283
8284 /* If we have to run the linker, do it now. */
8285
8286 void
8287 driver::maybe_run_linker (const char *argv0) const
8288 {
8289 size_t i;
8290 int linker_was_run = 0;
8291 int num_linker_inputs;
8292
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++;
8298
8299 /* Run ld to link all the compiler output files. */
8300
8301 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
8302 {
8303 int tmp = execution_count;
8304
8305 detect_jobserver ();
8306
8307 if (! have_c)
8308 {
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
8316
8317 /* We'll use ld if we can't find collect2. */
8318 if (! strcmp (linker_name_spec, "collect2"))
8319 {
8320 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
8321 if (s == NULL)
8322 linker_name_spec = "ld";
8323 }
8324
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
8335 {
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);
8344 }
8345 #endif
8346 lto_gcc_spec = argv0;
8347 }
8348
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);
8353
8354 if (print_subprocess_help == 1)
8355 {
8356 printf (_("\nLinker options\n==============\n\n"));
8357 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
8358 " to the linker.\n\n"));
8359 fflush (stdout);
8360 }
8361 int value = do_spec (link_command_spec);
8362 if (value < 0)
8363 errorcount = 1;
8364 linker_was_run = (tmp != execution_count);
8365 }
8366
8367 /* If options said don't run linker,
8368 complain about input files to be given to the linker. */
8369
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]);
8376 }
8377
8378 /* The end of "main". */
8379
8380 void
8381 driver::final_actions () const
8382 {
8383 /* Delete some or all of the temporary files we made. */
8384
8385 if (seen_error ())
8386 delete_failure_queue ();
8387 delete_temp_files ();
8388
8389 if (print_help_list)
8390 {
8391 printf (("\nFor bug reporting instructions, please see:\n"));
8392 printf ("%s\n", bug_report_url);
8393 }
8394 }
8395
8396 /* Detect whether jobserver is active and working. If not drop
8397 --jobserver-auth from MAKEFLAGS. */
8398
8399 void
8400 driver::detect_jobserver () const
8401 {
8402 /* Detect jobserver and drop it if it's not working. */
8403 const char *makeflags = env.get ("MAKEFLAGS");
8404 if (makeflags != NULL)
8405 {
8406 const char *needle = "--jobserver-auth=";
8407 const char *n = strstr (makeflags, needle);
8408 if (n != NULL)
8409 {
8410 int rfd = -1;
8411 int wfd = -1;
8412
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));
8419
8420 /* Drop the jobserver if it's not working now. */
8421 if (!jobserver)
8422 {
8423 unsigned offset = n - makeflags;
8424 char *dup = xstrdup (makeflags);
8425 dup[offset] = '\0';
8426
8427 const char *space = strchr (makeflags + offset, ' ');
8428 if (space != NULL)
8429 strcpy (dup + offset, space);
8430 xputenv (concat ("MAKEFLAGS=", dup, NULL));
8431 }
8432 }
8433 }
8434 }
8435
8436 /* Determine what the exit code of the driver should be. */
8437
8438 int
8439 driver::get_exit_code () const
8440 {
8441 return (signal_count != 0 ? 2
8442 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
8443 : 0);
8444 }
8445
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. */
8449
8450 static struct compiler *
8451 lookup_compiler (const char *name, size_t length, const char *language)
8452 {
8453 struct compiler *cp;
8454
8455 /* If this was specified by the user to be a linker input, indicate that. */
8456 if (language != 0 && language[0] == '*')
8457 return 0;
8458
8459 /* Otherwise, look for the language, if one is spec'd. */
8460 if (language != 0)
8461 {
8462 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8463 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
8464 {
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");
8472
8473 return cp;
8474 }
8475
8476 error ("language %s not recognized", language);
8477 return 0;
8478 }
8479
8480 /* Look for a suffix. */
8481 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
8482 {
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))
8489 ))
8490 break;
8491 }
8492
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--)
8497 {
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)))
8507 ))
8508 break;
8509 }
8510 #endif
8511
8512 if (cp >= compilers)
8513 {
8514 if (cp->spec[0] != '@')
8515 /* A non-alias entry: return it. */
8516 return cp;
8517
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);
8522 }
8523 return 0;
8524 }
8525 \f
8526 static char *
8527 save_string (const char *s, int len)
8528 {
8529 char *result = XNEWVEC (char, len + 1);
8530
8531 gcc_checking_assert (strlen (s) >= (unsigned int) len);
8532 memcpy (result, s, len);
8533 result[len] = 0;
8534 return result;
8535 }
8536
8537 \f
8538 static inline void
8539 validate_switches_from_spec (const char *spec, bool user)
8540 {
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);
8551 }
8552
8553 static void
8554 validate_all_switches (void)
8555 {
8556 struct compiler *comp;
8557 struct spec_list *spec;
8558
8559 for (comp = compilers; comp->spec; comp++)
8560 validate_switches_from_spec (comp->spec, false);
8561
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);
8565
8566 validate_switches_from_spec (link_command_spec, false);
8567 }
8568
8569 /* Look at the switch-name that comes after START
8570 and mark as valid all supplied switches that match it. */
8571
8572 static const char *
8573 validate_switches (const char *start, bool user_spec)
8574 {
8575 const char *p = start;
8576 const char *atom;
8577 size_t len;
8578 int i;
8579 bool suffix = false;
8580 bool starred = false;
8581
8582 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
8583
8584 next_member:
8585 SKIP_WHITE ();
8586
8587 if (*p == '!')
8588 p++;
8589
8590 SKIP_WHITE ();
8591 if (*p == '.' || *p == ',')
8592 suffix = true, p++;
8593
8594 atom = p;
8595 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
8596 || *p == ',' || *p == '.' || *p == '@')
8597 p++;
8598 len = p - atom;
8599
8600 if (*p == '*')
8601 starred = true, p++;
8602
8603 SKIP_WHITE ();
8604
8605 if (!suffix)
8606 {
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;
8613 }
8614
8615 if (*p) p++;
8616 if (*p && (p[-1] == '|' || p[-1] == '&'))
8617 goto next_member;
8618
8619 if (*p && p[-1] == ':')
8620 {
8621 while (*p && *p != ';' && *p != '}')
8622 {
8623 if (*p == '%')
8624 {
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);
8632 }
8633 else
8634 p++;
8635 }
8636
8637 if (*p) p++;
8638 if (*p && p[-1] == ';')
8639 goto next_member;
8640 }
8641
8642 return p;
8643 #undef SKIP_WHITE
8644 }
8645 \f
8646 struct mdswitchstr
8647 {
8648 const char *str;
8649 int len;
8650 };
8651
8652 static struct mdswitchstr *mdswitches;
8653 static int n_mdswitches;
8654
8655 /* Check whether a particular argument was used. The first time we
8656 canonicalize the switches to keep only the ones we care about. */
8657
8658 struct used_arg_t
8659 {
8660 public:
8661 int operator () (const char *p, int len);
8662 void finalize ();
8663
8664 private:
8665 struct mswitchstr
8666 {
8667 const char *str;
8668 const char *replace;
8669 int len;
8670 int rep_len;
8671 };
8672
8673 mswitchstr *mswitches;
8674 int n_mswitches;
8675
8676 };
8677
8678 used_arg_t used_arg;
8679
8680 int
8681 used_arg_t::operator () (const char *p, int len)
8682 {
8683 int i, j;
8684
8685 if (!mswitches)
8686 {
8687 struct mswitchstr *matches;
8688 const char *q;
8689 int cnt = 0;
8690
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++;
8696
8697 matches
8698 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
8699 i = 0;
8700 q = multilib_matches;
8701 while (*q != '\0')
8702 {
8703 matches[i].str = q;
8704 while (*q != ' ')
8705 {
8706 if (*q == '\0')
8707 {
8708 invalid_matches:
8709 fatal_error (input_location, "multilib spec %qs is invalid",
8710 multilib_matches);
8711 }
8712 q++;
8713 }
8714 matches[i].len = q - matches[i].str;
8715
8716 matches[i].replace = ++q;
8717 while (*q != ';' && *q != '\0')
8718 {
8719 if (*q == ' ')
8720 goto invalid_matches;
8721 q++;
8722 }
8723 matches[i].rep_len = q - matches[i].replace;
8724 i++;
8725 if (*q == ';')
8726 q++;
8727 }
8728
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)
8737 {
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))
8742 {
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;
8749 }
8750 }
8751
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++)
8756 {
8757 const char *r;
8758
8759 for (q = multilib_options; *q != '\0'; *q && q++)
8760 {
8761 while (*q == ' ')
8762 q++;
8763
8764 r = q;
8765 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
8766 || strchr (" /", q[mdswitches[i].len]) == NULL)
8767 {
8768 while (*q != ' ' && *q != '/' && *q != '\0')
8769 q++;
8770 if (*q != '/')
8771 break;
8772 q++;
8773 }
8774
8775 if (*q != ' ' && *q != '\0')
8776 {
8777 while (*r != ' ' && *r != '\0')
8778 {
8779 q = r;
8780 while (*q != ' ' && *q != '/' && *q != '\0')
8781 q++;
8782
8783 if (used_arg (r, q - r))
8784 break;
8785
8786 if (*q != '/')
8787 {
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;
8794 }
8795
8796 r = q + 1;
8797 }
8798 break;
8799 }
8800 }
8801 }
8802 }
8803
8804 for (i = 0; i < n_mswitches; i++)
8805 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
8806 return 1;
8807
8808 return 0;
8809 }
8810
8811 void used_arg_t::finalize ()
8812 {
8813 XDELETEVEC (mswitches);
8814 mswitches = NULL;
8815 n_mswitches = 0;
8816 }
8817
8818
8819 static int
8820 default_arg (const char *p, int len)
8821 {
8822 int i;
8823
8824 for (i = 0; i < n_mdswitches; i++)
8825 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
8826 return 1;
8827
8828 return 0;
8829 }
8830
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. */
8843
8844 static void
8845 set_multilib_dir (void)
8846 {
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;
8853
8854 n_mdswitches = 0;
8855 start = multilib_defaults;
8856 while (*start == ' ' || *start == '\t')
8857 start++;
8858 while (*start != '\0')
8859 {
8860 n_mdswitches++;
8861 while (*start != ' ' && *start != '\t' && *start != '\0')
8862 start++;
8863 while (*start == ' ' || *start == '\t')
8864 start++;
8865 }
8866
8867 if (n_mdswitches)
8868 {
8869 int i = 0;
8870
8871 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
8872 for (start = multilib_defaults; *start != '\0'; start = end + 1)
8873 {
8874 while (*start == ' ' || *start == '\t')
8875 start++;
8876
8877 if (*start == '\0')
8878 break;
8879
8880 for (end = start + 1;
8881 *end != ' ' && *end != '\t' && *end != '\0'; end++)
8882 ;
8883
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;
8888
8889 if (*end == '\0')
8890 break;
8891 }
8892 }
8893
8894 p = multilib_exclusions;
8895 while (*p != '\0')
8896 {
8897 /* Ignore newlines. */
8898 if (*p == '\n')
8899 {
8900 ++p;
8901 continue;
8902 }
8903
8904 /* Check the arguments. */
8905 ok = 1;
8906 while (*p != ';')
8907 {
8908 if (*p == '\0')
8909 {
8910 invalid_exclusions:
8911 fatal_error (input_location, "multilib exclusions %qs is invalid",
8912 multilib_exclusions);
8913 }
8914
8915 if (! ok)
8916 {
8917 ++p;
8918 continue;
8919 }
8920
8921 this_arg = p;
8922 while (*p != ' ' && *p != ';')
8923 {
8924 if (*p == '\0')
8925 goto invalid_exclusions;
8926 ++p;
8927 }
8928
8929 if (*this_arg != '!')
8930 not_arg = 0;
8931 else
8932 {
8933 not_arg = 1;
8934 ++this_arg;
8935 }
8936
8937 ok = used_arg (this_arg, p - this_arg);
8938 if (not_arg)
8939 ok = ! ok;
8940
8941 if (*p == ' ')
8942 ++p;
8943 }
8944
8945 if (ok)
8946 return;
8947
8948 ++p;
8949 }
8950
8951 first = 1;
8952 p = multilib_select;
8953
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);
8958
8959 while (*p != '\0')
8960 {
8961 /* Ignore newlines. */
8962 if (*p == '\n')
8963 {
8964 ++p;
8965 continue;
8966 }
8967
8968 /* Get the initial path. */
8969 this_path = p;
8970 while (*p != ' ')
8971 {
8972 if (*p == '\0')
8973 {
8974 invalid_select:
8975 fatal_error (input_location, "multilib select %qs %qs is invalid",
8976 multilib_select, multilib_reuse);
8977 }
8978 ++p;
8979 }
8980 this_path_len = p - this_path;
8981
8982 /* Check the arguments. */
8983 ok = 1;
8984 ndfltok = 1;
8985 ++p;
8986 while (*p != ';')
8987 {
8988 if (*p == '\0')
8989 goto invalid_select;
8990
8991 if (! ok)
8992 {
8993 ++p;
8994 continue;
8995 }
8996
8997 this_arg = p;
8998 while (*p != ' ' && *p != ';')
8999 {
9000 if (*p == '\0')
9001 goto invalid_select;
9002 ++p;
9003 }
9004
9005 if (*this_arg != '!')
9006 not_arg = 0;
9007 else
9008 {
9009 not_arg = 1;
9010 ++this_arg;
9011 }
9012
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;
9023
9024 if (! ok)
9025 ndfltok = 0;
9026
9027 if (default_arg (this_arg, p - this_arg))
9028 ok = 1;
9029
9030 if (*p == ' ')
9031 ++p;
9032 }
9033
9034 if (ok && first)
9035 {
9036 if (this_path_len != 1
9037 || this_path[0] != '.')
9038 {
9039 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
9040 char *q;
9041
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;
9048 }
9049 first = 0;
9050 }
9051
9052 if (ndfltok)
9053 {
9054 const char *q = this_path, *end = this_path + this_path_len;
9055
9056 while (q < end && *q != ':')
9057 q++;
9058 if (q < end)
9059 {
9060 const char *q2 = q + 1, *ml_end = end;
9061 char *new_multilib_os_dir;
9062
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
9070 {
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;
9075 }
9076
9077 if (q2 < end && *q2 == ':')
9078 {
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;
9083 }
9084 break;
9085 }
9086 }
9087
9088 ++p;
9089 }
9090
9091 if (multilib_dir == NULL && multilib_os_dir != NULL
9092 && strcmp (multilib_os_dir, ".") == 0)
9093 {
9094 free (CONST_CAST (char *, multilib_os_dir));
9095 multilib_os_dir = NULL;
9096 }
9097 else if (multilib_dir != NULL && multilib_os_dir == NULL)
9098 multilib_os_dir = multilib_dir;
9099 }
9100
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. */
9110
9111 static void
9112 print_multilib_info (void)
9113 {
9114 const char *p = multilib_select;
9115 const char *last_path = 0, *this_path;
9116 int skip;
9117 unsigned int last_path_len = 0;
9118
9119 while (*p != '\0')
9120 {
9121 skip = 0;
9122 /* Ignore newlines. */
9123 if (*p == '\n')
9124 {
9125 ++p;
9126 continue;
9127 }
9128
9129 /* Get the initial path. */
9130 this_path = p;
9131 while (*p != ' ')
9132 {
9133 if (*p == '\0')
9134 {
9135 invalid_select:
9136 fatal_error (input_location,
9137 "multilib select %qs is invalid", multilib_select);
9138 }
9139
9140 ++p;
9141 }
9142
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;
9149
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. */
9153 {
9154 const char *e = multilib_exclusions;
9155 const char *this_arg;
9156
9157 while (*e != '\0')
9158 {
9159 int m = 1;
9160 /* Ignore newlines. */
9161 if (*e == '\n')
9162 {
9163 ++e;
9164 continue;
9165 }
9166
9167 /* Check the arguments. */
9168 while (*e != ';')
9169 {
9170 const char *q;
9171 int mp = 0;
9172
9173 if (*e == '\0')
9174 {
9175 invalid_exclusion:
9176 fatal_error (input_location,
9177 "multilib exclusion %qs is invalid",
9178 multilib_exclusions);
9179 }
9180
9181 if (! m)
9182 {
9183 ++e;
9184 continue;
9185 }
9186
9187 this_arg = e;
9188
9189 while (*e != ' ' && *e != ';')
9190 {
9191 if (*e == '\0')
9192 goto invalid_exclusion;
9193 ++e;
9194 }
9195
9196 q = p + 1;
9197 while (*q != ';')
9198 {
9199 const char *arg;
9200 int len = e - this_arg;
9201
9202 if (*q == '\0')
9203 goto invalid_select;
9204
9205 arg = q;
9206
9207 while (*q != ' ' && *q != ';')
9208 {
9209 if (*q == '\0')
9210 goto invalid_select;
9211 ++q;
9212 }
9213
9214 if (! strncmp (arg, this_arg,
9215 (len < q - arg) ? q - arg : len)
9216 || default_arg (this_arg, e - this_arg))
9217 {
9218 mp = 1;
9219 break;
9220 }
9221
9222 if (*q == ' ')
9223 ++q;
9224 }
9225
9226 if (! mp)
9227 m = 0;
9228
9229 if (*e == ' ')
9230 ++e;
9231 }
9232
9233 if (m)
9234 {
9235 skip = 1;
9236 break;
9237 }
9238
9239 if (*e != '\0')
9240 ++e;
9241 }
9242 }
9243
9244 if (! skip)
9245 {
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));
9250
9251 last_path = this_path;
9252 last_path_len = p - this_path;
9253 }
9254
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)
9259 {
9260 const char *q;
9261
9262 q = p + 1;
9263 while (*q != ';')
9264 {
9265 const char *arg;
9266
9267 if (*q == '\0')
9268 goto invalid_select;
9269
9270 if (*q == '!')
9271 arg = NULL;
9272 else
9273 arg = q;
9274
9275 while (*q != ' ' && *q != ';')
9276 {
9277 if (*q == '\0')
9278 goto invalid_select;
9279 ++q;
9280 }
9281
9282 if (arg != NULL
9283 && default_arg (arg, q - arg))
9284 {
9285 skip = 1;
9286 break;
9287 }
9288
9289 if (*q == ' ')
9290 ++q;
9291 }
9292 }
9293
9294 if (! skip)
9295 {
9296 const char *p1;
9297
9298 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
9299 putchar (*p1);
9300 putchar (';');
9301 }
9302
9303 ++p;
9304 while (*p != ';')
9305 {
9306 int use_arg;
9307
9308 if (*p == '\0')
9309 goto invalid_select;
9310
9311 if (skip)
9312 {
9313 ++p;
9314 continue;
9315 }
9316
9317 use_arg = *p != '!';
9318
9319 if (use_arg)
9320 putchar ('@');
9321
9322 while (*p != ' ' && *p != ';')
9323 {
9324 if (*p == '\0')
9325 goto invalid_select;
9326 if (use_arg)
9327 putchar (*p);
9328 ++p;
9329 }
9330
9331 if (*p == ' ')
9332 ++p;
9333 }
9334
9335 if (! skip)
9336 {
9337 /* If there are extra options, print them now. */
9338 if (multilib_extra && *multilib_extra)
9339 {
9340 int print_at = TRUE;
9341 const char *q;
9342
9343 for (q = multilib_extra; *q != '\0'; q++)
9344 {
9345 if (*q == ' ')
9346 print_at = TRUE;
9347 else
9348 {
9349 if (print_at)
9350 putchar ('@');
9351 putchar (*q);
9352 print_at = FALSE;
9353 }
9354 }
9355 }
9356
9357 putchar ('\n');
9358 }
9359
9360 ++p;
9361 }
9362 }
9363 \f
9364 /* getenv built-in spec function.
9365
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.
9370
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. */
9374
9375 static const char *
9376 getenv_spec_function (int argc, const char **argv)
9377 {
9378 const char *value;
9379 const char *varname;
9380
9381 char *result;
9382 char *ptr;
9383 size_t len;
9384
9385 if (argc != 2)
9386 return NULL;
9387
9388 varname = argv[0];
9389 value = env.get (varname);
9390
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)
9395 {
9396 result = XNEWVAR (char, strlen(varname) + 2);
9397 sprintf (result, "/%s", varname);
9398 return result;
9399 }
9400
9401 if (!value)
9402 fatal_error (input_location,
9403 "environment variable %qs not defined", varname);
9404
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)
9412 {
9413 ptr[0] = '\\';
9414 ptr[1] = *value++;
9415 }
9416
9417 strcpy (ptr, argv[1]);
9418
9419 return result;
9420 }
9421
9422 /* if-exists built-in spec function.
9423
9424 Checks to see if the file specified by the absolute pathname in
9425 ARGS exists. Returns that pathname if found.
9426
9427 The usual use for this function is to check for a library file
9428 (whose name has been expanded with %s). */
9429
9430 static const char *
9431 if_exists_spec_function (int argc, const char **argv)
9432 {
9433 /* Must have only one argument. */
9434 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
9435 return argv[0];
9436
9437 return NULL;
9438 }
9439
9440 /* if-exists-else built-in spec function.
9441
9442 This is like if-exists, but takes an additional argument which
9443 is returned if the first argument does not exist. */
9444
9445 static const char *
9446 if_exists_else_spec_function (int argc, const char **argv)
9447 {
9448 /* Must have exactly two arguments. */
9449 if (argc != 2)
9450 return NULL;
9451
9452 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
9453 return argv[0];
9454
9455 return argv[1];
9456 }
9457
9458 /* sanitize built-in spec function.
9459
9460 This returns non-NULL, if sanitizing address, thread or
9461 any of the undefined behavior sanitizers. */
9462
9463 static const char *
9464 sanitize_spec_function (int argc, const char **argv)
9465 {
9466 if (argc != 1)
9467 return NULL;
9468
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;
9484 }
9485
9486 /* replace-outfile built-in spec function.
9487
9488 This looks for the first argument in the outfiles array's name and
9489 replaces it with the second argument. */
9490
9491 static const char *
9492 replace_outfile_spec_function (int argc, const char **argv)
9493 {
9494 int i;
9495 /* Must have exactly two arguments. */
9496 if (argc != 2)
9497 abort ();
9498
9499 for (i = 0; i < n_infiles; i++)
9500 {
9501 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
9502 outfiles[i] = xstrdup (argv[1]);
9503 }
9504 return NULL;
9505 }
9506
9507 /* remove-outfile built-in spec function.
9508 *
9509 * This looks for the first argument in the outfiles array's name and
9510 * removes it. */
9511
9512 static const char *
9513 remove_outfile_spec_function (int argc, const char **argv)
9514 {
9515 int i;
9516 /* Must have exactly one argument. */
9517 if (argc != 1)
9518 abort ();
9519
9520 for (i = 0; i < n_infiles; i++)
9521 {
9522 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
9523 outfiles[i] = NULL;
9524 }
9525 return NULL;
9526 }
9527
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))*
9531 */
9532 static int
9533 compare_version_strings (const char *v1, const char *v2)
9534 {
9535 int rresult;
9536 regex_t r;
9537
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 ();
9551
9552 return strverscmp (v1, v2);
9553 }
9554
9555
9556 /* version_compare built-in spec function.
9557
9558 This takes an argument of the following form:
9559
9560 <comparison-op> <arg1> [<arg2>] <switch> <result>
9561
9562 and produces "result" if the comparison evaluates to true,
9563 and nothing if it doesn't.
9564
9565 The supported <comparison-op> values are:
9566
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
9573
9574 If the switch is not present, the condition is false unless
9575 the first character of the <comparison-op> is '!'.
9576
9577 For example,
9578 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
9579 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
9580
9581 static const char *
9582 version_compare_spec_function (int argc, const char **argv)
9583 {
9584 int comp1, comp2;
9585 size_t switch_len;
9586 const char *switch_value = NULL;
9587 int nargs = 1, i;
9588 bool result;
9589
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");
9598
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;
9604
9605 if (switch_value == NULL)
9606 comp1 = comp2 = -1;
9607 else
9608 {
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. */
9614 }
9615
9616 switch (argv[0][0] << 8 | argv[0][1])
9617 {
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;
9636
9637 default:
9638 fatal_error (input_location,
9639 "unknown operator %qs in %%:version-compare", argv[0]);
9640 }
9641 if (! result)
9642 return NULL;
9643
9644 return argv[nargs + 2];
9645 }
9646
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. */
9651
9652 static const char *
9653 include_spec_function (int argc, const char **argv)
9654 {
9655 char *file;
9656
9657 if (argc != 1)
9658 abort ();
9659
9660 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
9661 read_specs (file ? file : argv[0], false, false);
9662
9663 return NULL;
9664 }
9665
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)
9671 {
9672 const char *file;
9673
9674 if (argc != 1)
9675 abort ();
9676
9677 file = find_file (argv[0]);
9678 return file;
9679 }
9680
9681
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)
9687 {
9688 const char *option;
9689
9690 if (argc != 0)
9691 abort ();
9692
9693 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
9694 return option;
9695 }
9696
9697
9698 /* %:print-asm-header spec function. Print a banner to say that the
9699 following output is from the assembler. */
9700
9701 static const char *
9702 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
9703 const char **argv ATTRIBUTE_UNUSED)
9704 {
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;
9709 }
9710
9711 /* Get a random number for -frandom-seed */
9712
9713 static unsigned HOST_WIDE_INT
9714 get_random_number (void)
9715 {
9716 unsigned HOST_WIDE_INT ret = 0;
9717 int fd;
9718
9719 fd = open ("/dev/urandom", O_RDONLY);
9720 if (fd >= 0)
9721 {
9722 read (fd, &ret, sizeof (HOST_WIDE_INT));
9723 close (fd);
9724 if (ret)
9725 return ret;
9726 }
9727
9728 /* Get some more or less random data. */
9729 #ifdef HAVE_GETTIMEOFDAY
9730 {
9731 struct timeval tv;
9732
9733 gettimeofday (&tv, NULL);
9734 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
9735 }
9736 #else
9737 {
9738 time_t now = time (NULL);
9739
9740 if (now != (time_t)-1)
9741 ret = (unsigned) now;
9742 }
9743 #endif
9744
9745 return ret ^ getpid ();
9746 }
9747
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. */
9751
9752 static const char *
9753 compare_debug_dump_opt_spec_function (int arg,
9754 const char **argv ATTRIBUTE_UNUSED)
9755 {
9756 char *ret;
9757 char *name;
9758 int which;
9759 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
9760
9761 if (arg != 0)
9762 fatal_error (input_location,
9763 "too many arguments to %%:compare-debug-dump-opt");
9764
9765 do_spec_2 ("%{fdump-final-insns=*:%*}", NULL);
9766 do_spec_1 (" ", 0, NULL);
9767
9768 if (argbuf.length () > 0
9769 && strcmp (argv[argbuf.length () - 1], "."))
9770 {
9771 if (!compare_debug)
9772 return NULL;
9773
9774 name = xstrdup (argv[argbuf.length () - 1]);
9775 ret = NULL;
9776 }
9777 else
9778 {
9779 const char *ext = NULL;
9780
9781 if (argbuf.length () > 0)
9782 {
9783 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}", NULL);
9784 ext = ".gkd";
9785 }
9786 else if (!compare_debug)
9787 return NULL;
9788 else
9789 do_spec_2 ("%g.gkd", NULL);
9790
9791 do_spec_1 (" ", 0, NULL);
9792
9793 gcc_assert (argbuf.length () > 0);
9794
9795 name = concat (argbuf.last (), ext, NULL);
9796
9797 ret = concat ("-fdump-final-insns=", name, NULL);
9798 }
9799
9800 which = compare_debug < 0;
9801 debug_check_temp_file[which] = name;
9802
9803 if (!which)
9804 {
9805 unsigned HOST_WIDE_INT value = get_random_number ();
9806
9807 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
9808 }
9809
9810 if (*random_seed)
9811 {
9812 char *tmp = ret;
9813 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
9814 ret, NULL);
9815 free (tmp);
9816 }
9817
9818 if (which)
9819 *random_seed = 0;
9820
9821 return ret;
9822 }
9823
9824 static const char *debug_auxbase_opt;
9825
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. */
9829
9830 static const char *
9831 compare_debug_self_opt_spec_function (int arg,
9832 const char **argv ATTRIBUTE_UNUSED)
9833 {
9834 if (arg != 0)
9835 fatal_error (input_location,
9836 "too many arguments to %%:compare-debug-self-opt");
9837
9838 if (compare_debug >= 0)
9839 return NULL;
9840
9841 do_spec_2 ("%{c|S:%{o*:%*}}", NULL);
9842 do_spec_1 (" ", 0, NULL);
9843
9844 if (argbuf.length () > 0)
9845 debug_auxbase_opt = concat ("-auxbase-strip ",
9846 argbuf.last (),
9847 NULL);
9848 else
9849 debug_auxbase_opt = NULL;
9850
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);
9856 }
9857
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. */
9862
9863 static const char *
9864 compare_debug_auxbase_opt_spec_function (int arg,
9865 const char **argv)
9866 {
9867 char *name;
9868 int len;
9869
9870 if (arg == 0)
9871 fatal_error (input_location,
9872 "too few arguments to %%:compare-debug-auxbase-opt");
9873
9874 if (arg != 1)
9875 fatal_error (input_location,
9876 "too many arguments to %%:compare-debug-auxbase-opt");
9877
9878 if (compare_debug >= 0)
9879 return NULL;
9880
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%>");
9885
9886 if (debug_auxbase_opt)
9887 return debug_auxbase_opt;
9888
9889 #define OPT "-auxbase "
9890
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';
9896
9897 #undef OPT
9898
9899 return name;
9900 }
9901
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. */
9906
9907 const char *
9908 pass_through_libs_spec_func (int argc, const char **argv)
9909 {
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++)
9916 {
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')
9922 {
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);
9933 }
9934 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
9935 {
9936 prepended = concat (prepended, "-plugin-opt=-pass-through=",
9937 argv[n], " ", NULL);
9938 }
9939 if (prepended != old)
9940 free (old);
9941 }
9942 return prepended;
9943 }
9944
9945 /* %:replace-extension spec function. Replaces the extension of the
9946 first argument with the second argument. */
9947
9948 const char *
9949 replace_extension_spec_func (int argc, const char **argv)
9950 {
9951 char *name;
9952 char *p;
9953 char *result;
9954 int i;
9955
9956 if (argc != 2)
9957 fatal_error (input_location, "too few arguments to %%:replace-extension");
9958
9959 name = xstrdup (argv[0]);
9960
9961 for (i = strlen (name) - 1; i >= 0; i--)
9962 if (IS_DIR_SEPARATOR (name[i]))
9963 break;
9964
9965 p = strrchr (name + i + 1, '.');
9966 if (p != NULL)
9967 *p = '\0';
9968
9969 result = concat (name, argv[1], NULL);
9970
9971 free (name);
9972 return result;
9973 }
9974
9975 /* Returns "" if ARGV[ARGC - 2] is greater than ARGV[ARGC-1].
9976 Otherwise, return NULL. */
9977
9978 static const char *
9979 greater_than_spec_func (int argc, const char **argv)
9980 {
9981 char *converted;
9982
9983 if (argc == 1)
9984 return NULL;
9985
9986 gcc_assert (argc >= 2);
9987
9988 long arg = strtol (argv[argc - 2], &converted, 10);
9989 gcc_assert (converted != argv[argc - 2]);
9990
9991 long lim = strtol (argv[argc - 1], &converted, 10);
9992 gcc_assert (converted != argv[argc - 1]);
9993
9994 if (arg > lim)
9995 return "";
9996
9997 return NULL;
9998 }
9999
10000 /* Returns "" if debug_info_level is greater than ARGV[ARGC-1].
10001 Otherwise, return NULL. */
10002
10003 static const char *
10004 debug_level_greater_than_spec_func (int argc, const char **argv)
10005 {
10006 char *converted;
10007
10008 if (argc != 1)
10009 fatal_error (input_location,
10010 "wrong number of arguments to %%:debug-level-gt");
10011
10012 long arg = strtol (argv[0], &converted, 10);
10013 gcc_assert (converted != argv[0]);
10014
10015 if (debug_info_level > arg)
10016 return "";
10017
10018 return NULL;
10019 }
10020
10021 static void
10022 path_prefix_reset (path_prefix *prefix)
10023 {
10024 struct prefix_list *iter, *next;
10025 iter = prefix->plist;
10026 while (iter)
10027 {
10028 next = iter->next;
10029 free (const_cast <char *> (iter->prefix));
10030 XDELETE (iter);
10031 iter = next;
10032 }
10033 prefix->plist = 0;
10034 prefix->max_len = 0;
10035 }
10036
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. */
10040
10041 static const char *
10042 find_fortran_preinclude_file (int argc, const char **argv)
10043 {
10044 char *result = NULL;
10045 if (argc != 3)
10046 return NULL;
10047
10048 struct path_prefix prefixes = { 0, 0, "preinclude" };
10049
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
10063
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
10068 {
10069 path = find_a_file (&prefixes, argv[1], R_OK, false);
10070 if (path != NULL)
10071 result = concat (argv[0], path, NULL);
10072 }
10073
10074 path_prefix_reset (&prefixes);
10075 return result;
10076 }
10077
10078
10079 /* Insert backslash before spaces in ORIG (usually a file path), to
10080 avoid being broken by spec parser.
10081
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.
10087
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"
10094
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.
10098
10099 Return: ORIG if no conversion needed. Otherwise a newly allocated string
10100 that was converted from ORIG. */
10101
10102 static char *
10103 convert_white_space (char *orig)
10104 {
10105 int len, number_of_space = 0;
10106
10107 for (len = 0; orig[len]; len++)
10108 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
10109
10110 if (number_of_space)
10111 {
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++)
10115 {
10116 if (orig[j] == ' ' || orig[j] == '\t')
10117 new_spec[k++] = '\\';
10118 new_spec[k] = orig[j];
10119 }
10120 free (orig);
10121 return new_spec;
10122 }
10123 else
10124 return orig;
10125 }
10126
10127 /* Restore all state within gcc.c to the initial state, so that the driver
10128 code can be safely re-run in-process.
10129
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.
10133
10134 For other variables, we directly restore them all to their initial
10135 values (often implicitly 0).
10136
10137 Free the various obstacks in this file, along with "opts_obstack"
10138 from opts.c.
10139
10140 This function also restores any environment variables that were changed. */
10141
10142 void
10143 driver::finalize ()
10144 {
10145 env.restore ();
10146 diagnostic_finish (global_dc);
10147
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;
10165
10166 obstack_free (&obstack, NULL);
10167 obstack_free (&opts_obstack, NULL); /* in opts.c */
10168 obstack_free (&collect_obstack, NULL);
10169
10170 link_command_spec = LINK_COMMAND_SPEC;
10171
10172 obstack_free (&multilib_obstack, NULL);
10173
10174 user_specs_head = NULL;
10175 user_specs_tail = NULL;
10176
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++)
10181 {
10182 free (const_cast <char *> (compilers[i].suffix));
10183 free (const_cast <char *> (compilers[i].spec));
10184 }
10185 XDELETEVEC (compilers);
10186 compilers = NULL;
10187 n_compilers = 0;
10188
10189 linker_options.truncate (0);
10190 assembler_options.truncate (0);
10191 preprocessor_options.truncate (0);
10192
10193 path_prefix_reset (&exec_prefixes);
10194 path_prefix_reset (&startfile_prefixes);
10195 path_prefix_reset (&include_prefixes);
10196
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;
10207
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)
10212 {
10213 while (specs != static_specs)
10214 {
10215 spec_list *next = specs->next;
10216 free (const_cast <char *> (specs->name));
10217 XDELETE (specs);
10218 specs = next;
10219 }
10220 specs = 0;
10221 }
10222 for (unsigned i = 0; i < ARRAY_SIZE (static_specs); i++)
10223 {
10224 spec_list *sl = &static_specs[i];
10225 if (sl->alloc_p)
10226 {
10227 if (0)
10228 free (const_cast <char *> (*(sl->ptr_spec)));
10229 sl->alloc_p = false;
10230 }
10231 *(sl->ptr_spec) = sl->default_ptr;
10232 }
10233 #ifdef EXTRA_SPECS
10234 extra_specs = NULL;
10235 #endif
10236
10237 processing_spec_function = 0;
10238
10239 clear_args ();
10240
10241 have_c = 0;
10242 have_o = 0;
10243
10244 temp_names = NULL;
10245 execution_count = 0;
10246 signal_count = 0;
10247
10248 temp_filename = NULL;
10249 temp_filename_length = 0;
10250 always_delete_queue = NULL;
10251 failure_delete_queue = NULL;
10252
10253 XDELETEVEC (switches);
10254 switches = NULL;
10255 n_switches = 0;
10256 n_switches_alloc = 0;
10257
10258 compare_debug = 0;
10259 compare_debug_second = 0;
10260 compare_debug_opt = NULL;
10261 for (int i = 0; i < 2; i++)
10262 {
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;
10267 }
10268
10269 XDELETEVEC (infiles);
10270 infiles = NULL;
10271 n_infiles = 0;
10272 n_infiles_alloc = 0;
10273
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;
10297
10298 mdswitches = NULL;
10299 n_mdswitches = 0;
10300
10301 debug_auxbase_opt = NULL;
10302
10303 used_arg.finalize ();
10304 }
10305
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.
10310
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. */
10315
10316 void
10317 driver_get_configure_time_options (void (*cb) (const char *option,
10318 void *user_data),
10319 void *user_data)
10320 {
10321 size_t i;
10322
10323 obstack_init (&obstack);
10324 init_opts_obstack ();
10325 n_switches = 0;
10326
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);
10330
10331 for (i = 0; (int) i < n_switches; i++)
10332 {
10333 gcc_assert (switches[i].part1);
10334 (*cb) (switches[i].part1, user_data);
10335 }
10336
10337 obstack_free (&opts_obstack, NULL);
10338 obstack_free (&obstack, NULL);
10339 n_switches = 0;
10340 }