2013-11-08 Andrew MacLeod <amacleod@redhat.com>
[official-gcc.git] / gcc / gcc.c
blobdff7477f54e1c60dad0616b97f1bfded63eaf042
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2013 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 /* Whether we should report subprocess execution times to a file. */
110 FILE *report_times_to_file = NULL;
112 /* Nonzero means place this string before uses of /, so that include
113 and library files can be found in an alternate location. */
115 #ifdef TARGET_SYSTEM_ROOT
116 static const char *target_system_root = TARGET_SYSTEM_ROOT;
117 #else
118 static const char *target_system_root = 0;
119 #endif
121 /* Nonzero means pass the updated target_system_root to the compiler. */
123 static int target_system_root_changed;
125 /* Nonzero means append this string to target_system_root. */
127 static const char *target_sysroot_suffix = 0;
129 /* Nonzero means append this string to target_system_root for headers. */
131 static const char *target_sysroot_hdrs_suffix = 0;
133 /* Nonzero means write "temp" files in source directory
134 and use the source file's name in them, and don't delete them. */
136 static enum save_temps {
137 SAVE_TEMPS_NONE, /* no -save-temps */
138 SAVE_TEMPS_CWD, /* -save-temps in current directory */
139 SAVE_TEMPS_OBJ /* -save-temps in object directory */
140 } save_temps_flag;
142 /* Output file to use to get the object directory for -save-temps=obj */
143 static char *save_temps_prefix = 0;
144 static size_t save_temps_length = 0;
146 /* The compiler version. */
148 static const char *compiler_version;
150 /* The target version. */
152 static const char *const spec_version = DEFAULT_TARGET_VERSION;
154 /* The target machine. */
156 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
158 /* Nonzero if cross-compiling.
159 When -b is used, the value comes from the `specs' file. */
161 #ifdef CROSS_DIRECTORY_STRUCTURE
162 static const char *cross_compile = "1";
163 #else
164 static const char *cross_compile = "0";
165 #endif
167 /* Greatest exit code of sub-processes that has been encountered up to
168 now. */
169 static int greatest_status = 1;
171 /* This is the obstack which we use to allocate many strings. */
173 static struct obstack obstack;
175 /* This is the obstack to build an environment variable to pass to
176 collect2 that describes all of the relevant switches of what to
177 pass the compiler in building the list of pointers to constructors
178 and destructors. */
180 static struct obstack collect_obstack;
182 /* Forward declaration for prototypes. */
183 struct path_prefix;
184 struct prefix_list;
186 static void init_spec (void);
187 static void store_arg (const char *, int, int);
188 static void insert_wrapper (const char *);
189 static char *load_specs (const char *);
190 static void read_specs (const char *, bool, bool);
191 static void set_spec (const char *, const char *, bool);
192 static struct compiler *lookup_compiler (const char *, size_t, const char *);
193 static char *build_search_list (const struct path_prefix *, const char *,
194 bool, bool);
195 static void xputenv (const char *);
196 static void putenv_from_prefixes (const struct path_prefix *, const char *,
197 bool);
198 static int access_check (const char *, int);
199 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
200 static void add_prefix (struct path_prefix *, const char *, const char *,
201 int, int, int);
202 static void add_sysrooted_prefix (struct path_prefix *, const char *,
203 const char *, int, int, int);
204 static char *skip_whitespace (char *);
205 static void delete_if_ordinary (const char *);
206 static void delete_temp_files (void);
207 static void delete_failure_queue (void);
208 static void clear_failure_queue (void);
209 static int check_live_switch (int, int);
210 static const char *handle_braces (const char *);
211 static inline bool input_suffix_matches (const char *, const char *);
212 static inline bool switch_matches (const char *, const char *, int);
213 static inline void mark_matching_switches (const char *, const char *, int);
214 static inline void process_marked_switches (void);
215 static const char *process_brace_body (const char *, const char *, const char *, int, int);
216 static const struct spec_function *lookup_spec_function (const char *);
217 static const char *eval_spec_function (const char *, const char *);
218 static const char *handle_spec_function (const char *, bool *);
219 static char *save_string (const char *, int);
220 static void set_collect_gcc_options (void);
221 static int do_spec_1 (const char *, int, const char *);
222 static int do_spec_2 (const char *);
223 static void do_option_spec (const char *, const char *);
224 static void do_self_spec (const char *);
225 static const char *find_file (const char *);
226 static int is_directory (const char *, bool);
227 static const char *validate_switches (const char *, bool);
228 static void validate_all_switches (void);
229 static inline void validate_switches_from_spec (const char *, bool);
230 static void give_switch (int, int);
231 static int used_arg (const char *, int);
232 static int default_arg (const char *, int);
233 static void set_multilib_dir (void);
234 static void print_multilib_info (void);
235 static void perror_with_name (const char *);
236 static void display_help (void);
237 static void add_preprocessor_option (const char *, int);
238 static void add_assembler_option (const char *, int);
239 static void add_linker_option (const char *, int);
240 static void process_command (unsigned int, struct cl_decoded_option *);
241 static int execute (void);
242 static void alloc_args (void);
243 static void clear_args (void);
244 static void fatal_signal (int);
245 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
246 static void init_gcc_specs (struct obstack *, const char *, const char *,
247 const char *);
248 #endif
249 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
250 static const char *convert_filename (const char *, int, int);
251 #endif
253 static const char *getenv_spec_function (int, const char **);
254 static const char *if_exists_spec_function (int, const char **);
255 static const char *if_exists_else_spec_function (int, const char **);
256 static const char *sanitize_spec_function (int, const char **);
257 static const char *replace_outfile_spec_function (int, const char **);
258 static const char *remove_outfile_spec_function (int, const char **);
259 static const char *version_compare_spec_function (int, const char **);
260 static const char *include_spec_function (int, const char **);
261 static const char *find_file_spec_function (int, const char **);
262 static const char *find_plugindir_spec_function (int, const char **);
263 static const char *print_asm_header_spec_function (int, const char **);
264 static const char *compare_debug_dump_opt_spec_function (int, const char **);
265 static const char *compare_debug_self_opt_spec_function (int, const char **);
266 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
267 static const char *pass_through_libs_spec_func (int, const char **);
268 static const char *replace_extension_spec_func (int, const char **);
269 static char *convert_white_space (char *);
271 /* The Specs Language
273 Specs are strings containing lines, each of which (if not blank)
274 is made up of a program name, and arguments separated by spaces.
275 The program name must be exact and start from root, since no path
276 is searched and it is unreliable to depend on the current working directory.
277 Redirection of input or output is not supported; the subprograms must
278 accept filenames saying what files to read and write.
280 In addition, the specs can contain %-sequences to substitute variable text
281 or for conditional text. Here is a table of all defined %-sequences.
282 Note that spaces are not generated automatically around the results of
283 expanding these sequences; therefore, you can concatenate them together
284 or with constant text in a single argument.
286 %% substitute one % into the program name or argument.
287 %i substitute the name of the input file being processed.
288 %b substitute the basename of the input file being processed.
289 This is the substring up to (and not including) the last period
290 and not including the directory unless -save-temps was specified
291 to put temporaries in a different location.
292 %B same as %b, but include the file suffix (text after the last period).
293 %gSUFFIX
294 substitute a file name that has suffix SUFFIX and is chosen
295 once per compilation, and mark the argument a la %d. To reduce
296 exposure to denial-of-service attacks, the file name is now
297 chosen in a way that is hard to predict even when previously
298 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
299 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
300 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
301 had been pre-processed. Previously, %g was simply substituted
302 with a file name chosen once per compilation, without regard
303 to any appended suffix (which was therefore treated just like
304 ordinary text), making such attacks more likely to succeed.
305 %|SUFFIX
306 like %g, but if -pipe is in effect, expands simply to "-".
307 %mSUFFIX
308 like %g, but if -pipe is in effect, expands to nothing. (We have both
309 %| and %m to accommodate differences between system assemblers; see
310 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
311 %uSUFFIX
312 like %g, but generates a new temporary file name even if %uSUFFIX
313 was already seen.
314 %USUFFIX
315 substitutes the last file name generated with %uSUFFIX, generating a
316 new one if there is no such last file name. In the absence of any
317 %uSUFFIX, this is just like %gSUFFIX, except they don't share
318 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
319 would involve the generation of two distinct file names, one
320 for each `%g.s' and another for each `%U.s'. Previously, %U was
321 simply substituted with a file name chosen for the previous %u,
322 without regard to any appended suffix.
323 %jSUFFIX
324 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
325 writable, and if save-temps is off; otherwise, substitute the name
326 of a temporary file, just like %u. This temporary file is not
327 meant for communication between processes, but rather as a junk
328 disposal mechanism.
329 %.SUFFIX
330 substitutes .SUFFIX for the suffixes of a matched switch's args when
331 it is subsequently output with %*. SUFFIX is terminated by the next
332 space or %.
333 %d marks the argument containing or following the %d as a
334 temporary file name, so that that file will be deleted if GCC exits
335 successfully. Unlike %g, this contributes no text to the argument.
336 %w marks the argument containing or following the %w as the
337 "output file" of this compilation. This puts the argument
338 into the sequence of arguments that %o will substitute later.
339 %V indicates that this compilation produces no "output file".
340 %W{...}
341 like %{...} but mark last argument supplied within
342 as a file to be deleted on failure.
343 %o substitutes the names of all the output files, with spaces
344 automatically placed around them. You should write spaces
345 around the %o as well or the results are undefined.
346 %o is for use in the specs for running the linker.
347 Input files whose names have no recognized suffix are not compiled
348 at all, but they are included among the output files, so they will
349 be linked.
350 %O substitutes the suffix for object files. Note that this is
351 handled specially when it immediately follows %g, %u, or %U
352 (with or without a suffix argument) because of the need for
353 those to form complete file names. The handling is such that
354 %O is treated exactly as if it had already been substituted,
355 except that %g, %u, and %U do not currently support additional
356 SUFFIX characters following %O as they would following, for
357 example, `.o'.
358 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
359 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
360 and -B options) and -imultilib as necessary.
361 %s current argument is the name of a library or startup file of some sort.
362 Search for that file in a standard list of directories
363 and substitute the full name found.
364 %eSTR Print STR as an error message. STR is terminated by a newline.
365 Use this when inconsistent options are detected.
366 %nSTR Print STR as a notice. STR is terminated by a newline.
367 %x{OPTION} Accumulate an option for %X.
368 %X Output the accumulated linker options specified by compilations.
369 %Y Output the accumulated assembler options specified by compilations.
370 %Z Output the accumulated preprocessor options specified by compilations.
371 %a process ASM_SPEC as a spec.
372 This allows config.h to specify part of the spec for running as.
373 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
374 used here. This can be used to run a post-processor after the
375 assembler has done its job.
376 %D Dump out a -L option for each directory in startfile_prefixes.
377 If multilib_dir is set, extra entries are generated with it affixed.
378 %l process LINK_SPEC as a spec.
379 %L process LIB_SPEC as a spec.
380 %M Output multilib_os_dir.
381 %G process LIBGCC_SPEC as a spec.
382 %R Output the concatenation of target_system_root and
383 target_sysroot_suffix.
384 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
385 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
386 %C process CPP_SPEC as a spec.
387 %1 process CC1_SPEC as a spec.
388 %2 process CC1PLUS_SPEC as a spec.
389 %* substitute the variable part of a matched option. (See below.)
390 Note that each comma in the substituted string is replaced by
391 a single space. A space is appended after the last substition
392 unless there is more text in current sequence.
393 %<S remove all occurrences of -S from the command line.
394 Note - this command is position dependent. % commands in the
395 spec string before this one will see -S, % commands in the
396 spec string after this one will not.
397 %>S Similar to "%<S", but keep it in the GCC command line.
398 %<S* remove all occurrences of all switches beginning with -S from the
399 command line.
400 %:function(args)
401 Call the named function FUNCTION, passing it ARGS. ARGS is
402 first processed as a nested spec string, then split into an
403 argument vector in the usual fashion. The function returns
404 a string which is processed as if it had appeared literally
405 as part of the current spec.
406 %{S} substitutes the -S switch, if that switch was given to GCC.
407 If that switch was not specified, this substitutes nothing.
408 Here S is a metasyntactic variable.
409 %{S*} substitutes all the switches specified to GCC whose names start
410 with -S. This is used for -o, -I, etc; switches that take
411 arguments. GCC considers `-o foo' as being one switch whose
412 name starts with `o'. %{o*} would substitute this text,
413 including the space; thus, two arguments would be generated.
414 %{S*&T*} likewise, but preserve order of S and T options (the order
415 of S and T in the spec is not significant). Can be any number
416 of ampersand-separated variables; for each the wild card is
417 optional. Useful for CPP as %{D*&U*&A*}.
419 %{S:X} substitutes X, if the -S switch was given to GCC.
420 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
421 %{S*:X} substitutes X if one or more switches whose names start
422 with -S was given to GCC. Normally X is substituted only
423 once, no matter how many such switches appeared. However,
424 if %* appears somewhere in X, then X will be substituted
425 once for each matching switch, with the %* replaced by the
426 part of that switch that matched the '*'. A space will be
427 appended after the last substition unless there is more
428 text in current sequence.
429 %{.S:X} substitutes X, if processing a file with suffix S.
430 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
431 %{,S:X} substitutes X, if processing a file which will use spec S.
432 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
434 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
435 combined with '!', '.', ',', and '*' as above binding stronger
436 than the OR.
437 If %* appears in X, all of the alternatives must be starred, and
438 only the first matching alternative is substituted.
439 %{%:function(args):X}
440 Call function named FUNCTION with args ARGS. If the function
441 returns non-NULL, then X is substituted, if it returns
442 NULL, it isn't substituted.
443 %{S:X; if S was given to GCC, substitutes X;
444 T:Y; else if T was given to GCC, substitutes Y;
445 :D} else substitutes D. There can be as many clauses as you need.
446 This may be combined with '.', '!', ',', '|', and '*' as above.
448 %(Spec) processes a specification defined in a specs file as *Spec:
450 The conditional text X in a %{S:X} or similar construct may contain
451 other nested % constructs or spaces, or even newlines. They are
452 processed as usual, as described above. Trailing white space in X is
453 ignored. White space may also appear anywhere on the left side of the
454 colon in these constructs, except between . or * and the corresponding
455 word.
457 The -O, -f, -g, -m, and -W switches are handled specifically in these
458 constructs. If another value of -O or the negated form of a -f, -m, or
459 -W switch is found later in the command line, the earlier switch
460 value is ignored, except with {S*} where S is just one letter; this
461 passes all matching options.
463 The character | at the beginning of the predicate text is used to indicate
464 that a command should be piped to the following command, but only if -pipe
465 is specified.
467 Note that it is built into GCC which switches take arguments and which
468 do not. You might think it would be useful to generalize this to
469 allow each compiler's spec to say which switches take arguments. But
470 this cannot be done in a consistent fashion. GCC cannot even decide
471 which input files have been specified without knowing which switches
472 take arguments, and it must know which input files to compile in order
473 to tell which compilers to run.
475 GCC also knows implicitly that arguments starting in `-l' are to be
476 treated as compiler output files, and passed to the linker in their
477 proper position among the other output files. */
479 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
481 /* config.h can define ASM_SPEC to provide extra args to the assembler
482 or extra switch-translations. */
483 #ifndef ASM_SPEC
484 #define ASM_SPEC ""
485 #endif
487 /* config.h can define ASM_FINAL_SPEC to run a post processor after
488 the assembler has run. */
489 #ifndef ASM_FINAL_SPEC
490 #define ASM_FINAL_SPEC \
491 "%{gsplit-dwarf: \n\
492 objcopy --extract-dwo \
493 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
494 %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo} \n\
495 objcopy --strip-dwo \
496 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
498 #endif
500 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
501 or extra switch-translations. */
502 #ifndef CPP_SPEC
503 #define CPP_SPEC ""
504 #endif
506 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
507 or extra switch-translations. */
508 #ifndef CC1_SPEC
509 #define CC1_SPEC ""
510 #endif
512 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
513 or extra switch-translations. */
514 #ifndef CC1PLUS_SPEC
515 #define CC1PLUS_SPEC ""
516 #endif
518 /* config.h can define LINK_SPEC to provide extra args to the linker
519 or extra switch-translations. */
520 #ifndef LINK_SPEC
521 #define LINK_SPEC ""
522 #endif
524 /* config.h can define LIB_SPEC to override the default libraries. */
525 #ifndef LIB_SPEC
526 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
527 #endif
529 /* When using -fsplit-stack we need to wrap pthread_create, in order
530 to initialize the stack guard. We always use wrapping, rather than
531 shared library ordering, and we keep the wrapper function in
532 libgcc. This is not yet a real spec, though it could become one;
533 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
534 only works with GNU ld and gold. */
535 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
537 #ifndef LIBASAN_SPEC
538 #ifdef STATIC_LIBASAN_LIBS
539 #define ADD_STATIC_LIBASAN_LIBS \
540 " %{static-libasan:" STATIC_LIBASAN_LIBS "}"
541 #else
542 #define ADD_STATIC_LIBASAN_LIBS
543 #endif
544 #ifdef LIBASAN_EARLY_SPEC
545 #define LIBASAN_SPEC ADD_STATIC_LIBASAN_LIBS
546 #elif defined(HAVE_LD_STATIC_DYNAMIC)
547 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
548 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
549 ADD_STATIC_LIBASAN_LIBS
550 #else
551 #define LIBASAN_SPEC "-lasan" ADD_STATIC_LIBASAN_LIBS
552 #endif
553 #endif
555 #ifndef LIBASAN_EARLY_SPEC
556 #define LIBASAN_EARLY_SPEC ""
557 #endif
559 #ifndef LIBTSAN_SPEC
560 #ifdef STATIC_LIBTSAN_LIBS
561 #define ADD_STATIC_LIBTSAN_LIBS \
562 " %{static-libtsan:" STATIC_LIBTSAN_LIBS "}"
563 #else
564 #define ADD_STATIC_LIBTSAN_LIBS
565 #endif
566 #ifdef LIBTSAN_EARLY_SPEC
567 #define LIBTSAN_SPEC ADD_STATIC_LIBTSAN_LIBS
568 #elif defined(HAVE_LD_STATIC_DYNAMIC)
569 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
570 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
571 ADD_STATIC_LIBTSAN_LIBS
572 #else
573 #define LIBTSAN_SPEC "-ltsan" ADD_STATIC_LIBTSAN_LIBS
574 #endif
575 #endif
577 #ifndef LIBTSAN_EARLY_SPEC
578 #define LIBTSAN_EARLY_SPEC ""
579 #endif
581 #ifndef LIBUBSAN_SPEC
582 #ifdef STATIC_LIBUBSAN_LIBS
583 #define ADD_STATIC_LIBUBSAN_LIBS \
584 " %{static-libubsan:" STATIC_LIBUBSAN_LIBS "}"
585 #else
586 #define ADD_STATIC_LIBUBSAN_LIBS
587 #endif
588 #ifdef LIBUBSAN_EARLY_SPEC
589 #define LIBUBSAN_SPEC ADD_STATIC_LIBUBSAN_LIBS
590 #elif defined(HAVE_LD_STATIC_DYNAMIC)
591 #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
592 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
593 ADD_STATIC_LIBUBSAN_LIBS
594 #else
595 #define LIBUBSAN_SPEC "-lubsan" ADD_STATIC_LIBUBSAN_LIBS
596 #endif
597 #endif
599 #ifndef LIBUBSAN_EARLY_SPEC
600 #define LIBUBSAN_EARLY_SPEC ""
601 #endif
603 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
604 included. */
605 #ifndef LIBGCC_SPEC
606 #if defined(REAL_LIBGCC_SPEC)
607 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
608 #elif defined(LINK_LIBGCC_SPECIAL_1)
609 /* Have gcc do the search for libgcc.a. */
610 #define LIBGCC_SPEC "libgcc.a%s"
611 #else
612 #define LIBGCC_SPEC "-lgcc"
613 #endif
614 #endif
616 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
617 #ifndef STARTFILE_SPEC
618 #define STARTFILE_SPEC \
619 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
620 #endif
622 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
623 #ifndef ENDFILE_SPEC
624 #define ENDFILE_SPEC ""
625 #endif
627 #ifndef LINKER_NAME
628 #define LINKER_NAME "collect2"
629 #endif
631 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
632 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
633 #else
634 #define ASM_MAP ""
635 #endif
637 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
638 to the assembler. */
639 #ifndef ASM_DEBUG_SPEC
640 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
641 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
642 # define ASM_DEBUG_SPEC \
643 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
644 ? "%{!g0:%{gdwarf*:--gdwarf2}%{!gdwarf*:%{g*:--gstabs}}}" ASM_MAP \
645 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
646 # else
647 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
648 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
649 # endif
650 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
651 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
652 # endif
653 # endif
654 #endif
655 #ifndef ASM_DEBUG_SPEC
656 # define ASM_DEBUG_SPEC ""
657 #endif
659 /* Here is the spec for running the linker, after compiling all files. */
661 /* This is overridable by the target in case they need to specify the
662 -lgcc and -lc order specially, yet not require them to override all
663 of LINK_COMMAND_SPEC. */
664 #ifndef LINK_GCC_C_SEQUENCE_SPEC
665 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
666 #endif
668 #ifndef LINK_SSP_SPEC
669 #ifdef TARGET_LIBC_PROVIDES_SSP
670 #define LINK_SSP_SPEC "%{fstack-protector:}"
671 #else
672 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-strong|fstack-protector-all:-lssp_nonshared -lssp}"
673 #endif
674 #endif
676 #ifndef LINK_PIE_SPEC
677 #ifdef HAVE_LD_PIE
678 #define LINK_PIE_SPEC "%{pie:-pie} "
679 #else
680 #define LINK_PIE_SPEC "%{pie:} "
681 #endif
682 #endif
684 #ifndef LINK_BUILDID_SPEC
685 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
686 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
687 # endif
688 #endif
690 /* Conditional to test whether the LTO plugin is used or not.
691 FIXME: For slim LTO we will need to enable plugin unconditionally. This
692 still cause problems with PLUGIN_LD != LD and when plugin is built but
693 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
694 plugin only when LTO is enabled. We still honor explicit
695 -fuse-linker-plugin if the linker used understands -plugin. */
697 /* The linker has some plugin support. */
698 #if HAVE_LTO_PLUGIN > 0
699 /* The linker used has full plugin support, use LTO plugin by default. */
700 #if HAVE_LTO_PLUGIN == 2
701 #define PLUGIN_COND "!fno-use-linker-plugin:%{flto|flto=*|fuse-linker-plugin"
702 #define PLUGIN_COND_CLOSE "}"
703 #else
704 /* The linker used has limited plugin support, use LTO plugin with explicit
705 -fuse-linker-plugin. */
706 #define PLUGIN_COND "fuse-linker-plugin"
707 #define PLUGIN_COND_CLOSE ""
708 #endif
709 #define LINK_PLUGIN_SPEC \
710 "%{"PLUGIN_COND": \
711 -plugin %(linker_plugin_file) \
712 -plugin-opt=%(lto_wrapper) \
713 -plugin-opt=-fresolution=%u.res \
714 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
715 }"PLUGIN_COND_CLOSE
716 #else
717 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
718 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
719 %e-fuse-linker-plugin is not supported in this configuration}"
720 #endif
722 /* Linker command line options for -fsanitize= early on the command line. */
723 #ifndef SANITIZER_EARLY_SPEC
724 #define SANITIZER_EARLY_SPEC "\
725 %{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
726 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
727 %{%:sanitize(undefined):" LIBUBSAN_EARLY_SPEC "}}}"
728 #endif
730 /* Linker command line options for -fsanitize= late on the command line. */
731 #ifndef SANITIZER_SPEC
732 #define SANITIZER_SPEC "\
733 %{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
734 %{static:%ecannot specify -static with -fsanitize=address}\
735 %{%:sanitize(thread):%e-fsanitize=address is incompatible with -fsanitize=thread}}\
736 %{%:sanitize(thread):" LIBTSAN_SPEC "\
737 %{!pie:%{!shared:%e-fsanitize=thread linking must be done with -pie or -shared}}}\
738 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}}}"
739 #endif
741 /* This is the spec to use, once the code for creating the vtable
742 verification runtime library, libvtv.so, has been created. Currently
743 the vtable verification runtime functions are in libstdc++, so we use
744 the spec just below this one. */
745 #ifndef VTABLE_VERIFICATION_SPEC
746 #define VTABLE_VERIFICATION_SPEC "\
747 %{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
748 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}"
749 #endif
751 /* -u* was put back because both BSD and SysV seem to support it. */
752 /* %{static:} simply prevents an error message if the target machine
753 doesn't handle -static. */
754 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
755 scripts which exist in user specified directories, or in standard
756 directories. */
757 /* We pass any -flto flags on to the linker, which is expected
758 to understand them. In practice, this means it had better be collect2. */
759 /* %{e*} includes -export-dynamic; see comment in common.opt. */
760 #ifndef LINK_COMMAND_SPEC
761 #define LINK_COMMAND_SPEC "\
762 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
763 %(linker) " \
764 LINK_PLUGIN_SPEC \
765 "%{flto|flto=*:%<fcompare-debug*} \
766 %{flto} %{flto=*} %l " LINK_PIE_SPEC \
767 "%{fuse-ld=*:-fuse-ld=%*}\
768 %X %{o*} %{e*} %{N} %{n} %{r}\
769 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
770 %{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
771 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
772 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
773 %(mflib) " STACK_SPLIT_SPEC "\
774 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
775 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
776 %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}"
777 #endif
779 #ifndef LINK_LIBGCC_SPEC
780 /* Generate -L options for startfile prefix list. */
781 # define LINK_LIBGCC_SPEC "%D"
782 #endif
784 #ifndef STARTFILE_PREFIX_SPEC
785 # define STARTFILE_PREFIX_SPEC ""
786 #endif
788 #ifndef SYSROOT_SPEC
789 # define SYSROOT_SPEC "--sysroot=%R"
790 #endif
792 #ifndef SYSROOT_SUFFIX_SPEC
793 # define SYSROOT_SUFFIX_SPEC ""
794 #endif
796 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
797 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
798 #endif
800 static const char *asm_debug = ASM_DEBUG_SPEC;
801 static const char *cpp_spec = CPP_SPEC;
802 static const char *cc1_spec = CC1_SPEC;
803 static const char *cc1plus_spec = CC1PLUS_SPEC;
804 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
805 static const char *link_ssp_spec = LINK_SSP_SPEC;
806 static const char *asm_spec = ASM_SPEC;
807 static const char *asm_final_spec = ASM_FINAL_SPEC;
808 static const char *link_spec = LINK_SPEC;
809 static const char *lib_spec = LIB_SPEC;
810 static const char *link_gomp_spec = "";
811 static const char *libgcc_spec = LIBGCC_SPEC;
812 static const char *endfile_spec = ENDFILE_SPEC;
813 static const char *startfile_spec = STARTFILE_SPEC;
814 static const char *linker_name_spec = LINKER_NAME;
815 static const char *linker_plugin_file_spec = "";
816 static const char *lto_wrapper_spec = "";
817 static const char *lto_gcc_spec = "";
818 static const char *link_command_spec = LINK_COMMAND_SPEC;
819 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
820 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
821 static const char *sysroot_spec = SYSROOT_SPEC;
822 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
823 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
824 static const char *self_spec = "";
826 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
827 There should be no need to override these in target dependent files,
828 but we need to copy them to the specs file so that newer versions
829 of the GCC driver can correctly drive older tool chains with the
830 appropriate -B options. */
832 /* When cpplib handles traditional preprocessing, get rid of this, and
833 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
834 that we default the front end language better. */
835 static const char *trad_capable_cpp =
836 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
838 /* We don't wrap .d files in %W{} since a missing .d file, and
839 therefore no dependency entry, confuses make into thinking a .o
840 file that happens to exist is up-to-date. */
841 static const char *cpp_unique_options =
842 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
843 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
844 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
845 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
846 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
847 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
848 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
849 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
850 %{E|M|MM:%W{o*}}";
852 /* This contains cpp options which are common with cc1_options and are passed
853 only when preprocessing only to avoid duplication. We pass the cc1 spec
854 options to the preprocessor so that it the cc1 spec may manipulate
855 options used to set target flags. Those special target flags settings may
856 in turn cause preprocessor symbols to be defined specially. */
857 static const char *cpp_options =
858 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
859 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
860 %{undef} %{save-temps*:-fpch-preprocess}";
862 /* This contains cpp options which are not passed when the preprocessor
863 output will be used by another program. */
864 static const char *cpp_debug_options = "%{d*}";
866 /* NB: This is shared amongst all front-ends, except for Ada. */
867 static const char *cc1_options =
868 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
869 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
870 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
871 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
872 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
873 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
874 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
875 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
876 %{-target-help:--target-help}\
877 %{-version:--version}\
878 %{-help=*:--help=%*}\
879 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
880 %{fsyntax-only:-o %j} %{-param*}\
881 %{coverage:-fprofile-arcs -ftest-coverage}";
883 static const char *asm_options =
884 "%{-target-help:%:print-asm-header()} "
885 #if HAVE_GNU_AS
886 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
887 to the assembler equivalents. */
888 "%{v} %{w:-W} %{I*} "
889 #endif
890 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
892 static const char *invoke_as =
893 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
894 "%{!fwpa:\
895 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
896 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
898 #else
899 "%{!fwpa:\
900 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
901 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
903 #endif
905 /* Some compilers have limits on line lengths, and the multilib_select
906 and/or multilib_matches strings can be very long, so we build them at
907 run time. */
908 static struct obstack multilib_obstack;
909 static const char *multilib_select;
910 static const char *multilib_matches;
911 static const char *multilib_defaults;
912 static const char *multilib_exclusions;
913 static const char *multilib_reuse;
915 /* Check whether a particular argument is a default argument. */
917 #ifndef MULTILIB_DEFAULTS
918 #define MULTILIB_DEFAULTS { "" }
919 #endif
921 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
923 #ifndef DRIVER_SELF_SPECS
924 #define DRIVER_SELF_SPECS ""
925 #endif
927 /* Linking to libgomp implies pthreads. This is particularly important
928 for targets that use different start files and suchlike. */
929 #ifndef GOMP_SELF_SPECS
930 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
931 #endif
933 /* Likewise for -fgnu-tm. */
934 #ifndef GTM_SELF_SPECS
935 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
936 #endif
938 static const char *const driver_self_specs[] = {
939 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
940 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS
943 #ifndef OPTION_DEFAULT_SPECS
944 #define OPTION_DEFAULT_SPECS { "", "" }
945 #endif
947 struct default_spec
949 const char *name;
950 const char *spec;
953 static const struct default_spec
954 option_default_specs[] = { OPTION_DEFAULT_SPECS };
956 struct user_specs
958 struct user_specs *next;
959 const char *filename;
962 static struct user_specs *user_specs_head, *user_specs_tail;
965 /* Record the mapping from file suffixes for compilation specs. */
967 struct compiler
969 const char *suffix; /* Use this compiler for input files
970 whose names end in this suffix. */
972 const char *spec; /* To use this compiler, run this spec. */
974 const char *cpp_spec; /* If non-NULL, substitute this spec
975 for `%C', rather than the usual
976 cpp_spec. */
977 const int combinable; /* If nonzero, compiler can deal with
978 multiple source files at once (IMA). */
979 const int needs_preprocessing; /* If nonzero, source files need to
980 be run through a preprocessor. */
983 /* Pointer to a vector of `struct compiler' that gives the spec for
984 compiling a file, based on its suffix.
985 A file that does not end in any of these suffixes will be passed
986 unchanged to the loader and nothing else will be done to it.
988 An entry containing two 0s is used to terminate the vector.
990 If multiple entries match a file, the last matching one is used. */
992 static struct compiler *compilers;
994 /* Number of entries in `compilers', not counting the null terminator. */
996 static int n_compilers;
998 /* The default list of file name suffixes and their compilation specs. */
1000 static const struct compiler default_compilers[] =
1002 /* Add lists of suffixes of known languages here. If those languages
1003 were not present when we built the driver, we will hit these copies
1004 and be given a more meaningful error than "file not used since
1005 linking is not done". */
1006 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1007 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1008 {".mii", "#Objective-C++", 0, 0, 0},
1009 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1010 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1011 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1012 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1013 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1014 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1015 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1016 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1017 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1018 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1019 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1020 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1021 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1022 {".r", "#Ratfor", 0, 0, 0},
1023 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1024 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1025 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
1026 {".go", "#Go", 0, 1, 0},
1027 /* Next come the entries for C. */
1028 {".c", "@c", 0, 0, 1},
1029 {"@c",
1030 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1031 external preprocessor if -save-temps is given. */
1032 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1033 %{!E:%{!M:%{!MM:\
1034 %{traditional:\
1035 %eGNU C no longer supports -traditional without -E}\
1036 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1037 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1038 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1039 %(cc1_options)}\
1040 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1041 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1042 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1043 {"-",
1044 "%{!E:%e-E or -x required when input is from standard input}\
1045 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1046 {".h", "@c-header", 0, 0, 0},
1047 {"@c-header",
1048 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1049 external preprocessor if -save-temps is given. */
1050 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1051 %{!E:%{!M:%{!MM:\
1052 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1053 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1054 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1055 %(cc1_options)\
1056 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1057 %W{o*:--output-pch=%*}}%V}\
1058 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1059 cc1 %(cpp_unique_options) %(cc1_options)\
1060 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1061 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
1062 {".i", "@cpp-output", 0, 0, 0},
1063 {"@cpp-output",
1064 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1065 {".s", "@assembler", 0, 0, 0},
1066 {"@assembler",
1067 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1068 {".sx", "@assembler-with-cpp", 0, 0, 0},
1069 {".S", "@assembler-with-cpp", 0, 0, 0},
1070 {"@assembler-with-cpp",
1071 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1072 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1073 %{E|M|MM:%(cpp_debug_options)}\
1074 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1075 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1076 #else
1077 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1078 %{E|M|MM:%(cpp_debug_options)}\
1079 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1080 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1081 #endif
1082 , 0, 0, 0},
1084 #include "specs.h"
1085 /* Mark end of table. */
1086 {0, 0, 0, 0, 0}
1089 /* Number of elements in default_compilers, not counting the terminator. */
1091 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1093 typedef char *char_p; /* For DEF_VEC_P. */
1095 /* A vector of options to give to the linker.
1096 These options are accumulated by %x,
1097 and substituted into the linker command with %X. */
1098 static vec<char_p> linker_options;
1100 /* A vector of options to give to the assembler.
1101 These options are accumulated by -Wa,
1102 and substituted into the assembler command with %Y. */
1103 static vec<char_p> assembler_options;
1105 /* A vector of options to give to the preprocessor.
1106 These options are accumulated by -Wp,
1107 and substituted into the preprocessor command with %Z. */
1108 static vec<char_p> preprocessor_options;
1110 static char *
1111 skip_whitespace (char *p)
1113 while (1)
1115 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1116 be considered whitespace. */
1117 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1118 return p + 1;
1119 else if (*p == '\n' || *p == ' ' || *p == '\t')
1120 p++;
1121 else if (*p == '#')
1123 while (*p != '\n')
1124 p++;
1125 p++;
1127 else
1128 break;
1131 return p;
1133 /* Structures to keep track of prefixes to try when looking for files. */
1135 struct prefix_list
1137 const char *prefix; /* String to prepend to the path. */
1138 struct prefix_list *next; /* Next in linked list. */
1139 int require_machine_suffix; /* Don't use without machine_suffix. */
1140 /* 2 means try both machine_suffix and just_machine_suffix. */
1141 int priority; /* Sort key - priority within list. */
1142 int os_multilib; /* 1 if OS multilib scheme should be used,
1143 0 for GCC multilib scheme. */
1146 struct path_prefix
1148 struct prefix_list *plist; /* List of prefixes to try */
1149 int max_len; /* Max length of a prefix in PLIST */
1150 const char *name; /* Name of this list (used in config stuff) */
1153 /* List of prefixes to try when looking for executables. */
1155 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1157 /* List of prefixes to try when looking for startup (crt0) files. */
1159 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1161 /* List of prefixes to try when looking for include files. */
1163 static struct path_prefix include_prefixes = { 0, 0, "include" };
1165 /* Suffix to attach to directories searched for commands.
1166 This looks like `MACHINE/VERSION/'. */
1168 static const char *machine_suffix = 0;
1170 /* Suffix to attach to directories searched for commands.
1171 This is just `MACHINE/'. */
1173 static const char *just_machine_suffix = 0;
1175 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1177 static const char *gcc_exec_prefix;
1179 /* Adjusted value of standard_libexec_prefix. */
1181 static const char *gcc_libexec_prefix;
1183 /* Default prefixes to attach to command names. */
1185 #ifndef STANDARD_STARTFILE_PREFIX_1
1186 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1187 #endif
1188 #ifndef STANDARD_STARTFILE_PREFIX_2
1189 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1190 #endif
1192 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1193 #undef MD_EXEC_PREFIX
1194 #undef MD_STARTFILE_PREFIX
1195 #undef MD_STARTFILE_PREFIX_1
1196 #endif
1198 /* If no prefixes defined, use the null string, which will disable them. */
1199 #ifndef MD_EXEC_PREFIX
1200 #define MD_EXEC_PREFIX ""
1201 #endif
1202 #ifndef MD_STARTFILE_PREFIX
1203 #define MD_STARTFILE_PREFIX ""
1204 #endif
1205 #ifndef MD_STARTFILE_PREFIX_1
1206 #define MD_STARTFILE_PREFIX_1 ""
1207 #endif
1209 /* These directories are locations set at configure-time based on the
1210 --prefix option provided to configure. Their initializers are
1211 defined in Makefile.in. These paths are not *directly* used when
1212 gcc_exec_prefix is set because, in that case, we know where the
1213 compiler has been installed, and use paths relative to that
1214 location instead. */
1215 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1216 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1217 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1218 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1220 /* For native compilers, these are well-known paths containing
1221 components that may be provided by the system. For cross
1222 compilers, these paths are not used. */
1223 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1224 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1225 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1226 static const char *const standard_startfile_prefix_1
1227 = STANDARD_STARTFILE_PREFIX_1;
1228 static const char *const standard_startfile_prefix_2
1229 = STANDARD_STARTFILE_PREFIX_2;
1231 /* A relative path to be used in finding the location of tools
1232 relative to the driver. */
1233 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1235 /* Subdirectory to use for locating libraries. Set by
1236 set_multilib_dir based on the compilation options. */
1238 static const char *multilib_dir;
1240 /* Subdirectory to use for locating libraries in OS conventions. Set by
1241 set_multilib_dir based on the compilation options. */
1243 static const char *multilib_os_dir;
1245 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1246 set_multilib_dir based on the compilation options. */
1248 static const char *multiarch_dir;
1250 /* Structure to keep track of the specs that have been defined so far.
1251 These are accessed using %(specname) in a compiler or link
1252 spec. */
1254 struct spec_list
1256 /* The following 2 fields must be first */
1257 /* to allow EXTRA_SPECS to be initialized */
1258 const char *name; /* name of the spec. */
1259 const char *ptr; /* available ptr if no static pointer */
1261 /* The following fields are not initialized */
1262 /* by EXTRA_SPECS */
1263 const char **ptr_spec; /* pointer to the spec itself. */
1264 struct spec_list *next; /* Next spec in linked list. */
1265 int name_len; /* length of the name */
1266 bool user_p; /* whether string come from file spec. */
1267 bool alloc_p; /* whether string was allocated */
1270 #define INIT_STATIC_SPEC(NAME,PTR) \
1271 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false }
1273 /* List of statically defined specs. */
1274 static struct spec_list static_specs[] =
1276 INIT_STATIC_SPEC ("asm", &asm_spec),
1277 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1278 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1279 INIT_STATIC_SPEC ("asm_options", &asm_options),
1280 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1281 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1282 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1283 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1284 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1285 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1286 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1287 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1288 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1289 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1290 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1291 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1292 INIT_STATIC_SPEC ("link", &link_spec),
1293 INIT_STATIC_SPEC ("lib", &lib_spec),
1294 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1295 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1296 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1297 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1298 INIT_STATIC_SPEC ("version", &compiler_version),
1299 INIT_STATIC_SPEC ("multilib", &multilib_select),
1300 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1301 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1302 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1303 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1304 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1305 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
1306 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1307 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1308 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1309 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1310 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1311 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1312 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1313 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1314 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1315 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1316 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1317 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1318 INIT_STATIC_SPEC ("self_spec", &self_spec),
1321 #ifdef EXTRA_SPECS /* additional specs needed */
1322 /* Structure to keep track of just the first two args of a spec_list.
1323 That is all that the EXTRA_SPECS macro gives us. */
1324 struct spec_list_1
1326 const char *const name;
1327 const char *const ptr;
1330 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1331 static struct spec_list *extra_specs = (struct spec_list *) 0;
1332 #endif
1334 /* List of dynamically allocates specs that have been defined so far. */
1336 static struct spec_list *specs = (struct spec_list *) 0;
1338 /* List of static spec functions. */
1340 static const struct spec_function static_spec_functions[] =
1342 { "getenv", getenv_spec_function },
1343 { "if-exists", if_exists_spec_function },
1344 { "if-exists-else", if_exists_else_spec_function },
1345 { "sanitize", sanitize_spec_function },
1346 { "replace-outfile", replace_outfile_spec_function },
1347 { "remove-outfile", remove_outfile_spec_function },
1348 { "version-compare", version_compare_spec_function },
1349 { "include", include_spec_function },
1350 { "find-file", find_file_spec_function },
1351 { "find-plugindir", find_plugindir_spec_function },
1352 { "print-asm-header", print_asm_header_spec_function },
1353 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1354 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1355 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1356 { "pass-through-libs", pass_through_libs_spec_func },
1357 { "replace-extension", replace_extension_spec_func },
1358 #ifdef EXTRA_SPEC_FUNCTIONS
1359 EXTRA_SPEC_FUNCTIONS
1360 #endif
1361 { 0, 0 }
1364 static int processing_spec_function;
1366 /* Add appropriate libgcc specs to OBSTACK, taking into account
1367 various permutations of -shared-libgcc, -shared, and such. */
1369 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1371 #ifndef USE_LD_AS_NEEDED
1372 #define USE_LD_AS_NEEDED 0
1373 #endif
1375 static void
1376 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1377 const char *static_name, const char *eh_name)
1379 char *buf;
1381 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1382 "%{!static:%{!static-libgcc:"
1383 #if USE_LD_AS_NEEDED
1384 "%{!shared-libgcc:",
1385 static_name, " " LD_AS_NEEDED_OPTION " ",
1386 shared_name, " " LD_NO_AS_NEEDED_OPTION
1388 "%{shared-libgcc:",
1389 shared_name, "%{!shared: ", static_name, "}"
1391 #else
1392 "%{!shared:"
1393 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1394 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1396 #ifdef LINK_EH_SPEC
1397 "%{shared:"
1398 "%{shared-libgcc:", shared_name, "}"
1399 "%{!shared-libgcc:", static_name, "}"
1401 #else
1402 "%{shared:", shared_name, "}"
1403 #endif
1404 #endif
1405 "}}", NULL);
1407 obstack_grow (obstack, buf, strlen (buf));
1408 free (buf);
1410 #endif /* ENABLE_SHARED_LIBGCC */
1412 /* Initialize the specs lookup routines. */
1414 static void
1415 init_spec (void)
1417 struct spec_list *next = (struct spec_list *) 0;
1418 struct spec_list *sl = (struct spec_list *) 0;
1419 int i;
1421 if (specs)
1422 return; /* Already initialized. */
1424 if (verbose_flag)
1425 fnotice (stderr, "Using built-in specs.\n");
1427 #ifdef EXTRA_SPECS
1428 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1430 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1432 sl = &extra_specs[i];
1433 sl->name = extra_specs_1[i].name;
1434 sl->ptr = extra_specs_1[i].ptr;
1435 sl->next = next;
1436 sl->name_len = strlen (sl->name);
1437 sl->ptr_spec = &sl->ptr;
1438 next = sl;
1440 #endif
1442 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1444 sl = &static_specs[i];
1445 sl->next = next;
1446 next = sl;
1449 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1450 /* ??? If neither -shared-libgcc nor --static-libgcc was
1451 seen, then we should be making an educated guess. Some proposed
1452 heuristics for ELF include:
1454 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1455 program will be doing dynamic loading, which will likely
1456 need the shared libgcc.
1458 (2) If "-ldl", then it's also a fair bet that we're doing
1459 dynamic loading.
1461 (3) For each ET_DYN we're linking against (either through -lfoo
1462 or /some/path/foo.so), check to see whether it or one of
1463 its dependencies depends on a shared libgcc.
1465 (4) If "-shared"
1467 If the runtime is fixed to look for program headers instead
1468 of calling __register_frame_info at all, for each object,
1469 use the shared libgcc if any EH symbol referenced.
1471 If crtstuff is fixed to not invoke __register_frame_info
1472 automatically, for each object, use the shared libgcc if
1473 any non-empty unwind section found.
1475 Doing any of this probably requires invoking an external program to
1476 do the actual object file scanning. */
1478 const char *p = libgcc_spec;
1479 int in_sep = 1;
1481 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1482 when given the proper command line arguments. */
1483 while (*p)
1485 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1487 init_gcc_specs (&obstack,
1488 "-lgcc_s"
1489 #ifdef USE_LIBUNWIND_EXCEPTIONS
1490 " -lunwind"
1491 #endif
1493 "-lgcc",
1494 "-lgcc_eh"
1495 #ifdef USE_LIBUNWIND_EXCEPTIONS
1496 # ifdef HAVE_LD_STATIC_DYNAMIC
1497 " %{!static:" LD_STATIC_OPTION "} -lunwind"
1498 " %{!static:" LD_DYNAMIC_OPTION "}"
1499 # else
1500 " -lunwind"
1501 # endif
1502 #endif
1505 p += 5;
1506 in_sep = 0;
1508 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1510 /* Ug. We don't know shared library extensions. Hope that
1511 systems that use this form don't do shared libraries. */
1512 init_gcc_specs (&obstack,
1513 "-lgcc_s",
1514 "libgcc.a%s",
1515 "libgcc_eh.a%s"
1516 #ifdef USE_LIBUNWIND_EXCEPTIONS
1517 " -lunwind"
1518 #endif
1520 p += 10;
1521 in_sep = 0;
1523 else
1525 obstack_1grow (&obstack, *p);
1526 in_sep = (*p == ' ');
1527 p += 1;
1531 obstack_1grow (&obstack, '\0');
1532 libgcc_spec = XOBFINISH (&obstack, const char *);
1534 #endif
1535 #ifdef USE_AS_TRADITIONAL_FORMAT
1536 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1538 static const char tf[] = "--traditional-format ";
1539 obstack_grow (&obstack, tf, sizeof (tf) - 1);
1540 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1541 asm_spec = XOBFINISH (&obstack, const char *);
1543 #endif
1545 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1546 defined LINKER_HASH_STYLE
1547 # ifdef LINK_BUILDID_SPEC
1548 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1549 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1);
1550 # endif
1551 # ifdef LINK_EH_SPEC
1552 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1553 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1);
1554 # endif
1555 # ifdef LINKER_HASH_STYLE
1556 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1557 before. */
1559 static const char hash_style[] = "--hash-style=";
1560 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1);
1561 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1);
1562 obstack_1grow (&obstack, ' ');
1564 # endif
1565 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1566 link_spec = XOBFINISH (&obstack, const char *);
1567 #endif
1569 specs = sl;
1572 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1573 removed; If the spec starts with a + then SPEC is added to the end of the
1574 current spec. */
1576 static void
1577 set_spec (const char *name, const char *spec, bool user_p)
1579 struct spec_list *sl;
1580 const char *old_spec;
1581 int name_len = strlen (name);
1582 int i;
1584 /* If this is the first call, initialize the statically allocated specs. */
1585 if (!specs)
1587 struct spec_list *next = (struct spec_list *) 0;
1588 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1590 sl = &static_specs[i];
1591 sl->next = next;
1592 next = sl;
1594 specs = sl;
1597 /* See if the spec already exists. */
1598 for (sl = specs; sl; sl = sl->next)
1599 if (name_len == sl->name_len && !strcmp (sl->name, name))
1600 break;
1602 if (!sl)
1604 /* Not found - make it. */
1605 sl = XNEW (struct spec_list);
1606 sl->name = xstrdup (name);
1607 sl->name_len = name_len;
1608 sl->ptr_spec = &sl->ptr;
1609 sl->alloc_p = 0;
1610 *(sl->ptr_spec) = "";
1611 sl->next = specs;
1612 specs = sl;
1615 old_spec = *(sl->ptr_spec);
1616 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1617 ? concat (old_spec, spec + 1, NULL)
1618 : xstrdup (spec));
1620 #ifdef DEBUG_SPECS
1621 if (verbose_flag)
1622 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1623 #endif
1625 /* Free the old spec. */
1626 if (old_spec && sl->alloc_p)
1627 free (CONST_CAST (char *, old_spec));
1629 sl->user_p = user_p;
1630 sl->alloc_p = true;
1633 /* Accumulate a command (program name and args), and run it. */
1635 typedef const char *const_char_p; /* For DEF_VEC_P. */
1637 /* Vector of pointers to arguments in the current line of specifications. */
1639 static vec<const_char_p> argbuf;
1641 /* Position in the argbuf vector containing the name of the output file
1642 (the value associated with the "-o" flag). */
1644 static int have_o_argbuf_index = 0;
1646 /* Were the options -c, -S or -E passed. */
1647 static int have_c = 0;
1649 /* Was the option -o passed. */
1650 static int have_o = 0;
1652 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1653 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1654 it here. */
1656 static struct temp_name {
1657 const char *suffix; /* suffix associated with the code. */
1658 int length; /* strlen (suffix). */
1659 int unique; /* Indicates whether %g or %u/%U was used. */
1660 const char *filename; /* associated filename. */
1661 int filename_length; /* strlen (filename). */
1662 struct temp_name *next;
1663 } *temp_names;
1665 /* Number of commands executed so far. */
1667 static int execution_count;
1669 /* Number of commands that exited with a signal. */
1671 static int signal_count;
1673 /* Allocate the argument vector. */
1675 static void
1676 alloc_args (void)
1678 argbuf.create (10);
1681 /* Clear out the vector of arguments (after a command is executed). */
1683 static void
1684 clear_args (void)
1686 argbuf.truncate (0);
1689 /* Add one argument to the vector at the end.
1690 This is done when a space is seen or at the end of the line.
1691 If DELETE_ALWAYS is nonzero, the arg is a filename
1692 and the file should be deleted eventually.
1693 If DELETE_FAILURE is nonzero, the arg is a filename
1694 and the file should be deleted if this compilation fails. */
1696 static void
1697 store_arg (const char *arg, int delete_always, int delete_failure)
1699 argbuf.safe_push (arg);
1701 if (strcmp (arg, "-o") == 0)
1702 have_o_argbuf_index = argbuf.length ();
1703 if (delete_always || delete_failure)
1705 const char *p;
1706 /* If the temporary file we should delete is specified as
1707 part of a joined argument extract the filename. */
1708 if (arg[0] == '-'
1709 && (p = strrchr (arg, '=')))
1710 arg = p + 1;
1711 record_temp_file (arg, delete_always, delete_failure);
1715 /* Load specs from a file name named FILENAME, replacing occurrences of
1716 various different types of line-endings, \r\n, \n\r and just \r, with
1717 a single \n. */
1719 static char *
1720 load_specs (const char *filename)
1722 int desc;
1723 int readlen;
1724 struct stat statbuf;
1725 char *buffer;
1726 char *buffer_p;
1727 char *specs;
1728 char *specs_p;
1730 if (verbose_flag)
1731 fnotice (stderr, "Reading specs from %s\n", filename);
1733 /* Open and stat the file. */
1734 desc = open (filename, O_RDONLY, 0);
1735 if (desc < 0)
1736 pfatal_with_name (filename);
1737 if (stat (filename, &statbuf) < 0)
1738 pfatal_with_name (filename);
1740 /* Read contents of file into BUFFER. */
1741 buffer = XNEWVEC (char, statbuf.st_size + 1);
1742 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1743 if (readlen < 0)
1744 pfatal_with_name (filename);
1745 buffer[readlen] = 0;
1746 close (desc);
1748 specs = XNEWVEC (char, readlen + 1);
1749 specs_p = specs;
1750 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1752 int skip = 0;
1753 char c = *buffer_p;
1754 if (c == '\r')
1756 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
1757 skip = 1;
1758 else if (*(buffer_p + 1) == '\n') /* \r\n */
1759 skip = 1;
1760 else /* \r */
1761 c = '\n';
1763 if (! skip)
1764 *specs_p++ = c;
1766 *specs_p = '\0';
1768 free (buffer);
1769 return (specs);
1772 /* Read compilation specs from a file named FILENAME,
1773 replacing the default ones.
1775 A suffix which starts with `*' is a definition for
1776 one of the machine-specific sub-specs. The "suffix" should be
1777 *asm, *cc1, *cpp, *link, *startfile, etc.
1778 The corresponding spec is stored in asm_spec, etc.,
1779 rather than in the `compilers' vector.
1781 Anything invalid in the file is a fatal error. */
1783 static void
1784 read_specs (const char *filename, bool main_p, bool user_p)
1786 char *buffer;
1787 char *p;
1789 buffer = load_specs (filename);
1791 /* Scan BUFFER for specs, putting them in the vector. */
1792 p = buffer;
1793 while (1)
1795 char *suffix;
1796 char *spec;
1797 char *in, *out, *p1, *p2, *p3;
1799 /* Advance P in BUFFER to the next nonblank nocomment line. */
1800 p = skip_whitespace (p);
1801 if (*p == 0)
1802 break;
1804 /* Is this a special command that starts with '%'? */
1805 /* Don't allow this for the main specs file, since it would
1806 encourage people to overwrite it. */
1807 if (*p == '%' && !main_p)
1809 p1 = p;
1810 while (*p && *p != '\n')
1811 p++;
1813 /* Skip '\n'. */
1814 p++;
1816 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
1817 && (p1[sizeof "%include" - 1] == ' '
1818 || p1[sizeof "%include" - 1] == '\t'))
1820 char *new_filename;
1822 p1 += sizeof ("%include");
1823 while (*p1 == ' ' || *p1 == '\t')
1824 p1++;
1826 if (*p1++ != '<' || p[-2] != '>')
1827 fatal_error ("specs %%include syntax malformed after "
1828 "%ld characters",
1829 (long) (p1 - buffer + 1));
1831 p[-2] = '\0';
1832 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
1833 read_specs (new_filename ? new_filename : p1, false, user_p);
1834 continue;
1836 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1837 && (p1[sizeof "%include_noerr" - 1] == ' '
1838 || p1[sizeof "%include_noerr" - 1] == '\t'))
1840 char *new_filename;
1842 p1 += sizeof "%include_noerr";
1843 while (*p1 == ' ' || *p1 == '\t')
1844 p1++;
1846 if (*p1++ != '<' || p[-2] != '>')
1847 fatal_error ("specs %%include syntax malformed after "
1848 "%ld characters",
1849 (long) (p1 - buffer + 1));
1851 p[-2] = '\0';
1852 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
1853 if (new_filename)
1854 read_specs (new_filename, false, user_p);
1855 else if (verbose_flag)
1856 fnotice (stderr, "could not find specs file %s\n", p1);
1857 continue;
1859 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1860 && (p1[sizeof "%rename" - 1] == ' '
1861 || p1[sizeof "%rename" - 1] == '\t'))
1863 int name_len;
1864 struct spec_list *sl;
1865 struct spec_list *newsl;
1867 /* Get original name. */
1868 p1 += sizeof "%rename";
1869 while (*p1 == ' ' || *p1 == '\t')
1870 p1++;
1872 if (! ISALPHA ((unsigned char) *p1))
1873 fatal_error ("specs %%rename syntax malformed after "
1874 "%ld characters",
1875 (long) (p1 - buffer));
1877 p2 = p1;
1878 while (*p2 && !ISSPACE ((unsigned char) *p2))
1879 p2++;
1881 if (*p2 != ' ' && *p2 != '\t')
1882 fatal_error ("specs %%rename syntax malformed after "
1883 "%ld characters",
1884 (long) (p2 - buffer));
1886 name_len = p2 - p1;
1887 *p2++ = '\0';
1888 while (*p2 == ' ' || *p2 == '\t')
1889 p2++;
1891 if (! ISALPHA ((unsigned char) *p2))
1892 fatal_error ("specs %%rename syntax malformed after "
1893 "%ld characters",
1894 (long) (p2 - buffer));
1896 /* Get new spec name. */
1897 p3 = p2;
1898 while (*p3 && !ISSPACE ((unsigned char) *p3))
1899 p3++;
1901 if (p3 != p - 1)
1902 fatal_error ("specs %%rename syntax malformed after "
1903 "%ld characters",
1904 (long) (p3 - buffer));
1905 *p3 = '\0';
1907 for (sl = specs; sl; sl = sl->next)
1908 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1909 break;
1911 if (!sl)
1912 fatal_error ("specs %s spec was not found to be renamed", p1);
1914 if (strcmp (p1, p2) == 0)
1915 continue;
1917 for (newsl = specs; newsl; newsl = newsl->next)
1918 if (strcmp (newsl->name, p2) == 0)
1919 fatal_error ("%s: attempt to rename spec %qs to "
1920 "already defined spec %qs",
1921 filename, p1, p2);
1923 if (verbose_flag)
1925 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
1926 #ifdef DEBUG_SPECS
1927 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
1928 #endif
1931 set_spec (p2, *(sl->ptr_spec), user_p);
1932 if (sl->alloc_p)
1933 free (CONST_CAST (char *, *(sl->ptr_spec)));
1935 *(sl->ptr_spec) = "";
1936 sl->alloc_p = 0;
1937 continue;
1939 else
1940 fatal_error ("specs unknown %% command after %ld characters",
1941 (long) (p1 - buffer));
1944 /* Find the colon that should end the suffix. */
1945 p1 = p;
1946 while (*p1 && *p1 != ':' && *p1 != '\n')
1947 p1++;
1949 /* The colon shouldn't be missing. */
1950 if (*p1 != ':')
1951 fatal_error ("specs file malformed after %ld characters",
1952 (long) (p1 - buffer));
1954 /* Skip back over trailing whitespace. */
1955 p2 = p1;
1956 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1957 p2--;
1959 /* Copy the suffix to a string. */
1960 suffix = save_string (p, p2 - p);
1961 /* Find the next line. */
1962 p = skip_whitespace (p1 + 1);
1963 if (p[1] == 0)
1964 fatal_error ("specs file malformed after %ld characters",
1965 (long) (p - buffer));
1967 p1 = p;
1968 /* Find next blank line or end of string. */
1969 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
1970 p1++;
1972 /* Specs end at the blank line and do not include the newline. */
1973 spec = save_string (p, p1 - p);
1974 p = p1;
1976 /* Delete backslash-newline sequences from the spec. */
1977 in = spec;
1978 out = spec;
1979 while (*in != 0)
1981 if (in[0] == '\\' && in[1] == '\n')
1982 in += 2;
1983 else if (in[0] == '#')
1984 while (*in && *in != '\n')
1985 in++;
1987 else
1988 *out++ = *in++;
1990 *out = 0;
1992 if (suffix[0] == '*')
1994 if (! strcmp (suffix, "*link_command"))
1995 link_command_spec = spec;
1996 else
1997 set_spec (suffix + 1, spec, user_p);
1999 else
2001 /* Add this pair to the vector. */
2002 compilers
2003 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2005 compilers[n_compilers].suffix = suffix;
2006 compilers[n_compilers].spec = spec;
2007 n_compilers++;
2008 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2011 if (*suffix == 0)
2012 link_command_spec = spec;
2015 if (link_command_spec == 0)
2016 fatal_error ("spec file has no spec for linking");
2019 /* Record the names of temporary files we tell compilers to write,
2020 and delete them at the end of the run. */
2022 /* This is the common prefix we use to make temp file names.
2023 It is chosen once for each run of this program.
2024 It is substituted into a spec by %g or %j.
2025 Thus, all temp file names contain this prefix.
2026 In practice, all temp file names start with this prefix.
2028 This prefix comes from the envvar TMPDIR if it is defined;
2029 otherwise, from the P_tmpdir macro if that is defined;
2030 otherwise, in /usr/tmp or /tmp;
2031 or finally the current directory if all else fails. */
2033 static const char *temp_filename;
2035 /* Length of the prefix. */
2037 static int temp_filename_length;
2039 /* Define the list of temporary files to delete. */
2041 struct temp_file
2043 const char *name;
2044 struct temp_file *next;
2047 /* Queue of files to delete on success or failure of compilation. */
2048 static struct temp_file *always_delete_queue;
2049 /* Queue of files to delete on failure of compilation. */
2050 static struct temp_file *failure_delete_queue;
2052 /* Record FILENAME as a file to be deleted automatically.
2053 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2054 otherwise delete it in any case.
2055 FAIL_DELETE nonzero means delete it if a compilation step fails;
2056 otherwise delete it in any case. */
2058 void
2059 record_temp_file (const char *filename, int always_delete, int fail_delete)
2061 char *const name = xstrdup (filename);
2063 if (always_delete)
2065 struct temp_file *temp;
2066 for (temp = always_delete_queue; temp; temp = temp->next)
2067 if (! filename_cmp (name, temp->name))
2068 goto already1;
2070 temp = XNEW (struct temp_file);
2071 temp->next = always_delete_queue;
2072 temp->name = name;
2073 always_delete_queue = temp;
2075 already1:;
2078 if (fail_delete)
2080 struct temp_file *temp;
2081 for (temp = failure_delete_queue; temp; temp = temp->next)
2082 if (! filename_cmp (name, temp->name))
2084 free (name);
2085 goto already2;
2088 temp = XNEW (struct temp_file);
2089 temp->next = failure_delete_queue;
2090 temp->name = name;
2091 failure_delete_queue = temp;
2093 already2:;
2097 /* Delete all the temporary files whose names we previously recorded. */
2099 #ifndef DELETE_IF_ORDINARY
2100 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2101 do \
2103 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2104 if (unlink (NAME) < 0) \
2105 if (VERBOSE_FLAG) \
2106 perror_with_name (NAME); \
2107 } while (0)
2108 #endif
2110 static void
2111 delete_if_ordinary (const char *name)
2113 struct stat st;
2114 #ifdef DEBUG
2115 int i, c;
2117 printf ("Delete %s? (y or n) ", name);
2118 fflush (stdout);
2119 i = getchar ();
2120 if (i != '\n')
2121 while ((c = getchar ()) != '\n' && c != EOF)
2124 if (i == 'y' || i == 'Y')
2125 #endif /* DEBUG */
2126 DELETE_IF_ORDINARY (name, st, verbose_flag);
2129 static void
2130 delete_temp_files (void)
2132 struct temp_file *temp;
2134 for (temp = always_delete_queue; temp; temp = temp->next)
2135 delete_if_ordinary (temp->name);
2136 always_delete_queue = 0;
2139 /* Delete all the files to be deleted on error. */
2141 static void
2142 delete_failure_queue (void)
2144 struct temp_file *temp;
2146 for (temp = failure_delete_queue; temp; temp = temp->next)
2147 delete_if_ordinary (temp->name);
2150 static void
2151 clear_failure_queue (void)
2153 failure_delete_queue = 0;
2156 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2157 returns non-NULL.
2158 If DO_MULTI is true iterate over the paths twice, first with multilib
2159 suffix then without, otherwise iterate over the paths once without
2160 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2161 to avoid visiting the same path twice, but we could do better. For
2162 instance, /usr/lib/../lib is considered different from /usr/lib.
2163 At least EXTRA_SPACE chars past the end of the path passed to
2164 CALLBACK are available for use by the callback.
2165 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2167 Returns the value returned by CALLBACK. */
2169 static void *
2170 for_each_path (const struct path_prefix *paths,
2171 bool do_multi,
2172 size_t extra_space,
2173 void *(*callback) (char *, void *),
2174 void *callback_info)
2176 struct prefix_list *pl;
2177 const char *multi_dir = NULL;
2178 const char *multi_os_dir = NULL;
2179 const char *multiarch_suffix = NULL;
2180 const char *multi_suffix;
2181 const char *just_multi_suffix;
2182 char *path = NULL;
2183 void *ret = NULL;
2184 bool skip_multi_dir = false;
2185 bool skip_multi_os_dir = false;
2187 multi_suffix = machine_suffix;
2188 just_multi_suffix = just_machine_suffix;
2189 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2191 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2192 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2193 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2195 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2196 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2197 if (multiarch_dir)
2198 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
2200 while (1)
2202 size_t multi_dir_len = 0;
2203 size_t multi_os_dir_len = 0;
2204 size_t multiarch_len = 0;
2205 size_t suffix_len;
2206 size_t just_suffix_len;
2207 size_t len;
2209 if (multi_dir)
2210 multi_dir_len = strlen (multi_dir);
2211 if (multi_os_dir)
2212 multi_os_dir_len = strlen (multi_os_dir);
2213 if (multiarch_suffix)
2214 multiarch_len = strlen (multiarch_suffix);
2215 suffix_len = strlen (multi_suffix);
2216 just_suffix_len = strlen (just_multi_suffix);
2218 if (path == NULL)
2220 len = paths->max_len + extra_space + 1;
2221 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
2222 path = XNEWVEC (char, len);
2225 for (pl = paths->plist; pl != 0; pl = pl->next)
2227 len = strlen (pl->prefix);
2228 memcpy (path, pl->prefix, len);
2230 /* Look first in MACHINE/VERSION subdirectory. */
2231 if (!skip_multi_dir)
2233 memcpy (path + len, multi_suffix, suffix_len + 1);
2234 ret = callback (path, callback_info);
2235 if (ret)
2236 break;
2239 /* Some paths are tried with just the machine (ie. target)
2240 subdir. This is used for finding as, ld, etc. */
2241 if (!skip_multi_dir
2242 && pl->require_machine_suffix == 2)
2244 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2245 ret = callback (path, callback_info);
2246 if (ret)
2247 break;
2250 /* Now try the multiarch path. */
2251 if (!skip_multi_dir
2252 && !pl->require_machine_suffix && multiarch_dir)
2254 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2255 ret = callback (path, callback_info);
2256 if (ret)
2257 break;
2260 /* Now try the base path. */
2261 if (!pl->require_machine_suffix
2262 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2264 const char *this_multi;
2265 size_t this_multi_len;
2267 if (pl->os_multilib)
2269 this_multi = multi_os_dir;
2270 this_multi_len = multi_os_dir_len;
2272 else
2274 this_multi = multi_dir;
2275 this_multi_len = multi_dir_len;
2278 if (this_multi_len)
2279 memcpy (path + len, this_multi, this_multi_len + 1);
2280 else
2281 path[len] = '\0';
2283 ret = callback (path, callback_info);
2284 if (ret)
2285 break;
2288 if (pl)
2289 break;
2291 if (multi_dir == NULL && multi_os_dir == NULL)
2292 break;
2294 /* Run through the paths again, this time without multilibs.
2295 Don't repeat any we have already seen. */
2296 if (multi_dir)
2298 free (CONST_CAST (char *, multi_dir));
2299 multi_dir = NULL;
2300 free (CONST_CAST (char *, multi_suffix));
2301 multi_suffix = machine_suffix;
2302 free (CONST_CAST (char *, just_multi_suffix));
2303 just_multi_suffix = just_machine_suffix;
2305 else
2306 skip_multi_dir = true;
2307 if (multi_os_dir)
2309 free (CONST_CAST (char *, multi_os_dir));
2310 multi_os_dir = NULL;
2312 else
2313 skip_multi_os_dir = true;
2316 if (multi_dir)
2318 free (CONST_CAST (char *, multi_dir));
2319 free (CONST_CAST (char *, multi_suffix));
2320 free (CONST_CAST (char *, just_multi_suffix));
2322 if (multi_os_dir)
2323 free (CONST_CAST (char *, multi_os_dir));
2324 if (ret != path)
2325 free (path);
2326 return ret;
2329 /* Callback for build_search_list. Adds path to obstack being built. */
2331 struct add_to_obstack_info {
2332 struct obstack *ob;
2333 bool check_dir;
2334 bool first_time;
2337 static void *
2338 add_to_obstack (char *path, void *data)
2340 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2342 if (info->check_dir && !is_directory (path, false))
2343 return NULL;
2345 if (!info->first_time)
2346 obstack_1grow (info->ob, PATH_SEPARATOR);
2348 obstack_grow (info->ob, path, strlen (path));
2350 info->first_time = false;
2351 return NULL;
2354 /* Add or change the value of an environment variable, outputting the
2355 change to standard error if in verbose mode. */
2356 static void
2357 xputenv (const char *string)
2359 if (verbose_flag)
2360 fnotice (stderr, "%s\n", string);
2361 putenv (CONST_CAST (char *, string));
2364 /* Build a list of search directories from PATHS.
2365 PREFIX is a string to prepend to the list.
2366 If CHECK_DIR_P is true we ensure the directory exists.
2367 If DO_MULTI is true, multilib paths are output first, then
2368 non-multilib paths.
2369 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2370 It is also used by the --print-search-dirs flag. */
2372 static char *
2373 build_search_list (const struct path_prefix *paths, const char *prefix,
2374 bool check_dir, bool do_multi)
2376 struct add_to_obstack_info info;
2378 info.ob = &collect_obstack;
2379 info.check_dir = check_dir;
2380 info.first_time = true;
2382 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2383 obstack_1grow (&collect_obstack, '=');
2385 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2387 obstack_1grow (&collect_obstack, '\0');
2388 return XOBFINISH (&collect_obstack, char *);
2391 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2392 for collect. */
2394 static void
2395 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2396 bool do_multi)
2398 xputenv (build_search_list (paths, env_var, true, do_multi));
2401 /* Check whether NAME can be accessed in MODE. This is like access,
2402 except that it never considers directories to be executable. */
2404 static int
2405 access_check (const char *name, int mode)
2407 if (mode == X_OK)
2409 struct stat st;
2411 if (stat (name, &st) < 0
2412 || S_ISDIR (st.st_mode))
2413 return -1;
2416 return access (name, mode);
2419 /* Callback for find_a_file. Appends the file name to the directory
2420 path. If the resulting file exists in the right mode, return the
2421 full pathname to the file. */
2423 struct file_at_path_info {
2424 const char *name;
2425 const char *suffix;
2426 int name_len;
2427 int suffix_len;
2428 int mode;
2431 static void *
2432 file_at_path (char *path, void *data)
2434 struct file_at_path_info *info = (struct file_at_path_info *) data;
2435 size_t len = strlen (path);
2437 memcpy (path + len, info->name, info->name_len);
2438 len += info->name_len;
2440 /* Some systems have a suffix for executable files.
2441 So try appending that first. */
2442 if (info->suffix_len)
2444 memcpy (path + len, info->suffix, info->suffix_len + 1);
2445 if (access_check (path, info->mode) == 0)
2446 return path;
2449 path[len] = '\0';
2450 if (access_check (path, info->mode) == 0)
2451 return path;
2453 return NULL;
2456 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2457 access to check permissions. If DO_MULTI is true, search multilib
2458 paths then non-multilib paths, otherwise do not search multilib paths.
2459 Return 0 if not found, otherwise return its name, allocated with malloc. */
2461 static char *
2462 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2463 bool do_multi)
2465 struct file_at_path_info info;
2467 #ifdef DEFAULT_ASSEMBLER
2468 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2469 return xstrdup (DEFAULT_ASSEMBLER);
2470 #endif
2472 #ifdef DEFAULT_LINKER
2473 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2474 return xstrdup (DEFAULT_LINKER);
2475 #endif
2477 /* Determine the filename to execute (special case for absolute paths). */
2479 if (IS_ABSOLUTE_PATH (name))
2481 if (access (name, mode) == 0)
2482 return xstrdup (name);
2484 return NULL;
2487 info.name = name;
2488 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2489 info.name_len = strlen (info.name);
2490 info.suffix_len = strlen (info.suffix);
2491 info.mode = mode;
2493 return (char*) for_each_path (pprefix, do_multi,
2494 info.name_len + info.suffix_len,
2495 file_at_path, &info);
2498 /* Ranking of prefixes in the sort list. -B prefixes are put before
2499 all others. */
2501 enum path_prefix_priority
2503 PREFIX_PRIORITY_B_OPT,
2504 PREFIX_PRIORITY_LAST
2507 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2508 order according to PRIORITY. Within each PRIORITY, new entries are
2509 appended.
2511 If WARN is nonzero, we will warn if no file is found
2512 through this prefix. WARN should point to an int
2513 which will be set to 1 if this entry is used.
2515 COMPONENT is the value to be passed to update_path.
2517 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2518 the complete value of machine_suffix.
2519 2 means try both machine_suffix and just_machine_suffix. */
2521 static void
2522 add_prefix (struct path_prefix *pprefix, const char *prefix,
2523 const char *component, /* enum prefix_priority */ int priority,
2524 int require_machine_suffix, int os_multilib)
2526 struct prefix_list *pl, **prev;
2527 int len;
2529 for (prev = &pprefix->plist;
2530 (*prev) != NULL && (*prev)->priority <= priority;
2531 prev = &(*prev)->next)
2534 /* Keep track of the longest prefix. */
2536 prefix = update_path (prefix, component);
2537 len = strlen (prefix);
2538 if (len > pprefix->max_len)
2539 pprefix->max_len = len;
2541 pl = XNEW (struct prefix_list);
2542 pl->prefix = prefix;
2543 pl->require_machine_suffix = require_machine_suffix;
2544 pl->priority = priority;
2545 pl->os_multilib = os_multilib;
2547 /* Insert after PREV. */
2548 pl->next = (*prev);
2549 (*prev) = pl;
2552 /* Same as add_prefix, but prepending target_system_root to prefix. */
2553 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2554 static void
2555 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2556 const char *component,
2557 /* enum prefix_priority */ int priority,
2558 int require_machine_suffix, int os_multilib)
2560 if (!IS_ABSOLUTE_PATH (prefix))
2561 fatal_error ("system path %qs is not absolute", prefix);
2563 if (target_system_root)
2565 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2566 size_t sysroot_len = strlen (target_system_root);
2568 if (sysroot_len > 0
2569 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2570 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2572 if (target_sysroot_suffix)
2573 prefix = concat (sysroot_no_trailing_dir_separator,
2574 target_sysroot_suffix, prefix, NULL);
2575 else
2576 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
2578 free (sysroot_no_trailing_dir_separator);
2580 /* We have to override this because GCC's notion of sysroot
2581 moves along with GCC. */
2582 component = "GCC";
2585 add_prefix (pprefix, prefix, component, priority,
2586 require_machine_suffix, os_multilib);
2589 /* Execute the command specified by the arguments on the current line of spec.
2590 When using pipes, this includes several piped-together commands
2591 with `|' between them.
2593 Return 0 if successful, -1 if failed. */
2595 static int
2596 execute (void)
2598 int i;
2599 int n_commands; /* # of command. */
2600 char *string;
2601 struct pex_obj *pex;
2602 struct command
2604 const char *prog; /* program name. */
2605 const char **argv; /* vector of args. */
2607 const char *arg;
2609 struct command *commands; /* each command buffer with above info. */
2611 gcc_assert (!processing_spec_function);
2613 if (wrapper_string)
2615 string = find_a_file (&exec_prefixes,
2616 argbuf[0], X_OK, false);
2617 if (string)
2618 argbuf[0] = string;
2619 insert_wrapper (wrapper_string);
2622 /* Count # of piped commands. */
2623 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
2624 if (strcmp (arg, "|") == 0)
2625 n_commands++;
2627 /* Get storage for each command. */
2628 commands = (struct command *) alloca (n_commands * sizeof (struct command));
2630 /* Split argbuf into its separate piped processes,
2631 and record info about each one.
2632 Also search for the programs that are to be run. */
2634 argbuf.safe_push (0);
2636 commands[0].prog = argbuf[0]; /* first command. */
2637 commands[0].argv = argbuf.address ();
2639 if (!wrapper_string)
2641 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2642 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2645 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
2646 if (arg && strcmp (arg, "|") == 0)
2647 { /* each command. */
2648 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2649 fatal_error ("-pipe not supported");
2650 #endif
2651 argbuf[i] = 0; /* Termination of
2652 command args. */
2653 commands[n_commands].prog = argbuf[i + 1];
2654 commands[n_commands].argv
2655 = &(argbuf.address ())[i + 1];
2656 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2657 X_OK, false);
2658 if (string)
2659 commands[n_commands].argv[0] = string;
2660 n_commands++;
2663 /* If -v, print what we are about to do, and maybe query. */
2665 if (verbose_flag)
2667 /* For help listings, put a blank line between sub-processes. */
2668 if (print_help_list)
2669 fputc ('\n', stderr);
2671 /* Print each piped command as a separate line. */
2672 for (i = 0; i < n_commands; i++)
2674 const char *const *j;
2676 if (verbose_only_flag)
2678 for (j = commands[i].argv; *j; j++)
2680 const char *p;
2681 for (p = *j; *p; ++p)
2682 if (!ISALNUM ((unsigned char) *p)
2683 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
2684 break;
2685 if (*p || !*j)
2687 fprintf (stderr, " \"");
2688 for (p = *j; *p; ++p)
2690 if (*p == '"' || *p == '\\' || *p == '$')
2691 fputc ('\\', stderr);
2692 fputc (*p, stderr);
2694 fputc ('"', stderr);
2696 /* If it's empty, print "". */
2697 else if (!**j)
2698 fprintf (stderr, " \"\"");
2699 else
2700 fprintf (stderr, " %s", *j);
2703 else
2704 for (j = commands[i].argv; *j; j++)
2705 /* If it's empty, print "". */
2706 if (!**j)
2707 fprintf (stderr, " \"\"");
2708 else
2709 fprintf (stderr, " %s", *j);
2711 /* Print a pipe symbol after all but the last command. */
2712 if (i + 1 != n_commands)
2713 fprintf (stderr, " |");
2714 fprintf (stderr, "\n");
2716 fflush (stderr);
2717 if (verbose_only_flag != 0)
2719 /* verbose_only_flag should act as if the spec was
2720 executed, so increment execution_count before
2721 returning. This prevents spurious warnings about
2722 unused linker input files, etc. */
2723 execution_count++;
2724 return 0;
2726 #ifdef DEBUG
2727 fnotice (stderr, "\nGo ahead? (y or n) ");
2728 fflush (stderr);
2729 i = getchar ();
2730 if (i != '\n')
2731 while (getchar () != '\n')
2734 if (i != 'y' && i != 'Y')
2735 return 0;
2736 #endif /* DEBUG */
2739 #ifdef ENABLE_VALGRIND_CHECKING
2740 /* Run the each command through valgrind. To simplify prepending the
2741 path to valgrind and the option "-q" (for quiet operation unless
2742 something triggers), we allocate a separate argv array. */
2744 for (i = 0; i < n_commands; i++)
2746 const char **argv;
2747 int argc;
2748 int j;
2750 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
2753 argv = XALLOCAVEC (const char *, argc + 3);
2755 argv[0] = VALGRIND_PATH;
2756 argv[1] = "-q";
2757 for (j = 2; j < argc + 2; j++)
2758 argv[j] = commands[i].argv[j - 2];
2759 argv[j] = NULL;
2761 commands[i].argv = argv;
2762 commands[i].prog = argv[0];
2764 #endif
2766 /* Run each piped subprocess. */
2768 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
2769 ? PEX_RECORD_TIMES : 0),
2770 progname, temp_filename);
2771 if (pex == NULL)
2772 fatal_error ("pex_init failed: %m");
2774 for (i = 0; i < n_commands; i++)
2776 const char *errmsg;
2777 int err;
2778 const char *string = commands[i].argv[0];
2780 errmsg = pex_run (pex,
2781 ((i + 1 == n_commands ? PEX_LAST : 0)
2782 | (string == commands[i].prog ? PEX_SEARCH : 0)),
2783 string, CONST_CAST (char **, commands[i].argv),
2784 NULL, NULL, &err);
2785 if (errmsg != NULL)
2787 if (err == 0)
2788 fatal_error (errmsg);
2789 else
2791 errno = err;
2792 pfatal_with_name (errmsg);
2796 if (string != commands[i].prog)
2797 free (CONST_CAST (char *, string));
2800 execution_count++;
2802 /* Wait for all the subprocesses to finish. */
2805 int *statuses;
2806 struct pex_time *times = NULL;
2807 int ret_code = 0;
2809 statuses = (int *) alloca (n_commands * sizeof (int));
2810 if (!pex_get_status (pex, n_commands, statuses))
2811 fatal_error ("failed to get exit status: %m");
2813 if (report_times || report_times_to_file)
2815 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
2816 if (!pex_get_times (pex, n_commands, times))
2817 fatal_error ("failed to get process times: %m");
2820 pex_free (pex);
2822 for (i = 0; i < n_commands; ++i)
2824 int status = statuses[i];
2826 if (WIFSIGNALED (status))
2828 #ifdef SIGPIPE
2829 /* SIGPIPE is a special case. It happens in -pipe mode
2830 when the compiler dies before the preprocessor is done,
2831 or the assembler dies before the compiler is done.
2832 There's generally been an error already, and this is
2833 just fallout. So don't generate another error unless
2834 we would otherwise have succeeded. */
2835 if (WTERMSIG (status) == SIGPIPE
2836 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2838 signal_count++;
2839 ret_code = -1;
2841 else
2842 #endif
2843 internal_error ("%s (program %s)",
2844 strsignal (WTERMSIG (status)), commands[i].prog);
2846 else if (WIFEXITED (status)
2847 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2849 if (WEXITSTATUS (status) > greatest_status)
2850 greatest_status = WEXITSTATUS (status);
2851 ret_code = -1;
2854 if (report_times || report_times_to_file)
2856 struct pex_time *pt = &times[i];
2857 double ut, st;
2859 ut = ((double) pt->user_seconds
2860 + (double) pt->user_microseconds / 1.0e6);
2861 st = ((double) pt->system_seconds
2862 + (double) pt->system_microseconds / 1.0e6);
2864 if (ut + st != 0)
2866 if (report_times)
2867 fnotice (stderr, "# %s %.2f %.2f\n",
2868 commands[i].prog, ut, st);
2870 if (report_times_to_file)
2872 int c = 0;
2873 const char *const *j;
2875 fprintf (report_times_to_file, "%g %g", ut, st);
2877 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
2879 const char *p;
2880 for (p = *j; *p; ++p)
2881 if (*p == '"' || *p == '\\' || *p == '$'
2882 || ISSPACE (*p))
2883 break;
2885 if (*p)
2887 fprintf (report_times_to_file, " \"");
2888 for (p = *j; *p; ++p)
2890 if (*p == '"' || *p == '\\' || *p == '$')
2891 fputc ('\\', report_times_to_file);
2892 fputc (*p, report_times_to_file);
2894 fputc ('"', report_times_to_file);
2896 else
2897 fprintf (report_times_to_file, " %s", *j);
2900 fputc ('\n', report_times_to_file);
2906 return ret_code;
2910 /* Find all the switches given to us
2911 and make a vector describing them.
2912 The elements of the vector are strings, one per switch given.
2913 If a switch uses following arguments, then the `part1' field
2914 is the switch itself and the `args' field
2915 is a null-terminated vector containing the following arguments.
2916 Bits in the `live_cond' field are:
2917 SWITCH_LIVE to indicate this switch is true in a conditional spec.
2918 SWITCH_FALSE to indicate this switch is overridden by a later switch.
2919 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
2920 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
2921 in all do_spec calls afterwards. Used for %<S from self specs.
2922 The `validated' field is nonzero if any spec has looked at this switch;
2923 if it remains zero at the end of the run, it must be meaningless. */
2925 #define SWITCH_LIVE (1 << 0)
2926 #define SWITCH_FALSE (1 << 1)
2927 #define SWITCH_IGNORE (1 << 2)
2928 #define SWITCH_IGNORE_PERMANENTLY (1 << 3)
2929 #define SWITCH_KEEP_FOR_GCC (1 << 4)
2931 struct switchstr
2933 const char *part1;
2934 const char **args;
2935 unsigned int live_cond;
2936 bool known;
2937 bool validated;
2938 bool ordering;
2941 static struct switchstr *switches;
2943 static int n_switches;
2945 static int n_switches_alloc;
2947 /* Set to zero if -fcompare-debug is disabled, positive if it's
2948 enabled and we're running the first compilation, negative if it's
2949 enabled and we're running the second compilation. For most of the
2950 time, it's in the range -1..1, but it can be temporarily set to 2
2951 or 3 to indicate that the -fcompare-debug flags didn't come from
2952 the command-line, but rather from the GCC_COMPARE_DEBUG environment
2953 variable, until a synthesized -fcompare-debug flag is added to the
2954 command line. */
2955 int compare_debug;
2957 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
2958 int compare_debug_second;
2960 /* Set to the flags that should be passed to the second compilation in
2961 a -fcompare-debug compilation. */
2962 const char *compare_debug_opt;
2964 static struct switchstr *switches_debug_check[2];
2966 static int n_switches_debug_check[2];
2968 static int n_switches_alloc_debug_check[2];
2970 static char *debug_check_temp_file[2];
2972 /* Language is one of three things:
2974 1) The name of a real programming language.
2975 2) NULL, indicating that no one has figured out
2976 what it is yet.
2977 3) '*', indicating that the file should be passed
2978 to the linker. */
2979 struct infile
2981 const char *name;
2982 const char *language;
2983 struct compiler *incompiler;
2984 bool compiled;
2985 bool preprocessed;
2988 /* Also a vector of input files specified. */
2990 static struct infile *infiles;
2992 int n_infiles;
2994 static int n_infiles_alloc;
2996 /* True if multiple input files are being compiled to a single
2997 assembly file. */
2999 static bool combine_inputs;
3001 /* This counts the number of libraries added by lang_specific_driver, so that
3002 we can tell if there were any user supplied any files or libraries. */
3004 static int added_libraries;
3006 /* And a vector of corresponding output files is made up later. */
3008 const char **outfiles;
3010 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3012 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3013 is true if we should look for an executable suffix. DO_OBJ
3014 is true if we should look for an object suffix. */
3016 static const char *
3017 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3018 int do_obj ATTRIBUTE_UNUSED)
3020 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3021 int i;
3022 #endif
3023 int len;
3025 if (name == NULL)
3026 return NULL;
3028 len = strlen (name);
3030 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3031 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3032 if (do_obj && len > 2
3033 && name[len - 2] == '.'
3034 && name[len - 1] == 'o')
3036 obstack_grow (&obstack, name, len - 2);
3037 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3038 name = XOBFINISH (&obstack, const char *);
3040 #endif
3042 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3043 /* If there is no filetype, make it the executable suffix (which includes
3044 the "."). But don't get confused if we have just "-o". */
3045 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3046 return name;
3048 for (i = len - 1; i >= 0; i--)
3049 if (IS_DIR_SEPARATOR (name[i]))
3050 break;
3052 for (i++; i < len; i++)
3053 if (name[i] == '.')
3054 return name;
3056 obstack_grow (&obstack, name, len);
3057 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3058 strlen (TARGET_EXECUTABLE_SUFFIX));
3059 name = XOBFINISH (&obstack, const char *);
3060 #endif
3062 return name;
3064 #endif
3066 /* Display the command line switches accepted by gcc. */
3067 static void
3068 display_help (void)
3070 printf (_("Usage: %s [options] file...\n"), progname);
3071 fputs (_("Options:\n"), stdout);
3073 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3074 fputs (_(" --help Display this information\n"), stdout);
3075 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3076 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3077 fputs (_(" Display specific types of command line options\n"), stdout);
3078 if (! verbose_flag)
3079 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3080 fputs (_(" --version Display compiler version information\n"), stdout);
3081 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3082 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3083 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3084 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3085 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3086 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3087 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3088 fputs (_("\
3089 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3090 a component in the library path\n"), stdout);
3091 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3092 fputs (_("\
3093 -print-multi-lib Display the mapping between command line options and\n\
3094 multiple library search directories\n"), stdout);
3095 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3096 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
3097 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3098 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3099 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3100 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3101 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3102 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3103 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3104 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3105 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
3106 fputs (_("\
3107 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3108 prefixes to other gcc components\n"), stdout);
3109 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3110 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3111 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3112 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3113 fputs (_("\
3114 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3115 and libraries\n"), stdout);
3116 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3117 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3118 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3119 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3120 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3121 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3122 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3123 fputs (_(" -pie Create a position independent executable\n"), stdout);
3124 fputs (_(" -shared Create a shared library\n"), stdout);
3125 fputs (_("\
3126 -x <language> Specify the language of the following input files\n\
3127 Permissible languages include: c c++ assembler none\n\
3128 'none' means revert to the default behavior of\n\
3129 guessing the language based on the file's extension\n\
3130 "), stdout);
3132 printf (_("\
3133 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3134 passed on to the various sub-processes invoked by %s. In order to pass\n\
3135 other options on to these processes the -W<letter> options must be used.\n\
3136 "), progname);
3138 /* The rest of the options are displayed by invocations of the various
3139 sub-processes. */
3142 static void
3143 add_preprocessor_option (const char *option, int len)
3145 preprocessor_options.safe_push (save_string (option, len));
3148 static void
3149 add_assembler_option (const char *option, int len)
3151 assembler_options.safe_push (save_string (option, len));
3154 static void
3155 add_linker_option (const char *option, int len)
3157 linker_options.safe_push (save_string (option, len));
3160 /* Allocate space for an input file in infiles. */
3162 static void
3163 alloc_infile (void)
3165 if (n_infiles_alloc == 0)
3167 n_infiles_alloc = 16;
3168 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3170 else if (n_infiles_alloc == n_infiles)
3172 n_infiles_alloc *= 2;
3173 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3177 /* Store an input file with the given NAME and LANGUAGE in
3178 infiles. */
3180 static void
3181 add_infile (const char *name, const char *language)
3183 alloc_infile ();
3184 infiles[n_infiles].name = name;
3185 infiles[n_infiles++].language = language;
3188 /* Allocate space for a switch in switches. */
3190 static void
3191 alloc_switch (void)
3193 if (n_switches_alloc == 0)
3195 n_switches_alloc = 16;
3196 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3198 else if (n_switches_alloc == n_switches)
3200 n_switches_alloc *= 2;
3201 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3205 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3206 as validated if VALIDATED and KNOWN if it is an internal switch. */
3208 static void
3209 save_switch (const char *opt, size_t n_args, const char *const *args,
3210 bool validated, bool known)
3212 alloc_switch ();
3213 switches[n_switches].part1 = opt + 1;
3214 if (n_args == 0)
3215 switches[n_switches].args = 0;
3216 else
3218 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3219 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3220 switches[n_switches].args[n_args] = NULL;
3223 switches[n_switches].live_cond = 0;
3224 switches[n_switches].validated = validated;
3225 switches[n_switches].known = known;
3226 switches[n_switches].ordering = 0;
3227 n_switches++;
3230 /* Handle an option DECODED that is unknown to the option-processing
3231 machinery. */
3233 static bool
3234 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3236 const char *opt = decoded->arg;
3237 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3238 && !(decoded->errors & CL_ERR_NEGATIVE))
3240 /* Leave unknown -Wno-* options for the compiler proper, to be
3241 diagnosed only if there are warnings. */
3242 save_switch (decoded->canonical_option[0],
3243 decoded->canonical_option_num_elements - 1,
3244 &decoded->canonical_option[1], false, true);
3245 return false;
3247 if (decoded->opt_index == OPT_SPECIAL_unknown)
3249 /* Give it a chance to define it a a spec file. */
3250 save_switch (decoded->canonical_option[0],
3251 decoded->canonical_option_num_elements - 1,
3252 &decoded->canonical_option[1], false, false);
3253 return false;
3255 else
3256 return true;
3259 /* Handle an option DECODED that is not marked as CL_DRIVER.
3260 LANG_MASK will always be CL_DRIVER. */
3262 static void
3263 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3264 unsigned int lang_mask ATTRIBUTE_UNUSED)
3266 /* At this point, non-driver options are accepted (and expected to
3267 be passed down by specs) unless marked to be rejected by the
3268 driver. Options to be rejected by the driver but accepted by the
3269 compilers proper are treated just like completely unknown
3270 options. */
3271 const struct cl_option *option = &cl_options[decoded->opt_index];
3273 if (option->cl_reject_driver)
3274 error ("unrecognized command line option %qs",
3275 decoded->orig_option_with_args_text);
3276 else
3277 save_switch (decoded->canonical_option[0],
3278 decoded->canonical_option_num_elements - 1,
3279 &decoded->canonical_option[1], false, true);
3282 static const char *spec_lang = 0;
3283 static int last_language_n_infiles;
3285 /* Handle a driver option; arguments and return value as for
3286 handle_option. */
3288 static bool
3289 driver_handle_option (struct gcc_options *opts,
3290 struct gcc_options *opts_set,
3291 const struct cl_decoded_option *decoded,
3292 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
3293 location_t loc,
3294 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
3295 diagnostic_context *dc)
3297 size_t opt_index = decoded->opt_index;
3298 const char *arg = decoded->arg;
3299 const char *compare_debug_replacement_opt;
3300 int value = decoded->value;
3301 bool validated = false;
3302 bool do_save = true;
3304 gcc_assert (opts == &global_options);
3305 gcc_assert (opts_set == &global_options_set);
3306 gcc_assert (kind == DK_UNSPECIFIED);
3307 gcc_assert (loc == UNKNOWN_LOCATION);
3308 gcc_assert (dc == global_dc);
3310 switch (opt_index)
3312 case OPT_dumpspecs:
3314 struct spec_list *sl;
3315 init_spec ();
3316 for (sl = specs; sl; sl = sl->next)
3317 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3318 if (link_command_spec)
3319 printf ("*link_command:\n%s\n\n", link_command_spec);
3320 exit (0);
3323 case OPT_dumpversion:
3324 printf ("%s\n", spec_version);
3325 exit (0);
3327 case OPT_dumpmachine:
3328 printf ("%s\n", spec_machine);
3329 exit (0);
3331 case OPT__version:
3332 print_version = 1;
3334 /* CPP driver cannot obtain switch from cc1_options. */
3335 if (is_cpp_driver)
3336 add_preprocessor_option ("--version", strlen ("--version"));
3337 add_assembler_option ("--version", strlen ("--version"));
3338 add_linker_option ("--version", strlen ("--version"));
3339 break;
3341 case OPT__help:
3342 print_help_list = 1;
3344 /* CPP driver cannot obtain switch from cc1_options. */
3345 if (is_cpp_driver)
3346 add_preprocessor_option ("--help", 6);
3347 add_assembler_option ("--help", 6);
3348 add_linker_option ("--help", 6);
3349 break;
3351 case OPT__help_:
3352 print_subprocess_help = 2;
3353 break;
3355 case OPT__target_help:
3356 print_subprocess_help = 1;
3358 /* CPP driver cannot obtain switch from cc1_options. */
3359 if (is_cpp_driver)
3360 add_preprocessor_option ("--target-help", 13);
3361 add_assembler_option ("--target-help", 13);
3362 add_linker_option ("--target-help", 13);
3363 break;
3365 case OPT__no_sysroot_suffix:
3366 case OPT_pass_exit_codes:
3367 case OPT_print_search_dirs:
3368 case OPT_print_file_name_:
3369 case OPT_print_prog_name_:
3370 case OPT_print_multi_lib:
3371 case OPT_print_multi_directory:
3372 case OPT_print_sysroot:
3373 case OPT_print_multi_os_directory:
3374 case OPT_print_multiarch:
3375 case OPT_print_sysroot_headers_suffix:
3376 case OPT_time:
3377 case OPT_wrapper:
3378 /* These options set the variables specified in common.opt
3379 automatically, and do not need to be saved for spec
3380 processing. */
3381 do_save = false;
3382 break;
3384 case OPT_print_libgcc_file_name:
3385 print_file_name = "libgcc.a";
3386 do_save = false;
3387 break;
3389 case OPT_fcompare_debug_second:
3390 compare_debug_second = 1;
3391 break;
3393 case OPT_fcompare_debug:
3394 switch (value)
3396 case 0:
3397 compare_debug_replacement_opt = "-fcompare-debug=";
3398 arg = "";
3399 goto compare_debug_with_arg;
3401 case 1:
3402 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
3403 arg = "-gtoggle";
3404 goto compare_debug_with_arg;
3406 default:
3407 gcc_unreachable ();
3409 break;
3411 case OPT_fcompare_debug_:
3412 compare_debug_replacement_opt = decoded->canonical_option[0];
3413 compare_debug_with_arg:
3414 gcc_assert (decoded->canonical_option_num_elements == 1);
3415 gcc_assert (arg != NULL);
3416 if (*arg)
3417 compare_debug = 1;
3418 else
3419 compare_debug = -1;
3420 if (compare_debug < 0)
3421 compare_debug_opt = NULL;
3422 else
3423 compare_debug_opt = arg;
3424 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
3425 return true;
3427 case OPT_Wa_:
3429 int prev, j;
3430 /* Pass the rest of this option to the assembler. */
3432 /* Split the argument at commas. */
3433 prev = 0;
3434 for (j = 0; arg[j]; j++)
3435 if (arg[j] == ',')
3437 add_assembler_option (arg + prev, j - prev);
3438 prev = j + 1;
3441 /* Record the part after the last comma. */
3442 add_assembler_option (arg + prev, j - prev);
3444 do_save = false;
3445 break;
3447 case OPT_Wp_:
3449 int prev, j;
3450 /* Pass the rest of this option to the preprocessor. */
3452 /* Split the argument at commas. */
3453 prev = 0;
3454 for (j = 0; arg[j]; j++)
3455 if (arg[j] == ',')
3457 add_preprocessor_option (arg + prev, j - prev);
3458 prev = j + 1;
3461 /* Record the part after the last comma. */
3462 add_preprocessor_option (arg + prev, j - prev);
3464 do_save = false;
3465 break;
3467 case OPT_Wl_:
3469 int prev, j;
3470 /* Split the argument at commas. */
3471 prev = 0;
3472 for (j = 0; arg[j]; j++)
3473 if (arg[j] == ',')
3475 add_infile (save_string (arg + prev, j - prev), "*");
3476 prev = j + 1;
3478 /* Record the part after the last comma. */
3479 add_infile (arg + prev, "*");
3481 do_save = false;
3482 break;
3484 case OPT_Xlinker:
3485 add_infile (arg, "*");
3486 do_save = false;
3487 break;
3489 case OPT_Xpreprocessor:
3490 add_preprocessor_option (arg, strlen (arg));
3491 do_save = false;
3492 break;
3494 case OPT_Xassembler:
3495 add_assembler_option (arg, strlen (arg));
3496 do_save = false;
3497 break;
3499 case OPT_l:
3500 /* POSIX allows separation of -l and the lib arg; canonicalize
3501 by concatenating -l with its arg */
3502 add_infile (concat ("-l", arg, NULL), "*");
3503 do_save = false;
3504 break;
3506 case OPT_L:
3507 /* Similarly, canonicalize -L for linkers that may not accept
3508 separate arguments. */
3509 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
3510 return true;
3512 case OPT_F:
3513 /* Likewise -F. */
3514 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
3515 return true;
3517 case OPT_save_temps:
3518 save_temps_flag = SAVE_TEMPS_CWD;
3519 validated = true;
3520 break;
3522 case OPT_save_temps_:
3523 if (strcmp (arg, "cwd") == 0)
3524 save_temps_flag = SAVE_TEMPS_CWD;
3525 else if (strcmp (arg, "obj") == 0
3526 || strcmp (arg, "object") == 0)
3527 save_temps_flag = SAVE_TEMPS_OBJ;
3528 else
3529 fatal_error ("%qs is an unknown -save-temps option",
3530 decoded->orig_option_with_args_text);
3531 break;
3533 case OPT_no_canonical_prefixes:
3534 /* Already handled as a special case, so ignored here. */
3535 do_save = false;
3536 break;
3538 case OPT_pipe:
3539 validated = true;
3540 /* These options set the variables specified in common.opt
3541 automatically, but do need to be saved for spec
3542 processing. */
3543 break;
3545 case OPT_specs_:
3547 struct user_specs *user = XNEW (struct user_specs);
3549 user->next = (struct user_specs *) 0;
3550 user->filename = arg;
3551 if (user_specs_tail)
3552 user_specs_tail->next = user;
3553 else
3554 user_specs_head = user;
3555 user_specs_tail = user;
3557 validated = true;
3558 break;
3560 case OPT__sysroot_:
3561 target_system_root = arg;
3562 target_system_root_changed = 1;
3563 do_save = false;
3564 break;
3566 case OPT_time_:
3567 if (report_times_to_file)
3568 fclose (report_times_to_file);
3569 report_times_to_file = fopen (arg, "a");
3570 do_save = false;
3571 break;
3573 case OPT____:
3574 /* "-###"
3575 This is similar to -v except that there is no execution
3576 of the commands and the echoed arguments are quoted. It
3577 is intended for use in shell scripts to capture the
3578 driver-generated command line. */
3579 verbose_only_flag++;
3580 verbose_flag = 1;
3581 do_save = false;
3582 break;
3584 case OPT_B:
3586 size_t len = strlen (arg);
3588 /* Catch the case where the user has forgotten to append a
3589 directory separator to the path. Note, they may be using
3590 -B to add an executable name prefix, eg "i386-elf-", in
3591 order to distinguish between multiple installations of
3592 GCC in the same directory. Hence we must check to see
3593 if appending a directory separator actually makes a
3594 valid directory name. */
3595 if (!IS_DIR_SEPARATOR (arg[len - 1])
3596 && is_directory (arg, false))
3598 char *tmp = XNEWVEC (char, len + 2);
3599 strcpy (tmp, arg);
3600 tmp[len] = DIR_SEPARATOR;
3601 tmp[++len] = 0;
3602 arg = tmp;
3605 add_prefix (&exec_prefixes, arg, NULL,
3606 PREFIX_PRIORITY_B_OPT, 0, 0);
3607 add_prefix (&startfile_prefixes, arg, NULL,
3608 PREFIX_PRIORITY_B_OPT, 0, 0);
3609 add_prefix (&include_prefixes, arg, NULL,
3610 PREFIX_PRIORITY_B_OPT, 0, 0);
3612 validated = true;
3613 break;
3615 case OPT_x:
3616 spec_lang = arg;
3617 if (!strcmp (spec_lang, "none"))
3618 /* Suppress the warning if -xnone comes after the last input
3619 file, because alternate command interfaces like g++ might
3620 find it useful to place -xnone after each input file. */
3621 spec_lang = 0;
3622 else
3623 last_language_n_infiles = n_infiles;
3624 do_save = false;
3625 break;
3627 case OPT_o:
3628 have_o = 1;
3629 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3630 arg = convert_filename (arg, ! have_c, 0);
3631 #endif
3632 /* Save the output name in case -save-temps=obj was used. */
3633 save_temps_prefix = xstrdup (arg);
3634 /* On some systems, ld cannot handle "-o" without a space. So
3635 split the option from its argument. */
3636 save_switch ("-o", 1, &arg, validated, true);
3637 return true;
3639 case OPT_static_libgcc:
3640 case OPT_shared_libgcc:
3641 case OPT_static_libgfortran:
3642 case OPT_static_libstdc__:
3643 /* These are always valid, since gcc.c itself understands the
3644 first two, gfortranspec.c understands -static-libgfortran and
3645 g++spec.c understands -static-libstdc++ */
3646 validated = true;
3647 break;
3649 default:
3650 /* Various driver options need no special processing at this
3651 point, having been handled in a prescan above or being
3652 handled by specs. */
3653 break;
3656 if (do_save)
3657 save_switch (decoded->canonical_option[0],
3658 decoded->canonical_option_num_elements - 1,
3659 &decoded->canonical_option[1], validated, true);
3660 return true;
3663 /* Put the driver's standard set of option handlers in *HANDLERS. */
3665 static void
3666 set_option_handlers (struct cl_option_handlers *handlers)
3668 handlers->unknown_option_callback = driver_unknown_option_callback;
3669 handlers->wrong_lang_callback = driver_wrong_lang_callback;
3670 handlers->num_handlers = 3;
3671 handlers->handlers[0].handler = driver_handle_option;
3672 handlers->handlers[0].mask = CL_DRIVER;
3673 handlers->handlers[1].handler = common_handle_option;
3674 handlers->handlers[1].mask = CL_COMMON;
3675 handlers->handlers[2].handler = target_handle_option;
3676 handlers->handlers[2].mask = CL_TARGET;
3679 /* Create the vector `switches' and its contents.
3680 Store its length in `n_switches'. */
3682 static void
3683 process_command (unsigned int decoded_options_count,
3684 struct cl_decoded_option *decoded_options)
3686 const char *temp;
3687 char *temp1;
3688 char *tooldir_prefix, *tooldir_prefix2;
3689 char *(*get_relative_prefix) (const char *, const char *,
3690 const char *) = NULL;
3691 struct cl_option_handlers handlers;
3692 unsigned int j;
3694 gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
3696 n_switches = 0;
3697 n_infiles = 0;
3698 added_libraries = 0;
3700 /* Figure compiler version from version string. */
3702 compiler_version = temp1 = xstrdup (version_string);
3704 for (; *temp1; ++temp1)
3706 if (*temp1 == ' ')
3708 *temp1 = '\0';
3709 break;
3713 /* Handle any -no-canonical-prefixes flag early, to assign the function
3714 that builds relative prefixes. This function creates default search
3715 paths that are needed later in normal option handling. */
3717 for (j = 1; j < decoded_options_count; j++)
3719 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
3721 get_relative_prefix = make_relative_prefix_ignore_links;
3722 break;
3725 if (! get_relative_prefix)
3726 get_relative_prefix = make_relative_prefix;
3728 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3729 see if we can create it from the pathname specified in
3730 decoded_options[0].arg. */
3732 gcc_libexec_prefix = standard_libexec_prefix;
3733 #ifndef VMS
3734 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3735 if (!gcc_exec_prefix)
3737 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
3738 standard_bindir_prefix,
3739 standard_exec_prefix);
3740 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
3741 standard_bindir_prefix,
3742 standard_libexec_prefix);
3743 if (gcc_exec_prefix)
3744 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3746 else
3748 /* make_relative_prefix requires a program name, but
3749 GCC_EXEC_PREFIX is typically a directory name with a trailing
3750 / (which is ignored by make_relative_prefix), so append a
3751 program name. */
3752 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
3753 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3754 standard_exec_prefix,
3755 standard_libexec_prefix);
3757 /* The path is unrelocated, so fallback to the original setting. */
3758 if (!gcc_libexec_prefix)
3759 gcc_libexec_prefix = standard_libexec_prefix;
3761 free (tmp_prefix);
3763 #else
3764 #endif
3765 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3766 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
3767 or an automatically created GCC_EXEC_PREFIX from
3768 decoded_options[0].arg. */
3770 /* Do language-specific adjustment/addition of flags. */
3771 lang_specific_driver (&decoded_options, &decoded_options_count,
3772 &added_libraries);
3774 if (gcc_exec_prefix)
3776 int len = strlen (gcc_exec_prefix);
3778 if (len > (int) sizeof ("/lib/gcc/") - 1
3779 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3781 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3782 if (IS_DIR_SEPARATOR (*temp)
3783 && filename_ncmp (temp + 1, "lib", 3) == 0
3784 && IS_DIR_SEPARATOR (temp[4])
3785 && filename_ncmp (temp + 5, "gcc", 3) == 0)
3786 len -= sizeof ("/lib/gcc/") - 1;
3789 set_std_prefix (gcc_exec_prefix, len);
3790 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3791 PREFIX_PRIORITY_LAST, 0, 0);
3792 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3793 PREFIX_PRIORITY_LAST, 0, 0);
3796 /* COMPILER_PATH and LIBRARY_PATH have values
3797 that are lists of directory names with colons. */
3799 temp = getenv ("COMPILER_PATH");
3800 if (temp)
3802 const char *startp, *endp;
3803 char *nstore = (char *) alloca (strlen (temp) + 3);
3805 startp = endp = temp;
3806 while (1)
3808 if (*endp == PATH_SEPARATOR || *endp == 0)
3810 strncpy (nstore, startp, endp - startp);
3811 if (endp == startp)
3812 strcpy (nstore, concat (".", dir_separator_str, NULL));
3813 else if (!IS_DIR_SEPARATOR (endp[-1]))
3815 nstore[endp - startp] = DIR_SEPARATOR;
3816 nstore[endp - startp + 1] = 0;
3818 else
3819 nstore[endp - startp] = 0;
3820 add_prefix (&exec_prefixes, nstore, 0,
3821 PREFIX_PRIORITY_LAST, 0, 0);
3822 add_prefix (&include_prefixes, nstore, 0,
3823 PREFIX_PRIORITY_LAST, 0, 0);
3824 if (*endp == 0)
3825 break;
3826 endp = startp = endp + 1;
3828 else
3829 endp++;
3833 temp = getenv (LIBRARY_PATH_ENV);
3834 if (temp && *cross_compile == '0')
3836 const char *startp, *endp;
3837 char *nstore = (char *) alloca (strlen (temp) + 3);
3839 startp = endp = temp;
3840 while (1)
3842 if (*endp == PATH_SEPARATOR || *endp == 0)
3844 strncpy (nstore, startp, endp - startp);
3845 if (endp == startp)
3846 strcpy (nstore, concat (".", dir_separator_str, NULL));
3847 else if (!IS_DIR_SEPARATOR (endp[-1]))
3849 nstore[endp - startp] = DIR_SEPARATOR;
3850 nstore[endp - startp + 1] = 0;
3852 else
3853 nstore[endp - startp] = 0;
3854 add_prefix (&startfile_prefixes, nstore, NULL,
3855 PREFIX_PRIORITY_LAST, 0, 1);
3856 if (*endp == 0)
3857 break;
3858 endp = startp = endp + 1;
3860 else
3861 endp++;
3865 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3866 temp = getenv ("LPATH");
3867 if (temp && *cross_compile == '0')
3869 const char *startp, *endp;
3870 char *nstore = (char *) alloca (strlen (temp) + 3);
3872 startp = endp = temp;
3873 while (1)
3875 if (*endp == PATH_SEPARATOR || *endp == 0)
3877 strncpy (nstore, startp, endp - startp);
3878 if (endp == startp)
3879 strcpy (nstore, concat (".", dir_separator_str, NULL));
3880 else if (!IS_DIR_SEPARATOR (endp[-1]))
3882 nstore[endp - startp] = DIR_SEPARATOR;
3883 nstore[endp - startp + 1] = 0;
3885 else
3886 nstore[endp - startp] = 0;
3887 add_prefix (&startfile_prefixes, nstore, NULL,
3888 PREFIX_PRIORITY_LAST, 0, 1);
3889 if (*endp == 0)
3890 break;
3891 endp = startp = endp + 1;
3893 else
3894 endp++;
3898 /* Process the options and store input files and switches in their
3899 vectors. */
3901 last_language_n_infiles = -1;
3903 set_option_handlers (&handlers);
3905 for (j = 1; j < decoded_options_count; j++)
3907 switch (decoded_options[j].opt_index)
3909 case OPT_S:
3910 case OPT_c:
3911 case OPT_E:
3912 have_c = 1;
3913 break;
3915 if (have_c)
3916 break;
3919 for (j = 1; j < decoded_options_count; j++)
3921 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
3923 const char *arg = decoded_options[j].arg;
3924 const char *p = strrchr (arg, '@');
3925 char *fname;
3926 long offset;
3927 int consumed;
3928 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3929 arg = convert_filename (arg, 0, access (arg, F_OK));
3930 #endif
3931 /* For LTO static archive support we handle input file
3932 specifications that are composed of a filename and
3933 an offset like FNAME@OFFSET. */
3934 if (p
3935 && p != arg
3936 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
3937 && strlen (p) == (unsigned int)consumed)
3939 fname = (char *)xmalloc (p - arg + 1);
3940 memcpy (fname, arg, p - arg);
3941 fname[p - arg] = '\0';
3942 /* Only accept non-stdin and existing FNAME parts, otherwise
3943 try with the full name. */
3944 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
3946 free (fname);
3947 fname = xstrdup (arg);
3950 else
3951 fname = xstrdup (arg);
3953 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
3954 perror_with_name (fname);
3955 else
3956 add_infile (arg, spec_lang);
3958 free (fname);
3959 continue;
3962 read_cmdline_option (&global_options, &global_options_set,
3963 decoded_options + j, UNKNOWN_LOCATION,
3964 CL_DRIVER, &handlers, global_dc);
3967 /* If -save-temps=obj and -o name, create the prefix to use for %b.
3968 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
3969 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
3971 save_temps_length = strlen (save_temps_prefix);
3972 temp = strrchr (lbasename (save_temps_prefix), '.');
3973 if (temp)
3975 save_temps_length -= strlen (temp);
3976 save_temps_prefix[save_temps_length] = '\0';
3980 else if (save_temps_prefix != NULL)
3982 free (save_temps_prefix);
3983 save_temps_prefix = NULL;
3986 if (save_temps_flag && use_pipes)
3988 /* -save-temps overrides -pipe, so that temp files are produced */
3989 if (save_temps_flag)
3990 warning (0, "-pipe ignored because -save-temps specified");
3991 use_pipes = 0;
3994 if (!compare_debug)
3996 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
3998 if (gcd && gcd[0] == '-')
4000 compare_debug = 2;
4001 compare_debug_opt = gcd;
4003 else if (gcd && *gcd && strcmp (gcd, "0"))
4005 compare_debug = 3;
4006 compare_debug_opt = "-gtoggle";
4009 else if (compare_debug < 0)
4011 compare_debug = 0;
4012 gcc_assert (!compare_debug_opt);
4015 /* Set up the search paths. We add directories that we expect to
4016 contain GNU Toolchain components before directories specified by
4017 the machine description so that we will find GNU components (like
4018 the GNU assembler) before those of the host system. */
4020 /* If we don't know where the toolchain has been installed, use the
4021 configured-in locations. */
4022 if (!gcc_exec_prefix)
4024 #ifndef OS2
4025 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4026 PREFIX_PRIORITY_LAST, 1, 0);
4027 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4028 PREFIX_PRIORITY_LAST, 2, 0);
4029 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4030 PREFIX_PRIORITY_LAST, 2, 0);
4031 #endif
4032 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4033 PREFIX_PRIORITY_LAST, 1, 0);
4036 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4037 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
4038 dir_separator_str, NULL);
4040 /* Look for tools relative to the location from which the driver is
4041 running, or, if that is not available, the configured prefix. */
4042 tooldir_prefix
4043 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4044 spec_machine, dir_separator_str,
4045 spec_version, dir_separator_str, tooldir_prefix2, NULL);
4046 free (tooldir_prefix2);
4048 add_prefix (&exec_prefixes,
4049 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4050 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4051 add_prefix (&startfile_prefixes,
4052 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4053 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4054 free (tooldir_prefix);
4056 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4057 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4058 then consider it to relocate with the rest of the GCC installation
4059 if GCC_EXEC_PREFIX is set.
4060 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4061 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4063 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
4064 standard_bindir_prefix,
4065 target_system_root);
4066 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4068 target_system_root = tmp_prefix;
4069 target_system_root_changed = 1;
4072 #endif
4074 /* More prefixes are enabled in main, after we read the specs file
4075 and determine whether this is cross-compilation or not. */
4077 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4078 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4080 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4081 environment variable. */
4082 if (compare_debug == 2 || compare_debug == 3)
4084 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4085 save_switch (opt, 0, NULL, false, true);
4086 compare_debug = 1;
4089 /* Ensure we only invoke each subprocess once. */
4090 if (print_subprocess_help || print_help_list || print_version)
4092 n_infiles = 0;
4094 /* Create a dummy input file, so that we can pass
4095 the help option on to the various sub-processes. */
4096 add_infile ("help-dummy", "c");
4099 alloc_switch ();
4100 switches[n_switches].part1 = 0;
4101 alloc_infile ();
4102 infiles[n_infiles].name = 0;
4105 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4106 and place that in the environment. */
4108 static void
4109 set_collect_gcc_options (void)
4111 int i;
4112 int first_time;
4114 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4115 the compiler. */
4116 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4117 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4119 first_time = TRUE;
4120 for (i = 0; (int) i < n_switches; i++)
4122 const char *const *args;
4123 const char *p, *q;
4124 if (!first_time)
4125 obstack_grow (&collect_obstack, " ", 1);
4127 first_time = FALSE;
4129 /* Ignore elided switches. */
4130 if ((switches[i].live_cond
4131 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4132 == SWITCH_IGNORE)
4133 continue;
4135 obstack_grow (&collect_obstack, "'-", 2);
4136 q = switches[i].part1;
4137 while ((p = strchr (q, '\'')))
4139 obstack_grow (&collect_obstack, q, p - q);
4140 obstack_grow (&collect_obstack, "'\\''", 4);
4141 q = ++p;
4143 obstack_grow (&collect_obstack, q, strlen (q));
4144 obstack_grow (&collect_obstack, "'", 1);
4146 for (args = switches[i].args; args && *args; args++)
4148 obstack_grow (&collect_obstack, " '", 2);
4149 q = *args;
4150 while ((p = strchr (q, '\'')))
4152 obstack_grow (&collect_obstack, q, p - q);
4153 obstack_grow (&collect_obstack, "'\\''", 4);
4154 q = ++p;
4156 obstack_grow (&collect_obstack, q, strlen (q));
4157 obstack_grow (&collect_obstack, "'", 1);
4160 obstack_grow (&collect_obstack, "\0", 1);
4161 xputenv (XOBFINISH (&collect_obstack, char *));
4164 /* Process a spec string, accumulating and running commands. */
4166 /* These variables describe the input file name.
4167 input_file_number is the index on outfiles of this file,
4168 so that the output file name can be stored for later use by %o.
4169 input_basename is the start of the part of the input file
4170 sans all directory names, and basename_length is the number
4171 of characters starting there excluding the suffix .c or whatever. */
4173 static const char *gcc_input_filename;
4174 static int input_file_number;
4175 size_t input_filename_length;
4176 static int basename_length;
4177 static int suffixed_basename_length;
4178 static const char *input_basename;
4179 static const char *input_suffix;
4180 #ifndef HOST_LACKS_INODE_NUMBERS
4181 static struct stat input_stat;
4182 #endif
4183 static int input_stat_set;
4185 /* The compiler used to process the current input file. */
4186 static struct compiler *input_file_compiler;
4188 /* These are variables used within do_spec and do_spec_1. */
4190 /* Nonzero if an arg has been started and not yet terminated
4191 (with space, tab or newline). */
4192 static int arg_going;
4194 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4195 is a temporary file name. */
4196 static int delete_this_arg;
4198 /* Nonzero means %w has been seen; the next arg to be terminated
4199 is the output file name of this compilation. */
4200 static int this_is_output_file;
4202 /* Nonzero means %s has been seen; the next arg to be terminated
4203 is the name of a library file and we should try the standard
4204 search dirs for it. */
4205 static int this_is_library_file;
4207 /* Nonzero means %T has been seen; the next arg to be terminated
4208 is the name of a linker script and we should try all of the
4209 standard search dirs for it. If it is found insert a --script
4210 command line switch and then substitute the full path in place,
4211 otherwise generate an error message. */
4212 static int this_is_linker_script;
4214 /* Nonzero means that the input of this command is coming from a pipe. */
4215 static int input_from_pipe;
4217 /* Nonnull means substitute this for any suffix when outputting a switches
4218 arguments. */
4219 static const char *suffix_subst;
4221 /* If there is an argument being accumulated, terminate it and store it. */
4223 static void
4224 end_going_arg (void)
4226 if (arg_going)
4228 const char *string;
4230 obstack_1grow (&obstack, 0);
4231 string = XOBFINISH (&obstack, const char *);
4232 if (this_is_library_file)
4233 string = find_file (string);
4234 if (this_is_linker_script)
4236 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4238 if (full_script_path == NULL)
4240 error ("unable to locate default linker script %qs in the library search paths", string);
4241 /* Script was not found on search path. */
4242 return;
4244 store_arg ("--script", false, false);
4245 string = full_script_path;
4247 store_arg (string, delete_this_arg, this_is_output_file);
4248 if (this_is_output_file)
4249 outfiles[input_file_number] = string;
4250 arg_going = 0;
4255 /* Parse the WRAPPER string which is a comma separated list of the command line
4256 and insert them into the beginning of argbuf. */
4258 static void
4259 insert_wrapper (const char *wrapper)
4261 int n = 0;
4262 int i;
4263 char *buf = xstrdup (wrapper);
4264 char *p = buf;
4265 unsigned int old_length = argbuf.length ();
4269 n++;
4270 while (*p == ',')
4271 p++;
4273 while ((p = strchr (p, ',')) != NULL);
4275 argbuf.safe_grow (old_length + n);
4276 memmove (argbuf.address () + n,
4277 argbuf.address (),
4278 old_length * sizeof (const_char_p));
4280 i = 0;
4281 p = buf;
4284 while (*p == ',')
4286 *p = 0;
4287 p++;
4289 argbuf[i] = p;
4290 i++;
4292 while ((p = strchr (p, ',')) != NULL);
4293 gcc_assert (i == n);
4296 /* Process the spec SPEC and run the commands specified therein.
4297 Returns 0 if the spec is successfully processed; -1 if failed. */
4300 do_spec (const char *spec)
4302 int value;
4304 value = do_spec_2 (spec);
4306 /* Force out any unfinished command.
4307 If -pipe, this forces out the last command if it ended in `|'. */
4308 if (value == 0)
4310 if (argbuf.length () > 0
4311 && !strcmp (argbuf.last (), "|"))
4312 argbuf.pop ();
4314 set_collect_gcc_options ();
4316 if (argbuf.length () > 0)
4317 value = execute ();
4320 return value;
4323 static int
4324 do_spec_2 (const char *spec)
4326 int result;
4328 clear_args ();
4329 arg_going = 0;
4330 delete_this_arg = 0;
4331 this_is_output_file = 0;
4332 this_is_library_file = 0;
4333 this_is_linker_script = 0;
4334 input_from_pipe = 0;
4335 suffix_subst = NULL;
4337 result = do_spec_1 (spec, 0, NULL);
4339 end_going_arg ();
4341 return result;
4345 /* Process the given spec string and add any new options to the end
4346 of the switches/n_switches array. */
4348 static void
4349 do_option_spec (const char *name, const char *spec)
4351 unsigned int i, value_count, value_len;
4352 const char *p, *q, *value;
4353 char *tmp_spec, *tmp_spec_p;
4355 if (configure_default_options[0].name == NULL)
4356 return;
4358 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4359 if (strcmp (configure_default_options[i].name, name) == 0)
4360 break;
4361 if (i == ARRAY_SIZE (configure_default_options))
4362 return;
4364 value = configure_default_options[i].value;
4365 value_len = strlen (value);
4367 /* Compute the size of the final spec. */
4368 value_count = 0;
4369 p = spec;
4370 while ((p = strstr (p, "%(VALUE)")) != NULL)
4372 p ++;
4373 value_count ++;
4376 /* Replace each %(VALUE) by the specified value. */
4377 tmp_spec = (char *) alloca (strlen (spec) + 1
4378 + value_count * (value_len - strlen ("%(VALUE)")));
4379 tmp_spec_p = tmp_spec;
4380 q = spec;
4381 while ((p = strstr (q, "%(VALUE)")) != NULL)
4383 memcpy (tmp_spec_p, q, p - q);
4384 tmp_spec_p = tmp_spec_p + (p - q);
4385 memcpy (tmp_spec_p, value, value_len);
4386 tmp_spec_p += value_len;
4387 q = p + strlen ("%(VALUE)");
4389 strcpy (tmp_spec_p, q);
4391 do_self_spec (tmp_spec);
4394 /* Process the given spec string and add any new options to the end
4395 of the switches/n_switches array. */
4397 static void
4398 do_self_spec (const char *spec)
4400 int i;
4402 do_spec_2 (spec);
4403 do_spec_1 (" ", 0, NULL);
4405 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4406 do_self_specs adds the replacements to switches array, so it shouldn't
4407 be processed afterwards. */
4408 for (i = 0; i < n_switches; i++)
4409 if ((switches[i].live_cond & SWITCH_IGNORE))
4410 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4412 if (argbuf.length () > 0)
4414 const char **argbuf_copy;
4415 struct cl_decoded_option *decoded_options;
4416 struct cl_option_handlers handlers;
4417 unsigned int decoded_options_count;
4418 unsigned int j;
4420 /* Create a copy of argbuf with a dummy argv[0] entry for
4421 decode_cmdline_options_to_array. */
4422 argbuf_copy = XNEWVEC (const char *,
4423 argbuf.length () + 1);
4424 argbuf_copy[0] = "";
4425 memcpy (argbuf_copy + 1, argbuf.address (),
4426 argbuf.length () * sizeof (const char *));
4428 decode_cmdline_options_to_array (argbuf.length () + 1,
4429 argbuf_copy,
4430 CL_DRIVER, &decoded_options,
4431 &decoded_options_count);
4432 free (argbuf_copy);
4434 set_option_handlers (&handlers);
4436 for (j = 1; j < decoded_options_count; j++)
4438 switch (decoded_options[j].opt_index)
4440 case OPT_SPECIAL_input_file:
4441 /* Specs should only generate options, not input
4442 files. */
4443 if (strcmp (decoded_options[j].arg, "-") != 0)
4444 fatal_error ("switch %qs does not start with %<-%>",
4445 decoded_options[j].arg);
4446 else
4447 fatal_error ("spec-generated switch is just %<-%>");
4448 break;
4450 case OPT_fcompare_debug_second:
4451 case OPT_fcompare_debug:
4452 case OPT_fcompare_debug_:
4453 case OPT_o:
4454 /* Avoid duplicate processing of some options from
4455 compare-debug specs; just save them here. */
4456 save_switch (decoded_options[j].canonical_option[0],
4457 (decoded_options[j].canonical_option_num_elements
4458 - 1),
4459 &decoded_options[j].canonical_option[1], false, true);
4460 break;
4462 default:
4463 read_cmdline_option (&global_options, &global_options_set,
4464 decoded_options + j, UNKNOWN_LOCATION,
4465 CL_DRIVER, &handlers, global_dc);
4466 break;
4470 alloc_switch ();
4471 switches[n_switches].part1 = 0;
4475 /* Callback for processing %D and %I specs. */
4477 struct spec_path_info {
4478 const char *option;
4479 const char *append;
4480 size_t append_len;
4481 bool omit_relative;
4482 bool separate_options;
4485 static void *
4486 spec_path (char *path, void *data)
4488 struct spec_path_info *info = (struct spec_path_info *) data;
4489 size_t len = 0;
4490 char save = 0;
4492 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4493 return NULL;
4495 if (info->append_len != 0)
4497 len = strlen (path);
4498 memcpy (path + len, info->append, info->append_len + 1);
4501 if (!is_directory (path, true))
4502 return NULL;
4504 do_spec_1 (info->option, 1, NULL);
4505 if (info->separate_options)
4506 do_spec_1 (" ", 0, NULL);
4508 if (info->append_len == 0)
4510 len = strlen (path);
4511 save = path[len - 1];
4512 if (IS_DIR_SEPARATOR (path[len - 1]))
4513 path[len - 1] = '\0';
4516 do_spec_1 (path, 1, NULL);
4517 do_spec_1 (" ", 0, NULL);
4519 /* Must not damage the original path. */
4520 if (info->append_len == 0)
4521 path[len - 1] = save;
4523 return NULL;
4526 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4527 argument list. */
4529 static void
4530 create_at_file (char **argv)
4532 char *temp_file = make_temp_file ("");
4533 char *at_argument = concat ("@", temp_file, NULL);
4534 FILE *f = fopen (temp_file, "w");
4535 int status;
4537 if (f == NULL)
4538 fatal_error ("could not open temporary response file %s",
4539 temp_file);
4541 status = writeargv (argv, f);
4543 if (status)
4544 fatal_error ("could not write to temporary response file %s",
4545 temp_file);
4547 status = fclose (f);
4549 if (EOF == status)
4550 fatal_error ("could not close temporary response file %s",
4551 temp_file);
4553 store_arg (at_argument, 0, 0);
4555 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
4558 /* True if we should compile INFILE. */
4560 static bool
4561 compile_input_file_p (struct infile *infile)
4563 if ((!infile->language) || (infile->language[0] != '*'))
4564 if (infile->incompiler == input_file_compiler)
4565 return true;
4566 return false;
4569 /* Process each member of VEC as a spec. */
4571 static void
4572 do_specs_vec (vec<char_p> vec)
4574 unsigned ix;
4575 char *opt;
4577 FOR_EACH_VEC_ELT (vec, ix, opt)
4579 do_spec_1 (opt, 1, NULL);
4580 /* Make each accumulated option a separate argument. */
4581 do_spec_1 (" ", 0, NULL);
4585 /* Process the sub-spec SPEC as a portion of a larger spec.
4586 This is like processing a whole spec except that we do
4587 not initialize at the beginning and we do not supply a
4588 newline by default at the end.
4589 INSWITCH nonzero means don't process %-sequences in SPEC;
4590 in this case, % is treated as an ordinary character.
4591 This is used while substituting switches.
4592 INSWITCH nonzero also causes SPC not to terminate an argument.
4594 Value is zero unless a line was finished
4595 and the command on that line reported an error. */
4597 static int
4598 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4600 const char *p = spec;
4601 int c;
4602 int i;
4603 int value;
4605 /* If it's an empty string argument to a switch, keep it as is. */
4606 if (inswitch && !*p)
4607 arg_going = 1;
4609 while ((c = *p++))
4610 /* If substituting a switch, treat all chars like letters.
4611 Otherwise, NL, SPC, TAB and % are special. */
4612 switch (inswitch ? 'a' : c)
4614 case '\n':
4615 end_going_arg ();
4617 if (argbuf.length () > 0
4618 && !strcmp (argbuf.last (), "|"))
4620 /* A `|' before the newline means use a pipe here,
4621 but only if -pipe was specified.
4622 Otherwise, execute now and don't pass the `|' as an arg. */
4623 if (use_pipes)
4625 input_from_pipe = 1;
4626 break;
4628 else
4629 argbuf.pop ();
4632 set_collect_gcc_options ();
4634 if (argbuf.length () > 0)
4636 value = execute ();
4637 if (value)
4638 return value;
4640 /* Reinitialize for a new command, and for a new argument. */
4641 clear_args ();
4642 arg_going = 0;
4643 delete_this_arg = 0;
4644 this_is_output_file = 0;
4645 this_is_library_file = 0;
4646 this_is_linker_script = 0;
4647 input_from_pipe = 0;
4648 break;
4650 case '|':
4651 end_going_arg ();
4653 /* Use pipe */
4654 obstack_1grow (&obstack, c);
4655 arg_going = 1;
4656 break;
4658 case '\t':
4659 case ' ':
4660 end_going_arg ();
4662 /* Reinitialize for a new argument. */
4663 delete_this_arg = 0;
4664 this_is_output_file = 0;
4665 this_is_library_file = 0;
4666 this_is_linker_script = 0;
4667 break;
4669 case '%':
4670 switch (c = *p++)
4672 case 0:
4673 fatal_error ("spec %qs invalid", spec);
4675 case 'b':
4676 if (save_temps_length)
4677 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4678 else
4679 obstack_grow (&obstack, input_basename, basename_length);
4680 if (compare_debug < 0)
4681 obstack_grow (&obstack, ".gk", 3);
4682 arg_going = 1;
4683 break;
4685 case 'B':
4686 if (save_temps_length)
4687 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4688 else
4689 obstack_grow (&obstack, input_basename, suffixed_basename_length);
4690 if (compare_debug < 0)
4691 obstack_grow (&obstack, ".gk", 3);
4692 arg_going = 1;
4693 break;
4695 case 'd':
4696 delete_this_arg = 2;
4697 break;
4699 /* Dump out the directories specified with LIBRARY_PATH,
4700 followed by the absolute directories
4701 that we search for startfiles. */
4702 case 'D':
4704 struct spec_path_info info;
4706 info.option = "-L";
4707 info.append_len = 0;
4708 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4709 /* Used on systems which record the specified -L dirs
4710 and use them to search for dynamic linking.
4711 Relative directories always come from -B,
4712 and it is better not to use them for searching
4713 at run time. In particular, stage1 loses. */
4714 info.omit_relative = true;
4715 #else
4716 info.omit_relative = false;
4717 #endif
4718 info.separate_options = false;
4720 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
4722 break;
4724 case 'e':
4725 /* %efoo means report an error with `foo' as error message
4726 and don't execute any more commands for this file. */
4728 const char *q = p;
4729 char *buf;
4730 while (*p != 0 && *p != '\n')
4731 p++;
4732 buf = (char *) alloca (p - q + 1);
4733 strncpy (buf, q, p - q);
4734 buf[p - q] = 0;
4735 error ("%s", _(buf));
4736 return -1;
4738 break;
4739 case 'n':
4740 /* %nfoo means report a notice with `foo' on stderr. */
4742 const char *q = p;
4743 char *buf;
4744 while (*p != 0 && *p != '\n')
4745 p++;
4746 buf = (char *) alloca (p - q + 1);
4747 strncpy (buf, q, p - q);
4748 buf[p - q] = 0;
4749 inform (0, "%s", _(buf));
4750 if (*p)
4751 p++;
4753 break;
4755 case 'j':
4757 struct stat st;
4759 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4760 defined, and it is not a directory, and it is
4761 writable, use it. Otherwise, treat this like any
4762 other temporary file. */
4764 if ((!save_temps_flag)
4765 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4766 && (access (HOST_BIT_BUCKET, W_OK) == 0))
4768 obstack_grow (&obstack, HOST_BIT_BUCKET,
4769 strlen (HOST_BIT_BUCKET));
4770 delete_this_arg = 0;
4771 arg_going = 1;
4772 break;
4775 goto create_temp_file;
4776 case '|':
4777 if (use_pipes)
4779 obstack_1grow (&obstack, '-');
4780 delete_this_arg = 0;
4781 arg_going = 1;
4783 /* consume suffix */
4784 while (*p == '.' || ISALNUM ((unsigned char) *p))
4785 p++;
4786 if (p[0] == '%' && p[1] == 'O')
4787 p += 2;
4789 break;
4791 goto create_temp_file;
4792 case 'm':
4793 if (use_pipes)
4795 /* consume suffix */
4796 while (*p == '.' || ISALNUM ((unsigned char) *p))
4797 p++;
4798 if (p[0] == '%' && p[1] == 'O')
4799 p += 2;
4801 break;
4803 goto create_temp_file;
4804 case 'g':
4805 case 'u':
4806 case 'U':
4807 create_temp_file:
4809 struct temp_name *t;
4810 int suffix_length;
4811 const char *suffix = p;
4812 char *saved_suffix = NULL;
4814 while (*p == '.' || ISALNUM ((unsigned char) *p))
4815 p++;
4816 suffix_length = p - suffix;
4817 if (p[0] == '%' && p[1] == 'O')
4819 p += 2;
4820 /* We don't support extra suffix characters after %O. */
4821 if (*p == '.' || ISALNUM ((unsigned char) *p))
4822 fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
4823 if (suffix_length == 0)
4824 suffix = TARGET_OBJECT_SUFFIX;
4825 else
4827 saved_suffix
4828 = XNEWVEC (char, suffix_length
4829 + strlen (TARGET_OBJECT_SUFFIX));
4830 strncpy (saved_suffix, suffix, suffix_length);
4831 strcpy (saved_suffix + suffix_length,
4832 TARGET_OBJECT_SUFFIX);
4834 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4837 if (compare_debug < 0)
4839 suffix = concat (".gk", suffix, NULL);
4840 suffix_length += 3;
4843 /* If -save-temps=obj and -o were specified, use that for the
4844 temp file. */
4845 if (save_temps_length)
4847 char *tmp;
4848 temp_filename_length
4849 = save_temps_length + suffix_length + 1;
4850 tmp = (char *) alloca (temp_filename_length);
4851 memcpy (tmp, save_temps_prefix, save_temps_length);
4852 memcpy (tmp + save_temps_length, suffix, suffix_length);
4853 tmp[save_temps_length + suffix_length] = '\0';
4854 temp_filename = save_string (tmp, save_temps_length
4855 + suffix_length);
4856 obstack_grow (&obstack, temp_filename,
4857 temp_filename_length);
4858 arg_going = 1;
4859 delete_this_arg = 0;
4860 break;
4863 /* If the gcc_input_filename has the same suffix specified
4864 for the %g, %u, or %U, and -save-temps is specified,
4865 we could end up using that file as an intermediate
4866 thus clobbering the user's source file (.e.g.,
4867 gcc -save-temps foo.s would clobber foo.s with the
4868 output of cpp0). So check for this condition and
4869 generate a temp file as the intermediate. */
4871 if (save_temps_flag)
4873 char *tmp;
4874 temp_filename_length = basename_length + suffix_length + 1;
4875 tmp = (char *) alloca (temp_filename_length);
4876 memcpy (tmp, input_basename, basename_length);
4877 memcpy (tmp + basename_length, suffix, suffix_length);
4878 tmp[basename_length + suffix_length] = '\0';
4879 temp_filename = tmp;
4881 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
4883 #ifndef HOST_LACKS_INODE_NUMBERS
4884 struct stat st_temp;
4886 /* Note, set_input() resets input_stat_set to 0. */
4887 if (input_stat_set == 0)
4889 input_stat_set = stat (gcc_input_filename,
4890 &input_stat);
4891 if (input_stat_set >= 0)
4892 input_stat_set = 1;
4895 /* If we have the stat for the gcc_input_filename
4896 and we can do the stat for the temp_filename
4897 then the they could still refer to the same
4898 file if st_dev/st_ino's are the same. */
4899 if (input_stat_set != 1
4900 || stat (temp_filename, &st_temp) < 0
4901 || input_stat.st_dev != st_temp.st_dev
4902 || input_stat.st_ino != st_temp.st_ino)
4903 #else
4904 /* Just compare canonical pathnames. */
4905 char* input_realname = lrealpath (gcc_input_filename);
4906 char* temp_realname = lrealpath (temp_filename);
4907 bool files_differ = filename_cmp (input_realname, temp_realname);
4908 free (input_realname);
4909 free (temp_realname);
4910 if (files_differ)
4911 #endif
4913 temp_filename = save_string (temp_filename,
4914 temp_filename_length + 1);
4915 obstack_grow (&obstack, temp_filename,
4916 temp_filename_length);
4917 arg_going = 1;
4918 delete_this_arg = 0;
4919 break;
4924 /* See if we already have an association of %g/%u/%U and
4925 suffix. */
4926 for (t = temp_names; t; t = t->next)
4927 if (t->length == suffix_length
4928 && strncmp (t->suffix, suffix, suffix_length) == 0
4929 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
4930 break;
4932 /* Make a new association if needed. %u and %j
4933 require one. */
4934 if (t == 0 || c == 'u' || c == 'j')
4936 if (t == 0)
4938 t = XNEW (struct temp_name);
4939 t->next = temp_names;
4940 temp_names = t;
4942 t->length = suffix_length;
4943 if (saved_suffix)
4945 t->suffix = saved_suffix;
4946 saved_suffix = NULL;
4948 else
4949 t->suffix = save_string (suffix, suffix_length);
4950 t->unique = (c == 'u' || c == 'U' || c == 'j');
4951 temp_filename = make_temp_file (t->suffix);
4952 temp_filename_length = strlen (temp_filename);
4953 t->filename = temp_filename;
4954 t->filename_length = temp_filename_length;
4957 free (saved_suffix);
4959 obstack_grow (&obstack, t->filename, t->filename_length);
4960 delete_this_arg = 1;
4962 arg_going = 1;
4963 break;
4965 case 'i':
4966 if (combine_inputs)
4968 if (at_file_supplied)
4970 /* We are going to expand `%i' to `@FILE', where FILE
4971 is a newly-created temporary filename. The filenames
4972 that would usually be expanded in place of %o will be
4973 written to the temporary file. */
4974 char **argv;
4975 int n_files = 0;
4976 int j;
4978 for (i = 0; i < n_infiles; i++)
4979 if (compile_input_file_p (&infiles[i]))
4980 n_files++;
4982 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
4984 /* Copy the strings over. */
4985 for (i = 0, j = 0; i < n_infiles; i++)
4986 if (compile_input_file_p (&infiles[i]))
4988 argv[j] = CONST_CAST (char *, infiles[i].name);
4989 infiles[i].compiled = true;
4990 j++;
4992 argv[j] = NULL;
4994 create_at_file (argv);
4996 else
4997 for (i = 0; (int) i < n_infiles; i++)
4998 if (compile_input_file_p (&infiles[i]))
5000 store_arg (infiles[i].name, 0, 0);
5001 infiles[i].compiled = true;
5004 else
5006 obstack_grow (&obstack, gcc_input_filename,
5007 input_filename_length);
5008 arg_going = 1;
5010 break;
5012 case 'I':
5014 struct spec_path_info info;
5016 if (multilib_dir)
5018 do_spec_1 ("-imultilib", 1, NULL);
5019 /* Make this a separate argument. */
5020 do_spec_1 (" ", 0, NULL);
5021 do_spec_1 (multilib_dir, 1, NULL);
5022 do_spec_1 (" ", 0, NULL);
5025 if (multiarch_dir)
5027 do_spec_1 ("-imultiarch", 1, NULL);
5028 /* Make this a separate argument. */
5029 do_spec_1 (" ", 0, NULL);
5030 do_spec_1 (multiarch_dir, 1, NULL);
5031 do_spec_1 (" ", 0, NULL);
5034 if (gcc_exec_prefix)
5036 do_spec_1 ("-iprefix", 1, NULL);
5037 /* Make this a separate argument. */
5038 do_spec_1 (" ", 0, NULL);
5039 do_spec_1 (gcc_exec_prefix, 1, NULL);
5040 do_spec_1 (" ", 0, NULL);
5043 if (target_system_root_changed ||
5044 (target_system_root && target_sysroot_hdrs_suffix))
5046 do_spec_1 ("-isysroot", 1, NULL);
5047 /* Make this a separate argument. */
5048 do_spec_1 (" ", 0, NULL);
5049 do_spec_1 (target_system_root, 1, NULL);
5050 if (target_sysroot_hdrs_suffix)
5051 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5052 do_spec_1 (" ", 0, NULL);
5055 info.option = "-isystem";
5056 info.append = "include";
5057 info.append_len = strlen (info.append);
5058 info.omit_relative = false;
5059 info.separate_options = true;
5061 for_each_path (&include_prefixes, false, info.append_len,
5062 spec_path, &info);
5064 info.append = "include-fixed";
5065 if (*sysroot_hdrs_suffix_spec)
5066 info.append = concat (info.append, dir_separator_str,
5067 multilib_dir, NULL);
5068 info.append_len = strlen (info.append);
5069 for_each_path (&include_prefixes, false, info.append_len,
5070 spec_path, &info);
5072 break;
5074 case 'o':
5076 int max = n_infiles;
5077 max += lang_specific_extra_outfiles;
5079 if (HAVE_GNU_LD && at_file_supplied)
5081 /* We are going to expand `%o' to `@FILE', where FILE
5082 is a newly-created temporary filename. The filenames
5083 that would usually be expanded in place of %o will be
5084 written to the temporary file. */
5086 char **argv;
5087 int n_files, j;
5089 /* Convert OUTFILES into a form suitable for writeargv. */
5091 /* Determine how many are non-NULL. */
5092 for (n_files = 0, i = 0; i < max; i++)
5093 n_files += outfiles[i] != NULL;
5095 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5097 /* Copy the strings over. */
5098 for (i = 0, j = 0; i < max; i++)
5099 if (outfiles[i])
5101 argv[j] = CONST_CAST (char *, outfiles[i]);
5102 j++;
5104 argv[j] = NULL;
5106 create_at_file (argv);
5108 else
5109 for (i = 0; i < max; i++)
5110 if (outfiles[i])
5111 store_arg (outfiles[i], 0, 0);
5112 break;
5115 case 'O':
5116 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5117 arg_going = 1;
5118 break;
5120 case 's':
5121 this_is_library_file = 1;
5122 break;
5124 case 'T':
5125 this_is_linker_script = 1;
5126 break;
5128 case 'V':
5129 outfiles[input_file_number] = NULL;
5130 break;
5132 case 'w':
5133 this_is_output_file = 1;
5134 break;
5136 case 'W':
5138 unsigned int cur_index = argbuf.length ();
5139 /* Handle the {...} following the %W. */
5140 if (*p != '{')
5141 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
5142 p = handle_braces (p + 1);
5143 if (p == 0)
5144 return -1;
5145 end_going_arg ();
5146 /* If any args were output, mark the last one for deletion
5147 on failure. */
5148 if (argbuf.length () != cur_index)
5149 record_temp_file (argbuf.last (), 0, 1);
5150 break;
5153 /* %x{OPTION} records OPTION for %X to output. */
5154 case 'x':
5156 const char *p1 = p;
5157 char *string;
5158 char *opt;
5159 unsigned ix;
5161 /* Skip past the option value and make a copy. */
5162 if (*p != '{')
5163 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
5164 while (*p++ != '}')
5166 string = save_string (p1 + 1, p - p1 - 2);
5168 /* See if we already recorded this option. */
5169 FOR_EACH_VEC_ELT (linker_options, ix, opt)
5170 if (! strcmp (string, opt))
5172 free (string);
5173 return 0;
5176 /* This option is new; add it. */
5177 add_linker_option (string, strlen (string));
5178 free (string);
5180 break;
5182 /* Dump out the options accumulated previously using %x. */
5183 case 'X':
5184 do_specs_vec (linker_options);
5185 break;
5187 /* Dump out the options accumulated previously using -Wa,. */
5188 case 'Y':
5189 do_specs_vec (assembler_options);
5190 break;
5192 /* Dump out the options accumulated previously using -Wp,. */
5193 case 'Z':
5194 do_specs_vec (preprocessor_options);
5195 break;
5197 /* Here are digits and numbers that just process
5198 a certain constant string as a spec. */
5200 case '1':
5201 value = do_spec_1 (cc1_spec, 0, NULL);
5202 if (value != 0)
5203 return value;
5204 break;
5206 case '2':
5207 value = do_spec_1 (cc1plus_spec, 0, NULL);
5208 if (value != 0)
5209 return value;
5210 break;
5212 case 'a':
5213 value = do_spec_1 (asm_spec, 0, NULL);
5214 if (value != 0)
5215 return value;
5216 break;
5218 case 'A':
5219 value = do_spec_1 (asm_final_spec, 0, NULL);
5220 if (value != 0)
5221 return value;
5222 break;
5224 case 'C':
5226 const char *const spec
5227 = (input_file_compiler->cpp_spec
5228 ? input_file_compiler->cpp_spec
5229 : cpp_spec);
5230 value = do_spec_1 (spec, 0, NULL);
5231 if (value != 0)
5232 return value;
5234 break;
5236 case 'E':
5237 value = do_spec_1 (endfile_spec, 0, NULL);
5238 if (value != 0)
5239 return value;
5240 break;
5242 case 'l':
5243 value = do_spec_1 (link_spec, 0, NULL);
5244 if (value != 0)
5245 return value;
5246 break;
5248 case 'L':
5249 value = do_spec_1 (lib_spec, 0, NULL);
5250 if (value != 0)
5251 return value;
5252 break;
5254 case 'M':
5255 if (multilib_os_dir == NULL)
5256 obstack_1grow (&obstack, '.');
5257 else
5258 obstack_grow (&obstack, multilib_os_dir,
5259 strlen (multilib_os_dir));
5260 break;
5262 case 'G':
5263 value = do_spec_1 (libgcc_spec, 0, NULL);
5264 if (value != 0)
5265 return value;
5266 break;
5268 case 'R':
5269 /* We assume there is a directory
5270 separator at the end of this string. */
5271 if (target_system_root)
5273 obstack_grow (&obstack, target_system_root,
5274 strlen (target_system_root));
5275 if (target_sysroot_suffix)
5276 obstack_grow (&obstack, target_sysroot_suffix,
5277 strlen (target_sysroot_suffix));
5279 break;
5281 case 'S':
5282 value = do_spec_1 (startfile_spec, 0, NULL);
5283 if (value != 0)
5284 return value;
5285 break;
5287 /* Here we define characters other than letters and digits. */
5289 case '{':
5290 p = handle_braces (p);
5291 if (p == 0)
5292 return -1;
5293 break;
5295 case ':':
5296 p = handle_spec_function (p, NULL);
5297 if (p == 0)
5298 return -1;
5299 break;
5301 case '%':
5302 obstack_1grow (&obstack, '%');
5303 break;
5305 case '.':
5307 unsigned len = 0;
5309 while (p[len] && p[len] != ' ' && p[len] != '%')
5310 len++;
5311 suffix_subst = save_string (p - 1, len + 1);
5312 p += len;
5314 break;
5316 /* Henceforth ignore the option(s) matching the pattern
5317 after the %<. */
5318 case '<':
5319 case '>':
5321 unsigned len = 0;
5322 int have_wildcard = 0;
5323 int i;
5324 int switch_option;
5326 if (c == '>')
5327 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
5328 else
5329 switch_option = SWITCH_IGNORE;
5331 while (p[len] && p[len] != ' ' && p[len] != '\t')
5332 len++;
5334 if (p[len-1] == '*')
5335 have_wildcard = 1;
5337 for (i = 0; i < n_switches; i++)
5338 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5339 && (have_wildcard || switches[i].part1[len] == '\0'))
5341 switches[i].live_cond |= switch_option;
5342 /* User switch be validated from validate_all_switches.
5343 when the definition is seen from the spec file.
5344 If not defined anywhere, will be rejected. */
5345 if (switches[i].known)
5346 switches[i].validated = true;
5349 p += len;
5351 break;
5353 case '*':
5354 if (soft_matched_part)
5356 if (soft_matched_part[0])
5357 do_spec_1 (soft_matched_part, 1, NULL);
5358 /* Only insert a space after the substitution if it is at the
5359 end of the current sequence. So if:
5361 "%{foo=*:bar%*}%{foo=*:one%*two}"
5363 matches -foo=hello then it will produce:
5365 barhello onehellotwo
5367 if (*p == 0 || *p == '}')
5368 do_spec_1 (" ", 0, NULL);
5370 else
5371 /* Catch the case where a spec string contains something like
5372 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5373 hand side of the :. */
5374 error ("spec failure: %<%%*%> has not been initialized by pattern match");
5375 break;
5377 /* Process a string found as the value of a spec given by name.
5378 This feature allows individual machine descriptions
5379 to add and use their own specs. */
5380 case '(':
5382 const char *name = p;
5383 struct spec_list *sl;
5384 int len;
5386 /* The string after the S/P is the name of a spec that is to be
5387 processed. */
5388 while (*p && *p != ')')
5389 p++;
5391 /* See if it's in the list. */
5392 for (len = p - name, sl = specs; sl; sl = sl->next)
5393 if (sl->name_len == len && !strncmp (sl->name, name, len))
5395 name = *(sl->ptr_spec);
5396 #ifdef DEBUG_SPECS
5397 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
5398 sl->name, name);
5399 #endif
5400 break;
5403 if (sl)
5405 value = do_spec_1 (name, 0, NULL);
5406 if (value != 0)
5407 return value;
5410 /* Discard the closing paren. */
5411 if (*p)
5412 p++;
5414 break;
5416 default:
5417 error ("spec failure: unrecognized spec option %qc", c);
5418 break;
5420 break;
5422 case '\\':
5423 /* Backslash: treat next character as ordinary. */
5424 c = *p++;
5426 /* Fall through. */
5427 default:
5428 /* Ordinary character: put it into the current argument. */
5429 obstack_1grow (&obstack, c);
5430 arg_going = 1;
5433 /* End of string. If we are processing a spec function, we need to
5434 end any pending argument. */
5435 if (processing_spec_function)
5436 end_going_arg ();
5438 return 0;
5441 /* Look up a spec function. */
5443 static const struct spec_function *
5444 lookup_spec_function (const char *name)
5446 const struct spec_function *sf;
5448 for (sf = static_spec_functions; sf->name != NULL; sf++)
5449 if (strcmp (sf->name, name) == 0)
5450 return sf;
5452 return NULL;
5455 /* Evaluate a spec function. */
5457 static const char *
5458 eval_spec_function (const char *func, const char *args)
5460 const struct spec_function *sf;
5461 const char *funcval;
5463 /* Saved spec processing context. */
5464 vec<const_char_p> save_argbuf;
5466 int save_arg_going;
5467 int save_delete_this_arg;
5468 int save_this_is_output_file;
5469 int save_this_is_library_file;
5470 int save_input_from_pipe;
5471 int save_this_is_linker_script;
5472 const char *save_suffix_subst;
5474 int save_growing_size;
5475 void *save_growing_value;
5477 sf = lookup_spec_function (func);
5478 if (sf == NULL)
5479 fatal_error ("unknown spec function %qs", func);
5481 /* Push the spec processing context. */
5482 save_argbuf = argbuf;
5484 save_arg_going = arg_going;
5485 save_delete_this_arg = delete_this_arg;
5486 save_this_is_output_file = this_is_output_file;
5487 save_this_is_library_file = this_is_library_file;
5488 save_this_is_linker_script = this_is_linker_script;
5489 save_input_from_pipe = input_from_pipe;
5490 save_suffix_subst = suffix_subst;
5492 /* If we have some object growing now, finalize it so the args and function
5493 eval proceed from a cleared context. This is needed to prevent the first
5494 constructed arg from mistakenly including the growing value. We'll push
5495 this value back on the obstack once the function evaluation is done, to
5496 restore a consistent processing context for our caller. This is fine as
5497 the address of growing objects isn't guaranteed to remain stable until
5498 they are finalized, and we expect this situation to be rare enough for
5499 the extra copy not to be an issue. */
5500 save_growing_size = obstack_object_size (&obstack);
5501 if (save_growing_size > 0)
5502 save_growing_value = obstack_finish (&obstack);
5504 /* Create a new spec processing context, and build the function
5505 arguments. */
5507 alloc_args ();
5508 if (do_spec_2 (args) < 0)
5509 fatal_error ("error in args to spec function %qs", func);
5511 /* argbuf_index is an index for the next argument to be inserted, and
5512 so contains the count of the args already inserted. */
5514 funcval = (*sf->func) (argbuf.length (),
5515 argbuf.address ());
5517 /* Pop the spec processing context. */
5518 argbuf.release ();
5519 argbuf = save_argbuf;
5521 arg_going = save_arg_going;
5522 delete_this_arg = save_delete_this_arg;
5523 this_is_output_file = save_this_is_output_file;
5524 this_is_library_file = save_this_is_library_file;
5525 this_is_linker_script = save_this_is_linker_script;
5526 input_from_pipe = save_input_from_pipe;
5527 suffix_subst = save_suffix_subst;
5529 if (save_growing_size > 0)
5530 obstack_grow (&obstack, save_growing_value, save_growing_size);
5532 return funcval;
5535 /* Handle a spec function call of the form:
5537 %:function(args)
5539 ARGS is processed as a spec in a separate context and split into an
5540 argument vector in the normal fashion. The function returns a string
5541 containing a spec which we then process in the caller's context, or
5542 NULL if no processing is required.
5544 If RETVAL_NONNULL is not NULL, then store a bool whether function
5545 returned non-NULL. */
5547 static const char *
5548 handle_spec_function (const char *p, bool *retval_nonnull)
5550 char *func, *args;
5551 const char *endp, *funcval;
5552 int count;
5554 processing_spec_function++;
5556 /* Get the function name. */
5557 for (endp = p; *endp != '\0'; endp++)
5559 if (*endp == '(') /* ) */
5560 break;
5561 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5562 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5563 fatal_error ("malformed spec function name");
5565 if (*endp != '(') /* ) */
5566 fatal_error ("no arguments for spec function");
5567 func = save_string (p, endp - p);
5568 p = ++endp;
5570 /* Get the arguments. */
5571 for (count = 0; *endp != '\0'; endp++)
5573 /* ( */
5574 if (*endp == ')')
5576 if (count == 0)
5577 break;
5578 count--;
5580 else if (*endp == '(') /* ) */
5581 count++;
5583 /* ( */
5584 if (*endp != ')')
5585 fatal_error ("malformed spec function arguments");
5586 args = save_string (p, endp - p);
5587 p = ++endp;
5589 /* p now points to just past the end of the spec function expression. */
5591 funcval = eval_spec_function (func, args);
5592 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5593 p = NULL;
5594 if (retval_nonnull)
5595 *retval_nonnull = funcval != NULL;
5597 free (func);
5598 free (args);
5600 processing_spec_function--;
5602 return p;
5605 /* Inline subroutine of handle_braces. Returns true if the current
5606 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5607 static inline bool
5608 input_suffix_matches (const char *atom, const char *end_atom)
5610 return (input_suffix
5611 && !strncmp (input_suffix, atom, end_atom - atom)
5612 && input_suffix[end_atom - atom] == '\0');
5615 /* Subroutine of handle_braces. Returns true if the current
5616 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
5617 static bool
5618 input_spec_matches (const char *atom, const char *end_atom)
5620 return (input_file_compiler
5621 && input_file_compiler->suffix
5622 && input_file_compiler->suffix[0] != '\0'
5623 && !strncmp (input_file_compiler->suffix + 1, atom,
5624 end_atom - atom)
5625 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
5628 /* Subroutine of handle_braces. Returns true if a switch
5629 matching the atom bracketed by ATOM and END_ATOM appeared on the
5630 command line. */
5631 static bool
5632 switch_matches (const char *atom, const char *end_atom, int starred)
5634 int i;
5635 int len = end_atom - atom;
5636 int plen = starred ? len : -1;
5638 for (i = 0; i < n_switches; i++)
5639 if (!strncmp (switches[i].part1, atom, len)
5640 && (starred || switches[i].part1[len] == '\0')
5641 && check_live_switch (i, plen))
5642 return true;
5644 /* Check if a switch with separated form matching the atom.
5645 We check -D and -U switches. */
5646 else if (switches[i].args != 0)
5648 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
5649 && *switches[i].part1 == atom[0])
5651 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
5652 && (starred || (switches[i].part1[1] == '\0'
5653 && switches[i].args[0][len - 1] == '\0'))
5654 && check_live_switch (i, (starred ? 1 : -1)))
5655 return true;
5659 return false;
5662 /* Inline subroutine of handle_braces. Mark all of the switches which
5663 match ATOM (extends to END_ATOM; STARRED indicates whether there
5664 was a star after the atom) for later processing. */
5665 static inline void
5666 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5668 int i;
5669 int len = end_atom - atom;
5670 int plen = starred ? len : -1;
5672 for (i = 0; i < n_switches; i++)
5673 if (!strncmp (switches[i].part1, atom, len)
5674 && (starred || switches[i].part1[len] == '\0')
5675 && check_live_switch (i, plen))
5676 switches[i].ordering = 1;
5679 /* Inline subroutine of handle_braces. Process all the currently
5680 marked switches through give_switch, and clear the marks. */
5681 static inline void
5682 process_marked_switches (void)
5684 int i;
5686 for (i = 0; i < n_switches; i++)
5687 if (switches[i].ordering == 1)
5689 switches[i].ordering = 0;
5690 give_switch (i, 0);
5694 /* Handle a %{ ... } construct. P points just inside the leading {.
5695 Returns a pointer one past the end of the brace block, or 0
5696 if we call do_spec_1 and that returns -1. */
5698 static const char *
5699 handle_braces (const char *p)
5701 const char *atom, *end_atom;
5702 const char *d_atom = NULL, *d_end_atom = NULL;
5703 const char *orig = p;
5705 bool a_is_suffix;
5706 bool a_is_spectype;
5707 bool a_is_starred;
5708 bool a_is_negated;
5709 bool a_matched;
5711 bool a_must_be_last = false;
5712 bool ordered_set = false;
5713 bool disjunct_set = false;
5714 bool disj_matched = false;
5715 bool disj_starred = true;
5716 bool n_way_choice = false;
5717 bool n_way_matched = false;
5719 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
5723 if (a_must_be_last)
5724 goto invalid;
5726 /* Scan one "atom" (S in the description above of %{}, possibly
5727 with '!', '.', '@', ',', or '*' modifiers). */
5728 a_matched = false;
5729 a_is_suffix = false;
5730 a_is_starred = false;
5731 a_is_negated = false;
5732 a_is_spectype = false;
5734 SKIP_WHITE ();
5735 if (*p == '!')
5736 p++, a_is_negated = true;
5738 SKIP_WHITE ();
5739 if (*p == '%' && p[1] == ':')
5741 atom = NULL;
5742 end_atom = NULL;
5743 p = handle_spec_function (p + 2, &a_matched);
5745 else
5747 if (*p == '.')
5748 p++, a_is_suffix = true;
5749 else if (*p == ',')
5750 p++, a_is_spectype = true;
5752 atom = p;
5753 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
5754 || *p == ',' || *p == '.' || *p == '@')
5755 p++;
5756 end_atom = p;
5758 if (*p == '*')
5759 p++, a_is_starred = 1;
5762 SKIP_WHITE ();
5763 switch (*p)
5765 case '&': case '}':
5766 /* Substitute the switch(es) indicated by the current atom. */
5767 ordered_set = true;
5768 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
5769 || a_is_spectype || atom == end_atom)
5770 goto invalid;
5772 mark_matching_switches (atom, end_atom, a_is_starred);
5774 if (*p == '}')
5775 process_marked_switches ();
5776 break;
5778 case '|': case ':':
5779 /* Substitute some text if the current atom appears as a switch
5780 or suffix. */
5781 disjunct_set = true;
5782 if (ordered_set)
5783 goto invalid;
5785 if (atom && atom == end_atom)
5787 if (!n_way_choice || disj_matched || *p == '|'
5788 || a_is_negated || a_is_suffix || a_is_spectype
5789 || a_is_starred)
5790 goto invalid;
5792 /* An empty term may appear as the last choice of an
5793 N-way choice set; it means "otherwise". */
5794 a_must_be_last = true;
5795 disj_matched = !n_way_matched;
5796 disj_starred = false;
5798 else
5800 if ((a_is_suffix || a_is_spectype) && a_is_starred)
5801 goto invalid;
5803 if (!a_is_starred)
5804 disj_starred = false;
5806 /* Don't bother testing this atom if we already have a
5807 match. */
5808 if (!disj_matched && !n_way_matched)
5810 if (atom == NULL)
5811 /* a_matched is already set by handle_spec_function. */;
5812 else if (a_is_suffix)
5813 a_matched = input_suffix_matches (atom, end_atom);
5814 else if (a_is_spectype)
5815 a_matched = input_spec_matches (atom, end_atom);
5816 else
5817 a_matched = switch_matches (atom, end_atom, a_is_starred);
5819 if (a_matched != a_is_negated)
5821 disj_matched = true;
5822 d_atom = atom;
5823 d_end_atom = end_atom;
5828 if (*p == ':')
5830 /* Found the body, that is, the text to substitute if the
5831 current disjunction matches. */
5832 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
5833 disj_matched && !n_way_matched);
5834 if (p == 0)
5835 return 0;
5837 /* If we have an N-way choice, reset state for the next
5838 disjunction. */
5839 if (*p == ';')
5841 n_way_choice = true;
5842 n_way_matched |= disj_matched;
5843 disj_matched = false;
5844 disj_starred = true;
5845 d_atom = d_end_atom = NULL;
5848 break;
5850 default:
5851 goto invalid;
5854 while (*p++ != '}');
5856 return p;
5858 invalid:
5859 fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
5861 #undef SKIP_WHITE
5864 /* Subroutine of handle_braces. Scan and process a brace substitution body
5865 (X in the description of %{} syntax). P points one past the colon;
5866 ATOM and END_ATOM bracket the first atom which was found to be true
5867 (present) in the current disjunction; STARRED indicates whether all
5868 the atoms in the current disjunction were starred (for syntax validation);
5869 MATCHED indicates whether the disjunction matched or not, and therefore
5870 whether or not the body is to be processed through do_spec_1 or just
5871 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
5872 returns -1. */
5874 static const char *
5875 process_brace_body (const char *p, const char *atom, const char *end_atom,
5876 int starred, int matched)
5878 const char *body, *end_body;
5879 unsigned int nesting_level;
5880 bool have_subst = false;
5882 /* Locate the closing } or ;, honoring nested braces.
5883 Trim trailing whitespace. */
5884 body = p;
5885 nesting_level = 1;
5886 for (;;)
5888 if (*p == '{')
5889 nesting_level++;
5890 else if (*p == '}')
5892 if (!--nesting_level)
5893 break;
5895 else if (*p == ';' && nesting_level == 1)
5896 break;
5897 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
5898 have_subst = true;
5899 else if (*p == '\0')
5900 goto invalid;
5901 p++;
5904 end_body = p;
5905 while (end_body[-1] == ' ' || end_body[-1] == '\t')
5906 end_body--;
5908 if (have_subst && !starred)
5909 goto invalid;
5911 if (matched)
5913 /* Copy the substitution body to permanent storage and execute it.
5914 If have_subst is false, this is a simple matter of running the
5915 body through do_spec_1... */
5916 char *string = save_string (body, end_body - body);
5917 if (!have_subst)
5919 if (do_spec_1 (string, 0, NULL) < 0)
5920 return 0;
5922 else
5924 /* ... but if have_subst is true, we have to process the
5925 body once for each matching switch, with %* set to the
5926 variant part of the switch. */
5927 unsigned int hard_match_len = end_atom - atom;
5928 int i;
5930 for (i = 0; i < n_switches; i++)
5931 if (!strncmp (switches[i].part1, atom, hard_match_len)
5932 && check_live_switch (i, hard_match_len))
5934 if (do_spec_1 (string, 0,
5935 &switches[i].part1[hard_match_len]) < 0)
5936 return 0;
5937 /* Pass any arguments this switch has. */
5938 give_switch (i, 1);
5939 suffix_subst = NULL;
5944 return p;
5946 invalid:
5947 fatal_error ("braced spec body %qs is invalid", body);
5950 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5951 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
5952 spec, or -1 if either exact match or %* is used.
5954 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
5955 whose value does not begin with "no-" is obsoleted by the same value
5956 with the "no-", similarly for a switch with the "no-" prefix. */
5958 static int
5959 check_live_switch (int switchnum, int prefix_length)
5961 const char *name = switches[switchnum].part1;
5962 int i;
5964 /* If we already processed this switch and determined if it was
5965 live or not, return our past determination. */
5966 if (switches[switchnum].live_cond != 0)
5967 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
5968 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
5969 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
5970 == 0);
5972 /* In the common case of {<at-most-one-letter>*}, a negating
5973 switch would always match, so ignore that case. We will just
5974 send the conflicting switches to the compiler phase. */
5975 if (prefix_length >= 0 && prefix_length <= 1)
5976 return 1;
5978 /* Now search for duplicate in a manner that depends on the name. */
5979 switch (*name)
5981 case 'O':
5982 for (i = switchnum + 1; i < n_switches; i++)
5983 if (switches[i].part1[0] == 'O')
5985 switches[switchnum].validated = true;
5986 switches[switchnum].live_cond = SWITCH_FALSE;
5987 return 0;
5989 break;
5991 case 'W': case 'f': case 'm': case 'g':
5992 if (! strncmp (name + 1, "no-", 3))
5994 /* We have Xno-YYY, search for XYYY. */
5995 for (i = switchnum + 1; i < n_switches; i++)
5996 if (switches[i].part1[0] == name[0]
5997 && ! strcmp (&switches[i].part1[1], &name[4]))
5999 /* --specs are validated with the validate_switches mechanism. */
6000 if (switches[switchnum].known)
6001 switches[switchnum].validated = true;
6002 switches[switchnum].live_cond = SWITCH_FALSE;
6003 return 0;
6006 else
6008 /* We have XYYY, search for Xno-YYY. */
6009 for (i = switchnum + 1; i < n_switches; i++)
6010 if (switches[i].part1[0] == name[0]
6011 && switches[i].part1[1] == 'n'
6012 && switches[i].part1[2] == 'o'
6013 && switches[i].part1[3] == '-'
6014 && !strcmp (&switches[i].part1[4], &name[1]))
6016 /* --specs are validated with the validate_switches mechanism. */
6017 if (switches[switchnum].known)
6018 switches[switchnum].validated = true;
6019 switches[switchnum].live_cond = SWITCH_FALSE;
6020 return 0;
6023 break;
6026 /* Otherwise the switch is live. */
6027 switches[switchnum].live_cond |= SWITCH_LIVE;
6028 return 1;
6031 /* Pass a switch to the current accumulating command
6032 in the same form that we received it.
6033 SWITCHNUM identifies the switch; it is an index into
6034 the vector of switches gcc received, which is `switches'.
6035 This cannot fail since it never finishes a command line.
6037 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6039 static void
6040 give_switch (int switchnum, int omit_first_word)
6042 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6043 return;
6045 if (!omit_first_word)
6047 do_spec_1 ("-", 0, NULL);
6048 do_spec_1 (switches[switchnum].part1, 1, NULL);
6051 if (switches[switchnum].args != 0)
6053 const char **p;
6054 for (p = switches[switchnum].args; *p; p++)
6056 const char *arg = *p;
6058 do_spec_1 (" ", 0, NULL);
6059 if (suffix_subst)
6061 unsigned length = strlen (arg);
6062 int dot = 0;
6064 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6065 if (arg[length] == '.')
6067 (CONST_CAST (char *, arg))[length] = 0;
6068 dot = 1;
6069 break;
6071 do_spec_1 (arg, 1, NULL);
6072 if (dot)
6073 (CONST_CAST (char *, arg))[length] = '.';
6074 do_spec_1 (suffix_subst, 1, NULL);
6076 else
6077 do_spec_1 (arg, 1, NULL);
6081 do_spec_1 (" ", 0, NULL);
6082 switches[switchnum].validated = true;
6085 /* Search for a file named NAME trying various prefixes including the
6086 user's -B prefix and some standard ones.
6087 Return the absolute file name found. If nothing is found, return NAME. */
6089 static const char *
6090 find_file (const char *name)
6092 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6093 return newname ? newname : name;
6096 /* Determine whether a directory exists. If LINKER, return 0 for
6097 certain fixed names not needed by the linker. */
6099 static int
6100 is_directory (const char *path1, bool linker)
6102 int len1;
6103 char *path;
6104 char *cp;
6105 struct stat st;
6107 /* Ensure the string ends with "/.". The resulting path will be a
6108 directory even if the given path is a symbolic link. */
6109 len1 = strlen (path1);
6110 path = (char *) alloca (3 + len1);
6111 memcpy (path, path1, len1);
6112 cp = path + len1;
6113 if (!IS_DIR_SEPARATOR (cp[-1]))
6114 *cp++ = DIR_SEPARATOR;
6115 *cp++ = '.';
6116 *cp = '\0';
6118 /* Exclude directories that the linker is known to search. */
6119 if (linker
6120 && IS_DIR_SEPARATOR (path[0])
6121 && ((cp - path == 6
6122 && filename_ncmp (path + 1, "lib", 3) == 0)
6123 || (cp - path == 10
6124 && filename_ncmp (path + 1, "usr", 3) == 0
6125 && IS_DIR_SEPARATOR (path[4])
6126 && filename_ncmp (path + 5, "lib", 3) == 0)))
6127 return 0;
6129 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6132 /* Set up the various global variables to indicate that we're processing
6133 the input file named FILENAME. */
6135 void
6136 set_input (const char *filename)
6138 const char *p;
6140 gcc_input_filename = filename;
6141 input_filename_length = strlen (gcc_input_filename);
6142 input_basename = lbasename (gcc_input_filename);
6144 /* Find a suffix starting with the last period,
6145 and set basename_length to exclude that suffix. */
6146 basename_length = strlen (input_basename);
6147 suffixed_basename_length = basename_length;
6148 p = input_basename + basename_length;
6149 while (p != input_basename && *p != '.')
6150 --p;
6151 if (*p == '.' && p != input_basename)
6153 basename_length = p - input_basename;
6154 input_suffix = p + 1;
6156 else
6157 input_suffix = "";
6159 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6160 we will need to do a stat on the gcc_input_filename. The
6161 INPUT_STAT_SET signals that the stat is needed. */
6162 input_stat_set = 0;
6165 /* On fatal signals, delete all the temporary files. */
6167 static void
6168 fatal_signal (int signum)
6170 signal (signum, SIG_DFL);
6171 delete_failure_queue ();
6172 delete_temp_files ();
6173 /* Get the same signal again, this time not handled,
6174 so its normal effect occurs. */
6175 kill (getpid (), signum);
6178 /* Compare the contents of the two files named CMPFILE[0] and
6179 CMPFILE[1]. Return zero if they're identical, nonzero
6180 otherwise. */
6182 static int
6183 compare_files (char *cmpfile[])
6185 int ret = 0;
6186 FILE *temp[2] = { NULL, NULL };
6187 int i;
6189 #if HAVE_MMAP_FILE
6191 size_t length[2];
6192 void *map[2] = { NULL, NULL };
6194 for (i = 0; i < 2; i++)
6196 struct stat st;
6198 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6200 error ("%s: could not determine length of compare-debug file %s",
6201 gcc_input_filename, cmpfile[i]);
6202 ret = 1;
6203 break;
6206 length[i] = st.st_size;
6209 if (!ret && length[0] != length[1])
6211 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
6212 ret = 1;
6215 if (!ret)
6216 for (i = 0; i < 2; i++)
6218 int fd = open (cmpfile[i], O_RDONLY);
6219 if (fd < 0)
6221 error ("%s: could not open compare-debug file %s",
6222 gcc_input_filename, cmpfile[i]);
6223 ret = 1;
6224 break;
6227 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6228 close (fd);
6230 if (map[i] == (void *) MAP_FAILED)
6232 ret = -1;
6233 break;
6237 if (!ret)
6239 if (memcmp (map[0], map[1], length[0]) != 0)
6241 error ("%s: -fcompare-debug failure", gcc_input_filename);
6242 ret = 1;
6246 for (i = 0; i < 2; i++)
6247 if (map[i])
6248 munmap ((caddr_t) map[i], length[i]);
6250 if (ret >= 0)
6251 return ret;
6253 ret = 0;
6255 #endif
6257 for (i = 0; i < 2; i++)
6259 temp[i] = fopen (cmpfile[i], "r");
6260 if (!temp[i])
6262 error ("%s: could not open compare-debug file %s",
6263 gcc_input_filename, cmpfile[i]);
6264 ret = 1;
6265 break;
6269 if (!ret && temp[0] && temp[1])
6270 for (;;)
6272 int c0, c1;
6273 c0 = fgetc (temp[0]);
6274 c1 = fgetc (temp[1]);
6276 if (c0 != c1)
6278 error ("%s: -fcompare-debug failure",
6279 gcc_input_filename);
6280 ret = 1;
6281 break;
6284 if (c0 == EOF)
6285 break;
6288 for (i = 1; i >= 0; i--)
6290 if (temp[i])
6291 fclose (temp[i]);
6294 return ret;
6297 extern int main (int, char **);
6300 main (int argc, char **argv)
6302 size_t i;
6303 int value;
6304 int linker_was_run = 0;
6305 int lang_n_infiles = 0;
6306 int num_linker_inputs = 0;
6307 char *explicit_link_files;
6308 char *specs_file;
6309 char *lto_wrapper_file;
6310 const char *p;
6311 struct user_specs *uptr;
6312 char **old_argv = argv;
6313 struct cl_decoded_option *decoded_options;
6314 unsigned int decoded_options_count;
6316 p = argv[0] + strlen (argv[0]);
6317 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6318 --p;
6319 progname = p;
6321 xmalloc_set_program_name (progname);
6323 expandargv (&argc, &argv);
6325 /* Determine if any expansions were made. */
6326 if (argv != old_argv)
6327 at_file_supplied = true;
6329 /* Register the language-independent parameters. */
6330 global_init_params ();
6331 finish_params ();
6333 init_options_struct (&global_options, &global_options_set);
6335 decode_cmdline_options_to_array (argc, CONST_CAST2 (const char **, char **,
6336 argv),
6337 CL_DRIVER,
6338 &decoded_options, &decoded_options_count);
6340 /* Unlock the stdio streams. */
6341 unlock_std_streams ();
6343 gcc_init_libintl ();
6345 diagnostic_initialize (global_dc, 0);
6347 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6348 /* Perform host dependent initialization when needed. */
6349 GCC_DRIVER_HOST_INITIALIZATION;
6350 #endif
6352 if (atexit (delete_temp_files) != 0)
6353 fatal_error ("atexit failed");
6355 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6356 signal (SIGINT, fatal_signal);
6357 #ifdef SIGHUP
6358 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6359 signal (SIGHUP, fatal_signal);
6360 #endif
6361 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6362 signal (SIGTERM, fatal_signal);
6363 #ifdef SIGPIPE
6364 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6365 signal (SIGPIPE, fatal_signal);
6366 #endif
6367 #ifdef SIGCHLD
6368 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6369 receive the signal. A different setting is inheritable */
6370 signal (SIGCHLD, SIG_DFL);
6371 #endif
6373 /* Parsing and gimplification sometimes need quite large stack.
6374 Increase stack size limits if possible. */
6375 stack_limit_increase (64 * 1024 * 1024);
6377 /* Allocate the argument vector. */
6378 alloc_args ();
6380 obstack_init (&obstack);
6382 /* Build multilib_select, et. al from the separate lines that make up each
6383 multilib selection. */
6385 const char *const *q = multilib_raw;
6386 int need_space;
6388 obstack_init (&multilib_obstack);
6389 while ((p = *q++) != (char *) 0)
6390 obstack_grow (&multilib_obstack, p, strlen (p));
6392 obstack_1grow (&multilib_obstack, 0);
6393 multilib_select = XOBFINISH (&multilib_obstack, const char *);
6395 q = multilib_matches_raw;
6396 while ((p = *q++) != (char *) 0)
6397 obstack_grow (&multilib_obstack, p, strlen (p));
6399 obstack_1grow (&multilib_obstack, 0);
6400 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6402 q = multilib_exclusions_raw;
6403 while ((p = *q++) != (char *) 0)
6404 obstack_grow (&multilib_obstack, p, strlen (p));
6406 obstack_1grow (&multilib_obstack, 0);
6407 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6409 q = multilib_reuse_raw;
6410 while ((p = *q++) != (char *) 0)
6411 obstack_grow (&multilib_obstack, p, strlen (p));
6413 obstack_1grow (&multilib_obstack, 0);
6414 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
6416 need_space = FALSE;
6417 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6419 if (need_space)
6420 obstack_1grow (&multilib_obstack, ' ');
6421 obstack_grow (&multilib_obstack,
6422 multilib_defaults_raw[i],
6423 strlen (multilib_defaults_raw[i]));
6424 need_space = TRUE;
6427 obstack_1grow (&multilib_obstack, 0);
6428 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6431 #ifdef INIT_ENVIRONMENT
6432 /* Set up any other necessary machine specific environment variables. */
6433 xputenv (INIT_ENVIRONMENT);
6434 #endif
6436 /* Make a table of what switches there are (switches, n_switches).
6437 Make a table of specified input files (infiles, n_infiles).
6438 Decode switches that are handled locally. */
6440 process_command (decoded_options_count, decoded_options);
6442 /* Initialize the vector of specs to just the default.
6443 This means one element containing 0s, as a terminator. */
6445 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
6446 memcpy (compilers, default_compilers, sizeof default_compilers);
6447 n_compilers = n_default_compilers;
6449 /* Read specs from a file if there is one. */
6451 machine_suffix = concat (spec_machine, dir_separator_str,
6452 spec_version, dir_separator_str, NULL);
6453 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6455 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
6456 /* Read the specs file unless it is a default one. */
6457 if (specs_file != 0 && strcmp (specs_file, "specs"))
6458 read_specs (specs_file, true, false);
6459 else
6460 init_spec ();
6462 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6463 for any override of as, ld and libraries. */
6464 specs_file = (char *) alloca (strlen (standard_exec_prefix)
6465 + strlen (just_machine_suffix) + sizeof ("specs"));
6467 strcpy (specs_file, standard_exec_prefix);
6468 strcat (specs_file, just_machine_suffix);
6469 strcat (specs_file, "specs");
6470 if (access (specs_file, R_OK) == 0)
6471 read_specs (specs_file, true, false);
6473 /* Process any configure-time defaults specified for the command line
6474 options, via OPTION_DEFAULT_SPECS. */
6475 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6476 do_option_spec (option_default_specs[i].name,
6477 option_default_specs[i].spec);
6479 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6480 of the command line. */
6482 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6483 do_self_spec (driver_self_specs[i]);
6485 /* If not cross-compiling, look for executables in the standard
6486 places. */
6487 if (*cross_compile == '0')
6489 if (*md_exec_prefix)
6491 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6492 PREFIX_PRIORITY_LAST, 0, 0);
6496 /* Process sysroot_suffix_spec. */
6497 if (*sysroot_suffix_spec != 0
6498 && !no_sysroot_suffix
6499 && do_spec_2 (sysroot_suffix_spec) == 0)
6501 if (argbuf.length () > 1)
6502 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6503 else if (argbuf.length () == 1)
6504 target_sysroot_suffix = xstrdup (argbuf.last ());
6507 #ifdef HAVE_LD_SYSROOT
6508 /* Pass the --sysroot option to the linker, if it supports that. If
6509 there is a sysroot_suffix_spec, it has already been processed by
6510 this point, so target_system_root really is the system root we
6511 should be using. */
6512 if (target_system_root)
6514 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6515 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6516 set_spec ("link", XOBFINISH (&obstack, const char *), false);
6518 #endif
6520 /* Process sysroot_hdrs_suffix_spec. */
6521 if (*sysroot_hdrs_suffix_spec != 0
6522 && !no_sysroot_suffix
6523 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6525 if (argbuf.length () > 1)
6526 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6527 else if (argbuf.length () == 1)
6528 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
6531 /* Look for startfiles in the standard places. */
6532 if (*startfile_prefix_spec != 0
6533 && do_spec_2 (startfile_prefix_spec) == 0
6534 && do_spec_1 (" ", 0, NULL) == 0)
6536 const char *arg;
6537 int ndx;
6538 FOR_EACH_VEC_ELT (argbuf, ndx, arg)
6539 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
6540 PREFIX_PRIORITY_LAST, 0, 1);
6542 /* We should eventually get rid of all these and stick to
6543 startfile_prefix_spec exclusively. */
6544 else if (*cross_compile == '0' || target_system_root)
6546 if (*md_startfile_prefix)
6547 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6548 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6550 if (*md_startfile_prefix_1)
6551 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6552 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6554 /* If standard_startfile_prefix is relative, base it on
6555 standard_exec_prefix. This lets us move the installed tree
6556 as a unit. If GCC_EXEC_PREFIX is defined, base
6557 standard_startfile_prefix on that as well.
6559 If the prefix is relative, only search it for native compilers;
6560 otherwise we will search a directory containing host libraries. */
6561 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6562 add_sysrooted_prefix (&startfile_prefixes,
6563 standard_startfile_prefix, "BINUTILS",
6564 PREFIX_PRIORITY_LAST, 0, 1);
6565 else if (*cross_compile == '0')
6567 add_prefix (&startfile_prefixes,
6568 concat (gcc_exec_prefix
6569 ? gcc_exec_prefix : standard_exec_prefix,
6570 machine_suffix,
6571 standard_startfile_prefix, NULL),
6572 NULL, PREFIX_PRIORITY_LAST, 0, 1);
6575 /* Sysrooted prefixes are relocated because target_system_root is
6576 also relocated by gcc_exec_prefix. */
6577 if (*standard_startfile_prefix_1)
6578 add_sysrooted_prefix (&startfile_prefixes,
6579 standard_startfile_prefix_1, "BINUTILS",
6580 PREFIX_PRIORITY_LAST, 0, 1);
6581 if (*standard_startfile_prefix_2)
6582 add_sysrooted_prefix (&startfile_prefixes,
6583 standard_startfile_prefix_2, "BINUTILS",
6584 PREFIX_PRIORITY_LAST, 0, 1);
6587 /* Process any user specified specs in the order given on the command
6588 line. */
6589 for (uptr = user_specs_head; uptr; uptr = uptr->next)
6591 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6592 R_OK, true);
6593 read_specs (filename ? filename : uptr->filename, false, true);
6596 /* Process any user self specs. */
6598 struct spec_list *sl;
6599 for (sl = specs; sl; sl = sl->next)
6600 if (sl->name_len == sizeof "self_spec" - 1
6601 && !strcmp (sl->name, "self_spec"))
6602 do_self_spec (*sl->ptr_spec);
6605 if (compare_debug)
6607 enum save_temps save;
6609 if (!compare_debug_second)
6611 n_switches_debug_check[1] = n_switches;
6612 n_switches_alloc_debug_check[1] = n_switches_alloc;
6613 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
6614 n_switches_alloc);
6616 do_self_spec ("%:compare-debug-self-opt()");
6617 n_switches_debug_check[0] = n_switches;
6618 n_switches_alloc_debug_check[0] = n_switches_alloc;
6619 switches_debug_check[0] = switches;
6621 n_switches = n_switches_debug_check[1];
6622 n_switches_alloc = n_switches_alloc_debug_check[1];
6623 switches = switches_debug_check[1];
6626 /* Avoid crash when computing %j in this early. */
6627 save = save_temps_flag;
6628 save_temps_flag = SAVE_TEMPS_NONE;
6630 compare_debug = -compare_debug;
6631 do_self_spec ("%:compare-debug-self-opt()");
6633 save_temps_flag = save;
6635 if (!compare_debug_second)
6637 n_switches_debug_check[1] = n_switches;
6638 n_switches_alloc_debug_check[1] = n_switches_alloc;
6639 switches_debug_check[1] = switches;
6640 compare_debug = -compare_debug;
6641 n_switches = n_switches_debug_check[0];
6642 n_switches_alloc = n_switches_debug_check[0];
6643 switches = switches_debug_check[0];
6648 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
6649 if (gcc_exec_prefix)
6650 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6651 spec_version, dir_separator_str, NULL);
6653 /* Now we have the specs.
6654 Set the `valid' bits for switches that match anything in any spec. */
6656 validate_all_switches ();
6658 /* Now that we have the switches and the specs, set
6659 the subdirectory based on the options. */
6660 set_multilib_dir ();
6662 /* Set up to remember the pathname of gcc and any options
6663 needed for collect. We use argv[0] instead of progname because
6664 we need the complete pathname. */
6665 obstack_init (&collect_obstack);
6666 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6667 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6668 xputenv (XOBFINISH (&collect_obstack, char *));
6670 /* Set up to remember the pathname of the lto wrapper. */
6672 if (have_c)
6673 lto_wrapper_file = NULL;
6674 else
6675 lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
6676 X_OK, false);
6677 if (lto_wrapper_file)
6679 lto_wrapper_file = convert_white_space (lto_wrapper_file);
6680 lto_wrapper_spec = lto_wrapper_file;
6681 obstack_init (&collect_obstack);
6682 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
6683 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
6684 obstack_grow (&collect_obstack, lto_wrapper_spec,
6685 strlen (lto_wrapper_spec) + 1);
6686 xputenv (XOBFINISH (&collect_obstack, char *));
6689 /* Reject switches that no pass was interested in. */
6691 for (i = 0; (int) i < n_switches; i++)
6692 if (! switches[i].validated)
6693 error ("unrecognized command line option %<-%s%>", switches[i].part1);
6695 /* Obey some of the options. */
6697 if (print_search_dirs)
6699 printf (_("install: %s%s\n"),
6700 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
6701 gcc_exec_prefix ? "" : machine_suffix);
6702 printf (_("programs: %s\n"),
6703 build_search_list (&exec_prefixes, "", false, false));
6704 printf (_("libraries: %s\n"),
6705 build_search_list (&startfile_prefixes, "", false, true));
6706 return (0);
6709 if (print_file_name)
6711 printf ("%s\n", find_file (print_file_name));
6712 return (0);
6715 if (print_prog_name)
6717 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6718 printf ("%s\n", (newname ? newname : print_prog_name));
6719 return (0);
6722 if (print_multi_lib)
6724 print_multilib_info ();
6725 return (0);
6728 if (print_multi_directory)
6730 if (multilib_dir == NULL)
6731 printf (".\n");
6732 else
6733 printf ("%s\n", multilib_dir);
6734 return (0);
6737 if (print_multiarch)
6739 if (multiarch_dir == NULL)
6740 printf ("\n");
6741 else
6742 printf ("%s\n", multiarch_dir);
6743 return (0);
6746 if (print_sysroot)
6748 if (target_system_root)
6750 if (target_sysroot_suffix)
6751 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
6752 else
6753 printf ("%s\n", target_system_root);
6755 return (0);
6758 if (print_multi_os_directory)
6760 if (multilib_os_dir == NULL)
6761 printf (".\n");
6762 else
6763 printf ("%s\n", multilib_os_dir);
6764 return (0);
6767 if (print_sysroot_headers_suffix)
6769 if (*sysroot_hdrs_suffix_spec)
6771 printf("%s\n", (target_sysroot_hdrs_suffix
6772 ? target_sysroot_hdrs_suffix
6773 : ""));
6774 return (0);
6776 else
6777 /* The error status indicates that only one set of fixed
6778 headers should be built. */
6779 fatal_error ("not configured with sysroot headers suffix");
6782 if (print_help_list)
6784 display_help ();
6786 if (! verbose_flag)
6788 printf (_("\nFor bug reporting instructions, please see:\n"));
6789 printf ("%s.\n", bug_report_url);
6791 return (0);
6794 /* We do not exit here. Instead we have created a fake input file
6795 called 'help-dummy' which needs to be compiled, and we pass this
6796 on the various sub-processes, along with the --help switch.
6797 Ensure their output appears after ours. */
6798 fputc ('\n', stdout);
6799 fflush (stdout);
6802 if (print_version)
6804 printf (_("%s %s%s\n"), progname, pkgversion_string,
6805 version_string);
6806 printf ("Copyright %s 2013 Free Software Foundation, Inc.\n",
6807 _("(C)"));
6808 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
6809 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
6810 stdout);
6811 if (! verbose_flag)
6812 return 0;
6814 /* We do not exit here. We use the same mechanism of --help to print
6815 the version of the sub-processes. */
6816 fputc ('\n', stdout);
6817 fflush (stdout);
6820 if (verbose_flag)
6822 int n;
6823 const char *thrmod;
6825 fnotice (stderr, "Target: %s\n", spec_machine);
6826 fnotice (stderr, "Configured with: %s\n", configuration_arguments);
6828 #ifdef THREAD_MODEL_SPEC
6829 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6830 but there's no point in doing all this processing just to get
6831 thread_model back. */
6832 obstack_init (&obstack);
6833 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6834 obstack_1grow (&obstack, '\0');
6835 thrmod = XOBFINISH (&obstack, const char *);
6836 #else
6837 thrmod = thread_model;
6838 #endif
6840 fnotice (stderr, "Thread model: %s\n", thrmod);
6842 /* compiler_version is truncated at the first space when initialized
6843 from version string, so truncate version_string at the first space
6844 before comparing. */
6845 for (n = 0; version_string[n]; n++)
6846 if (version_string[n] == ' ')
6847 break;
6849 if (! strncmp (version_string, compiler_version, n)
6850 && compiler_version[n] == 0)
6851 fnotice (stderr, "gcc version %s %s\n", version_string,
6852 pkgversion_string);
6853 else
6854 fnotice (stderr, "gcc driver version %s %sexecuting gcc version %s\n",
6855 version_string, pkgversion_string, compiler_version);
6857 if (n_infiles == 0)
6858 return (0);
6861 if (n_infiles == added_libraries)
6862 fatal_error ("no input files");
6864 if (seen_error ())
6865 goto out;
6867 /* Make a place to record the compiler output file names
6868 that correspond to the input files. */
6870 i = n_infiles;
6871 i += lang_specific_extra_outfiles;
6872 outfiles = XCNEWVEC (const char *, i);
6874 /* Record which files were specified explicitly as link input. */
6876 explicit_link_files = XCNEWVEC (char, n_infiles);
6878 combine_inputs = have_o || flag_wpa;
6880 for (i = 0; (int) i < n_infiles; i++)
6882 const char *name = infiles[i].name;
6883 struct compiler *compiler = lookup_compiler (name,
6884 strlen (name),
6885 infiles[i].language);
6887 if (compiler && !(compiler->combinable))
6888 combine_inputs = false;
6890 if (lang_n_infiles > 0 && compiler != input_file_compiler
6891 && infiles[i].language && infiles[i].language[0] != '*')
6892 infiles[i].incompiler = compiler;
6893 else if (compiler)
6895 lang_n_infiles++;
6896 input_file_compiler = compiler;
6897 infiles[i].incompiler = compiler;
6899 else
6901 /* Since there is no compiler for this input file, assume it is a
6902 linker file. */
6903 explicit_link_files[i] = 1;
6904 infiles[i].incompiler = NULL;
6906 infiles[i].compiled = false;
6907 infiles[i].preprocessed = false;
6910 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
6911 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
6913 for (i = 0; (int) i < n_infiles; i++)
6915 int this_file_error = 0;
6917 /* Tell do_spec what to substitute for %i. */
6919 input_file_number = i;
6920 set_input (infiles[i].name);
6922 if (infiles[i].compiled)
6923 continue;
6925 /* Use the same thing in %o, unless cp->spec says otherwise. */
6927 outfiles[i] = gcc_input_filename;
6929 /* Figure out which compiler from the file's suffix. */
6931 input_file_compiler
6932 = lookup_compiler (infiles[i].name, input_filename_length,
6933 infiles[i].language);
6935 if (input_file_compiler)
6937 /* Ok, we found an applicable compiler. Run its spec. */
6939 if (input_file_compiler->spec[0] == '#')
6941 error ("%s: %s compiler not installed on this system",
6942 gcc_input_filename, &input_file_compiler->spec[1]);
6943 this_file_error = 1;
6945 else
6947 if (compare_debug)
6949 free (debug_check_temp_file[0]);
6950 debug_check_temp_file[0] = NULL;
6952 free (debug_check_temp_file[1]);
6953 debug_check_temp_file[1] = NULL;
6956 value = do_spec (input_file_compiler->spec);
6957 infiles[i].compiled = true;
6958 if (value < 0)
6959 this_file_error = 1;
6960 else if (compare_debug && debug_check_temp_file[0])
6962 if (verbose_flag)
6963 inform (0, "recompiling with -fcompare-debug");
6965 compare_debug = -compare_debug;
6966 n_switches = n_switches_debug_check[1];
6967 n_switches_alloc = n_switches_alloc_debug_check[1];
6968 switches = switches_debug_check[1];
6970 value = do_spec (input_file_compiler->spec);
6972 compare_debug = -compare_debug;
6973 n_switches = n_switches_debug_check[0];
6974 n_switches_alloc = n_switches_alloc_debug_check[0];
6975 switches = switches_debug_check[0];
6977 if (value < 0)
6979 error ("during -fcompare-debug recompilation");
6980 this_file_error = 1;
6983 gcc_assert (debug_check_temp_file[1]
6984 && filename_cmp (debug_check_temp_file[0],
6985 debug_check_temp_file[1]));
6987 if (verbose_flag)
6988 inform (0, "comparing final insns dumps");
6990 if (compare_files (debug_check_temp_file))
6991 this_file_error = 1;
6994 if (compare_debug)
6996 free (debug_check_temp_file[0]);
6997 debug_check_temp_file[0] = NULL;
6999 free (debug_check_temp_file[1]);
7000 debug_check_temp_file[1] = NULL;
7005 /* If this file's name does not contain a recognized suffix,
7006 record it as explicit linker input. */
7008 else
7009 explicit_link_files[i] = 1;
7011 /* Clear the delete-on-failure queue, deleting the files in it
7012 if this compilation failed. */
7014 if (this_file_error)
7016 delete_failure_queue ();
7017 errorcount++;
7019 /* If this compilation succeeded, don't delete those files later. */
7020 clear_failure_queue ();
7023 /* Reset the input file name to the first compile/object file name, for use
7024 with %b in LINK_SPEC. We use the first input file that we can find
7025 a compiler to compile it instead of using infiles.language since for
7026 languages other than C we use aliases that we then lookup later. */
7027 if (n_infiles > 0)
7029 int i;
7031 for (i = 0; i < n_infiles ; i++)
7032 if (infiles[i].incompiler
7033 || (infiles[i].language && infiles[i].language[0] != '*'))
7035 set_input (infiles[i].name);
7036 break;
7040 if (!seen_error ())
7042 /* Make sure INPUT_FILE_NUMBER points to first available open
7043 slot. */
7044 input_file_number = n_infiles;
7045 if (lang_specific_pre_link ())
7046 errorcount++;
7049 /* Determine if there are any linker input files. */
7050 num_linker_inputs = 0;
7051 for (i = 0; (int) i < n_infiles; i++)
7052 if (explicit_link_files[i] || outfiles[i] != NULL)
7053 num_linker_inputs++;
7055 /* Run ld to link all the compiler output files. */
7057 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
7059 int tmp = execution_count;
7061 if (! have_c)
7063 #if HAVE_LTO_PLUGIN > 0
7064 #if HAVE_LTO_PLUGIN == 2
7065 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
7066 #else
7067 const char *fuse_linker_plugin = "fuse-linker-plugin";
7068 #endif
7069 #endif
7071 /* We'll use ld if we can't find collect2. */
7072 if (! strcmp (linker_name_spec, "collect2"))
7074 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7075 if (s == NULL)
7076 linker_name_spec = "ld";
7079 #if HAVE_LTO_PLUGIN > 0
7080 #if HAVE_LTO_PLUGIN == 2
7081 if (!switch_matches (fno_use_linker_plugin,
7082 fno_use_linker_plugin
7083 + strlen (fno_use_linker_plugin), 0))
7084 #else
7085 if (switch_matches (fuse_linker_plugin,
7086 fuse_linker_plugin
7087 + strlen (fuse_linker_plugin), 0))
7088 #endif
7090 char *temp_spec = find_a_file (&exec_prefixes,
7091 LTOPLUGINSONAME, R_OK,
7092 false);
7093 if (!temp_spec)
7094 fatal_error ("-fuse-linker-plugin, but %s not found",
7095 LTOPLUGINSONAME);
7096 linker_plugin_file_spec = convert_white_space (temp_spec);
7098 #endif
7099 lto_gcc_spec = argv[0];
7102 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7103 for collect. */
7104 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7105 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7107 if (print_subprocess_help == 1)
7109 printf (_("\nLinker options\n==============\n\n"));
7110 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7111 " to the linker.\n\n"));
7112 fflush (stdout);
7114 value = do_spec (link_command_spec);
7115 if (value < 0)
7116 errorcount = 1;
7117 linker_was_run = (tmp != execution_count);
7120 /* If options said don't run linker,
7121 complain about input files to be given to the linker. */
7123 if (! linker_was_run && !seen_error ())
7124 for (i = 0; (int) i < n_infiles; i++)
7125 if (explicit_link_files[i]
7126 && !(infiles[i].language && infiles[i].language[0] == '*'))
7127 warning (0, "%s: linker input file unused because linking not done",
7128 outfiles[i]);
7130 /* Delete some or all of the temporary files we made. */
7132 if (seen_error ())
7133 delete_failure_queue ();
7134 delete_temp_files ();
7136 if (print_help_list)
7138 printf (("\nFor bug reporting instructions, please see:\n"));
7139 printf ("%s\n", bug_report_url);
7142 out:
7143 return (signal_count != 0 ? 2
7144 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
7145 : 0);
7148 /* Find the proper compilation spec for the file name NAME,
7149 whose length is LENGTH. LANGUAGE is the specified language,
7150 or 0 if this file is to be passed to the linker. */
7152 static struct compiler *
7153 lookup_compiler (const char *name, size_t length, const char *language)
7155 struct compiler *cp;
7157 /* If this was specified by the user to be a linker input, indicate that. */
7158 if (language != 0 && language[0] == '*')
7159 return 0;
7161 /* Otherwise, look for the language, if one is spec'd. */
7162 if (language != 0)
7164 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7165 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7166 return cp;
7168 error ("language %s not recognized", language);
7169 return 0;
7172 /* Look for a suffix. */
7173 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7175 if (/* The suffix `-' matches only the file name `-'. */
7176 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7177 || (strlen (cp->suffix) < length
7178 /* See if the suffix matches the end of NAME. */
7179 && !strcmp (cp->suffix,
7180 name + length - strlen (cp->suffix))
7182 break;
7185 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7186 /* Look again, but case-insensitively this time. */
7187 if (cp < compilers)
7188 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7190 if (/* The suffix `-' matches only the file name `-'. */
7191 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7192 || (strlen (cp->suffix) < length
7193 /* See if the suffix matches the end of NAME. */
7194 && ((!strcmp (cp->suffix,
7195 name + length - strlen (cp->suffix))
7196 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7197 && !strcasecmp (cp->suffix,
7198 name + length - strlen (cp->suffix)))
7200 break;
7202 #endif
7204 if (cp >= compilers)
7206 if (cp->spec[0] != '@')
7207 /* A non-alias entry: return it. */
7208 return cp;
7210 /* An alias entry maps a suffix to a language.
7211 Search for the language; pass 0 for NAME and LENGTH
7212 to avoid infinite recursion if language not found. */
7213 return lookup_compiler (NULL, 0, cp->spec + 1);
7215 return 0;
7218 static char *
7219 save_string (const char *s, int len)
7221 char *result = XNEWVEC (char, len + 1);
7223 memcpy (result, s, len);
7224 result[len] = 0;
7225 return result;
7228 void
7229 pfatal_with_name (const char *name)
7231 perror_with_name (name);
7232 delete_temp_files ();
7233 exit (1);
7236 static void
7237 perror_with_name (const char *name)
7239 error ("%s: %m", name);
7242 static inline void
7243 validate_switches_from_spec (const char *spec, bool user)
7245 const char *p = spec;
7246 char c;
7247 while ((c = *p++))
7248 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7249 /* We have a switch spec. */
7250 p = validate_switches (p + 1, user);
7253 static void
7254 validate_all_switches (void)
7256 struct compiler *comp;
7257 struct spec_list *spec;
7259 for (comp = compilers; comp->spec; comp++)
7260 validate_switches_from_spec (comp->spec, false);
7262 /* Look through the linked list of specs read from the specs file. */
7263 for (spec = specs; spec; spec = spec->next)
7264 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
7266 validate_switches_from_spec (link_command_spec, false);
7269 /* Look at the switch-name that comes after START
7270 and mark as valid all supplied switches that match it. */
7272 static const char *
7273 validate_switches (const char *start, bool user_spec)
7275 const char *p = start;
7276 const char *atom;
7277 size_t len;
7278 int i;
7279 bool suffix = false;
7280 bool starred = false;
7282 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7284 next_member:
7285 SKIP_WHITE ();
7287 if (*p == '!')
7288 p++;
7290 SKIP_WHITE ();
7291 if (*p == '.' || *p == ',')
7292 suffix = true, p++;
7294 atom = p;
7295 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7296 || *p == ',' || *p == '.' || *p == '@')
7297 p++;
7298 len = p - atom;
7300 if (*p == '*')
7301 starred = true, p++;
7303 SKIP_WHITE ();
7305 if (!suffix)
7307 /* Mark all matching switches as valid. */
7308 for (i = 0; i < n_switches; i++)
7309 if (!strncmp (switches[i].part1, atom, len)
7310 && (starred || switches[i].part1[len] == '\0')
7311 && (switches[i].known || user_spec))
7312 switches[i].validated = true;
7315 if (*p) p++;
7316 if (*p && (p[-1] == '|' || p[-1] == '&'))
7317 goto next_member;
7319 if (*p && p[-1] == ':')
7321 while (*p && *p != ';' && *p != '}')
7323 if (*p == '%')
7325 p++;
7326 if (*p == '{' || *p == '<')
7327 p = validate_switches (p+1, user_spec);
7328 else if (p[0] == 'W' && p[1] == '{')
7329 p = validate_switches (p+2, user_spec);
7331 else
7332 p++;
7335 if (*p) p++;
7336 if (*p && p[-1] == ';')
7337 goto next_member;
7340 return p;
7341 #undef SKIP_WHITE
7344 struct mdswitchstr
7346 const char *str;
7347 int len;
7350 static struct mdswitchstr *mdswitches;
7351 static int n_mdswitches;
7353 /* Check whether a particular argument was used. The first time we
7354 canonicalize the switches to keep only the ones we care about. */
7356 static int
7357 used_arg (const char *p, int len)
7359 struct mswitchstr
7361 const char *str;
7362 const char *replace;
7363 int len;
7364 int rep_len;
7367 static struct mswitchstr *mswitches;
7368 static int n_mswitches;
7369 int i, j;
7371 if (!mswitches)
7373 struct mswitchstr *matches;
7374 const char *q;
7375 int cnt = 0;
7377 /* Break multilib_matches into the component strings of string
7378 and replacement string. */
7379 for (q = multilib_matches; *q != '\0'; q++)
7380 if (*q == ';')
7381 cnt++;
7383 matches
7384 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
7385 i = 0;
7386 q = multilib_matches;
7387 while (*q != '\0')
7389 matches[i].str = q;
7390 while (*q != ' ')
7392 if (*q == '\0')
7394 invalid_matches:
7395 fatal_error ("multilib spec %qs is invalid",
7396 multilib_matches);
7398 q++;
7400 matches[i].len = q - matches[i].str;
7402 matches[i].replace = ++q;
7403 while (*q != ';' && *q != '\0')
7405 if (*q == ' ')
7406 goto invalid_matches;
7407 q++;
7409 matches[i].rep_len = q - matches[i].replace;
7410 i++;
7411 if (*q == ';')
7412 q++;
7415 /* Now build a list of the replacement string for switches that we care
7416 about. Make sure we allocate at least one entry. This prevents
7417 xmalloc from calling fatal, and prevents us from re-executing this
7418 block of code. */
7419 mswitches
7420 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7421 for (i = 0; i < n_switches; i++)
7422 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
7424 int xlen = strlen (switches[i].part1);
7425 for (j = 0; j < cnt; j++)
7426 if (xlen == matches[j].len
7427 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7429 mswitches[n_mswitches].str = matches[j].replace;
7430 mswitches[n_mswitches].len = matches[j].rep_len;
7431 mswitches[n_mswitches].replace = (char *) 0;
7432 mswitches[n_mswitches].rep_len = 0;
7433 n_mswitches++;
7434 break;
7438 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7439 on the command line nor any options mutually incompatible with
7440 them. */
7441 for (i = 0; i < n_mdswitches; i++)
7443 const char *r;
7445 for (q = multilib_options; *q != '\0'; q++)
7447 while (*q == ' ')
7448 q++;
7450 r = q;
7451 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7452 || strchr (" /", q[mdswitches[i].len]) == NULL)
7454 while (*q != ' ' && *q != '/' && *q != '\0')
7455 q++;
7456 if (*q != '/')
7457 break;
7458 q++;
7461 if (*q != ' ' && *q != '\0')
7463 while (*r != ' ' && *r != '\0')
7465 q = r;
7466 while (*q != ' ' && *q != '/' && *q != '\0')
7467 q++;
7469 if (used_arg (r, q - r))
7470 break;
7472 if (*q != '/')
7474 mswitches[n_mswitches].str = mdswitches[i].str;
7475 mswitches[n_mswitches].len = mdswitches[i].len;
7476 mswitches[n_mswitches].replace = (char *) 0;
7477 mswitches[n_mswitches].rep_len = 0;
7478 n_mswitches++;
7479 break;
7482 r = q + 1;
7484 break;
7490 for (i = 0; i < n_mswitches; i++)
7491 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7492 return 1;
7494 return 0;
7497 static int
7498 default_arg (const char *p, int len)
7500 int i;
7502 for (i = 0; i < n_mdswitches; i++)
7503 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7504 return 1;
7506 return 0;
7509 /* Work out the subdirectory to use based on the options. The format of
7510 multilib_select is a list of elements. Each element is a subdirectory
7511 name followed by a list of options followed by a semicolon. The format
7512 of multilib_exclusions is the same, but without the preceding
7513 directory. First gcc will check the exclusions, if none of the options
7514 beginning with an exclamation point are present, and all of the other
7515 options are present, then we will ignore this completely. Passing
7516 that, gcc will consider each multilib_select in turn using the same
7517 rules for matching the options. If a match is found, that subdirectory
7518 will be used.
7519 A subdirectory name is optionally followed by a colon and the corresponding
7520 multiarch name. */
7522 static void
7523 set_multilib_dir (void)
7525 const char *p;
7526 unsigned int this_path_len;
7527 const char *this_path, *this_arg;
7528 const char *start, *end;
7529 int not_arg;
7530 int ok, ndfltok, first;
7532 n_mdswitches = 0;
7533 start = multilib_defaults;
7534 while (*start == ' ' || *start == '\t')
7535 start++;
7536 while (*start != '\0')
7538 n_mdswitches++;
7539 while (*start != ' ' && *start != '\t' && *start != '\0')
7540 start++;
7541 while (*start == ' ' || *start == '\t')
7542 start++;
7545 if (n_mdswitches)
7547 int i = 0;
7549 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
7550 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7552 while (*start == ' ' || *start == '\t')
7553 start++;
7555 if (*start == '\0')
7556 break;
7558 for (end = start + 1;
7559 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7562 obstack_grow (&multilib_obstack, start, end - start);
7563 obstack_1grow (&multilib_obstack, 0);
7564 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
7565 mdswitches[i++].len = end - start;
7567 if (*end == '\0')
7568 break;
7572 p = multilib_exclusions;
7573 while (*p != '\0')
7575 /* Ignore newlines. */
7576 if (*p == '\n')
7578 ++p;
7579 continue;
7582 /* Check the arguments. */
7583 ok = 1;
7584 while (*p != ';')
7586 if (*p == '\0')
7588 invalid_exclusions:
7589 fatal_error ("multilib exclusions %qs is invalid",
7590 multilib_exclusions);
7593 if (! ok)
7595 ++p;
7596 continue;
7599 this_arg = p;
7600 while (*p != ' ' && *p != ';')
7602 if (*p == '\0')
7603 goto invalid_exclusions;
7604 ++p;
7607 if (*this_arg != '!')
7608 not_arg = 0;
7609 else
7611 not_arg = 1;
7612 ++this_arg;
7615 ok = used_arg (this_arg, p - this_arg);
7616 if (not_arg)
7617 ok = ! ok;
7619 if (*p == ' ')
7620 ++p;
7623 if (ok)
7624 return;
7626 ++p;
7629 first = 1;
7630 p = multilib_select;
7632 /* Append multilib reuse rules if any. With those rules, we can reuse
7633 one multilib for certain different options sets. */
7634 if (strlen (multilib_reuse) > 0)
7635 p = concat (p, multilib_reuse, NULL);
7637 while (*p != '\0')
7639 /* Ignore newlines. */
7640 if (*p == '\n')
7642 ++p;
7643 continue;
7646 /* Get the initial path. */
7647 this_path = p;
7648 while (*p != ' ')
7650 if (*p == '\0')
7652 invalid_select:
7653 fatal_error ("multilib select %qs %qs is invalid",
7654 multilib_select, multilib_reuse);
7656 ++p;
7658 this_path_len = p - this_path;
7660 /* Check the arguments. */
7661 ok = 1;
7662 ndfltok = 1;
7663 ++p;
7664 while (*p != ';')
7666 if (*p == '\0')
7667 goto invalid_select;
7669 if (! ok)
7671 ++p;
7672 continue;
7675 this_arg = p;
7676 while (*p != ' ' && *p != ';')
7678 if (*p == '\0')
7679 goto invalid_select;
7680 ++p;
7683 if (*this_arg != '!')
7684 not_arg = 0;
7685 else
7687 not_arg = 1;
7688 ++this_arg;
7691 /* If this is a default argument, we can just ignore it.
7692 This is true even if this_arg begins with '!'. Beginning
7693 with '!' does not mean that this argument is necessarily
7694 inappropriate for this library: it merely means that
7695 there is a more specific library which uses this
7696 argument. If this argument is a default, we need not
7697 consider that more specific library. */
7698 ok = used_arg (this_arg, p - this_arg);
7699 if (not_arg)
7700 ok = ! ok;
7702 if (! ok)
7703 ndfltok = 0;
7705 if (default_arg (this_arg, p - this_arg))
7706 ok = 1;
7708 if (*p == ' ')
7709 ++p;
7712 if (ok && first)
7714 if (this_path_len != 1
7715 || this_path[0] != '.')
7717 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
7718 char *q;
7720 strncpy (new_multilib_dir, this_path, this_path_len);
7721 new_multilib_dir[this_path_len] = '\0';
7722 q = strchr (new_multilib_dir, ':');
7723 if (q != NULL)
7724 *q = '\0';
7725 multilib_dir = new_multilib_dir;
7727 first = 0;
7730 if (ndfltok)
7732 const char *q = this_path, *end = this_path + this_path_len;
7734 while (q < end && *q != ':')
7735 q++;
7736 if (q < end)
7738 const char *q2 = q + 1, *ml_end = end;
7739 char *new_multilib_os_dir;
7741 while (q2 < end && *q2 != ':')
7742 q2++;
7743 if (*q2 == ':')
7744 ml_end = q2;
7745 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
7746 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
7747 new_multilib_os_dir[ml_end - q - 1] = '\0';
7748 multilib_os_dir = *new_multilib_os_dir ? new_multilib_os_dir : ".";
7750 if (q2 < end && *q2 == ':')
7752 char *new_multiarch_dir = XNEWVEC (char, end - q2);
7753 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
7754 new_multiarch_dir[end - q2 - 1] = '\0';
7755 multiarch_dir = new_multiarch_dir;
7757 break;
7761 ++p;
7764 if (multilib_dir == NULL && multilib_os_dir != NULL
7765 && strcmp (multilib_os_dir, ".") == 0)
7767 free (CONST_CAST (char *, multilib_os_dir));
7768 multilib_os_dir = NULL;
7770 else if (multilib_dir != NULL && multilib_os_dir == NULL)
7771 multilib_os_dir = multilib_dir;
7774 /* Print out the multiple library subdirectory selection
7775 information. This prints out a series of lines. Each line looks
7776 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
7777 required. Only the desired options are printed out, the negative
7778 matches. The options are print without a leading dash. There are
7779 no spaces to make it easy to use the information in the shell.
7780 Each subdirectory is printed only once. This assumes the ordering
7781 generated by the genmultilib script. Also, we leave out ones that match
7782 the exclusions. */
7784 static void
7785 print_multilib_info (void)
7787 const char *p = multilib_select;
7788 const char *last_path = 0, *this_path;
7789 int skip;
7790 unsigned int last_path_len = 0;
7792 while (*p != '\0')
7794 skip = 0;
7795 /* Ignore newlines. */
7796 if (*p == '\n')
7798 ++p;
7799 continue;
7802 /* Get the initial path. */
7803 this_path = p;
7804 while (*p != ' ')
7806 if (*p == '\0')
7808 invalid_select:
7809 fatal_error ("multilib select %qs is invalid", multilib_select);
7812 ++p;
7815 /* When --disable-multilib was used but target defines
7816 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
7817 with .:: for multiarch configurations) are there just to find
7818 multilib_os_dir, so skip them from output. */
7819 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
7820 skip = 1;
7822 /* Check for matches with the multilib_exclusions. We don't bother
7823 with the '!' in either list. If any of the exclusion rules match
7824 all of its options with the select rule, we skip it. */
7826 const char *e = multilib_exclusions;
7827 const char *this_arg;
7829 while (*e != '\0')
7831 int m = 1;
7832 /* Ignore newlines. */
7833 if (*e == '\n')
7835 ++e;
7836 continue;
7839 /* Check the arguments. */
7840 while (*e != ';')
7842 const char *q;
7843 int mp = 0;
7845 if (*e == '\0')
7847 invalid_exclusion:
7848 fatal_error ("multilib exclusion %qs is invalid",
7849 multilib_exclusions);
7852 if (! m)
7854 ++e;
7855 continue;
7858 this_arg = e;
7860 while (*e != ' ' && *e != ';')
7862 if (*e == '\0')
7863 goto invalid_exclusion;
7864 ++e;
7867 q = p + 1;
7868 while (*q != ';')
7870 const char *arg;
7871 int len = e - this_arg;
7873 if (*q == '\0')
7874 goto invalid_select;
7876 arg = q;
7878 while (*q != ' ' && *q != ';')
7880 if (*q == '\0')
7881 goto invalid_select;
7882 ++q;
7885 if (! strncmp (arg, this_arg,
7886 (len < q - arg) ? q - arg : len)
7887 || default_arg (this_arg, e - this_arg))
7889 mp = 1;
7890 break;
7893 if (*q == ' ')
7894 ++q;
7897 if (! mp)
7898 m = 0;
7900 if (*e == ' ')
7901 ++e;
7904 if (m)
7906 skip = 1;
7907 break;
7910 if (*e != '\0')
7911 ++e;
7915 if (! skip)
7917 /* If this is a duplicate, skip it. */
7918 skip = (last_path != 0
7919 && (unsigned int) (p - this_path) == last_path_len
7920 && ! filename_ncmp (last_path, this_path, last_path_len));
7922 last_path = this_path;
7923 last_path_len = p - this_path;
7926 /* If this directory requires any default arguments, we can skip
7927 it. We will already have printed a directory identical to
7928 this one which does not require that default argument. */
7929 if (! skip)
7931 const char *q;
7933 q = p + 1;
7934 while (*q != ';')
7936 const char *arg;
7938 if (*q == '\0')
7939 goto invalid_select;
7941 if (*q == '!')
7942 arg = NULL;
7943 else
7944 arg = q;
7946 while (*q != ' ' && *q != ';')
7948 if (*q == '\0')
7949 goto invalid_select;
7950 ++q;
7953 if (arg != NULL
7954 && default_arg (arg, q - arg))
7956 skip = 1;
7957 break;
7960 if (*q == ' ')
7961 ++q;
7965 if (! skip)
7967 const char *p1;
7969 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
7970 putchar (*p1);
7971 putchar (';');
7974 ++p;
7975 while (*p != ';')
7977 int use_arg;
7979 if (*p == '\0')
7980 goto invalid_select;
7982 if (skip)
7984 ++p;
7985 continue;
7988 use_arg = *p != '!';
7990 if (use_arg)
7991 putchar ('@');
7993 while (*p != ' ' && *p != ';')
7995 if (*p == '\0')
7996 goto invalid_select;
7997 if (use_arg)
7998 putchar (*p);
7999 ++p;
8002 if (*p == ' ')
8003 ++p;
8006 if (! skip)
8008 /* If there are extra options, print them now. */
8009 if (multilib_extra && *multilib_extra)
8011 int print_at = TRUE;
8012 const char *q;
8014 for (q = multilib_extra; *q != '\0'; q++)
8016 if (*q == ' ')
8017 print_at = TRUE;
8018 else
8020 if (print_at)
8021 putchar ('@');
8022 putchar (*q);
8023 print_at = FALSE;
8028 putchar ('\n');
8031 ++p;
8035 /* getenv built-in spec function.
8037 Returns the value of the environment variable given by its first
8038 argument, concatenated with the second argument. If the
8039 environment variable is not defined, a fatal error is issued. */
8041 static const char *
8042 getenv_spec_function (int argc, const char **argv)
8044 char *value;
8045 char *result;
8046 char *ptr;
8047 size_t len;
8049 if (argc != 2)
8050 return NULL;
8052 value = getenv (argv[0]);
8053 if (!value)
8054 fatal_error ("environment variable %qs not defined", argv[0]);
8056 /* We have to escape every character of the environment variable so
8057 they are not interpreted as active spec characters. A
8058 particularly painful case is when we are reading a variable
8059 holding a windows path complete with \ separators. */
8060 len = strlen (value) * 2 + strlen (argv[1]) + 1;
8061 result = XNEWVAR (char, len);
8062 for (ptr = result; *value; ptr += 2)
8064 ptr[0] = '\\';
8065 ptr[1] = *value++;
8068 strcpy (ptr, argv[1]);
8070 return result;
8073 /* if-exists built-in spec function.
8075 Checks to see if the file specified by the absolute pathname in
8076 ARGS exists. Returns that pathname if found.
8078 The usual use for this function is to check for a library file
8079 (whose name has been expanded with %s). */
8081 static const char *
8082 if_exists_spec_function (int argc, const char **argv)
8084 /* Must have only one argument. */
8085 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8086 return argv[0];
8088 return NULL;
8091 /* if-exists-else built-in spec function.
8093 This is like if-exists, but takes an additional argument which
8094 is returned if the first argument does not exist. */
8096 static const char *
8097 if_exists_else_spec_function (int argc, const char **argv)
8099 /* Must have exactly two arguments. */
8100 if (argc != 2)
8101 return NULL;
8103 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8104 return argv[0];
8106 return argv[1];
8109 /* sanitize built-in spec function.
8111 This returns non-NULL, if sanitizing address, thread or
8112 any of the undefined behavior sanitizers. */
8114 static const char *
8115 sanitize_spec_function (int argc, const char **argv)
8117 if (argc != 1)
8118 return NULL;
8120 if (strcmp (argv[0], "address") == 0)
8121 return (flag_sanitize & SANITIZE_ADDRESS) ? "" : NULL;
8122 if (strcmp (argv[0], "thread") == 0)
8123 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
8124 if (strcmp (argv[0], "undefined") == 0)
8125 return (flag_sanitize & SANITIZE_UNDEFINED) ? "" : NULL;
8127 return NULL;
8130 /* replace-outfile built-in spec function.
8132 This looks for the first argument in the outfiles array's name and
8133 replaces it with the second argument. */
8135 static const char *
8136 replace_outfile_spec_function (int argc, const char **argv)
8138 int i;
8139 /* Must have exactly two arguments. */
8140 if (argc != 2)
8141 abort ();
8143 for (i = 0; i < n_infiles; i++)
8145 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
8146 outfiles[i] = xstrdup (argv[1]);
8148 return NULL;
8151 /* remove-outfile built-in spec function.
8153 * This looks for the first argument in the outfiles array's name and
8154 * removes it. */
8156 static const char *
8157 remove_outfile_spec_function (int argc, const char **argv)
8159 int i;
8160 /* Must have exactly one argument. */
8161 if (argc != 1)
8162 abort ();
8164 for (i = 0; i < n_infiles; i++)
8166 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
8167 outfiles[i] = NULL;
8169 return NULL;
8172 /* Given two version numbers, compares the two numbers.
8173 A version number must match the regular expression
8174 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8176 static int
8177 compare_version_strings (const char *v1, const char *v2)
8179 int rresult;
8180 regex_t r;
8182 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8183 REG_EXTENDED | REG_NOSUB) != 0)
8184 abort ();
8185 rresult = regexec (&r, v1, 0, NULL, 0);
8186 if (rresult == REG_NOMATCH)
8187 fatal_error ("invalid version number %qs", v1);
8188 else if (rresult != 0)
8189 abort ();
8190 rresult = regexec (&r, v2, 0, NULL, 0);
8191 if (rresult == REG_NOMATCH)
8192 fatal_error ("invalid version number %qs", v2);
8193 else if (rresult != 0)
8194 abort ();
8196 return strverscmp (v1, v2);
8200 /* version_compare built-in spec function.
8202 This takes an argument of the following form:
8204 <comparison-op> <arg1> [<arg2>] <switch> <result>
8206 and produces "result" if the comparison evaluates to true,
8207 and nothing if it doesn't.
8209 The supported <comparison-op> values are:
8211 >= true if switch is a later (or same) version than arg1
8212 !> opposite of >=
8213 < true if switch is an earlier version than arg1
8214 !< opposite of <
8215 >< true if switch is arg1 or later, and earlier than arg2
8216 <> true if switch is earlier than arg1 or is arg2 or later
8218 If the switch is not present, the condition is false unless
8219 the first character of the <comparison-op> is '!'.
8221 For example,
8222 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8223 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8225 static const char *
8226 version_compare_spec_function (int argc, const char **argv)
8228 int comp1, comp2;
8229 size_t switch_len;
8230 const char *switch_value = NULL;
8231 int nargs = 1, i;
8232 bool result;
8234 if (argc < 3)
8235 fatal_error ("too few arguments to %%:version-compare");
8236 if (argv[0][0] == '\0')
8237 abort ();
8238 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8239 nargs = 2;
8240 if (argc != nargs + 3)
8241 fatal_error ("too many arguments to %%:version-compare");
8243 switch_len = strlen (argv[nargs + 1]);
8244 for (i = 0; i < n_switches; i++)
8245 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8246 && check_live_switch (i, switch_len))
8247 switch_value = switches[i].part1 + switch_len;
8249 if (switch_value == NULL)
8250 comp1 = comp2 = -1;
8251 else
8253 comp1 = compare_version_strings (switch_value, argv[1]);
8254 if (nargs == 2)
8255 comp2 = compare_version_strings (switch_value, argv[2]);
8256 else
8257 comp2 = -1; /* This value unused. */
8260 switch (argv[0][0] << 8 | argv[0][1])
8262 case '>' << 8 | '=':
8263 result = comp1 >= 0;
8264 break;
8265 case '!' << 8 | '<':
8266 result = comp1 >= 0 || switch_value == NULL;
8267 break;
8268 case '<' << 8:
8269 result = comp1 < 0;
8270 break;
8271 case '!' << 8 | '>':
8272 result = comp1 < 0 || switch_value == NULL;
8273 break;
8274 case '>' << 8 | '<':
8275 result = comp1 >= 0 && comp2 < 0;
8276 break;
8277 case '<' << 8 | '>':
8278 result = comp1 < 0 || comp2 >= 0;
8279 break;
8281 default:
8282 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
8284 if (! result)
8285 return NULL;
8287 return argv[nargs + 2];
8290 /* %:include builtin spec function. This differs from %include in that it
8291 can be nested inside a spec, and thus be conditionalized. It takes
8292 one argument, the filename, and looks for it in the startfile path.
8293 The result is always NULL, i.e. an empty expansion. */
8295 static const char *
8296 include_spec_function (int argc, const char **argv)
8298 char *file;
8300 if (argc != 1)
8301 abort ();
8303 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
8304 read_specs (file ? file : argv[0], false, false);
8306 return NULL;
8309 /* %:find-file spec function. This function replaces its argument by
8310 the file found through find_file, that is the -print-file-name gcc
8311 program option. */
8312 static const char *
8313 find_file_spec_function (int argc, const char **argv)
8315 const char *file;
8317 if (argc != 1)
8318 abort ();
8320 file = find_file (argv[0]);
8321 return file;
8325 /* %:find-plugindir spec function. This function replaces its argument
8326 by the -iplugindir=<dir> option. `dir' is found through find_file, that
8327 is the -print-file-name gcc program option. */
8328 static const char *
8329 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
8331 const char *option;
8333 if (argc != 0)
8334 abort ();
8336 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
8337 return option;
8341 /* %:print-asm-header spec function. Print a banner to say that the
8342 following output is from the assembler. */
8344 static const char *
8345 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8346 const char **argv ATTRIBUTE_UNUSED)
8348 printf (_("Assembler options\n=================\n\n"));
8349 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8350 fflush (stdout);
8351 return NULL;
8354 /* Get a random number for -frandom-seed */
8356 static unsigned HOST_WIDE_INT
8357 get_random_number (void)
8359 unsigned HOST_WIDE_INT ret = 0;
8360 int fd;
8362 fd = open ("/dev/urandom", O_RDONLY);
8363 if (fd >= 0)
8365 read (fd, &ret, sizeof (HOST_WIDE_INT));
8366 close (fd);
8367 if (ret)
8368 return ret;
8371 /* Get some more or less random data. */
8372 #ifdef HAVE_GETTIMEOFDAY
8374 struct timeval tv;
8376 gettimeofday (&tv, NULL);
8377 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8379 #else
8381 time_t now = time (NULL);
8383 if (now != (time_t)-1)
8384 ret = (unsigned) now;
8386 #endif
8388 return ret ^ getpid ();
8391 /* %:compare-debug-dump-opt spec function. Save the last argument,
8392 expected to be the last -fdump-final-insns option, or generate a
8393 temporary. */
8395 static const char *
8396 compare_debug_dump_opt_spec_function (int arg,
8397 const char **argv ATTRIBUTE_UNUSED)
8399 char *ret;
8400 char *name;
8401 int which;
8402 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
8404 if (arg != 0)
8405 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
8407 do_spec_2 ("%{fdump-final-insns=*:%*}");
8408 do_spec_1 (" ", 0, NULL);
8410 if (argbuf.length () > 0
8411 && strcmp (argv[argbuf.length () - 1], "."))
8413 if (!compare_debug)
8414 return NULL;
8416 name = xstrdup (argv[argbuf.length () - 1]);
8417 ret = NULL;
8419 else
8421 const char *ext = NULL;
8423 if (argbuf.length () > 0)
8425 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8426 ext = ".gkd";
8428 else if (!compare_debug)
8429 return NULL;
8430 else
8431 do_spec_2 ("%g.gkd");
8433 do_spec_1 (" ", 0, NULL);
8435 gcc_assert (argbuf.length () > 0);
8437 name = concat (argbuf.last (), ext, NULL);
8439 ret = concat ("-fdump-final-insns=", name, NULL);
8442 which = compare_debug < 0;
8443 debug_check_temp_file[which] = name;
8445 if (!which)
8447 unsigned HOST_WIDE_INT value = get_random_number ();
8449 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8452 if (*random_seed)
8454 char *tmp = ret;
8455 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8456 ret, NULL);
8457 free (tmp);
8460 if (which)
8461 *random_seed = 0;
8463 return ret;
8466 static const char *debug_auxbase_opt;
8468 /* %:compare-debug-self-opt spec function. Expands to the options
8469 that are to be passed in the second compilation of
8470 compare-debug. */
8472 static const char *
8473 compare_debug_self_opt_spec_function (int arg,
8474 const char **argv ATTRIBUTE_UNUSED)
8476 if (arg != 0)
8477 fatal_error ("too many arguments to %%:compare-debug-self-opt");
8479 if (compare_debug >= 0)
8480 return NULL;
8482 do_spec_2 ("%{c|S:%{o*:%*}}");
8483 do_spec_1 (" ", 0, NULL);
8485 if (argbuf.length () > 0)
8486 debug_auxbase_opt = concat ("-auxbase-strip ",
8487 argbuf.last (),
8488 NULL);
8489 else
8490 debug_auxbase_opt = NULL;
8492 return concat ("\
8493 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8494 %<fdump-final-insns=* -w -S -o %j \
8495 %{!fcompare-debug-second:-fcompare-debug-second} \
8496 ", compare_debug_opt, NULL);
8499 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8500 options that are to be passed in the second compilation of
8501 compare-debug. It expects, as an argument, the basename of the
8502 current input file name, with the .gk suffix appended to it. */
8504 static const char *
8505 compare_debug_auxbase_opt_spec_function (int arg,
8506 const char **argv)
8508 char *name;
8509 int len;
8511 if (arg == 0)
8512 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
8514 if (arg != 1)
8515 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
8517 if (compare_debug >= 0)
8518 return NULL;
8520 len = strlen (argv[0]);
8521 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
8522 fatal_error ("argument to %%:compare-debug-auxbase-opt "
8523 "does not end in .gk");
8525 if (debug_auxbase_opt)
8526 return debug_auxbase_opt;
8528 #define OPT "-auxbase "
8530 len -= 3;
8531 name = (char*) xmalloc (sizeof (OPT) + len);
8532 memcpy (name, OPT, sizeof (OPT) - 1);
8533 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8534 name[sizeof (OPT) - 1 + len] = '\0';
8536 #undef OPT
8538 return name;
8541 /* %:pass-through-libs spec function. Finds all -l options and input
8542 file names in the lib spec passed to it, and makes a list of them
8543 prepended with the plugin option to cause them to be passed through
8544 to the final link after all the new object files have been added. */
8546 const char *
8547 pass_through_libs_spec_func (int argc, const char **argv)
8549 char *prepended = xstrdup (" ");
8550 int n;
8551 /* Shlemiel the painter's algorithm. Innately horrible, but at least
8552 we know that there will never be more than a handful of strings to
8553 concat, and it's only once per run, so it's not worth optimising. */
8554 for (n = 0; n < argc; n++)
8556 char *old = prepended;
8557 /* Anything that isn't an option is a full path to an output
8558 file; pass it through if it ends in '.a'. Among options,
8559 pass only -l. */
8560 if (argv[n][0] == '-' && argv[n][1] == 'l')
8562 const char *lopt = argv[n] + 2;
8563 /* Handle both joined and non-joined -l options. If for any
8564 reason there's a trailing -l with no joined or following
8565 arg just discard it. */
8566 if (!*lopt && ++n >= argc)
8567 break;
8568 else if (!*lopt)
8569 lopt = argv[n];
8570 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
8571 lopt, " ", NULL);
8573 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
8575 prepended = concat (prepended, "-plugin-opt=-pass-through=",
8576 argv[n], " ", NULL);
8578 if (prepended != old)
8579 free (old);
8581 return prepended;
8584 /* %:replace-extension spec function. Replaces the extension of the
8585 first argument with the second argument. */
8587 const char *
8588 replace_extension_spec_func (int argc, const char **argv)
8590 char *name;
8591 char *p;
8592 char *result;
8593 int i;
8595 if (argc != 2)
8596 fatal_error ("too few arguments to %%:replace-extension");
8598 name = xstrdup (argv[0]);
8600 for (i = strlen (name) - 1; i >= 0; i--)
8601 if (IS_DIR_SEPARATOR (name[i]))
8602 break;
8604 p = strrchr (name + i + 1, '.');
8605 if (p != NULL)
8606 *p = '\0';
8608 result = concat (name, argv[1], NULL);
8610 free (name);
8611 return result;
8614 /* Insert backslash before spaces in ORIG (usually a file path), to
8615 avoid being broken by spec parser.
8617 This function is needed as do_spec_1 treats white space (' ' and '\t')
8618 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
8619 the file name should be treated as a single argument rather than being
8620 broken into multiple. Solution is to insert '\\' before the space in a
8621 file name.
8623 This function converts and only converts all occurrence of ' '
8624 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
8625 "a b" -> "a\\ b"
8626 "a b" -> "a\\ \\ b"
8627 "a\tb" -> "a\\\tb"
8628 "a\\ b" -> "a\\\\ b"
8630 orig: input null-terminating string that was allocated by xalloc. The
8631 memory it points to might be freed in this function. Behavior undefined
8632 if ORIG wasn't xalloced or was freed already at entry.
8634 Return: ORIG if no conversion needed. Otherwise a newly allocated string
8635 that was converted from ORIG. */
8637 static char *
8638 convert_white_space (char *orig)
8640 int len, number_of_space = 0;
8642 for (len = 0; orig[len]; len++)
8643 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
8645 if (number_of_space)
8647 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
8648 int j, k;
8649 for (j = 0, k = 0; j <= len; j++, k++)
8651 if (orig[j] == ' ' || orig[j] == '\t')
8652 new_spec[k++] = '\\';
8653 new_spec[k] = orig[j];
8655 free (orig);
8656 return new_spec;
8658 else
8659 return orig;