* xvasprintf.c: New file.
[official-gcc.git] / gcc / gcc.c
bloba5408a48e5a8d41663f29a8724cba2f30ebe724a
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This program is the user interface to the C compiler and possibly to
21 other compilers. It is used because compilation is a complicated procedure
22 which involves running several programs and passing temporary files between
23 them, forwarding the users switches to those programs selectively,
24 and deleting the temporary files at the end.
26 CC recognizes how to compile each input file by suffixes in the file names.
27 Once it knows which kind of compilation to perform, the procedure for
28 compilation is specified by a string called a "spec". */
30 #include "config.h"
31 #include "system.h"
32 #include "coretypes.h"
33 #include "multilib.h" /* before tm.h */
34 #include "tm.h"
35 #include "xregex.h"
36 #include "obstack.h"
37 #include "intl.h"
38 #include "prefix.h"
39 #include "gcc.h"
40 #include "diagnostic.h"
41 #include "flags.h"
42 #include "opts.h"
43 #include "params.h"
44 #include "vec.h"
45 #include "filenames.h"
47 /* By default there is no special suffix for target executables. */
48 /* FIXME: when autoconf is fixed, remove the host check - dj */
49 #if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
50 #define HAVE_TARGET_EXECUTABLE_SUFFIX
51 #endif
53 /* By default there is no special suffix for host executables. */
54 #ifdef HOST_EXECUTABLE_SUFFIX
55 #define HAVE_HOST_EXECUTABLE_SUFFIX
56 #else
57 #define HOST_EXECUTABLE_SUFFIX ""
58 #endif
60 /* By default, the suffix for target object files is ".o". */
61 #ifdef TARGET_OBJECT_SUFFIX
62 #define HAVE_TARGET_OBJECT_SUFFIX
63 #else
64 #define TARGET_OBJECT_SUFFIX ".o"
65 #endif
67 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
69 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
70 #ifndef LIBRARY_PATH_ENV
71 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
72 #endif
74 /* If a stage of compilation returns an exit status >= 1,
75 compilation of that file ceases. */
77 #define MIN_FATAL_STATUS 1
79 /* Flag set by cppspec.c to 1. */
80 int is_cpp_driver;
82 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
83 static bool at_file_supplied;
85 /* Definition of string containing the arguments given to configure. */
86 #include "configargs.h"
88 /* Flag saying to print the command line options understood by gcc and its
89 sub-processes. */
91 static int print_help_list;
93 /* Flag saying to print the version of gcc and its sub-processes. */
95 static int print_version;
97 /* Flag indicating whether we should ONLY print the command and
98 arguments (like verbose_flag) without executing the command.
99 Displayed arguments are quoted so that the generated command
100 line is suitable for execution. This is intended for use in
101 shell scripts to capture the driver-generated command line. */
102 static int verbose_only_flag;
104 /* Flag indicating how to print command line options of sub-processes. */
106 static int print_subprocess_help;
108 /* Linker suffix passed to -fuse-ld=... */
109 static const char *use_ld;
111 /* Whether we should report subprocess execution times to a file. */
113 FILE *report_times_to_file = NULL;
115 /* Nonzero means place this string before uses of /, so that include
116 and library files can be found in an alternate location. */
118 #ifdef TARGET_SYSTEM_ROOT
119 static const char *target_system_root = TARGET_SYSTEM_ROOT;
120 #else
121 static const char *target_system_root = 0;
122 #endif
124 /* Nonzero means pass the updated target_system_root to the compiler. */
126 static int target_system_root_changed;
128 /* Nonzero means append this string to target_system_root. */
130 static const char *target_sysroot_suffix = 0;
132 /* Nonzero means append this string to target_system_root for headers. */
134 static const char *target_sysroot_hdrs_suffix = 0;
136 /* Nonzero means write "temp" files in source directory
137 and use the source file's name in them, and don't delete them. */
139 static enum save_temps {
140 SAVE_TEMPS_NONE, /* no -save-temps */
141 SAVE_TEMPS_CWD, /* -save-temps in current directory */
142 SAVE_TEMPS_OBJ /* -save-temps in object directory */
143 } save_temps_flag;
145 /* Output file to use to get the object directory for -save-temps=obj */
146 static char *save_temps_prefix = 0;
147 static size_t save_temps_length = 0;
149 /* The compiler version. */
151 static const char *compiler_version;
153 /* The target version. */
155 static const char *const spec_version = DEFAULT_TARGET_VERSION;
157 /* The target machine. */
159 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
160 static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE;
162 /* List of offload targets. */
164 static char *offload_targets = NULL;
166 /* Nonzero if cross-compiling.
167 When -b is used, the value comes from the `specs' file. */
169 #ifdef CROSS_DIRECTORY_STRUCTURE
170 static const char *cross_compile = "1";
171 #else
172 static const char *cross_compile = "0";
173 #endif
175 /* Greatest exit code of sub-processes that has been encountered up to
176 now. */
177 static int greatest_status = 1;
179 /* This is the obstack which we use to allocate many strings. */
181 static struct obstack obstack;
183 /* This is the obstack to build an environment variable to pass to
184 collect2 that describes all of the relevant switches of what to
185 pass the compiler in building the list of pointers to constructors
186 and destructors. */
188 static struct obstack collect_obstack;
190 /* Forward declaration for prototypes. */
191 struct path_prefix;
192 struct prefix_list;
194 static void init_spec (void);
195 static void store_arg (const char *, int, int);
196 static void insert_wrapper (const char *);
197 static char *load_specs (const char *);
198 static void read_specs (const char *, bool, bool);
199 static void set_spec (const char *, const char *, bool);
200 static struct compiler *lookup_compiler (const char *, size_t, const char *);
201 static char *build_search_list (const struct path_prefix *, const char *,
202 bool, bool);
203 static void xputenv (const char *);
204 static void putenv_from_prefixes (const struct path_prefix *, const char *,
205 bool);
206 static int access_check (const char *, int);
207 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
208 static void add_prefix (struct path_prefix *, const char *, const char *,
209 int, int, int);
210 static void add_sysrooted_prefix (struct path_prefix *, const char *,
211 const char *, int, int, int);
212 static char *skip_whitespace (char *);
213 static void delete_if_ordinary (const char *);
214 static void delete_temp_files (void);
215 static void delete_failure_queue (void);
216 static void clear_failure_queue (void);
217 static int check_live_switch (int, int);
218 static const char *handle_braces (const char *);
219 static inline bool input_suffix_matches (const char *, const char *);
220 static inline bool switch_matches (const char *, const char *, int);
221 static inline void mark_matching_switches (const char *, const char *, int);
222 static inline void process_marked_switches (void);
223 static const char *process_brace_body (const char *, const char *, const char *, int, int);
224 static const struct spec_function *lookup_spec_function (const char *);
225 static const char *eval_spec_function (const char *, const char *);
226 static const char *handle_spec_function (const char *, bool *);
227 static char *save_string (const char *, int);
228 static void set_collect_gcc_options (void);
229 static int do_spec_1 (const char *, int, const char *);
230 static int do_spec_2 (const char *);
231 static void do_option_spec (const char *, const char *);
232 static void do_self_spec (const char *);
233 static const char *find_file (const char *);
234 static int is_directory (const char *, bool);
235 static const char *validate_switches (const char *, bool);
236 static void validate_all_switches (void);
237 static inline void validate_switches_from_spec (const char *, bool);
238 static void give_switch (int, int);
239 static int used_arg (const char *, int);
240 static int default_arg (const char *, int);
241 static void set_multilib_dir (void);
242 static void print_multilib_info (void);
243 static void perror_with_name (const char *);
244 static void display_help (void);
245 static void add_preprocessor_option (const char *, int);
246 static void add_assembler_option (const char *, int);
247 static void add_linker_option (const char *, int);
248 static void process_command (unsigned int, struct cl_decoded_option *);
249 static int execute (void);
250 static void alloc_args (void);
251 static void clear_args (void);
252 static void fatal_signal (int);
253 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
254 static void init_gcc_specs (struct obstack *, const char *, const char *,
255 const char *);
256 #endif
257 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
258 static const char *convert_filename (const char *, int, int);
259 #endif
261 static void try_generate_repro (const char **argv);
262 static const char *getenv_spec_function (int, const char **);
263 static const char *if_exists_spec_function (int, const char **);
264 static const char *if_exists_else_spec_function (int, const char **);
265 static const char *sanitize_spec_function (int, const char **);
266 static const char *replace_outfile_spec_function (int, const char **);
267 static const char *remove_outfile_spec_function (int, const char **);
268 static const char *version_compare_spec_function (int, const char **);
269 static const char *include_spec_function (int, const char **);
270 static const char *find_file_spec_function (int, const char **);
271 static const char *find_plugindir_spec_function (int, const char **);
272 static const char *print_asm_header_spec_function (int, const char **);
273 static const char *compare_debug_dump_opt_spec_function (int, const char **);
274 static const char *compare_debug_self_opt_spec_function (int, const char **);
275 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
276 static const char *pass_through_libs_spec_func (int, const char **);
277 static const char *replace_extension_spec_func (int, const char **);
278 static char *convert_white_space (char *);
280 /* The Specs Language
282 Specs are strings containing lines, each of which (if not blank)
283 is made up of a program name, and arguments separated by spaces.
284 The program name must be exact and start from root, since no path
285 is searched and it is unreliable to depend on the current working directory.
286 Redirection of input or output is not supported; the subprograms must
287 accept filenames saying what files to read and write.
289 In addition, the specs can contain %-sequences to substitute variable text
290 or for conditional text. Here is a table of all defined %-sequences.
291 Note that spaces are not generated automatically around the results of
292 expanding these sequences; therefore, you can concatenate them together
293 or with constant text in a single argument.
295 %% substitute one % into the program name or argument.
296 %i substitute the name of the input file being processed.
297 %b substitute the basename of the input file being processed.
298 This is the substring up to (and not including) the last period
299 and not including the directory unless -save-temps was specified
300 to put temporaries in a different location.
301 %B same as %b, but include the file suffix (text after the last period).
302 %gSUFFIX
303 substitute a file name that has suffix SUFFIX and is chosen
304 once per compilation, and mark the argument a la %d. To reduce
305 exposure to denial-of-service attacks, the file name is now
306 chosen in a way that is hard to predict even when previously
307 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
308 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
309 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
310 had been pre-processed. Previously, %g was simply substituted
311 with a file name chosen once per compilation, without regard
312 to any appended suffix (which was therefore treated just like
313 ordinary text), making such attacks more likely to succeed.
314 %|SUFFIX
315 like %g, but if -pipe is in effect, expands simply to "-".
316 %mSUFFIX
317 like %g, but if -pipe is in effect, expands to nothing. (We have both
318 %| and %m to accommodate differences between system assemblers; see
319 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
320 %uSUFFIX
321 like %g, but generates a new temporary file name even if %uSUFFIX
322 was already seen.
323 %USUFFIX
324 substitutes the last file name generated with %uSUFFIX, generating a
325 new one if there is no such last file name. In the absence of any
326 %uSUFFIX, this is just like %gSUFFIX, except they don't share
327 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
328 would involve the generation of two distinct file names, one
329 for each `%g.s' and another for each `%U.s'. Previously, %U was
330 simply substituted with a file name chosen for the previous %u,
331 without regard to any appended suffix.
332 %jSUFFIX
333 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
334 writable, and if save-temps is off; otherwise, substitute the name
335 of a temporary file, just like %u. This temporary file is not
336 meant for communication between processes, but rather as a junk
337 disposal mechanism.
338 %.SUFFIX
339 substitutes .SUFFIX for the suffixes of a matched switch's args when
340 it is subsequently output with %*. SUFFIX is terminated by the next
341 space or %.
342 %d marks the argument containing or following the %d as a
343 temporary file name, so that that file will be deleted if GCC exits
344 successfully. Unlike %g, this contributes no text to the argument.
345 %w marks the argument containing or following the %w as the
346 "output file" of this compilation. This puts the argument
347 into the sequence of arguments that %o will substitute later.
348 %V indicates that this compilation produces no "output file".
349 %W{...}
350 like %{...} but mark last argument supplied within
351 as a file to be deleted on failure.
352 %o substitutes the names of all the output files, with spaces
353 automatically placed around them. You should write spaces
354 around the %o as well or the results are undefined.
355 %o is for use in the specs for running the linker.
356 Input files whose names have no recognized suffix are not compiled
357 at all, but they are included among the output files, so they will
358 be linked.
359 %O substitutes the suffix for object files. Note that this is
360 handled specially when it immediately follows %g, %u, or %U
361 (with or without a suffix argument) because of the need for
362 those to form complete file names. The handling is such that
363 %O is treated exactly as if it had already been substituted,
364 except that %g, %u, and %U do not currently support additional
365 SUFFIX characters following %O as they would following, for
366 example, `.o'.
367 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
368 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
369 and -B options) and -imultilib as necessary.
370 %s current argument is the name of a library or startup file of some sort.
371 Search for that file in a standard list of directories
372 and substitute the full name found.
373 %eSTR Print STR as an error message. STR is terminated by a newline.
374 Use this when inconsistent options are detected.
375 %nSTR Print STR as a notice. STR is terminated by a newline.
376 %x{OPTION} Accumulate an option for %X.
377 %X Output the accumulated linker options specified by compilations.
378 %Y Output the accumulated assembler options specified by compilations.
379 %Z Output the accumulated preprocessor options specified by compilations.
380 %a process ASM_SPEC as a spec.
381 This allows config.h to specify part of the spec for running as.
382 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
383 used here. This can be used to run a post-processor after the
384 assembler has done its job.
385 %D Dump out a -L option for each directory in startfile_prefixes.
386 If multilib_dir is set, extra entries are generated with it affixed.
387 %l process LINK_SPEC as a spec.
388 %L process LIB_SPEC as a spec.
389 %M Output multilib_os_dir.
390 %G process LIBGCC_SPEC as a spec.
391 %R Output the concatenation of target_system_root and
392 target_sysroot_suffix.
393 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
394 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
395 %C process CPP_SPEC as a spec.
396 %1 process CC1_SPEC as a spec.
397 %2 process CC1PLUS_SPEC as a spec.
398 %* substitute the variable part of a matched option. (See below.)
399 Note that each comma in the substituted string is replaced by
400 a single space. A space is appended after the last substition
401 unless there is more text in current sequence.
402 %<S remove all occurrences of -S from the command line.
403 Note - this command is position dependent. % commands in the
404 spec string before this one will see -S, % commands in the
405 spec string after this one will not.
406 %>S Similar to "%<S", but keep it in the GCC command line.
407 %<S* remove all occurrences of all switches beginning with -S from the
408 command line.
409 %:function(args)
410 Call the named function FUNCTION, passing it ARGS. ARGS is
411 first processed as a nested spec string, then split into an
412 argument vector in the usual fashion. The function returns
413 a string which is processed as if it had appeared literally
414 as part of the current spec.
415 %{S} substitutes the -S switch, if that switch was given to GCC.
416 If that switch was not specified, this substitutes nothing.
417 Here S is a metasyntactic variable.
418 %{S*} substitutes all the switches specified to GCC whose names start
419 with -S. This is used for -o, -I, etc; switches that take
420 arguments. GCC considers `-o foo' as being one switch whose
421 name starts with `o'. %{o*} would substitute this text,
422 including the space; thus, two arguments would be generated.
423 %{S*&T*} likewise, but preserve order of S and T options (the order
424 of S and T in the spec is not significant). Can be any number
425 of ampersand-separated variables; for each the wild card is
426 optional. Useful for CPP as %{D*&U*&A*}.
428 %{S:X} substitutes X, if the -S switch was given to GCC.
429 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
430 %{S*:X} substitutes X if one or more switches whose names start
431 with -S was given to GCC. Normally X is substituted only
432 once, no matter how many such switches appeared. However,
433 if %* appears somewhere in X, then X will be substituted
434 once for each matching switch, with the %* replaced by the
435 part of that switch that matched the '*'. A space will be
436 appended after the last substition unless there is more
437 text in current sequence.
438 %{.S:X} substitutes X, if processing a file with suffix S.
439 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
440 %{,S:X} substitutes X, if processing a file which will use spec S.
441 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
443 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
444 combined with '!', '.', ',', and '*' as above binding stronger
445 than the OR.
446 If %* appears in X, all of the alternatives must be starred, and
447 only the first matching alternative is substituted.
448 %{%:function(args):X}
449 Call function named FUNCTION with args ARGS. If the function
450 returns non-NULL, then X is substituted, if it returns
451 NULL, it isn't substituted.
452 %{S:X; if S was given to GCC, substitutes X;
453 T:Y; else if T was given to GCC, substitutes Y;
454 :D} else substitutes D. There can be as many clauses as you need.
455 This may be combined with '.', '!', ',', '|', and '*' as above.
457 %(Spec) processes a specification defined in a specs file as *Spec:
459 The conditional text X in a %{S:X} or similar construct may contain
460 other nested % constructs or spaces, or even newlines. They are
461 processed as usual, as described above. Trailing white space in X is
462 ignored. White space may also appear anywhere on the left side of the
463 colon in these constructs, except between . or * and the corresponding
464 word.
466 The -O, -f, -g, -m, and -W switches are handled specifically in these
467 constructs. If another value of -O or the negated form of a -f, -m, or
468 -W switch is found later in the command line, the earlier switch
469 value is ignored, except with {S*} where S is just one letter; this
470 passes all matching options.
472 The character | at the beginning of the predicate text is used to indicate
473 that a command should be piped to the following command, but only if -pipe
474 is specified.
476 Note that it is built into GCC which switches take arguments and which
477 do not. You might think it would be useful to generalize this to
478 allow each compiler's spec to say which switches take arguments. But
479 this cannot be done in a consistent fashion. GCC cannot even decide
480 which input files have been specified without knowing which switches
481 take arguments, and it must know which input files to compile in order
482 to tell which compilers to run.
484 GCC also knows implicitly that arguments starting in `-l' are to be
485 treated as compiler output files, and passed to the linker in their
486 proper position among the other output files. */
488 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
490 /* config.h can define ASM_SPEC to provide extra args to the assembler
491 or extra switch-translations. */
492 #ifndef ASM_SPEC
493 #define ASM_SPEC ""
494 #endif
496 /* config.h can define ASM_FINAL_SPEC to run a post processor after
497 the assembler has run. */
498 #ifndef ASM_FINAL_SPEC
499 #define ASM_FINAL_SPEC \
500 "%{gsplit-dwarf: \n\
501 objcopy --extract-dwo \
502 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
503 %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo} \n\
504 objcopy --strip-dwo \
505 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
507 #endif
509 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
510 or extra switch-translations. */
511 #ifndef CPP_SPEC
512 #define CPP_SPEC ""
513 #endif
515 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
516 or extra switch-translations. */
517 #ifndef CC1_SPEC
518 #define CC1_SPEC ""
519 #endif
521 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
522 or extra switch-translations. */
523 #ifndef CC1PLUS_SPEC
524 #define CC1PLUS_SPEC ""
525 #endif
527 /* config.h can define LINK_SPEC to provide extra args to the linker
528 or extra switch-translations. */
529 #ifndef LINK_SPEC
530 #define LINK_SPEC ""
531 #endif
533 /* config.h can define LIB_SPEC to override the default libraries. */
534 #ifndef LIB_SPEC
535 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
536 #endif
538 /* When using -fsplit-stack we need to wrap pthread_create, in order
539 to initialize the stack guard. We always use wrapping, rather than
540 shared library ordering, and we keep the wrapper function in
541 libgcc. This is not yet a real spec, though it could become one;
542 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
543 only works with GNU ld and gold. */
544 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
546 #ifndef LIBASAN_SPEC
547 #define STATIC_LIBASAN_LIBS \
548 " %{static-libasan:%:include(libsanitizer.spec)%(link_libasan)}"
549 #ifdef LIBASAN_EARLY_SPEC
550 #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
551 #elif defined(HAVE_LD_STATIC_DYNAMIC)
552 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
553 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
554 STATIC_LIBASAN_LIBS
555 #else
556 #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
557 #endif
558 #endif
560 #ifndef LIBASAN_EARLY_SPEC
561 #define LIBASAN_EARLY_SPEC ""
562 #endif
564 #ifndef LIBTSAN_SPEC
565 #define STATIC_LIBTSAN_LIBS \
566 " %{static-libtsan:%:include(libsanitizer.spec)%(link_libtsan)}"
567 #ifdef LIBTSAN_EARLY_SPEC
568 #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
569 #elif defined(HAVE_LD_STATIC_DYNAMIC)
570 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
571 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
572 STATIC_LIBTSAN_LIBS
573 #else
574 #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
575 #endif
576 #endif
578 #ifndef LIBTSAN_EARLY_SPEC
579 #define LIBTSAN_EARLY_SPEC ""
580 #endif
582 #ifndef LIBLSAN_SPEC
583 #define STATIC_LIBLSAN_LIBS \
584 " %{static-liblsan:%:include(libsanitizer.spec)%(link_liblsan)}"
585 #ifdef LIBLSAN_EARLY_SPEC
586 #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
587 #elif defined(HAVE_LD_STATIC_DYNAMIC)
588 #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION \
589 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
590 STATIC_LIBLSAN_LIBS
591 #else
592 #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
593 #endif
594 #endif
596 #ifndef LIBLSAN_EARLY_SPEC
597 #define LIBLSAN_EARLY_SPEC ""
598 #endif
600 #ifndef LIBUBSAN_SPEC
601 #define STATIC_LIBUBSAN_LIBS \
602 " %{static-libubsan:%:include(libsanitizer.spec)%(link_libubsan)}"
603 #ifdef HAVE_LD_STATIC_DYNAMIC
604 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
605 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
606 STATIC_LIBUBSAN_LIBS
607 #else
608 #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
609 #endif
610 #endif
612 /* Linker options for compressed debug sections. */
613 #if HAVE_LD_COMPRESS_DEBUG == 0
614 /* No linker support. */
615 #define LINK_COMPRESS_DEBUG_SPEC \
616 " %{gz*:%e-gz is not supported in this configuration} "
617 #elif HAVE_LD_COMPRESS_DEBUG == 1
618 /* GNU style on input, GNU ld options. Reject, not useful. */
619 #define LINK_COMPRESS_DEBUG_SPEC \
620 " %{gz*:%e-gz is not supported in this configuration} "
621 #elif HAVE_LD_COMPRESS_DEBUG == 2
622 /* GNU style, GNU gold options. */
623 #define LINK_COMPRESS_DEBUG_SPEC \
624 " %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
625 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
626 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
627 #elif HAVE_LD_COMPRESS_DEBUG == 3
628 /* ELF gABI style. */
629 #define LINK_COMPRESS_DEBUG_SPEC \
630 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \
631 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \
632 " %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
633 #else
634 #error Unknown value for HAVE_LD_COMPRESS_DEBUG.
635 #endif
637 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
638 included. */
639 #ifndef LIBGCC_SPEC
640 #if defined(REAL_LIBGCC_SPEC)
641 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
642 #elif defined(LINK_LIBGCC_SPECIAL_1)
643 /* Have gcc do the search for libgcc.a. */
644 #define LIBGCC_SPEC "libgcc.a%s"
645 #else
646 #define LIBGCC_SPEC "-lgcc"
647 #endif
648 #endif
650 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
651 #ifndef STARTFILE_SPEC
652 #define STARTFILE_SPEC \
653 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
654 #endif
656 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
657 #ifndef ENDFILE_SPEC
658 #define ENDFILE_SPEC ""
659 #endif
661 #ifndef LINKER_NAME
662 #define LINKER_NAME "collect2"
663 #endif
665 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
666 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
667 #else
668 #define ASM_MAP ""
669 #endif
671 /* Assembler options for compressed debug sections. */
672 #if HAVE_LD_COMPRESS_DEBUG < 2
673 /* Reject if the linker cannot write compressed debug sections. */
674 #define ASM_COMPRESS_DEBUG_SPEC \
675 " %{gz*:%e-gz is not supported in this configuration} "
676 #else /* HAVE_LD_COMPRESS_DEBUG >= 2 */
677 #if HAVE_AS_COMPRESS_DEBUG == 0
678 /* No assembler support. Ignore silently. */
679 #define ASM_COMPRESS_DEBUG_SPEC \
680 " %{gz*:} "
681 #elif HAVE_AS_COMPRESS_DEBUG == 1
682 /* GNU style, GNU as options. */
683 #define ASM_COMPRESS_DEBUG_SPEC \
684 " %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "}" \
685 " %{gz=none:" AS_NO_COMPRESS_DEBUG_OPTION "}" \
686 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
687 #elif HAVE_AS_COMPRESS_DEBUG == 2
688 /* ELF gABI style. */
689 #define ASM_COMPRESS_DEBUG_SPEC \
690 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \
691 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \
692 " %{gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "=zlib-gnu} "
693 #else
694 #error Unknown value for HAVE_AS_COMPRESS_DEBUG.
695 #endif
696 #endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */
698 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
699 to the assembler. */
700 #ifndef ASM_DEBUG_SPEC
701 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
702 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
703 # define ASM_DEBUG_SPEC \
704 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
705 ? "%{!g0:%{gdwarf*:--gdwarf2}%{!gdwarf*:%{g*:--gstabs}}}" ASM_MAP \
706 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
707 # else
708 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
709 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
710 # endif
711 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
712 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
713 # endif
714 # endif
715 #endif
716 #ifndef ASM_DEBUG_SPEC
717 # define ASM_DEBUG_SPEC ""
718 #endif
720 /* Here is the spec for running the linker, after compiling all files. */
722 /* This is overridable by the target in case they need to specify the
723 -lgcc and -lc order specially, yet not require them to override all
724 of LINK_COMMAND_SPEC. */
725 #ifndef LINK_GCC_C_SEQUENCE_SPEC
726 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
727 #endif
729 #ifndef LINK_SSP_SPEC
730 #ifdef TARGET_LIBC_PROVIDES_SSP
731 #define LINK_SSP_SPEC "%{fstack-protector:}"
732 #else
733 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-strong|fstack-protector-all:-lssp_nonshared -lssp}"
734 #endif
735 #endif
737 #ifndef LINK_PIE_SPEC
738 #ifdef HAVE_LD_PIE
739 #define LINK_PIE_SPEC "%{pie:-pie} "
740 #else
741 #define LINK_PIE_SPEC "%{pie:} "
742 #endif
743 #endif
745 #ifndef LINK_BUILDID_SPEC
746 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
747 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
748 # endif
749 #endif
751 /* Conditional to test whether the LTO plugin is used or not.
752 FIXME: For slim LTO we will need to enable plugin unconditionally. This
753 still cause problems with PLUGIN_LD != LD and when plugin is built but
754 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
755 plugin only when LTO is enabled. We still honor explicit
756 -fuse-linker-plugin if the linker used understands -plugin. */
758 /* The linker has some plugin support. */
759 #if HAVE_LTO_PLUGIN > 0
760 /* The linker used has full plugin support, use LTO plugin by default. */
761 #if HAVE_LTO_PLUGIN == 2
762 #define PLUGIN_COND "!fno-use-linker-plugin:%{!fno-lto"
763 #define PLUGIN_COND_CLOSE "}"
764 #else
765 /* The linker used has limited plugin support, use LTO plugin with explicit
766 -fuse-linker-plugin. */
767 #define PLUGIN_COND "fuse-linker-plugin"
768 #define PLUGIN_COND_CLOSE ""
769 #endif
770 #define LINK_PLUGIN_SPEC \
771 "%{"PLUGIN_COND": \
772 -plugin %(linker_plugin_file) \
773 -plugin-opt=%(lto_wrapper) \
774 -plugin-opt=-fresolution=%u.res \
775 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
776 }"PLUGIN_COND_CLOSE
777 #else
778 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
779 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
780 %e-fuse-linker-plugin is not supported in this configuration}"
781 #endif
783 /* Linker command line options for -fsanitize= early on the command line. */
784 #ifndef SANITIZER_EARLY_SPEC
785 #define SANITIZER_EARLY_SPEC "\
786 %{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
787 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
788 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC "}}}"
789 #endif
791 /* Linker command line options for -fsanitize= late on the command line. */
792 #ifndef SANITIZER_SPEC
793 #define SANITIZER_SPEC "\
794 %{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
795 %{static:%ecannot specify -static with -fsanitize=address}}\
796 %{%:sanitize(thread):" LIBTSAN_SPEC "\
797 %{static:%ecannot specify -static with -fsanitize=thread}}\
798 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}\
799 %{%:sanitize(leak):" LIBLSAN_SPEC "}}}"
800 #endif
802 /* This is the spec to use, once the code for creating the vtable
803 verification runtime library, libvtv.so, has been created. Currently
804 the vtable verification runtime functions are in libstdc++, so we use
805 the spec just below this one. */
806 #ifndef VTABLE_VERIFICATION_SPEC
807 #define VTABLE_VERIFICATION_SPEC "\
808 %{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
809 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}"
810 #endif
812 /* -u* was put back because both BSD and SysV seem to support it. */
813 /* %{static:} simply prevents an error message if the target machine
814 doesn't handle -static. */
815 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
816 scripts which exist in user specified directories, or in standard
817 directories. */
818 /* We pass any -flto flags on to the linker, which is expected
819 to understand them. In practice, this means it had better be collect2. */
820 /* %{e*} includes -export-dynamic; see comment in common.opt. */
821 #ifndef LINK_COMMAND_SPEC
822 #define LINK_COMMAND_SPEC "\
823 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
824 %(linker) " \
825 LINK_PLUGIN_SPEC \
826 "%{flto|flto=*:%<fcompare-debug*} \
827 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
828 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
829 "%X %{o*} %{e*} %{N} %{n} %{r}\
830 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
831 %{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
832 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
833 %{fcilkplus:%:include(libcilkrts.spec)%(link_cilkrts)}\
834 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
835 %(mflib) " STACK_SPLIT_SPEC "\
836 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
837 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
838 %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}"
839 #endif
841 #ifndef LINK_LIBGCC_SPEC
842 /* Generate -L options for startfile prefix list. */
843 # define LINK_LIBGCC_SPEC "%D"
844 #endif
846 #ifndef STARTFILE_PREFIX_SPEC
847 # define STARTFILE_PREFIX_SPEC ""
848 #endif
850 #ifndef SYSROOT_SPEC
851 # define SYSROOT_SPEC "--sysroot=%R"
852 #endif
854 #ifndef SYSROOT_SUFFIX_SPEC
855 # define SYSROOT_SUFFIX_SPEC ""
856 #endif
858 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
859 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
860 #endif
862 static const char *asm_debug = ASM_DEBUG_SPEC;
863 static const char *cpp_spec = CPP_SPEC;
864 static const char *cc1_spec = CC1_SPEC;
865 static const char *cc1plus_spec = CC1PLUS_SPEC;
866 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
867 static const char *link_ssp_spec = LINK_SSP_SPEC;
868 static const char *asm_spec = ASM_SPEC;
869 static const char *asm_final_spec = ASM_FINAL_SPEC;
870 static const char *link_spec = LINK_SPEC;
871 static const char *lib_spec = LIB_SPEC;
872 static const char *link_gomp_spec = "";
873 static const char *libgcc_spec = LIBGCC_SPEC;
874 static const char *endfile_spec = ENDFILE_SPEC;
875 static const char *startfile_spec = STARTFILE_SPEC;
876 static const char *linker_name_spec = LINKER_NAME;
877 static const char *linker_plugin_file_spec = "";
878 static const char *lto_wrapper_spec = "";
879 static const char *lto_gcc_spec = "";
880 static const char *link_command_spec = LINK_COMMAND_SPEC;
881 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
882 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
883 static const char *sysroot_spec = SYSROOT_SPEC;
884 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
885 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
886 static const char *self_spec = "";
888 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
889 There should be no need to override these in target dependent files,
890 but we need to copy them to the specs file so that newer versions
891 of the GCC driver can correctly drive older tool chains with the
892 appropriate -B options. */
894 /* When cpplib handles traditional preprocessing, get rid of this, and
895 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
896 that we default the front end language better. */
897 static const char *trad_capable_cpp =
898 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
900 /* We don't wrap .d files in %W{} since a missing .d file, and
901 therefore no dependency entry, confuses make into thinking a .o
902 file that happens to exist is up-to-date. */
903 static const char *cpp_unique_options =
904 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
905 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
906 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
907 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
908 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
909 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
910 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
911 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
912 %{E|M|MM:%W{o*}}";
914 /* This contains cpp options which are common with cc1_options and are passed
915 only when preprocessing only to avoid duplication. We pass the cc1 spec
916 options to the preprocessor so that it the cc1 spec may manipulate
917 options used to set target flags. Those special target flags settings may
918 in turn cause preprocessor symbols to be defined specially. */
919 static const char *cpp_options =
920 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
921 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
922 %{undef} %{save-temps*:-fpch-preprocess}";
924 /* This contains cpp options which are not passed when the preprocessor
925 output will be used by another program. */
926 static const char *cpp_debug_options = "%{d*}";
928 /* NB: This is shared amongst all front-ends, except for Ada. */
929 static const char *cc1_options =
930 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
931 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
932 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
933 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
934 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
935 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
936 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
937 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
938 %{-target-help:--target-help}\
939 %{-version:--version}\
940 %{-help=*:--help=%*}\
941 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
942 %{fsyntax-only:-o %j} %{-param*}\
943 %{coverage:-fprofile-arcs -ftest-coverage}";
945 static const char *asm_options =
946 "%{-target-help:%:print-asm-header()} "
947 #if HAVE_GNU_AS
948 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
949 to the assembler equivalents. */
950 "%{v} %{w:-W} %{I*} "
951 #endif
952 ASM_COMPRESS_DEBUG_SPEC
953 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
955 static const char *invoke_as =
956 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
957 "%{!fwpa*:\
958 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
959 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
961 #else
962 "%{!fwpa*:\
963 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
964 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
966 #endif
968 /* Some compilers have limits on line lengths, and the multilib_select
969 and/or multilib_matches strings can be very long, so we build them at
970 run time. */
971 static struct obstack multilib_obstack;
972 static const char *multilib_select;
973 static const char *multilib_matches;
974 static const char *multilib_defaults;
975 static const char *multilib_exclusions;
976 static const char *multilib_reuse;
978 /* Check whether a particular argument is a default argument. */
980 #ifndef MULTILIB_DEFAULTS
981 #define MULTILIB_DEFAULTS { "" }
982 #endif
984 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
986 #ifndef DRIVER_SELF_SPECS
987 #define DRIVER_SELF_SPECS ""
988 #endif
990 /* Linking to libgomp implies pthreads. This is particularly important
991 for targets that use different start files and suchlike. */
992 #ifndef GOMP_SELF_SPECS
993 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
994 #endif
996 /* Likewise for -fgnu-tm. */
997 #ifndef GTM_SELF_SPECS
998 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
999 #endif
1001 /* Likewise for -fcilkplus. */
1002 #ifndef CILK_SELF_SPECS
1003 #define CILK_SELF_SPECS "%{fcilkplus: -pthread}"
1004 #endif
1006 static const char *const driver_self_specs[] = {
1007 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1008 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS,
1009 CILK_SELF_SPECS
1012 #ifndef OPTION_DEFAULT_SPECS
1013 #define OPTION_DEFAULT_SPECS { "", "" }
1014 #endif
1016 struct default_spec
1018 const char *name;
1019 const char *spec;
1022 static const struct default_spec
1023 option_default_specs[] = { OPTION_DEFAULT_SPECS };
1025 struct user_specs
1027 struct user_specs *next;
1028 const char *filename;
1031 static struct user_specs *user_specs_head, *user_specs_tail;
1034 /* Record the mapping from file suffixes for compilation specs. */
1036 struct compiler
1038 const char *suffix; /* Use this compiler for input files
1039 whose names end in this suffix. */
1041 const char *spec; /* To use this compiler, run this spec. */
1043 const char *cpp_spec; /* If non-NULL, substitute this spec
1044 for `%C', rather than the usual
1045 cpp_spec. */
1046 const int combinable; /* If nonzero, compiler can deal with
1047 multiple source files at once (IMA). */
1048 const int needs_preprocessing; /* If nonzero, source files need to
1049 be run through a preprocessor. */
1052 /* Pointer to a vector of `struct compiler' that gives the spec for
1053 compiling a file, based on its suffix.
1054 A file that does not end in any of these suffixes will be passed
1055 unchanged to the loader and nothing else will be done to it.
1057 An entry containing two 0s is used to terminate the vector.
1059 If multiple entries match a file, the last matching one is used. */
1061 static struct compiler *compilers;
1063 /* Number of entries in `compilers', not counting the null terminator. */
1065 static int n_compilers;
1067 /* The default list of file name suffixes and their compilation specs. */
1069 static const struct compiler default_compilers[] =
1071 /* Add lists of suffixes of known languages here. If those languages
1072 were not present when we built the driver, we will hit these copies
1073 and be given a more meaningful error than "file not used since
1074 linking is not done". */
1075 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1076 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1077 {".mii", "#Objective-C++", 0, 0, 0},
1078 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1079 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1080 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1081 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1082 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1083 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1084 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1085 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1086 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1087 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1088 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1089 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1090 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1091 {".r", "#Ratfor", 0, 0, 0},
1092 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1093 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1094 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
1095 {".go", "#Go", 0, 1, 0},
1096 /* Next come the entries for C. */
1097 {".c", "@c", 0, 0, 1},
1098 {"@c",
1099 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1100 external preprocessor if -save-temps is given. */
1101 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1102 %{!E:%{!M:%{!MM:\
1103 %{traditional:\
1104 %eGNU C no longer supports -traditional without -E}\
1105 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1106 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1107 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1108 %(cc1_options)}\
1109 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1110 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1111 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1112 {"-",
1113 "%{!E:%e-E or -x required when input is from standard input}\
1114 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1115 {".h", "@c-header", 0, 0, 0},
1116 {"@c-header",
1117 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1118 external preprocessor if -save-temps is given. */
1119 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1120 %{!E:%{!M:%{!MM:\
1121 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1122 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1123 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1124 %(cc1_options)\
1125 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1126 %W{o*:--output-pch=%*}}%V}\
1127 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1128 cc1 %(cpp_unique_options) %(cc1_options)\
1129 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1130 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
1131 {".i", "@cpp-output", 0, 0, 0},
1132 {"@cpp-output",
1133 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1134 {".s", "@assembler", 0, 0, 0},
1135 {"@assembler",
1136 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1137 {".sx", "@assembler-with-cpp", 0, 0, 0},
1138 {".S", "@assembler-with-cpp", 0, 0, 0},
1139 {"@assembler-with-cpp",
1140 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1141 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1142 %{E|M|MM:%(cpp_debug_options)}\
1143 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1144 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1145 #else
1146 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1147 %{E|M|MM:%(cpp_debug_options)}\
1148 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1149 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1150 #endif
1151 , 0, 0, 0},
1153 #include "specs.h"
1154 /* Mark end of table. */
1155 {0, 0, 0, 0, 0}
1158 /* Number of elements in default_compilers, not counting the terminator. */
1160 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1162 typedef char *char_p; /* For DEF_VEC_P. */
1164 /* A vector of options to give to the linker.
1165 These options are accumulated by %x,
1166 and substituted into the linker command with %X. */
1167 static vec<char_p> linker_options;
1169 /* A vector of options to give to the assembler.
1170 These options are accumulated by -Wa,
1171 and substituted into the assembler command with %Y. */
1172 static vec<char_p> assembler_options;
1174 /* A vector of options to give to the preprocessor.
1175 These options are accumulated by -Wp,
1176 and substituted into the preprocessor command with %Z. */
1177 static vec<char_p> preprocessor_options;
1179 static char *
1180 skip_whitespace (char *p)
1182 while (1)
1184 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1185 be considered whitespace. */
1186 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1187 return p + 1;
1188 else if (*p == '\n' || *p == ' ' || *p == '\t')
1189 p++;
1190 else if (*p == '#')
1192 while (*p != '\n')
1193 p++;
1194 p++;
1196 else
1197 break;
1200 return p;
1202 /* Structures to keep track of prefixes to try when looking for files. */
1204 struct prefix_list
1206 const char *prefix; /* String to prepend to the path. */
1207 struct prefix_list *next; /* Next in linked list. */
1208 int require_machine_suffix; /* Don't use without machine_suffix. */
1209 /* 2 means try both machine_suffix and just_machine_suffix. */
1210 int priority; /* Sort key - priority within list. */
1211 int os_multilib; /* 1 if OS multilib scheme should be used,
1212 0 for GCC multilib scheme. */
1215 struct path_prefix
1217 struct prefix_list *plist; /* List of prefixes to try */
1218 int max_len; /* Max length of a prefix in PLIST */
1219 const char *name; /* Name of this list (used in config stuff) */
1222 /* List of prefixes to try when looking for executables. */
1224 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1226 /* List of prefixes to try when looking for startup (crt0) files. */
1228 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1230 /* List of prefixes to try when looking for include files. */
1232 static struct path_prefix include_prefixes = { 0, 0, "include" };
1234 /* Suffix to attach to directories searched for commands.
1235 This looks like `MACHINE/VERSION/'. */
1237 static const char *machine_suffix = 0;
1239 /* Suffix to attach to directories searched for commands.
1240 This is just `MACHINE/'. */
1242 static const char *just_machine_suffix = 0;
1244 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1246 static const char *gcc_exec_prefix;
1248 /* Adjusted value of standard_libexec_prefix. */
1250 static const char *gcc_libexec_prefix;
1252 /* Default prefixes to attach to command names. */
1254 #ifndef STANDARD_STARTFILE_PREFIX_1
1255 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1256 #endif
1257 #ifndef STANDARD_STARTFILE_PREFIX_2
1258 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1259 #endif
1261 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1262 #undef MD_EXEC_PREFIX
1263 #undef MD_STARTFILE_PREFIX
1264 #undef MD_STARTFILE_PREFIX_1
1265 #endif
1267 /* If no prefixes defined, use the null string, which will disable them. */
1268 #ifndef MD_EXEC_PREFIX
1269 #define MD_EXEC_PREFIX ""
1270 #endif
1271 #ifndef MD_STARTFILE_PREFIX
1272 #define MD_STARTFILE_PREFIX ""
1273 #endif
1274 #ifndef MD_STARTFILE_PREFIX_1
1275 #define MD_STARTFILE_PREFIX_1 ""
1276 #endif
1278 /* These directories are locations set at configure-time based on the
1279 --prefix option provided to configure. Their initializers are
1280 defined in Makefile.in. These paths are not *directly* used when
1281 gcc_exec_prefix is set because, in that case, we know where the
1282 compiler has been installed, and use paths relative to that
1283 location instead. */
1284 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1285 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1286 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1287 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1289 /* For native compilers, these are well-known paths containing
1290 components that may be provided by the system. For cross
1291 compilers, these paths are not used. */
1292 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1293 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1294 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1295 static const char *const standard_startfile_prefix_1
1296 = STANDARD_STARTFILE_PREFIX_1;
1297 static const char *const standard_startfile_prefix_2
1298 = STANDARD_STARTFILE_PREFIX_2;
1300 /* A relative path to be used in finding the location of tools
1301 relative to the driver. */
1302 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1304 /* A prefix to be used when this is an accelerator compiler. */
1305 static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX;
1307 /* Subdirectory to use for locating libraries. Set by
1308 set_multilib_dir based on the compilation options. */
1310 static const char *multilib_dir;
1312 /* Subdirectory to use for locating libraries in OS conventions. Set by
1313 set_multilib_dir based on the compilation options. */
1315 static const char *multilib_os_dir;
1317 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1318 set_multilib_dir based on the compilation options. */
1320 static const char *multiarch_dir;
1322 /* Structure to keep track of the specs that have been defined so far.
1323 These are accessed using %(specname) in a compiler or link
1324 spec. */
1326 struct spec_list
1328 /* The following 2 fields must be first */
1329 /* to allow EXTRA_SPECS to be initialized */
1330 const char *name; /* name of the spec. */
1331 const char *ptr; /* available ptr if no static pointer */
1333 /* The following fields are not initialized */
1334 /* by EXTRA_SPECS */
1335 const char **ptr_spec; /* pointer to the spec itself. */
1336 struct spec_list *next; /* Next spec in linked list. */
1337 int name_len; /* length of the name */
1338 bool user_p; /* whether string come from file spec. */
1339 bool alloc_p; /* whether string was allocated */
1342 #define INIT_STATIC_SPEC(NAME,PTR) \
1343 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false }
1345 /* List of statically defined specs. */
1346 static struct spec_list static_specs[] =
1348 INIT_STATIC_SPEC ("asm", &asm_spec),
1349 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1350 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1351 INIT_STATIC_SPEC ("asm_options", &asm_options),
1352 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1353 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1354 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1355 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1356 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1357 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1358 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1359 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1360 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1361 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1362 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1363 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1364 INIT_STATIC_SPEC ("link", &link_spec),
1365 INIT_STATIC_SPEC ("lib", &lib_spec),
1366 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1367 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1368 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1369 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1370 INIT_STATIC_SPEC ("version", &compiler_version),
1371 INIT_STATIC_SPEC ("multilib", &multilib_select),
1372 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1373 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1374 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1375 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1376 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1377 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
1378 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1379 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1380 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1381 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1382 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1383 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1384 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1385 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1386 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1387 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1388 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1389 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1390 INIT_STATIC_SPEC ("self_spec", &self_spec),
1393 #ifdef EXTRA_SPECS /* additional specs needed */
1394 /* Structure to keep track of just the first two args of a spec_list.
1395 That is all that the EXTRA_SPECS macro gives us. */
1396 struct spec_list_1
1398 const char *const name;
1399 const char *const ptr;
1402 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1403 static struct spec_list *extra_specs = (struct spec_list *) 0;
1404 #endif
1406 /* List of dynamically allocates specs that have been defined so far. */
1408 static struct spec_list *specs = (struct spec_list *) 0;
1410 /* List of static spec functions. */
1412 static const struct spec_function static_spec_functions[] =
1414 { "getenv", getenv_spec_function },
1415 { "if-exists", if_exists_spec_function },
1416 { "if-exists-else", if_exists_else_spec_function },
1417 { "sanitize", sanitize_spec_function },
1418 { "replace-outfile", replace_outfile_spec_function },
1419 { "remove-outfile", remove_outfile_spec_function },
1420 { "version-compare", version_compare_spec_function },
1421 { "include", include_spec_function },
1422 { "find-file", find_file_spec_function },
1423 { "find-plugindir", find_plugindir_spec_function },
1424 { "print-asm-header", print_asm_header_spec_function },
1425 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1426 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1427 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1428 { "pass-through-libs", pass_through_libs_spec_func },
1429 { "replace-extension", replace_extension_spec_func },
1430 #ifdef EXTRA_SPEC_FUNCTIONS
1431 EXTRA_SPEC_FUNCTIONS
1432 #endif
1433 { 0, 0 }
1436 static int processing_spec_function;
1438 /* Add appropriate libgcc specs to OBSTACK, taking into account
1439 various permutations of -shared-libgcc, -shared, and such. */
1441 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1443 #ifndef USE_LD_AS_NEEDED
1444 #define USE_LD_AS_NEEDED 0
1445 #endif
1447 static void
1448 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1449 const char *static_name, const char *eh_name)
1451 char *buf;
1453 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1454 "%{!static:%{!static-libgcc:"
1455 #if USE_LD_AS_NEEDED
1456 "%{!shared-libgcc:",
1457 static_name, " " LD_AS_NEEDED_OPTION " ",
1458 shared_name, " " LD_NO_AS_NEEDED_OPTION
1460 "%{shared-libgcc:",
1461 shared_name, "%{!shared: ", static_name, "}"
1463 #else
1464 "%{!shared:"
1465 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1466 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1468 #ifdef LINK_EH_SPEC
1469 "%{shared:"
1470 "%{shared-libgcc:", shared_name, "}"
1471 "%{!shared-libgcc:", static_name, "}"
1473 #else
1474 "%{shared:", shared_name, "}"
1475 #endif
1476 #endif
1477 "}}", NULL);
1479 obstack_grow (obstack, buf, strlen (buf));
1480 free (buf);
1482 #endif /* ENABLE_SHARED_LIBGCC */
1484 /* Initialize the specs lookup routines. */
1486 static void
1487 init_spec (void)
1489 struct spec_list *next = (struct spec_list *) 0;
1490 struct spec_list *sl = (struct spec_list *) 0;
1491 int i;
1493 if (specs)
1494 return; /* Already initialized. */
1496 if (verbose_flag)
1497 fnotice (stderr, "Using built-in specs.\n");
1499 #ifdef EXTRA_SPECS
1500 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1502 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1504 sl = &extra_specs[i];
1505 sl->name = extra_specs_1[i].name;
1506 sl->ptr = extra_specs_1[i].ptr;
1507 sl->next = next;
1508 sl->name_len = strlen (sl->name);
1509 sl->ptr_spec = &sl->ptr;
1510 next = sl;
1512 #endif
1514 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1516 sl = &static_specs[i];
1517 sl->next = next;
1518 next = sl;
1521 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1522 /* ??? If neither -shared-libgcc nor --static-libgcc was
1523 seen, then we should be making an educated guess. Some proposed
1524 heuristics for ELF include:
1526 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1527 program will be doing dynamic loading, which will likely
1528 need the shared libgcc.
1530 (2) If "-ldl", then it's also a fair bet that we're doing
1531 dynamic loading.
1533 (3) For each ET_DYN we're linking against (either through -lfoo
1534 or /some/path/foo.so), check to see whether it or one of
1535 its dependencies depends on a shared libgcc.
1537 (4) If "-shared"
1539 If the runtime is fixed to look for program headers instead
1540 of calling __register_frame_info at all, for each object,
1541 use the shared libgcc if any EH symbol referenced.
1543 If crtstuff is fixed to not invoke __register_frame_info
1544 automatically, for each object, use the shared libgcc if
1545 any non-empty unwind section found.
1547 Doing any of this probably requires invoking an external program to
1548 do the actual object file scanning. */
1550 const char *p = libgcc_spec;
1551 int in_sep = 1;
1553 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1554 when given the proper command line arguments. */
1555 while (*p)
1557 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1559 init_gcc_specs (&obstack,
1560 "-lgcc_s"
1561 #ifdef USE_LIBUNWIND_EXCEPTIONS
1562 " -lunwind"
1563 #endif
1565 "-lgcc",
1566 "-lgcc_eh"
1567 #ifdef USE_LIBUNWIND_EXCEPTIONS
1568 # ifdef HAVE_LD_STATIC_DYNAMIC
1569 " %{!static:" LD_STATIC_OPTION "} -lunwind"
1570 " %{!static:" LD_DYNAMIC_OPTION "}"
1571 # else
1572 " -lunwind"
1573 # endif
1574 #endif
1577 p += 5;
1578 in_sep = 0;
1580 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1582 /* Ug. We don't know shared library extensions. Hope that
1583 systems that use this form don't do shared libraries. */
1584 init_gcc_specs (&obstack,
1585 "-lgcc_s",
1586 "libgcc.a%s",
1587 "libgcc_eh.a%s"
1588 #ifdef USE_LIBUNWIND_EXCEPTIONS
1589 " -lunwind"
1590 #endif
1592 p += 10;
1593 in_sep = 0;
1595 else
1597 obstack_1grow (&obstack, *p);
1598 in_sep = (*p == ' ');
1599 p += 1;
1603 obstack_1grow (&obstack, '\0');
1604 libgcc_spec = XOBFINISH (&obstack, const char *);
1606 #endif
1607 #ifdef USE_AS_TRADITIONAL_FORMAT
1608 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1610 static const char tf[] = "--traditional-format ";
1611 obstack_grow (&obstack, tf, sizeof (tf) - 1);
1612 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1613 asm_spec = XOBFINISH (&obstack, const char *);
1615 #endif
1617 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1618 defined LINKER_HASH_STYLE
1619 # ifdef LINK_BUILDID_SPEC
1620 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1621 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
1622 # endif
1623 # ifdef LINK_EH_SPEC
1624 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1625 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
1626 # endif
1627 # ifdef LINKER_HASH_STYLE
1628 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1629 before. */
1631 static const char hash_style[] = "--hash-style=";
1632 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1633 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
1634 obstack_1grow (&obstack, ' ');
1636 # endif
1637 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1638 link_spec = XOBFINISH (&obstack, const char *);
1639 #endif
1641 specs = sl;
1644 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1645 removed; If the spec starts with a + then SPEC is added to the end of the
1646 current spec. */
1648 static void
1649 set_spec (const char *name, const char *spec, bool user_p)
1651 struct spec_list *sl;
1652 const char *old_spec;
1653 int name_len = strlen (name);
1654 int i;
1656 /* If this is the first call, initialize the statically allocated specs. */
1657 if (!specs)
1659 struct spec_list *next = (struct spec_list *) 0;
1660 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1662 sl = &static_specs[i];
1663 sl->next = next;
1664 next = sl;
1666 specs = sl;
1669 /* See if the spec already exists. */
1670 for (sl = specs; sl; sl = sl->next)
1671 if (name_len == sl->name_len && !strcmp (sl->name, name))
1672 break;
1674 if (!sl)
1676 /* Not found - make it. */
1677 sl = XNEW (struct spec_list);
1678 sl->name = xstrdup (name);
1679 sl->name_len = name_len;
1680 sl->ptr_spec = &sl->ptr;
1681 sl->alloc_p = 0;
1682 *(sl->ptr_spec) = "";
1683 sl->next = specs;
1684 specs = sl;
1687 old_spec = *(sl->ptr_spec);
1688 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1689 ? concat (old_spec, spec + 1, NULL)
1690 : xstrdup (spec));
1692 #ifdef DEBUG_SPECS
1693 if (verbose_flag)
1694 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1695 #endif
1697 /* Free the old spec. */
1698 if (old_spec && sl->alloc_p)
1699 free (CONST_CAST (char *, old_spec));
1701 sl->user_p = user_p;
1702 sl->alloc_p = true;
1705 /* Accumulate a command (program name and args), and run it. */
1707 typedef const char *const_char_p; /* For DEF_VEC_P. */
1709 /* Vector of pointers to arguments in the current line of specifications. */
1711 static vec<const_char_p> argbuf;
1713 /* Were the options -c, -S or -E passed. */
1714 static int have_c = 0;
1716 /* Was the option -o passed. */
1717 static int have_o = 0;
1719 /* Pointer to output file name passed in with -o. */
1720 static const char *output_file = 0;
1722 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1723 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1724 it here. */
1726 static struct temp_name {
1727 const char *suffix; /* suffix associated with the code. */
1728 int length; /* strlen (suffix). */
1729 int unique; /* Indicates whether %g or %u/%U was used. */
1730 const char *filename; /* associated filename. */
1731 int filename_length; /* strlen (filename). */
1732 struct temp_name *next;
1733 } *temp_names;
1735 /* Number of commands executed so far. */
1737 static int execution_count;
1739 /* Number of commands that exited with a signal. */
1741 static int signal_count;
1743 /* Allocate the argument vector. */
1745 static void
1746 alloc_args (void)
1748 argbuf.create (10);
1751 /* Clear out the vector of arguments (after a command is executed). */
1753 static void
1754 clear_args (void)
1756 argbuf.truncate (0);
1759 /* Add one argument to the vector at the end.
1760 This is done when a space is seen or at the end of the line.
1761 If DELETE_ALWAYS is nonzero, the arg is a filename
1762 and the file should be deleted eventually.
1763 If DELETE_FAILURE is nonzero, the arg is a filename
1764 and the file should be deleted if this compilation fails. */
1766 static void
1767 store_arg (const char *arg, int delete_always, int delete_failure)
1769 argbuf.safe_push (arg);
1771 if (delete_always || delete_failure)
1773 const char *p;
1774 /* If the temporary file we should delete is specified as
1775 part of a joined argument extract the filename. */
1776 if (arg[0] == '-'
1777 && (p = strrchr (arg, '=')))
1778 arg = p + 1;
1779 record_temp_file (arg, delete_always, delete_failure);
1783 /* Load specs from a file name named FILENAME, replacing occurrences of
1784 various different types of line-endings, \r\n, \n\r and just \r, with
1785 a single \n. */
1787 static char *
1788 load_specs (const char *filename)
1790 int desc;
1791 int readlen;
1792 struct stat statbuf;
1793 char *buffer;
1794 char *buffer_p;
1795 char *specs;
1796 char *specs_p;
1798 if (verbose_flag)
1799 fnotice (stderr, "Reading specs from %s\n", filename);
1801 /* Open and stat the file. */
1802 desc = open (filename, O_RDONLY, 0);
1803 if (desc < 0)
1804 pfatal_with_name (filename);
1805 if (stat (filename, &statbuf) < 0)
1806 pfatal_with_name (filename);
1808 /* Read contents of file into BUFFER. */
1809 buffer = XNEWVEC (char, statbuf.st_size + 1);
1810 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1811 if (readlen < 0)
1812 pfatal_with_name (filename);
1813 buffer[readlen] = 0;
1814 close (desc);
1816 specs = XNEWVEC (char, readlen + 1);
1817 specs_p = specs;
1818 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1820 int skip = 0;
1821 char c = *buffer_p;
1822 if (c == '\r')
1824 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
1825 skip = 1;
1826 else if (*(buffer_p + 1) == '\n') /* \r\n */
1827 skip = 1;
1828 else /* \r */
1829 c = '\n';
1831 if (! skip)
1832 *specs_p++ = c;
1834 *specs_p = '\0';
1836 free (buffer);
1837 return (specs);
1840 /* Read compilation specs from a file named FILENAME,
1841 replacing the default ones.
1843 A suffix which starts with `*' is a definition for
1844 one of the machine-specific sub-specs. The "suffix" should be
1845 *asm, *cc1, *cpp, *link, *startfile, etc.
1846 The corresponding spec is stored in asm_spec, etc.,
1847 rather than in the `compilers' vector.
1849 Anything invalid in the file is a fatal error. */
1851 static void
1852 read_specs (const char *filename, bool main_p, bool user_p)
1854 char *buffer;
1855 char *p;
1857 buffer = load_specs (filename);
1859 /* Scan BUFFER for specs, putting them in the vector. */
1860 p = buffer;
1861 while (1)
1863 char *suffix;
1864 char *spec;
1865 char *in, *out, *p1, *p2, *p3;
1867 /* Advance P in BUFFER to the next nonblank nocomment line. */
1868 p = skip_whitespace (p);
1869 if (*p == 0)
1870 break;
1872 /* Is this a special command that starts with '%'? */
1873 /* Don't allow this for the main specs file, since it would
1874 encourage people to overwrite it. */
1875 if (*p == '%' && !main_p)
1877 p1 = p;
1878 while (*p && *p != '\n')
1879 p++;
1881 /* Skip '\n'. */
1882 p++;
1884 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
1885 && (p1[sizeof "%include" - 1] == ' '
1886 || p1[sizeof "%include" - 1] == '\t'))
1888 char *new_filename;
1890 p1 += sizeof ("%include");
1891 while (*p1 == ' ' || *p1 == '\t')
1892 p1++;
1894 if (*p1++ != '<' || p[-2] != '>')
1895 fatal_error ("specs %%include syntax malformed after "
1896 "%ld characters",
1897 (long) (p1 - buffer + 1));
1899 p[-2] = '\0';
1900 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
1901 read_specs (new_filename ? new_filename : p1, false, user_p);
1902 continue;
1904 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1905 && (p1[sizeof "%include_noerr" - 1] == ' '
1906 || p1[sizeof "%include_noerr" - 1] == '\t'))
1908 char *new_filename;
1910 p1 += sizeof "%include_noerr";
1911 while (*p1 == ' ' || *p1 == '\t')
1912 p1++;
1914 if (*p1++ != '<' || p[-2] != '>')
1915 fatal_error ("specs %%include syntax malformed after "
1916 "%ld characters",
1917 (long) (p1 - buffer + 1));
1919 p[-2] = '\0';
1920 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
1921 if (new_filename)
1922 read_specs (new_filename, false, user_p);
1923 else if (verbose_flag)
1924 fnotice (stderr, "could not find specs file %s\n", p1);
1925 continue;
1927 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1928 && (p1[sizeof "%rename" - 1] == ' '
1929 || p1[sizeof "%rename" - 1] == '\t'))
1931 int name_len;
1932 struct spec_list *sl;
1933 struct spec_list *newsl;
1935 /* Get original name. */
1936 p1 += sizeof "%rename";
1937 while (*p1 == ' ' || *p1 == '\t')
1938 p1++;
1940 if (! ISALPHA ((unsigned char) *p1))
1941 fatal_error ("specs %%rename syntax malformed after "
1942 "%ld characters",
1943 (long) (p1 - buffer));
1945 p2 = p1;
1946 while (*p2 && !ISSPACE ((unsigned char) *p2))
1947 p2++;
1949 if (*p2 != ' ' && *p2 != '\t')
1950 fatal_error ("specs %%rename syntax malformed after "
1951 "%ld characters",
1952 (long) (p2 - buffer));
1954 name_len = p2 - p1;
1955 *p2++ = '\0';
1956 while (*p2 == ' ' || *p2 == '\t')
1957 p2++;
1959 if (! ISALPHA ((unsigned char) *p2))
1960 fatal_error ("specs %%rename syntax malformed after "
1961 "%ld characters",
1962 (long) (p2 - buffer));
1964 /* Get new spec name. */
1965 p3 = p2;
1966 while (*p3 && !ISSPACE ((unsigned char) *p3))
1967 p3++;
1969 if (p3 != p - 1)
1970 fatal_error ("specs %%rename syntax malformed after "
1971 "%ld characters",
1972 (long) (p3 - buffer));
1973 *p3 = '\0';
1975 for (sl = specs; sl; sl = sl->next)
1976 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1977 break;
1979 if (!sl)
1980 fatal_error ("specs %s spec was not found to be renamed", p1);
1982 if (strcmp (p1, p2) == 0)
1983 continue;
1985 for (newsl = specs; newsl; newsl = newsl->next)
1986 if (strcmp (newsl->name, p2) == 0)
1987 fatal_error ("%s: attempt to rename spec %qs to "
1988 "already defined spec %qs",
1989 filename, p1, p2);
1991 if (verbose_flag)
1993 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
1994 #ifdef DEBUG_SPECS
1995 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
1996 #endif
1999 set_spec (p2, *(sl->ptr_spec), user_p);
2000 if (sl->alloc_p)
2001 free (CONST_CAST (char *, *(sl->ptr_spec)));
2003 *(sl->ptr_spec) = "";
2004 sl->alloc_p = 0;
2005 continue;
2007 else
2008 fatal_error ("specs unknown %% command after %ld characters",
2009 (long) (p1 - buffer));
2012 /* Find the colon that should end the suffix. */
2013 p1 = p;
2014 while (*p1 && *p1 != ':' && *p1 != '\n')
2015 p1++;
2017 /* The colon shouldn't be missing. */
2018 if (*p1 != ':')
2019 fatal_error ("specs file malformed after %ld characters",
2020 (long) (p1 - buffer));
2022 /* Skip back over trailing whitespace. */
2023 p2 = p1;
2024 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2025 p2--;
2027 /* Copy the suffix to a string. */
2028 suffix = save_string (p, p2 - p);
2029 /* Find the next line. */
2030 p = skip_whitespace (p1 + 1);
2031 if (p[1] == 0)
2032 fatal_error ("specs file malformed after %ld characters",
2033 (long) (p - buffer));
2035 p1 = p;
2036 /* Find next blank line or end of string. */
2037 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2038 p1++;
2040 /* Specs end at the blank line and do not include the newline. */
2041 spec = save_string (p, p1 - p);
2042 p = p1;
2044 /* Delete backslash-newline sequences from the spec. */
2045 in = spec;
2046 out = spec;
2047 while (*in != 0)
2049 if (in[0] == '\\' && in[1] == '\n')
2050 in += 2;
2051 else if (in[0] == '#')
2052 while (*in && *in != '\n')
2053 in++;
2055 else
2056 *out++ = *in++;
2058 *out = 0;
2060 if (suffix[0] == '*')
2062 if (! strcmp (suffix, "*link_command"))
2063 link_command_spec = spec;
2064 else
2065 set_spec (suffix + 1, spec, user_p);
2067 else
2069 /* Add this pair to the vector. */
2070 compilers
2071 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2073 compilers[n_compilers].suffix = suffix;
2074 compilers[n_compilers].spec = spec;
2075 n_compilers++;
2076 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2079 if (*suffix == 0)
2080 link_command_spec = spec;
2083 if (link_command_spec == 0)
2084 fatal_error ("spec file has no spec for linking");
2087 /* Record the names of temporary files we tell compilers to write,
2088 and delete them at the end of the run. */
2090 /* This is the common prefix we use to make temp file names.
2091 It is chosen once for each run of this program.
2092 It is substituted into a spec by %g or %j.
2093 Thus, all temp file names contain this prefix.
2094 In practice, all temp file names start with this prefix.
2096 This prefix comes from the envvar TMPDIR if it is defined;
2097 otherwise, from the P_tmpdir macro if that is defined;
2098 otherwise, in /usr/tmp or /tmp;
2099 or finally the current directory if all else fails. */
2101 static const char *temp_filename;
2103 /* Length of the prefix. */
2105 static int temp_filename_length;
2107 /* Define the list of temporary files to delete. */
2109 struct temp_file
2111 const char *name;
2112 struct temp_file *next;
2115 /* Queue of files to delete on success or failure of compilation. */
2116 static struct temp_file *always_delete_queue;
2117 /* Queue of files to delete on failure of compilation. */
2118 static struct temp_file *failure_delete_queue;
2120 /* Record FILENAME as a file to be deleted automatically.
2121 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2122 otherwise delete it in any case.
2123 FAIL_DELETE nonzero means delete it if a compilation step fails;
2124 otherwise delete it in any case. */
2126 void
2127 record_temp_file (const char *filename, int always_delete, int fail_delete)
2129 char *const name = xstrdup (filename);
2131 if (always_delete)
2133 struct temp_file *temp;
2134 for (temp = always_delete_queue; temp; temp = temp->next)
2135 if (! filename_cmp (name, temp->name))
2136 goto already1;
2138 temp = XNEW (struct temp_file);
2139 temp->next = always_delete_queue;
2140 temp->name = name;
2141 always_delete_queue = temp;
2143 already1:;
2146 if (fail_delete)
2148 struct temp_file *temp;
2149 for (temp = failure_delete_queue; temp; temp = temp->next)
2150 if (! filename_cmp (name, temp->name))
2152 free (name);
2153 goto already2;
2156 temp = XNEW (struct temp_file);
2157 temp->next = failure_delete_queue;
2158 temp->name = name;
2159 failure_delete_queue = temp;
2161 already2:;
2165 /* Delete all the temporary files whose names we previously recorded. */
2167 #ifndef DELETE_IF_ORDINARY
2168 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2169 do \
2171 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2172 if (unlink (NAME) < 0) \
2173 if (VERBOSE_FLAG) \
2174 perror_with_name (NAME); \
2175 } while (0)
2176 #endif
2178 static void
2179 delete_if_ordinary (const char *name)
2181 struct stat st;
2182 #ifdef DEBUG
2183 int i, c;
2185 printf ("Delete %s? (y or n) ", name);
2186 fflush (stdout);
2187 i = getchar ();
2188 if (i != '\n')
2189 while ((c = getchar ()) != '\n' && c != EOF)
2192 if (i == 'y' || i == 'Y')
2193 #endif /* DEBUG */
2194 DELETE_IF_ORDINARY (name, st, verbose_flag);
2197 static void
2198 delete_temp_files (void)
2200 struct temp_file *temp;
2202 for (temp = always_delete_queue; temp; temp = temp->next)
2203 delete_if_ordinary (temp->name);
2204 always_delete_queue = 0;
2207 /* Delete all the files to be deleted on error. */
2209 static void
2210 delete_failure_queue (void)
2212 struct temp_file *temp;
2214 for (temp = failure_delete_queue; temp; temp = temp->next)
2215 delete_if_ordinary (temp->name);
2218 static void
2219 clear_failure_queue (void)
2221 failure_delete_queue = 0;
2224 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2225 returns non-NULL.
2226 If DO_MULTI is true iterate over the paths twice, first with multilib
2227 suffix then without, otherwise iterate over the paths once without
2228 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2229 to avoid visiting the same path twice, but we could do better. For
2230 instance, /usr/lib/../lib is considered different from /usr/lib.
2231 At least EXTRA_SPACE chars past the end of the path passed to
2232 CALLBACK are available for use by the callback.
2233 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2235 Returns the value returned by CALLBACK. */
2237 static void *
2238 for_each_path (const struct path_prefix *paths,
2239 bool do_multi,
2240 size_t extra_space,
2241 void *(*callback) (char *, void *),
2242 void *callback_info)
2244 struct prefix_list *pl;
2245 const char *multi_dir = NULL;
2246 const char *multi_os_dir = NULL;
2247 const char *multiarch_suffix = NULL;
2248 const char *multi_suffix;
2249 const char *just_multi_suffix;
2250 char *path = NULL;
2251 void *ret = NULL;
2252 bool skip_multi_dir = false;
2253 bool skip_multi_os_dir = false;
2255 multi_suffix = machine_suffix;
2256 just_multi_suffix = just_machine_suffix;
2257 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2259 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2260 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2261 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2263 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2264 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2265 if (multiarch_dir)
2266 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
2268 while (1)
2270 size_t multi_dir_len = 0;
2271 size_t multi_os_dir_len = 0;
2272 size_t multiarch_len = 0;
2273 size_t suffix_len;
2274 size_t just_suffix_len;
2275 size_t len;
2277 if (multi_dir)
2278 multi_dir_len = strlen (multi_dir);
2279 if (multi_os_dir)
2280 multi_os_dir_len = strlen (multi_os_dir);
2281 if (multiarch_suffix)
2282 multiarch_len = strlen (multiarch_suffix);
2283 suffix_len = strlen (multi_suffix);
2284 just_suffix_len = strlen (just_multi_suffix);
2286 if (path == NULL)
2288 len = paths->max_len + extra_space + 1;
2289 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
2290 path = XNEWVEC (char, len);
2293 for (pl = paths->plist; pl != 0; pl = pl->next)
2295 len = strlen (pl->prefix);
2296 memcpy (path, pl->prefix, len);
2298 /* Look first in MACHINE/VERSION subdirectory. */
2299 if (!skip_multi_dir)
2301 memcpy (path + len, multi_suffix, suffix_len + 1);
2302 ret = callback (path, callback_info);
2303 if (ret)
2304 break;
2307 /* Some paths are tried with just the machine (ie. target)
2308 subdir. This is used for finding as, ld, etc. */
2309 if (!skip_multi_dir
2310 && pl->require_machine_suffix == 2)
2312 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2313 ret = callback (path, callback_info);
2314 if (ret)
2315 break;
2318 /* Now try the multiarch path. */
2319 if (!skip_multi_dir
2320 && !pl->require_machine_suffix && multiarch_dir)
2322 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2323 ret = callback (path, callback_info);
2324 if (ret)
2325 break;
2328 /* Now try the base path. */
2329 if (!pl->require_machine_suffix
2330 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2332 const char *this_multi;
2333 size_t this_multi_len;
2335 if (pl->os_multilib)
2337 this_multi = multi_os_dir;
2338 this_multi_len = multi_os_dir_len;
2340 else
2342 this_multi = multi_dir;
2343 this_multi_len = multi_dir_len;
2346 if (this_multi_len)
2347 memcpy (path + len, this_multi, this_multi_len + 1);
2348 else
2349 path[len] = '\0';
2351 ret = callback (path, callback_info);
2352 if (ret)
2353 break;
2356 if (pl)
2357 break;
2359 if (multi_dir == NULL && multi_os_dir == NULL)
2360 break;
2362 /* Run through the paths again, this time without multilibs.
2363 Don't repeat any we have already seen. */
2364 if (multi_dir)
2366 free (CONST_CAST (char *, multi_dir));
2367 multi_dir = NULL;
2368 free (CONST_CAST (char *, multi_suffix));
2369 multi_suffix = machine_suffix;
2370 free (CONST_CAST (char *, just_multi_suffix));
2371 just_multi_suffix = just_machine_suffix;
2373 else
2374 skip_multi_dir = true;
2375 if (multi_os_dir)
2377 free (CONST_CAST (char *, multi_os_dir));
2378 multi_os_dir = NULL;
2380 else
2381 skip_multi_os_dir = true;
2384 if (multi_dir)
2386 free (CONST_CAST (char *, multi_dir));
2387 free (CONST_CAST (char *, multi_suffix));
2388 free (CONST_CAST (char *, just_multi_suffix));
2390 if (multi_os_dir)
2391 free (CONST_CAST (char *, multi_os_dir));
2392 if (ret != path)
2393 free (path);
2394 return ret;
2397 /* Callback for build_search_list. Adds path to obstack being built. */
2399 struct add_to_obstack_info {
2400 struct obstack *ob;
2401 bool check_dir;
2402 bool first_time;
2405 static void *
2406 add_to_obstack (char *path, void *data)
2408 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2410 if (info->check_dir && !is_directory (path, false))
2411 return NULL;
2413 if (!info->first_time)
2414 obstack_1grow (info->ob, PATH_SEPARATOR);
2416 obstack_grow (info->ob, path, strlen (path));
2418 info->first_time = false;
2419 return NULL;
2422 /* Add or change the value of an environment variable, outputting the
2423 change to standard error if in verbose mode. */
2424 static void
2425 xputenv (const char *string)
2427 if (verbose_flag)
2428 fnotice (stderr, "%s\n", string);
2429 putenv (CONST_CAST (char *, string));
2432 /* Build a list of search directories from PATHS.
2433 PREFIX is a string to prepend to the list.
2434 If CHECK_DIR_P is true we ensure the directory exists.
2435 If DO_MULTI is true, multilib paths are output first, then
2436 non-multilib paths.
2437 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2438 It is also used by the --print-search-dirs flag. */
2440 static char *
2441 build_search_list (const struct path_prefix *paths, const char *prefix,
2442 bool check_dir, bool do_multi)
2444 struct add_to_obstack_info info;
2446 info.ob = &collect_obstack;
2447 info.check_dir = check_dir;
2448 info.first_time = true;
2450 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2451 obstack_1grow (&collect_obstack, '=');
2453 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2455 obstack_1grow (&collect_obstack, '\0');
2456 return XOBFINISH (&collect_obstack, char *);
2459 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2460 for collect. */
2462 static void
2463 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2464 bool do_multi)
2466 xputenv (build_search_list (paths, env_var, true, do_multi));
2469 /* Check whether NAME can be accessed in MODE. This is like access,
2470 except that it never considers directories to be executable. */
2472 static int
2473 access_check (const char *name, int mode)
2475 if (mode == X_OK)
2477 struct stat st;
2479 if (stat (name, &st) < 0
2480 || S_ISDIR (st.st_mode))
2481 return -1;
2484 return access (name, mode);
2487 /* Callback for find_a_file. Appends the file name to the directory
2488 path. If the resulting file exists in the right mode, return the
2489 full pathname to the file. */
2491 struct file_at_path_info {
2492 const char *name;
2493 const char *suffix;
2494 int name_len;
2495 int suffix_len;
2496 int mode;
2499 static void *
2500 file_at_path (char *path, void *data)
2502 struct file_at_path_info *info = (struct file_at_path_info *) data;
2503 size_t len = strlen (path);
2505 memcpy (path + len, info->name, info->name_len);
2506 len += info->name_len;
2508 /* Some systems have a suffix for executable files.
2509 So try appending that first. */
2510 if (info->suffix_len)
2512 memcpy (path + len, info->suffix, info->suffix_len + 1);
2513 if (access_check (path, info->mode) == 0)
2514 return path;
2517 path[len] = '\0';
2518 if (access_check (path, info->mode) == 0)
2519 return path;
2521 return NULL;
2524 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2525 access to check permissions. If DO_MULTI is true, search multilib
2526 paths then non-multilib paths, otherwise do not search multilib paths.
2527 Return 0 if not found, otherwise return its name, allocated with malloc. */
2529 static char *
2530 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2531 bool do_multi)
2533 struct file_at_path_info info;
2535 #ifdef DEFAULT_ASSEMBLER
2536 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2537 return xstrdup (DEFAULT_ASSEMBLER);
2538 #endif
2540 #ifdef DEFAULT_LINKER
2541 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2542 return xstrdup (DEFAULT_LINKER);
2543 #endif
2545 /* Determine the filename to execute (special case for absolute paths). */
2547 if (IS_ABSOLUTE_PATH (name))
2549 if (access (name, mode) == 0)
2550 return xstrdup (name);
2552 return NULL;
2555 info.name = name;
2556 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2557 info.name_len = strlen (info.name);
2558 info.suffix_len = strlen (info.suffix);
2559 info.mode = mode;
2561 return (char*) for_each_path (pprefix, do_multi,
2562 info.name_len + info.suffix_len,
2563 file_at_path, &info);
2566 /* Ranking of prefixes in the sort list. -B prefixes are put before
2567 all others. */
2569 enum path_prefix_priority
2571 PREFIX_PRIORITY_B_OPT,
2572 PREFIX_PRIORITY_LAST
2575 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2576 order according to PRIORITY. Within each PRIORITY, new entries are
2577 appended.
2579 If WARN is nonzero, we will warn if no file is found
2580 through this prefix. WARN should point to an int
2581 which will be set to 1 if this entry is used.
2583 COMPONENT is the value to be passed to update_path.
2585 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2586 the complete value of machine_suffix.
2587 2 means try both machine_suffix and just_machine_suffix. */
2589 static void
2590 add_prefix (struct path_prefix *pprefix, const char *prefix,
2591 const char *component, /* enum prefix_priority */ int priority,
2592 int require_machine_suffix, int os_multilib)
2594 struct prefix_list *pl, **prev;
2595 int len;
2597 for (prev = &pprefix->plist;
2598 (*prev) != NULL && (*prev)->priority <= priority;
2599 prev = &(*prev)->next)
2602 /* Keep track of the longest prefix. */
2604 prefix = update_path (prefix, component);
2605 len = strlen (prefix);
2606 if (len > pprefix->max_len)
2607 pprefix->max_len = len;
2609 pl = XNEW (struct prefix_list);
2610 pl->prefix = prefix;
2611 pl->require_machine_suffix = require_machine_suffix;
2612 pl->priority = priority;
2613 pl->os_multilib = os_multilib;
2615 /* Insert after PREV. */
2616 pl->next = (*prev);
2617 (*prev) = pl;
2620 /* Same as add_prefix, but prepending target_system_root to prefix. */
2621 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2622 static void
2623 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2624 const char *component,
2625 /* enum prefix_priority */ int priority,
2626 int require_machine_suffix, int os_multilib)
2628 if (!IS_ABSOLUTE_PATH (prefix))
2629 fatal_error ("system path %qs is not absolute", prefix);
2631 if (target_system_root)
2633 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2634 size_t sysroot_len = strlen (target_system_root);
2636 if (sysroot_len > 0
2637 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2638 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2640 if (target_sysroot_suffix)
2641 prefix = concat (sysroot_no_trailing_dir_separator,
2642 target_sysroot_suffix, prefix, NULL);
2643 else
2644 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
2646 free (sysroot_no_trailing_dir_separator);
2648 /* We have to override this because GCC's notion of sysroot
2649 moves along with GCC. */
2650 component = "GCC";
2653 add_prefix (pprefix, prefix, component, priority,
2654 require_machine_suffix, os_multilib);
2657 /* Execute the command specified by the arguments on the current line of spec.
2658 When using pipes, this includes several piped-together commands
2659 with `|' between them.
2661 Return 0 if successful, -1 if failed. */
2663 static int
2664 execute (void)
2666 int i;
2667 int n_commands; /* # of command. */
2668 char *string;
2669 struct pex_obj *pex;
2670 struct command
2672 const char *prog; /* program name. */
2673 const char **argv; /* vector of args. */
2675 const char *arg;
2677 struct command *commands; /* each command buffer with above info. */
2679 gcc_assert (!processing_spec_function);
2681 if (wrapper_string)
2683 string = find_a_file (&exec_prefixes,
2684 argbuf[0], X_OK, false);
2685 if (string)
2686 argbuf[0] = string;
2687 insert_wrapper (wrapper_string);
2690 /* Count # of piped commands. */
2691 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
2692 if (strcmp (arg, "|") == 0)
2693 n_commands++;
2695 /* Get storage for each command. */
2696 commands = (struct command *) alloca (n_commands * sizeof (struct command));
2698 /* Split argbuf into its separate piped processes,
2699 and record info about each one.
2700 Also search for the programs that are to be run. */
2702 argbuf.safe_push (0);
2704 commands[0].prog = argbuf[0]; /* first command. */
2705 commands[0].argv = argbuf.address ();
2707 if (!wrapper_string)
2709 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2710 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2713 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
2714 if (arg && strcmp (arg, "|") == 0)
2715 { /* each command. */
2716 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2717 fatal_error ("-pipe not supported");
2718 #endif
2719 argbuf[i] = 0; /* Termination of
2720 command args. */
2721 commands[n_commands].prog = argbuf[i + 1];
2722 commands[n_commands].argv
2723 = &(argbuf.address ())[i + 1];
2724 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2725 X_OK, false);
2726 if (string)
2727 commands[n_commands].argv[0] = string;
2728 n_commands++;
2731 /* If -v, print what we are about to do, and maybe query. */
2733 if (verbose_flag)
2735 /* For help listings, put a blank line between sub-processes. */
2736 if (print_help_list)
2737 fputc ('\n', stderr);
2739 /* Print each piped command as a separate line. */
2740 for (i = 0; i < n_commands; i++)
2742 const char *const *j;
2744 if (verbose_only_flag)
2746 for (j = commands[i].argv; *j; j++)
2748 const char *p;
2749 for (p = *j; *p; ++p)
2750 if (!ISALNUM ((unsigned char) *p)
2751 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
2752 break;
2753 if (*p || !*j)
2755 fprintf (stderr, " \"");
2756 for (p = *j; *p; ++p)
2758 if (*p == '"' || *p == '\\' || *p == '$')
2759 fputc ('\\', stderr);
2760 fputc (*p, stderr);
2762 fputc ('"', stderr);
2764 /* If it's empty, print "". */
2765 else if (!**j)
2766 fprintf (stderr, " \"\"");
2767 else
2768 fprintf (stderr, " %s", *j);
2771 else
2772 for (j = commands[i].argv; *j; j++)
2773 /* If it's empty, print "". */
2774 if (!**j)
2775 fprintf (stderr, " \"\"");
2776 else
2777 fprintf (stderr, " %s", *j);
2779 /* Print a pipe symbol after all but the last command. */
2780 if (i + 1 != n_commands)
2781 fprintf (stderr, " |");
2782 fprintf (stderr, "\n");
2784 fflush (stderr);
2785 if (verbose_only_flag != 0)
2787 /* verbose_only_flag should act as if the spec was
2788 executed, so increment execution_count before
2789 returning. This prevents spurious warnings about
2790 unused linker input files, etc. */
2791 execution_count++;
2792 return 0;
2794 #ifdef DEBUG
2795 fnotice (stderr, "\nGo ahead? (y or n) ");
2796 fflush (stderr);
2797 i = getchar ();
2798 if (i != '\n')
2799 while (getchar () != '\n')
2802 if (i != 'y' && i != 'Y')
2803 return 0;
2804 #endif /* DEBUG */
2807 #ifdef ENABLE_VALGRIND_CHECKING
2808 /* Run the each command through valgrind. To simplify prepending the
2809 path to valgrind and the option "-q" (for quiet operation unless
2810 something triggers), we allocate a separate argv array. */
2812 for (i = 0; i < n_commands; i++)
2814 const char **argv;
2815 int argc;
2816 int j;
2818 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
2821 argv = XALLOCAVEC (const char *, argc + 3);
2823 argv[0] = VALGRIND_PATH;
2824 argv[1] = "-q";
2825 for (j = 2; j < argc + 2; j++)
2826 argv[j] = commands[i].argv[j - 2];
2827 argv[j] = NULL;
2829 commands[i].argv = argv;
2830 commands[i].prog = argv[0];
2832 #endif
2834 /* Run each piped subprocess. */
2836 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
2837 ? PEX_RECORD_TIMES : 0),
2838 progname, temp_filename);
2839 if (pex == NULL)
2840 fatal_error ("pex_init failed: %m");
2842 for (i = 0; i < n_commands; i++)
2844 const char *errmsg;
2845 int err;
2846 const char *string = commands[i].argv[0];
2848 errmsg = pex_run (pex,
2849 ((i + 1 == n_commands ? PEX_LAST : 0)
2850 | (string == commands[i].prog ? PEX_SEARCH : 0)),
2851 string, CONST_CAST (char **, commands[i].argv),
2852 NULL, NULL, &err);
2853 if (errmsg != NULL)
2855 if (err == 0)
2856 fatal_error (errmsg);
2857 else
2859 errno = err;
2860 pfatal_with_name (errmsg);
2864 if (i && string != commands[i].prog)
2865 free (CONST_CAST (char *, string));
2868 execution_count++;
2870 /* Wait for all the subprocesses to finish. */
2873 int *statuses;
2874 struct pex_time *times = NULL;
2875 int ret_code = 0;
2877 statuses = (int *) alloca (n_commands * sizeof (int));
2878 if (!pex_get_status (pex, n_commands, statuses))
2879 fatal_error ("failed to get exit status: %m");
2881 if (report_times || report_times_to_file)
2883 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
2884 if (!pex_get_times (pex, n_commands, times))
2885 fatal_error ("failed to get process times: %m");
2888 pex_free (pex);
2890 for (i = 0; i < n_commands; ++i)
2892 int status = statuses[i];
2894 if (WIFSIGNALED (status))
2896 #ifdef SIGPIPE
2897 /* SIGPIPE is a special case. It happens in -pipe mode
2898 when the compiler dies before the preprocessor is done,
2899 or the assembler dies before the compiler is done.
2900 There's generally been an error already, and this is
2901 just fallout. So don't generate another error unless
2902 we would otherwise have succeeded. */
2903 if (WTERMSIG (status) == SIGPIPE
2904 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2906 signal_count++;
2907 ret_code = -1;
2909 else
2910 #endif
2911 internal_error ("%s (program %s)",
2912 strsignal (WTERMSIG (status)), commands[i].prog);
2914 else if (WIFEXITED (status)
2915 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2917 /* For ICEs in cc1, cc1obj, cc1plus see if it is
2918 reproducible or not. */
2919 const char *p;
2920 if (flag_report_bug
2921 && WEXITSTATUS (status) == ICE_EXIT_CODE
2922 && i == 0
2923 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR))
2924 && ! strncmp (p + 1, "cc1", 3))
2925 try_generate_repro (commands[0].argv);
2926 if (WEXITSTATUS (status) > greatest_status)
2927 greatest_status = WEXITSTATUS (status);
2928 ret_code = -1;
2931 if (report_times || report_times_to_file)
2933 struct pex_time *pt = &times[i];
2934 double ut, st;
2936 ut = ((double) pt->user_seconds
2937 + (double) pt->user_microseconds / 1.0e6);
2938 st = ((double) pt->system_seconds
2939 + (double) pt->system_microseconds / 1.0e6);
2941 if (ut + st != 0)
2943 if (report_times)
2944 fnotice (stderr, "# %s %.2f %.2f\n",
2945 commands[i].prog, ut, st);
2947 if (report_times_to_file)
2949 int c = 0;
2950 const char *const *j;
2952 fprintf (report_times_to_file, "%g %g", ut, st);
2954 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
2956 const char *p;
2957 for (p = *j; *p; ++p)
2958 if (*p == '"' || *p == '\\' || *p == '$'
2959 || ISSPACE (*p))
2960 break;
2962 if (*p)
2964 fprintf (report_times_to_file, " \"");
2965 for (p = *j; *p; ++p)
2967 if (*p == '"' || *p == '\\' || *p == '$')
2968 fputc ('\\', report_times_to_file);
2969 fputc (*p, report_times_to_file);
2971 fputc ('"', report_times_to_file);
2973 else
2974 fprintf (report_times_to_file, " %s", *j);
2977 fputc ('\n', report_times_to_file);
2983 if (commands[0].argv[0] != commands[0].prog)
2984 free (CONST_CAST (char *, commands[0].argv[0]));
2986 return ret_code;
2990 /* Find all the switches given to us
2991 and make a vector describing them.
2992 The elements of the vector are strings, one per switch given.
2993 If a switch uses following arguments, then the `part1' field
2994 is the switch itself and the `args' field
2995 is a null-terminated vector containing the following arguments.
2996 Bits in the `live_cond' field are:
2997 SWITCH_LIVE to indicate this switch is true in a conditional spec.
2998 SWITCH_FALSE to indicate this switch is overridden by a later switch.
2999 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3000 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
3001 in all do_spec calls afterwards. Used for %<S from self specs.
3002 The `validated' field is nonzero if any spec has looked at this switch;
3003 if it remains zero at the end of the run, it must be meaningless. */
3005 #define SWITCH_LIVE (1 << 0)
3006 #define SWITCH_FALSE (1 << 1)
3007 #define SWITCH_IGNORE (1 << 2)
3008 #define SWITCH_IGNORE_PERMANENTLY (1 << 3)
3009 #define SWITCH_KEEP_FOR_GCC (1 << 4)
3011 struct switchstr
3013 const char *part1;
3014 const char **args;
3015 unsigned int live_cond;
3016 bool known;
3017 bool validated;
3018 bool ordering;
3021 static struct switchstr *switches;
3023 static int n_switches;
3025 static int n_switches_alloc;
3027 /* Set to zero if -fcompare-debug is disabled, positive if it's
3028 enabled and we're running the first compilation, negative if it's
3029 enabled and we're running the second compilation. For most of the
3030 time, it's in the range -1..1, but it can be temporarily set to 2
3031 or 3 to indicate that the -fcompare-debug flags didn't come from
3032 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3033 variable, until a synthesized -fcompare-debug flag is added to the
3034 command line. */
3035 int compare_debug;
3037 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3038 int compare_debug_second;
3040 /* Set to the flags that should be passed to the second compilation in
3041 a -fcompare-debug compilation. */
3042 const char *compare_debug_opt;
3044 static struct switchstr *switches_debug_check[2];
3046 static int n_switches_debug_check[2];
3048 static int n_switches_alloc_debug_check[2];
3050 static char *debug_check_temp_file[2];
3052 /* Language is one of three things:
3054 1) The name of a real programming language.
3055 2) NULL, indicating that no one has figured out
3056 what it is yet.
3057 3) '*', indicating that the file should be passed
3058 to the linker. */
3059 struct infile
3061 const char *name;
3062 const char *language;
3063 struct compiler *incompiler;
3064 bool compiled;
3065 bool preprocessed;
3068 /* Also a vector of input files specified. */
3070 static struct infile *infiles;
3072 int n_infiles;
3074 static int n_infiles_alloc;
3076 /* True if multiple input files are being compiled to a single
3077 assembly file. */
3079 static bool combine_inputs;
3081 /* This counts the number of libraries added by lang_specific_driver, so that
3082 we can tell if there were any user supplied any files or libraries. */
3084 static int added_libraries;
3086 /* And a vector of corresponding output files is made up later. */
3088 const char **outfiles;
3090 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3092 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3093 is true if we should look for an executable suffix. DO_OBJ
3094 is true if we should look for an object suffix. */
3096 static const char *
3097 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3098 int do_obj ATTRIBUTE_UNUSED)
3100 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3101 int i;
3102 #endif
3103 int len;
3105 if (name == NULL)
3106 return NULL;
3108 len = strlen (name);
3110 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3111 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3112 if (do_obj && len > 2
3113 && name[len - 2] == '.'
3114 && name[len - 1] == 'o')
3116 obstack_grow (&obstack, name, len - 2);
3117 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3118 name = XOBFINISH (&obstack, const char *);
3120 #endif
3122 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3123 /* If there is no filetype, make it the executable suffix (which includes
3124 the "."). But don't get confused if we have just "-o". */
3125 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3126 return name;
3128 for (i = len - 1; i >= 0; i--)
3129 if (IS_DIR_SEPARATOR (name[i]))
3130 break;
3132 for (i++; i < len; i++)
3133 if (name[i] == '.')
3134 return name;
3136 obstack_grow (&obstack, name, len);
3137 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3138 strlen (TARGET_EXECUTABLE_SUFFIX));
3139 name = XOBFINISH (&obstack, const char *);
3140 #endif
3142 return name;
3144 #endif
3146 /* Display the command line switches accepted by gcc. */
3147 static void
3148 display_help (void)
3150 printf (_("Usage: %s [options] file...\n"), progname);
3151 fputs (_("Options:\n"), stdout);
3153 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3154 fputs (_(" --help Display this information\n"), stdout);
3155 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3156 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3157 fputs (_(" Display specific types of command line options\n"), stdout);
3158 if (! verbose_flag)
3159 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3160 fputs (_(" --version Display compiler version information\n"), stdout);
3161 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3162 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3163 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3164 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3165 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3166 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3167 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3168 fputs (_("\
3169 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3170 a component in the library path\n"), stdout);
3171 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3172 fputs (_("\
3173 -print-multi-lib Display the mapping between command line options and\n\
3174 multiple library search directories\n"), stdout);
3175 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3176 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
3177 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3178 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3179 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3180 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3181 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3182 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3183 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3184 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3185 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
3186 fputs (_("\
3187 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3188 prefixes to other gcc components\n"), stdout);
3189 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3190 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3191 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3192 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3193 fputs (_("\
3194 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3195 and libraries\n"), stdout);
3196 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3197 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3198 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3199 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3200 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3201 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3202 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3203 fputs (_(" -pie Create a position independent executable\n"), stdout);
3204 fputs (_(" -shared Create a shared library\n"), stdout);
3205 fputs (_("\
3206 -x <language> Specify the language of the following input files\n\
3207 Permissible languages include: c c++ assembler none\n\
3208 'none' means revert to the default behavior of\n\
3209 guessing the language based on the file's extension\n\
3210 "), stdout);
3212 printf (_("\
3213 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3214 passed on to the various sub-processes invoked by %s. In order to pass\n\
3215 other options on to these processes the -W<letter> options must be used.\n\
3216 "), progname);
3218 /* The rest of the options are displayed by invocations of the various
3219 sub-processes. */
3222 static void
3223 add_preprocessor_option (const char *option, int len)
3225 preprocessor_options.safe_push (save_string (option, len));
3228 static void
3229 add_assembler_option (const char *option, int len)
3231 assembler_options.safe_push (save_string (option, len));
3234 static void
3235 add_linker_option (const char *option, int len)
3237 linker_options.safe_push (save_string (option, len));
3240 /* Allocate space for an input file in infiles. */
3242 static void
3243 alloc_infile (void)
3245 if (n_infiles_alloc == 0)
3247 n_infiles_alloc = 16;
3248 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3250 else if (n_infiles_alloc == n_infiles)
3252 n_infiles_alloc *= 2;
3253 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3257 /* Store an input file with the given NAME and LANGUAGE in
3258 infiles. */
3260 static void
3261 add_infile (const char *name, const char *language)
3263 alloc_infile ();
3264 infiles[n_infiles].name = name;
3265 infiles[n_infiles++].language = language;
3268 /* Allocate space for a switch in switches. */
3270 static void
3271 alloc_switch (void)
3273 if (n_switches_alloc == 0)
3275 n_switches_alloc = 16;
3276 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3278 else if (n_switches_alloc == n_switches)
3280 n_switches_alloc *= 2;
3281 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3285 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3286 as validated if VALIDATED and KNOWN if it is an internal switch. */
3288 static void
3289 save_switch (const char *opt, size_t n_args, const char *const *args,
3290 bool validated, bool known)
3292 alloc_switch ();
3293 switches[n_switches].part1 = opt + 1;
3294 if (n_args == 0)
3295 switches[n_switches].args = 0;
3296 else
3298 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3299 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3300 switches[n_switches].args[n_args] = NULL;
3303 switches[n_switches].live_cond = 0;
3304 switches[n_switches].validated = validated;
3305 switches[n_switches].known = known;
3306 switches[n_switches].ordering = 0;
3307 n_switches++;
3310 /* Handle an option DECODED that is unknown to the option-processing
3311 machinery. */
3313 static bool
3314 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3316 const char *opt = decoded->arg;
3317 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3318 && !(decoded->errors & CL_ERR_NEGATIVE))
3320 /* Leave unknown -Wno-* options for the compiler proper, to be
3321 diagnosed only if there are warnings. */
3322 save_switch (decoded->canonical_option[0],
3323 decoded->canonical_option_num_elements - 1,
3324 &decoded->canonical_option[1], false, true);
3325 return false;
3327 if (decoded->opt_index == OPT_SPECIAL_unknown)
3329 /* Give it a chance to define it a a spec file. */
3330 save_switch (decoded->canonical_option[0],
3331 decoded->canonical_option_num_elements - 1,
3332 &decoded->canonical_option[1], false, false);
3333 return false;
3335 else
3336 return true;
3339 /* Handle an option DECODED that is not marked as CL_DRIVER.
3340 LANG_MASK will always be CL_DRIVER. */
3342 static void
3343 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3344 unsigned int lang_mask ATTRIBUTE_UNUSED)
3346 /* At this point, non-driver options are accepted (and expected to
3347 be passed down by specs) unless marked to be rejected by the
3348 driver. Options to be rejected by the driver but accepted by the
3349 compilers proper are treated just like completely unknown
3350 options. */
3351 const struct cl_option *option = &cl_options[decoded->opt_index];
3353 if (option->cl_reject_driver)
3354 error ("unrecognized command line option %qs",
3355 decoded->orig_option_with_args_text);
3356 else
3357 save_switch (decoded->canonical_option[0],
3358 decoded->canonical_option_num_elements - 1,
3359 &decoded->canonical_option[1], false, true);
3362 static const char *spec_lang = 0;
3363 static int last_language_n_infiles;
3365 /* Parse -foffload option argument. */
3367 static void
3368 handle_foffload_option (const char *arg)
3370 const char *c, *cur, *n, *next, *end;
3371 char *target;
3373 /* If option argument starts with '-' then no target is specified and we
3374 do not need to parse it. */
3375 if (arg[0] == '-')
3376 return;
3378 end = strchr (arg, '=');
3379 if (end == NULL)
3380 end = strchr (arg, '\0');
3381 cur = arg;
3383 while (cur < end)
3385 next = strchr (cur, ',');
3386 if (next == NULL)
3387 next = end;
3388 next = (next > end) ? end : next;
3390 target = XNEWVEC (char, next - cur + 1);
3391 memcpy (target, cur, next - cur);
3392 target[next - cur] = '\0';
3394 /* If 'disable' is passed to the option, stop parsing the option and clean
3395 the list of offload targets. */
3396 if (strcmp (target, "disable") == 0)
3398 free (offload_targets);
3399 offload_targets = xstrdup ("");
3400 break;
3403 /* Check that GCC is configured to support the offload target. */
3404 c = OFFLOAD_TARGETS;
3405 while (c)
3407 n = strchr (c, ',');
3408 if (n == NULL)
3409 n = strchr (c, '\0');
3411 if (next - cur == n - c && strncmp (target, c, n - c) == 0)
3412 break;
3414 c = *n ? n + 1 : NULL;
3417 if (!c)
3418 fatal_error ("GCC is not configured to support %s as offload target",
3419 target);
3421 if (!offload_targets)
3423 offload_targets = target;
3424 target = NULL;
3426 else
3428 /* Check that the target hasn't already presented in the list. */
3429 c = offload_targets;
3432 n = strchr (c, ':');
3433 if (n == NULL)
3434 n = strchr (c, '\0');
3436 if (next - cur == n - c && strncmp (c, target, n - c) == 0)
3437 break;
3439 c = n + 1;
3441 while (*n);
3443 /* If duplicate is not found, append the target to the list. */
3444 if (c > n)
3446 size_t offload_targets_len = strlen (offload_targets);
3447 offload_targets
3448 = XRESIZEVEC (char, offload_targets,
3449 offload_targets_len + next - cur + 2);
3450 if (offload_targets_len)
3451 offload_targets[offload_targets_len++] = ':';
3452 memcpy (offload_targets + offload_targets_len, target, next - cur);
3456 cur = next + 1;
3457 XDELETEVEC (target);
3461 /* Handle a driver option; arguments and return value as for
3462 handle_option. */
3464 static bool
3465 driver_handle_option (struct gcc_options *opts,
3466 struct gcc_options *opts_set,
3467 const struct cl_decoded_option *decoded,
3468 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
3469 location_t loc,
3470 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
3471 diagnostic_context *dc)
3473 size_t opt_index = decoded->opt_index;
3474 const char *arg = decoded->arg;
3475 const char *compare_debug_replacement_opt;
3476 int value = decoded->value;
3477 bool validated = false;
3478 bool do_save = true;
3480 gcc_assert (opts == &global_options);
3481 gcc_assert (opts_set == &global_options_set);
3482 gcc_assert (kind == DK_UNSPECIFIED);
3483 gcc_assert (loc == UNKNOWN_LOCATION);
3484 gcc_assert (dc == global_dc);
3486 switch (opt_index)
3488 case OPT_dumpspecs:
3490 struct spec_list *sl;
3491 init_spec ();
3492 for (sl = specs; sl; sl = sl->next)
3493 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3494 if (link_command_spec)
3495 printf ("*link_command:\n%s\n\n", link_command_spec);
3496 exit (0);
3499 case OPT_dumpversion:
3500 printf ("%s\n", spec_version);
3501 exit (0);
3503 case OPT_dumpmachine:
3504 printf ("%s\n", spec_machine);
3505 exit (0);
3507 case OPT__version:
3508 print_version = 1;
3510 /* CPP driver cannot obtain switch from cc1_options. */
3511 if (is_cpp_driver)
3512 add_preprocessor_option ("--version", strlen ("--version"));
3513 add_assembler_option ("--version", strlen ("--version"));
3514 add_linker_option ("--version", strlen ("--version"));
3515 break;
3517 case OPT__help:
3518 print_help_list = 1;
3520 /* CPP driver cannot obtain switch from cc1_options. */
3521 if (is_cpp_driver)
3522 add_preprocessor_option ("--help", 6);
3523 add_assembler_option ("--help", 6);
3524 add_linker_option ("--help", 6);
3525 break;
3527 case OPT__help_:
3528 print_subprocess_help = 2;
3529 break;
3531 case OPT__target_help:
3532 print_subprocess_help = 1;
3534 /* CPP driver cannot obtain switch from cc1_options. */
3535 if (is_cpp_driver)
3536 add_preprocessor_option ("--target-help", 13);
3537 add_assembler_option ("--target-help", 13);
3538 add_linker_option ("--target-help", 13);
3539 break;
3541 case OPT__no_sysroot_suffix:
3542 case OPT_pass_exit_codes:
3543 case OPT_print_search_dirs:
3544 case OPT_print_file_name_:
3545 case OPT_print_prog_name_:
3546 case OPT_print_multi_lib:
3547 case OPT_print_multi_directory:
3548 case OPT_print_sysroot:
3549 case OPT_print_multi_os_directory:
3550 case OPT_print_multiarch:
3551 case OPT_print_sysroot_headers_suffix:
3552 case OPT_time:
3553 case OPT_wrapper:
3554 /* These options set the variables specified in common.opt
3555 automatically, and do not need to be saved for spec
3556 processing. */
3557 do_save = false;
3558 break;
3560 case OPT_print_libgcc_file_name:
3561 print_file_name = "libgcc.a";
3562 do_save = false;
3563 break;
3565 case OPT_fuse_ld_bfd:
3566 use_ld = ".bfd";
3567 break;
3569 case OPT_fuse_ld_gold:
3570 use_ld = ".gold";
3571 break;
3573 case OPT_fcompare_debug_second:
3574 compare_debug_second = 1;
3575 break;
3577 case OPT_fcompare_debug:
3578 switch (value)
3580 case 0:
3581 compare_debug_replacement_opt = "-fcompare-debug=";
3582 arg = "";
3583 goto compare_debug_with_arg;
3585 case 1:
3586 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
3587 arg = "-gtoggle";
3588 goto compare_debug_with_arg;
3590 default:
3591 gcc_unreachable ();
3593 break;
3595 case OPT_fcompare_debug_:
3596 compare_debug_replacement_opt = decoded->canonical_option[0];
3597 compare_debug_with_arg:
3598 gcc_assert (decoded->canonical_option_num_elements == 1);
3599 gcc_assert (arg != NULL);
3600 if (*arg)
3601 compare_debug = 1;
3602 else
3603 compare_debug = -1;
3604 if (compare_debug < 0)
3605 compare_debug_opt = NULL;
3606 else
3607 compare_debug_opt = arg;
3608 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
3609 return true;
3611 case OPT_fdiagnostics_color_:
3612 diagnostic_color_init (dc, value);
3613 break;
3615 case OPT_Wa_:
3617 int prev, j;
3618 /* Pass the rest of this option to the assembler. */
3620 /* Split the argument at commas. */
3621 prev = 0;
3622 for (j = 0; arg[j]; j++)
3623 if (arg[j] == ',')
3625 add_assembler_option (arg + prev, j - prev);
3626 prev = j + 1;
3629 /* Record the part after the last comma. */
3630 add_assembler_option (arg + prev, j - prev);
3632 do_save = false;
3633 break;
3635 case OPT_Wp_:
3637 int prev, j;
3638 /* Pass the rest of this option to the preprocessor. */
3640 /* Split the argument at commas. */
3641 prev = 0;
3642 for (j = 0; arg[j]; j++)
3643 if (arg[j] == ',')
3645 add_preprocessor_option (arg + prev, j - prev);
3646 prev = j + 1;
3649 /* Record the part after the last comma. */
3650 add_preprocessor_option (arg + prev, j - prev);
3652 do_save = false;
3653 break;
3655 case OPT_Wl_:
3657 int prev, j;
3658 /* Split the argument at commas. */
3659 prev = 0;
3660 for (j = 0; arg[j]; j++)
3661 if (arg[j] == ',')
3663 add_infile (save_string (arg + prev, j - prev), "*");
3664 prev = j + 1;
3666 /* Record the part after the last comma. */
3667 add_infile (arg + prev, "*");
3669 do_save = false;
3670 break;
3672 case OPT_Xlinker:
3673 add_infile (arg, "*");
3674 do_save = false;
3675 break;
3677 case OPT_Xpreprocessor:
3678 add_preprocessor_option (arg, strlen (arg));
3679 do_save = false;
3680 break;
3682 case OPT_Xassembler:
3683 add_assembler_option (arg, strlen (arg));
3684 do_save = false;
3685 break;
3687 case OPT_l:
3688 /* POSIX allows separation of -l and the lib arg; canonicalize
3689 by concatenating -l with its arg */
3690 add_infile (concat ("-l", arg, NULL), "*");
3691 do_save = false;
3692 break;
3694 case OPT_L:
3695 /* Similarly, canonicalize -L for linkers that may not accept
3696 separate arguments. */
3697 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
3698 return true;
3700 case OPT_F:
3701 /* Likewise -F. */
3702 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
3703 return true;
3705 case OPT_save_temps:
3706 save_temps_flag = SAVE_TEMPS_CWD;
3707 validated = true;
3708 break;
3710 case OPT_save_temps_:
3711 if (strcmp (arg, "cwd") == 0)
3712 save_temps_flag = SAVE_TEMPS_CWD;
3713 else if (strcmp (arg, "obj") == 0
3714 || strcmp (arg, "object") == 0)
3715 save_temps_flag = SAVE_TEMPS_OBJ;
3716 else
3717 fatal_error ("%qs is an unknown -save-temps option",
3718 decoded->orig_option_with_args_text);
3719 break;
3721 case OPT_no_canonical_prefixes:
3722 /* Already handled as a special case, so ignored here. */
3723 do_save = false;
3724 break;
3726 case OPT_pipe:
3727 validated = true;
3728 /* These options set the variables specified in common.opt
3729 automatically, but do need to be saved for spec
3730 processing. */
3731 break;
3733 case OPT_specs_:
3735 struct user_specs *user = XNEW (struct user_specs);
3737 user->next = (struct user_specs *) 0;
3738 user->filename = arg;
3739 if (user_specs_tail)
3740 user_specs_tail->next = user;
3741 else
3742 user_specs_head = user;
3743 user_specs_tail = user;
3745 validated = true;
3746 break;
3748 case OPT__sysroot_:
3749 target_system_root = arg;
3750 target_system_root_changed = 1;
3751 do_save = false;
3752 break;
3754 case OPT_time_:
3755 if (report_times_to_file)
3756 fclose (report_times_to_file);
3757 report_times_to_file = fopen (arg, "a");
3758 do_save = false;
3759 break;
3761 case OPT____:
3762 /* "-###"
3763 This is similar to -v except that there is no execution
3764 of the commands and the echoed arguments are quoted. It
3765 is intended for use in shell scripts to capture the
3766 driver-generated command line. */
3767 verbose_only_flag++;
3768 verbose_flag = 1;
3769 do_save = false;
3770 break;
3772 case OPT_B:
3774 size_t len = strlen (arg);
3776 /* Catch the case where the user has forgotten to append a
3777 directory separator to the path. Note, they may be using
3778 -B to add an executable name prefix, eg "i386-elf-", in
3779 order to distinguish between multiple installations of
3780 GCC in the same directory. Hence we must check to see
3781 if appending a directory separator actually makes a
3782 valid directory name. */
3783 if (!IS_DIR_SEPARATOR (arg[len - 1])
3784 && is_directory (arg, false))
3786 char *tmp = XNEWVEC (char, len + 2);
3787 strcpy (tmp, arg);
3788 tmp[len] = DIR_SEPARATOR;
3789 tmp[++len] = 0;
3790 arg = tmp;
3793 add_prefix (&exec_prefixes, arg, NULL,
3794 PREFIX_PRIORITY_B_OPT, 0, 0);
3795 add_prefix (&startfile_prefixes, arg, NULL,
3796 PREFIX_PRIORITY_B_OPT, 0, 0);
3797 add_prefix (&include_prefixes, arg, NULL,
3798 PREFIX_PRIORITY_B_OPT, 0, 0);
3800 validated = true;
3801 break;
3803 case OPT_x:
3804 spec_lang = arg;
3805 if (!strcmp (spec_lang, "none"))
3806 /* Suppress the warning if -xnone comes after the last input
3807 file, because alternate command interfaces like g++ might
3808 find it useful to place -xnone after each input file. */
3809 spec_lang = 0;
3810 else
3811 last_language_n_infiles = n_infiles;
3812 do_save = false;
3813 break;
3815 case OPT_o:
3816 have_o = 1;
3817 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3818 arg = convert_filename (arg, ! have_c, 0);
3819 #endif
3820 output_file = arg;
3821 /* Save the output name in case -save-temps=obj was used. */
3822 save_temps_prefix = xstrdup (arg);
3823 /* On some systems, ld cannot handle "-o" without a space. So
3824 split the option from its argument. */
3825 save_switch ("-o", 1, &arg, validated, true);
3826 return true;
3828 case OPT_static_libgcc:
3829 case OPT_shared_libgcc:
3830 case OPT_static_libgfortran:
3831 case OPT_static_libstdc__:
3832 /* These are always valid, since gcc.c itself understands the
3833 first two, gfortranspec.c understands -static-libgfortran and
3834 g++spec.c understands -static-libstdc++ */
3835 validated = true;
3836 break;
3838 case OPT_fwpa:
3839 flag_wpa = "";
3840 break;
3842 case OPT_foffload_:
3843 handle_foffload_option (arg);
3844 break;
3846 default:
3847 /* Various driver options need no special processing at this
3848 point, having been handled in a prescan above or being
3849 handled by specs. */
3850 break;
3853 if (do_save)
3854 save_switch (decoded->canonical_option[0],
3855 decoded->canonical_option_num_elements - 1,
3856 &decoded->canonical_option[1], validated, true);
3857 return true;
3860 /* Put the driver's standard set of option handlers in *HANDLERS. */
3862 static void
3863 set_option_handlers (struct cl_option_handlers *handlers)
3865 handlers->unknown_option_callback = driver_unknown_option_callback;
3866 handlers->wrong_lang_callback = driver_wrong_lang_callback;
3867 handlers->num_handlers = 3;
3868 handlers->handlers[0].handler = driver_handle_option;
3869 handlers->handlers[0].mask = CL_DRIVER;
3870 handlers->handlers[1].handler = common_handle_option;
3871 handlers->handlers[1].mask = CL_COMMON;
3872 handlers->handlers[2].handler = target_handle_option;
3873 handlers->handlers[2].mask = CL_TARGET;
3876 /* Create the vector `switches' and its contents.
3877 Store its length in `n_switches'. */
3879 static void
3880 process_command (unsigned int decoded_options_count,
3881 struct cl_decoded_option *decoded_options)
3883 const char *temp;
3884 char *temp1;
3885 char *tooldir_prefix, *tooldir_prefix2;
3886 char *(*get_relative_prefix) (const char *, const char *,
3887 const char *) = NULL;
3888 struct cl_option_handlers handlers;
3889 unsigned int j;
3891 gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
3893 n_switches = 0;
3894 n_infiles = 0;
3895 added_libraries = 0;
3897 /* Figure compiler version from version string. */
3899 compiler_version = temp1 = xstrdup (version_string);
3901 for (; *temp1; ++temp1)
3903 if (*temp1 == ' ')
3905 *temp1 = '\0';
3906 break;
3910 /* Handle any -no-canonical-prefixes flag early, to assign the function
3911 that builds relative prefixes. This function creates default search
3912 paths that are needed later in normal option handling. */
3914 for (j = 1; j < decoded_options_count; j++)
3916 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
3918 get_relative_prefix = make_relative_prefix_ignore_links;
3919 break;
3922 if (! get_relative_prefix)
3923 get_relative_prefix = make_relative_prefix;
3925 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3926 see if we can create it from the pathname specified in
3927 decoded_options[0].arg. */
3929 gcc_libexec_prefix = standard_libexec_prefix;
3930 #ifndef VMS
3931 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3932 if (!gcc_exec_prefix)
3934 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
3935 standard_bindir_prefix,
3936 standard_exec_prefix);
3937 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
3938 standard_bindir_prefix,
3939 standard_libexec_prefix);
3940 if (gcc_exec_prefix)
3941 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3943 else
3945 /* make_relative_prefix requires a program name, but
3946 GCC_EXEC_PREFIX is typically a directory name with a trailing
3947 / (which is ignored by make_relative_prefix), so append a
3948 program name. */
3949 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
3950 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3951 standard_exec_prefix,
3952 standard_libexec_prefix);
3954 /* The path is unrelocated, so fallback to the original setting. */
3955 if (!gcc_libexec_prefix)
3956 gcc_libexec_prefix = standard_libexec_prefix;
3958 free (tmp_prefix);
3960 #else
3961 #endif
3962 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3963 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
3964 or an automatically created GCC_EXEC_PREFIX from
3965 decoded_options[0].arg. */
3967 /* Do language-specific adjustment/addition of flags. */
3968 lang_specific_driver (&decoded_options, &decoded_options_count,
3969 &added_libraries);
3971 if (gcc_exec_prefix)
3973 int len = strlen (gcc_exec_prefix);
3975 if (len > (int) sizeof ("/lib/gcc/") - 1
3976 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3978 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3979 if (IS_DIR_SEPARATOR (*temp)
3980 && filename_ncmp (temp + 1, "lib", 3) == 0
3981 && IS_DIR_SEPARATOR (temp[4])
3982 && filename_ncmp (temp + 5, "gcc", 3) == 0)
3983 len -= sizeof ("/lib/gcc/") - 1;
3986 set_std_prefix (gcc_exec_prefix, len);
3987 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3988 PREFIX_PRIORITY_LAST, 0, 0);
3989 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3990 PREFIX_PRIORITY_LAST, 0, 0);
3993 /* COMPILER_PATH and LIBRARY_PATH have values
3994 that are lists of directory names with colons. */
3996 temp = getenv ("COMPILER_PATH");
3997 if (temp)
3999 const char *startp, *endp;
4000 char *nstore = (char *) alloca (strlen (temp) + 3);
4002 startp = endp = temp;
4003 while (1)
4005 if (*endp == PATH_SEPARATOR || *endp == 0)
4007 strncpy (nstore, startp, endp - startp);
4008 if (endp == startp)
4009 strcpy (nstore, concat (".", dir_separator_str, NULL));
4010 else if (!IS_DIR_SEPARATOR (endp[-1]))
4012 nstore[endp - startp] = DIR_SEPARATOR;
4013 nstore[endp - startp + 1] = 0;
4015 else
4016 nstore[endp - startp] = 0;
4017 add_prefix (&exec_prefixes, nstore, 0,
4018 PREFIX_PRIORITY_LAST, 0, 0);
4019 add_prefix (&include_prefixes, nstore, 0,
4020 PREFIX_PRIORITY_LAST, 0, 0);
4021 if (*endp == 0)
4022 break;
4023 endp = startp = endp + 1;
4025 else
4026 endp++;
4030 temp = getenv (LIBRARY_PATH_ENV);
4031 if (temp && *cross_compile == '0')
4033 const char *startp, *endp;
4034 char *nstore = (char *) alloca (strlen (temp) + 3);
4036 startp = endp = temp;
4037 while (1)
4039 if (*endp == PATH_SEPARATOR || *endp == 0)
4041 strncpy (nstore, startp, endp - startp);
4042 if (endp == startp)
4043 strcpy (nstore, concat (".", dir_separator_str, NULL));
4044 else if (!IS_DIR_SEPARATOR (endp[-1]))
4046 nstore[endp - startp] = DIR_SEPARATOR;
4047 nstore[endp - startp + 1] = 0;
4049 else
4050 nstore[endp - startp] = 0;
4051 add_prefix (&startfile_prefixes, nstore, NULL,
4052 PREFIX_PRIORITY_LAST, 0, 1);
4053 if (*endp == 0)
4054 break;
4055 endp = startp = endp + 1;
4057 else
4058 endp++;
4062 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4063 temp = getenv ("LPATH");
4064 if (temp && *cross_compile == '0')
4066 const char *startp, *endp;
4067 char *nstore = (char *) alloca (strlen (temp) + 3);
4069 startp = endp = temp;
4070 while (1)
4072 if (*endp == PATH_SEPARATOR || *endp == 0)
4074 strncpy (nstore, startp, endp - startp);
4075 if (endp == startp)
4076 strcpy (nstore, concat (".", dir_separator_str, NULL));
4077 else if (!IS_DIR_SEPARATOR (endp[-1]))
4079 nstore[endp - startp] = DIR_SEPARATOR;
4080 nstore[endp - startp + 1] = 0;
4082 else
4083 nstore[endp - startp] = 0;
4084 add_prefix (&startfile_prefixes, nstore, NULL,
4085 PREFIX_PRIORITY_LAST, 0, 1);
4086 if (*endp == 0)
4087 break;
4088 endp = startp = endp + 1;
4090 else
4091 endp++;
4095 /* Process the options and store input files and switches in their
4096 vectors. */
4098 last_language_n_infiles = -1;
4100 set_option_handlers (&handlers);
4102 for (j = 1; j < decoded_options_count; j++)
4104 switch (decoded_options[j].opt_index)
4106 case OPT_S:
4107 case OPT_c:
4108 case OPT_E:
4109 have_c = 1;
4110 break;
4112 if (have_c)
4113 break;
4116 for (j = 1; j < decoded_options_count; j++)
4118 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4120 const char *arg = decoded_options[j].arg;
4121 const char *p = strrchr (arg, '@');
4122 char *fname;
4123 long offset;
4124 int consumed;
4125 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4126 arg = convert_filename (arg, 0, access (arg, F_OK));
4127 #endif
4128 /* For LTO static archive support we handle input file
4129 specifications that are composed of a filename and
4130 an offset like FNAME@OFFSET. */
4131 if (p
4132 && p != arg
4133 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4134 && strlen (p) == (unsigned int)consumed)
4136 fname = (char *)xmalloc (p - arg + 1);
4137 memcpy (fname, arg, p - arg);
4138 fname[p - arg] = '\0';
4139 /* Only accept non-stdin and existing FNAME parts, otherwise
4140 try with the full name. */
4141 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4143 free (fname);
4144 fname = xstrdup (arg);
4147 else
4148 fname = xstrdup (arg);
4150 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4151 perror_with_name (fname);
4152 else
4153 add_infile (arg, spec_lang);
4155 free (fname);
4156 continue;
4159 read_cmdline_option (&global_options, &global_options_set,
4160 decoded_options + j, UNKNOWN_LOCATION,
4161 CL_DRIVER, &handlers, global_dc);
4164 if (output_file
4165 && strcmp (output_file, "-") != 0
4166 && strcmp (output_file, HOST_BIT_BUCKET) != 0)
4168 int i;
4169 for (i = 0; i < n_infiles; i++)
4170 if ((!infiles[i].language || infiles[i].language[0] != '*')
4171 && canonical_filename_eq (infiles[i].name, output_file))
4172 fatal_error ("input file %qs is the same as output file",
4173 output_file);
4176 /* If -save-temps=obj and -o name, create the prefix to use for %b.
4177 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
4178 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4180 save_temps_length = strlen (save_temps_prefix);
4181 temp = strrchr (lbasename (save_temps_prefix), '.');
4182 if (temp)
4184 save_temps_length -= strlen (temp);
4185 save_temps_prefix[save_temps_length] = '\0';
4189 else if (save_temps_prefix != NULL)
4191 free (save_temps_prefix);
4192 save_temps_prefix = NULL;
4195 if (save_temps_flag && use_pipes)
4197 /* -save-temps overrides -pipe, so that temp files are produced */
4198 if (save_temps_flag)
4199 warning (0, "-pipe ignored because -save-temps specified");
4200 use_pipes = 0;
4203 if (!compare_debug)
4205 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
4207 if (gcd && gcd[0] == '-')
4209 compare_debug = 2;
4210 compare_debug_opt = gcd;
4212 else if (gcd && *gcd && strcmp (gcd, "0"))
4214 compare_debug = 3;
4215 compare_debug_opt = "-gtoggle";
4218 else if (compare_debug < 0)
4220 compare_debug = 0;
4221 gcc_assert (!compare_debug_opt);
4224 /* Set up the search paths. We add directories that we expect to
4225 contain GNU Toolchain components before directories specified by
4226 the machine description so that we will find GNU components (like
4227 the GNU assembler) before those of the host system. */
4229 /* If we don't know where the toolchain has been installed, use the
4230 configured-in locations. */
4231 if (!gcc_exec_prefix)
4233 #ifndef OS2
4234 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4235 PREFIX_PRIORITY_LAST, 1, 0);
4236 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4237 PREFIX_PRIORITY_LAST, 2, 0);
4238 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4239 PREFIX_PRIORITY_LAST, 2, 0);
4240 #endif
4241 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4242 PREFIX_PRIORITY_LAST, 1, 0);
4245 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4246 tooldir_prefix2 = concat (tooldir_base_prefix, spec_host_machine,
4247 dir_separator_str, NULL);
4249 /* Look for tools relative to the location from which the driver is
4250 running, or, if that is not available, the configured prefix. */
4251 tooldir_prefix
4252 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4253 spec_host_machine, dir_separator_str, spec_version,
4254 accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL);
4255 free (tooldir_prefix2);
4257 add_prefix (&exec_prefixes,
4258 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4259 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4260 add_prefix (&startfile_prefixes,
4261 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4262 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4263 free (tooldir_prefix);
4265 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4266 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4267 then consider it to relocate with the rest of the GCC installation
4268 if GCC_EXEC_PREFIX is set.
4269 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4270 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4272 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
4273 standard_bindir_prefix,
4274 target_system_root);
4275 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4277 target_system_root = tmp_prefix;
4278 target_system_root_changed = 1;
4281 #endif
4283 /* More prefixes are enabled in main, after we read the specs file
4284 and determine whether this is cross-compilation or not. */
4286 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4287 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4289 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4290 environment variable. */
4291 if (compare_debug == 2 || compare_debug == 3)
4293 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4294 save_switch (opt, 0, NULL, false, true);
4295 compare_debug = 1;
4298 /* Ensure we only invoke each subprocess once. */
4299 if (print_subprocess_help || print_help_list || print_version)
4301 n_infiles = 0;
4303 /* Create a dummy input file, so that we can pass
4304 the help option on to the various sub-processes. */
4305 add_infile ("help-dummy", "c");
4308 alloc_switch ();
4309 switches[n_switches].part1 = 0;
4310 alloc_infile ();
4311 infiles[n_infiles].name = 0;
4314 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4315 and place that in the environment. */
4317 static void
4318 set_collect_gcc_options (void)
4320 int i;
4321 int first_time;
4323 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4324 the compiler. */
4325 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4326 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4328 first_time = TRUE;
4329 for (i = 0; (int) i < n_switches; i++)
4331 const char *const *args;
4332 const char *p, *q;
4333 if (!first_time)
4334 obstack_grow (&collect_obstack, " ", 1);
4336 first_time = FALSE;
4338 /* Ignore elided switches. */
4339 if ((switches[i].live_cond
4340 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4341 == SWITCH_IGNORE)
4342 continue;
4344 obstack_grow (&collect_obstack, "'-", 2);
4345 q = switches[i].part1;
4346 while ((p = strchr (q, '\'')))
4348 obstack_grow (&collect_obstack, q, p - q);
4349 obstack_grow (&collect_obstack, "'\\''", 4);
4350 q = ++p;
4352 obstack_grow (&collect_obstack, q, strlen (q));
4353 obstack_grow (&collect_obstack, "'", 1);
4355 for (args = switches[i].args; args && *args; args++)
4357 obstack_grow (&collect_obstack, " '", 2);
4358 q = *args;
4359 while ((p = strchr (q, '\'')))
4361 obstack_grow (&collect_obstack, q, p - q);
4362 obstack_grow (&collect_obstack, "'\\''", 4);
4363 q = ++p;
4365 obstack_grow (&collect_obstack, q, strlen (q));
4366 obstack_grow (&collect_obstack, "'", 1);
4369 obstack_grow (&collect_obstack, "\0", 1);
4370 xputenv (XOBFINISH (&collect_obstack, char *));
4373 /* Process a spec string, accumulating and running commands. */
4375 /* These variables describe the input file name.
4376 input_file_number is the index on outfiles of this file,
4377 so that the output file name can be stored for later use by %o.
4378 input_basename is the start of the part of the input file
4379 sans all directory names, and basename_length is the number
4380 of characters starting there excluding the suffix .c or whatever. */
4382 static const char *gcc_input_filename;
4383 static int input_file_number;
4384 size_t input_filename_length;
4385 static int basename_length;
4386 static int suffixed_basename_length;
4387 static const char *input_basename;
4388 static const char *input_suffix;
4389 #ifndef HOST_LACKS_INODE_NUMBERS
4390 static struct stat input_stat;
4391 #endif
4392 static int input_stat_set;
4394 /* The compiler used to process the current input file. */
4395 static struct compiler *input_file_compiler;
4397 /* These are variables used within do_spec and do_spec_1. */
4399 /* Nonzero if an arg has been started and not yet terminated
4400 (with space, tab or newline). */
4401 static int arg_going;
4403 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4404 is a temporary file name. */
4405 static int delete_this_arg;
4407 /* Nonzero means %w has been seen; the next arg to be terminated
4408 is the output file name of this compilation. */
4409 static int this_is_output_file;
4411 /* Nonzero means %s has been seen; the next arg to be terminated
4412 is the name of a library file and we should try the standard
4413 search dirs for it. */
4414 static int this_is_library_file;
4416 /* Nonzero means %T has been seen; the next arg to be terminated
4417 is the name of a linker script and we should try all of the
4418 standard search dirs for it. If it is found insert a --script
4419 command line switch and then substitute the full path in place,
4420 otherwise generate an error message. */
4421 static int this_is_linker_script;
4423 /* Nonzero means that the input of this command is coming from a pipe. */
4424 static int input_from_pipe;
4426 /* Nonnull means substitute this for any suffix when outputting a switches
4427 arguments. */
4428 static const char *suffix_subst;
4430 /* If there is an argument being accumulated, terminate it and store it. */
4432 static void
4433 end_going_arg (void)
4435 if (arg_going)
4437 const char *string;
4439 obstack_1grow (&obstack, 0);
4440 string = XOBFINISH (&obstack, const char *);
4441 if (this_is_library_file)
4442 string = find_file (string);
4443 if (this_is_linker_script)
4445 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4447 if (full_script_path == NULL)
4449 error ("unable to locate default linker script %qs in the library search paths", string);
4450 /* Script was not found on search path. */
4451 return;
4453 store_arg ("--script", false, false);
4454 string = full_script_path;
4456 store_arg (string, delete_this_arg, this_is_output_file);
4457 if (this_is_output_file)
4458 outfiles[input_file_number] = string;
4459 arg_going = 0;
4464 /* Parse the WRAPPER string which is a comma separated list of the command line
4465 and insert them into the beginning of argbuf. */
4467 static void
4468 insert_wrapper (const char *wrapper)
4470 int n = 0;
4471 int i;
4472 char *buf = xstrdup (wrapper);
4473 char *p = buf;
4474 unsigned int old_length = argbuf.length ();
4478 n++;
4479 while (*p == ',')
4480 p++;
4482 while ((p = strchr (p, ',')) != NULL);
4484 argbuf.safe_grow (old_length + n);
4485 memmove (argbuf.address () + n,
4486 argbuf.address (),
4487 old_length * sizeof (const_char_p));
4489 i = 0;
4490 p = buf;
4493 while (*p == ',')
4495 *p = 0;
4496 p++;
4498 argbuf[i] = p;
4499 i++;
4501 while ((p = strchr (p, ',')) != NULL);
4502 gcc_assert (i == n);
4505 /* Process the spec SPEC and run the commands specified therein.
4506 Returns 0 if the spec is successfully processed; -1 if failed. */
4509 do_spec (const char *spec)
4511 int value;
4513 value = do_spec_2 (spec);
4515 /* Force out any unfinished command.
4516 If -pipe, this forces out the last command if it ended in `|'. */
4517 if (value == 0)
4519 if (argbuf.length () > 0
4520 && !strcmp (argbuf.last (), "|"))
4521 argbuf.pop ();
4523 set_collect_gcc_options ();
4525 if (argbuf.length () > 0)
4526 value = execute ();
4529 return value;
4532 static int
4533 do_spec_2 (const char *spec)
4535 int result;
4537 clear_args ();
4538 arg_going = 0;
4539 delete_this_arg = 0;
4540 this_is_output_file = 0;
4541 this_is_library_file = 0;
4542 this_is_linker_script = 0;
4543 input_from_pipe = 0;
4544 suffix_subst = NULL;
4546 result = do_spec_1 (spec, 0, NULL);
4548 end_going_arg ();
4550 return result;
4554 /* Process the given spec string and add any new options to the end
4555 of the switches/n_switches array. */
4557 static void
4558 do_option_spec (const char *name, const char *spec)
4560 unsigned int i, value_count, value_len;
4561 const char *p, *q, *value;
4562 char *tmp_spec, *tmp_spec_p;
4564 if (configure_default_options[0].name == NULL)
4565 return;
4567 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4568 if (strcmp (configure_default_options[i].name, name) == 0)
4569 break;
4570 if (i == ARRAY_SIZE (configure_default_options))
4571 return;
4573 value = configure_default_options[i].value;
4574 value_len = strlen (value);
4576 /* Compute the size of the final spec. */
4577 value_count = 0;
4578 p = spec;
4579 while ((p = strstr (p, "%(VALUE)")) != NULL)
4581 p ++;
4582 value_count ++;
4585 /* Replace each %(VALUE) by the specified value. */
4586 tmp_spec = (char *) alloca (strlen (spec) + 1
4587 + value_count * (value_len - strlen ("%(VALUE)")));
4588 tmp_spec_p = tmp_spec;
4589 q = spec;
4590 while ((p = strstr (q, "%(VALUE)")) != NULL)
4592 memcpy (tmp_spec_p, q, p - q);
4593 tmp_spec_p = tmp_spec_p + (p - q);
4594 memcpy (tmp_spec_p, value, value_len);
4595 tmp_spec_p += value_len;
4596 q = p + strlen ("%(VALUE)");
4598 strcpy (tmp_spec_p, q);
4600 do_self_spec (tmp_spec);
4603 /* Process the given spec string and add any new options to the end
4604 of the switches/n_switches array. */
4606 static void
4607 do_self_spec (const char *spec)
4609 int i;
4611 do_spec_2 (spec);
4612 do_spec_1 (" ", 0, NULL);
4614 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4615 do_self_specs adds the replacements to switches array, so it shouldn't
4616 be processed afterwards. */
4617 for (i = 0; i < n_switches; i++)
4618 if ((switches[i].live_cond & SWITCH_IGNORE))
4619 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4621 if (argbuf.length () > 0)
4623 const char **argbuf_copy;
4624 struct cl_decoded_option *decoded_options;
4625 struct cl_option_handlers handlers;
4626 unsigned int decoded_options_count;
4627 unsigned int j;
4629 /* Create a copy of argbuf with a dummy argv[0] entry for
4630 decode_cmdline_options_to_array. */
4631 argbuf_copy = XNEWVEC (const char *,
4632 argbuf.length () + 1);
4633 argbuf_copy[0] = "";
4634 memcpy (argbuf_copy + 1, argbuf.address (),
4635 argbuf.length () * sizeof (const char *));
4637 decode_cmdline_options_to_array (argbuf.length () + 1,
4638 argbuf_copy,
4639 CL_DRIVER, &decoded_options,
4640 &decoded_options_count);
4641 free (argbuf_copy);
4643 set_option_handlers (&handlers);
4645 for (j = 1; j < decoded_options_count; j++)
4647 switch (decoded_options[j].opt_index)
4649 case OPT_SPECIAL_input_file:
4650 /* Specs should only generate options, not input
4651 files. */
4652 if (strcmp (decoded_options[j].arg, "-") != 0)
4653 fatal_error ("switch %qs does not start with %<-%>",
4654 decoded_options[j].arg);
4655 else
4656 fatal_error ("spec-generated switch is just %<-%>");
4657 break;
4659 case OPT_fcompare_debug_second:
4660 case OPT_fcompare_debug:
4661 case OPT_fcompare_debug_:
4662 case OPT_o:
4663 /* Avoid duplicate processing of some options from
4664 compare-debug specs; just save them here. */
4665 save_switch (decoded_options[j].canonical_option[0],
4666 (decoded_options[j].canonical_option_num_elements
4667 - 1),
4668 &decoded_options[j].canonical_option[1], false, true);
4669 break;
4671 default:
4672 read_cmdline_option (&global_options, &global_options_set,
4673 decoded_options + j, UNKNOWN_LOCATION,
4674 CL_DRIVER, &handlers, global_dc);
4675 break;
4679 alloc_switch ();
4680 switches[n_switches].part1 = 0;
4684 /* Callback for processing %D and %I specs. */
4686 struct spec_path_info {
4687 const char *option;
4688 const char *append;
4689 size_t append_len;
4690 bool omit_relative;
4691 bool separate_options;
4694 static void *
4695 spec_path (char *path, void *data)
4697 struct spec_path_info *info = (struct spec_path_info *) data;
4698 size_t len = 0;
4699 char save = 0;
4701 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4702 return NULL;
4704 if (info->append_len != 0)
4706 len = strlen (path);
4707 memcpy (path + len, info->append, info->append_len + 1);
4710 if (!is_directory (path, true))
4711 return NULL;
4713 do_spec_1 (info->option, 1, NULL);
4714 if (info->separate_options)
4715 do_spec_1 (" ", 0, NULL);
4717 if (info->append_len == 0)
4719 len = strlen (path);
4720 save = path[len - 1];
4721 if (IS_DIR_SEPARATOR (path[len - 1]))
4722 path[len - 1] = '\0';
4725 do_spec_1 (path, 1, NULL);
4726 do_spec_1 (" ", 0, NULL);
4728 /* Must not damage the original path. */
4729 if (info->append_len == 0)
4730 path[len - 1] = save;
4732 return NULL;
4735 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4736 argument list. */
4738 static void
4739 create_at_file (char **argv)
4741 char *temp_file = make_temp_file ("");
4742 char *at_argument = concat ("@", temp_file, NULL);
4743 FILE *f = fopen (temp_file, "w");
4744 int status;
4746 if (f == NULL)
4747 fatal_error ("could not open temporary response file %s",
4748 temp_file);
4750 status = writeargv (argv, f);
4752 if (status)
4753 fatal_error ("could not write to temporary response file %s",
4754 temp_file);
4756 status = fclose (f);
4758 if (EOF == status)
4759 fatal_error ("could not close temporary response file %s",
4760 temp_file);
4762 store_arg (at_argument, 0, 0);
4764 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
4767 /* True if we should compile INFILE. */
4769 static bool
4770 compile_input_file_p (struct infile *infile)
4772 if ((!infile->language) || (infile->language[0] != '*'))
4773 if (infile->incompiler == input_file_compiler)
4774 return true;
4775 return false;
4778 /* Process each member of VEC as a spec. */
4780 static void
4781 do_specs_vec (vec<char_p> vec)
4783 unsigned ix;
4784 char *opt;
4786 FOR_EACH_VEC_ELT (vec, ix, opt)
4788 do_spec_1 (opt, 1, NULL);
4789 /* Make each accumulated option a separate argument. */
4790 do_spec_1 (" ", 0, NULL);
4794 /* Process the sub-spec SPEC as a portion of a larger spec.
4795 This is like processing a whole spec except that we do
4796 not initialize at the beginning and we do not supply a
4797 newline by default at the end.
4798 INSWITCH nonzero means don't process %-sequences in SPEC;
4799 in this case, % is treated as an ordinary character.
4800 This is used while substituting switches.
4801 INSWITCH nonzero also causes SPC not to terminate an argument.
4803 Value is zero unless a line was finished
4804 and the command on that line reported an error. */
4806 static int
4807 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4809 const char *p = spec;
4810 int c;
4811 int i;
4812 int value;
4814 /* If it's an empty string argument to a switch, keep it as is. */
4815 if (inswitch && !*p)
4816 arg_going = 1;
4818 while ((c = *p++))
4819 /* If substituting a switch, treat all chars like letters.
4820 Otherwise, NL, SPC, TAB and % are special. */
4821 switch (inswitch ? 'a' : c)
4823 case '\n':
4824 end_going_arg ();
4826 if (argbuf.length () > 0
4827 && !strcmp (argbuf.last (), "|"))
4829 /* A `|' before the newline means use a pipe here,
4830 but only if -pipe was specified.
4831 Otherwise, execute now and don't pass the `|' as an arg. */
4832 if (use_pipes)
4834 input_from_pipe = 1;
4835 break;
4837 else
4838 argbuf.pop ();
4841 set_collect_gcc_options ();
4843 if (argbuf.length () > 0)
4845 value = execute ();
4846 if (value)
4847 return value;
4849 /* Reinitialize for a new command, and for a new argument. */
4850 clear_args ();
4851 arg_going = 0;
4852 delete_this_arg = 0;
4853 this_is_output_file = 0;
4854 this_is_library_file = 0;
4855 this_is_linker_script = 0;
4856 input_from_pipe = 0;
4857 break;
4859 case '|':
4860 end_going_arg ();
4862 /* Use pipe */
4863 obstack_1grow (&obstack, c);
4864 arg_going = 1;
4865 break;
4867 case '\t':
4868 case ' ':
4869 end_going_arg ();
4871 /* Reinitialize for a new argument. */
4872 delete_this_arg = 0;
4873 this_is_output_file = 0;
4874 this_is_library_file = 0;
4875 this_is_linker_script = 0;
4876 break;
4878 case '%':
4879 switch (c = *p++)
4881 case 0:
4882 fatal_error ("spec %qs invalid", spec);
4884 case 'b':
4885 if (save_temps_length)
4886 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4887 else
4888 obstack_grow (&obstack, input_basename, basename_length);
4889 if (compare_debug < 0)
4890 obstack_grow (&obstack, ".gk", 3);
4891 arg_going = 1;
4892 break;
4894 case 'B':
4895 if (save_temps_length)
4896 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4897 else
4898 obstack_grow (&obstack, input_basename, suffixed_basename_length);
4899 if (compare_debug < 0)
4900 obstack_grow (&obstack, ".gk", 3);
4901 arg_going = 1;
4902 break;
4904 case 'd':
4905 delete_this_arg = 2;
4906 break;
4908 /* Dump out the directories specified with LIBRARY_PATH,
4909 followed by the absolute directories
4910 that we search for startfiles. */
4911 case 'D':
4913 struct spec_path_info info;
4915 info.option = "-L";
4916 info.append_len = 0;
4917 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4918 /* Used on systems which record the specified -L dirs
4919 and use them to search for dynamic linking.
4920 Relative directories always come from -B,
4921 and it is better not to use them for searching
4922 at run time. In particular, stage1 loses. */
4923 info.omit_relative = true;
4924 #else
4925 info.omit_relative = false;
4926 #endif
4927 info.separate_options = false;
4929 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
4931 break;
4933 case 'e':
4934 /* %efoo means report an error with `foo' as error message
4935 and don't execute any more commands for this file. */
4937 const char *q = p;
4938 char *buf;
4939 while (*p != 0 && *p != '\n')
4940 p++;
4941 buf = (char *) alloca (p - q + 1);
4942 strncpy (buf, q, p - q);
4943 buf[p - q] = 0;
4944 error ("%s", _(buf));
4945 return -1;
4947 break;
4948 case 'n':
4949 /* %nfoo means report a notice with `foo' on stderr. */
4951 const char *q = p;
4952 char *buf;
4953 while (*p != 0 && *p != '\n')
4954 p++;
4955 buf = (char *) alloca (p - q + 1);
4956 strncpy (buf, q, p - q);
4957 buf[p - q] = 0;
4958 inform (0, "%s", _(buf));
4959 if (*p)
4960 p++;
4962 break;
4964 case 'j':
4966 struct stat st;
4968 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4969 defined, and it is not a directory, and it is
4970 writable, use it. Otherwise, treat this like any
4971 other temporary file. */
4973 if ((!save_temps_flag)
4974 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4975 && (access (HOST_BIT_BUCKET, W_OK) == 0))
4977 obstack_grow (&obstack, HOST_BIT_BUCKET,
4978 strlen (HOST_BIT_BUCKET));
4979 delete_this_arg = 0;
4980 arg_going = 1;
4981 break;
4984 goto create_temp_file;
4985 case '|':
4986 if (use_pipes)
4988 obstack_1grow (&obstack, '-');
4989 delete_this_arg = 0;
4990 arg_going = 1;
4992 /* consume suffix */
4993 while (*p == '.' || ISALNUM ((unsigned char) *p))
4994 p++;
4995 if (p[0] == '%' && p[1] == 'O')
4996 p += 2;
4998 break;
5000 goto create_temp_file;
5001 case 'm':
5002 if (use_pipes)
5004 /* consume suffix */
5005 while (*p == '.' || ISALNUM ((unsigned char) *p))
5006 p++;
5007 if (p[0] == '%' && p[1] == 'O')
5008 p += 2;
5010 break;
5012 goto create_temp_file;
5013 case 'g':
5014 case 'u':
5015 case 'U':
5016 create_temp_file:
5018 struct temp_name *t;
5019 int suffix_length;
5020 const char *suffix = p;
5021 char *saved_suffix = NULL;
5023 while (*p == '.' || ISALNUM ((unsigned char) *p))
5024 p++;
5025 suffix_length = p - suffix;
5026 if (p[0] == '%' && p[1] == 'O')
5028 p += 2;
5029 /* We don't support extra suffix characters after %O. */
5030 if (*p == '.' || ISALNUM ((unsigned char) *p))
5031 fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
5032 if (suffix_length == 0)
5033 suffix = TARGET_OBJECT_SUFFIX;
5034 else
5036 saved_suffix
5037 = XNEWVEC (char, suffix_length
5038 + strlen (TARGET_OBJECT_SUFFIX) + 1);
5039 strncpy (saved_suffix, suffix, suffix_length);
5040 strcpy (saved_suffix + suffix_length,
5041 TARGET_OBJECT_SUFFIX);
5043 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5046 if (compare_debug < 0)
5048 suffix = concat (".gk", suffix, NULL);
5049 suffix_length += 3;
5052 /* If -save-temps=obj and -o were specified, use that for the
5053 temp file. */
5054 if (save_temps_length)
5056 char *tmp;
5057 temp_filename_length
5058 = save_temps_length + suffix_length + 1;
5059 tmp = (char *) alloca (temp_filename_length);
5060 memcpy (tmp, save_temps_prefix, save_temps_length);
5061 memcpy (tmp + save_temps_length, suffix, suffix_length);
5062 tmp[save_temps_length + suffix_length] = '\0';
5063 temp_filename = save_string (tmp, save_temps_length
5064 + suffix_length);
5065 obstack_grow (&obstack, temp_filename,
5066 temp_filename_length);
5067 arg_going = 1;
5068 delete_this_arg = 0;
5069 break;
5072 /* If the gcc_input_filename has the same suffix specified
5073 for the %g, %u, or %U, and -save-temps is specified,
5074 we could end up using that file as an intermediate
5075 thus clobbering the user's source file (.e.g.,
5076 gcc -save-temps foo.s would clobber foo.s with the
5077 output of cpp0). So check for this condition and
5078 generate a temp file as the intermediate. */
5080 if (save_temps_flag)
5082 char *tmp;
5083 temp_filename_length = basename_length + suffix_length + 1;
5084 tmp = (char *) alloca (temp_filename_length);
5085 memcpy (tmp, input_basename, basename_length);
5086 memcpy (tmp + basename_length, suffix, suffix_length);
5087 tmp[basename_length + suffix_length] = '\0';
5088 temp_filename = tmp;
5090 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
5092 #ifndef HOST_LACKS_INODE_NUMBERS
5093 struct stat st_temp;
5095 /* Note, set_input() resets input_stat_set to 0. */
5096 if (input_stat_set == 0)
5098 input_stat_set = stat (gcc_input_filename,
5099 &input_stat);
5100 if (input_stat_set >= 0)
5101 input_stat_set = 1;
5104 /* If we have the stat for the gcc_input_filename
5105 and we can do the stat for the temp_filename
5106 then the they could still refer to the same
5107 file if st_dev/st_ino's are the same. */
5108 if (input_stat_set != 1
5109 || stat (temp_filename, &st_temp) < 0
5110 || input_stat.st_dev != st_temp.st_dev
5111 || input_stat.st_ino != st_temp.st_ino)
5112 #else
5113 /* Just compare canonical pathnames. */
5114 char* input_realname = lrealpath (gcc_input_filename);
5115 char* temp_realname = lrealpath (temp_filename);
5116 bool files_differ = filename_cmp (input_realname, temp_realname);
5117 free (input_realname);
5118 free (temp_realname);
5119 if (files_differ)
5120 #endif
5122 temp_filename = save_string (temp_filename,
5123 temp_filename_length + 1);
5124 obstack_grow (&obstack, temp_filename,
5125 temp_filename_length);
5126 arg_going = 1;
5127 delete_this_arg = 0;
5128 break;
5133 /* See if we already have an association of %g/%u/%U and
5134 suffix. */
5135 for (t = temp_names; t; t = t->next)
5136 if (t->length == suffix_length
5137 && strncmp (t->suffix, suffix, suffix_length) == 0
5138 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5139 break;
5141 /* Make a new association if needed. %u and %j
5142 require one. */
5143 if (t == 0 || c == 'u' || c == 'j')
5145 if (t == 0)
5147 t = XNEW (struct temp_name);
5148 t->next = temp_names;
5149 temp_names = t;
5151 t->length = suffix_length;
5152 if (saved_suffix)
5154 t->suffix = saved_suffix;
5155 saved_suffix = NULL;
5157 else
5158 t->suffix = save_string (suffix, suffix_length);
5159 t->unique = (c == 'u' || c == 'U' || c == 'j');
5160 temp_filename = make_temp_file (t->suffix);
5161 temp_filename_length = strlen (temp_filename);
5162 t->filename = temp_filename;
5163 t->filename_length = temp_filename_length;
5166 free (saved_suffix);
5168 obstack_grow (&obstack, t->filename, t->filename_length);
5169 delete_this_arg = 1;
5171 arg_going = 1;
5172 break;
5174 case 'i':
5175 if (combine_inputs)
5177 if (at_file_supplied)
5179 /* We are going to expand `%i' to `@FILE', where FILE
5180 is a newly-created temporary filename. The filenames
5181 that would usually be expanded in place of %o will be
5182 written to the temporary file. */
5183 char **argv;
5184 int n_files = 0;
5185 int j;
5187 for (i = 0; i < n_infiles; i++)
5188 if (compile_input_file_p (&infiles[i]))
5189 n_files++;
5191 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5193 /* Copy the strings over. */
5194 for (i = 0, j = 0; i < n_infiles; i++)
5195 if (compile_input_file_p (&infiles[i]))
5197 argv[j] = CONST_CAST (char *, infiles[i].name);
5198 infiles[i].compiled = true;
5199 j++;
5201 argv[j] = NULL;
5203 create_at_file (argv);
5205 else
5206 for (i = 0; (int) i < n_infiles; i++)
5207 if (compile_input_file_p (&infiles[i]))
5209 store_arg (infiles[i].name, 0, 0);
5210 infiles[i].compiled = true;
5213 else
5215 obstack_grow (&obstack, gcc_input_filename,
5216 input_filename_length);
5217 arg_going = 1;
5219 break;
5221 case 'I':
5223 struct spec_path_info info;
5225 if (multilib_dir)
5227 do_spec_1 ("-imultilib", 1, NULL);
5228 /* Make this a separate argument. */
5229 do_spec_1 (" ", 0, NULL);
5230 do_spec_1 (multilib_dir, 1, NULL);
5231 do_spec_1 (" ", 0, NULL);
5234 if (multiarch_dir)
5236 do_spec_1 ("-imultiarch", 1, NULL);
5237 /* Make this a separate argument. */
5238 do_spec_1 (" ", 0, NULL);
5239 do_spec_1 (multiarch_dir, 1, NULL);
5240 do_spec_1 (" ", 0, NULL);
5243 if (gcc_exec_prefix)
5245 do_spec_1 ("-iprefix", 1, NULL);
5246 /* Make this a separate argument. */
5247 do_spec_1 (" ", 0, NULL);
5248 do_spec_1 (gcc_exec_prefix, 1, NULL);
5249 do_spec_1 (" ", 0, NULL);
5252 if (target_system_root_changed ||
5253 (target_system_root && target_sysroot_hdrs_suffix))
5255 do_spec_1 ("-isysroot", 1, NULL);
5256 /* Make this a separate argument. */
5257 do_spec_1 (" ", 0, NULL);
5258 do_spec_1 (target_system_root, 1, NULL);
5259 if (target_sysroot_hdrs_suffix)
5260 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5261 do_spec_1 (" ", 0, NULL);
5264 info.option = "-isystem";
5265 info.append = "include";
5266 info.append_len = strlen (info.append);
5267 info.omit_relative = false;
5268 info.separate_options = true;
5270 for_each_path (&include_prefixes, false, info.append_len,
5271 spec_path, &info);
5273 info.append = "include-fixed";
5274 if (*sysroot_hdrs_suffix_spec)
5275 info.append = concat (info.append, dir_separator_str,
5276 multilib_dir, NULL);
5277 info.append_len = strlen (info.append);
5278 for_each_path (&include_prefixes, false, info.append_len,
5279 spec_path, &info);
5281 break;
5283 case 'o':
5285 int max = n_infiles;
5286 max += lang_specific_extra_outfiles;
5288 if (HAVE_GNU_LD && at_file_supplied)
5290 /* We are going to expand `%o' to `@FILE', where FILE
5291 is a newly-created temporary filename. The filenames
5292 that would usually be expanded in place of %o will be
5293 written to the temporary file. */
5295 char **argv;
5296 int n_files, j;
5298 /* Convert OUTFILES into a form suitable for writeargv. */
5300 /* Determine how many are non-NULL. */
5301 for (n_files = 0, i = 0; i < max; i++)
5302 n_files += outfiles[i] != NULL;
5304 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5306 /* Copy the strings over. */
5307 for (i = 0, j = 0; i < max; i++)
5308 if (outfiles[i])
5310 argv[j] = CONST_CAST (char *, outfiles[i]);
5311 j++;
5313 argv[j] = NULL;
5315 create_at_file (argv);
5317 else
5318 for (i = 0; i < max; i++)
5319 if (outfiles[i])
5320 store_arg (outfiles[i], 0, 0);
5321 break;
5324 case 'O':
5325 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5326 arg_going = 1;
5327 break;
5329 case 's':
5330 this_is_library_file = 1;
5331 break;
5333 case 'T':
5334 this_is_linker_script = 1;
5335 break;
5337 case 'V':
5338 outfiles[input_file_number] = NULL;
5339 break;
5341 case 'w':
5342 this_is_output_file = 1;
5343 break;
5345 case 'W':
5347 unsigned int cur_index = argbuf.length ();
5348 /* Handle the {...} following the %W. */
5349 if (*p != '{')
5350 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
5351 p = handle_braces (p + 1);
5352 if (p == 0)
5353 return -1;
5354 end_going_arg ();
5355 /* If any args were output, mark the last one for deletion
5356 on failure. */
5357 if (argbuf.length () != cur_index)
5358 record_temp_file (argbuf.last (), 0, 1);
5359 break;
5362 /* %x{OPTION} records OPTION for %X to output. */
5363 case 'x':
5365 const char *p1 = p;
5366 char *string;
5367 char *opt;
5368 unsigned ix;
5370 /* Skip past the option value and make a copy. */
5371 if (*p != '{')
5372 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
5373 while (*p++ != '}')
5375 string = save_string (p1 + 1, p - p1 - 2);
5377 /* See if we already recorded this option. */
5378 FOR_EACH_VEC_ELT (linker_options, ix, opt)
5379 if (! strcmp (string, opt))
5381 free (string);
5382 return 0;
5385 /* This option is new; add it. */
5386 add_linker_option (string, strlen (string));
5387 free (string);
5389 break;
5391 /* Dump out the options accumulated previously using %x. */
5392 case 'X':
5393 do_specs_vec (linker_options);
5394 break;
5396 /* Dump out the options accumulated previously using -Wa,. */
5397 case 'Y':
5398 do_specs_vec (assembler_options);
5399 break;
5401 /* Dump out the options accumulated previously using -Wp,. */
5402 case 'Z':
5403 do_specs_vec (preprocessor_options);
5404 break;
5406 /* Here are digits and numbers that just process
5407 a certain constant string as a spec. */
5409 case '1':
5410 value = do_spec_1 (cc1_spec, 0, NULL);
5411 if (value != 0)
5412 return value;
5413 break;
5415 case '2':
5416 value = do_spec_1 (cc1plus_spec, 0, NULL);
5417 if (value != 0)
5418 return value;
5419 break;
5421 case 'a':
5422 value = do_spec_1 (asm_spec, 0, NULL);
5423 if (value != 0)
5424 return value;
5425 break;
5427 case 'A':
5428 value = do_spec_1 (asm_final_spec, 0, NULL);
5429 if (value != 0)
5430 return value;
5431 break;
5433 case 'C':
5435 const char *const spec
5436 = (input_file_compiler->cpp_spec
5437 ? input_file_compiler->cpp_spec
5438 : cpp_spec);
5439 value = do_spec_1 (spec, 0, NULL);
5440 if (value != 0)
5441 return value;
5443 break;
5445 case 'E':
5446 value = do_spec_1 (endfile_spec, 0, NULL);
5447 if (value != 0)
5448 return value;
5449 break;
5451 case 'l':
5452 value = do_spec_1 (link_spec, 0, NULL);
5453 if (value != 0)
5454 return value;
5455 break;
5457 case 'L':
5458 value = do_spec_1 (lib_spec, 0, NULL);
5459 if (value != 0)
5460 return value;
5461 break;
5463 case 'M':
5464 if (multilib_os_dir == NULL)
5465 obstack_1grow (&obstack, '.');
5466 else
5467 obstack_grow (&obstack, multilib_os_dir,
5468 strlen (multilib_os_dir));
5469 break;
5471 case 'G':
5472 value = do_spec_1 (libgcc_spec, 0, NULL);
5473 if (value != 0)
5474 return value;
5475 break;
5477 case 'R':
5478 /* We assume there is a directory
5479 separator at the end of this string. */
5480 if (target_system_root)
5482 obstack_grow (&obstack, target_system_root,
5483 strlen (target_system_root));
5484 if (target_sysroot_suffix)
5485 obstack_grow (&obstack, target_sysroot_suffix,
5486 strlen (target_sysroot_suffix));
5488 break;
5490 case 'S':
5491 value = do_spec_1 (startfile_spec, 0, NULL);
5492 if (value != 0)
5493 return value;
5494 break;
5496 /* Here we define characters other than letters and digits. */
5498 case '{':
5499 p = handle_braces (p);
5500 if (p == 0)
5501 return -1;
5502 break;
5504 case ':':
5505 p = handle_spec_function (p, NULL);
5506 if (p == 0)
5507 return -1;
5508 break;
5510 case '%':
5511 obstack_1grow (&obstack, '%');
5512 break;
5514 case '.':
5516 unsigned len = 0;
5518 while (p[len] && p[len] != ' ' && p[len] != '%')
5519 len++;
5520 suffix_subst = save_string (p - 1, len + 1);
5521 p += len;
5523 break;
5525 /* Henceforth ignore the option(s) matching the pattern
5526 after the %<. */
5527 case '<':
5528 case '>':
5530 unsigned len = 0;
5531 int have_wildcard = 0;
5532 int i;
5533 int switch_option;
5535 if (c == '>')
5536 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
5537 else
5538 switch_option = SWITCH_IGNORE;
5540 while (p[len] && p[len] != ' ' && p[len] != '\t')
5541 len++;
5543 if (p[len-1] == '*')
5544 have_wildcard = 1;
5546 for (i = 0; i < n_switches; i++)
5547 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5548 && (have_wildcard || switches[i].part1[len] == '\0'))
5550 switches[i].live_cond |= switch_option;
5551 /* User switch be validated from validate_all_switches.
5552 when the definition is seen from the spec file.
5553 If not defined anywhere, will be rejected. */
5554 if (switches[i].known)
5555 switches[i].validated = true;
5558 p += len;
5560 break;
5562 case '*':
5563 if (soft_matched_part)
5565 if (soft_matched_part[0])
5566 do_spec_1 (soft_matched_part, 1, NULL);
5567 /* Only insert a space after the substitution if it is at the
5568 end of the current sequence. So if:
5570 "%{foo=*:bar%*}%{foo=*:one%*two}"
5572 matches -foo=hello then it will produce:
5574 barhello onehellotwo
5576 if (*p == 0 || *p == '}')
5577 do_spec_1 (" ", 0, NULL);
5579 else
5580 /* Catch the case where a spec string contains something like
5581 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5582 hand side of the :. */
5583 error ("spec failure: %<%%*%> has not been initialized by pattern match");
5584 break;
5586 /* Process a string found as the value of a spec given by name.
5587 This feature allows individual machine descriptions
5588 to add and use their own specs. */
5589 case '(':
5591 const char *name = p;
5592 struct spec_list *sl;
5593 int len;
5595 /* The string after the S/P is the name of a spec that is to be
5596 processed. */
5597 while (*p && *p != ')')
5598 p++;
5600 /* See if it's in the list. */
5601 for (len = p - name, sl = specs; sl; sl = sl->next)
5602 if (sl->name_len == len && !strncmp (sl->name, name, len))
5604 name = *(sl->ptr_spec);
5605 #ifdef DEBUG_SPECS
5606 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
5607 sl->name, name);
5608 #endif
5609 break;
5612 if (sl)
5614 value = do_spec_1 (name, 0, NULL);
5615 if (value != 0)
5616 return value;
5619 /* Discard the closing paren. */
5620 if (*p)
5621 p++;
5623 break;
5625 default:
5626 error ("spec failure: unrecognized spec option %qc", c);
5627 break;
5629 break;
5631 case '\\':
5632 /* Backslash: treat next character as ordinary. */
5633 c = *p++;
5635 /* Fall through. */
5636 default:
5637 /* Ordinary character: put it into the current argument. */
5638 obstack_1grow (&obstack, c);
5639 arg_going = 1;
5642 /* End of string. If we are processing a spec function, we need to
5643 end any pending argument. */
5644 if (processing_spec_function)
5645 end_going_arg ();
5647 return 0;
5650 /* Look up a spec function. */
5652 static const struct spec_function *
5653 lookup_spec_function (const char *name)
5655 const struct spec_function *sf;
5657 for (sf = static_spec_functions; sf->name != NULL; sf++)
5658 if (strcmp (sf->name, name) == 0)
5659 return sf;
5661 return NULL;
5664 /* Evaluate a spec function. */
5666 static const char *
5667 eval_spec_function (const char *func, const char *args)
5669 const struct spec_function *sf;
5670 const char *funcval;
5672 /* Saved spec processing context. */
5673 vec<const_char_p> save_argbuf;
5675 int save_arg_going;
5676 int save_delete_this_arg;
5677 int save_this_is_output_file;
5678 int save_this_is_library_file;
5679 int save_input_from_pipe;
5680 int save_this_is_linker_script;
5681 const char *save_suffix_subst;
5683 int save_growing_size;
5684 void *save_growing_value = NULL;
5686 sf = lookup_spec_function (func);
5687 if (sf == NULL)
5688 fatal_error ("unknown spec function %qs", func);
5690 /* Push the spec processing context. */
5691 save_argbuf = argbuf;
5693 save_arg_going = arg_going;
5694 save_delete_this_arg = delete_this_arg;
5695 save_this_is_output_file = this_is_output_file;
5696 save_this_is_library_file = this_is_library_file;
5697 save_this_is_linker_script = this_is_linker_script;
5698 save_input_from_pipe = input_from_pipe;
5699 save_suffix_subst = suffix_subst;
5701 /* If we have some object growing now, finalize it so the args and function
5702 eval proceed from a cleared context. This is needed to prevent the first
5703 constructed arg from mistakenly including the growing value. We'll push
5704 this value back on the obstack once the function evaluation is done, to
5705 restore a consistent processing context for our caller. This is fine as
5706 the address of growing objects isn't guaranteed to remain stable until
5707 they are finalized, and we expect this situation to be rare enough for
5708 the extra copy not to be an issue. */
5709 save_growing_size = obstack_object_size (&obstack);
5710 if (save_growing_size > 0)
5711 save_growing_value = obstack_finish (&obstack);
5713 /* Create a new spec processing context, and build the function
5714 arguments. */
5716 alloc_args ();
5717 if (do_spec_2 (args) < 0)
5718 fatal_error ("error in args to spec function %qs", func);
5720 /* argbuf_index is an index for the next argument to be inserted, and
5721 so contains the count of the args already inserted. */
5723 funcval = (*sf->func) (argbuf.length (),
5724 argbuf.address ());
5726 /* Pop the spec processing context. */
5727 argbuf.release ();
5728 argbuf = save_argbuf;
5730 arg_going = save_arg_going;
5731 delete_this_arg = save_delete_this_arg;
5732 this_is_output_file = save_this_is_output_file;
5733 this_is_library_file = save_this_is_library_file;
5734 this_is_linker_script = save_this_is_linker_script;
5735 input_from_pipe = save_input_from_pipe;
5736 suffix_subst = save_suffix_subst;
5738 if (save_growing_size > 0)
5739 obstack_grow (&obstack, save_growing_value, save_growing_size);
5741 return funcval;
5744 /* Handle a spec function call of the form:
5746 %:function(args)
5748 ARGS is processed as a spec in a separate context and split into an
5749 argument vector in the normal fashion. The function returns a string
5750 containing a spec which we then process in the caller's context, or
5751 NULL if no processing is required.
5753 If RETVAL_NONNULL is not NULL, then store a bool whether function
5754 returned non-NULL. */
5756 static const char *
5757 handle_spec_function (const char *p, bool *retval_nonnull)
5759 char *func, *args;
5760 const char *endp, *funcval;
5761 int count;
5763 processing_spec_function++;
5765 /* Get the function name. */
5766 for (endp = p; *endp != '\0'; endp++)
5768 if (*endp == '(') /* ) */
5769 break;
5770 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5771 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5772 fatal_error ("malformed spec function name");
5774 if (*endp != '(') /* ) */
5775 fatal_error ("no arguments for spec function");
5776 func = save_string (p, endp - p);
5777 p = ++endp;
5779 /* Get the arguments. */
5780 for (count = 0; *endp != '\0'; endp++)
5782 /* ( */
5783 if (*endp == ')')
5785 if (count == 0)
5786 break;
5787 count--;
5789 else if (*endp == '(') /* ) */
5790 count++;
5792 /* ( */
5793 if (*endp != ')')
5794 fatal_error ("malformed spec function arguments");
5795 args = save_string (p, endp - p);
5796 p = ++endp;
5798 /* p now points to just past the end of the spec function expression. */
5800 funcval = eval_spec_function (func, args);
5801 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5802 p = NULL;
5803 if (retval_nonnull)
5804 *retval_nonnull = funcval != NULL;
5806 free (func);
5807 free (args);
5809 processing_spec_function--;
5811 return p;
5814 /* Inline subroutine of handle_braces. Returns true if the current
5815 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5816 static inline bool
5817 input_suffix_matches (const char *atom, const char *end_atom)
5819 return (input_suffix
5820 && !strncmp (input_suffix, atom, end_atom - atom)
5821 && input_suffix[end_atom - atom] == '\0');
5824 /* Subroutine of handle_braces. Returns true if the current
5825 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
5826 static bool
5827 input_spec_matches (const char *atom, const char *end_atom)
5829 return (input_file_compiler
5830 && input_file_compiler->suffix
5831 && input_file_compiler->suffix[0] != '\0'
5832 && !strncmp (input_file_compiler->suffix + 1, atom,
5833 end_atom - atom)
5834 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
5837 /* Subroutine of handle_braces. Returns true if a switch
5838 matching the atom bracketed by ATOM and END_ATOM appeared on the
5839 command line. */
5840 static bool
5841 switch_matches (const char *atom, const char *end_atom, int starred)
5843 int i;
5844 int len = end_atom - atom;
5845 int plen = starred ? len : -1;
5847 for (i = 0; i < n_switches; i++)
5848 if (!strncmp (switches[i].part1, atom, len)
5849 && (starred || switches[i].part1[len] == '\0')
5850 && check_live_switch (i, plen))
5851 return true;
5853 /* Check if a switch with separated form matching the atom.
5854 We check -D and -U switches. */
5855 else if (switches[i].args != 0)
5857 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
5858 && *switches[i].part1 == atom[0])
5860 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
5861 && (starred || (switches[i].part1[1] == '\0'
5862 && switches[i].args[0][len - 1] == '\0'))
5863 && check_live_switch (i, (starred ? 1 : -1)))
5864 return true;
5868 return false;
5871 /* Inline subroutine of handle_braces. Mark all of the switches which
5872 match ATOM (extends to END_ATOM; STARRED indicates whether there
5873 was a star after the atom) for later processing. */
5874 static inline void
5875 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5877 int i;
5878 int len = end_atom - atom;
5879 int plen = starred ? len : -1;
5881 for (i = 0; i < n_switches; i++)
5882 if (!strncmp (switches[i].part1, atom, len)
5883 && (starred || switches[i].part1[len] == '\0')
5884 && check_live_switch (i, plen))
5885 switches[i].ordering = 1;
5888 /* Inline subroutine of handle_braces. Process all the currently
5889 marked switches through give_switch, and clear the marks. */
5890 static inline void
5891 process_marked_switches (void)
5893 int i;
5895 for (i = 0; i < n_switches; i++)
5896 if (switches[i].ordering == 1)
5898 switches[i].ordering = 0;
5899 give_switch (i, 0);
5903 /* Handle a %{ ... } construct. P points just inside the leading {.
5904 Returns a pointer one past the end of the brace block, or 0
5905 if we call do_spec_1 and that returns -1. */
5907 static const char *
5908 handle_braces (const char *p)
5910 const char *atom, *end_atom;
5911 const char *d_atom = NULL, *d_end_atom = NULL;
5912 const char *orig = p;
5914 bool a_is_suffix;
5915 bool a_is_spectype;
5916 bool a_is_starred;
5917 bool a_is_negated;
5918 bool a_matched;
5920 bool a_must_be_last = false;
5921 bool ordered_set = false;
5922 bool disjunct_set = false;
5923 bool disj_matched = false;
5924 bool disj_starred = true;
5925 bool n_way_choice = false;
5926 bool n_way_matched = false;
5928 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
5932 if (a_must_be_last)
5933 goto invalid;
5935 /* Scan one "atom" (S in the description above of %{}, possibly
5936 with '!', '.', '@', ',', or '*' modifiers). */
5937 a_matched = false;
5938 a_is_suffix = false;
5939 a_is_starred = false;
5940 a_is_negated = false;
5941 a_is_spectype = false;
5943 SKIP_WHITE ();
5944 if (*p == '!')
5945 p++, a_is_negated = true;
5947 SKIP_WHITE ();
5948 if (*p == '%' && p[1] == ':')
5950 atom = NULL;
5951 end_atom = NULL;
5952 p = handle_spec_function (p + 2, &a_matched);
5954 else
5956 if (*p == '.')
5957 p++, a_is_suffix = true;
5958 else if (*p == ',')
5959 p++, a_is_spectype = true;
5961 atom = p;
5962 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
5963 || *p == ',' || *p == '.' || *p == '@')
5964 p++;
5965 end_atom = p;
5967 if (*p == '*')
5968 p++, a_is_starred = 1;
5971 SKIP_WHITE ();
5972 switch (*p)
5974 case '&': case '}':
5975 /* Substitute the switch(es) indicated by the current atom. */
5976 ordered_set = true;
5977 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
5978 || a_is_spectype || atom == end_atom)
5979 goto invalid;
5981 mark_matching_switches (atom, end_atom, a_is_starred);
5983 if (*p == '}')
5984 process_marked_switches ();
5985 break;
5987 case '|': case ':':
5988 /* Substitute some text if the current atom appears as a switch
5989 or suffix. */
5990 disjunct_set = true;
5991 if (ordered_set)
5992 goto invalid;
5994 if (atom && atom == end_atom)
5996 if (!n_way_choice || disj_matched || *p == '|'
5997 || a_is_negated || a_is_suffix || a_is_spectype
5998 || a_is_starred)
5999 goto invalid;
6001 /* An empty term may appear as the last choice of an
6002 N-way choice set; it means "otherwise". */
6003 a_must_be_last = true;
6004 disj_matched = !n_way_matched;
6005 disj_starred = false;
6007 else
6009 if ((a_is_suffix || a_is_spectype) && a_is_starred)
6010 goto invalid;
6012 if (!a_is_starred)
6013 disj_starred = false;
6015 /* Don't bother testing this atom if we already have a
6016 match. */
6017 if (!disj_matched && !n_way_matched)
6019 if (atom == NULL)
6020 /* a_matched is already set by handle_spec_function. */;
6021 else if (a_is_suffix)
6022 a_matched = input_suffix_matches (atom, end_atom);
6023 else if (a_is_spectype)
6024 a_matched = input_spec_matches (atom, end_atom);
6025 else
6026 a_matched = switch_matches (atom, end_atom, a_is_starred);
6028 if (a_matched != a_is_negated)
6030 disj_matched = true;
6031 d_atom = atom;
6032 d_end_atom = end_atom;
6037 if (*p == ':')
6039 /* Found the body, that is, the text to substitute if the
6040 current disjunction matches. */
6041 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
6042 disj_matched && !n_way_matched);
6043 if (p == 0)
6044 return 0;
6046 /* If we have an N-way choice, reset state for the next
6047 disjunction. */
6048 if (*p == ';')
6050 n_way_choice = true;
6051 n_way_matched |= disj_matched;
6052 disj_matched = false;
6053 disj_starred = true;
6054 d_atom = d_end_atom = NULL;
6057 break;
6059 default:
6060 goto invalid;
6063 while (*p++ != '}');
6065 return p;
6067 invalid:
6068 fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
6070 #undef SKIP_WHITE
6073 /* Subroutine of handle_braces. Scan and process a brace substitution body
6074 (X in the description of %{} syntax). P points one past the colon;
6075 ATOM and END_ATOM bracket the first atom which was found to be true
6076 (present) in the current disjunction; STARRED indicates whether all
6077 the atoms in the current disjunction were starred (for syntax validation);
6078 MATCHED indicates whether the disjunction matched or not, and therefore
6079 whether or not the body is to be processed through do_spec_1 or just
6080 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
6081 returns -1. */
6083 static const char *
6084 process_brace_body (const char *p, const char *atom, const char *end_atom,
6085 int starred, int matched)
6087 const char *body, *end_body;
6088 unsigned int nesting_level;
6089 bool have_subst = false;
6091 /* Locate the closing } or ;, honoring nested braces.
6092 Trim trailing whitespace. */
6093 body = p;
6094 nesting_level = 1;
6095 for (;;)
6097 if (*p == '{')
6098 nesting_level++;
6099 else if (*p == '}')
6101 if (!--nesting_level)
6102 break;
6104 else if (*p == ';' && nesting_level == 1)
6105 break;
6106 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
6107 have_subst = true;
6108 else if (*p == '\0')
6109 goto invalid;
6110 p++;
6113 end_body = p;
6114 while (end_body[-1] == ' ' || end_body[-1] == '\t')
6115 end_body--;
6117 if (have_subst && !starred)
6118 goto invalid;
6120 if (matched)
6122 /* Copy the substitution body to permanent storage and execute it.
6123 If have_subst is false, this is a simple matter of running the
6124 body through do_spec_1... */
6125 char *string = save_string (body, end_body - body);
6126 if (!have_subst)
6128 if (do_spec_1 (string, 0, NULL) < 0)
6129 return 0;
6131 else
6133 /* ... but if have_subst is true, we have to process the
6134 body once for each matching switch, with %* set to the
6135 variant part of the switch. */
6136 unsigned int hard_match_len = end_atom - atom;
6137 int i;
6139 for (i = 0; i < n_switches; i++)
6140 if (!strncmp (switches[i].part1, atom, hard_match_len)
6141 && check_live_switch (i, hard_match_len))
6143 if (do_spec_1 (string, 0,
6144 &switches[i].part1[hard_match_len]) < 0)
6145 return 0;
6146 /* Pass any arguments this switch has. */
6147 give_switch (i, 1);
6148 suffix_subst = NULL;
6153 return p;
6155 invalid:
6156 fatal_error ("braced spec body %qs is invalid", body);
6159 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6160 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
6161 spec, or -1 if either exact match or %* is used.
6163 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
6164 whose value does not begin with "no-" is obsoleted by the same value
6165 with the "no-", similarly for a switch with the "no-" prefix. */
6167 static int
6168 check_live_switch (int switchnum, int prefix_length)
6170 const char *name = switches[switchnum].part1;
6171 int i;
6173 /* If we already processed this switch and determined if it was
6174 live or not, return our past determination. */
6175 if (switches[switchnum].live_cond != 0)
6176 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6177 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
6178 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6179 == 0);
6181 /* In the common case of {<at-most-one-letter>*}, a negating
6182 switch would always match, so ignore that case. We will just
6183 send the conflicting switches to the compiler phase. */
6184 if (prefix_length >= 0 && prefix_length <= 1)
6185 return 1;
6187 /* Now search for duplicate in a manner that depends on the name. */
6188 switch (*name)
6190 case 'O':
6191 for (i = switchnum + 1; i < n_switches; i++)
6192 if (switches[i].part1[0] == 'O')
6194 switches[switchnum].validated = true;
6195 switches[switchnum].live_cond = SWITCH_FALSE;
6196 return 0;
6198 break;
6200 case 'W': case 'f': case 'm': case 'g':
6201 if (! strncmp (name + 1, "no-", 3))
6203 /* We have Xno-YYY, search for XYYY. */
6204 for (i = switchnum + 1; i < n_switches; i++)
6205 if (switches[i].part1[0] == name[0]
6206 && ! strcmp (&switches[i].part1[1], &name[4]))
6208 /* --specs are validated with the validate_switches mechanism. */
6209 if (switches[switchnum].known)
6210 switches[switchnum].validated = true;
6211 switches[switchnum].live_cond = SWITCH_FALSE;
6212 return 0;
6215 else
6217 /* We have XYYY, search for Xno-YYY. */
6218 for (i = switchnum + 1; i < n_switches; i++)
6219 if (switches[i].part1[0] == name[0]
6220 && switches[i].part1[1] == 'n'
6221 && switches[i].part1[2] == 'o'
6222 && switches[i].part1[3] == '-'
6223 && !strcmp (&switches[i].part1[4], &name[1]))
6225 /* --specs are validated with the validate_switches mechanism. */
6226 if (switches[switchnum].known)
6227 switches[switchnum].validated = true;
6228 switches[switchnum].live_cond = SWITCH_FALSE;
6229 return 0;
6232 break;
6235 /* Otherwise the switch is live. */
6236 switches[switchnum].live_cond |= SWITCH_LIVE;
6237 return 1;
6240 /* Pass a switch to the current accumulating command
6241 in the same form that we received it.
6242 SWITCHNUM identifies the switch; it is an index into
6243 the vector of switches gcc received, which is `switches'.
6244 This cannot fail since it never finishes a command line.
6246 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6248 static void
6249 give_switch (int switchnum, int omit_first_word)
6251 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6252 return;
6254 if (!omit_first_word)
6256 do_spec_1 ("-", 0, NULL);
6257 do_spec_1 (switches[switchnum].part1, 1, NULL);
6260 if (switches[switchnum].args != 0)
6262 const char **p;
6263 for (p = switches[switchnum].args; *p; p++)
6265 const char *arg = *p;
6267 do_spec_1 (" ", 0, NULL);
6268 if (suffix_subst)
6270 unsigned length = strlen (arg);
6271 int dot = 0;
6273 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6274 if (arg[length] == '.')
6276 (CONST_CAST (char *, arg))[length] = 0;
6277 dot = 1;
6278 break;
6280 do_spec_1 (arg, 1, NULL);
6281 if (dot)
6282 (CONST_CAST (char *, arg))[length] = '.';
6283 do_spec_1 (suffix_subst, 1, NULL);
6285 else
6286 do_spec_1 (arg, 1, NULL);
6290 do_spec_1 (" ", 0, NULL);
6291 switches[switchnum].validated = true;
6294 /* Print GCC configuration (e.g. version, thread model, target,
6295 configuration_arguments) to a given FILE. */
6297 static void
6298 print_configuration (FILE *file)
6300 int n;
6301 const char *thrmod;
6303 fnotice (file, "Target: %s\n", spec_machine);
6304 fnotice (file, "Configured with: %s\n", configuration_arguments);
6306 #ifdef THREAD_MODEL_SPEC
6307 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6308 but there's no point in doing all this processing just to get
6309 thread_model back. */
6310 obstack_init (&obstack);
6311 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6312 obstack_1grow (&obstack, '\0');
6313 thrmod = XOBFINISH (&obstack, const char *);
6314 #else
6315 thrmod = thread_model;
6316 #endif
6318 fnotice (file, "Thread model: %s\n", thrmod);
6320 /* compiler_version is truncated at the first space when initialized
6321 from version string, so truncate version_string at the first space
6322 before comparing. */
6323 for (n = 0; version_string[n]; n++)
6324 if (version_string[n] == ' ')
6325 break;
6327 if (! strncmp (version_string, compiler_version, n)
6328 && compiler_version[n] == 0)
6329 fnotice (file, "gcc version %s %s\n\n", version_string,
6330 pkgversion_string);
6331 else
6332 fnotice (file, "gcc driver version %s %sexecuting gcc version %s\n\n",
6333 version_string, pkgversion_string, compiler_version);
6337 #define RETRY_ICE_ATTEMPTS 3
6339 /* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
6341 static bool
6342 files_equal_p (char *file1, char *file2)
6344 struct stat st1, st2;
6345 off_t n, len;
6346 int fd1, fd2;
6347 const int bufsize = 8192;
6348 char *buf = XNEWVEC (char, bufsize);
6350 fd1 = open (file1, O_RDONLY);
6351 fd2 = open (file2, O_RDONLY);
6353 if (fd1 < 0 || fd2 < 0)
6354 goto error;
6356 if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
6357 goto error;
6359 if (st1.st_size != st2.st_size)
6360 goto error;
6362 for (n = st1.st_size; n; n -= len)
6364 len = n;
6365 if ((int) len > bufsize / 2)
6366 len = bufsize / 2;
6368 if (read (fd1, buf, len) != (int) len
6369 || read (fd2, buf + bufsize / 2, len) != (int) len)
6371 goto error;
6374 if (memcmp (buf, buf + bufsize / 2, len) != 0)
6375 goto error;
6378 free (buf);
6379 close (fd1);
6380 close (fd2);
6382 return 1;
6384 error:
6385 free (buf);
6386 close (fd1);
6387 close (fd2);
6388 return 0;
6391 /* Check that compiler's output doesn't differ across runs.
6392 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are arrays of files, containing
6393 stdout and stderr for each compiler run. Return true if all of
6394 TEMP_STDOUT_FILES and TEMP_STDERR_FILES are equivalent. */
6396 static bool
6397 check_repro (char **temp_stdout_files, char **temp_stderr_files)
6399 int i;
6400 for (i = 0; i < RETRY_ICE_ATTEMPTS - 2; ++i)
6402 if (!files_equal_p (temp_stdout_files[i], temp_stdout_files[i + 1])
6403 || !files_equal_p (temp_stderr_files[i], temp_stderr_files[i + 1]))
6405 fnotice (stderr, "The bug is not reproducible, so it is"
6406 " likely a hardware or OS problem.\n");
6407 break;
6410 return i == RETRY_ICE_ATTEMPTS - 2;
6413 enum attempt_status {
6414 ATTEMPT_STATUS_FAIL_TO_RUN,
6415 ATTEMPT_STATUS_SUCCESS,
6416 ATTEMPT_STATUS_ICE
6420 /* Run compiler with arguments NEW_ARGV to reproduce the ICE, storing stdout
6421 to OUT_TEMP and stderr to ERR_TEMP. If APPEND is TRUE, append to OUT_TEMP
6422 and ERR_TEMP instead of truncating. If EMIT_SYSTEM_INFO is TRUE, also write
6423 GCC configuration into to ERR_TEMP. Return ATTEMPT_STATUS_FAIL_TO_RUN if
6424 compiler failed to run, ATTEMPT_STATUS_ICE if compiled ICE-ed and
6425 ATTEMPT_STATUS_SUCCESS otherwise. */
6427 static enum attempt_status
6428 run_attempt (const char **new_argv, const char *out_temp,
6429 const char *err_temp, int emit_system_info, int append)
6432 if (emit_system_info)
6434 FILE *file_out = fopen (err_temp, "a");
6435 print_configuration (file_out);
6436 fclose (file_out);
6439 int exit_status;
6440 const char *errmsg;
6441 struct pex_obj *pex;
6442 int err;
6443 int pex_flags = PEX_USE_PIPES | PEX_LAST;
6444 enum attempt_status status = ATTEMPT_STATUS_FAIL_TO_RUN;
6446 if (append)
6447 pex_flags |= PEX_STDOUT_APPEND | PEX_STDERR_APPEND;
6449 pex = pex_init (PEX_USE_PIPES, new_argv[0], NULL);
6450 if (!pex)
6451 fatal_error ("pex_init failed: %m");
6453 errmsg = pex_run (pex, pex_flags, new_argv[0],
6454 CONST_CAST2 (char *const *, const char **, &new_argv[1]), out_temp,
6455 err_temp, &err);
6456 if (errmsg != NULL)
6458 if (err == 0)
6459 fatal_error (errmsg);
6460 else
6462 errno = err;
6463 pfatal_with_name (errmsg);
6467 if (!pex_get_status (pex, 1, &exit_status))
6468 goto out;
6470 switch (WEXITSTATUS (exit_status))
6472 case ICE_EXIT_CODE:
6473 status = ATTEMPT_STATUS_ICE;
6474 break;
6476 case SUCCESS_EXIT_CODE:
6477 status = ATTEMPT_STATUS_SUCCESS;
6478 break;
6480 default:
6484 out:
6485 pex_free (pex);
6486 return status;
6489 /* This routine adds preprocessed source code into the given ERR_FILE.
6490 To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
6491 add information in report file. RUN_ATTEMPT should return
6492 ATTEMPT_STATUS_SUCCESS, in other case we cannot generate the report. */
6494 static void
6495 do_report_bug (const char **new_argv, const int nargs,
6496 char **out_file, char **err_file)
6498 int i, status;
6499 int fd = open (*out_file, O_RDWR | O_APPEND);
6500 if (fd < 0)
6501 return;
6502 write (fd, "\n//", 3);
6503 for (i = 0; i < nargs; i++)
6505 write (fd, " ", 1);
6506 write (fd, new_argv[i], strlen (new_argv[i]));
6508 write (fd, "\n\n", 2);
6509 close (fd);
6510 new_argv[nargs] = "-E";
6511 new_argv[nargs + 1] = NULL;
6513 status = run_attempt (new_argv, *out_file, *err_file, 0, 1);
6515 if (status == ATTEMPT_STATUS_SUCCESS)
6517 fnotice (stderr, "Preprocessed source stored into %s file,"
6518 " please attach this to your bugreport.\n", *out_file);
6519 /* Make sure it is not deleted. */
6520 free (*out_file);
6521 *out_file = NULL;
6525 /* Append string STR to file FILE. */
6527 static void
6528 append_text (char *file, const char *str)
6530 int fd = open (file, O_RDWR | O_APPEND);
6531 if (fd < 0)
6532 return;
6534 write (fd, str, strlen (str));
6535 close (fd);
6538 /* Try to reproduce ICE. If bug is reproducible, generate report .err file
6539 containing GCC configuration, backtrace, compiler's command line options
6540 and preprocessed source code. */
6542 static void
6543 try_generate_repro (const char **argv)
6545 int i, nargs, out_arg = -1, quiet = 0, attempt;
6546 const char **new_argv;
6547 char *temp_files[RETRY_ICE_ATTEMPTS * 2];
6548 char **temp_stdout_files = &temp_files[0];
6549 char **temp_stderr_files = &temp_files[RETRY_ICE_ATTEMPTS];
6551 if (gcc_input_filename == NULL || ! strcmp (gcc_input_filename, "-"))
6552 return;
6554 for (nargs = 0; argv[nargs] != NULL; ++nargs)
6555 /* Only retry compiler ICEs, not preprocessor ones. */
6556 if (! strcmp (argv[nargs], "-E"))
6557 return;
6558 else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o')
6560 if (out_arg == -1)
6561 out_arg = nargs;
6562 else
6563 return;
6565 /* If the compiler is going to output any time information,
6566 it might varry between invocations. */
6567 else if (! strcmp (argv[nargs], "-quiet"))
6568 quiet = 1;
6569 else if (! strcmp (argv[nargs], "-ftime-report"))
6570 return;
6572 if (out_arg == -1 || !quiet)
6573 return;
6575 memset (temp_files, '\0', sizeof (temp_files));
6576 new_argv = XALLOCAVEC (const char *, nargs + 4);
6577 memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *));
6578 new_argv[nargs++] = "-frandom-seed=0";
6579 new_argv[nargs++] = "-fdump-noaddr";
6580 new_argv[nargs] = NULL;
6581 if (new_argv[out_arg][2] == '\0')
6582 new_argv[out_arg + 1] = "-";
6583 else
6584 new_argv[out_arg] = "-o-";
6586 int status;
6587 for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
6589 int emit_system_info = 0;
6590 int append = 0;
6591 temp_stdout_files[attempt] = make_temp_file (".out");
6592 temp_stderr_files[attempt] = make_temp_file (".err");
6594 if (attempt == RETRY_ICE_ATTEMPTS - 1)
6596 append = 1;
6597 emit_system_info = 1;
6600 if (emit_system_info)
6601 append_text (temp_stderr_files[attempt], "/*\n");
6603 status = run_attempt (new_argv, temp_stdout_files[attempt],
6604 temp_stderr_files[attempt], emit_system_info,
6605 append);
6607 if (emit_system_info)
6608 append_text (temp_stderr_files[attempt], "*/\n");
6610 if (status != ATTEMPT_STATUS_ICE)
6612 fnotice (stderr, "The bug is not reproducible, so it is"
6613 " likely a hardware or OS problem.\n");
6614 goto out;
6618 if (!check_repro (temp_stdout_files, temp_stderr_files))
6619 goto out;
6621 /* In final attempt we append compiler options and preprocesssed code to last
6622 generated .err file with configuration and backtrace. */
6623 do_report_bug (new_argv, nargs,
6624 &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
6625 &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1]);
6627 out:
6628 for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)
6629 if (temp_files[i])
6631 unlink (temp_stdout_files[i]);
6632 free (temp_stdout_files[i]);
6636 /* Search for a file named NAME trying various prefixes including the
6637 user's -B prefix and some standard ones.
6638 Return the absolute file name found. If nothing is found, return NAME. */
6640 static const char *
6641 find_file (const char *name)
6643 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6644 return newname ? newname : name;
6647 /* Determine whether a directory exists. If LINKER, return 0 for
6648 certain fixed names not needed by the linker. */
6650 static int
6651 is_directory (const char *path1, bool linker)
6653 int len1;
6654 char *path;
6655 char *cp;
6656 struct stat st;
6658 /* Ensure the string ends with "/.". The resulting path will be a
6659 directory even if the given path is a symbolic link. */
6660 len1 = strlen (path1);
6661 path = (char *) alloca (3 + len1);
6662 memcpy (path, path1, len1);
6663 cp = path + len1;
6664 if (!IS_DIR_SEPARATOR (cp[-1]))
6665 *cp++ = DIR_SEPARATOR;
6666 *cp++ = '.';
6667 *cp = '\0';
6669 /* Exclude directories that the linker is known to search. */
6670 if (linker
6671 && IS_DIR_SEPARATOR (path[0])
6672 && ((cp - path == 6
6673 && filename_ncmp (path + 1, "lib", 3) == 0)
6674 || (cp - path == 10
6675 && filename_ncmp (path + 1, "usr", 3) == 0
6676 && IS_DIR_SEPARATOR (path[4])
6677 && filename_ncmp (path + 5, "lib", 3) == 0)))
6678 return 0;
6680 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6683 /* Set up the various global variables to indicate that we're processing
6684 the input file named FILENAME. */
6686 void
6687 set_input (const char *filename)
6689 const char *p;
6691 gcc_input_filename = filename;
6692 input_filename_length = strlen (gcc_input_filename);
6693 input_basename = lbasename (gcc_input_filename);
6695 /* Find a suffix starting with the last period,
6696 and set basename_length to exclude that suffix. */
6697 basename_length = strlen (input_basename);
6698 suffixed_basename_length = basename_length;
6699 p = input_basename + basename_length;
6700 while (p != input_basename && *p != '.')
6701 --p;
6702 if (*p == '.' && p != input_basename)
6704 basename_length = p - input_basename;
6705 input_suffix = p + 1;
6707 else
6708 input_suffix = "";
6710 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6711 we will need to do a stat on the gcc_input_filename. The
6712 INPUT_STAT_SET signals that the stat is needed. */
6713 input_stat_set = 0;
6716 /* On fatal signals, delete all the temporary files. */
6718 static void
6719 fatal_signal (int signum)
6721 signal (signum, SIG_DFL);
6722 delete_failure_queue ();
6723 delete_temp_files ();
6724 /* Get the same signal again, this time not handled,
6725 so its normal effect occurs. */
6726 kill (getpid (), signum);
6729 /* Compare the contents of the two files named CMPFILE[0] and
6730 CMPFILE[1]. Return zero if they're identical, nonzero
6731 otherwise. */
6733 static int
6734 compare_files (char *cmpfile[])
6736 int ret = 0;
6737 FILE *temp[2] = { NULL, NULL };
6738 int i;
6740 #if HAVE_MMAP_FILE
6742 size_t length[2];
6743 void *map[2] = { NULL, NULL };
6745 for (i = 0; i < 2; i++)
6747 struct stat st;
6749 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6751 error ("%s: could not determine length of compare-debug file %s",
6752 gcc_input_filename, cmpfile[i]);
6753 ret = 1;
6754 break;
6757 length[i] = st.st_size;
6760 if (!ret && length[0] != length[1])
6762 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
6763 ret = 1;
6766 if (!ret)
6767 for (i = 0; i < 2; i++)
6769 int fd = open (cmpfile[i], O_RDONLY);
6770 if (fd < 0)
6772 error ("%s: could not open compare-debug file %s",
6773 gcc_input_filename, cmpfile[i]);
6774 ret = 1;
6775 break;
6778 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6779 close (fd);
6781 if (map[i] == (void *) MAP_FAILED)
6783 ret = -1;
6784 break;
6788 if (!ret)
6790 if (memcmp (map[0], map[1], length[0]) != 0)
6792 error ("%s: -fcompare-debug failure", gcc_input_filename);
6793 ret = 1;
6797 for (i = 0; i < 2; i++)
6798 if (map[i])
6799 munmap ((caddr_t) map[i], length[i]);
6801 if (ret >= 0)
6802 return ret;
6804 ret = 0;
6806 #endif
6808 for (i = 0; i < 2; i++)
6810 temp[i] = fopen (cmpfile[i], "r");
6811 if (!temp[i])
6813 error ("%s: could not open compare-debug file %s",
6814 gcc_input_filename, cmpfile[i]);
6815 ret = 1;
6816 break;
6820 if (!ret && temp[0] && temp[1])
6821 for (;;)
6823 int c0, c1;
6824 c0 = fgetc (temp[0]);
6825 c1 = fgetc (temp[1]);
6827 if (c0 != c1)
6829 error ("%s: -fcompare-debug failure",
6830 gcc_input_filename);
6831 ret = 1;
6832 break;
6835 if (c0 == EOF)
6836 break;
6839 for (i = 1; i >= 0; i--)
6841 if (temp[i])
6842 fclose (temp[i]);
6845 return ret;
6848 /* The top-level "main" within the driver would be ~1000 lines long.
6849 This class breaks it up into smaller functions and contains some
6850 state shared by them. */
6852 class driver
6854 public:
6855 int main (int argc, char **argv);
6857 private:
6858 void set_progname (const char *argv0) const;
6859 void expand_at_files (int *argc, char ***argv) const;
6860 void decode_argv (int argc, const char **argv);
6861 void global_initializations ();
6862 void build_multilib_strings () const;
6863 void set_up_specs () const;
6864 void putenv_COLLECT_GCC (const char *argv0) const;
6865 void maybe_putenv_COLLECT_LTO_WRAPPER () const;
6866 void maybe_putenv_OFFLOAD_TARGETS () const;
6867 void handle_unrecognized_options () const;
6868 int maybe_print_and_exit () const;
6869 bool prepare_infiles ();
6870 void do_spec_on_infiles () const;
6871 void maybe_run_linker (const char *argv0) const;
6872 void final_actions () const;
6873 int get_exit_code () const;
6875 private:
6876 char *explicit_link_files;
6877 struct cl_decoded_option *decoded_options;
6878 unsigned int decoded_options_count;
6881 /* Implement the top-level "main" within the driver in terms of
6882 driver::main. */
6884 extern int main (int, char **);
6887 main (int argc, char **argv)
6889 driver d;
6891 return d.main (argc, argv);
6894 /* driver::main is implemented as a series of driver:: method calls. */
6897 driver::main (int argc, char **argv)
6899 bool early_exit;
6901 set_progname (argv[0]);
6902 expand_at_files (&argc, &argv);
6903 decode_argv (argc, const_cast <const char **> (argv));
6904 global_initializations ();
6905 build_multilib_strings ();
6906 set_up_specs ();
6907 putenv_COLLECT_GCC (argv[0]);
6908 maybe_putenv_COLLECT_LTO_WRAPPER ();
6909 maybe_putenv_OFFLOAD_TARGETS ();
6910 handle_unrecognized_options ();
6912 if (!maybe_print_and_exit ())
6913 return 0;
6915 early_exit = prepare_infiles ();
6916 if (early_exit)
6917 return get_exit_code ();
6919 do_spec_on_infiles ();
6920 maybe_run_linker (argv[0]);
6921 final_actions ();
6922 return get_exit_code ();
6925 /* Locate the final component of argv[0] after any leading path, and set
6926 the program name accordingly. */
6928 void
6929 driver::set_progname (const char *argv0) const
6931 const char *p = argv0 + strlen (argv0);
6932 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1]))
6933 --p;
6934 progname = p;
6936 xmalloc_set_program_name (progname);
6939 /* Expand any @ files within the command-line args,
6940 setting at_file_supplied if any were expanded. */
6942 void
6943 driver::expand_at_files (int *argc, char ***argv) const
6945 char **old_argv = *argv;
6947 expandargv (argc, argv);
6949 /* Determine if any expansions were made. */
6950 if (*argv != old_argv)
6951 at_file_supplied = true;
6954 /* Decode the command-line arguments from argc/argv into the
6955 decoded_options array. */
6957 void
6958 driver::decode_argv (int argc, const char **argv)
6960 /* Register the language-independent parameters. */
6961 global_init_params ();
6962 finish_params ();
6964 init_options_struct (&global_options, &global_options_set);
6966 decode_cmdline_options_to_array (argc, argv,
6967 CL_DRIVER,
6968 &decoded_options, &decoded_options_count);
6971 /* Perform various initializations and setup. */
6973 void
6974 driver::global_initializations ()
6976 /* Unlock the stdio streams. */
6977 unlock_std_streams ();
6979 gcc_init_libintl ();
6981 diagnostic_initialize (global_dc, 0);
6982 diagnostic_color_init (global_dc);
6984 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6985 /* Perform host dependent initialization when needed. */
6986 GCC_DRIVER_HOST_INITIALIZATION;
6987 #endif
6989 if (atexit (delete_temp_files) != 0)
6990 fatal_error ("atexit failed");
6992 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6993 signal (SIGINT, fatal_signal);
6994 #ifdef SIGHUP
6995 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6996 signal (SIGHUP, fatal_signal);
6997 #endif
6998 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6999 signal (SIGTERM, fatal_signal);
7000 #ifdef SIGPIPE
7001 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
7002 signal (SIGPIPE, fatal_signal);
7003 #endif
7004 #ifdef SIGCHLD
7005 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
7006 receive the signal. A different setting is inheritable */
7007 signal (SIGCHLD, SIG_DFL);
7008 #endif
7010 /* Parsing and gimplification sometimes need quite large stack.
7011 Increase stack size limits if possible. */
7012 stack_limit_increase (64 * 1024 * 1024);
7014 /* Allocate the argument vector. */
7015 alloc_args ();
7017 obstack_init (&obstack);
7020 /* Build multilib_select, et. al from the separate lines that make up each
7021 multilib selection. */
7023 void
7024 driver::build_multilib_strings () const
7027 const char *p;
7028 const char *const *q = multilib_raw;
7029 int need_space;
7031 obstack_init (&multilib_obstack);
7032 while ((p = *q++) != (char *) 0)
7033 obstack_grow (&multilib_obstack, p, strlen (p));
7035 obstack_1grow (&multilib_obstack, 0);
7036 multilib_select = XOBFINISH (&multilib_obstack, const char *);
7038 q = multilib_matches_raw;
7039 while ((p = *q++) != (char *) 0)
7040 obstack_grow (&multilib_obstack, p, strlen (p));
7042 obstack_1grow (&multilib_obstack, 0);
7043 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
7045 q = multilib_exclusions_raw;
7046 while ((p = *q++) != (char *) 0)
7047 obstack_grow (&multilib_obstack, p, strlen (p));
7049 obstack_1grow (&multilib_obstack, 0);
7050 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
7052 q = multilib_reuse_raw;
7053 while ((p = *q++) != (char *) 0)
7054 obstack_grow (&multilib_obstack, p, strlen (p));
7056 obstack_1grow (&multilib_obstack, 0);
7057 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
7059 need_space = FALSE;
7060 for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
7062 if (need_space)
7063 obstack_1grow (&multilib_obstack, ' ');
7064 obstack_grow (&multilib_obstack,
7065 multilib_defaults_raw[i],
7066 strlen (multilib_defaults_raw[i]));
7067 need_space = TRUE;
7070 obstack_1grow (&multilib_obstack, 0);
7071 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
7075 /* Set up the spec-handling machinery. */
7077 void
7078 driver::set_up_specs () const
7080 const char *spec_machine_suffix;
7081 char *specs_file;
7082 size_t i;
7084 #ifdef INIT_ENVIRONMENT
7085 /* Set up any other necessary machine specific environment variables. */
7086 xputenv (INIT_ENVIRONMENT);
7087 #endif
7089 /* Make a table of what switches there are (switches, n_switches).
7090 Make a table of specified input files (infiles, n_infiles).
7091 Decode switches that are handled locally. */
7093 process_command (decoded_options_count, decoded_options);
7095 /* Initialize the vector of specs to just the default.
7096 This means one element containing 0s, as a terminator. */
7098 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
7099 memcpy (compilers, default_compilers, sizeof default_compilers);
7100 n_compilers = n_default_compilers;
7102 /* Read specs from a file if there is one. */
7104 machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
7105 accel_dir_suffix, dir_separator_str, NULL);
7106 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
7108 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
7109 /* Read the specs file unless it is a default one. */
7110 if (specs_file != 0 && strcmp (specs_file, "specs"))
7111 read_specs (specs_file, true, false);
7112 else
7113 init_spec ();
7115 #ifdef ACCEL_COMPILER
7116 spec_machine_suffix = machine_suffix;
7117 #else
7118 spec_machine_suffix = just_machine_suffix;
7119 #endif
7121 /* We need to check standard_exec_prefix/spec_machine_suffix/specs
7122 for any override of as, ld and libraries. */
7123 specs_file = (char *) alloca (strlen (standard_exec_prefix)
7124 + strlen (spec_machine_suffix) + sizeof ("specs"));
7125 strcpy (specs_file, standard_exec_prefix);
7126 strcat (specs_file, spec_machine_suffix);
7127 strcat (specs_file, "specs");
7128 if (access (specs_file, R_OK) == 0)
7129 read_specs (specs_file, true, false);
7131 /* Process any configure-time defaults specified for the command line
7132 options, via OPTION_DEFAULT_SPECS. */
7133 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
7134 do_option_spec (option_default_specs[i].name,
7135 option_default_specs[i].spec);
7137 /* Process DRIVER_SELF_SPECS, adding any new options to the end
7138 of the command line. */
7140 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
7141 do_self_spec (driver_self_specs[i]);
7143 /* If not cross-compiling, look for executables in the standard
7144 places. */
7145 if (*cross_compile == '0')
7147 if (*md_exec_prefix)
7149 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
7150 PREFIX_PRIORITY_LAST, 0, 0);
7154 /* Process sysroot_suffix_spec. */
7155 if (*sysroot_suffix_spec != 0
7156 && !no_sysroot_suffix
7157 && do_spec_2 (sysroot_suffix_spec) == 0)
7159 if (argbuf.length () > 1)
7160 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
7161 else if (argbuf.length () == 1)
7162 target_sysroot_suffix = xstrdup (argbuf.last ());
7165 #ifdef HAVE_LD_SYSROOT
7166 /* Pass the --sysroot option to the linker, if it supports that. If
7167 there is a sysroot_suffix_spec, it has already been processed by
7168 this point, so target_system_root really is the system root we
7169 should be using. */
7170 if (target_system_root)
7172 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
7173 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
7174 set_spec ("link", XOBFINISH (&obstack, const char *), false);
7176 #endif
7178 /* Process sysroot_hdrs_suffix_spec. */
7179 if (*sysroot_hdrs_suffix_spec != 0
7180 && !no_sysroot_suffix
7181 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
7183 if (argbuf.length () > 1)
7184 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
7185 else if (argbuf.length () == 1)
7186 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
7189 /* Look for startfiles in the standard places. */
7190 if (*startfile_prefix_spec != 0
7191 && do_spec_2 (startfile_prefix_spec) == 0
7192 && do_spec_1 (" ", 0, NULL) == 0)
7194 const char *arg;
7195 int ndx;
7196 FOR_EACH_VEC_ELT (argbuf, ndx, arg)
7197 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
7198 PREFIX_PRIORITY_LAST, 0, 1);
7200 /* We should eventually get rid of all these and stick to
7201 startfile_prefix_spec exclusively. */
7202 else if (*cross_compile == '0' || target_system_root)
7204 if (*md_startfile_prefix)
7205 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
7206 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7208 if (*md_startfile_prefix_1)
7209 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
7210 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7212 /* If standard_startfile_prefix is relative, base it on
7213 standard_exec_prefix. This lets us move the installed tree
7214 as a unit. If GCC_EXEC_PREFIX is defined, base
7215 standard_startfile_prefix on that as well.
7217 If the prefix is relative, only search it for native compilers;
7218 otherwise we will search a directory containing host libraries. */
7219 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
7220 add_sysrooted_prefix (&startfile_prefixes,
7221 standard_startfile_prefix, "BINUTILS",
7222 PREFIX_PRIORITY_LAST, 0, 1);
7223 else if (*cross_compile == '0')
7225 add_prefix (&startfile_prefixes,
7226 concat (gcc_exec_prefix
7227 ? gcc_exec_prefix : standard_exec_prefix,
7228 machine_suffix,
7229 standard_startfile_prefix, NULL),
7230 NULL, PREFIX_PRIORITY_LAST, 0, 1);
7233 /* Sysrooted prefixes are relocated because target_system_root is
7234 also relocated by gcc_exec_prefix. */
7235 if (*standard_startfile_prefix_1)
7236 add_sysrooted_prefix (&startfile_prefixes,
7237 standard_startfile_prefix_1, "BINUTILS",
7238 PREFIX_PRIORITY_LAST, 0, 1);
7239 if (*standard_startfile_prefix_2)
7240 add_sysrooted_prefix (&startfile_prefixes,
7241 standard_startfile_prefix_2, "BINUTILS",
7242 PREFIX_PRIORITY_LAST, 0, 1);
7245 /* Process any user specified specs in the order given on the command
7246 line. */
7247 for (struct user_specs *uptr = user_specs_head; uptr; uptr = uptr->next)
7249 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
7250 R_OK, true);
7251 read_specs (filename ? filename : uptr->filename, false, true);
7254 /* Process any user self specs. */
7256 struct spec_list *sl;
7257 for (sl = specs; sl; sl = sl->next)
7258 if (sl->name_len == sizeof "self_spec" - 1
7259 && !strcmp (sl->name, "self_spec"))
7260 do_self_spec (*sl->ptr_spec);
7263 if (compare_debug)
7265 enum save_temps save;
7267 if (!compare_debug_second)
7269 n_switches_debug_check[1] = n_switches;
7270 n_switches_alloc_debug_check[1] = n_switches_alloc;
7271 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
7272 n_switches_alloc);
7274 do_self_spec ("%:compare-debug-self-opt()");
7275 n_switches_debug_check[0] = n_switches;
7276 n_switches_alloc_debug_check[0] = n_switches_alloc;
7277 switches_debug_check[0] = switches;
7279 n_switches = n_switches_debug_check[1];
7280 n_switches_alloc = n_switches_alloc_debug_check[1];
7281 switches = switches_debug_check[1];
7284 /* Avoid crash when computing %j in this early. */
7285 save = save_temps_flag;
7286 save_temps_flag = SAVE_TEMPS_NONE;
7288 compare_debug = -compare_debug;
7289 do_self_spec ("%:compare-debug-self-opt()");
7291 save_temps_flag = save;
7293 if (!compare_debug_second)
7295 n_switches_debug_check[1] = n_switches;
7296 n_switches_alloc_debug_check[1] = n_switches_alloc;
7297 switches_debug_check[1] = switches;
7298 compare_debug = -compare_debug;
7299 n_switches = n_switches_debug_check[0];
7300 n_switches_alloc = n_switches_debug_check[0];
7301 switches = switches_debug_check[0];
7306 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
7307 if (gcc_exec_prefix)
7308 gcc_exec_prefix = concat (gcc_exec_prefix, spec_host_machine,
7309 dir_separator_str, spec_version,
7310 accel_dir_suffix, dir_separator_str, NULL);
7312 /* Now we have the specs.
7313 Set the `valid' bits for switches that match anything in any spec. */
7315 validate_all_switches ();
7317 /* Now that we have the switches and the specs, set
7318 the subdirectory based on the options. */
7319 set_multilib_dir ();
7322 /* Set up to remember the pathname of gcc and any options
7323 needed for collect. We use argv[0] instead of progname because
7324 we need the complete pathname. */
7326 void
7327 driver::putenv_COLLECT_GCC (const char *argv0) const
7329 obstack_init (&collect_obstack);
7330 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
7331 obstack_grow (&collect_obstack, argv0, strlen (argv0) + 1);
7332 xputenv (XOBFINISH (&collect_obstack, char *));
7335 /* Set up to remember the pathname of the lto wrapper. */
7337 void
7338 driver::maybe_putenv_COLLECT_LTO_WRAPPER () const
7340 char *lto_wrapper_file;
7342 if (have_c)
7343 lto_wrapper_file = NULL;
7344 else
7345 lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
7346 X_OK, false);
7347 if (lto_wrapper_file)
7349 lto_wrapper_file = convert_white_space (lto_wrapper_file);
7350 lto_wrapper_spec = lto_wrapper_file;
7351 obstack_init (&collect_obstack);
7352 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
7353 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
7354 obstack_grow (&collect_obstack, lto_wrapper_spec,
7355 strlen (lto_wrapper_spec) + 1);
7356 xputenv (XOBFINISH (&collect_obstack, char *));
7361 /* Set up to remember the names of offload targets. */
7363 void
7364 driver::maybe_putenv_OFFLOAD_TARGETS () const
7366 const char *targets = offload_targets;
7368 /* If no targets specified by -foffload, use all available targets. */
7369 if (!targets)
7370 targets = OFFLOAD_TARGETS;
7372 if (strlen (targets) > 0)
7374 obstack_grow (&collect_obstack, "OFFLOAD_TARGET_NAMES=",
7375 sizeof ("OFFLOAD_TARGET_NAMES=") - 1);
7376 obstack_grow (&collect_obstack, targets,
7377 strlen (targets) + 1);
7378 xputenv (XOBFINISH (&collect_obstack, char *));
7381 free (offload_targets);
7384 /* Reject switches that no pass was interested in. */
7386 void
7387 driver::handle_unrecognized_options () const
7389 for (size_t i = 0; (int) i < n_switches; i++)
7390 if (! switches[i].validated)
7391 error ("unrecognized command line option %<-%s%>", switches[i].part1);
7394 /* Handle the various -print-* options, returning 0 if the driver
7395 should exit, or nonzero if the driver should continue. */
7398 driver::maybe_print_and_exit () const
7400 if (print_search_dirs)
7402 printf (_("install: %s%s\n"),
7403 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
7404 gcc_exec_prefix ? "" : machine_suffix);
7405 printf (_("programs: %s\n"),
7406 build_search_list (&exec_prefixes, "", false, false));
7407 printf (_("libraries: %s\n"),
7408 build_search_list (&startfile_prefixes, "", false, true));
7409 return (0);
7412 if (print_file_name)
7414 printf ("%s\n", find_file (print_file_name));
7415 return (0);
7418 if (print_prog_name)
7420 if (use_ld != NULL && ! strcmp (print_prog_name, "ld"))
7422 /* Append USE_LD to to the default linker. */
7423 #ifdef DEFAULT_LINKER
7424 char *ld;
7425 # ifdef HAVE_HOST_EXECUTABLE_SUFFIX
7426 int len = (sizeof (DEFAULT_LINKER)
7427 - sizeof (HOST_EXECUTABLE_SUFFIX));
7428 ld = NULL;
7429 if (len > 0)
7431 char *default_linker = xstrdup (DEFAULT_LINKER);
7432 /* Strip HOST_EXECUTABLE_SUFFIX if DEFAULT_LINKER contains
7433 HOST_EXECUTABLE_SUFFIX. */
7434 if (! strcmp (&default_linker[len], HOST_EXECUTABLE_SUFFIX))
7436 default_linker[len] = '\0';
7437 ld = concat (default_linker, use_ld,
7438 HOST_EXECUTABLE_SUFFIX, NULL);
7441 if (ld == NULL)
7442 # endif
7443 ld = concat (DEFAULT_LINKER, use_ld, NULL);
7444 if (access (ld, X_OK) == 0)
7446 printf ("%s\n", ld);
7447 return (0);
7449 #endif
7450 print_prog_name = concat (print_prog_name, use_ld, NULL);
7452 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
7453 printf ("%s\n", (newname ? newname : print_prog_name));
7454 return (0);
7457 if (print_multi_lib)
7459 print_multilib_info ();
7460 return (0);
7463 if (print_multi_directory)
7465 if (multilib_dir == NULL)
7466 printf (".\n");
7467 else
7468 printf ("%s\n", multilib_dir);
7469 return (0);
7472 if (print_multiarch)
7474 if (multiarch_dir == NULL)
7475 printf ("\n");
7476 else
7477 printf ("%s\n", multiarch_dir);
7478 return (0);
7481 if (print_sysroot)
7483 if (target_system_root)
7485 if (target_sysroot_suffix)
7486 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
7487 else
7488 printf ("%s\n", target_system_root);
7490 return (0);
7493 if (print_multi_os_directory)
7495 if (multilib_os_dir == NULL)
7496 printf (".\n");
7497 else
7498 printf ("%s\n", multilib_os_dir);
7499 return (0);
7502 if (print_sysroot_headers_suffix)
7504 if (*sysroot_hdrs_suffix_spec)
7506 printf("%s\n", (target_sysroot_hdrs_suffix
7507 ? target_sysroot_hdrs_suffix
7508 : ""));
7509 return (0);
7511 else
7512 /* The error status indicates that only one set of fixed
7513 headers should be built. */
7514 fatal_error ("not configured with sysroot headers suffix");
7517 if (print_help_list)
7519 display_help ();
7521 if (! verbose_flag)
7523 printf (_("\nFor bug reporting instructions, please see:\n"));
7524 printf ("%s.\n", bug_report_url);
7526 return (0);
7529 /* We do not exit here. Instead we have created a fake input file
7530 called 'help-dummy' which needs to be compiled, and we pass this
7531 on the various sub-processes, along with the --help switch.
7532 Ensure their output appears after ours. */
7533 fputc ('\n', stdout);
7534 fflush (stdout);
7537 if (print_version)
7539 printf (_("%s %s%s\n"), progname, pkgversion_string,
7540 version_string);
7541 printf ("Copyright %s 2014 Free Software Foundation, Inc.\n",
7542 _("(C)"));
7543 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
7544 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
7545 stdout);
7546 if (! verbose_flag)
7547 return 0;
7549 /* We do not exit here. We use the same mechanism of --help to print
7550 the version of the sub-processes. */
7551 fputc ('\n', stdout);
7552 fflush (stdout);
7555 if (verbose_flag)
7557 print_configuration (stderr);
7558 if (n_infiles == 0)
7559 return (0);
7562 return 1;
7565 /* Figure out what to do with each input file.
7566 Return true if we need to exit early from "main", false otherwise. */
7568 bool
7569 driver::prepare_infiles ()
7571 size_t i;
7572 int lang_n_infiles = 0;
7574 if (n_infiles == added_libraries)
7575 fatal_error ("no input files");
7577 if (seen_error ())
7578 /* Early exit needed from main. */
7579 return true;
7581 /* Make a place to record the compiler output file names
7582 that correspond to the input files. */
7584 i = n_infiles;
7585 i += lang_specific_extra_outfiles;
7586 outfiles = XCNEWVEC (const char *, i);
7588 /* Record which files were specified explicitly as link input. */
7590 explicit_link_files = XCNEWVEC (char, n_infiles);
7592 combine_inputs = have_o || flag_wpa;
7594 for (i = 0; (int) i < n_infiles; i++)
7596 const char *name = infiles[i].name;
7597 struct compiler *compiler = lookup_compiler (name,
7598 strlen (name),
7599 infiles[i].language);
7601 if (compiler && !(compiler->combinable))
7602 combine_inputs = false;
7604 if (lang_n_infiles > 0 && compiler != input_file_compiler
7605 && infiles[i].language && infiles[i].language[0] != '*')
7606 infiles[i].incompiler = compiler;
7607 else if (compiler)
7609 lang_n_infiles++;
7610 input_file_compiler = compiler;
7611 infiles[i].incompiler = compiler;
7613 else
7615 /* Since there is no compiler for this input file, assume it is a
7616 linker file. */
7617 explicit_link_files[i] = 1;
7618 infiles[i].incompiler = NULL;
7620 infiles[i].compiled = false;
7621 infiles[i].preprocessed = false;
7624 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
7625 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
7627 /* No early exit needed from main; we can continue. */
7628 return false;
7631 /* Run the spec machinery on each input file. */
7633 void
7634 driver::do_spec_on_infiles () const
7636 size_t i;
7638 for (i = 0; (int) i < n_infiles; i++)
7640 int this_file_error = 0;
7642 /* Tell do_spec what to substitute for %i. */
7644 input_file_number = i;
7645 set_input (infiles[i].name);
7647 if (infiles[i].compiled)
7648 continue;
7650 /* Use the same thing in %o, unless cp->spec says otherwise. */
7652 outfiles[i] = gcc_input_filename;
7654 /* Figure out which compiler from the file's suffix. */
7656 input_file_compiler
7657 = lookup_compiler (infiles[i].name, input_filename_length,
7658 infiles[i].language);
7660 if (input_file_compiler)
7662 /* Ok, we found an applicable compiler. Run its spec. */
7664 if (input_file_compiler->spec[0] == '#')
7666 error ("%s: %s compiler not installed on this system",
7667 gcc_input_filename, &input_file_compiler->spec[1]);
7668 this_file_error = 1;
7670 else
7672 int value;
7674 if (compare_debug)
7676 free (debug_check_temp_file[0]);
7677 debug_check_temp_file[0] = NULL;
7679 free (debug_check_temp_file[1]);
7680 debug_check_temp_file[1] = NULL;
7683 value = do_spec (input_file_compiler->spec);
7684 infiles[i].compiled = true;
7685 if (value < 0)
7686 this_file_error = 1;
7687 else if (compare_debug && debug_check_temp_file[0])
7689 if (verbose_flag)
7690 inform (0, "recompiling with -fcompare-debug");
7692 compare_debug = -compare_debug;
7693 n_switches = n_switches_debug_check[1];
7694 n_switches_alloc = n_switches_alloc_debug_check[1];
7695 switches = switches_debug_check[1];
7697 value = do_spec (input_file_compiler->spec);
7699 compare_debug = -compare_debug;
7700 n_switches = n_switches_debug_check[0];
7701 n_switches_alloc = n_switches_alloc_debug_check[0];
7702 switches = switches_debug_check[0];
7704 if (value < 0)
7706 error ("during -fcompare-debug recompilation");
7707 this_file_error = 1;
7710 gcc_assert (debug_check_temp_file[1]
7711 && filename_cmp (debug_check_temp_file[0],
7712 debug_check_temp_file[1]));
7714 if (verbose_flag)
7715 inform (0, "comparing final insns dumps");
7717 if (compare_files (debug_check_temp_file))
7718 this_file_error = 1;
7721 if (compare_debug)
7723 free (debug_check_temp_file[0]);
7724 debug_check_temp_file[0] = NULL;
7726 free (debug_check_temp_file[1]);
7727 debug_check_temp_file[1] = NULL;
7732 /* If this file's name does not contain a recognized suffix,
7733 record it as explicit linker input. */
7735 else
7736 explicit_link_files[i] = 1;
7738 /* Clear the delete-on-failure queue, deleting the files in it
7739 if this compilation failed. */
7741 if (this_file_error)
7743 delete_failure_queue ();
7744 errorcount++;
7746 /* If this compilation succeeded, don't delete those files later. */
7747 clear_failure_queue ();
7750 /* Reset the input file name to the first compile/object file name, for use
7751 with %b in LINK_SPEC. We use the first input file that we can find
7752 a compiler to compile it instead of using infiles.language since for
7753 languages other than C we use aliases that we then lookup later. */
7754 if (n_infiles > 0)
7756 int i;
7758 for (i = 0; i < n_infiles ; i++)
7759 if (infiles[i].incompiler
7760 || (infiles[i].language && infiles[i].language[0] != '*'))
7762 set_input (infiles[i].name);
7763 break;
7767 if (!seen_error ())
7769 /* Make sure INPUT_FILE_NUMBER points to first available open
7770 slot. */
7771 input_file_number = n_infiles;
7772 if (lang_specific_pre_link ())
7773 errorcount++;
7777 /* If we have to run the linker, do it now. */
7779 void
7780 driver::maybe_run_linker (const char *argv0) const
7782 size_t i;
7783 int linker_was_run = 0;
7784 int num_linker_inputs;
7786 /* Determine if there are any linker input files. */
7787 num_linker_inputs = 0;
7788 for (i = 0; (int) i < n_infiles; i++)
7789 if (explicit_link_files[i] || outfiles[i] != NULL)
7790 num_linker_inputs++;
7792 /* Run ld to link all the compiler output files. */
7794 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
7796 int tmp = execution_count;
7798 if (! have_c)
7800 #if HAVE_LTO_PLUGIN > 0
7801 #if HAVE_LTO_PLUGIN == 2
7802 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
7803 #else
7804 const char *fuse_linker_plugin = "fuse-linker-plugin";
7805 #endif
7806 #endif
7808 /* We'll use ld if we can't find collect2. */
7809 if (! strcmp (linker_name_spec, "collect2"))
7811 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7812 if (s == NULL)
7813 linker_name_spec = "ld";
7816 #if HAVE_LTO_PLUGIN > 0
7817 #if HAVE_LTO_PLUGIN == 2
7818 if (!switch_matches (fno_use_linker_plugin,
7819 fno_use_linker_plugin
7820 + strlen (fno_use_linker_plugin), 0))
7821 #else
7822 if (switch_matches (fuse_linker_plugin,
7823 fuse_linker_plugin
7824 + strlen (fuse_linker_plugin), 0))
7825 #endif
7827 char *temp_spec = find_a_file (&exec_prefixes,
7828 LTOPLUGINSONAME, R_OK,
7829 false);
7830 if (!temp_spec)
7831 fatal_error ("-fuse-linker-plugin, but %s not found",
7832 LTOPLUGINSONAME);
7833 linker_plugin_file_spec = convert_white_space (temp_spec);
7835 #endif
7836 lto_gcc_spec = argv0;
7839 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7840 for collect. */
7841 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7842 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7844 if (print_subprocess_help == 1)
7846 printf (_("\nLinker options\n==============\n\n"));
7847 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7848 " to the linker.\n\n"));
7849 fflush (stdout);
7851 int value = do_spec (link_command_spec);
7852 if (value < 0)
7853 errorcount = 1;
7854 linker_was_run = (tmp != execution_count);
7857 /* If options said don't run linker,
7858 complain about input files to be given to the linker. */
7860 if (! linker_was_run && !seen_error ())
7861 for (i = 0; (int) i < n_infiles; i++)
7862 if (explicit_link_files[i]
7863 && !(infiles[i].language && infiles[i].language[0] == '*'))
7864 warning (0, "%s: linker input file unused because linking not done",
7865 outfiles[i]);
7868 /* The end of "main". */
7870 void
7871 driver::final_actions () const
7873 /* Delete some or all of the temporary files we made. */
7875 if (seen_error ())
7876 delete_failure_queue ();
7877 delete_temp_files ();
7879 if (print_help_list)
7881 printf (("\nFor bug reporting instructions, please see:\n"));
7882 printf ("%s\n", bug_report_url);
7886 /* Determine what the exit code of the driver should be. */
7889 driver::get_exit_code () const
7891 return (signal_count != 0 ? 2
7892 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
7893 : 0);
7896 /* Find the proper compilation spec for the file name NAME,
7897 whose length is LENGTH. LANGUAGE is the specified language,
7898 or 0 if this file is to be passed to the linker. */
7900 static struct compiler *
7901 lookup_compiler (const char *name, size_t length, const char *language)
7903 struct compiler *cp;
7905 /* If this was specified by the user to be a linker input, indicate that. */
7906 if (language != 0 && language[0] == '*')
7907 return 0;
7909 /* Otherwise, look for the language, if one is spec'd. */
7910 if (language != 0)
7912 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7913 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7914 return cp;
7916 error ("language %s not recognized", language);
7917 return 0;
7920 /* Look for a suffix. */
7921 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7923 if (/* The suffix `-' matches only the file name `-'. */
7924 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7925 || (strlen (cp->suffix) < length
7926 /* See if the suffix matches the end of NAME. */
7927 && !strcmp (cp->suffix,
7928 name + length - strlen (cp->suffix))
7930 break;
7933 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7934 /* Look again, but case-insensitively this time. */
7935 if (cp < compilers)
7936 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7938 if (/* The suffix `-' matches only the file name `-'. */
7939 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7940 || (strlen (cp->suffix) < length
7941 /* See if the suffix matches the end of NAME. */
7942 && ((!strcmp (cp->suffix,
7943 name + length - strlen (cp->suffix))
7944 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7945 && !strcasecmp (cp->suffix,
7946 name + length - strlen (cp->suffix)))
7948 break;
7950 #endif
7952 if (cp >= compilers)
7954 if (cp->spec[0] != '@')
7955 /* A non-alias entry: return it. */
7956 return cp;
7958 /* An alias entry maps a suffix to a language.
7959 Search for the language; pass 0 for NAME and LENGTH
7960 to avoid infinite recursion if language not found. */
7961 return lookup_compiler (NULL, 0, cp->spec + 1);
7963 return 0;
7966 static char *
7967 save_string (const char *s, int len)
7969 char *result = XNEWVEC (char, len + 1);
7971 memcpy (result, s, len);
7972 result[len] = 0;
7973 return result;
7976 void
7977 pfatal_with_name (const char *name)
7979 perror_with_name (name);
7980 delete_temp_files ();
7981 exit (1);
7984 static void
7985 perror_with_name (const char *name)
7987 error ("%s: %m", name);
7990 static inline void
7991 validate_switches_from_spec (const char *spec, bool user)
7993 const char *p = spec;
7994 char c;
7995 while ((c = *p++))
7996 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7997 /* We have a switch spec. */
7998 p = validate_switches (p + 1, user);
8001 static void
8002 validate_all_switches (void)
8004 struct compiler *comp;
8005 struct spec_list *spec;
8007 for (comp = compilers; comp->spec; comp++)
8008 validate_switches_from_spec (comp->spec, false);
8010 /* Look through the linked list of specs read from the specs file. */
8011 for (spec = specs; spec; spec = spec->next)
8012 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
8014 validate_switches_from_spec (link_command_spec, false);
8017 /* Look at the switch-name that comes after START
8018 and mark as valid all supplied switches that match it. */
8020 static const char *
8021 validate_switches (const char *start, bool user_spec)
8023 const char *p = start;
8024 const char *atom;
8025 size_t len;
8026 int i;
8027 bool suffix = false;
8028 bool starred = false;
8030 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
8032 next_member:
8033 SKIP_WHITE ();
8035 if (*p == '!')
8036 p++;
8038 SKIP_WHITE ();
8039 if (*p == '.' || *p == ',')
8040 suffix = true, p++;
8042 atom = p;
8043 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
8044 || *p == ',' || *p == '.' || *p == '@')
8045 p++;
8046 len = p - atom;
8048 if (*p == '*')
8049 starred = true, p++;
8051 SKIP_WHITE ();
8053 if (!suffix)
8055 /* Mark all matching switches as valid. */
8056 for (i = 0; i < n_switches; i++)
8057 if (!strncmp (switches[i].part1, atom, len)
8058 && (starred || switches[i].part1[len] == '\0')
8059 && (switches[i].known || user_spec))
8060 switches[i].validated = true;
8063 if (*p) p++;
8064 if (*p && (p[-1] == '|' || p[-1] == '&'))
8065 goto next_member;
8067 if (*p && p[-1] == ':')
8069 while (*p && *p != ';' && *p != '}')
8071 if (*p == '%')
8073 p++;
8074 if (*p == '{' || *p == '<')
8075 p = validate_switches (p+1, user_spec);
8076 else if (p[0] == 'W' && p[1] == '{')
8077 p = validate_switches (p+2, user_spec);
8079 else
8080 p++;
8083 if (*p) p++;
8084 if (*p && p[-1] == ';')
8085 goto next_member;
8088 return p;
8089 #undef SKIP_WHITE
8092 struct mdswitchstr
8094 const char *str;
8095 int len;
8098 static struct mdswitchstr *mdswitches;
8099 static int n_mdswitches;
8101 /* Check whether a particular argument was used. The first time we
8102 canonicalize the switches to keep only the ones we care about. */
8104 static int
8105 used_arg (const char *p, int len)
8107 struct mswitchstr
8109 const char *str;
8110 const char *replace;
8111 int len;
8112 int rep_len;
8115 static struct mswitchstr *mswitches;
8116 static int n_mswitches;
8117 int i, j;
8119 if (!mswitches)
8121 struct mswitchstr *matches;
8122 const char *q;
8123 int cnt = 0;
8125 /* Break multilib_matches into the component strings of string
8126 and replacement string. */
8127 for (q = multilib_matches; *q != '\0'; q++)
8128 if (*q == ';')
8129 cnt++;
8131 matches
8132 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
8133 i = 0;
8134 q = multilib_matches;
8135 while (*q != '\0')
8137 matches[i].str = q;
8138 while (*q != ' ')
8140 if (*q == '\0')
8142 invalid_matches:
8143 fatal_error ("multilib spec %qs is invalid",
8144 multilib_matches);
8146 q++;
8148 matches[i].len = q - matches[i].str;
8150 matches[i].replace = ++q;
8151 while (*q != ';' && *q != '\0')
8153 if (*q == ' ')
8154 goto invalid_matches;
8155 q++;
8157 matches[i].rep_len = q - matches[i].replace;
8158 i++;
8159 if (*q == ';')
8160 q++;
8163 /* Now build a list of the replacement string for switches that we care
8164 about. Make sure we allocate at least one entry. This prevents
8165 xmalloc from calling fatal, and prevents us from re-executing this
8166 block of code. */
8167 mswitches
8168 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
8169 for (i = 0; i < n_switches; i++)
8170 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
8172 int xlen = strlen (switches[i].part1);
8173 for (j = 0; j < cnt; j++)
8174 if (xlen == matches[j].len
8175 && ! strncmp (switches[i].part1, matches[j].str, xlen))
8177 mswitches[n_mswitches].str = matches[j].replace;
8178 mswitches[n_mswitches].len = matches[j].rep_len;
8179 mswitches[n_mswitches].replace = (char *) 0;
8180 mswitches[n_mswitches].rep_len = 0;
8181 n_mswitches++;
8182 break;
8186 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
8187 on the command line nor any options mutually incompatible with
8188 them. */
8189 for (i = 0; i < n_mdswitches; i++)
8191 const char *r;
8193 for (q = multilib_options; *q != '\0'; *q && q++)
8195 while (*q == ' ')
8196 q++;
8198 r = q;
8199 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
8200 || strchr (" /", q[mdswitches[i].len]) == NULL)
8202 while (*q != ' ' && *q != '/' && *q != '\0')
8203 q++;
8204 if (*q != '/')
8205 break;
8206 q++;
8209 if (*q != ' ' && *q != '\0')
8211 while (*r != ' ' && *r != '\0')
8213 q = r;
8214 while (*q != ' ' && *q != '/' && *q != '\0')
8215 q++;
8217 if (used_arg (r, q - r))
8218 break;
8220 if (*q != '/')
8222 mswitches[n_mswitches].str = mdswitches[i].str;
8223 mswitches[n_mswitches].len = mdswitches[i].len;
8224 mswitches[n_mswitches].replace = (char *) 0;
8225 mswitches[n_mswitches].rep_len = 0;
8226 n_mswitches++;
8227 break;
8230 r = q + 1;
8232 break;
8238 for (i = 0; i < n_mswitches; i++)
8239 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
8240 return 1;
8242 return 0;
8245 static int
8246 default_arg (const char *p, int len)
8248 int i;
8250 for (i = 0; i < n_mdswitches; i++)
8251 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
8252 return 1;
8254 return 0;
8257 /* Work out the subdirectory to use based on the options. The format of
8258 multilib_select is a list of elements. Each element is a subdirectory
8259 name followed by a list of options followed by a semicolon. The format
8260 of multilib_exclusions is the same, but without the preceding
8261 directory. First gcc will check the exclusions, if none of the options
8262 beginning with an exclamation point are present, and all of the other
8263 options are present, then we will ignore this completely. Passing
8264 that, gcc will consider each multilib_select in turn using the same
8265 rules for matching the options. If a match is found, that subdirectory
8266 will be used.
8267 A subdirectory name is optionally followed by a colon and the corresponding
8268 multiarch name. */
8270 static void
8271 set_multilib_dir (void)
8273 const char *p;
8274 unsigned int this_path_len;
8275 const char *this_path, *this_arg;
8276 const char *start, *end;
8277 int not_arg;
8278 int ok, ndfltok, first;
8280 n_mdswitches = 0;
8281 start = multilib_defaults;
8282 while (*start == ' ' || *start == '\t')
8283 start++;
8284 while (*start != '\0')
8286 n_mdswitches++;
8287 while (*start != ' ' && *start != '\t' && *start != '\0')
8288 start++;
8289 while (*start == ' ' || *start == '\t')
8290 start++;
8293 if (n_mdswitches)
8295 int i = 0;
8297 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
8298 for (start = multilib_defaults; *start != '\0'; start = end + 1)
8300 while (*start == ' ' || *start == '\t')
8301 start++;
8303 if (*start == '\0')
8304 break;
8306 for (end = start + 1;
8307 *end != ' ' && *end != '\t' && *end != '\0'; end++)
8310 obstack_grow (&multilib_obstack, start, end - start);
8311 obstack_1grow (&multilib_obstack, 0);
8312 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
8313 mdswitches[i++].len = end - start;
8315 if (*end == '\0')
8316 break;
8320 p = multilib_exclusions;
8321 while (*p != '\0')
8323 /* Ignore newlines. */
8324 if (*p == '\n')
8326 ++p;
8327 continue;
8330 /* Check the arguments. */
8331 ok = 1;
8332 while (*p != ';')
8334 if (*p == '\0')
8336 invalid_exclusions:
8337 fatal_error ("multilib exclusions %qs is invalid",
8338 multilib_exclusions);
8341 if (! ok)
8343 ++p;
8344 continue;
8347 this_arg = p;
8348 while (*p != ' ' && *p != ';')
8350 if (*p == '\0')
8351 goto invalid_exclusions;
8352 ++p;
8355 if (*this_arg != '!')
8356 not_arg = 0;
8357 else
8359 not_arg = 1;
8360 ++this_arg;
8363 ok = used_arg (this_arg, p - this_arg);
8364 if (not_arg)
8365 ok = ! ok;
8367 if (*p == ' ')
8368 ++p;
8371 if (ok)
8372 return;
8374 ++p;
8377 first = 1;
8378 p = multilib_select;
8380 /* Append multilib reuse rules if any. With those rules, we can reuse
8381 one multilib for certain different options sets. */
8382 if (strlen (multilib_reuse) > 0)
8383 p = concat (p, multilib_reuse, NULL);
8385 while (*p != '\0')
8387 /* Ignore newlines. */
8388 if (*p == '\n')
8390 ++p;
8391 continue;
8394 /* Get the initial path. */
8395 this_path = p;
8396 while (*p != ' ')
8398 if (*p == '\0')
8400 invalid_select:
8401 fatal_error ("multilib select %qs %qs is invalid",
8402 multilib_select, multilib_reuse);
8404 ++p;
8406 this_path_len = p - this_path;
8408 /* Check the arguments. */
8409 ok = 1;
8410 ndfltok = 1;
8411 ++p;
8412 while (*p != ';')
8414 if (*p == '\0')
8415 goto invalid_select;
8417 if (! ok)
8419 ++p;
8420 continue;
8423 this_arg = p;
8424 while (*p != ' ' && *p != ';')
8426 if (*p == '\0')
8427 goto invalid_select;
8428 ++p;
8431 if (*this_arg != '!')
8432 not_arg = 0;
8433 else
8435 not_arg = 1;
8436 ++this_arg;
8439 /* If this is a default argument, we can just ignore it.
8440 This is true even if this_arg begins with '!'. Beginning
8441 with '!' does not mean that this argument is necessarily
8442 inappropriate for this library: it merely means that
8443 there is a more specific library which uses this
8444 argument. If this argument is a default, we need not
8445 consider that more specific library. */
8446 ok = used_arg (this_arg, p - this_arg);
8447 if (not_arg)
8448 ok = ! ok;
8450 if (! ok)
8451 ndfltok = 0;
8453 if (default_arg (this_arg, p - this_arg))
8454 ok = 1;
8456 if (*p == ' ')
8457 ++p;
8460 if (ok && first)
8462 if (this_path_len != 1
8463 || this_path[0] != '.')
8465 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
8466 char *q;
8468 strncpy (new_multilib_dir, this_path, this_path_len);
8469 new_multilib_dir[this_path_len] = '\0';
8470 q = strchr (new_multilib_dir, ':');
8471 if (q != NULL)
8472 *q = '\0';
8473 multilib_dir = new_multilib_dir;
8475 first = 0;
8478 if (ndfltok)
8480 const char *q = this_path, *end = this_path + this_path_len;
8482 while (q < end && *q != ':')
8483 q++;
8484 if (q < end)
8486 const char *q2 = q + 1, *ml_end = end;
8487 char *new_multilib_os_dir;
8489 while (q2 < end && *q2 != ':')
8490 q2++;
8491 if (*q2 == ':')
8492 ml_end = q2;
8493 if (ml_end - q == 1)
8494 multilib_os_dir = xstrdup (".");
8495 else
8497 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
8498 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
8499 new_multilib_os_dir[ml_end - q - 1] = '\0';
8500 multilib_os_dir = new_multilib_os_dir;
8503 if (q2 < end && *q2 == ':')
8505 char *new_multiarch_dir = XNEWVEC (char, end - q2);
8506 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
8507 new_multiarch_dir[end - q2 - 1] = '\0';
8508 multiarch_dir = new_multiarch_dir;
8510 break;
8514 ++p;
8517 if (multilib_dir == NULL && multilib_os_dir != NULL
8518 && strcmp (multilib_os_dir, ".") == 0)
8520 free (CONST_CAST (char *, multilib_os_dir));
8521 multilib_os_dir = NULL;
8523 else if (multilib_dir != NULL && multilib_os_dir == NULL)
8524 multilib_os_dir = multilib_dir;
8527 /* Print out the multiple library subdirectory selection
8528 information. This prints out a series of lines. Each line looks
8529 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
8530 required. Only the desired options are printed out, the negative
8531 matches. The options are print without a leading dash. There are
8532 no spaces to make it easy to use the information in the shell.
8533 Each subdirectory is printed only once. This assumes the ordering
8534 generated by the genmultilib script. Also, we leave out ones that match
8535 the exclusions. */
8537 static void
8538 print_multilib_info (void)
8540 const char *p = multilib_select;
8541 const char *last_path = 0, *this_path;
8542 int skip;
8543 unsigned int last_path_len = 0;
8545 while (*p != '\0')
8547 skip = 0;
8548 /* Ignore newlines. */
8549 if (*p == '\n')
8551 ++p;
8552 continue;
8555 /* Get the initial path. */
8556 this_path = p;
8557 while (*p != ' ')
8559 if (*p == '\0')
8561 invalid_select:
8562 fatal_error ("multilib select %qs is invalid", multilib_select);
8565 ++p;
8568 /* When --disable-multilib was used but target defines
8569 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
8570 with .:: for multiarch configurations) are there just to find
8571 multilib_os_dir, so skip them from output. */
8572 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
8573 skip = 1;
8575 /* Check for matches with the multilib_exclusions. We don't bother
8576 with the '!' in either list. If any of the exclusion rules match
8577 all of its options with the select rule, we skip it. */
8579 const char *e = multilib_exclusions;
8580 const char *this_arg;
8582 while (*e != '\0')
8584 int m = 1;
8585 /* Ignore newlines. */
8586 if (*e == '\n')
8588 ++e;
8589 continue;
8592 /* Check the arguments. */
8593 while (*e != ';')
8595 const char *q;
8596 int mp = 0;
8598 if (*e == '\0')
8600 invalid_exclusion:
8601 fatal_error ("multilib exclusion %qs is invalid",
8602 multilib_exclusions);
8605 if (! m)
8607 ++e;
8608 continue;
8611 this_arg = e;
8613 while (*e != ' ' && *e != ';')
8615 if (*e == '\0')
8616 goto invalid_exclusion;
8617 ++e;
8620 q = p + 1;
8621 while (*q != ';')
8623 const char *arg;
8624 int len = e - this_arg;
8626 if (*q == '\0')
8627 goto invalid_select;
8629 arg = q;
8631 while (*q != ' ' && *q != ';')
8633 if (*q == '\0')
8634 goto invalid_select;
8635 ++q;
8638 if (! strncmp (arg, this_arg,
8639 (len < q - arg) ? q - arg : len)
8640 || default_arg (this_arg, e - this_arg))
8642 mp = 1;
8643 break;
8646 if (*q == ' ')
8647 ++q;
8650 if (! mp)
8651 m = 0;
8653 if (*e == ' ')
8654 ++e;
8657 if (m)
8659 skip = 1;
8660 break;
8663 if (*e != '\0')
8664 ++e;
8668 if (! skip)
8670 /* If this is a duplicate, skip it. */
8671 skip = (last_path != 0
8672 && (unsigned int) (p - this_path) == last_path_len
8673 && ! filename_ncmp (last_path, this_path, last_path_len));
8675 last_path = this_path;
8676 last_path_len = p - this_path;
8679 /* If this directory requires any default arguments, we can skip
8680 it. We will already have printed a directory identical to
8681 this one which does not require that default argument. */
8682 if (! skip)
8684 const char *q;
8686 q = p + 1;
8687 while (*q != ';')
8689 const char *arg;
8691 if (*q == '\0')
8692 goto invalid_select;
8694 if (*q == '!')
8695 arg = NULL;
8696 else
8697 arg = q;
8699 while (*q != ' ' && *q != ';')
8701 if (*q == '\0')
8702 goto invalid_select;
8703 ++q;
8706 if (arg != NULL
8707 && default_arg (arg, q - arg))
8709 skip = 1;
8710 break;
8713 if (*q == ' ')
8714 ++q;
8718 if (! skip)
8720 const char *p1;
8722 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
8723 putchar (*p1);
8724 putchar (';');
8727 ++p;
8728 while (*p != ';')
8730 int use_arg;
8732 if (*p == '\0')
8733 goto invalid_select;
8735 if (skip)
8737 ++p;
8738 continue;
8741 use_arg = *p != '!';
8743 if (use_arg)
8744 putchar ('@');
8746 while (*p != ' ' && *p != ';')
8748 if (*p == '\0')
8749 goto invalid_select;
8750 if (use_arg)
8751 putchar (*p);
8752 ++p;
8755 if (*p == ' ')
8756 ++p;
8759 if (! skip)
8761 /* If there are extra options, print them now. */
8762 if (multilib_extra && *multilib_extra)
8764 int print_at = TRUE;
8765 const char *q;
8767 for (q = multilib_extra; *q != '\0'; q++)
8769 if (*q == ' ')
8770 print_at = TRUE;
8771 else
8773 if (print_at)
8774 putchar ('@');
8775 putchar (*q);
8776 print_at = FALSE;
8781 putchar ('\n');
8784 ++p;
8788 /* getenv built-in spec function.
8790 Returns the value of the environment variable given by its first
8791 argument, concatenated with the second argument. If the
8792 environment variable is not defined, a fatal error is issued. */
8794 static const char *
8795 getenv_spec_function (int argc, const char **argv)
8797 char *value;
8798 char *result;
8799 char *ptr;
8800 size_t len;
8802 if (argc != 2)
8803 return NULL;
8805 value = getenv (argv[0]);
8806 if (!value)
8807 fatal_error ("environment variable %qs not defined", argv[0]);
8809 /* We have to escape every character of the environment variable so
8810 they are not interpreted as active spec characters. A
8811 particularly painful case is when we are reading a variable
8812 holding a windows path complete with \ separators. */
8813 len = strlen (value) * 2 + strlen (argv[1]) + 1;
8814 result = XNEWVAR (char, len);
8815 for (ptr = result; *value; ptr += 2)
8817 ptr[0] = '\\';
8818 ptr[1] = *value++;
8821 strcpy (ptr, argv[1]);
8823 return result;
8826 /* if-exists built-in spec function.
8828 Checks to see if the file specified by the absolute pathname in
8829 ARGS exists. Returns that pathname if found.
8831 The usual use for this function is to check for a library file
8832 (whose name has been expanded with %s). */
8834 static const char *
8835 if_exists_spec_function (int argc, const char **argv)
8837 /* Must have only one argument. */
8838 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8839 return argv[0];
8841 return NULL;
8844 /* if-exists-else built-in spec function.
8846 This is like if-exists, but takes an additional argument which
8847 is returned if the first argument does not exist. */
8849 static const char *
8850 if_exists_else_spec_function (int argc, const char **argv)
8852 /* Must have exactly two arguments. */
8853 if (argc != 2)
8854 return NULL;
8856 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8857 return argv[0];
8859 return argv[1];
8862 /* sanitize built-in spec function.
8864 This returns non-NULL, if sanitizing address, thread or
8865 any of the undefined behavior sanitizers. */
8867 static const char *
8868 sanitize_spec_function (int argc, const char **argv)
8870 if (argc != 1)
8871 return NULL;
8873 if (strcmp (argv[0], "address") == 0)
8874 return (flag_sanitize & SANITIZE_USER_ADDRESS) ? "" : NULL;
8875 if (strcmp (argv[0], "kernel-address") == 0)
8876 return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
8877 if (strcmp (argv[0], "thread") == 0)
8878 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
8879 if (strcmp (argv[0], "undefined") == 0)
8880 return ((flag_sanitize & (SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT))
8881 && !flag_sanitize_undefined_trap_on_error) ? "" : NULL;
8882 if (strcmp (argv[0], "leak") == 0)
8883 return ((flag_sanitize
8884 & (SANITIZE_ADDRESS | SANITIZE_LEAK | SANITIZE_THREAD))
8885 == SANITIZE_LEAK) ? "" : NULL;
8886 return NULL;
8889 /* replace-outfile built-in spec function.
8891 This looks for the first argument in the outfiles array's name and
8892 replaces it with the second argument. */
8894 static const char *
8895 replace_outfile_spec_function (int argc, const char **argv)
8897 int i;
8898 /* Must have exactly two arguments. */
8899 if (argc != 2)
8900 abort ();
8902 for (i = 0; i < n_infiles; i++)
8904 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
8905 outfiles[i] = xstrdup (argv[1]);
8907 return NULL;
8910 /* remove-outfile built-in spec function.
8912 * This looks for the first argument in the outfiles array's name and
8913 * removes it. */
8915 static const char *
8916 remove_outfile_spec_function (int argc, const char **argv)
8918 int i;
8919 /* Must have exactly one argument. */
8920 if (argc != 1)
8921 abort ();
8923 for (i = 0; i < n_infiles; i++)
8925 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
8926 outfiles[i] = NULL;
8928 return NULL;
8931 /* Given two version numbers, compares the two numbers.
8932 A version number must match the regular expression
8933 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8935 static int
8936 compare_version_strings (const char *v1, const char *v2)
8938 int rresult;
8939 regex_t r;
8941 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8942 REG_EXTENDED | REG_NOSUB) != 0)
8943 abort ();
8944 rresult = regexec (&r, v1, 0, NULL, 0);
8945 if (rresult == REG_NOMATCH)
8946 fatal_error ("invalid version number %qs", v1);
8947 else if (rresult != 0)
8948 abort ();
8949 rresult = regexec (&r, v2, 0, NULL, 0);
8950 if (rresult == REG_NOMATCH)
8951 fatal_error ("invalid version number %qs", v2);
8952 else if (rresult != 0)
8953 abort ();
8955 return strverscmp (v1, v2);
8959 /* version_compare built-in spec function.
8961 This takes an argument of the following form:
8963 <comparison-op> <arg1> [<arg2>] <switch> <result>
8965 and produces "result" if the comparison evaluates to true,
8966 and nothing if it doesn't.
8968 The supported <comparison-op> values are:
8970 >= true if switch is a later (or same) version than arg1
8971 !> opposite of >=
8972 < true if switch is an earlier version than arg1
8973 !< opposite of <
8974 >< true if switch is arg1 or later, and earlier than arg2
8975 <> true if switch is earlier than arg1 or is arg2 or later
8977 If the switch is not present, the condition is false unless
8978 the first character of the <comparison-op> is '!'.
8980 For example,
8981 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8982 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8984 static const char *
8985 version_compare_spec_function (int argc, const char **argv)
8987 int comp1, comp2;
8988 size_t switch_len;
8989 const char *switch_value = NULL;
8990 int nargs = 1, i;
8991 bool result;
8993 if (argc < 3)
8994 fatal_error ("too few arguments to %%:version-compare");
8995 if (argv[0][0] == '\0')
8996 abort ();
8997 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8998 nargs = 2;
8999 if (argc != nargs + 3)
9000 fatal_error ("too many arguments to %%:version-compare");
9002 switch_len = strlen (argv[nargs + 1]);
9003 for (i = 0; i < n_switches; i++)
9004 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
9005 && check_live_switch (i, switch_len))
9006 switch_value = switches[i].part1 + switch_len;
9008 if (switch_value == NULL)
9009 comp1 = comp2 = -1;
9010 else
9012 comp1 = compare_version_strings (switch_value, argv[1]);
9013 if (nargs == 2)
9014 comp2 = compare_version_strings (switch_value, argv[2]);
9015 else
9016 comp2 = -1; /* This value unused. */
9019 switch (argv[0][0] << 8 | argv[0][1])
9021 case '>' << 8 | '=':
9022 result = comp1 >= 0;
9023 break;
9024 case '!' << 8 | '<':
9025 result = comp1 >= 0 || switch_value == NULL;
9026 break;
9027 case '<' << 8:
9028 result = comp1 < 0;
9029 break;
9030 case '!' << 8 | '>':
9031 result = comp1 < 0 || switch_value == NULL;
9032 break;
9033 case '>' << 8 | '<':
9034 result = comp1 >= 0 && comp2 < 0;
9035 break;
9036 case '<' << 8 | '>':
9037 result = comp1 < 0 || comp2 >= 0;
9038 break;
9040 default:
9041 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
9043 if (! result)
9044 return NULL;
9046 return argv[nargs + 2];
9049 /* %:include builtin spec function. This differs from %include in that it
9050 can be nested inside a spec, and thus be conditionalized. It takes
9051 one argument, the filename, and looks for it in the startfile path.
9052 The result is always NULL, i.e. an empty expansion. */
9054 static const char *
9055 include_spec_function (int argc, const char **argv)
9057 char *file;
9059 if (argc != 1)
9060 abort ();
9062 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
9063 read_specs (file ? file : argv[0], false, false);
9065 return NULL;
9068 /* %:find-file spec function. This function replaces its argument by
9069 the file found through find_file, that is the -print-file-name gcc
9070 program option. */
9071 static const char *
9072 find_file_spec_function (int argc, const char **argv)
9074 const char *file;
9076 if (argc != 1)
9077 abort ();
9079 file = find_file (argv[0]);
9080 return file;
9084 /* %:find-plugindir spec function. This function replaces its argument
9085 by the -iplugindir=<dir> option. `dir' is found through find_file, that
9086 is the -print-file-name gcc program option. */
9087 static const char *
9088 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
9090 const char *option;
9092 if (argc != 0)
9093 abort ();
9095 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
9096 return option;
9100 /* %:print-asm-header spec function. Print a banner to say that the
9101 following output is from the assembler. */
9103 static const char *
9104 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
9105 const char **argv ATTRIBUTE_UNUSED)
9107 printf (_("Assembler options\n=================\n\n"));
9108 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
9109 fflush (stdout);
9110 return NULL;
9113 /* Get a random number for -frandom-seed */
9115 static unsigned HOST_WIDE_INT
9116 get_random_number (void)
9118 unsigned HOST_WIDE_INT ret = 0;
9119 int fd;
9121 fd = open ("/dev/urandom", O_RDONLY);
9122 if (fd >= 0)
9124 read (fd, &ret, sizeof (HOST_WIDE_INT));
9125 close (fd);
9126 if (ret)
9127 return ret;
9130 /* Get some more or less random data. */
9131 #ifdef HAVE_GETTIMEOFDAY
9133 struct timeval tv;
9135 gettimeofday (&tv, NULL);
9136 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
9138 #else
9140 time_t now = time (NULL);
9142 if (now != (time_t)-1)
9143 ret = (unsigned) now;
9145 #endif
9147 return ret ^ getpid ();
9150 /* %:compare-debug-dump-opt spec function. Save the last argument,
9151 expected to be the last -fdump-final-insns option, or generate a
9152 temporary. */
9154 static const char *
9155 compare_debug_dump_opt_spec_function (int arg,
9156 const char **argv ATTRIBUTE_UNUSED)
9158 char *ret;
9159 char *name;
9160 int which;
9161 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
9163 if (arg != 0)
9164 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
9166 do_spec_2 ("%{fdump-final-insns=*:%*}");
9167 do_spec_1 (" ", 0, NULL);
9169 if (argbuf.length () > 0
9170 && strcmp (argv[argbuf.length () - 1], "."))
9172 if (!compare_debug)
9173 return NULL;
9175 name = xstrdup (argv[argbuf.length () - 1]);
9176 ret = NULL;
9178 else
9180 const char *ext = NULL;
9182 if (argbuf.length () > 0)
9184 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
9185 ext = ".gkd";
9187 else if (!compare_debug)
9188 return NULL;
9189 else
9190 do_spec_2 ("%g.gkd");
9192 do_spec_1 (" ", 0, NULL);
9194 gcc_assert (argbuf.length () > 0);
9196 name = concat (argbuf.last (), ext, NULL);
9198 ret = concat ("-fdump-final-insns=", name, NULL);
9201 which = compare_debug < 0;
9202 debug_check_temp_file[which] = name;
9204 if (!which)
9206 unsigned HOST_WIDE_INT value = get_random_number ();
9208 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
9211 if (*random_seed)
9213 char *tmp = ret;
9214 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
9215 ret, NULL);
9216 free (tmp);
9219 if (which)
9220 *random_seed = 0;
9222 return ret;
9225 static const char *debug_auxbase_opt;
9227 /* %:compare-debug-self-opt spec function. Expands to the options
9228 that are to be passed in the second compilation of
9229 compare-debug. */
9231 static const char *
9232 compare_debug_self_opt_spec_function (int arg,
9233 const char **argv ATTRIBUTE_UNUSED)
9235 if (arg != 0)
9236 fatal_error ("too many arguments to %%:compare-debug-self-opt");
9238 if (compare_debug >= 0)
9239 return NULL;
9241 do_spec_2 ("%{c|S:%{o*:%*}}");
9242 do_spec_1 (" ", 0, NULL);
9244 if (argbuf.length () > 0)
9245 debug_auxbase_opt = concat ("-auxbase-strip ",
9246 argbuf.last (),
9247 NULL);
9248 else
9249 debug_auxbase_opt = NULL;
9251 return concat ("\
9252 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
9253 %<fdump-final-insns=* -w -S -o %j \
9254 %{!fcompare-debug-second:-fcompare-debug-second} \
9255 ", compare_debug_opt, NULL);
9258 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
9259 options that are to be passed in the second compilation of
9260 compare-debug. It expects, as an argument, the basename of the
9261 current input file name, with the .gk suffix appended to it. */
9263 static const char *
9264 compare_debug_auxbase_opt_spec_function (int arg,
9265 const char **argv)
9267 char *name;
9268 int len;
9270 if (arg == 0)
9271 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
9273 if (arg != 1)
9274 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
9276 if (compare_debug >= 0)
9277 return NULL;
9279 len = strlen (argv[0]);
9280 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
9281 fatal_error ("argument to %%:compare-debug-auxbase-opt "
9282 "does not end in .gk");
9284 if (debug_auxbase_opt)
9285 return debug_auxbase_opt;
9287 #define OPT "-auxbase "
9289 len -= 3;
9290 name = (char*) xmalloc (sizeof (OPT) + len);
9291 memcpy (name, OPT, sizeof (OPT) - 1);
9292 memcpy (name + sizeof (OPT) - 1, argv[0], len);
9293 name[sizeof (OPT) - 1 + len] = '\0';
9295 #undef OPT
9297 return name;
9300 /* %:pass-through-libs spec function. Finds all -l options and input
9301 file names in the lib spec passed to it, and makes a list of them
9302 prepended with the plugin option to cause them to be passed through
9303 to the final link after all the new object files have been added. */
9305 const char *
9306 pass_through_libs_spec_func (int argc, const char **argv)
9308 char *prepended = xstrdup (" ");
9309 int n;
9310 /* Shlemiel the painter's algorithm. Innately horrible, but at least
9311 we know that there will never be more than a handful of strings to
9312 concat, and it's only once per run, so it's not worth optimising. */
9313 for (n = 0; n < argc; n++)
9315 char *old = prepended;
9316 /* Anything that isn't an option is a full path to an output
9317 file; pass it through if it ends in '.a'. Among options,
9318 pass only -l. */
9319 if (argv[n][0] == '-' && argv[n][1] == 'l')
9321 const char *lopt = argv[n] + 2;
9322 /* Handle both joined and non-joined -l options. If for any
9323 reason there's a trailing -l with no joined or following
9324 arg just discard it. */
9325 if (!*lopt && ++n >= argc)
9326 break;
9327 else if (!*lopt)
9328 lopt = argv[n];
9329 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
9330 lopt, " ", NULL);
9332 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
9334 prepended = concat (prepended, "-plugin-opt=-pass-through=",
9335 argv[n], " ", NULL);
9337 if (prepended != old)
9338 free (old);
9340 return prepended;
9343 /* %:replace-extension spec function. Replaces the extension of the
9344 first argument with the second argument. */
9346 const char *
9347 replace_extension_spec_func (int argc, const char **argv)
9349 char *name;
9350 char *p;
9351 char *result;
9352 int i;
9354 if (argc != 2)
9355 fatal_error ("too few arguments to %%:replace-extension");
9357 name = xstrdup (argv[0]);
9359 for (i = strlen (name) - 1; i >= 0; i--)
9360 if (IS_DIR_SEPARATOR (name[i]))
9361 break;
9363 p = strrchr (name + i + 1, '.');
9364 if (p != NULL)
9365 *p = '\0';
9367 result = concat (name, argv[1], NULL);
9369 free (name);
9370 return result;
9373 /* Insert backslash before spaces in ORIG (usually a file path), to
9374 avoid being broken by spec parser.
9376 This function is needed as do_spec_1 treats white space (' ' and '\t')
9377 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
9378 the file name should be treated as a single argument rather than being
9379 broken into multiple. Solution is to insert '\\' before the space in a
9380 file name.
9382 This function converts and only converts all occurrence of ' '
9383 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
9384 "a b" -> "a\\ b"
9385 "a b" -> "a\\ \\ b"
9386 "a\tb" -> "a\\\tb"
9387 "a\\ b" -> "a\\\\ b"
9389 orig: input null-terminating string that was allocated by xalloc. The
9390 memory it points to might be freed in this function. Behavior undefined
9391 if ORIG wasn't xalloced or was freed already at entry.
9393 Return: ORIG if no conversion needed. Otherwise a newly allocated string
9394 that was converted from ORIG. */
9396 static char *
9397 convert_white_space (char *orig)
9399 int len, number_of_space = 0;
9401 for (len = 0; orig[len]; len++)
9402 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
9404 if (number_of_space)
9406 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
9407 int j, k;
9408 for (j = 0, k = 0; j <= len; j++, k++)
9410 if (orig[j] == ' ' || orig[j] == '\t')
9411 new_spec[k++] = '\\';
9412 new_spec[k] = orig[j];
9414 free (orig);
9415 return new_spec;
9417 else
9418 return orig;