pretty-print.h (pp_base): Remove.
[official-gcc.git] / gcc / gcc.c
blob6ef4e8a1b7748173df810b7ed460615c4e5bfa65
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 *);
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 *replace_outfile_spec_function (int, const char **);
257 static const char *remove_outfile_spec_function (int, const char **);
258 static const char *version_compare_spec_function (int, const char **);
259 static const char *include_spec_function (int, const char **);
260 static const char *find_file_spec_function (int, const char **);
261 static const char *find_plugindir_spec_function (int, const char **);
262 static const char *print_asm_header_spec_function (int, const char **);
263 static const char *compare_debug_dump_opt_spec_function (int, const char **);
264 static const char *compare_debug_self_opt_spec_function (int, const char **);
265 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
266 static const char *pass_through_libs_spec_func (int, const char **);
267 static const char *replace_extension_spec_func (int, const char **);
268 static char *convert_white_space (char *);
270 /* The Specs Language
272 Specs are strings containing lines, each of which (if not blank)
273 is made up of a program name, and arguments separated by spaces.
274 The program name must be exact and start from root, since no path
275 is searched and it is unreliable to depend on the current working directory.
276 Redirection of input or output is not supported; the subprograms must
277 accept filenames saying what files to read and write.
279 In addition, the specs can contain %-sequences to substitute variable text
280 or for conditional text. Here is a table of all defined %-sequences.
281 Note that spaces are not generated automatically around the results of
282 expanding these sequences; therefore, you can concatenate them together
283 or with constant text in a single argument.
285 %% substitute one % into the program name or argument.
286 %i substitute the name of the input file being processed.
287 %b substitute the basename of the input file being processed.
288 This is the substring up to (and not including) the last period
289 and not including the directory unless -save-temps was specified
290 to put temporaries in a different location.
291 %B same as %b, but include the file suffix (text after the last period).
292 %gSUFFIX
293 substitute a file name that has suffix SUFFIX and is chosen
294 once per compilation, and mark the argument a la %d. To reduce
295 exposure to denial-of-service attacks, the file name is now
296 chosen in a way that is hard to predict even when previously
297 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
298 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
299 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
300 had been pre-processed. Previously, %g was simply substituted
301 with a file name chosen once per compilation, without regard
302 to any appended suffix (which was therefore treated just like
303 ordinary text), making such attacks more likely to succeed.
304 %|SUFFIX
305 like %g, but if -pipe is in effect, expands simply to "-".
306 %mSUFFIX
307 like %g, but if -pipe is in effect, expands to nothing. (We have both
308 %| and %m to accommodate differences between system assemblers; see
309 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
310 %uSUFFIX
311 like %g, but generates a new temporary file name even if %uSUFFIX
312 was already seen.
313 %USUFFIX
314 substitutes the last file name generated with %uSUFFIX, generating a
315 new one if there is no such last file name. In the absence of any
316 %uSUFFIX, this is just like %gSUFFIX, except they don't share
317 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
318 would involve the generation of two distinct file names, one
319 for each `%g.s' and another for each `%U.s'. Previously, %U was
320 simply substituted with a file name chosen for the previous %u,
321 without regard to any appended suffix.
322 %jSUFFIX
323 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
324 writable, and if save-temps is off; otherwise, substitute the name
325 of a temporary file, just like %u. This temporary file is not
326 meant for communication between processes, but rather as a junk
327 disposal mechanism.
328 %.SUFFIX
329 substitutes .SUFFIX for the suffixes of a matched switch's args when
330 it is subsequently output with %*. SUFFIX is terminated by the next
331 space or %.
332 %d marks the argument containing or following the %d as a
333 temporary file name, so that that file will be deleted if GCC exits
334 successfully. Unlike %g, this contributes no text to the argument.
335 %w marks the argument containing or following the %w as the
336 "output file" of this compilation. This puts the argument
337 into the sequence of arguments that %o will substitute later.
338 %V indicates that this compilation produces no "output file".
339 %W{...}
340 like %{...} but mark last argument supplied within
341 as a file to be deleted on failure.
342 %o substitutes the names of all the output files, with spaces
343 automatically placed around them. You should write spaces
344 around the %o as well or the results are undefined.
345 %o is for use in the specs for running the linker.
346 Input files whose names have no recognized suffix are not compiled
347 at all, but they are included among the output files, so they will
348 be linked.
349 %O substitutes the suffix for object files. Note that this is
350 handled specially when it immediately follows %g, %u, or %U
351 (with or without a suffix argument) because of the need for
352 those to form complete file names. The handling is such that
353 %O is treated exactly as if it had already been substituted,
354 except that %g, %u, and %U do not currently support additional
355 SUFFIX characters following %O as they would following, for
356 example, `.o'.
357 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
358 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
359 and -B options) and -imultilib as necessary.
360 %s current argument is the name of a library or startup file of some sort.
361 Search for that file in a standard list of directories
362 and substitute the full name found.
363 %eSTR Print STR as an error message. STR is terminated by a newline.
364 Use this when inconsistent options are detected.
365 %nSTR Print STR as a notice. STR is terminated by a newline.
366 %x{OPTION} Accumulate an option for %X.
367 %X Output the accumulated linker options specified by compilations.
368 %Y Output the accumulated assembler options specified by compilations.
369 %Z Output the accumulated preprocessor options specified by compilations.
370 %a process ASM_SPEC as a spec.
371 This allows config.h to specify part of the spec for running as.
372 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
373 used here. This can be used to run a post-processor after the
374 assembler has done its job.
375 %D Dump out a -L option for each directory in startfile_prefixes.
376 If multilib_dir is set, extra entries are generated with it affixed.
377 %l process LINK_SPEC as a spec.
378 %L process LIB_SPEC as a spec.
379 %M Output multilib_os_dir.
380 %G process LIBGCC_SPEC as a spec.
381 %R Output the concatenation of target_system_root and
382 target_sysroot_suffix.
383 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
384 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
385 %C process CPP_SPEC as a spec.
386 %1 process CC1_SPEC as a spec.
387 %2 process CC1PLUS_SPEC as a spec.
388 %* substitute the variable part of a matched option. (See below.)
389 Note that each comma in the substituted string is replaced by
390 a single space.
391 %<S remove all occurrences of -S from the command line.
392 Note - this command is position dependent. % commands in the
393 spec string before this one will see -S, % commands in the
394 spec string after this one will not.
395 %>S Similar to "%<S", but keep it in the GCC command line.
396 %<S* remove all occurrences of all switches beginning with -S from the
397 command line.
398 %:function(args)
399 Call the named function FUNCTION, passing it ARGS. ARGS is
400 first processed as a nested spec string, then split into an
401 argument vector in the usual fashion. The function returns
402 a string which is processed as if it had appeared literally
403 as part of the current spec.
404 %{S} substitutes the -S switch, if that switch was given to GCC.
405 If that switch was not specified, this substitutes nothing.
406 Here S is a metasyntactic variable.
407 %{S*} substitutes all the switches specified to GCC whose names start
408 with -S. This is used for -o, -I, etc; switches that take
409 arguments. GCC considers `-o foo' as being one switch whose
410 name starts with `o'. %{o*} would substitute this text,
411 including the space; thus, two arguments would be generated.
412 %{S*&T*} likewise, but preserve order of S and T options (the order
413 of S and T in the spec is not significant). Can be any number
414 of ampersand-separated variables; for each the wild card is
415 optional. Useful for CPP as %{D*&U*&A*}.
417 %{S:X} substitutes X, if the -S switch was given to GCC.
418 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
419 %{S*:X} substitutes X if one or more switches whose names start
420 with -S was given to GCC. Normally X is substituted only
421 once, no matter how many such switches appeared. However,
422 if %* appears somewhere in X, then X will be substituted
423 once for each matching switch, with the %* replaced by the
424 part of that switch that matched the '*'.
425 %{.S:X} substitutes X, if processing a file with suffix S.
426 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
427 %{,S:X} substitutes X, if processing a file which will use spec S.
428 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
430 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
431 combined with '!', '.', ',', and '*' as above binding stronger
432 than the OR.
433 If %* appears in X, all of the alternatives must be starred, and
434 only the first matching alternative is substituted.
435 %{S:X; if S was given to GCC, substitutes X;
436 T:Y; else if T was given to GCC, substitutes Y;
437 :D} else substitutes D. There can be as many clauses as you need.
438 This may be combined with '.', '!', ',', '|', and '*' as above.
440 %(Spec) processes a specification defined in a specs file as *Spec:
442 The conditional text X in a %{S:X} or similar construct may contain
443 other nested % constructs or spaces, or even newlines. They are
444 processed as usual, as described above. Trailing white space in X is
445 ignored. White space may also appear anywhere on the left side of the
446 colon in these constructs, except between . or * and the corresponding
447 word.
449 The -O, -f, -g, -m, and -W switches are handled specifically in these
450 constructs. If another value of -O or the negated form of a -f, -m, or
451 -W switch is found later in the command line, the earlier switch
452 value is ignored, except with {S*} where S is just one letter; this
453 passes all matching options.
455 The character | at the beginning of the predicate text is used to indicate
456 that a command should be piped to the following command, but only if -pipe
457 is specified.
459 Note that it is built into GCC which switches take arguments and which
460 do not. You might think it would be useful to generalize this to
461 allow each compiler's spec to say which switches take arguments. But
462 this cannot be done in a consistent fashion. GCC cannot even decide
463 which input files have been specified without knowing which switches
464 take arguments, and it must know which input files to compile in order
465 to tell which compilers to run.
467 GCC also knows implicitly that arguments starting in `-l' are to be
468 treated as compiler output files, and passed to the linker in their
469 proper position among the other output files. */
471 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
473 /* config.h can define ASM_SPEC to provide extra args to the assembler
474 or extra switch-translations. */
475 #ifndef ASM_SPEC
476 #define ASM_SPEC ""
477 #endif
479 /* config.h can define ASM_FINAL_SPEC to run a post processor after
480 the assembler has run. */
481 #ifndef ASM_FINAL_SPEC
482 #define ASM_FINAL_SPEC \
483 "%{gsplit-dwarf: \n\
484 objcopy --extract-dwo \
485 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
486 %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo} \n\
487 objcopy --strip-dwo \
488 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
490 #endif
492 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
493 or extra switch-translations. */
494 #ifndef CPP_SPEC
495 #define CPP_SPEC ""
496 #endif
498 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
499 or extra switch-translations. */
500 #ifndef CC1_SPEC
501 #define CC1_SPEC ""
502 #endif
504 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
505 or extra switch-translations. */
506 #ifndef CC1PLUS_SPEC
507 #define CC1PLUS_SPEC ""
508 #endif
510 /* config.h can define LINK_SPEC to provide extra args to the linker
511 or extra switch-translations. */
512 #ifndef LINK_SPEC
513 #define LINK_SPEC ""
514 #endif
516 /* config.h can define LIB_SPEC to override the default libraries. */
517 #ifndef LIB_SPEC
518 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
519 #endif
521 /* mudflap specs */
522 #ifndef MFWRAP_SPEC
523 /* XXX: valid only for GNU ld */
524 /* XXX: should exactly match hooks provided by libmudflap.a */
525 #define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
526 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
527 --wrap=mmap --wrap=mmap64 --wrap=munmap --wrap=alloca\
528 } %{fmudflapth: --wrap=pthread_create\
529 }} %{fmudflap|fmudflapth: --wrap=main}"
530 #endif
531 #ifndef MFLIB_SPEC
532 #define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
533 #endif
535 /* When using -fsplit-stack we need to wrap pthread_create, in order
536 to initialize the stack guard. We always use wrapping, rather than
537 shared library ordering, and we keep the wrapper function in
538 libgcc. This is not yet a real spec, though it could become one;
539 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
540 only works with GNU ld and gold. FIXME: This is incompatible with
541 -fmudflap when linking statically, which wants to do its own
542 wrapping. */
543 #define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
545 #ifndef LIBASAN_SPEC
546 #ifdef STATIC_LIBASAN_LIBS
547 #define ADD_STATIC_LIBASAN_LIBS \
548 " %{static-libasan:" STATIC_LIBASAN_LIBS "}"
549 #else
550 #define ADD_STATIC_LIBASAN_LIBS
551 #endif
552 #ifdef LIBASAN_EARLY_SPEC
553 #define LIBASAN_SPEC ADD_STATIC_LIBASAN_LIBS
554 #elif defined(HAVE_LD_STATIC_DYNAMIC)
555 #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
556 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
557 ADD_STATIC_LIBASAN_LIBS
558 #else
559 #define LIBASAN_SPEC "-lasan" ADD_STATIC_LIBASAN_LIBS
560 #endif
561 #endif
563 #ifndef LIBASAN_EARLY_SPEC
564 #define LIBASAN_EARLY_SPEC ""
565 #endif
567 #ifndef LIBTSAN_SPEC
568 #ifdef STATIC_LIBTSAN_LIBS
569 #define ADD_STATIC_LIBTSAN_LIBS \
570 " %{static-libtsan:" STATIC_LIBTSAN_LIBS "}"
571 #else
572 #define ADD_STATIC_LIBTSAN_LIBS
573 #endif
574 #ifdef LIBTSAN_EARLY_SPEC
575 #define LIBTSAN_SPEC ADD_STATIC_LIBTSAN_LIBS
576 #elif defined(HAVE_LD_STATIC_DYNAMIC)
577 #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
578 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
579 ADD_STATIC_LIBTSAN_LIBS
580 #else
581 #define LIBTSAN_SPEC "-ltsan" ADD_STATIC_LIBTSAN_LIBS
582 #endif
583 #endif
585 #ifndef LIBTSAN_EARLY_SPEC
586 #define LIBTSAN_EARLY_SPEC ""
587 #endif
589 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
590 included. */
591 #ifndef LIBGCC_SPEC
592 #if defined(REAL_LIBGCC_SPEC)
593 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
594 #elif defined(LINK_LIBGCC_SPECIAL_1)
595 /* Have gcc do the search for libgcc.a. */
596 #define LIBGCC_SPEC "libgcc.a%s"
597 #else
598 #define LIBGCC_SPEC "-lgcc"
599 #endif
600 #endif
602 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
603 #ifndef STARTFILE_SPEC
604 #define STARTFILE_SPEC \
605 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
606 #endif
608 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
609 #ifndef ENDFILE_SPEC
610 #define ENDFILE_SPEC ""
611 #endif
613 #ifndef LINKER_NAME
614 #define LINKER_NAME "collect2"
615 #endif
617 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
618 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
619 #else
620 #define ASM_MAP ""
621 #endif
623 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
624 to the assembler. */
625 #ifndef ASM_DEBUG_SPEC
626 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
627 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
628 # define ASM_DEBUG_SPEC \
629 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
630 ? "%{!g0:%{gdwarf*:--gdwarf2}%{!gdwarf*:%{g*:--gstabs}}}" ASM_MAP \
631 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
632 # else
633 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
634 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
635 # endif
636 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
637 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
638 # endif
639 # endif
640 #endif
641 #ifndef ASM_DEBUG_SPEC
642 # define ASM_DEBUG_SPEC ""
643 #endif
645 /* Here is the spec for running the linker, after compiling all files. */
647 /* This is overridable by the target in case they need to specify the
648 -lgcc and -lc order specially, yet not require them to override all
649 of LINK_COMMAND_SPEC. */
650 #ifndef LINK_GCC_C_SEQUENCE_SPEC
651 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
652 #endif
654 #ifndef LINK_SSP_SPEC
655 #ifdef TARGET_LIBC_PROVIDES_SSP
656 #define LINK_SSP_SPEC "%{fstack-protector:}"
657 #else
658 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-strong|fstack-protector-all:-lssp_nonshared -lssp}"
659 #endif
660 #endif
662 #ifndef LINK_PIE_SPEC
663 #ifdef HAVE_LD_PIE
664 #define LINK_PIE_SPEC "%{pie:-pie} "
665 #else
666 #define LINK_PIE_SPEC "%{pie:} "
667 #endif
668 #endif
670 #ifndef LINK_BUILDID_SPEC
671 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
672 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
673 # endif
674 #endif
676 /* Conditional to test whether the LTO plugin is used or not.
677 FIXME: For slim LTO we will need to enable plugin unconditionally. This
678 still cause problems with PLUGIN_LD != LD and when plugin is built but
679 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
680 plugin only when LTO is enabled. We still honor explicit
681 -fuse-linker-plugin if the linker used understands -plugin. */
683 /* The linker has some plugin support. */
684 #if HAVE_LTO_PLUGIN > 0
685 /* The linker used has full plugin support, use LTO plugin by default. */
686 #if HAVE_LTO_PLUGIN == 2
687 #define PLUGIN_COND "!fno-use-linker-plugin:%{flto|flto=*|fuse-linker-plugin"
688 #define PLUGIN_COND_CLOSE "}"
689 #else
690 /* The linker used has limited plugin support, use LTO plugin with explicit
691 -fuse-linker-plugin. */
692 #define PLUGIN_COND "fuse-linker-plugin"
693 #define PLUGIN_COND_CLOSE ""
694 #endif
695 #define LINK_PLUGIN_SPEC \
696 "%{"PLUGIN_COND": \
697 -plugin %(linker_plugin_file) \
698 -plugin-opt=%(lto_wrapper) \
699 -plugin-opt=-fresolution=%u.res \
700 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
701 }"PLUGIN_COND_CLOSE
702 #else
703 /* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
704 #define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
705 %e-fuse-linker-plugin is not supported in this configuration}"
706 #endif
708 /* Linker command line options for -fsanitize= early on the command line. */
709 #ifndef SANITIZER_EARLY_SPEC
710 #define SANITIZER_EARLY_SPEC "\
711 %{!nostdlib:%{!nodefaultlibs:%{fsanitize=address:" LIBASAN_EARLY_SPEC "} \
712 %{fsanitize=thread:" LIBTSAN_EARLY_SPEC "}}}"
713 #endif
715 /* Linker command line options for -fsanitize= late on the command line. */
716 #ifndef SANITIZER_SPEC
717 #define SANITIZER_SPEC "\
718 %{!nostdlib:%{!nodefaultlibs:%{fsanitize=address:" LIBASAN_SPEC "\
719 %{static:%ecannot specify -static with -fsanitize=address}\
720 %{fsanitize=thread:%e-fsanitize=address is incompatible with -fsanitize=thread}}\
721 %{fsanitize=thread:" LIBTSAN_SPEC "\
722 %{!pie:%{!shared:%e-fsanitize=thread linking must be done with -pie or -shared}}}}}"
723 #endif
725 /* -u* was put back because both BSD and SysV seem to support it. */
726 /* %{static:} simply prevents an error message if the target machine
727 doesn't handle -static. */
728 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
729 scripts which exist in user specified directories, or in standard
730 directories. */
731 /* We pass any -flto flags on to the linker, which is expected
732 to understand them. In practice, this means it had better be collect2. */
733 /* %{e*} includes -export-dynamic; see comment in common.opt. */
734 #ifndef LINK_COMMAND_SPEC
735 #define LINK_COMMAND_SPEC "\
736 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
737 %(linker) " \
738 LINK_PLUGIN_SPEC \
739 "%{flto|flto=*:%<fcompare-debug*} \
740 %{flto} %{flto=*} %l " LINK_PIE_SPEC \
741 "%{fuse-ld=*:-fuse-ld=%*}\
742 %X %{o*} %{e*} %{N} %{n} %{r}\
743 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\
744 %{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
745 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
746 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
747 %(mflib) " STACK_SPLIT_SPEC "\
748 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
749 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
750 %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}"
751 #endif
753 #ifndef LINK_LIBGCC_SPEC
754 /* Generate -L options for startfile prefix list. */
755 # define LINK_LIBGCC_SPEC "%D"
756 #endif
758 #ifndef STARTFILE_PREFIX_SPEC
759 # define STARTFILE_PREFIX_SPEC ""
760 #endif
762 #ifndef SYSROOT_SPEC
763 # define SYSROOT_SPEC "--sysroot=%R"
764 #endif
766 #ifndef SYSROOT_SUFFIX_SPEC
767 # define SYSROOT_SUFFIX_SPEC ""
768 #endif
770 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
771 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
772 #endif
774 static const char *asm_debug = ASM_DEBUG_SPEC;
775 static const char *cpp_spec = CPP_SPEC;
776 static const char *cc1_spec = CC1_SPEC;
777 static const char *cc1plus_spec = CC1PLUS_SPEC;
778 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
779 static const char *link_ssp_spec = LINK_SSP_SPEC;
780 static const char *asm_spec = ASM_SPEC;
781 static const char *asm_final_spec = ASM_FINAL_SPEC;
782 static const char *link_spec = LINK_SPEC;
783 static const char *lib_spec = LIB_SPEC;
784 static const char *mfwrap_spec = MFWRAP_SPEC;
785 static const char *mflib_spec = MFLIB_SPEC;
786 static const char *link_gomp_spec = "";
787 static const char *libgcc_spec = LIBGCC_SPEC;
788 static const char *endfile_spec = ENDFILE_SPEC;
789 static const char *startfile_spec = STARTFILE_SPEC;
790 static const char *linker_name_spec = LINKER_NAME;
791 static const char *linker_plugin_file_spec = "";
792 static const char *lto_wrapper_spec = "";
793 static const char *lto_gcc_spec = "";
794 static const char *link_command_spec = LINK_COMMAND_SPEC;
795 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
796 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
797 static const char *sysroot_spec = SYSROOT_SPEC;
798 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
799 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
800 static const char *self_spec = "";
802 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
803 There should be no need to override these in target dependent files,
804 but we need to copy them to the specs file so that newer versions
805 of the GCC driver can correctly drive older tool chains with the
806 appropriate -B options. */
808 /* When cpplib handles traditional preprocessing, get rid of this, and
809 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
810 that we default the front end language better. */
811 static const char *trad_capable_cpp =
812 "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
814 /* We don't wrap .d files in %W{} since a missing .d file, and
815 therefore no dependency entry, confuses make into thinking a .o
816 file that happens to exist is up-to-date. */
817 static const char *cpp_unique_options =
818 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
819 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
820 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
821 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
822 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
823 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
824 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
825 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
826 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
827 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
828 %{E|M|MM:%W{o*}}";
830 /* This contains cpp options which are common with cc1_options and are passed
831 only when preprocessing only to avoid duplication. We pass the cc1 spec
832 options to the preprocessor so that it the cc1 spec may manipulate
833 options used to set target flags. Those special target flags settings may
834 in turn cause preprocessor symbols to be defined specially. */
835 static const char *cpp_options =
836 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
837 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
838 %{undef} %{save-temps*:-fpch-preprocess}";
840 /* This contains cpp options which are not passed when the preprocessor
841 output will be used by another program. */
842 static const char *cpp_debug_options = "%{d*}";
844 /* NB: This is shared amongst all front-ends, except for Ada. */
845 static const char *cc1_options =
846 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
847 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
848 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
849 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
850 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
851 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
852 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
853 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
854 %{-target-help:--target-help}\
855 %{-version:--version}\
856 %{-help=*:--help=%*}\
857 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
858 %{fsyntax-only:-o %j} %{-param*}\
859 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
860 %{coverage:-fprofile-arcs -ftest-coverage}";
862 static const char *asm_options =
863 "%{-target-help:%:print-asm-header()} "
864 #if HAVE_GNU_AS
865 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
866 to the assembler equivalents. */
867 "%{v} %{w:-W} %{I*} "
868 #endif
869 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
871 static const char *invoke_as =
872 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
873 "%{!fwpa:\
874 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
875 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
877 #else
878 "%{!fwpa:\
879 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
880 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
882 #endif
884 /* Some compilers have limits on line lengths, and the multilib_select
885 and/or multilib_matches strings can be very long, so we build them at
886 run time. */
887 static struct obstack multilib_obstack;
888 static const char *multilib_select;
889 static const char *multilib_matches;
890 static const char *multilib_defaults;
891 static const char *multilib_exclusions;
892 static const char *multilib_reuse;
894 /* Check whether a particular argument is a default argument. */
896 #ifndef MULTILIB_DEFAULTS
897 #define MULTILIB_DEFAULTS { "" }
898 #endif
900 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
902 #ifndef DRIVER_SELF_SPECS
903 #define DRIVER_SELF_SPECS ""
904 #endif
906 /* Adding -fopenmp should imply pthreads. This is particularly important
907 for targets that use different start files and suchlike. */
908 #ifndef GOMP_SELF_SPECS
909 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
910 #endif
912 /* Likewise for -fgnu-tm. */
913 #ifndef GTM_SELF_SPECS
914 #define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
915 #endif
917 static const char *const driver_self_specs[] = {
918 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
919 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS
922 #ifndef OPTION_DEFAULT_SPECS
923 #define OPTION_DEFAULT_SPECS { "", "" }
924 #endif
926 struct default_spec
928 const char *name;
929 const char *spec;
932 static const struct default_spec
933 option_default_specs[] = { OPTION_DEFAULT_SPECS };
935 struct user_specs
937 struct user_specs *next;
938 const char *filename;
941 static struct user_specs *user_specs_head, *user_specs_tail;
944 /* Record the mapping from file suffixes for compilation specs. */
946 struct compiler
948 const char *suffix; /* Use this compiler for input files
949 whose names end in this suffix. */
951 const char *spec; /* To use this compiler, run this spec. */
953 const char *cpp_spec; /* If non-NULL, substitute this spec
954 for `%C', rather than the usual
955 cpp_spec. */
956 const int combinable; /* If nonzero, compiler can deal with
957 multiple source files at once (IMA). */
958 const int needs_preprocessing; /* If nonzero, source files need to
959 be run through a preprocessor. */
962 /* Pointer to a vector of `struct compiler' that gives the spec for
963 compiling a file, based on its suffix.
964 A file that does not end in any of these suffixes will be passed
965 unchanged to the loader and nothing else will be done to it.
967 An entry containing two 0s is used to terminate the vector.
969 If multiple entries match a file, the last matching one is used. */
971 static struct compiler *compilers;
973 /* Number of entries in `compilers', not counting the null terminator. */
975 static int n_compilers;
977 /* The default list of file name suffixes and their compilation specs. */
979 static const struct compiler default_compilers[] =
981 /* Add lists of suffixes of known languages here. If those languages
982 were not present when we built the driver, we will hit these copies
983 and be given a more meaningful error than "file not used since
984 linking is not done". */
985 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
986 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
987 {".mii", "#Objective-C++", 0, 0, 0},
988 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
989 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
990 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
991 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
992 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
993 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
994 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
995 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
996 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
997 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
998 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
999 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1000 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1001 {".r", "#Ratfor", 0, 0, 0},
1002 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1003 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1004 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
1005 {".go", "#Go", 0, 1, 0},
1006 /* Next come the entries for C. */
1007 {".c", "@c", 0, 0, 1},
1008 {"@c",
1009 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1010 external preprocessor if -save-temps is given. */
1011 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1012 %{!E:%{!M:%{!MM:\
1013 %{traditional:\
1014 %eGNU C no longer supports -traditional without -E}\
1015 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1016 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1017 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1018 %(cc1_options)}\
1019 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1020 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1021 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1022 {"-",
1023 "%{!E:%e-E or -x required when input is from standard input}\
1024 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1025 {".h", "@c-header", 0, 0, 0},
1026 {"@c-header",
1027 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1028 external preprocessor if -save-temps is given. */
1029 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1030 %{!E:%{!M:%{!MM:\
1031 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1032 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1033 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1034 %(cc1_options)\
1035 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1036 %W{o*:--output-pch=%*}}%V}\
1037 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1038 cc1 %(cpp_unique_options) %(cc1_options)\
1039 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1040 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
1041 {".i", "@cpp-output", 0, 0, 0},
1042 {"@cpp-output",
1043 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1044 {".s", "@assembler", 0, 0, 0},
1045 {"@assembler",
1046 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1047 {".sx", "@assembler-with-cpp", 0, 0, 0},
1048 {".S", "@assembler-with-cpp", 0, 0, 0},
1049 {"@assembler-with-cpp",
1050 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1051 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1052 %{E|M|MM:%(cpp_debug_options)}\
1053 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1054 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1055 #else
1056 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1057 %{E|M|MM:%(cpp_debug_options)}\
1058 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1059 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1060 #endif
1061 , 0, 0, 0},
1063 #include "specs.h"
1064 /* Mark end of table. */
1065 {0, 0, 0, 0, 0}
1068 /* Number of elements in default_compilers, not counting the terminator. */
1070 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1072 typedef char *char_p; /* For DEF_VEC_P. */
1074 /* A vector of options to give to the linker.
1075 These options are accumulated by %x,
1076 and substituted into the linker command with %X. */
1077 static vec<char_p> linker_options;
1079 /* A vector of options to give to the assembler.
1080 These options are accumulated by -Wa,
1081 and substituted into the assembler command with %Y. */
1082 static vec<char_p> assembler_options;
1084 /* A vector of options to give to the preprocessor.
1085 These options are accumulated by -Wp,
1086 and substituted into the preprocessor command with %Z. */
1087 static vec<char_p> preprocessor_options;
1089 static char *
1090 skip_whitespace (char *p)
1092 while (1)
1094 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1095 be considered whitespace. */
1096 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1097 return p + 1;
1098 else if (*p == '\n' || *p == ' ' || *p == '\t')
1099 p++;
1100 else if (*p == '#')
1102 while (*p != '\n')
1103 p++;
1104 p++;
1106 else
1107 break;
1110 return p;
1112 /* Structures to keep track of prefixes to try when looking for files. */
1114 struct prefix_list
1116 const char *prefix; /* String to prepend to the path. */
1117 struct prefix_list *next; /* Next in linked list. */
1118 int require_machine_suffix; /* Don't use without machine_suffix. */
1119 /* 2 means try both machine_suffix and just_machine_suffix. */
1120 int priority; /* Sort key - priority within list. */
1121 int os_multilib; /* 1 if OS multilib scheme should be used,
1122 0 for GCC multilib scheme. */
1125 struct path_prefix
1127 struct prefix_list *plist; /* List of prefixes to try */
1128 int max_len; /* Max length of a prefix in PLIST */
1129 const char *name; /* Name of this list (used in config stuff) */
1132 /* List of prefixes to try when looking for executables. */
1134 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1136 /* List of prefixes to try when looking for startup (crt0) files. */
1138 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1140 /* List of prefixes to try when looking for include files. */
1142 static struct path_prefix include_prefixes = { 0, 0, "include" };
1144 /* Suffix to attach to directories searched for commands.
1145 This looks like `MACHINE/VERSION/'. */
1147 static const char *machine_suffix = 0;
1149 /* Suffix to attach to directories searched for commands.
1150 This is just `MACHINE/'. */
1152 static const char *just_machine_suffix = 0;
1154 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1156 static const char *gcc_exec_prefix;
1158 /* Adjusted value of standard_libexec_prefix. */
1160 static const char *gcc_libexec_prefix;
1162 /* Default prefixes to attach to command names. */
1164 #ifndef STANDARD_STARTFILE_PREFIX_1
1165 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1166 #endif
1167 #ifndef STANDARD_STARTFILE_PREFIX_2
1168 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1169 #endif
1171 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1172 #undef MD_EXEC_PREFIX
1173 #undef MD_STARTFILE_PREFIX
1174 #undef MD_STARTFILE_PREFIX_1
1175 #endif
1177 /* If no prefixes defined, use the null string, which will disable them. */
1178 #ifndef MD_EXEC_PREFIX
1179 #define MD_EXEC_PREFIX ""
1180 #endif
1181 #ifndef MD_STARTFILE_PREFIX
1182 #define MD_STARTFILE_PREFIX ""
1183 #endif
1184 #ifndef MD_STARTFILE_PREFIX_1
1185 #define MD_STARTFILE_PREFIX_1 ""
1186 #endif
1188 /* These directories are locations set at configure-time based on the
1189 --prefix option provided to configure. Their initializers are
1190 defined in Makefile.in. These paths are not *directly* used when
1191 gcc_exec_prefix is set because, in that case, we know where the
1192 compiler has been installed, and use paths relative to that
1193 location instead. */
1194 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1195 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1196 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1197 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1199 /* For native compilers, these are well-known paths containing
1200 components that may be provided by the system. For cross
1201 compilers, these paths are not used. */
1202 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1203 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1204 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1205 static const char *const standard_startfile_prefix_1
1206 = STANDARD_STARTFILE_PREFIX_1;
1207 static const char *const standard_startfile_prefix_2
1208 = STANDARD_STARTFILE_PREFIX_2;
1210 /* A relative path to be used in finding the location of tools
1211 relative to the driver. */
1212 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1214 /* Subdirectory to use for locating libraries. Set by
1215 set_multilib_dir based on the compilation options. */
1217 static const char *multilib_dir;
1219 /* Subdirectory to use for locating libraries in OS conventions. Set by
1220 set_multilib_dir based on the compilation options. */
1222 static const char *multilib_os_dir;
1224 /* Subdirectory to use for locating libraries in multiarch conventions. Set by
1225 set_multilib_dir based on the compilation options. */
1227 static const char *multiarch_dir;
1229 /* Structure to keep track of the specs that have been defined so far.
1230 These are accessed using %(specname) in a compiler or link
1231 spec. */
1233 struct spec_list
1235 /* The following 2 fields must be first */
1236 /* to allow EXTRA_SPECS to be initialized */
1237 const char *name; /* name of the spec. */
1238 const char *ptr; /* available ptr if no static pointer */
1240 /* The following fields are not initialized */
1241 /* by EXTRA_SPECS */
1242 const char **ptr_spec; /* pointer to the spec itself. */
1243 struct spec_list *next; /* Next spec in linked list. */
1244 int name_len; /* length of the name */
1245 bool user_p; /* whether string come from file spec. */
1246 bool alloc_p; /* whether string was allocated */
1249 #define INIT_STATIC_SPEC(NAME,PTR) \
1250 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false }
1252 /* List of statically defined specs. */
1253 static struct spec_list static_specs[] =
1255 INIT_STATIC_SPEC ("asm", &asm_spec),
1256 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1257 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1258 INIT_STATIC_SPEC ("asm_options", &asm_options),
1259 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1260 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1261 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1262 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1263 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1264 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1265 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1266 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1267 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1268 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1269 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1270 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1271 INIT_STATIC_SPEC ("link", &link_spec),
1272 INIT_STATIC_SPEC ("lib", &lib_spec),
1273 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1274 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1275 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1276 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1277 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1278 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1279 INIT_STATIC_SPEC ("version", &compiler_version),
1280 INIT_STATIC_SPEC ("multilib", &multilib_select),
1281 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1282 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1283 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1284 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1285 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1286 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
1287 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1288 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1289 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1290 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1291 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1292 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1293 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1294 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1295 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1296 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1297 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1298 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1299 INIT_STATIC_SPEC ("self_spec", &self_spec),
1302 #ifdef EXTRA_SPECS /* additional specs needed */
1303 /* Structure to keep track of just the first two args of a spec_list.
1304 That is all that the EXTRA_SPECS macro gives us. */
1305 struct spec_list_1
1307 const char *const name;
1308 const char *const ptr;
1311 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1312 static struct spec_list *extra_specs = (struct spec_list *) 0;
1313 #endif
1315 /* List of dynamically allocates specs that have been defined so far. */
1317 static struct spec_list *specs = (struct spec_list *) 0;
1319 /* List of static spec functions. */
1321 static const struct spec_function static_spec_functions[] =
1323 { "getenv", getenv_spec_function },
1324 { "if-exists", if_exists_spec_function },
1325 { "if-exists-else", if_exists_else_spec_function },
1326 { "replace-outfile", replace_outfile_spec_function },
1327 { "remove-outfile", remove_outfile_spec_function },
1328 { "version-compare", version_compare_spec_function },
1329 { "include", include_spec_function },
1330 { "find-file", find_file_spec_function },
1331 { "find-plugindir", find_plugindir_spec_function },
1332 { "print-asm-header", print_asm_header_spec_function },
1333 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1334 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1335 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1336 { "pass-through-libs", pass_through_libs_spec_func },
1337 { "replace-extension", replace_extension_spec_func },
1338 #ifdef EXTRA_SPEC_FUNCTIONS
1339 EXTRA_SPEC_FUNCTIONS
1340 #endif
1341 { 0, 0 }
1344 static int processing_spec_function;
1346 /* Add appropriate libgcc specs to OBSTACK, taking into account
1347 various permutations of -shared-libgcc, -shared, and such. */
1349 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1351 #ifndef USE_LD_AS_NEEDED
1352 #define USE_LD_AS_NEEDED 0
1353 #endif
1355 static void
1356 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1357 const char *static_name, const char *eh_name)
1359 char *buf;
1361 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1362 "%{!static:%{!static-libgcc:"
1363 #if USE_LD_AS_NEEDED
1364 "%{!shared-libgcc:",
1365 static_name, " " LD_AS_NEEDED_OPTION " ",
1366 shared_name, " " LD_NO_AS_NEEDED_OPTION
1368 "%{shared-libgcc:",
1369 shared_name, "%{!shared: ", static_name, "}"
1371 #else
1372 "%{!shared:"
1373 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1374 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1376 #ifdef LINK_EH_SPEC
1377 "%{shared:"
1378 "%{shared-libgcc:", shared_name, "}"
1379 "%{!shared-libgcc:", static_name, "}"
1381 #else
1382 "%{shared:", shared_name, "}"
1383 #endif
1384 #endif
1385 "}}", NULL);
1387 obstack_grow (obstack, buf, strlen (buf));
1388 free (buf);
1390 #endif /* ENABLE_SHARED_LIBGCC */
1392 /* Initialize the specs lookup routines. */
1394 static void
1395 init_spec (void)
1397 struct spec_list *next = (struct spec_list *) 0;
1398 struct spec_list *sl = (struct spec_list *) 0;
1399 int i;
1401 if (specs)
1402 return; /* Already initialized. */
1404 if (verbose_flag)
1405 fnotice (stderr, "Using built-in specs.\n");
1407 #ifdef EXTRA_SPECS
1408 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1410 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1412 sl = &extra_specs[i];
1413 sl->name = extra_specs_1[i].name;
1414 sl->ptr = extra_specs_1[i].ptr;
1415 sl->next = next;
1416 sl->name_len = strlen (sl->name);
1417 sl->ptr_spec = &sl->ptr;
1418 next = sl;
1420 #endif
1422 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1424 sl = &static_specs[i];
1425 sl->next = next;
1426 next = sl;
1429 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1430 /* ??? If neither -shared-libgcc nor --static-libgcc was
1431 seen, then we should be making an educated guess. Some proposed
1432 heuristics for ELF include:
1434 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1435 program will be doing dynamic loading, which will likely
1436 need the shared libgcc.
1438 (2) If "-ldl", then it's also a fair bet that we're doing
1439 dynamic loading.
1441 (3) For each ET_DYN we're linking against (either through -lfoo
1442 or /some/path/foo.so), check to see whether it or one of
1443 its dependencies depends on a shared libgcc.
1445 (4) If "-shared"
1447 If the runtime is fixed to look for program headers instead
1448 of calling __register_frame_info at all, for each object,
1449 use the shared libgcc if any EH symbol referenced.
1451 If crtstuff is fixed to not invoke __register_frame_info
1452 automatically, for each object, use the shared libgcc if
1453 any non-empty unwind section found.
1455 Doing any of this probably requires invoking an external program to
1456 do the actual object file scanning. */
1458 const char *p = libgcc_spec;
1459 int in_sep = 1;
1461 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1462 when given the proper command line arguments. */
1463 while (*p)
1465 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1467 init_gcc_specs (&obstack,
1468 "-lgcc_s"
1469 #ifdef USE_LIBUNWIND_EXCEPTIONS
1470 " -lunwind"
1471 #endif
1473 "-lgcc",
1474 "-lgcc_eh"
1475 #ifdef USE_LIBUNWIND_EXCEPTIONS
1476 # ifdef HAVE_LD_STATIC_DYNAMIC
1477 " %{!static:" LD_STATIC_OPTION "} -lunwind"
1478 " %{!static:" LD_DYNAMIC_OPTION "}"
1479 # else
1480 " -lunwind"
1481 # endif
1482 #endif
1485 p += 5;
1486 in_sep = 0;
1488 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1490 /* Ug. We don't know shared library extensions. Hope that
1491 systems that use this form don't do shared libraries. */
1492 init_gcc_specs (&obstack,
1493 "-lgcc_s",
1494 "libgcc.a%s",
1495 "libgcc_eh.a%s"
1496 #ifdef USE_LIBUNWIND_EXCEPTIONS
1497 " -lunwind"
1498 #endif
1500 p += 10;
1501 in_sep = 0;
1503 else
1505 obstack_1grow (&obstack, *p);
1506 in_sep = (*p == ' ');
1507 p += 1;
1511 obstack_1grow (&obstack, '\0');
1512 libgcc_spec = XOBFINISH (&obstack, const char *);
1514 #endif
1515 #ifdef USE_AS_TRADITIONAL_FORMAT
1516 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1518 static const char tf[] = "--traditional-format ";
1519 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1520 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1521 asm_spec = XOBFINISH (&obstack, const char *);
1523 #endif
1525 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1526 defined LINKER_HASH_STYLE
1527 # ifdef LINK_BUILDID_SPEC
1528 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1529 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
1530 # endif
1531 # ifdef LINK_EH_SPEC
1532 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1533 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1534 # endif
1535 # ifdef LINKER_HASH_STYLE
1536 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1537 before. */
1539 static const char hash_style[] = "--hash-style=";
1540 obstack_grow (&obstack, hash_style, sizeof(hash_style) - 1);
1541 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof(LINKER_HASH_STYLE) - 1);
1542 obstack_1grow (&obstack, ' ');
1544 # endif
1545 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1546 link_spec = XOBFINISH (&obstack, const char *);
1547 #endif
1549 specs = sl;
1552 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1553 removed; If the spec starts with a + then SPEC is added to the end of the
1554 current spec. */
1556 static void
1557 set_spec (const char *name, const char *spec, bool user_p)
1559 struct spec_list *sl;
1560 const char *old_spec;
1561 int name_len = strlen (name);
1562 int i;
1564 /* If this is the first call, initialize the statically allocated specs. */
1565 if (!specs)
1567 struct spec_list *next = (struct spec_list *) 0;
1568 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1570 sl = &static_specs[i];
1571 sl->next = next;
1572 next = sl;
1574 specs = sl;
1577 /* See if the spec already exists. */
1578 for (sl = specs; sl; sl = sl->next)
1579 if (name_len == sl->name_len && !strcmp (sl->name, name))
1580 break;
1582 if (!sl)
1584 /* Not found - make it. */
1585 sl = XNEW (struct spec_list);
1586 sl->name = xstrdup (name);
1587 sl->name_len = name_len;
1588 sl->ptr_spec = &sl->ptr;
1589 sl->alloc_p = 0;
1590 *(sl->ptr_spec) = "";
1591 sl->next = specs;
1592 specs = sl;
1595 old_spec = *(sl->ptr_spec);
1596 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1597 ? concat (old_spec, spec + 1, NULL)
1598 : xstrdup (spec));
1600 #ifdef DEBUG_SPECS
1601 if (verbose_flag)
1602 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1603 #endif
1605 /* Free the old spec. */
1606 if (old_spec && sl->alloc_p)
1607 free (CONST_CAST(char *, old_spec));
1609 sl->user_p = user_p;
1610 sl->alloc_p = true;
1613 /* Accumulate a command (program name and args), and run it. */
1615 typedef const char *const_char_p; /* For DEF_VEC_P. */
1617 /* Vector of pointers to arguments in the current line of specifications. */
1619 static vec<const_char_p> argbuf;
1621 /* Position in the argbuf vector containing the name of the output file
1622 (the value associated with the "-o" flag). */
1624 static int have_o_argbuf_index = 0;
1626 /* Were the options -c, -S or -E passed. */
1627 static int have_c = 0;
1629 /* Was the option -o passed. */
1630 static int have_o = 0;
1632 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1633 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1634 it here. */
1636 static struct temp_name {
1637 const char *suffix; /* suffix associated with the code. */
1638 int length; /* strlen (suffix). */
1639 int unique; /* Indicates whether %g or %u/%U was used. */
1640 const char *filename; /* associated filename. */
1641 int filename_length; /* strlen (filename). */
1642 struct temp_name *next;
1643 } *temp_names;
1645 /* Number of commands executed so far. */
1647 static int execution_count;
1649 /* Number of commands that exited with a signal. */
1651 static int signal_count;
1653 /* Allocate the argument vector. */
1655 static void
1656 alloc_args (void)
1658 argbuf.create (10);
1661 /* Clear out the vector of arguments (after a command is executed). */
1663 static void
1664 clear_args (void)
1666 argbuf.truncate (0);
1669 /* Add one argument to the vector at the end.
1670 This is done when a space is seen or at the end of the line.
1671 If DELETE_ALWAYS is nonzero, the arg is a filename
1672 and the file should be deleted eventually.
1673 If DELETE_FAILURE is nonzero, the arg is a filename
1674 and the file should be deleted if this compilation fails. */
1676 static void
1677 store_arg (const char *arg, int delete_always, int delete_failure)
1679 argbuf.safe_push (arg);
1681 if (strcmp (arg, "-o") == 0)
1682 have_o_argbuf_index = argbuf.length ();
1683 if (delete_always || delete_failure)
1685 const char *p;
1686 /* If the temporary file we should delete is specified as
1687 part of a joined argument extract the filename. */
1688 if (arg[0] == '-'
1689 && (p = strrchr (arg, '=')))
1690 arg = p + 1;
1691 record_temp_file (arg, delete_always, delete_failure);
1695 /* Load specs from a file name named FILENAME, replacing occurrences of
1696 various different types of line-endings, \r\n, \n\r and just \r, with
1697 a single \n. */
1699 static char *
1700 load_specs (const char *filename)
1702 int desc;
1703 int readlen;
1704 struct stat statbuf;
1705 char *buffer;
1706 char *buffer_p;
1707 char *specs;
1708 char *specs_p;
1710 if (verbose_flag)
1711 fnotice (stderr, "Reading specs from %s\n", filename);
1713 /* Open and stat the file. */
1714 desc = open (filename, O_RDONLY, 0);
1715 if (desc < 0)
1716 pfatal_with_name (filename);
1717 if (stat (filename, &statbuf) < 0)
1718 pfatal_with_name (filename);
1720 /* Read contents of file into BUFFER. */
1721 buffer = XNEWVEC (char, statbuf.st_size + 1);
1722 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1723 if (readlen < 0)
1724 pfatal_with_name (filename);
1725 buffer[readlen] = 0;
1726 close (desc);
1728 specs = XNEWVEC (char, readlen + 1);
1729 specs_p = specs;
1730 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1732 int skip = 0;
1733 char c = *buffer_p;
1734 if (c == '\r')
1736 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
1737 skip = 1;
1738 else if (*(buffer_p + 1) == '\n') /* \r\n */
1739 skip = 1;
1740 else /* \r */
1741 c = '\n';
1743 if (! skip)
1744 *specs_p++ = c;
1746 *specs_p = '\0';
1748 free (buffer);
1749 return (specs);
1752 /* Read compilation specs from a file named FILENAME,
1753 replacing the default ones.
1755 A suffix which starts with `*' is a definition for
1756 one of the machine-specific sub-specs. The "suffix" should be
1757 *asm, *cc1, *cpp, *link, *startfile, etc.
1758 The corresponding spec is stored in asm_spec, etc.,
1759 rather than in the `compilers' vector.
1761 Anything invalid in the file is a fatal error. */
1763 static void
1764 read_specs (const char *filename, bool main_p, bool user_p)
1766 char *buffer;
1767 char *p;
1769 buffer = load_specs (filename);
1771 /* Scan BUFFER for specs, putting them in the vector. */
1772 p = buffer;
1773 while (1)
1775 char *suffix;
1776 char *spec;
1777 char *in, *out, *p1, *p2, *p3;
1779 /* Advance P in BUFFER to the next nonblank nocomment line. */
1780 p = skip_whitespace (p);
1781 if (*p == 0)
1782 break;
1784 /* Is this a special command that starts with '%'? */
1785 /* Don't allow this for the main specs file, since it would
1786 encourage people to overwrite it. */
1787 if (*p == '%' && !main_p)
1789 p1 = p;
1790 while (*p && *p != '\n')
1791 p++;
1793 /* Skip '\n'. */
1794 p++;
1796 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
1797 && (p1[sizeof "%include" - 1] == ' '
1798 || p1[sizeof "%include" - 1] == '\t'))
1800 char *new_filename;
1802 p1 += sizeof ("%include");
1803 while (*p1 == ' ' || *p1 == '\t')
1804 p1++;
1806 if (*p1++ != '<' || p[-2] != '>')
1807 fatal_error ("specs %%include syntax malformed after "
1808 "%ld characters",
1809 (long) (p1 - buffer + 1));
1811 p[-2] = '\0';
1812 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
1813 read_specs (new_filename ? new_filename : p1, false, user_p);
1814 continue;
1816 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1817 && (p1[sizeof "%include_noerr" - 1] == ' '
1818 || p1[sizeof "%include_noerr" - 1] == '\t'))
1820 char *new_filename;
1822 p1 += sizeof "%include_noerr";
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 if (new_filename)
1834 read_specs (new_filename, false, user_p);
1835 else if (verbose_flag)
1836 fnotice (stderr, "could not find specs file %s\n", p1);
1837 continue;
1839 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1840 && (p1[sizeof "%rename" - 1] == ' '
1841 || p1[sizeof "%rename" - 1] == '\t'))
1843 int name_len;
1844 struct spec_list *sl;
1845 struct spec_list *newsl;
1847 /* Get original name. */
1848 p1 += sizeof "%rename";
1849 while (*p1 == ' ' || *p1 == '\t')
1850 p1++;
1852 if (! ISALPHA ((unsigned char) *p1))
1853 fatal_error ("specs %%rename syntax malformed after "
1854 "%ld characters",
1855 (long) (p1 - buffer));
1857 p2 = p1;
1858 while (*p2 && !ISSPACE ((unsigned char) *p2))
1859 p2++;
1861 if (*p2 != ' ' && *p2 != '\t')
1862 fatal_error ("specs %%rename syntax malformed after "
1863 "%ld characters",
1864 (long) (p2 - buffer));
1866 name_len = p2 - p1;
1867 *p2++ = '\0';
1868 while (*p2 == ' ' || *p2 == '\t')
1869 p2++;
1871 if (! ISALPHA ((unsigned char) *p2))
1872 fatal_error ("specs %%rename syntax malformed after "
1873 "%ld characters",
1874 (long) (p2 - buffer));
1876 /* Get new spec name. */
1877 p3 = p2;
1878 while (*p3 && !ISSPACE ((unsigned char) *p3))
1879 p3++;
1881 if (p3 != p - 1)
1882 fatal_error ("specs %%rename syntax malformed after "
1883 "%ld characters",
1884 (long) (p3 - buffer));
1885 *p3 = '\0';
1887 for (sl = specs; sl; sl = sl->next)
1888 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1889 break;
1891 if (!sl)
1892 fatal_error ("specs %s spec was not found to be renamed", p1);
1894 if (strcmp (p1, p2) == 0)
1895 continue;
1897 for (newsl = specs; newsl; newsl = newsl->next)
1898 if (strcmp (newsl->name, p2) == 0)
1899 fatal_error ("%s: attempt to rename spec %qs to "
1900 "already defined spec %qs",
1901 filename, p1, p2);
1903 if (verbose_flag)
1905 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
1906 #ifdef DEBUG_SPECS
1907 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
1908 #endif
1911 set_spec (p2, *(sl->ptr_spec), user_p);
1912 if (sl->alloc_p)
1913 free (CONST_CAST (char *, *(sl->ptr_spec)));
1915 *(sl->ptr_spec) = "";
1916 sl->alloc_p = 0;
1917 continue;
1919 else
1920 fatal_error ("specs unknown %% command after %ld characters",
1921 (long) (p1 - buffer));
1924 /* Find the colon that should end the suffix. */
1925 p1 = p;
1926 while (*p1 && *p1 != ':' && *p1 != '\n')
1927 p1++;
1929 /* The colon shouldn't be missing. */
1930 if (*p1 != ':')
1931 fatal_error ("specs file malformed after %ld characters",
1932 (long) (p1 - buffer));
1934 /* Skip back over trailing whitespace. */
1935 p2 = p1;
1936 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1937 p2--;
1939 /* Copy the suffix to a string. */
1940 suffix = save_string (p, p2 - p);
1941 /* Find the next line. */
1942 p = skip_whitespace (p1 + 1);
1943 if (p[1] == 0)
1944 fatal_error ("specs file malformed after %ld characters",
1945 (long) (p - buffer));
1947 p1 = p;
1948 /* Find next blank line or end of string. */
1949 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
1950 p1++;
1952 /* Specs end at the blank line and do not include the newline. */
1953 spec = save_string (p, p1 - p);
1954 p = p1;
1956 /* Delete backslash-newline sequences from the spec. */
1957 in = spec;
1958 out = spec;
1959 while (*in != 0)
1961 if (in[0] == '\\' && in[1] == '\n')
1962 in += 2;
1963 else if (in[0] == '#')
1964 while (*in && *in != '\n')
1965 in++;
1967 else
1968 *out++ = *in++;
1970 *out = 0;
1972 if (suffix[0] == '*')
1974 if (! strcmp (suffix, "*link_command"))
1975 link_command_spec = spec;
1976 else
1977 set_spec (suffix + 1, spec, user_p);
1979 else
1981 /* Add this pair to the vector. */
1982 compilers
1983 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
1985 compilers[n_compilers].suffix = suffix;
1986 compilers[n_compilers].spec = spec;
1987 n_compilers++;
1988 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
1991 if (*suffix == 0)
1992 link_command_spec = spec;
1995 if (link_command_spec == 0)
1996 fatal_error ("spec file has no spec for linking");
1999 /* Record the names of temporary files we tell compilers to write,
2000 and delete them at the end of the run. */
2002 /* This is the common prefix we use to make temp file names.
2003 It is chosen once for each run of this program.
2004 It is substituted into a spec by %g or %j.
2005 Thus, all temp file names contain this prefix.
2006 In practice, all temp file names start with this prefix.
2008 This prefix comes from the envvar TMPDIR if it is defined;
2009 otherwise, from the P_tmpdir macro if that is defined;
2010 otherwise, in /usr/tmp or /tmp;
2011 or finally the current directory if all else fails. */
2013 static const char *temp_filename;
2015 /* Length of the prefix. */
2017 static int temp_filename_length;
2019 /* Define the list of temporary files to delete. */
2021 struct temp_file
2023 const char *name;
2024 struct temp_file *next;
2027 /* Queue of files to delete on success or failure of compilation. */
2028 static struct temp_file *always_delete_queue;
2029 /* Queue of files to delete on failure of compilation. */
2030 static struct temp_file *failure_delete_queue;
2032 /* Record FILENAME as a file to be deleted automatically.
2033 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2034 otherwise delete it in any case.
2035 FAIL_DELETE nonzero means delete it if a compilation step fails;
2036 otherwise delete it in any case. */
2038 void
2039 record_temp_file (const char *filename, int always_delete, int fail_delete)
2041 char *const name = xstrdup (filename);
2043 if (always_delete)
2045 struct temp_file *temp;
2046 for (temp = always_delete_queue; temp; temp = temp->next)
2047 if (! filename_cmp (name, temp->name))
2048 goto already1;
2050 temp = XNEW (struct temp_file);
2051 temp->next = always_delete_queue;
2052 temp->name = name;
2053 always_delete_queue = temp;
2055 already1:;
2058 if (fail_delete)
2060 struct temp_file *temp;
2061 for (temp = failure_delete_queue; temp; temp = temp->next)
2062 if (! filename_cmp (name, temp->name))
2064 free (name);
2065 goto already2;
2068 temp = XNEW (struct temp_file);
2069 temp->next = failure_delete_queue;
2070 temp->name = name;
2071 failure_delete_queue = temp;
2073 already2:;
2077 /* Delete all the temporary files whose names we previously recorded. */
2079 #ifndef DELETE_IF_ORDINARY
2080 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2081 do \
2083 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2084 if (unlink (NAME) < 0) \
2085 if (VERBOSE_FLAG) \
2086 perror_with_name (NAME); \
2087 } while (0)
2088 #endif
2090 static void
2091 delete_if_ordinary (const char *name)
2093 struct stat st;
2094 #ifdef DEBUG
2095 int i, c;
2097 printf ("Delete %s? (y or n) ", name);
2098 fflush (stdout);
2099 i = getchar ();
2100 if (i != '\n')
2101 while ((c = getchar ()) != '\n' && c != EOF)
2104 if (i == 'y' || i == 'Y')
2105 #endif /* DEBUG */
2106 DELETE_IF_ORDINARY (name, st, verbose_flag);
2109 static void
2110 delete_temp_files (void)
2112 struct temp_file *temp;
2114 for (temp = always_delete_queue; temp; temp = temp->next)
2115 delete_if_ordinary (temp->name);
2116 always_delete_queue = 0;
2119 /* Delete all the files to be deleted on error. */
2121 static void
2122 delete_failure_queue (void)
2124 struct temp_file *temp;
2126 for (temp = failure_delete_queue; temp; temp = temp->next)
2127 delete_if_ordinary (temp->name);
2130 static void
2131 clear_failure_queue (void)
2133 failure_delete_queue = 0;
2136 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2137 returns non-NULL.
2138 If DO_MULTI is true iterate over the paths twice, first with multilib
2139 suffix then without, otherwise iterate over the paths once without
2140 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2141 to avoid visiting the same path twice, but we could do better. For
2142 instance, /usr/lib/../lib is considered different from /usr/lib.
2143 At least EXTRA_SPACE chars past the end of the path passed to
2144 CALLBACK are available for use by the callback.
2145 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2147 Returns the value returned by CALLBACK. */
2149 static void *
2150 for_each_path (const struct path_prefix *paths,
2151 bool do_multi,
2152 size_t extra_space,
2153 void *(*callback) (char *, void *),
2154 void *callback_info)
2156 struct prefix_list *pl;
2157 const char *multi_dir = NULL;
2158 const char *multi_os_dir = NULL;
2159 const char *multiarch_suffix = NULL;
2160 const char *multi_suffix;
2161 const char *just_multi_suffix;
2162 char *path = NULL;
2163 void *ret = NULL;
2164 bool skip_multi_dir = false;
2165 bool skip_multi_os_dir = false;
2167 multi_suffix = machine_suffix;
2168 just_multi_suffix = just_machine_suffix;
2169 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2171 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2172 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2173 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2175 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2176 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2177 if (multiarch_dir)
2178 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
2180 while (1)
2182 size_t multi_dir_len = 0;
2183 size_t multi_os_dir_len = 0;
2184 size_t multiarch_len = 0;
2185 size_t suffix_len;
2186 size_t just_suffix_len;
2187 size_t len;
2189 if (multi_dir)
2190 multi_dir_len = strlen (multi_dir);
2191 if (multi_os_dir)
2192 multi_os_dir_len = strlen (multi_os_dir);
2193 if (multiarch_suffix)
2194 multiarch_len = strlen (multiarch_suffix);
2195 suffix_len = strlen (multi_suffix);
2196 just_suffix_len = strlen (just_multi_suffix);
2198 if (path == NULL)
2200 len = paths->max_len + extra_space + 1;
2201 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
2202 path = XNEWVEC (char, len);
2205 for (pl = paths->plist; pl != 0; pl = pl->next)
2207 len = strlen (pl->prefix);
2208 memcpy (path, pl->prefix, len);
2210 /* Look first in MACHINE/VERSION subdirectory. */
2211 if (!skip_multi_dir)
2213 memcpy (path + len, multi_suffix, suffix_len + 1);
2214 ret = callback (path, callback_info);
2215 if (ret)
2216 break;
2219 /* Some paths are tried with just the machine (ie. target)
2220 subdir. This is used for finding as, ld, etc. */
2221 if (!skip_multi_dir
2222 && pl->require_machine_suffix == 2)
2224 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2225 ret = callback (path, callback_info);
2226 if (ret)
2227 break;
2230 /* Now try the multiarch path. */
2231 if (!skip_multi_dir
2232 && !pl->require_machine_suffix && multiarch_dir)
2234 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2235 ret = callback (path, callback_info);
2236 if (ret)
2237 break;
2240 /* Now try the base path. */
2241 if (!pl->require_machine_suffix
2242 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2244 const char *this_multi;
2245 size_t this_multi_len;
2247 if (pl->os_multilib)
2249 this_multi = multi_os_dir;
2250 this_multi_len = multi_os_dir_len;
2252 else
2254 this_multi = multi_dir;
2255 this_multi_len = multi_dir_len;
2258 if (this_multi_len)
2259 memcpy (path + len, this_multi, this_multi_len + 1);
2260 else
2261 path[len] = '\0';
2263 ret = callback (path, callback_info);
2264 if (ret)
2265 break;
2268 if (pl)
2269 break;
2271 if (multi_dir == NULL && multi_os_dir == NULL)
2272 break;
2274 /* Run through the paths again, this time without multilibs.
2275 Don't repeat any we have already seen. */
2276 if (multi_dir)
2278 free (CONST_CAST (char *, multi_dir));
2279 multi_dir = NULL;
2280 free (CONST_CAST (char *, multi_suffix));
2281 multi_suffix = machine_suffix;
2282 free (CONST_CAST (char *, just_multi_suffix));
2283 just_multi_suffix = just_machine_suffix;
2285 else
2286 skip_multi_dir = true;
2287 if (multi_os_dir)
2289 free (CONST_CAST (char *, multi_os_dir));
2290 multi_os_dir = NULL;
2292 else
2293 skip_multi_os_dir = true;
2296 if (multi_dir)
2298 free (CONST_CAST (char *, multi_dir));
2299 free (CONST_CAST (char *, multi_suffix));
2300 free (CONST_CAST (char *, just_multi_suffix));
2302 if (multi_os_dir)
2303 free (CONST_CAST (char *, multi_os_dir));
2304 if (ret != path)
2305 free (path);
2306 return ret;
2309 /* Callback for build_search_list. Adds path to obstack being built. */
2311 struct add_to_obstack_info {
2312 struct obstack *ob;
2313 bool check_dir;
2314 bool first_time;
2317 static void *
2318 add_to_obstack (char *path, void *data)
2320 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2322 if (info->check_dir && !is_directory (path, false))
2323 return NULL;
2325 if (!info->first_time)
2326 obstack_1grow (info->ob, PATH_SEPARATOR);
2328 obstack_grow (info->ob, path, strlen (path));
2330 info->first_time = false;
2331 return NULL;
2334 /* Add or change the value of an environment variable, outputting the
2335 change to standard error if in verbose mode. */
2336 static void
2337 xputenv (const char *string)
2339 if (verbose_flag)
2340 fnotice (stderr, "%s\n", string);
2341 putenv (CONST_CAST (char *, string));
2344 /* Build a list of search directories from PATHS.
2345 PREFIX is a string to prepend to the list.
2346 If CHECK_DIR_P is true we ensure the directory exists.
2347 If DO_MULTI is true, multilib paths are output first, then
2348 non-multilib paths.
2349 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2350 It is also used by the --print-search-dirs flag. */
2352 static char *
2353 build_search_list (const struct path_prefix *paths, const char *prefix,
2354 bool check_dir, bool do_multi)
2356 struct add_to_obstack_info info;
2358 info.ob = &collect_obstack;
2359 info.check_dir = check_dir;
2360 info.first_time = true;
2362 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2363 obstack_1grow (&collect_obstack, '=');
2365 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2367 obstack_1grow (&collect_obstack, '\0');
2368 return XOBFINISH (&collect_obstack, char *);
2371 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2372 for collect. */
2374 static void
2375 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2376 bool do_multi)
2378 xputenv (build_search_list (paths, env_var, true, do_multi));
2381 /* Check whether NAME can be accessed in MODE. This is like access,
2382 except that it never considers directories to be executable. */
2384 static int
2385 access_check (const char *name, int mode)
2387 if (mode == X_OK)
2389 struct stat st;
2391 if (stat (name, &st) < 0
2392 || S_ISDIR (st.st_mode))
2393 return -1;
2396 return access (name, mode);
2399 /* Callback for find_a_file. Appends the file name to the directory
2400 path. If the resulting file exists in the right mode, return the
2401 full pathname to the file. */
2403 struct file_at_path_info {
2404 const char *name;
2405 const char *suffix;
2406 int name_len;
2407 int suffix_len;
2408 int mode;
2411 static void *
2412 file_at_path (char *path, void *data)
2414 struct file_at_path_info *info = (struct file_at_path_info *) data;
2415 size_t len = strlen (path);
2417 memcpy (path + len, info->name, info->name_len);
2418 len += info->name_len;
2420 /* Some systems have a suffix for executable files.
2421 So try appending that first. */
2422 if (info->suffix_len)
2424 memcpy (path + len, info->suffix, info->suffix_len + 1);
2425 if (access_check (path, info->mode) == 0)
2426 return path;
2429 path[len] = '\0';
2430 if (access_check (path, info->mode) == 0)
2431 return path;
2433 return NULL;
2436 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2437 access to check permissions. If DO_MULTI is true, search multilib
2438 paths then non-multilib paths, otherwise do not search multilib paths.
2439 Return 0 if not found, otherwise return its name, allocated with malloc. */
2441 static char *
2442 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2443 bool do_multi)
2445 struct file_at_path_info info;
2447 #ifdef DEFAULT_ASSEMBLER
2448 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2449 return xstrdup (DEFAULT_ASSEMBLER);
2450 #endif
2452 #ifdef DEFAULT_LINKER
2453 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2454 return xstrdup (DEFAULT_LINKER);
2455 #endif
2457 /* Determine the filename to execute (special case for absolute paths). */
2459 if (IS_ABSOLUTE_PATH (name))
2461 if (access (name, mode) == 0)
2462 return xstrdup (name);
2464 return NULL;
2467 info.name = name;
2468 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2469 info.name_len = strlen (info.name);
2470 info.suffix_len = strlen (info.suffix);
2471 info.mode = mode;
2473 return (char*) for_each_path (pprefix, do_multi,
2474 info.name_len + info.suffix_len,
2475 file_at_path, &info);
2478 /* Ranking of prefixes in the sort list. -B prefixes are put before
2479 all others. */
2481 enum path_prefix_priority
2483 PREFIX_PRIORITY_B_OPT,
2484 PREFIX_PRIORITY_LAST
2487 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2488 order according to PRIORITY. Within each PRIORITY, new entries are
2489 appended.
2491 If WARN is nonzero, we will warn if no file is found
2492 through this prefix. WARN should point to an int
2493 which will be set to 1 if this entry is used.
2495 COMPONENT is the value to be passed to update_path.
2497 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2498 the complete value of machine_suffix.
2499 2 means try both machine_suffix and just_machine_suffix. */
2501 static void
2502 add_prefix (struct path_prefix *pprefix, const char *prefix,
2503 const char *component, /* enum prefix_priority */ int priority,
2504 int require_machine_suffix, int os_multilib)
2506 struct prefix_list *pl, **prev;
2507 int len;
2509 for (prev = &pprefix->plist;
2510 (*prev) != NULL && (*prev)->priority <= priority;
2511 prev = &(*prev)->next)
2514 /* Keep track of the longest prefix. */
2516 prefix = update_path (prefix, component);
2517 len = strlen (prefix);
2518 if (len > pprefix->max_len)
2519 pprefix->max_len = len;
2521 pl = XNEW (struct prefix_list);
2522 pl->prefix = prefix;
2523 pl->require_machine_suffix = require_machine_suffix;
2524 pl->priority = priority;
2525 pl->os_multilib = os_multilib;
2527 /* Insert after PREV. */
2528 pl->next = (*prev);
2529 (*prev) = pl;
2532 /* Same as add_prefix, but prepending target_system_root to prefix. */
2533 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2534 static void
2535 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2536 const char *component,
2537 /* enum prefix_priority */ int priority,
2538 int require_machine_suffix, int os_multilib)
2540 if (!IS_ABSOLUTE_PATH (prefix))
2541 fatal_error ("system path %qs is not absolute", prefix);
2543 if (target_system_root)
2545 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2546 size_t sysroot_len = strlen (target_system_root);
2548 if (sysroot_len > 0
2549 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2550 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2552 if (target_sysroot_suffix)
2553 prefix = concat (sysroot_no_trailing_dir_separator,
2554 target_sysroot_suffix, prefix, NULL);
2555 else
2556 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
2558 free (sysroot_no_trailing_dir_separator);
2560 /* We have to override this because GCC's notion of sysroot
2561 moves along with GCC. */
2562 component = "GCC";
2565 add_prefix (pprefix, prefix, component, priority,
2566 require_machine_suffix, os_multilib);
2569 /* Execute the command specified by the arguments on the current line of spec.
2570 When using pipes, this includes several piped-together commands
2571 with `|' between them.
2573 Return 0 if successful, -1 if failed. */
2575 static int
2576 execute (void)
2578 int i;
2579 int n_commands; /* # of command. */
2580 char *string;
2581 struct pex_obj *pex;
2582 struct command
2584 const char *prog; /* program name. */
2585 const char **argv; /* vector of args. */
2587 const char *arg;
2589 struct command *commands; /* each command buffer with above info. */
2591 gcc_assert (!processing_spec_function);
2593 if (wrapper_string)
2595 string = find_a_file (&exec_prefixes,
2596 argbuf[0], X_OK, false);
2597 if (string)
2598 argbuf[0] = string;
2599 insert_wrapper (wrapper_string);
2602 /* Count # of piped commands. */
2603 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
2604 if (strcmp (arg, "|") == 0)
2605 n_commands++;
2607 /* Get storage for each command. */
2608 commands = (struct command *) alloca (n_commands * sizeof (struct command));
2610 /* Split argbuf into its separate piped processes,
2611 and record info about each one.
2612 Also search for the programs that are to be run. */
2614 argbuf.safe_push (0);
2616 commands[0].prog = argbuf[0]; /* first command. */
2617 commands[0].argv = argbuf.address ();
2619 if (!wrapper_string)
2621 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2622 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2625 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
2626 if (arg && strcmp (arg, "|") == 0)
2627 { /* each command. */
2628 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2629 fatal_error ("-pipe not supported");
2630 #endif
2631 argbuf[i] = 0; /* Termination of
2632 command args. */
2633 commands[n_commands].prog = argbuf[i + 1];
2634 commands[n_commands].argv
2635 = &(argbuf.address ())[i + 1];
2636 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2637 X_OK, false);
2638 if (string)
2639 commands[n_commands].argv[0] = string;
2640 n_commands++;
2643 /* If -v, print what we are about to do, and maybe query. */
2645 if (verbose_flag)
2647 /* For help listings, put a blank line between sub-processes. */
2648 if (print_help_list)
2649 fputc ('\n', stderr);
2651 /* Print each piped command as a separate line. */
2652 for (i = 0; i < n_commands; i++)
2654 const char *const *j;
2656 if (verbose_only_flag)
2658 for (j = commands[i].argv; *j; j++)
2660 const char *p;
2661 for (p = *j; *p; ++p)
2662 if (!ISALNUM ((unsigned char) *p)
2663 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
2664 break;
2665 if (*p || !*j)
2667 fprintf (stderr, " \"");
2668 for (p = *j; *p; ++p)
2670 if (*p == '"' || *p == '\\' || *p == '$')
2671 fputc ('\\', stderr);
2672 fputc (*p, stderr);
2674 fputc ('"', stderr);
2676 /* If it's empty, print "". */
2677 else if (!**j)
2678 fprintf (stderr, " \"\"");
2679 else
2680 fprintf (stderr, " %s", *j);
2683 else
2684 for (j = commands[i].argv; *j; j++)
2685 /* If it's empty, print "". */
2686 if (!**j)
2687 fprintf (stderr, " \"\"");
2688 else
2689 fprintf (stderr, " %s", *j);
2691 /* Print a pipe symbol after all but the last command. */
2692 if (i + 1 != n_commands)
2693 fprintf (stderr, " |");
2694 fprintf (stderr, "\n");
2696 fflush (stderr);
2697 if (verbose_only_flag != 0)
2699 /* verbose_only_flag should act as if the spec was
2700 executed, so increment execution_count before
2701 returning. This prevents spurious warnings about
2702 unused linker input files, etc. */
2703 execution_count++;
2704 return 0;
2706 #ifdef DEBUG
2707 fnotice (stderr, "\nGo ahead? (y or n) ");
2708 fflush (stderr);
2709 i = getchar ();
2710 if (i != '\n')
2711 while (getchar () != '\n')
2714 if (i != 'y' && i != 'Y')
2715 return 0;
2716 #endif /* DEBUG */
2719 #ifdef ENABLE_VALGRIND_CHECKING
2720 /* Run the each command through valgrind. To simplify prepending the
2721 path to valgrind and the option "-q" (for quiet operation unless
2722 something triggers), we allocate a separate argv array. */
2724 for (i = 0; i < n_commands; i++)
2726 const char **argv;
2727 int argc;
2728 int j;
2730 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
2733 argv = XALLOCAVEC (const char *, argc + 3);
2735 argv[0] = VALGRIND_PATH;
2736 argv[1] = "-q";
2737 for (j = 2; j < argc + 2; j++)
2738 argv[j] = commands[i].argv[j - 2];
2739 argv[j] = NULL;
2741 commands[i].argv = argv;
2742 commands[i].prog = argv[0];
2744 #endif
2746 /* Run each piped subprocess. */
2748 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
2749 ? PEX_RECORD_TIMES : 0),
2750 progname, temp_filename);
2751 if (pex == NULL)
2752 fatal_error ("pex_init failed: %m");
2754 for (i = 0; i < n_commands; i++)
2756 const char *errmsg;
2757 int err;
2758 const char *string = commands[i].argv[0];
2760 errmsg = pex_run (pex,
2761 ((i + 1 == n_commands ? PEX_LAST : 0)
2762 | (string == commands[i].prog ? PEX_SEARCH : 0)),
2763 string, CONST_CAST (char **, commands[i].argv),
2764 NULL, NULL, &err);
2765 if (errmsg != NULL)
2767 if (err == 0)
2768 fatal_error (errmsg);
2769 else
2771 errno = err;
2772 pfatal_with_name (errmsg);
2776 if (string != commands[i].prog)
2777 free (CONST_CAST (char *, string));
2780 execution_count++;
2782 /* Wait for all the subprocesses to finish. */
2785 int *statuses;
2786 struct pex_time *times = NULL;
2787 int ret_code = 0;
2789 statuses = (int *) alloca (n_commands * sizeof (int));
2790 if (!pex_get_status (pex, n_commands, statuses))
2791 fatal_error ("failed to get exit status: %m");
2793 if (report_times || report_times_to_file)
2795 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
2796 if (!pex_get_times (pex, n_commands, times))
2797 fatal_error ("failed to get process times: %m");
2800 pex_free (pex);
2802 for (i = 0; i < n_commands; ++i)
2804 int status = statuses[i];
2806 if (WIFSIGNALED (status))
2808 #ifdef SIGPIPE
2809 /* SIGPIPE is a special case. It happens in -pipe mode
2810 when the compiler dies before the preprocessor is done,
2811 or the assembler dies before the compiler is done.
2812 There's generally been an error already, and this is
2813 just fallout. So don't generate another error unless
2814 we would otherwise have succeeded. */
2815 if (WTERMSIG (status) == SIGPIPE
2816 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2818 signal_count++;
2819 ret_code = -1;
2821 else
2822 #endif
2823 internal_error ("%s (program %s)",
2824 strsignal (WTERMSIG (status)), commands[i].prog);
2826 else if (WIFEXITED (status)
2827 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2829 if (WEXITSTATUS (status) > greatest_status)
2830 greatest_status = WEXITSTATUS (status);
2831 ret_code = -1;
2834 if (report_times || report_times_to_file)
2836 struct pex_time *pt = &times[i];
2837 double ut, st;
2839 ut = ((double) pt->user_seconds
2840 + (double) pt->user_microseconds / 1.0e6);
2841 st = ((double) pt->system_seconds
2842 + (double) pt->system_microseconds / 1.0e6);
2844 if (ut + st != 0)
2846 if (report_times)
2847 fnotice (stderr, "# %s %.2f %.2f\n",
2848 commands[i].prog, ut, st);
2850 if (report_times_to_file)
2852 int c = 0;
2853 const char *const *j;
2855 fprintf (report_times_to_file, "%g %g", ut, st);
2857 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
2859 const char *p;
2860 for (p = *j; *p; ++p)
2861 if (*p == '"' || *p == '\\' || *p == '$'
2862 || ISSPACE (*p))
2863 break;
2865 if (*p)
2867 fprintf (report_times_to_file, " \"");
2868 for (p = *j; *p; ++p)
2870 if (*p == '"' || *p == '\\' || *p == '$')
2871 fputc ('\\', report_times_to_file);
2872 fputc (*p, report_times_to_file);
2874 fputc ('"', report_times_to_file);
2876 else
2877 fprintf (report_times_to_file, " %s", *j);
2880 fputc ('\n', report_times_to_file);
2886 return ret_code;
2890 /* Find all the switches given to us
2891 and make a vector describing them.
2892 The elements of the vector are strings, one per switch given.
2893 If a switch uses following arguments, then the `part1' field
2894 is the switch itself and the `args' field
2895 is a null-terminated vector containing the following arguments.
2896 Bits in the `live_cond' field are:
2897 SWITCH_LIVE to indicate this switch is true in a conditional spec.
2898 SWITCH_FALSE to indicate this switch is overridden by a later switch.
2899 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
2900 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
2901 in all do_spec calls afterwards. Used for %<S from self specs.
2902 The `validated' field is nonzero if any spec has looked at this switch;
2903 if it remains zero at the end of the run, it must be meaningless. */
2905 #define SWITCH_LIVE (1 << 0)
2906 #define SWITCH_FALSE (1 << 1)
2907 #define SWITCH_IGNORE (1 << 2)
2908 #define SWITCH_IGNORE_PERMANENTLY (1 << 3)
2909 #define SWITCH_KEEP_FOR_GCC (1 << 4)
2911 struct switchstr
2913 const char *part1;
2914 const char **args;
2915 unsigned int live_cond;
2916 bool known;
2917 bool validated;
2918 bool ordering;
2921 static struct switchstr *switches;
2923 static int n_switches;
2925 static int n_switches_alloc;
2927 /* Set to zero if -fcompare-debug is disabled, positive if it's
2928 enabled and we're running the first compilation, negative if it's
2929 enabled and we're running the second compilation. For most of the
2930 time, it's in the range -1..1, but it can be temporarily set to 2
2931 or 3 to indicate that the -fcompare-debug flags didn't come from
2932 the command-line, but rather from the GCC_COMPARE_DEBUG environment
2933 variable, until a synthesized -fcompare-debug flag is added to the
2934 command line. */
2935 int compare_debug;
2937 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
2938 int compare_debug_second;
2940 /* Set to the flags that should be passed to the second compilation in
2941 a -fcompare-debug compilation. */
2942 const char *compare_debug_opt;
2944 static struct switchstr *switches_debug_check[2];
2946 static int n_switches_debug_check[2];
2948 static int n_switches_alloc_debug_check[2];
2950 static char *debug_check_temp_file[2];
2952 /* Language is one of three things:
2954 1) The name of a real programming language.
2955 2) NULL, indicating that no one has figured out
2956 what it is yet.
2957 3) '*', indicating that the file should be passed
2958 to the linker. */
2959 struct infile
2961 const char *name;
2962 const char *language;
2963 struct compiler *incompiler;
2964 bool compiled;
2965 bool preprocessed;
2968 /* Also a vector of input files specified. */
2970 static struct infile *infiles;
2972 int n_infiles;
2974 static int n_infiles_alloc;
2976 /* True if multiple input files are being compiled to a single
2977 assembly file. */
2979 static bool combine_inputs;
2981 /* This counts the number of libraries added by lang_specific_driver, so that
2982 we can tell if there were any user supplied any files or libraries. */
2984 static int added_libraries;
2986 /* And a vector of corresponding output files is made up later. */
2988 const char **outfiles;
2990 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2992 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
2993 is true if we should look for an executable suffix. DO_OBJ
2994 is true if we should look for an object suffix. */
2996 static const char *
2997 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
2998 int do_obj ATTRIBUTE_UNUSED)
3000 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3001 int i;
3002 #endif
3003 int len;
3005 if (name == NULL)
3006 return NULL;
3008 len = strlen (name);
3010 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3011 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3012 if (do_obj && len > 2
3013 && name[len - 2] == '.'
3014 && name[len - 1] == 'o')
3016 obstack_grow (&obstack, name, len - 2);
3017 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3018 name = XOBFINISH (&obstack, const char *);
3020 #endif
3022 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3023 /* If there is no filetype, make it the executable suffix (which includes
3024 the "."). But don't get confused if we have just "-o". */
3025 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3026 return name;
3028 for (i = len - 1; i >= 0; i--)
3029 if (IS_DIR_SEPARATOR (name[i]))
3030 break;
3032 for (i++; i < len; i++)
3033 if (name[i] == '.')
3034 return name;
3036 obstack_grow (&obstack, name, len);
3037 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3038 strlen (TARGET_EXECUTABLE_SUFFIX));
3039 name = XOBFINISH (&obstack, const char *);
3040 #endif
3042 return name;
3044 #endif
3046 /* Display the command line switches accepted by gcc. */
3047 static void
3048 display_help (void)
3050 printf (_("Usage: %s [options] file...\n"), progname);
3051 fputs (_("Options:\n"), stdout);
3053 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3054 fputs (_(" --help Display this information\n"), stdout);
3055 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3056 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3057 fputs (_(" Display specific types of command line options\n"), stdout);
3058 if (! verbose_flag)
3059 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3060 fputs (_(" --version Display compiler version information\n"), stdout);
3061 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3062 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3063 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3064 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3065 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3066 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3067 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3068 fputs (_("\
3069 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3070 a component in the library path\n"), stdout);
3071 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3072 fputs (_("\
3073 -print-multi-lib Display the mapping between command line options and\n\
3074 multiple library search directories\n"), stdout);
3075 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3076 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
3077 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3078 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3079 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3080 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3081 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3082 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3083 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3084 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3085 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
3086 fputs (_("\
3087 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3088 prefixes to other gcc components\n"), stdout);
3089 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3090 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3091 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3092 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3093 fputs (_("\
3094 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3095 and libraries\n"), stdout);
3096 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3097 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3098 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3099 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3100 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3101 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3102 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3103 fputs (_(" -pie Create a position independent executable\n"), stdout);
3104 fputs (_(" -shared Create a shared library\n"), stdout);
3105 fputs (_("\
3106 -x <language> Specify the language of the following input files\n\
3107 Permissible languages include: c c++ assembler none\n\
3108 'none' means revert to the default behavior of\n\
3109 guessing the language based on the file's extension\n\
3110 "), stdout);
3112 printf (_("\
3113 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3114 passed on to the various sub-processes invoked by %s. In order to pass\n\
3115 other options on to these processes the -W<letter> options must be used.\n\
3116 "), progname);
3118 /* The rest of the options are displayed by invocations of the various
3119 sub-processes. */
3122 static void
3123 add_preprocessor_option (const char *option, int len)
3125 preprocessor_options.safe_push (save_string (option, len));
3128 static void
3129 add_assembler_option (const char *option, int len)
3131 assembler_options.safe_push (save_string (option, len));
3134 static void
3135 add_linker_option (const char *option, int len)
3137 linker_options.safe_push (save_string (option, len));
3140 /* Allocate space for an input file in infiles. */
3142 static void
3143 alloc_infile (void)
3145 if (n_infiles_alloc == 0)
3147 n_infiles_alloc = 16;
3148 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3150 else if (n_infiles_alloc == n_infiles)
3152 n_infiles_alloc *= 2;
3153 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3157 /* Store an input file with the given NAME and LANGUAGE in
3158 infiles. */
3160 static void
3161 add_infile (const char *name, const char *language)
3163 alloc_infile ();
3164 infiles[n_infiles].name = name;
3165 infiles[n_infiles++].language = language;
3168 /* Allocate space for a switch in switches. */
3170 static void
3171 alloc_switch (void)
3173 if (n_switches_alloc == 0)
3175 n_switches_alloc = 16;
3176 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3178 else if (n_switches_alloc == n_switches)
3180 n_switches_alloc *= 2;
3181 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3185 /* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3186 as validated if VALIDATED and KNOWN if it is an internal switch. */
3188 static void
3189 save_switch (const char *opt, size_t n_args, const char *const *args,
3190 bool validated, bool known)
3192 alloc_switch ();
3193 switches[n_switches].part1 = opt + 1;
3194 if (n_args == 0)
3195 switches[n_switches].args = 0;
3196 else
3198 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3199 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3200 switches[n_switches].args[n_args] = NULL;
3203 switches[n_switches].live_cond = 0;
3204 switches[n_switches].validated = validated;
3205 switches[n_switches].known = known;
3206 switches[n_switches].ordering = 0;
3207 n_switches++;
3210 /* Handle an option DECODED that is unknown to the option-processing
3211 machinery. */
3213 static bool
3214 driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3216 const char *opt = decoded->arg;
3217 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3218 && !(decoded->errors & CL_ERR_NEGATIVE))
3220 /* Leave unknown -Wno-* options for the compiler proper, to be
3221 diagnosed only if there are warnings. */
3222 save_switch (decoded->canonical_option[0],
3223 decoded->canonical_option_num_elements - 1,
3224 &decoded->canonical_option[1], false, true);
3225 return false;
3227 if (decoded->opt_index == OPT_SPECIAL_unknown)
3229 /* Give it a chance to define it a a spec file. */
3230 save_switch (decoded->canonical_option[0],
3231 decoded->canonical_option_num_elements - 1,
3232 &decoded->canonical_option[1], false, false);
3233 return false;
3235 else
3236 return true;
3239 /* Handle an option DECODED that is not marked as CL_DRIVER.
3240 LANG_MASK will always be CL_DRIVER. */
3242 static void
3243 driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3244 unsigned int lang_mask ATTRIBUTE_UNUSED)
3246 /* At this point, non-driver options are accepted (and expected to
3247 be passed down by specs) unless marked to be rejected by the
3248 driver. Options to be rejected by the driver but accepted by the
3249 compilers proper are treated just like completely unknown
3250 options. */
3251 const struct cl_option *option = &cl_options[decoded->opt_index];
3253 if (option->cl_reject_driver)
3254 error ("unrecognized command line option %qs",
3255 decoded->orig_option_with_args_text);
3256 else
3257 save_switch (decoded->canonical_option[0],
3258 decoded->canonical_option_num_elements - 1,
3259 &decoded->canonical_option[1], false, true);
3262 static const char *spec_lang = 0;
3263 static int last_language_n_infiles;
3265 /* Handle a driver option; arguments and return value as for
3266 handle_option. */
3268 static bool
3269 driver_handle_option (struct gcc_options *opts,
3270 struct gcc_options *opts_set,
3271 const struct cl_decoded_option *decoded,
3272 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
3273 location_t loc,
3274 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
3275 diagnostic_context *dc)
3277 size_t opt_index = decoded->opt_index;
3278 const char *arg = decoded->arg;
3279 const char *compare_debug_replacement_opt;
3280 int value = decoded->value;
3281 bool validated = false;
3282 bool do_save = true;
3284 gcc_assert (opts == &global_options);
3285 gcc_assert (opts_set == &global_options_set);
3286 gcc_assert (kind == DK_UNSPECIFIED);
3287 gcc_assert (loc == UNKNOWN_LOCATION);
3288 gcc_assert (dc == global_dc);
3290 switch (opt_index)
3292 case OPT_dumpspecs:
3294 struct spec_list *sl;
3295 init_spec ();
3296 for (sl = specs; sl; sl = sl->next)
3297 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3298 if (link_command_spec)
3299 printf ("*link_command:\n%s\n\n", link_command_spec);
3300 exit (0);
3303 case OPT_dumpversion:
3304 printf ("%s\n", spec_version);
3305 exit (0);
3307 case OPT_dumpmachine:
3308 printf ("%s\n", spec_machine);
3309 exit (0);
3311 case OPT__version:
3312 print_version = 1;
3314 /* CPP driver cannot obtain switch from cc1_options. */
3315 if (is_cpp_driver)
3316 add_preprocessor_option ("--version", strlen ("--version"));
3317 add_assembler_option ("--version", strlen ("--version"));
3318 add_linker_option ("--version", strlen ("--version"));
3319 break;
3321 case OPT__help:
3322 print_help_list = 1;
3324 /* CPP driver cannot obtain switch from cc1_options. */
3325 if (is_cpp_driver)
3326 add_preprocessor_option ("--help", 6);
3327 add_assembler_option ("--help", 6);
3328 add_linker_option ("--help", 6);
3329 break;
3331 case OPT__help_:
3332 print_subprocess_help = 2;
3333 break;
3335 case OPT__target_help:
3336 print_subprocess_help = 1;
3338 /* CPP driver cannot obtain switch from cc1_options. */
3339 if (is_cpp_driver)
3340 add_preprocessor_option ("--target-help", 13);
3341 add_assembler_option ("--target-help", 13);
3342 add_linker_option ("--target-help", 13);
3343 break;
3345 case OPT__no_sysroot_suffix:
3346 case OPT_pass_exit_codes:
3347 case OPT_print_search_dirs:
3348 case OPT_print_file_name_:
3349 case OPT_print_prog_name_:
3350 case OPT_print_multi_lib:
3351 case OPT_print_multi_directory:
3352 case OPT_print_sysroot:
3353 case OPT_print_multi_os_directory:
3354 case OPT_print_multiarch:
3355 case OPT_print_sysroot_headers_suffix:
3356 case OPT_time:
3357 case OPT_wrapper:
3358 /* These options set the variables specified in common.opt
3359 automatically, and do not need to be saved for spec
3360 processing. */
3361 do_save = false;
3362 break;
3364 case OPT_print_libgcc_file_name:
3365 print_file_name = "libgcc.a";
3366 do_save = false;
3367 break;
3369 case OPT_fcompare_debug_second:
3370 compare_debug_second = 1;
3371 break;
3373 case OPT_fcompare_debug:
3374 switch (value)
3376 case 0:
3377 compare_debug_replacement_opt = "-fcompare-debug=";
3378 arg = "";
3379 goto compare_debug_with_arg;
3381 case 1:
3382 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
3383 arg = "-gtoggle";
3384 goto compare_debug_with_arg;
3386 default:
3387 gcc_unreachable ();
3389 break;
3391 case OPT_fcompare_debug_:
3392 compare_debug_replacement_opt = decoded->canonical_option[0];
3393 compare_debug_with_arg:
3394 gcc_assert (decoded->canonical_option_num_elements == 1);
3395 gcc_assert (arg != NULL);
3396 if (*arg)
3397 compare_debug = 1;
3398 else
3399 compare_debug = -1;
3400 if (compare_debug < 0)
3401 compare_debug_opt = NULL;
3402 else
3403 compare_debug_opt = arg;
3404 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
3405 return true;
3407 case OPT_Wa_:
3409 int prev, j;
3410 /* Pass the rest of this option to the assembler. */
3412 /* Split the argument at commas. */
3413 prev = 0;
3414 for (j = 0; arg[j]; j++)
3415 if (arg[j] == ',')
3417 add_assembler_option (arg + prev, j - prev);
3418 prev = j + 1;
3421 /* Record the part after the last comma. */
3422 add_assembler_option (arg + prev, j - prev);
3424 do_save = false;
3425 break;
3427 case OPT_Wp_:
3429 int prev, j;
3430 /* Pass the rest of this option to the preprocessor. */
3432 /* Split the argument at commas. */
3433 prev = 0;
3434 for (j = 0; arg[j]; j++)
3435 if (arg[j] == ',')
3437 add_preprocessor_option (arg + prev, j - prev);
3438 prev = j + 1;
3441 /* Record the part after the last comma. */
3442 add_preprocessor_option (arg + prev, j - prev);
3444 do_save = false;
3445 break;
3447 case OPT_Wl_:
3449 int prev, j;
3450 /* Split the argument at commas. */
3451 prev = 0;
3452 for (j = 0; arg[j]; j++)
3453 if (arg[j] == ',')
3455 add_infile (save_string (arg + prev, j - prev), "*");
3456 prev = j + 1;
3458 /* Record the part after the last comma. */
3459 add_infile (arg + prev, "*");
3461 do_save = false;
3462 break;
3464 case OPT_Xlinker:
3465 add_infile (arg, "*");
3466 do_save = false;
3467 break;
3469 case OPT_Xpreprocessor:
3470 add_preprocessor_option (arg, strlen (arg));
3471 do_save = false;
3472 break;
3474 case OPT_Xassembler:
3475 add_assembler_option (arg, strlen (arg));
3476 do_save = false;
3477 break;
3479 case OPT_l:
3480 /* POSIX allows separation of -l and the lib arg; canonicalize
3481 by concatenating -l with its arg */
3482 add_infile (concat ("-l", arg, NULL), "*");
3483 do_save = false;
3484 break;
3486 case OPT_L:
3487 /* Similarly, canonicalize -L for linkers that may not accept
3488 separate arguments. */
3489 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
3490 return true;
3492 case OPT_F:
3493 /* Likewise -F. */
3494 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
3495 return true;
3497 case OPT_save_temps:
3498 save_temps_flag = SAVE_TEMPS_CWD;
3499 validated = true;
3500 break;
3502 case OPT_save_temps_:
3503 if (strcmp (arg, "cwd") == 0)
3504 save_temps_flag = SAVE_TEMPS_CWD;
3505 else if (strcmp (arg, "obj") == 0
3506 || strcmp (arg, "object") == 0)
3507 save_temps_flag = SAVE_TEMPS_OBJ;
3508 else
3509 fatal_error ("%qs is an unknown -save-temps option",
3510 decoded->orig_option_with_args_text);
3511 break;
3513 case OPT_no_canonical_prefixes:
3514 /* Already handled as a special case, so ignored here. */
3515 do_save = false;
3516 break;
3518 case OPT_pipe:
3519 validated = true;
3520 /* These options set the variables specified in common.opt
3521 automatically, but do need to be saved for spec
3522 processing. */
3523 break;
3525 case OPT_specs_:
3527 struct user_specs *user = XNEW (struct user_specs);
3529 user->next = (struct user_specs *) 0;
3530 user->filename = arg;
3531 if (user_specs_tail)
3532 user_specs_tail->next = user;
3533 else
3534 user_specs_head = user;
3535 user_specs_tail = user;
3537 validated = true;
3538 break;
3540 case OPT__sysroot_:
3541 target_system_root = arg;
3542 target_system_root_changed = 1;
3543 do_save = false;
3544 break;
3546 case OPT_time_:
3547 if (report_times_to_file)
3548 fclose (report_times_to_file);
3549 report_times_to_file = fopen (arg, "a");
3550 do_save = false;
3551 break;
3553 case OPT____:
3554 /* "-###"
3555 This is similar to -v except that there is no execution
3556 of the commands and the echoed arguments are quoted. It
3557 is intended for use in shell scripts to capture the
3558 driver-generated command line. */
3559 verbose_only_flag++;
3560 verbose_flag = 1;
3561 do_save = false;
3562 break;
3564 case OPT_B:
3566 size_t len = strlen (arg);
3568 /* Catch the case where the user has forgotten to append a
3569 directory separator to the path. Note, they may be using
3570 -B to add an executable name prefix, eg "i386-elf-", in
3571 order to distinguish between multiple installations of
3572 GCC in the same directory. Hence we must check to see
3573 if appending a directory separator actually makes a
3574 valid directory name. */
3575 if (!IS_DIR_SEPARATOR (arg[len - 1])
3576 && is_directory (arg, false))
3578 char *tmp = XNEWVEC (char, len + 2);
3579 strcpy (tmp, arg);
3580 tmp[len] = DIR_SEPARATOR;
3581 tmp[++len] = 0;
3582 arg = tmp;
3585 add_prefix (&exec_prefixes, arg, NULL,
3586 PREFIX_PRIORITY_B_OPT, 0, 0);
3587 add_prefix (&startfile_prefixes, arg, NULL,
3588 PREFIX_PRIORITY_B_OPT, 0, 0);
3589 add_prefix (&include_prefixes, arg, NULL,
3590 PREFIX_PRIORITY_B_OPT, 0, 0);
3592 validated = true;
3593 break;
3595 case OPT_x:
3596 spec_lang = arg;
3597 if (!strcmp (spec_lang, "none"))
3598 /* Suppress the warning if -xnone comes after the last input
3599 file, because alternate command interfaces like g++ might
3600 find it useful to place -xnone after each input file. */
3601 spec_lang = 0;
3602 else
3603 last_language_n_infiles = n_infiles;
3604 do_save = false;
3605 break;
3607 case OPT_o:
3608 have_o = 1;
3609 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3610 arg = convert_filename (arg, ! have_c, 0);
3611 #endif
3612 /* Save the output name in case -save-temps=obj was used. */
3613 save_temps_prefix = xstrdup (arg);
3614 /* On some systems, ld cannot handle "-o" without a space. So
3615 split the option from its argument. */
3616 save_switch ("-o", 1, &arg, validated, true);
3617 return true;
3619 case OPT_static_libgcc:
3620 case OPT_shared_libgcc:
3621 case OPT_static_libgfortran:
3622 case OPT_static_libstdc__:
3623 /* These are always valid, since gcc.c itself understands the
3624 first two, gfortranspec.c understands -static-libgfortran and
3625 g++spec.c understands -static-libstdc++ */
3626 validated = true;
3627 break;
3629 default:
3630 /* Various driver options need no special processing at this
3631 point, having been handled in a prescan above or being
3632 handled by specs. */
3633 break;
3636 if (do_save)
3637 save_switch (decoded->canonical_option[0],
3638 decoded->canonical_option_num_elements - 1,
3639 &decoded->canonical_option[1], validated, true);
3640 return true;
3643 /* Put the driver's standard set of option handlers in *HANDLERS. */
3645 static void
3646 set_option_handlers (struct cl_option_handlers *handlers)
3648 handlers->unknown_option_callback = driver_unknown_option_callback;
3649 handlers->wrong_lang_callback = driver_wrong_lang_callback;
3650 handlers->num_handlers = 3;
3651 handlers->handlers[0].handler = driver_handle_option;
3652 handlers->handlers[0].mask = CL_DRIVER;
3653 handlers->handlers[1].handler = common_handle_option;
3654 handlers->handlers[1].mask = CL_COMMON;
3655 handlers->handlers[2].handler = target_handle_option;
3656 handlers->handlers[2].mask = CL_TARGET;
3659 /* Create the vector `switches' and its contents.
3660 Store its length in `n_switches'. */
3662 static void
3663 process_command (unsigned int decoded_options_count,
3664 struct cl_decoded_option *decoded_options)
3666 const char *temp;
3667 char *temp1;
3668 char *tooldir_prefix, *tooldir_prefix2;
3669 char *(*get_relative_prefix) (const char *, const char *,
3670 const char *) = NULL;
3671 struct cl_option_handlers handlers;
3672 unsigned int j;
3674 gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
3676 n_switches = 0;
3677 n_infiles = 0;
3678 added_libraries = 0;
3680 /* Figure compiler version from version string. */
3682 compiler_version = temp1 = xstrdup (version_string);
3684 for (; *temp1; ++temp1)
3686 if (*temp1 == ' ')
3688 *temp1 = '\0';
3689 break;
3693 /* Handle any -no-canonical-prefixes flag early, to assign the function
3694 that builds relative prefixes. This function creates default search
3695 paths that are needed later in normal option handling. */
3697 for (j = 1; j < decoded_options_count; j++)
3699 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
3701 get_relative_prefix = make_relative_prefix_ignore_links;
3702 break;
3705 if (! get_relative_prefix)
3706 get_relative_prefix = make_relative_prefix;
3708 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3709 see if we can create it from the pathname specified in
3710 decoded_options[0].arg. */
3712 gcc_libexec_prefix = standard_libexec_prefix;
3713 #ifndef VMS
3714 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3715 if (!gcc_exec_prefix)
3717 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
3718 standard_bindir_prefix,
3719 standard_exec_prefix);
3720 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
3721 standard_bindir_prefix,
3722 standard_libexec_prefix);
3723 if (gcc_exec_prefix)
3724 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3726 else
3728 /* make_relative_prefix requires a program name, but
3729 GCC_EXEC_PREFIX is typically a directory name with a trailing
3730 / (which is ignored by make_relative_prefix), so append a
3731 program name. */
3732 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
3733 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3734 standard_exec_prefix,
3735 standard_libexec_prefix);
3737 /* The path is unrelocated, so fallback to the original setting. */
3738 if (!gcc_libexec_prefix)
3739 gcc_libexec_prefix = standard_libexec_prefix;
3741 free (tmp_prefix);
3743 #else
3744 #endif
3745 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3746 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
3747 or an automatically created GCC_EXEC_PREFIX from
3748 decoded_options[0].arg. */
3750 /* Do language-specific adjustment/addition of flags. */
3751 lang_specific_driver (&decoded_options, &decoded_options_count,
3752 &added_libraries);
3754 if (gcc_exec_prefix)
3756 int len = strlen (gcc_exec_prefix);
3758 if (len > (int) sizeof ("/lib/gcc/") - 1
3759 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3761 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3762 if (IS_DIR_SEPARATOR (*temp)
3763 && filename_ncmp (temp + 1, "lib", 3) == 0
3764 && IS_DIR_SEPARATOR (temp[4])
3765 && filename_ncmp (temp + 5, "gcc", 3) == 0)
3766 len -= sizeof ("/lib/gcc/") - 1;
3769 set_std_prefix (gcc_exec_prefix, len);
3770 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3771 PREFIX_PRIORITY_LAST, 0, 0);
3772 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3773 PREFIX_PRIORITY_LAST, 0, 0);
3776 /* COMPILER_PATH and LIBRARY_PATH have values
3777 that are lists of directory names with colons. */
3779 temp = getenv ("COMPILER_PATH");
3780 if (temp)
3782 const char *startp, *endp;
3783 char *nstore = (char *) alloca (strlen (temp) + 3);
3785 startp = endp = temp;
3786 while (1)
3788 if (*endp == PATH_SEPARATOR || *endp == 0)
3790 strncpy (nstore, startp, endp - startp);
3791 if (endp == startp)
3792 strcpy (nstore, concat (".", dir_separator_str, NULL));
3793 else if (!IS_DIR_SEPARATOR (endp[-1]))
3795 nstore[endp - startp] = DIR_SEPARATOR;
3796 nstore[endp - startp + 1] = 0;
3798 else
3799 nstore[endp - startp] = 0;
3800 add_prefix (&exec_prefixes, nstore, 0,
3801 PREFIX_PRIORITY_LAST, 0, 0);
3802 add_prefix (&include_prefixes, nstore, 0,
3803 PREFIX_PRIORITY_LAST, 0, 0);
3804 if (*endp == 0)
3805 break;
3806 endp = startp = endp + 1;
3808 else
3809 endp++;
3813 temp = getenv (LIBRARY_PATH_ENV);
3814 if (temp && *cross_compile == '0')
3816 const char *startp, *endp;
3817 char *nstore = (char *) alloca (strlen (temp) + 3);
3819 startp = endp = temp;
3820 while (1)
3822 if (*endp == PATH_SEPARATOR || *endp == 0)
3824 strncpy (nstore, startp, endp - startp);
3825 if (endp == startp)
3826 strcpy (nstore, concat (".", dir_separator_str, NULL));
3827 else if (!IS_DIR_SEPARATOR (endp[-1]))
3829 nstore[endp - startp] = DIR_SEPARATOR;
3830 nstore[endp - startp + 1] = 0;
3832 else
3833 nstore[endp - startp] = 0;
3834 add_prefix (&startfile_prefixes, nstore, NULL,
3835 PREFIX_PRIORITY_LAST, 0, 1);
3836 if (*endp == 0)
3837 break;
3838 endp = startp = endp + 1;
3840 else
3841 endp++;
3845 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3846 temp = getenv ("LPATH");
3847 if (temp && *cross_compile == '0')
3849 const char *startp, *endp;
3850 char *nstore = (char *) alloca (strlen (temp) + 3);
3852 startp = endp = temp;
3853 while (1)
3855 if (*endp == PATH_SEPARATOR || *endp == 0)
3857 strncpy (nstore, startp, endp - startp);
3858 if (endp == startp)
3859 strcpy (nstore, concat (".", dir_separator_str, NULL));
3860 else if (!IS_DIR_SEPARATOR (endp[-1]))
3862 nstore[endp - startp] = DIR_SEPARATOR;
3863 nstore[endp - startp + 1] = 0;
3865 else
3866 nstore[endp - startp] = 0;
3867 add_prefix (&startfile_prefixes, nstore, NULL,
3868 PREFIX_PRIORITY_LAST, 0, 1);
3869 if (*endp == 0)
3870 break;
3871 endp = startp = endp + 1;
3873 else
3874 endp++;
3878 /* Process the options and store input files and switches in their
3879 vectors. */
3881 last_language_n_infiles = -1;
3883 set_option_handlers (&handlers);
3885 for (j = 1; j < decoded_options_count; j++)
3887 switch (decoded_options[j].opt_index)
3889 case OPT_S:
3890 case OPT_c:
3891 case OPT_E:
3892 have_c = 1;
3893 break;
3895 if (have_c)
3896 break;
3899 for (j = 1; j < decoded_options_count; j++)
3901 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
3903 const char *arg = decoded_options[j].arg;
3904 const char *p = strrchr (arg, '@');
3905 char *fname;
3906 long offset;
3907 int consumed;
3908 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3909 arg = convert_filename (arg, 0, access (arg, F_OK));
3910 #endif
3911 /* For LTO static archive support we handle input file
3912 specifications that are composed of a filename and
3913 an offset like FNAME@OFFSET. */
3914 if (p
3915 && p != arg
3916 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
3917 && strlen (p) == (unsigned int)consumed)
3919 fname = (char *)xmalloc (p - arg + 1);
3920 memcpy (fname, arg, p - arg);
3921 fname[p - arg] = '\0';
3922 /* Only accept non-stdin and existing FNAME parts, otherwise
3923 try with the full name. */
3924 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
3926 free (fname);
3927 fname = xstrdup (arg);
3930 else
3931 fname = xstrdup (arg);
3933 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
3934 perror_with_name (fname);
3935 else
3936 add_infile (arg, spec_lang);
3938 free (fname);
3939 continue;
3942 read_cmdline_option (&global_options, &global_options_set,
3943 decoded_options + j, UNKNOWN_LOCATION,
3944 CL_DRIVER, &handlers, global_dc);
3947 /* If -save-temps=obj and -o name, create the prefix to use for %b.
3948 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
3949 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
3951 save_temps_length = strlen (save_temps_prefix);
3952 temp = strrchr (lbasename (save_temps_prefix), '.');
3953 if (temp)
3955 save_temps_length -= strlen (temp);
3956 save_temps_prefix[save_temps_length] = '\0';
3960 else if (save_temps_prefix != NULL)
3962 free (save_temps_prefix);
3963 save_temps_prefix = NULL;
3966 if (save_temps_flag && use_pipes)
3968 /* -save-temps overrides -pipe, so that temp files are produced */
3969 if (save_temps_flag)
3970 warning (0, "-pipe ignored because -save-temps specified");
3971 use_pipes = 0;
3974 if (!compare_debug)
3976 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
3978 if (gcd && gcd[0] == '-')
3980 compare_debug = 2;
3981 compare_debug_opt = gcd;
3983 else if (gcd && *gcd && strcmp (gcd, "0"))
3985 compare_debug = 3;
3986 compare_debug_opt = "-gtoggle";
3989 else if (compare_debug < 0)
3991 compare_debug = 0;
3992 gcc_assert (!compare_debug_opt);
3995 /* Set up the search paths. We add directories that we expect to
3996 contain GNU Toolchain components before directories specified by
3997 the machine description so that we will find GNU components (like
3998 the GNU assembler) before those of the host system. */
4000 /* If we don't know where the toolchain has been installed, use the
4001 configured-in locations. */
4002 if (!gcc_exec_prefix)
4004 #ifndef OS2
4005 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4006 PREFIX_PRIORITY_LAST, 1, 0);
4007 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4008 PREFIX_PRIORITY_LAST, 2, 0);
4009 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4010 PREFIX_PRIORITY_LAST, 2, 0);
4011 #endif
4012 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4013 PREFIX_PRIORITY_LAST, 1, 0);
4016 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4017 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
4018 dir_separator_str, NULL);
4020 /* Look for tools relative to the location from which the driver is
4021 running, or, if that is not available, the configured prefix. */
4022 tooldir_prefix
4023 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4024 spec_machine, dir_separator_str,
4025 spec_version, dir_separator_str, tooldir_prefix2, NULL);
4026 free (tooldir_prefix2);
4028 add_prefix (&exec_prefixes,
4029 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4030 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4031 add_prefix (&startfile_prefixes,
4032 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4033 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4034 free (tooldir_prefix);
4036 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4037 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4038 then consider it to relocate with the rest of the GCC installation
4039 if GCC_EXEC_PREFIX is set.
4040 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4041 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4043 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
4044 standard_bindir_prefix,
4045 target_system_root);
4046 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4048 target_system_root = tmp_prefix;
4049 target_system_root_changed = 1;
4052 #endif
4054 /* More prefixes are enabled in main, after we read the specs file
4055 and determine whether this is cross-compilation or not. */
4057 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4058 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4060 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4061 environment variable. */
4062 if (compare_debug == 2 || compare_debug == 3)
4064 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4065 save_switch (opt, 0, NULL, false, true);
4066 compare_debug = 1;
4069 /* Ensure we only invoke each subprocess once. */
4070 if (print_subprocess_help || print_help_list || print_version)
4072 n_infiles = 0;
4074 /* Create a dummy input file, so that we can pass
4075 the help option on to the various sub-processes. */
4076 add_infile ("help-dummy", "c");
4079 alloc_switch ();
4080 switches[n_switches].part1 = 0;
4081 alloc_infile ();
4082 infiles[n_infiles].name = 0;
4085 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4086 and place that in the environment. */
4088 static void
4089 set_collect_gcc_options (void)
4091 int i;
4092 int first_time;
4094 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4095 the compiler. */
4096 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4097 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4099 first_time = TRUE;
4100 for (i = 0; (int) i < n_switches; i++)
4102 const char *const *args;
4103 const char *p, *q;
4104 if (!first_time)
4105 obstack_grow (&collect_obstack, " ", 1);
4107 first_time = FALSE;
4109 /* Ignore elided switches. */
4110 if ((switches[i].live_cond
4111 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4112 == SWITCH_IGNORE)
4113 continue;
4115 obstack_grow (&collect_obstack, "'-", 2);
4116 q = switches[i].part1;
4117 while ((p = strchr (q, '\'')))
4119 obstack_grow (&collect_obstack, q, p - q);
4120 obstack_grow (&collect_obstack, "'\\''", 4);
4121 q = ++p;
4123 obstack_grow (&collect_obstack, q, strlen (q));
4124 obstack_grow (&collect_obstack, "'", 1);
4126 for (args = switches[i].args; args && *args; args++)
4128 obstack_grow (&collect_obstack, " '", 2);
4129 q = *args;
4130 while ((p = strchr (q, '\'')))
4132 obstack_grow (&collect_obstack, q, p - q);
4133 obstack_grow (&collect_obstack, "'\\''", 4);
4134 q = ++p;
4136 obstack_grow (&collect_obstack, q, strlen (q));
4137 obstack_grow (&collect_obstack, "'", 1);
4140 obstack_grow (&collect_obstack, "\0", 1);
4141 xputenv (XOBFINISH (&collect_obstack, char *));
4144 /* Process a spec string, accumulating and running commands. */
4146 /* These variables describe the input file name.
4147 input_file_number is the index on outfiles of this file,
4148 so that the output file name can be stored for later use by %o.
4149 input_basename is the start of the part of the input file
4150 sans all directory names, and basename_length is the number
4151 of characters starting there excluding the suffix .c or whatever. */
4153 static const char *gcc_input_filename;
4154 static int input_file_number;
4155 size_t input_filename_length;
4156 static int basename_length;
4157 static int suffixed_basename_length;
4158 static const char *input_basename;
4159 static const char *input_suffix;
4160 #ifndef HOST_LACKS_INODE_NUMBERS
4161 static struct stat input_stat;
4162 #endif
4163 static int input_stat_set;
4165 /* The compiler used to process the current input file. */
4166 static struct compiler *input_file_compiler;
4168 /* These are variables used within do_spec and do_spec_1. */
4170 /* Nonzero if an arg has been started and not yet terminated
4171 (with space, tab or newline). */
4172 static int arg_going;
4174 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4175 is a temporary file name. */
4176 static int delete_this_arg;
4178 /* Nonzero means %w has been seen; the next arg to be terminated
4179 is the output file name of this compilation. */
4180 static int this_is_output_file;
4182 /* Nonzero means %s has been seen; the next arg to be terminated
4183 is the name of a library file and we should try the standard
4184 search dirs for it. */
4185 static int this_is_library_file;
4187 /* Nonzero means %T has been seen; the next arg to be terminated
4188 is the name of a linker script and we should try all of the
4189 standard search dirs for it. If it is found insert a --script
4190 command line switch and then substitute the full path in place,
4191 otherwise generate an error message. */
4192 static int this_is_linker_script;
4194 /* Nonzero means that the input of this command is coming from a pipe. */
4195 static int input_from_pipe;
4197 /* Nonnull means substitute this for any suffix when outputting a switches
4198 arguments. */
4199 static const char *suffix_subst;
4201 /* If there is an argument being accumulated, terminate it and store it. */
4203 static void
4204 end_going_arg (void)
4206 if (arg_going)
4208 const char *string;
4210 obstack_1grow (&obstack, 0);
4211 string = XOBFINISH (&obstack, const char *);
4212 if (this_is_library_file)
4213 string = find_file (string);
4214 if (this_is_linker_script)
4216 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4218 if (full_script_path == NULL)
4220 error ("unable to locate default linker script %qs in the library search paths", string);
4221 /* Script was not found on search path. */
4222 return;
4224 store_arg ("--script", false, false);
4225 string = full_script_path;
4227 store_arg (string, delete_this_arg, this_is_output_file);
4228 if (this_is_output_file)
4229 outfiles[input_file_number] = string;
4230 arg_going = 0;
4235 /* Parse the WRAPPER string which is a comma separated list of the command line
4236 and insert them into the beginning of argbuf. */
4238 static void
4239 insert_wrapper (const char *wrapper)
4241 int n = 0;
4242 int i;
4243 char *buf = xstrdup (wrapper);
4244 char *p = buf;
4245 unsigned int old_length = argbuf.length ();
4249 n++;
4250 while (*p == ',')
4251 p++;
4253 while ((p = strchr (p, ',')) != NULL);
4255 argbuf.safe_grow (old_length + n);
4256 memmove (argbuf.address () + n,
4257 argbuf.address (),
4258 old_length * sizeof (const_char_p));
4260 i = 0;
4261 p = buf;
4264 while (*p == ',')
4266 *p = 0;
4267 p++;
4269 argbuf[i] = p;
4270 i++;
4272 while ((p = strchr (p, ',')) != NULL);
4273 gcc_assert (i == n);
4276 /* Process the spec SPEC and run the commands specified therein.
4277 Returns 0 if the spec is successfully processed; -1 if failed. */
4280 do_spec (const char *spec)
4282 int value;
4284 value = do_spec_2 (spec);
4286 /* Force out any unfinished command.
4287 If -pipe, this forces out the last command if it ended in `|'. */
4288 if (value == 0)
4290 if (argbuf.length () > 0
4291 && !strcmp (argbuf.last (), "|"))
4292 argbuf.pop ();
4294 set_collect_gcc_options ();
4296 if (argbuf.length () > 0)
4297 value = execute ();
4300 return value;
4303 static int
4304 do_spec_2 (const char *spec)
4306 int result;
4308 clear_args ();
4309 arg_going = 0;
4310 delete_this_arg = 0;
4311 this_is_output_file = 0;
4312 this_is_library_file = 0;
4313 this_is_linker_script = 0;
4314 input_from_pipe = 0;
4315 suffix_subst = NULL;
4317 result = do_spec_1 (spec, 0, NULL);
4319 end_going_arg ();
4321 return result;
4325 /* Process the given spec string and add any new options to the end
4326 of the switches/n_switches array. */
4328 static void
4329 do_option_spec (const char *name, const char *spec)
4331 unsigned int i, value_count, value_len;
4332 const char *p, *q, *value;
4333 char *tmp_spec, *tmp_spec_p;
4335 if (configure_default_options[0].name == NULL)
4336 return;
4338 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4339 if (strcmp (configure_default_options[i].name, name) == 0)
4340 break;
4341 if (i == ARRAY_SIZE (configure_default_options))
4342 return;
4344 value = configure_default_options[i].value;
4345 value_len = strlen (value);
4347 /* Compute the size of the final spec. */
4348 value_count = 0;
4349 p = spec;
4350 while ((p = strstr (p, "%(VALUE)")) != NULL)
4352 p ++;
4353 value_count ++;
4356 /* Replace each %(VALUE) by the specified value. */
4357 tmp_spec = (char *) alloca (strlen (spec) + 1
4358 + value_count * (value_len - strlen ("%(VALUE)")));
4359 tmp_spec_p = tmp_spec;
4360 q = spec;
4361 while ((p = strstr (q, "%(VALUE)")) != NULL)
4363 memcpy (tmp_spec_p, q, p - q);
4364 tmp_spec_p = tmp_spec_p + (p - q);
4365 memcpy (tmp_spec_p, value, value_len);
4366 tmp_spec_p += value_len;
4367 q = p + strlen ("%(VALUE)");
4369 strcpy (tmp_spec_p, q);
4371 do_self_spec (tmp_spec);
4374 /* Process the given spec string and add any new options to the end
4375 of the switches/n_switches array. */
4377 static void
4378 do_self_spec (const char *spec)
4380 int i;
4382 do_spec_2 (spec);
4383 do_spec_1 (" ", 0, NULL);
4385 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4386 do_self_specs adds the replacements to switches array, so it shouldn't
4387 be processed afterwards. */
4388 for (i = 0; i < n_switches; i++)
4389 if ((switches[i].live_cond & SWITCH_IGNORE))
4390 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4392 if (argbuf.length () > 0)
4394 const char **argbuf_copy;
4395 struct cl_decoded_option *decoded_options;
4396 struct cl_option_handlers handlers;
4397 unsigned int decoded_options_count;
4398 unsigned int j;
4400 /* Create a copy of argbuf with a dummy argv[0] entry for
4401 decode_cmdline_options_to_array. */
4402 argbuf_copy = XNEWVEC (const char *,
4403 argbuf.length () + 1);
4404 argbuf_copy[0] = "";
4405 memcpy (argbuf_copy + 1, argbuf.address (),
4406 argbuf.length () * sizeof (const char *));
4408 decode_cmdline_options_to_array (argbuf.length () + 1,
4409 argbuf_copy,
4410 CL_DRIVER, &decoded_options,
4411 &decoded_options_count);
4412 free (argbuf_copy);
4414 set_option_handlers (&handlers);
4416 for (j = 1; j < decoded_options_count; j++)
4418 switch (decoded_options[j].opt_index)
4420 case OPT_SPECIAL_input_file:
4421 /* Specs should only generate options, not input
4422 files. */
4423 if (strcmp (decoded_options[j].arg, "-") != 0)
4424 fatal_error ("switch %qs does not start with %<-%>",
4425 decoded_options[j].arg);
4426 else
4427 fatal_error ("spec-generated switch is just %<-%>");
4428 break;
4430 case OPT_fcompare_debug_second:
4431 case OPT_fcompare_debug:
4432 case OPT_fcompare_debug_:
4433 case OPT_o:
4434 /* Avoid duplicate processing of some options from
4435 compare-debug specs; just save them here. */
4436 save_switch (decoded_options[j].canonical_option[0],
4437 (decoded_options[j].canonical_option_num_elements
4438 - 1),
4439 &decoded_options[j].canonical_option[1], false, true);
4440 break;
4442 default:
4443 read_cmdline_option (&global_options, &global_options_set,
4444 decoded_options + j, UNKNOWN_LOCATION,
4445 CL_DRIVER, &handlers, global_dc);
4446 break;
4450 alloc_switch ();
4451 switches[n_switches].part1 = 0;
4455 /* Callback for processing %D and %I specs. */
4457 struct spec_path_info {
4458 const char *option;
4459 const char *append;
4460 size_t append_len;
4461 bool omit_relative;
4462 bool separate_options;
4465 static void *
4466 spec_path (char *path, void *data)
4468 struct spec_path_info *info = (struct spec_path_info *) data;
4469 size_t len = 0;
4470 char save = 0;
4472 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4473 return NULL;
4475 if (info->append_len != 0)
4477 len = strlen (path);
4478 memcpy (path + len, info->append, info->append_len + 1);
4481 if (!is_directory (path, true))
4482 return NULL;
4484 do_spec_1 (info->option, 1, NULL);
4485 if (info->separate_options)
4486 do_spec_1 (" ", 0, NULL);
4488 if (info->append_len == 0)
4490 len = strlen (path);
4491 save = path[len - 1];
4492 if (IS_DIR_SEPARATOR (path[len - 1]))
4493 path[len - 1] = '\0';
4496 do_spec_1 (path, 1, NULL);
4497 do_spec_1 (" ", 0, NULL);
4499 /* Must not damage the original path. */
4500 if (info->append_len == 0)
4501 path[len - 1] = save;
4503 return NULL;
4506 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4507 argument list. */
4509 static void
4510 create_at_file (char **argv)
4512 char *temp_file = make_temp_file ("");
4513 char *at_argument = concat ("@", temp_file, NULL);
4514 FILE *f = fopen (temp_file, "w");
4515 int status;
4517 if (f == NULL)
4518 fatal_error ("could not open temporary response file %s",
4519 temp_file);
4521 status = writeargv (argv, f);
4523 if (status)
4524 fatal_error ("could not write to temporary response file %s",
4525 temp_file);
4527 status = fclose (f);
4529 if (EOF == status)
4530 fatal_error ("could not close temporary response file %s",
4531 temp_file);
4533 store_arg (at_argument, 0, 0);
4535 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
4538 /* True if we should compile INFILE. */
4540 static bool
4541 compile_input_file_p (struct infile *infile)
4543 if ((!infile->language) || (infile->language[0] != '*'))
4544 if (infile->incompiler == input_file_compiler)
4545 return true;
4546 return false;
4549 /* Process each member of VEC as a spec. */
4551 static void
4552 do_specs_vec (vec<char_p> vec)
4554 unsigned ix;
4555 char *opt;
4557 FOR_EACH_VEC_ELT (vec, ix, opt)
4559 do_spec_1 (opt, 1, NULL);
4560 /* Make each accumulated option a separate argument. */
4561 do_spec_1 (" ", 0, NULL);
4565 /* Process the sub-spec SPEC as a portion of a larger spec.
4566 This is like processing a whole spec except that we do
4567 not initialize at the beginning and we do not supply a
4568 newline by default at the end.
4569 INSWITCH nonzero means don't process %-sequences in SPEC;
4570 in this case, % is treated as an ordinary character.
4571 This is used while substituting switches.
4572 INSWITCH nonzero also causes SPC not to terminate an argument.
4574 Value is zero unless a line was finished
4575 and the command on that line reported an error. */
4577 static int
4578 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4580 const char *p = spec;
4581 int c;
4582 int i;
4583 int value;
4585 /* If it's an empty string argument to a switch, keep it as is. */
4586 if (inswitch && !*p)
4587 arg_going = 1;
4589 while ((c = *p++))
4590 /* If substituting a switch, treat all chars like letters.
4591 Otherwise, NL, SPC, TAB and % are special. */
4592 switch (inswitch ? 'a' : c)
4594 case '\n':
4595 end_going_arg ();
4597 if (argbuf.length () > 0
4598 && !strcmp (argbuf.last (), "|"))
4600 /* A `|' before the newline means use a pipe here,
4601 but only if -pipe was specified.
4602 Otherwise, execute now and don't pass the `|' as an arg. */
4603 if (use_pipes)
4605 input_from_pipe = 1;
4606 break;
4608 else
4609 argbuf.pop ();
4612 set_collect_gcc_options ();
4614 if (argbuf.length () > 0)
4616 value = execute ();
4617 if (value)
4618 return value;
4620 /* Reinitialize for a new command, and for a new argument. */
4621 clear_args ();
4622 arg_going = 0;
4623 delete_this_arg = 0;
4624 this_is_output_file = 0;
4625 this_is_library_file = 0;
4626 this_is_linker_script = 0;
4627 input_from_pipe = 0;
4628 break;
4630 case '|':
4631 end_going_arg ();
4633 /* Use pipe */
4634 obstack_1grow (&obstack, c);
4635 arg_going = 1;
4636 break;
4638 case '\t':
4639 case ' ':
4640 end_going_arg ();
4642 /* Reinitialize for a new argument. */
4643 delete_this_arg = 0;
4644 this_is_output_file = 0;
4645 this_is_library_file = 0;
4646 this_is_linker_script = 0;
4647 break;
4649 case '%':
4650 switch (c = *p++)
4652 case 0:
4653 fatal_error ("spec %qs invalid", spec);
4655 case 'b':
4656 if (save_temps_length)
4657 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4658 else
4659 obstack_grow (&obstack, input_basename, basename_length);
4660 if (compare_debug < 0)
4661 obstack_grow (&obstack, ".gk", 3);
4662 arg_going = 1;
4663 break;
4665 case 'B':
4666 if (save_temps_length)
4667 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4668 else
4669 obstack_grow (&obstack, input_basename, suffixed_basename_length);
4670 if (compare_debug < 0)
4671 obstack_grow (&obstack, ".gk", 3);
4672 arg_going = 1;
4673 break;
4675 case 'd':
4676 delete_this_arg = 2;
4677 break;
4679 /* Dump out the directories specified with LIBRARY_PATH,
4680 followed by the absolute directories
4681 that we search for startfiles. */
4682 case 'D':
4684 struct spec_path_info info;
4686 info.option = "-L";
4687 info.append_len = 0;
4688 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4689 /* Used on systems which record the specified -L dirs
4690 and use them to search for dynamic linking.
4691 Relative directories always come from -B,
4692 and it is better not to use them for searching
4693 at run time. In particular, stage1 loses. */
4694 info.omit_relative = true;
4695 #else
4696 info.omit_relative = false;
4697 #endif
4698 info.separate_options = false;
4700 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
4702 break;
4704 case 'e':
4705 /* %efoo means report an error with `foo' as error message
4706 and don't execute any more commands for this file. */
4708 const char *q = p;
4709 char *buf;
4710 while (*p != 0 && *p != '\n')
4711 p++;
4712 buf = (char *) alloca (p - q + 1);
4713 strncpy (buf, q, p - q);
4714 buf[p - q] = 0;
4715 error ("%s", _(buf));
4716 return -1;
4718 break;
4719 case 'n':
4720 /* %nfoo means report a notice with `foo' on stderr. */
4722 const char *q = p;
4723 char *buf;
4724 while (*p != 0 && *p != '\n')
4725 p++;
4726 buf = (char *) alloca (p - q + 1);
4727 strncpy (buf, q, p - q);
4728 buf[p - q] = 0;
4729 inform (0, "%s", _(buf));
4730 if (*p)
4731 p++;
4733 break;
4735 case 'j':
4737 struct stat st;
4739 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4740 defined, and it is not a directory, and it is
4741 writable, use it. Otherwise, treat this like any
4742 other temporary file. */
4744 if ((!save_temps_flag)
4745 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4746 && (access (HOST_BIT_BUCKET, W_OK) == 0))
4748 obstack_grow (&obstack, HOST_BIT_BUCKET,
4749 strlen (HOST_BIT_BUCKET));
4750 delete_this_arg = 0;
4751 arg_going = 1;
4752 break;
4755 goto create_temp_file;
4756 case '|':
4757 if (use_pipes)
4759 obstack_1grow (&obstack, '-');
4760 delete_this_arg = 0;
4761 arg_going = 1;
4763 /* consume suffix */
4764 while (*p == '.' || ISALNUM ((unsigned char) *p))
4765 p++;
4766 if (p[0] == '%' && p[1] == 'O')
4767 p += 2;
4769 break;
4771 goto create_temp_file;
4772 case 'm':
4773 if (use_pipes)
4775 /* consume suffix */
4776 while (*p == '.' || ISALNUM ((unsigned char) *p))
4777 p++;
4778 if (p[0] == '%' && p[1] == 'O')
4779 p += 2;
4781 break;
4783 goto create_temp_file;
4784 case 'g':
4785 case 'u':
4786 case 'U':
4787 create_temp_file:
4789 struct temp_name *t;
4790 int suffix_length;
4791 const char *suffix = p;
4792 char *saved_suffix = NULL;
4794 while (*p == '.' || ISALNUM ((unsigned char) *p))
4795 p++;
4796 suffix_length = p - suffix;
4797 if (p[0] == '%' && p[1] == 'O')
4799 p += 2;
4800 /* We don't support extra suffix characters after %O. */
4801 if (*p == '.' || ISALNUM ((unsigned char) *p))
4802 fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
4803 if (suffix_length == 0)
4804 suffix = TARGET_OBJECT_SUFFIX;
4805 else
4807 saved_suffix
4808 = XNEWVEC (char, suffix_length
4809 + strlen (TARGET_OBJECT_SUFFIX));
4810 strncpy (saved_suffix, suffix, suffix_length);
4811 strcpy (saved_suffix + suffix_length,
4812 TARGET_OBJECT_SUFFIX);
4814 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4817 if (compare_debug < 0)
4819 suffix = concat (".gk", suffix, NULL);
4820 suffix_length += 3;
4823 /* If -save-temps=obj and -o were specified, use that for the
4824 temp file. */
4825 if (save_temps_length)
4827 char *tmp;
4828 temp_filename_length
4829 = save_temps_length + suffix_length + 1;
4830 tmp = (char *) alloca (temp_filename_length);
4831 memcpy (tmp, save_temps_prefix, save_temps_length);
4832 memcpy (tmp + save_temps_length, suffix, suffix_length);
4833 tmp[save_temps_length + suffix_length] = '\0';
4834 temp_filename = save_string (tmp, save_temps_length
4835 + suffix_length);
4836 obstack_grow (&obstack, temp_filename,
4837 temp_filename_length);
4838 arg_going = 1;
4839 delete_this_arg = 0;
4840 break;
4843 /* If the gcc_input_filename has the same suffix specified
4844 for the %g, %u, or %U, and -save-temps is specified,
4845 we could end up using that file as an intermediate
4846 thus clobbering the user's source file (.e.g.,
4847 gcc -save-temps foo.s would clobber foo.s with the
4848 output of cpp0). So check for this condition and
4849 generate a temp file as the intermediate. */
4851 if (save_temps_flag)
4853 char *tmp;
4854 temp_filename_length = basename_length + suffix_length + 1;
4855 tmp = (char *) alloca (temp_filename_length);
4856 memcpy (tmp, input_basename, basename_length);
4857 memcpy (tmp + basename_length, suffix, suffix_length);
4858 tmp[basename_length + suffix_length] = '\0';
4859 temp_filename = tmp;
4861 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
4863 #ifndef HOST_LACKS_INODE_NUMBERS
4864 struct stat st_temp;
4866 /* Note, set_input() resets input_stat_set to 0. */
4867 if (input_stat_set == 0)
4869 input_stat_set = stat (gcc_input_filename,
4870 &input_stat);
4871 if (input_stat_set >= 0)
4872 input_stat_set = 1;
4875 /* If we have the stat for the gcc_input_filename
4876 and we can do the stat for the temp_filename
4877 then the they could still refer to the same
4878 file if st_dev/st_ino's are the same. */
4879 if (input_stat_set != 1
4880 || stat (temp_filename, &st_temp) < 0
4881 || input_stat.st_dev != st_temp.st_dev
4882 || input_stat.st_ino != st_temp.st_ino)
4883 #else
4884 /* Just compare canonical pathnames. */
4885 char* input_realname = lrealpath (gcc_input_filename);
4886 char* temp_realname = lrealpath (temp_filename);
4887 bool files_differ = filename_cmp (input_realname, temp_realname);
4888 free (input_realname);
4889 free (temp_realname);
4890 if (files_differ)
4891 #endif
4893 temp_filename = save_string (temp_filename,
4894 temp_filename_length + 1);
4895 obstack_grow (&obstack, temp_filename,
4896 temp_filename_length);
4897 arg_going = 1;
4898 delete_this_arg = 0;
4899 break;
4904 /* See if we already have an association of %g/%u/%U and
4905 suffix. */
4906 for (t = temp_names; t; t = t->next)
4907 if (t->length == suffix_length
4908 && strncmp (t->suffix, suffix, suffix_length) == 0
4909 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
4910 break;
4912 /* Make a new association if needed. %u and %j
4913 require one. */
4914 if (t == 0 || c == 'u' || c == 'j')
4916 if (t == 0)
4918 t = XNEW (struct temp_name);
4919 t->next = temp_names;
4920 temp_names = t;
4922 t->length = suffix_length;
4923 if (saved_suffix)
4925 t->suffix = saved_suffix;
4926 saved_suffix = NULL;
4928 else
4929 t->suffix = save_string (suffix, suffix_length);
4930 t->unique = (c == 'u' || c == 'U' || c == 'j');
4931 temp_filename = make_temp_file (t->suffix);
4932 temp_filename_length = strlen (temp_filename);
4933 t->filename = temp_filename;
4934 t->filename_length = temp_filename_length;
4937 free (saved_suffix);
4939 obstack_grow (&obstack, t->filename, t->filename_length);
4940 delete_this_arg = 1;
4942 arg_going = 1;
4943 break;
4945 case 'i':
4946 if (combine_inputs)
4948 if (at_file_supplied)
4950 /* We are going to expand `%i' to `@FILE', where FILE
4951 is a newly-created temporary filename. The filenames
4952 that would usually be expanded in place of %o will be
4953 written to the temporary file. */
4954 char **argv;
4955 int n_files = 0;
4956 int j;
4958 for (i = 0; i < n_infiles; i++)
4959 if (compile_input_file_p (&infiles[i]))
4960 n_files++;
4962 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
4964 /* Copy the strings over. */
4965 for (i = 0, j = 0; i < n_infiles; i++)
4966 if (compile_input_file_p (&infiles[i]))
4968 argv[j] = CONST_CAST (char *, infiles[i].name);
4969 infiles[i].compiled = true;
4970 j++;
4972 argv[j] = NULL;
4974 create_at_file (argv);
4976 else
4977 for (i = 0; (int) i < n_infiles; i++)
4978 if (compile_input_file_p (&infiles[i]))
4980 store_arg (infiles[i].name, 0, 0);
4981 infiles[i].compiled = true;
4984 else
4986 obstack_grow (&obstack, gcc_input_filename,
4987 input_filename_length);
4988 arg_going = 1;
4990 break;
4992 case 'I':
4994 struct spec_path_info info;
4996 if (multilib_dir)
4998 do_spec_1 ("-imultilib", 1, NULL);
4999 /* Make this a separate argument. */
5000 do_spec_1 (" ", 0, NULL);
5001 do_spec_1 (multilib_dir, 1, NULL);
5002 do_spec_1 (" ", 0, NULL);
5005 if (multiarch_dir)
5007 do_spec_1 ("-imultiarch", 1, NULL);
5008 /* Make this a separate argument. */
5009 do_spec_1 (" ", 0, NULL);
5010 do_spec_1 (multiarch_dir, 1, NULL);
5011 do_spec_1 (" ", 0, NULL);
5014 if (gcc_exec_prefix)
5016 do_spec_1 ("-iprefix", 1, NULL);
5017 /* Make this a separate argument. */
5018 do_spec_1 (" ", 0, NULL);
5019 do_spec_1 (gcc_exec_prefix, 1, NULL);
5020 do_spec_1 (" ", 0, NULL);
5023 if (target_system_root_changed ||
5024 (target_system_root && target_sysroot_hdrs_suffix))
5026 do_spec_1 ("-isysroot", 1, NULL);
5027 /* Make this a separate argument. */
5028 do_spec_1 (" ", 0, NULL);
5029 do_spec_1 (target_system_root, 1, NULL);
5030 if (target_sysroot_hdrs_suffix)
5031 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5032 do_spec_1 (" ", 0, NULL);
5035 info.option = "-isystem";
5036 info.append = "include";
5037 info.append_len = strlen (info.append);
5038 info.omit_relative = false;
5039 info.separate_options = true;
5041 for_each_path (&include_prefixes, false, info.append_len,
5042 spec_path, &info);
5044 info.append = "include-fixed";
5045 if (*sysroot_hdrs_suffix_spec)
5046 info.append = concat (info.append, dir_separator_str,
5047 multilib_dir, NULL);
5048 info.append_len = strlen (info.append);
5049 for_each_path (&include_prefixes, false, info.append_len,
5050 spec_path, &info);
5052 break;
5054 case 'o':
5056 int max = n_infiles;
5057 max += lang_specific_extra_outfiles;
5059 if (HAVE_GNU_LD && at_file_supplied)
5061 /* We are going to expand `%o' to `@FILE', where FILE
5062 is a newly-created temporary filename. The filenames
5063 that would usually be expanded in place of %o will be
5064 written to the temporary file. */
5066 char **argv;
5067 int n_files, j;
5069 /* Convert OUTFILES into a form suitable for writeargv. */
5071 /* Determine how many are non-NULL. */
5072 for (n_files = 0, i = 0; i < max; i++)
5073 n_files += outfiles[i] != NULL;
5075 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5077 /* Copy the strings over. */
5078 for (i = 0, j = 0; i < max; i++)
5079 if (outfiles[i])
5081 argv[j] = CONST_CAST (char *, outfiles[i]);
5082 j++;
5084 argv[j] = NULL;
5086 create_at_file (argv);
5088 else
5089 for (i = 0; i < max; i++)
5090 if (outfiles[i])
5091 store_arg (outfiles[i], 0, 0);
5092 break;
5095 case 'O':
5096 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5097 arg_going = 1;
5098 break;
5100 case 's':
5101 this_is_library_file = 1;
5102 break;
5104 case 'T':
5105 this_is_linker_script = 1;
5106 break;
5108 case 'V':
5109 outfiles[input_file_number] = NULL;
5110 break;
5112 case 'w':
5113 this_is_output_file = 1;
5114 break;
5116 case 'W':
5118 unsigned int cur_index = argbuf.length ();
5119 /* Handle the {...} following the %W. */
5120 if (*p != '{')
5121 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
5122 p = handle_braces (p + 1);
5123 if (p == 0)
5124 return -1;
5125 end_going_arg ();
5126 /* If any args were output, mark the last one for deletion
5127 on failure. */
5128 if (argbuf.length () != cur_index)
5129 record_temp_file (argbuf.last (), 0, 1);
5130 break;
5133 /* %x{OPTION} records OPTION for %X to output. */
5134 case 'x':
5136 const char *p1 = p;
5137 char *string;
5138 char *opt;
5139 unsigned ix;
5141 /* Skip past the option value and make a copy. */
5142 if (*p != '{')
5143 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
5144 while (*p++ != '}')
5146 string = save_string (p1 + 1, p - p1 - 2);
5148 /* See if we already recorded this option. */
5149 FOR_EACH_VEC_ELT (linker_options, ix, opt)
5150 if (! strcmp (string, opt))
5152 free (string);
5153 return 0;
5156 /* This option is new; add it. */
5157 add_linker_option (string, strlen (string));
5158 free (string);
5160 break;
5162 /* Dump out the options accumulated previously using %x. */
5163 case 'X':
5164 do_specs_vec (linker_options);
5165 break;
5167 /* Dump out the options accumulated previously using -Wa,. */
5168 case 'Y':
5169 do_specs_vec (assembler_options);
5170 break;
5172 /* Dump out the options accumulated previously using -Wp,. */
5173 case 'Z':
5174 do_specs_vec (preprocessor_options);
5175 break;
5177 /* Here are digits and numbers that just process
5178 a certain constant string as a spec. */
5180 case '1':
5181 value = do_spec_1 (cc1_spec, 0, NULL);
5182 if (value != 0)
5183 return value;
5184 break;
5186 case '2':
5187 value = do_spec_1 (cc1plus_spec, 0, NULL);
5188 if (value != 0)
5189 return value;
5190 break;
5192 case 'a':
5193 value = do_spec_1 (asm_spec, 0, NULL);
5194 if (value != 0)
5195 return value;
5196 break;
5198 case 'A':
5199 value = do_spec_1 (asm_final_spec, 0, NULL);
5200 if (value != 0)
5201 return value;
5202 break;
5204 case 'C':
5206 const char *const spec
5207 = (input_file_compiler->cpp_spec
5208 ? input_file_compiler->cpp_spec
5209 : cpp_spec);
5210 value = do_spec_1 (spec, 0, NULL);
5211 if (value != 0)
5212 return value;
5214 break;
5216 case 'E':
5217 value = do_spec_1 (endfile_spec, 0, NULL);
5218 if (value != 0)
5219 return value;
5220 break;
5222 case 'l':
5223 value = do_spec_1 (link_spec, 0, NULL);
5224 if (value != 0)
5225 return value;
5226 break;
5228 case 'L':
5229 value = do_spec_1 (lib_spec, 0, NULL);
5230 if (value != 0)
5231 return value;
5232 break;
5234 case 'M':
5235 if (multilib_os_dir == NULL)
5236 obstack_1grow (&obstack, '.');
5237 else
5238 obstack_grow (&obstack, multilib_os_dir,
5239 strlen (multilib_os_dir));
5240 break;
5242 case 'G':
5243 value = do_spec_1 (libgcc_spec, 0, NULL);
5244 if (value != 0)
5245 return value;
5246 break;
5248 case 'R':
5249 /* We assume there is a directory
5250 separator at the end of this string. */
5251 if (target_system_root)
5253 obstack_grow (&obstack, target_system_root,
5254 strlen (target_system_root));
5255 if (target_sysroot_suffix)
5256 obstack_grow (&obstack, target_sysroot_suffix,
5257 strlen (target_sysroot_suffix));
5259 break;
5261 case 'S':
5262 value = do_spec_1 (startfile_spec, 0, NULL);
5263 if (value != 0)
5264 return value;
5265 break;
5267 /* Here we define characters other than letters and digits. */
5269 case '{':
5270 p = handle_braces (p);
5271 if (p == 0)
5272 return -1;
5273 break;
5275 case ':':
5276 p = handle_spec_function (p);
5277 if (p == 0)
5278 return -1;
5279 break;
5281 case '%':
5282 obstack_1grow (&obstack, '%');
5283 break;
5285 case '.':
5287 unsigned len = 0;
5289 while (p[len] && p[len] != ' ' && p[len] != '%')
5290 len++;
5291 suffix_subst = save_string (p - 1, len + 1);
5292 p += len;
5294 break;
5296 /* Henceforth ignore the option(s) matching the pattern
5297 after the %<. */
5298 case '<':
5299 case '>':
5301 unsigned len = 0;
5302 int have_wildcard = 0;
5303 int i;
5304 int switch_option;
5306 if (c == '>')
5307 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
5308 else
5309 switch_option = SWITCH_IGNORE;
5311 while (p[len] && p[len] != ' ' && p[len] != '\t')
5312 len++;
5314 if (p[len-1] == '*')
5315 have_wildcard = 1;
5317 for (i = 0; i < n_switches; i++)
5318 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5319 && (have_wildcard || switches[i].part1[len] == '\0'))
5321 switches[i].live_cond |= switch_option;
5322 /* User switch be validated from validate_all_switches.
5323 when the definition is seen from the spec file.
5324 If not defined anywhere, will be rejected. */
5325 if (switches[i].known)
5326 switches[i].validated = true;
5329 p += len;
5331 break;
5333 case '*':
5334 if (soft_matched_part)
5336 if (soft_matched_part[0])
5337 do_spec_1 (soft_matched_part, 1, NULL);
5338 do_spec_1 (" ", 0, NULL);
5340 else
5341 /* Catch the case where a spec string contains something like
5342 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5343 hand side of the :. */
5344 error ("spec failure: %<%%*%> has not been initialized by pattern match");
5345 break;
5347 /* Process a string found as the value of a spec given by name.
5348 This feature allows individual machine descriptions
5349 to add and use their own specs. */
5350 case '(':
5352 const char *name = p;
5353 struct spec_list *sl;
5354 int len;
5356 /* The string after the S/P is the name of a spec that is to be
5357 processed. */
5358 while (*p && *p != ')')
5359 p++;
5361 /* See if it's in the list. */
5362 for (len = p - name, sl = specs; sl; sl = sl->next)
5363 if (sl->name_len == len && !strncmp (sl->name, name, len))
5365 name = *(sl->ptr_spec);
5366 #ifdef DEBUG_SPECS
5367 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
5368 sl->name, name);
5369 #endif
5370 break;
5373 if (sl)
5375 value = do_spec_1 (name, 0, NULL);
5376 if (value != 0)
5377 return value;
5380 /* Discard the closing paren. */
5381 if (*p)
5382 p++;
5384 break;
5386 default:
5387 error ("spec failure: unrecognized spec option %qc", c);
5388 break;
5390 break;
5392 case '\\':
5393 /* Backslash: treat next character as ordinary. */
5394 c = *p++;
5396 /* Fall through. */
5397 default:
5398 /* Ordinary character: put it into the current argument. */
5399 obstack_1grow (&obstack, c);
5400 arg_going = 1;
5403 /* End of string. If we are processing a spec function, we need to
5404 end any pending argument. */
5405 if (processing_spec_function)
5406 end_going_arg ();
5408 return 0;
5411 /* Look up a spec function. */
5413 static const struct spec_function *
5414 lookup_spec_function (const char *name)
5416 const struct spec_function *sf;
5418 for (sf = static_spec_functions; sf->name != NULL; sf++)
5419 if (strcmp (sf->name, name) == 0)
5420 return sf;
5422 return NULL;
5425 /* Evaluate a spec function. */
5427 static const char *
5428 eval_spec_function (const char *func, const char *args)
5430 const struct spec_function *sf;
5431 const char *funcval;
5433 /* Saved spec processing context. */
5434 vec<const_char_p> save_argbuf;
5436 int save_arg_going;
5437 int save_delete_this_arg;
5438 int save_this_is_output_file;
5439 int save_this_is_library_file;
5440 int save_input_from_pipe;
5441 int save_this_is_linker_script;
5442 const char *save_suffix_subst;
5444 int save_growing_size;
5445 void *save_growing_value;
5447 sf = lookup_spec_function (func);
5448 if (sf == NULL)
5449 fatal_error ("unknown spec function %qs", func);
5451 /* Push the spec processing context. */
5452 save_argbuf = argbuf;
5454 save_arg_going = arg_going;
5455 save_delete_this_arg = delete_this_arg;
5456 save_this_is_output_file = this_is_output_file;
5457 save_this_is_library_file = this_is_library_file;
5458 save_this_is_linker_script = this_is_linker_script;
5459 save_input_from_pipe = input_from_pipe;
5460 save_suffix_subst = suffix_subst;
5462 /* If we have some object growing now, finalize it so the args and function
5463 eval proceed from a cleared context. This is needed to prevent the first
5464 constructed arg from mistakenly including the growing value. We'll push
5465 this value back on the obstack once the function evaluation is done, to
5466 restore a consistent processing context for our caller. This is fine as
5467 the address of growing objects isn't guaranteed to remain stable until
5468 they are finalized, and we expect this situation to be rare enough for
5469 the extra copy not to be an issue. */
5470 save_growing_size = obstack_object_size (&obstack);
5471 if (save_growing_size > 0)
5472 save_growing_value = obstack_finish (&obstack);
5474 /* Create a new spec processing context, and build the function
5475 arguments. */
5477 alloc_args ();
5478 if (do_spec_2 (args) < 0)
5479 fatal_error ("error in args to spec function %qs", func);
5481 /* argbuf_index is an index for the next argument to be inserted, and
5482 so contains the count of the args already inserted. */
5484 funcval = (*sf->func) (argbuf.length (),
5485 argbuf.address ());
5487 /* Pop the spec processing context. */
5488 argbuf.release ();
5489 argbuf = save_argbuf;
5491 arg_going = save_arg_going;
5492 delete_this_arg = save_delete_this_arg;
5493 this_is_output_file = save_this_is_output_file;
5494 this_is_library_file = save_this_is_library_file;
5495 this_is_linker_script = save_this_is_linker_script;
5496 input_from_pipe = save_input_from_pipe;
5497 suffix_subst = save_suffix_subst;
5499 if (save_growing_size > 0)
5500 obstack_grow (&obstack, save_growing_value, save_growing_size);
5502 return funcval;
5505 /* Handle a spec function call of the form:
5507 %:function(args)
5509 ARGS is processed as a spec in a separate context and split into an
5510 argument vector in the normal fashion. The function returns a string
5511 containing a spec which we then process in the caller's context, or
5512 NULL if no processing is required. */
5514 static const char *
5515 handle_spec_function (const char *p)
5517 char *func, *args;
5518 const char *endp, *funcval;
5519 int count;
5521 processing_spec_function++;
5523 /* Get the function name. */
5524 for (endp = p; *endp != '\0'; endp++)
5526 if (*endp == '(') /* ) */
5527 break;
5528 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5529 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5530 fatal_error ("malformed spec function name");
5532 if (*endp != '(') /* ) */
5533 fatal_error ("no arguments for spec function");
5534 func = save_string (p, endp - p);
5535 p = ++endp;
5537 /* Get the arguments. */
5538 for (count = 0; *endp != '\0'; endp++)
5540 /* ( */
5541 if (*endp == ')')
5543 if (count == 0)
5544 break;
5545 count--;
5547 else if (*endp == '(') /* ) */
5548 count++;
5550 /* ( */
5551 if (*endp != ')')
5552 fatal_error ("malformed spec function arguments");
5553 args = save_string (p, endp - p);
5554 p = ++endp;
5556 /* p now points to just past the end of the spec function expression. */
5558 funcval = eval_spec_function (func, args);
5559 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5560 p = NULL;
5562 free (func);
5563 free (args);
5565 processing_spec_function--;
5567 return p;
5570 /* Inline subroutine of handle_braces. Returns true if the current
5571 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5572 static inline bool
5573 input_suffix_matches (const char *atom, const char *end_atom)
5575 return (input_suffix
5576 && !strncmp (input_suffix, atom, end_atom - atom)
5577 && input_suffix[end_atom - atom] == '\0');
5580 /* Subroutine of handle_braces. Returns true if the current
5581 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
5582 static bool
5583 input_spec_matches (const char *atom, const char *end_atom)
5585 return (input_file_compiler
5586 && input_file_compiler->suffix
5587 && input_file_compiler->suffix[0] != '\0'
5588 && !strncmp (input_file_compiler->suffix + 1, atom,
5589 end_atom - atom)
5590 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
5593 /* Subroutine of handle_braces. Returns true if a switch
5594 matching the atom bracketed by ATOM and END_ATOM appeared on the
5595 command line. */
5596 static bool
5597 switch_matches (const char *atom, const char *end_atom, int starred)
5599 int i;
5600 int len = end_atom - atom;
5601 int plen = starred ? len : -1;
5603 for (i = 0; i < n_switches; i++)
5604 if (!strncmp (switches[i].part1, atom, len)
5605 && (starred || switches[i].part1[len] == '\0')
5606 && check_live_switch (i, plen))
5607 return true;
5609 /* Check if a switch with separated form matching the atom.
5610 We check -D and -U switches. */
5611 else if (switches[i].args != 0)
5613 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
5614 && *switches[i].part1 == atom[0])
5616 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
5617 && (starred || (switches[i].part1[1] == '\0'
5618 && switches[i].args[0][len - 1] == '\0'))
5619 && check_live_switch (i, (starred ? 1 : -1)))
5620 return true;
5624 return false;
5627 /* Inline subroutine of handle_braces. Mark all of the switches which
5628 match ATOM (extends to END_ATOM; STARRED indicates whether there
5629 was a star after the atom) for later processing. */
5630 static inline void
5631 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5633 int i;
5634 int len = end_atom - atom;
5635 int plen = starred ? len : -1;
5637 for (i = 0; i < n_switches; i++)
5638 if (!strncmp (switches[i].part1, atom, len)
5639 && (starred || switches[i].part1[len] == '\0')
5640 && check_live_switch (i, plen))
5641 switches[i].ordering = 1;
5644 /* Inline subroutine of handle_braces. Process all the currently
5645 marked switches through give_switch, and clear the marks. */
5646 static inline void
5647 process_marked_switches (void)
5649 int i;
5651 for (i = 0; i < n_switches; i++)
5652 if (switches[i].ordering == 1)
5654 switches[i].ordering = 0;
5655 give_switch (i, 0);
5659 /* Handle a %{ ... } construct. P points just inside the leading {.
5660 Returns a pointer one past the end of the brace block, or 0
5661 if we call do_spec_1 and that returns -1. */
5663 static const char *
5664 handle_braces (const char *p)
5666 const char *atom, *end_atom;
5667 const char *d_atom = NULL, *d_end_atom = NULL;
5668 const char *orig = p;
5670 bool a_is_suffix;
5671 bool a_is_spectype;
5672 bool a_is_starred;
5673 bool a_is_negated;
5674 bool a_matched;
5676 bool a_must_be_last = false;
5677 bool ordered_set = false;
5678 bool disjunct_set = false;
5679 bool disj_matched = false;
5680 bool disj_starred = true;
5681 bool n_way_choice = false;
5682 bool n_way_matched = false;
5684 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
5688 if (a_must_be_last)
5689 goto invalid;
5691 /* Scan one "atom" (S in the description above of %{}, possibly
5692 with '!', '.', '@', ',', or '*' modifiers). */
5693 a_matched = false;
5694 a_is_suffix = false;
5695 a_is_starred = false;
5696 a_is_negated = false;
5697 a_is_spectype = false;
5699 SKIP_WHITE();
5700 if (*p == '!')
5701 p++, a_is_negated = true;
5703 SKIP_WHITE();
5704 if (*p == '.')
5705 p++, a_is_suffix = true;
5706 else if (*p == ',')
5707 p++, a_is_spectype = true;
5709 atom = p;
5710 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
5711 || *p == ',' || *p == '.' || *p == '@')
5712 p++;
5713 end_atom = p;
5715 if (*p == '*')
5716 p++, a_is_starred = 1;
5718 SKIP_WHITE();
5719 switch (*p)
5721 case '&': case '}':
5722 /* Substitute the switch(es) indicated by the current atom. */
5723 ordered_set = true;
5724 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
5725 || a_is_spectype || atom == end_atom)
5726 goto invalid;
5728 mark_matching_switches (atom, end_atom, a_is_starred);
5730 if (*p == '}')
5731 process_marked_switches ();
5732 break;
5734 case '|': case ':':
5735 /* Substitute some text if the current atom appears as a switch
5736 or suffix. */
5737 disjunct_set = true;
5738 if (ordered_set)
5739 goto invalid;
5741 if (atom == end_atom)
5743 if (!n_way_choice || disj_matched || *p == '|'
5744 || a_is_negated || a_is_suffix || a_is_spectype
5745 || a_is_starred)
5746 goto invalid;
5748 /* An empty term may appear as the last choice of an
5749 N-way choice set; it means "otherwise". */
5750 a_must_be_last = true;
5751 disj_matched = !n_way_matched;
5752 disj_starred = false;
5754 else
5756 if ((a_is_suffix || a_is_spectype) && a_is_starred)
5757 goto invalid;
5759 if (!a_is_starred)
5760 disj_starred = false;
5762 /* Don't bother testing this atom if we already have a
5763 match. */
5764 if (!disj_matched && !n_way_matched)
5766 if (a_is_suffix)
5767 a_matched = input_suffix_matches (atom, end_atom);
5768 else if (a_is_spectype)
5769 a_matched = input_spec_matches (atom, end_atom);
5770 else
5771 a_matched = switch_matches (atom, end_atom, a_is_starred);
5773 if (a_matched != a_is_negated)
5775 disj_matched = true;
5776 d_atom = atom;
5777 d_end_atom = end_atom;
5782 if (*p == ':')
5784 /* Found the body, that is, the text to substitute if the
5785 current disjunction matches. */
5786 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
5787 disj_matched && !n_way_matched);
5788 if (p == 0)
5789 return 0;
5791 /* If we have an N-way choice, reset state for the next
5792 disjunction. */
5793 if (*p == ';')
5795 n_way_choice = true;
5796 n_way_matched |= disj_matched;
5797 disj_matched = false;
5798 disj_starred = true;
5799 d_atom = d_end_atom = NULL;
5802 break;
5804 default:
5805 goto invalid;
5808 while (*p++ != '}');
5810 return p;
5812 invalid:
5813 fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
5815 #undef SKIP_WHITE
5818 /* Subroutine of handle_braces. Scan and process a brace substitution body
5819 (X in the description of %{} syntax). P points one past the colon;
5820 ATOM and END_ATOM bracket the first atom which was found to be true
5821 (present) in the current disjunction; STARRED indicates whether all
5822 the atoms in the current disjunction were starred (for syntax validation);
5823 MATCHED indicates whether the disjunction matched or not, and therefore
5824 whether or not the body is to be processed through do_spec_1 or just
5825 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
5826 returns -1. */
5828 static const char *
5829 process_brace_body (const char *p, const char *atom, const char *end_atom,
5830 int starred, int matched)
5832 const char *body, *end_body;
5833 unsigned int nesting_level;
5834 bool have_subst = false;
5836 /* Locate the closing } or ;, honoring nested braces.
5837 Trim trailing whitespace. */
5838 body = p;
5839 nesting_level = 1;
5840 for (;;)
5842 if (*p == '{')
5843 nesting_level++;
5844 else if (*p == '}')
5846 if (!--nesting_level)
5847 break;
5849 else if (*p == ';' && nesting_level == 1)
5850 break;
5851 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
5852 have_subst = true;
5853 else if (*p == '\0')
5854 goto invalid;
5855 p++;
5858 end_body = p;
5859 while (end_body[-1] == ' ' || end_body[-1] == '\t')
5860 end_body--;
5862 if (have_subst && !starred)
5863 goto invalid;
5865 if (matched)
5867 /* Copy the substitution body to permanent storage and execute it.
5868 If have_subst is false, this is a simple matter of running the
5869 body through do_spec_1... */
5870 char *string = save_string (body, end_body - body);
5871 if (!have_subst)
5873 if (do_spec_1 (string, 0, NULL) < 0)
5874 return 0;
5876 else
5878 /* ... but if have_subst is true, we have to process the
5879 body once for each matching switch, with %* set to the
5880 variant part of the switch. */
5881 unsigned int hard_match_len = end_atom - atom;
5882 int i;
5884 for (i = 0; i < n_switches; i++)
5885 if (!strncmp (switches[i].part1, atom, hard_match_len)
5886 && check_live_switch (i, hard_match_len))
5888 if (do_spec_1 (string, 0,
5889 &switches[i].part1[hard_match_len]) < 0)
5890 return 0;
5891 /* Pass any arguments this switch has. */
5892 give_switch (i, 1);
5893 suffix_subst = NULL;
5898 return p;
5900 invalid:
5901 fatal_error ("braced spec body %qs is invalid", body);
5904 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5905 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
5906 spec, or -1 if either exact match or %* is used.
5908 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
5909 whose value does not begin with "no-" is obsoleted by the same value
5910 with the "no-", similarly for a switch with the "no-" prefix. */
5912 static int
5913 check_live_switch (int switchnum, int prefix_length)
5915 const char *name = switches[switchnum].part1;
5916 int i;
5918 /* If we already processed this switch and determined if it was
5919 live or not, return our past determination. */
5920 if (switches[switchnum].live_cond != 0)
5921 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
5922 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
5923 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
5924 == 0);
5926 /* In the common case of {<at-most-one-letter>*}, a negating
5927 switch would always match, so ignore that case. We will just
5928 send the conflicting switches to the compiler phase. */
5929 if (prefix_length >= 0 && prefix_length <= 1)
5930 return 1;
5932 /* Now search for duplicate in a manner that depends on the name. */
5933 switch (*name)
5935 case 'O':
5936 for (i = switchnum + 1; i < n_switches; i++)
5937 if (switches[i].part1[0] == 'O')
5939 switches[switchnum].validated = true;
5940 switches[switchnum].live_cond = SWITCH_FALSE;
5941 return 0;
5943 break;
5945 case 'W': case 'f': case 'm': case 'g':
5946 if (! strncmp (name + 1, "no-", 3))
5948 /* We have Xno-YYY, search for XYYY. */
5949 for (i = switchnum + 1; i < n_switches; i++)
5950 if (switches[i].part1[0] == name[0]
5951 && ! strcmp (&switches[i].part1[1], &name[4]))
5953 /* --specs are validated with the validate_switches mechanism. */
5954 if (switches[switchnum].known)
5955 switches[switchnum].validated = true;
5956 switches[switchnum].live_cond = SWITCH_FALSE;
5957 return 0;
5960 else
5962 /* We have XYYY, search for Xno-YYY. */
5963 for (i = switchnum + 1; i < n_switches; i++)
5964 if (switches[i].part1[0] == name[0]
5965 && switches[i].part1[1] == 'n'
5966 && switches[i].part1[2] == 'o'
5967 && switches[i].part1[3] == '-'
5968 && !strcmp (&switches[i].part1[4], &name[1]))
5970 /* --specs are validated with the validate_switches mechanism. */
5971 if (switches[switchnum].known)
5972 switches[switchnum].validated = true;
5973 switches[switchnum].live_cond = SWITCH_FALSE;
5974 return 0;
5977 break;
5980 /* Otherwise the switch is live. */
5981 switches[switchnum].live_cond |= SWITCH_LIVE;
5982 return 1;
5985 /* Pass a switch to the current accumulating command
5986 in the same form that we received it.
5987 SWITCHNUM identifies the switch; it is an index into
5988 the vector of switches gcc received, which is `switches'.
5989 This cannot fail since it never finishes a command line.
5991 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
5993 static void
5994 give_switch (int switchnum, int omit_first_word)
5996 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
5997 return;
5999 if (!omit_first_word)
6001 do_spec_1 ("-", 0, NULL);
6002 do_spec_1 (switches[switchnum].part1, 1, NULL);
6005 if (switches[switchnum].args != 0)
6007 const char **p;
6008 for (p = switches[switchnum].args; *p; p++)
6010 const char *arg = *p;
6012 do_spec_1 (" ", 0, NULL);
6013 if (suffix_subst)
6015 unsigned length = strlen (arg);
6016 int dot = 0;
6018 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6019 if (arg[length] == '.')
6021 (CONST_CAST(char *, arg))[length] = 0;
6022 dot = 1;
6023 break;
6025 do_spec_1 (arg, 1, NULL);
6026 if (dot)
6027 (CONST_CAST(char *, arg))[length] = '.';
6028 do_spec_1 (suffix_subst, 1, NULL);
6030 else
6031 do_spec_1 (arg, 1, NULL);
6035 do_spec_1 (" ", 0, NULL);
6036 switches[switchnum].validated = true;
6039 /* Search for a file named NAME trying various prefixes including the
6040 user's -B prefix and some standard ones.
6041 Return the absolute file name found. If nothing is found, return NAME. */
6043 static const char *
6044 find_file (const char *name)
6046 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6047 return newname ? newname : name;
6050 /* Determine whether a directory exists. If LINKER, return 0 for
6051 certain fixed names not needed by the linker. */
6053 static int
6054 is_directory (const char *path1, bool linker)
6056 int len1;
6057 char *path;
6058 char *cp;
6059 struct stat st;
6061 /* Ensure the string ends with "/.". The resulting path will be a
6062 directory even if the given path is a symbolic link. */
6063 len1 = strlen (path1);
6064 path = (char *) alloca (3 + len1);
6065 memcpy (path, path1, len1);
6066 cp = path + len1;
6067 if (!IS_DIR_SEPARATOR (cp[-1]))
6068 *cp++ = DIR_SEPARATOR;
6069 *cp++ = '.';
6070 *cp = '\0';
6072 /* Exclude directories that the linker is known to search. */
6073 if (linker
6074 && IS_DIR_SEPARATOR (path[0])
6075 && ((cp - path == 6
6076 && filename_ncmp (path + 1, "lib", 3) == 0)
6077 || (cp - path == 10
6078 && filename_ncmp (path + 1, "usr", 3) == 0
6079 && IS_DIR_SEPARATOR (path[4])
6080 && filename_ncmp (path + 5, "lib", 3) == 0)))
6081 return 0;
6083 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6086 /* Set up the various global variables to indicate that we're processing
6087 the input file named FILENAME. */
6089 void
6090 set_input (const char *filename)
6092 const char *p;
6094 gcc_input_filename = filename;
6095 input_filename_length = strlen (gcc_input_filename);
6096 input_basename = lbasename (gcc_input_filename);
6098 /* Find a suffix starting with the last period,
6099 and set basename_length to exclude that suffix. */
6100 basename_length = strlen (input_basename);
6101 suffixed_basename_length = basename_length;
6102 p = input_basename + basename_length;
6103 while (p != input_basename && *p != '.')
6104 --p;
6105 if (*p == '.' && p != input_basename)
6107 basename_length = p - input_basename;
6108 input_suffix = p + 1;
6110 else
6111 input_suffix = "";
6113 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6114 we will need to do a stat on the gcc_input_filename. The
6115 INPUT_STAT_SET signals that the stat is needed. */
6116 input_stat_set = 0;
6119 /* On fatal signals, delete all the temporary files. */
6121 static void
6122 fatal_signal (int signum)
6124 signal (signum, SIG_DFL);
6125 delete_failure_queue ();
6126 delete_temp_files ();
6127 /* Get the same signal again, this time not handled,
6128 so its normal effect occurs. */
6129 kill (getpid (), signum);
6132 /* Compare the contents of the two files named CMPFILE[0] and
6133 CMPFILE[1]. Return zero if they're identical, nonzero
6134 otherwise. */
6136 static int
6137 compare_files (char *cmpfile[])
6139 int ret = 0;
6140 FILE *temp[2] = { NULL, NULL };
6141 int i;
6143 #if HAVE_MMAP_FILE
6145 size_t length[2];
6146 void *map[2] = { NULL, NULL };
6148 for (i = 0; i < 2; i++)
6150 struct stat st;
6152 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6154 error ("%s: could not determine length of compare-debug file %s",
6155 gcc_input_filename, cmpfile[i]);
6156 ret = 1;
6157 break;
6160 length[i] = st.st_size;
6163 if (!ret && length[0] != length[1])
6165 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
6166 ret = 1;
6169 if (!ret)
6170 for (i = 0; i < 2; i++)
6172 int fd = open (cmpfile[i], O_RDONLY);
6173 if (fd < 0)
6175 error ("%s: could not open compare-debug file %s",
6176 gcc_input_filename, cmpfile[i]);
6177 ret = 1;
6178 break;
6181 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6182 close (fd);
6184 if (map[i] == (void *) MAP_FAILED)
6186 ret = -1;
6187 break;
6191 if (!ret)
6193 if (memcmp (map[0], map[1], length[0]) != 0)
6195 error ("%s: -fcompare-debug failure", gcc_input_filename);
6196 ret = 1;
6200 for (i = 0; i < 2; i++)
6201 if (map[i])
6202 munmap ((caddr_t) map[i], length[i]);
6204 if (ret >= 0)
6205 return ret;
6207 ret = 0;
6209 #endif
6211 for (i = 0; i < 2; i++)
6213 temp[i] = fopen (cmpfile[i], "r");
6214 if (!temp[i])
6216 error ("%s: could not open compare-debug file %s",
6217 gcc_input_filename, cmpfile[i]);
6218 ret = 1;
6219 break;
6223 if (!ret && temp[0] && temp[1])
6224 for (;;)
6226 int c0, c1;
6227 c0 = fgetc (temp[0]);
6228 c1 = fgetc (temp[1]);
6230 if (c0 != c1)
6232 error ("%s: -fcompare-debug failure",
6233 gcc_input_filename);
6234 ret = 1;
6235 break;
6238 if (c0 == EOF)
6239 break;
6242 for (i = 1; i >= 0; i--)
6244 if (temp[i])
6245 fclose (temp[i]);
6248 return ret;
6251 extern int main (int, char **);
6254 main (int argc, char **argv)
6256 size_t i;
6257 int value;
6258 int linker_was_run = 0;
6259 int lang_n_infiles = 0;
6260 int num_linker_inputs = 0;
6261 char *explicit_link_files;
6262 char *specs_file;
6263 char *lto_wrapper_file;
6264 const char *p;
6265 struct user_specs *uptr;
6266 char **old_argv = argv;
6267 struct cl_decoded_option *decoded_options;
6268 unsigned int decoded_options_count;
6270 p = argv[0] + strlen (argv[0]);
6271 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6272 --p;
6273 progname = p;
6275 xmalloc_set_program_name (progname);
6277 expandargv (&argc, &argv);
6279 /* Determine if any expansions were made. */
6280 if (argv != old_argv)
6281 at_file_supplied = true;
6283 /* Register the language-independent parameters. */
6284 global_init_params ();
6285 finish_params ();
6287 init_options_struct (&global_options, &global_options_set);
6289 decode_cmdline_options_to_array (argc, CONST_CAST2 (const char **, char **,
6290 argv),
6291 CL_DRIVER,
6292 &decoded_options, &decoded_options_count);
6294 /* Unlock the stdio streams. */
6295 unlock_std_streams ();
6297 gcc_init_libintl ();
6299 diagnostic_initialize (global_dc, 0);
6301 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6302 /* Perform host dependent initialization when needed. */
6303 GCC_DRIVER_HOST_INITIALIZATION;
6304 #endif
6306 if (atexit (delete_temp_files) != 0)
6307 fatal_error ("atexit failed");
6309 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6310 signal (SIGINT, fatal_signal);
6311 #ifdef SIGHUP
6312 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6313 signal (SIGHUP, fatal_signal);
6314 #endif
6315 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6316 signal (SIGTERM, fatal_signal);
6317 #ifdef SIGPIPE
6318 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6319 signal (SIGPIPE, fatal_signal);
6320 #endif
6321 #ifdef SIGCHLD
6322 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6323 receive the signal. A different setting is inheritable */
6324 signal (SIGCHLD, SIG_DFL);
6325 #endif
6327 /* Parsing and gimplification sometimes need quite large stack.
6328 Increase stack size limits if possible. */
6329 stack_limit_increase (64 * 1024 * 1024);
6331 /* Allocate the argument vector. */
6332 alloc_args ();
6334 obstack_init (&obstack);
6336 /* Build multilib_select, et. al from the separate lines that make up each
6337 multilib selection. */
6339 const char *const *q = multilib_raw;
6340 int need_space;
6342 obstack_init (&multilib_obstack);
6343 while ((p = *q++) != (char *) 0)
6344 obstack_grow (&multilib_obstack, p, strlen (p));
6346 obstack_1grow (&multilib_obstack, 0);
6347 multilib_select = XOBFINISH (&multilib_obstack, const char *);
6349 q = multilib_matches_raw;
6350 while ((p = *q++) != (char *) 0)
6351 obstack_grow (&multilib_obstack, p, strlen (p));
6353 obstack_1grow (&multilib_obstack, 0);
6354 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6356 q = multilib_exclusions_raw;
6357 while ((p = *q++) != (char *) 0)
6358 obstack_grow (&multilib_obstack, p, strlen (p));
6360 obstack_1grow (&multilib_obstack, 0);
6361 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6363 q = multilib_reuse_raw;
6364 while ((p = *q++) != (char *) 0)
6365 obstack_grow (&multilib_obstack, p, strlen (p));
6367 obstack_1grow (&multilib_obstack, 0);
6368 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
6370 need_space = FALSE;
6371 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6373 if (need_space)
6374 obstack_1grow (&multilib_obstack, ' ');
6375 obstack_grow (&multilib_obstack,
6376 multilib_defaults_raw[i],
6377 strlen (multilib_defaults_raw[i]));
6378 need_space = TRUE;
6381 obstack_1grow (&multilib_obstack, 0);
6382 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6385 #ifdef INIT_ENVIRONMENT
6386 /* Set up any other necessary machine specific environment variables. */
6387 xputenv (INIT_ENVIRONMENT);
6388 #endif
6390 /* Make a table of what switches there are (switches, n_switches).
6391 Make a table of specified input files (infiles, n_infiles).
6392 Decode switches that are handled locally. */
6394 process_command (decoded_options_count, decoded_options);
6396 /* Initialize the vector of specs to just the default.
6397 This means one element containing 0s, as a terminator. */
6399 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
6400 memcpy (compilers, default_compilers, sizeof default_compilers);
6401 n_compilers = n_default_compilers;
6403 /* Read specs from a file if there is one. */
6405 machine_suffix = concat (spec_machine, dir_separator_str,
6406 spec_version, dir_separator_str, NULL);
6407 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6409 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
6410 /* Read the specs file unless it is a default one. */
6411 if (specs_file != 0 && strcmp (specs_file, "specs"))
6412 read_specs (specs_file, true, false);
6413 else
6414 init_spec ();
6416 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6417 for any override of as, ld and libraries. */
6418 specs_file = (char *) alloca (strlen (standard_exec_prefix)
6419 + strlen (just_machine_suffix) + sizeof ("specs"));
6421 strcpy (specs_file, standard_exec_prefix);
6422 strcat (specs_file, just_machine_suffix);
6423 strcat (specs_file, "specs");
6424 if (access (specs_file, R_OK) == 0)
6425 read_specs (specs_file, true, false);
6427 /* Process any configure-time defaults specified for the command line
6428 options, via OPTION_DEFAULT_SPECS. */
6429 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6430 do_option_spec (option_default_specs[i].name,
6431 option_default_specs[i].spec);
6433 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6434 of the command line. */
6436 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6437 do_self_spec (driver_self_specs[i]);
6439 /* If not cross-compiling, look for executables in the standard
6440 places. */
6441 if (*cross_compile == '0')
6443 if (*md_exec_prefix)
6445 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6446 PREFIX_PRIORITY_LAST, 0, 0);
6450 /* Process sysroot_suffix_spec. */
6451 if (*sysroot_suffix_spec != 0
6452 && !no_sysroot_suffix
6453 && do_spec_2 (sysroot_suffix_spec) == 0)
6455 if (argbuf.length () > 1)
6456 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6457 else if (argbuf.length () == 1)
6458 target_sysroot_suffix = xstrdup (argbuf.last ());
6461 #ifdef HAVE_LD_SYSROOT
6462 /* Pass the --sysroot option to the linker, if it supports that. If
6463 there is a sysroot_suffix_spec, it has already been processed by
6464 this point, so target_system_root really is the system root we
6465 should be using. */
6466 if (target_system_root)
6468 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6469 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6470 set_spec ("link", XOBFINISH (&obstack, const char *), false);
6472 #endif
6474 /* Process sysroot_hdrs_suffix_spec. */
6475 if (*sysroot_hdrs_suffix_spec != 0
6476 && !no_sysroot_suffix
6477 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6479 if (argbuf.length () > 1)
6480 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6481 else if (argbuf.length () == 1)
6482 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
6485 /* Look for startfiles in the standard places. */
6486 if (*startfile_prefix_spec != 0
6487 && do_spec_2 (startfile_prefix_spec) == 0
6488 && do_spec_1 (" ", 0, NULL) == 0)
6490 const char *arg;
6491 int ndx;
6492 FOR_EACH_VEC_ELT (argbuf, ndx, arg)
6493 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
6494 PREFIX_PRIORITY_LAST, 0, 1);
6496 /* We should eventually get rid of all these and stick to
6497 startfile_prefix_spec exclusively. */
6498 else if (*cross_compile == '0' || target_system_root)
6500 if (*md_startfile_prefix)
6501 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6502 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6504 if (*md_startfile_prefix_1)
6505 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6506 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6508 /* If standard_startfile_prefix is relative, base it on
6509 standard_exec_prefix. This lets us move the installed tree
6510 as a unit. If GCC_EXEC_PREFIX is defined, base
6511 standard_startfile_prefix on that as well.
6513 If the prefix is relative, only search it for native compilers;
6514 otherwise we will search a directory containing host libraries. */
6515 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6516 add_sysrooted_prefix (&startfile_prefixes,
6517 standard_startfile_prefix, "BINUTILS",
6518 PREFIX_PRIORITY_LAST, 0, 1);
6519 else if (*cross_compile == '0')
6521 add_prefix (&startfile_prefixes,
6522 concat (gcc_exec_prefix
6523 ? gcc_exec_prefix : standard_exec_prefix,
6524 machine_suffix,
6525 standard_startfile_prefix, NULL),
6526 NULL, PREFIX_PRIORITY_LAST, 0, 1);
6529 /* Sysrooted prefixes are relocated because target_system_root is
6530 also relocated by gcc_exec_prefix. */
6531 if (*standard_startfile_prefix_1)
6532 add_sysrooted_prefix (&startfile_prefixes,
6533 standard_startfile_prefix_1, "BINUTILS",
6534 PREFIX_PRIORITY_LAST, 0, 1);
6535 if (*standard_startfile_prefix_2)
6536 add_sysrooted_prefix (&startfile_prefixes,
6537 standard_startfile_prefix_2, "BINUTILS",
6538 PREFIX_PRIORITY_LAST, 0, 1);
6541 /* Process any user specified specs in the order given on the command
6542 line. */
6543 for (uptr = user_specs_head; uptr; uptr = uptr->next)
6545 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6546 R_OK, true);
6547 read_specs (filename ? filename : uptr->filename, false, true);
6550 /* Process any user self specs. */
6552 struct spec_list *sl;
6553 for (sl = specs; sl; sl = sl->next)
6554 if (sl->name_len == sizeof "self_spec" - 1
6555 && !strcmp (sl->name, "self_spec"))
6556 do_self_spec (*sl->ptr_spec);
6559 if (compare_debug)
6561 enum save_temps save;
6563 if (!compare_debug_second)
6565 n_switches_debug_check[1] = n_switches;
6566 n_switches_alloc_debug_check[1] = n_switches_alloc;
6567 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
6568 n_switches_alloc);
6570 do_self_spec ("%:compare-debug-self-opt()");
6571 n_switches_debug_check[0] = n_switches;
6572 n_switches_alloc_debug_check[0] = n_switches_alloc;
6573 switches_debug_check[0] = switches;
6575 n_switches = n_switches_debug_check[1];
6576 n_switches_alloc = n_switches_alloc_debug_check[1];
6577 switches = switches_debug_check[1];
6580 /* Avoid crash when computing %j in this early. */
6581 save = save_temps_flag;
6582 save_temps_flag = SAVE_TEMPS_NONE;
6584 compare_debug = -compare_debug;
6585 do_self_spec ("%:compare-debug-self-opt()");
6587 save_temps_flag = save;
6589 if (!compare_debug_second)
6591 n_switches_debug_check[1] = n_switches;
6592 n_switches_alloc_debug_check[1] = n_switches_alloc;
6593 switches_debug_check[1] = switches;
6594 compare_debug = -compare_debug;
6595 n_switches = n_switches_debug_check[0];
6596 n_switches_alloc = n_switches_debug_check[0];
6597 switches = switches_debug_check[0];
6602 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
6603 if (gcc_exec_prefix)
6604 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6605 spec_version, dir_separator_str, NULL);
6607 /* Now we have the specs.
6608 Set the `valid' bits for switches that match anything in any spec. */
6610 validate_all_switches ();
6612 /* Now that we have the switches and the specs, set
6613 the subdirectory based on the options. */
6614 set_multilib_dir ();
6616 /* Set up to remember the pathname of gcc and any options
6617 needed for collect. We use argv[0] instead of progname because
6618 we need the complete pathname. */
6619 obstack_init (&collect_obstack);
6620 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6621 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6622 xputenv (XOBFINISH (&collect_obstack, char *));
6624 /* Set up to remember the pathname of the lto wrapper. */
6626 if (have_c)
6627 lto_wrapper_file = NULL;
6628 else
6629 lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
6630 X_OK, false);
6631 if (lto_wrapper_file)
6633 lto_wrapper_file = convert_white_space (lto_wrapper_file);
6634 lto_wrapper_spec = lto_wrapper_file;
6635 obstack_init (&collect_obstack);
6636 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
6637 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
6638 obstack_grow (&collect_obstack, lto_wrapper_spec,
6639 strlen (lto_wrapper_spec) + 1);
6640 xputenv (XOBFINISH (&collect_obstack, char *));
6643 /* Reject switches that no pass was interested in. */
6645 for (i = 0; (int) i < n_switches; i++)
6646 if (! switches[i].validated)
6647 error ("unrecognized command line option %<-%s%>", switches[i].part1);
6649 /* Obey some of the options. */
6651 if (print_search_dirs)
6653 printf (_("install: %s%s\n"),
6654 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
6655 gcc_exec_prefix ? "" : machine_suffix);
6656 printf (_("programs: %s\n"),
6657 build_search_list (&exec_prefixes, "", false, false));
6658 printf (_("libraries: %s\n"),
6659 build_search_list (&startfile_prefixes, "", false, true));
6660 return (0);
6663 if (print_file_name)
6665 printf ("%s\n", find_file (print_file_name));
6666 return (0);
6669 if (print_prog_name)
6671 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6672 printf ("%s\n", (newname ? newname : print_prog_name));
6673 return (0);
6676 if (print_multi_lib)
6678 print_multilib_info ();
6679 return (0);
6682 if (print_multi_directory)
6684 if (multilib_dir == NULL)
6685 printf (".\n");
6686 else
6687 printf ("%s\n", multilib_dir);
6688 return (0);
6691 if (print_multiarch)
6693 if (multiarch_dir == NULL)
6694 printf ("\n");
6695 else
6696 printf ("%s\n", multiarch_dir);
6697 return (0);
6700 if (print_sysroot)
6702 if (target_system_root)
6704 if (target_sysroot_suffix)
6705 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
6706 else
6707 printf ("%s\n", target_system_root);
6709 return (0);
6712 if (print_multi_os_directory)
6714 if (multilib_os_dir == NULL)
6715 printf (".\n");
6716 else
6717 printf ("%s\n", multilib_os_dir);
6718 return (0);
6721 if (print_sysroot_headers_suffix)
6723 if (*sysroot_hdrs_suffix_spec)
6725 printf("%s\n", (target_sysroot_hdrs_suffix
6726 ? target_sysroot_hdrs_suffix
6727 : ""));
6728 return (0);
6730 else
6731 /* The error status indicates that only one set of fixed
6732 headers should be built. */
6733 fatal_error ("not configured with sysroot headers suffix");
6736 if (print_help_list)
6738 display_help ();
6740 if (! verbose_flag)
6742 printf (_("\nFor bug reporting instructions, please see:\n"));
6743 printf ("%s.\n", bug_report_url);
6745 return (0);
6748 /* We do not exit here. Instead we have created a fake input file
6749 called 'help-dummy' which needs to be compiled, and we pass this
6750 on the various sub-processes, along with the --help switch.
6751 Ensure their output appears after ours. */
6752 fputc ('\n', stdout);
6753 fflush (stdout);
6756 if (print_version)
6758 printf (_("%s %s%s\n"), progname, pkgversion_string,
6759 version_string);
6760 printf ("Copyright %s 2013 Free Software Foundation, Inc.\n",
6761 _("(C)"));
6762 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
6763 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
6764 stdout);
6765 if (! verbose_flag)
6766 return 0;
6768 /* We do not exit here. We use the same mechanism of --help to print
6769 the version of the sub-processes. */
6770 fputc ('\n', stdout);
6771 fflush (stdout);
6774 if (verbose_flag)
6776 int n;
6777 const char *thrmod;
6779 fnotice (stderr, "Target: %s\n", spec_machine);
6780 fnotice (stderr, "Configured with: %s\n", configuration_arguments);
6782 #ifdef THREAD_MODEL_SPEC
6783 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6784 but there's no point in doing all this processing just to get
6785 thread_model back. */
6786 obstack_init (&obstack);
6787 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6788 obstack_1grow (&obstack, '\0');
6789 thrmod = XOBFINISH (&obstack, const char *);
6790 #else
6791 thrmod = thread_model;
6792 #endif
6794 fnotice (stderr, "Thread model: %s\n", thrmod);
6796 /* compiler_version is truncated at the first space when initialized
6797 from version string, so truncate version_string at the first space
6798 before comparing. */
6799 for (n = 0; version_string[n]; n++)
6800 if (version_string[n] == ' ')
6801 break;
6803 if (! strncmp (version_string, compiler_version, n)
6804 && compiler_version[n] == 0)
6805 fnotice (stderr, "gcc version %s %s\n", version_string,
6806 pkgversion_string);
6807 else
6808 fnotice (stderr, "gcc driver version %s %sexecuting gcc version %s\n",
6809 version_string, pkgversion_string, compiler_version);
6811 if (n_infiles == 0)
6812 return (0);
6815 if (n_infiles == added_libraries)
6816 fatal_error ("no input files");
6818 if (seen_error ())
6819 goto out;
6821 /* Make a place to record the compiler output file names
6822 that correspond to the input files. */
6824 i = n_infiles;
6825 i += lang_specific_extra_outfiles;
6826 outfiles = XCNEWVEC (const char *, i);
6828 /* Record which files were specified explicitly as link input. */
6830 explicit_link_files = XCNEWVEC (char, n_infiles);
6832 combine_inputs = have_o || flag_wpa;
6834 for (i = 0; (int) i < n_infiles; i++)
6836 const char *name = infiles[i].name;
6837 struct compiler *compiler = lookup_compiler (name,
6838 strlen (name),
6839 infiles[i].language);
6841 if (compiler && !(compiler->combinable))
6842 combine_inputs = false;
6844 if (lang_n_infiles > 0 && compiler != input_file_compiler
6845 && infiles[i].language && infiles[i].language[0] != '*')
6846 infiles[i].incompiler = compiler;
6847 else if (compiler)
6849 lang_n_infiles++;
6850 input_file_compiler = compiler;
6851 infiles[i].incompiler = compiler;
6853 else
6855 /* Since there is no compiler for this input file, assume it is a
6856 linker file. */
6857 explicit_link_files[i] = 1;
6858 infiles[i].incompiler = NULL;
6860 infiles[i].compiled = false;
6861 infiles[i].preprocessed = false;
6864 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
6865 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
6867 for (i = 0; (int) i < n_infiles; i++)
6869 int this_file_error = 0;
6871 /* Tell do_spec what to substitute for %i. */
6873 input_file_number = i;
6874 set_input (infiles[i].name);
6876 if (infiles[i].compiled)
6877 continue;
6879 /* Use the same thing in %o, unless cp->spec says otherwise. */
6881 outfiles[i] = gcc_input_filename;
6883 /* Figure out which compiler from the file's suffix. */
6885 input_file_compiler
6886 = lookup_compiler (infiles[i].name, input_filename_length,
6887 infiles[i].language);
6889 if (input_file_compiler)
6891 /* Ok, we found an applicable compiler. Run its spec. */
6893 if (input_file_compiler->spec[0] == '#')
6895 error ("%s: %s compiler not installed on this system",
6896 gcc_input_filename, &input_file_compiler->spec[1]);
6897 this_file_error = 1;
6899 else
6901 if (compare_debug)
6903 free (debug_check_temp_file[0]);
6904 debug_check_temp_file[0] = NULL;
6906 free (debug_check_temp_file[1]);
6907 debug_check_temp_file[1] = NULL;
6910 value = do_spec (input_file_compiler->spec);
6911 infiles[i].compiled = true;
6912 if (value < 0)
6913 this_file_error = 1;
6914 else if (compare_debug && debug_check_temp_file[0])
6916 if (verbose_flag)
6917 inform (0, "recompiling with -fcompare-debug");
6919 compare_debug = -compare_debug;
6920 n_switches = n_switches_debug_check[1];
6921 n_switches_alloc = n_switches_alloc_debug_check[1];
6922 switches = switches_debug_check[1];
6924 value = do_spec (input_file_compiler->spec);
6926 compare_debug = -compare_debug;
6927 n_switches = n_switches_debug_check[0];
6928 n_switches_alloc = n_switches_alloc_debug_check[0];
6929 switches = switches_debug_check[0];
6931 if (value < 0)
6933 error ("during -fcompare-debug recompilation");
6934 this_file_error = 1;
6937 gcc_assert (debug_check_temp_file[1]
6938 && filename_cmp (debug_check_temp_file[0],
6939 debug_check_temp_file[1]));
6941 if (verbose_flag)
6942 inform (0, "comparing final insns dumps");
6944 if (compare_files (debug_check_temp_file))
6945 this_file_error = 1;
6948 if (compare_debug)
6950 free (debug_check_temp_file[0]);
6951 debug_check_temp_file[0] = NULL;
6953 free (debug_check_temp_file[1]);
6954 debug_check_temp_file[1] = NULL;
6959 /* If this file's name does not contain a recognized suffix,
6960 record it as explicit linker input. */
6962 else
6963 explicit_link_files[i] = 1;
6965 /* Clear the delete-on-failure queue, deleting the files in it
6966 if this compilation failed. */
6968 if (this_file_error)
6970 delete_failure_queue ();
6971 errorcount++;
6973 /* If this compilation succeeded, don't delete those files later. */
6974 clear_failure_queue ();
6977 /* Reset the input file name to the first compile/object file name, for use
6978 with %b in LINK_SPEC. We use the first input file that we can find
6979 a compiler to compile it instead of using infiles.language since for
6980 languages other than C we use aliases that we then lookup later. */
6981 if (n_infiles > 0)
6983 int i;
6985 for (i = 0; i < n_infiles ; i++)
6986 if (infiles[i].incompiler
6987 || (infiles[i].language && infiles[i].language[0] != '*'))
6989 set_input (infiles[i].name);
6990 break;
6994 if (!seen_error ())
6996 /* Make sure INPUT_FILE_NUMBER points to first available open
6997 slot. */
6998 input_file_number = n_infiles;
6999 if (lang_specific_pre_link ())
7000 errorcount++;
7003 /* Determine if there are any linker input files. */
7004 num_linker_inputs = 0;
7005 for (i = 0; (int) i < n_infiles; i++)
7006 if (explicit_link_files[i] || outfiles[i] != NULL)
7007 num_linker_inputs++;
7009 /* Run ld to link all the compiler output files. */
7011 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
7013 int tmp = execution_count;
7015 if (! have_c)
7017 #if HAVE_LTO_PLUGIN > 0
7018 #if HAVE_LTO_PLUGIN == 2
7019 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
7020 #else
7021 const char *fuse_linker_plugin = "fuse-linker-plugin";
7022 #endif
7023 #endif
7025 /* We'll use ld if we can't find collect2. */
7026 if (! strcmp (linker_name_spec, "collect2"))
7028 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7029 if (s == NULL)
7030 linker_name_spec = "ld";
7033 #if HAVE_LTO_PLUGIN > 0
7034 #if HAVE_LTO_PLUGIN == 2
7035 if (!switch_matches (fno_use_linker_plugin,
7036 fno_use_linker_plugin
7037 + strlen (fno_use_linker_plugin), 0))
7038 #else
7039 if (switch_matches (fuse_linker_plugin,
7040 fuse_linker_plugin
7041 + strlen (fuse_linker_plugin), 0))
7042 #endif
7044 char *temp_spec = find_a_file (&exec_prefixes,
7045 LTOPLUGINSONAME, R_OK,
7046 false);
7047 if (!temp_spec)
7048 fatal_error ("-fuse-linker-plugin, but %s not found",
7049 LTOPLUGINSONAME);
7050 linker_plugin_file_spec = convert_white_space (temp_spec);
7052 #endif
7053 lto_gcc_spec = argv[0];
7056 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7057 for collect. */
7058 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7059 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7061 if (print_subprocess_help == 1)
7063 printf (_("\nLinker options\n==============\n\n"));
7064 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7065 " to the linker.\n\n"));
7066 fflush (stdout);
7068 value = do_spec (link_command_spec);
7069 if (value < 0)
7070 errorcount = 1;
7071 linker_was_run = (tmp != execution_count);
7074 /* If options said don't run linker,
7075 complain about input files to be given to the linker. */
7077 if (! linker_was_run && !seen_error ())
7078 for (i = 0; (int) i < n_infiles; i++)
7079 if (explicit_link_files[i]
7080 && !(infiles[i].language && infiles[i].language[0] == '*'))
7081 warning (0, "%s: linker input file unused because linking not done",
7082 outfiles[i]);
7084 /* Delete some or all of the temporary files we made. */
7086 if (seen_error ())
7087 delete_failure_queue ();
7088 delete_temp_files ();
7090 if (print_help_list)
7092 printf (("\nFor bug reporting instructions, please see:\n"));
7093 printf ("%s\n", bug_report_url);
7096 out:
7097 return (signal_count != 0 ? 2
7098 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
7099 : 0);
7102 /* Find the proper compilation spec for the file name NAME,
7103 whose length is LENGTH. LANGUAGE is the specified language,
7104 or 0 if this file is to be passed to the linker. */
7106 static struct compiler *
7107 lookup_compiler (const char *name, size_t length, const char *language)
7109 struct compiler *cp;
7111 /* If this was specified by the user to be a linker input, indicate that. */
7112 if (language != 0 && language[0] == '*')
7113 return 0;
7115 /* Otherwise, look for the language, if one is spec'd. */
7116 if (language != 0)
7118 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7119 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7120 return cp;
7122 error ("language %s not recognized", language);
7123 return 0;
7126 /* Look for a suffix. */
7127 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7129 if (/* The suffix `-' matches only the file name `-'. */
7130 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7131 || (strlen (cp->suffix) < length
7132 /* See if the suffix matches the end of NAME. */
7133 && !strcmp (cp->suffix,
7134 name + length - strlen (cp->suffix))
7136 break;
7139 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7140 /* Look again, but case-insensitively this time. */
7141 if (cp < compilers)
7142 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7144 if (/* The suffix `-' matches only the file name `-'. */
7145 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7146 || (strlen (cp->suffix) < length
7147 /* See if the suffix matches the end of NAME. */
7148 && ((!strcmp (cp->suffix,
7149 name + length - strlen (cp->suffix))
7150 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7151 && !strcasecmp (cp->suffix,
7152 name + length - strlen (cp->suffix)))
7154 break;
7156 #endif
7158 if (cp >= compilers)
7160 if (cp->spec[0] != '@')
7161 /* A non-alias entry: return it. */
7162 return cp;
7164 /* An alias entry maps a suffix to a language.
7165 Search for the language; pass 0 for NAME and LENGTH
7166 to avoid infinite recursion if language not found. */
7167 return lookup_compiler (NULL, 0, cp->spec + 1);
7169 return 0;
7172 static char *
7173 save_string (const char *s, int len)
7175 char *result = XNEWVEC (char, len + 1);
7177 memcpy (result, s, len);
7178 result[len] = 0;
7179 return result;
7182 void
7183 pfatal_with_name (const char *name)
7185 perror_with_name (name);
7186 delete_temp_files ();
7187 exit (1);
7190 static void
7191 perror_with_name (const char *name)
7193 error ("%s: %m", name);
7196 static inline void
7197 validate_switches_from_spec (const char *spec, bool user)
7199 const char *p = spec;
7200 char c;
7201 while ((c = *p++))
7202 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7203 /* We have a switch spec. */
7204 p = validate_switches (p + 1, user);
7207 static void
7208 validate_all_switches (void)
7210 struct compiler *comp;
7211 struct spec_list *spec;
7213 for (comp = compilers; comp->spec; comp++)
7214 validate_switches_from_spec (comp->spec, false);
7216 /* Look through the linked list of specs read from the specs file. */
7217 for (spec = specs; spec; spec = spec->next)
7218 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
7220 validate_switches_from_spec (link_command_spec, false);
7223 /* Look at the switch-name that comes after START
7224 and mark as valid all supplied switches that match it. */
7226 static const char *
7227 validate_switches (const char *start, bool user_spec)
7229 const char *p = start;
7230 const char *atom;
7231 size_t len;
7232 int i;
7233 bool suffix = false;
7234 bool starred = false;
7236 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7238 next_member:
7239 SKIP_WHITE ();
7241 if (*p == '!')
7242 p++;
7244 SKIP_WHITE ();
7245 if (*p == '.' || *p == ',')
7246 suffix = true, p++;
7248 atom = p;
7249 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7250 || *p == ',' || *p == '.' || *p == '@')
7251 p++;
7252 len = p - atom;
7254 if (*p == '*')
7255 starred = true, p++;
7257 SKIP_WHITE ();
7259 if (!suffix)
7261 /* Mark all matching switches as valid. */
7262 for (i = 0; i < n_switches; i++)
7263 if (!strncmp (switches[i].part1, atom, len)
7264 && (starred || switches[i].part1[len] == '\0')
7265 && (switches[i].known || user_spec))
7266 switches[i].validated = true;
7269 if (*p) p++;
7270 if (*p && (p[-1] == '|' || p[-1] == '&'))
7271 goto next_member;
7273 if (*p && p[-1] == ':')
7275 while (*p && *p != ';' && *p != '}')
7277 if (*p == '%')
7279 p++;
7280 if (*p == '{' || *p == '<')
7281 p = validate_switches (p+1, user_spec);
7282 else if (p[0] == 'W' && p[1] == '{')
7283 p = validate_switches (p+2, user_spec);
7285 else
7286 p++;
7289 if (*p) p++;
7290 if (*p && p[-1] == ';')
7291 goto next_member;
7294 return p;
7295 #undef SKIP_WHITE
7298 struct mdswitchstr
7300 const char *str;
7301 int len;
7304 static struct mdswitchstr *mdswitches;
7305 static int n_mdswitches;
7307 /* Check whether a particular argument was used. The first time we
7308 canonicalize the switches to keep only the ones we care about. */
7310 static int
7311 used_arg (const char *p, int len)
7313 struct mswitchstr
7315 const char *str;
7316 const char *replace;
7317 int len;
7318 int rep_len;
7321 static struct mswitchstr *mswitches;
7322 static int n_mswitches;
7323 int i, j;
7325 if (!mswitches)
7327 struct mswitchstr *matches;
7328 const char *q;
7329 int cnt = 0;
7331 /* Break multilib_matches into the component strings of string
7332 and replacement string. */
7333 for (q = multilib_matches; *q != '\0'; q++)
7334 if (*q == ';')
7335 cnt++;
7337 matches
7338 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
7339 i = 0;
7340 q = multilib_matches;
7341 while (*q != '\0')
7343 matches[i].str = q;
7344 while (*q != ' ')
7346 if (*q == '\0')
7348 invalid_matches:
7349 fatal_error ("multilib spec %qs is invalid",
7350 multilib_matches);
7352 q++;
7354 matches[i].len = q - matches[i].str;
7356 matches[i].replace = ++q;
7357 while (*q != ';' && *q != '\0')
7359 if (*q == ' ')
7360 goto invalid_matches;
7361 q++;
7363 matches[i].rep_len = q - matches[i].replace;
7364 i++;
7365 if (*q == ';')
7366 q++;
7369 /* Now build a list of the replacement string for switches that we care
7370 about. Make sure we allocate at least one entry. This prevents
7371 xmalloc from calling fatal, and prevents us from re-executing this
7372 block of code. */
7373 mswitches
7374 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7375 for (i = 0; i < n_switches; i++)
7376 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
7378 int xlen = strlen (switches[i].part1);
7379 for (j = 0; j < cnt; j++)
7380 if (xlen == matches[j].len
7381 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7383 mswitches[n_mswitches].str = matches[j].replace;
7384 mswitches[n_mswitches].len = matches[j].rep_len;
7385 mswitches[n_mswitches].replace = (char *) 0;
7386 mswitches[n_mswitches].rep_len = 0;
7387 n_mswitches++;
7388 break;
7392 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7393 on the command line nor any options mutually incompatible with
7394 them. */
7395 for (i = 0; i < n_mdswitches; i++)
7397 const char *r;
7399 for (q = multilib_options; *q != '\0'; q++)
7401 while (*q == ' ')
7402 q++;
7404 r = q;
7405 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7406 || strchr (" /", q[mdswitches[i].len]) == NULL)
7408 while (*q != ' ' && *q != '/' && *q != '\0')
7409 q++;
7410 if (*q != '/')
7411 break;
7412 q++;
7415 if (*q != ' ' && *q != '\0')
7417 while (*r != ' ' && *r != '\0')
7419 q = r;
7420 while (*q != ' ' && *q != '/' && *q != '\0')
7421 q++;
7423 if (used_arg (r, q - r))
7424 break;
7426 if (*q != '/')
7428 mswitches[n_mswitches].str = mdswitches[i].str;
7429 mswitches[n_mswitches].len = mdswitches[i].len;
7430 mswitches[n_mswitches].replace = (char *) 0;
7431 mswitches[n_mswitches].rep_len = 0;
7432 n_mswitches++;
7433 break;
7436 r = q + 1;
7438 break;
7444 for (i = 0; i < n_mswitches; i++)
7445 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7446 return 1;
7448 return 0;
7451 static int
7452 default_arg (const char *p, int len)
7454 int i;
7456 for (i = 0; i < n_mdswitches; i++)
7457 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7458 return 1;
7460 return 0;
7463 /* Work out the subdirectory to use based on the options. The format of
7464 multilib_select is a list of elements. Each element is a subdirectory
7465 name followed by a list of options followed by a semicolon. The format
7466 of multilib_exclusions is the same, but without the preceding
7467 directory. First gcc will check the exclusions, if none of the options
7468 beginning with an exclamation point are present, and all of the other
7469 options are present, then we will ignore this completely. Passing
7470 that, gcc will consider each multilib_select in turn using the same
7471 rules for matching the options. If a match is found, that subdirectory
7472 will be used.
7473 A subdirectory name is optionally followed by a colon and the corresponding
7474 multiarch name. */
7476 static void
7477 set_multilib_dir (void)
7479 const char *p;
7480 unsigned int this_path_len;
7481 const char *this_path, *this_arg;
7482 const char *start, *end;
7483 int not_arg;
7484 int ok, ndfltok, first;
7486 n_mdswitches = 0;
7487 start = multilib_defaults;
7488 while (*start == ' ' || *start == '\t')
7489 start++;
7490 while (*start != '\0')
7492 n_mdswitches++;
7493 while (*start != ' ' && *start != '\t' && *start != '\0')
7494 start++;
7495 while (*start == ' ' || *start == '\t')
7496 start++;
7499 if (n_mdswitches)
7501 int i = 0;
7503 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
7504 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7506 while (*start == ' ' || *start == '\t')
7507 start++;
7509 if (*start == '\0')
7510 break;
7512 for (end = start + 1;
7513 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7516 obstack_grow (&multilib_obstack, start, end - start);
7517 obstack_1grow (&multilib_obstack, 0);
7518 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
7519 mdswitches[i++].len = end - start;
7521 if (*end == '\0')
7522 break;
7526 p = multilib_exclusions;
7527 while (*p != '\0')
7529 /* Ignore newlines. */
7530 if (*p == '\n')
7532 ++p;
7533 continue;
7536 /* Check the arguments. */
7537 ok = 1;
7538 while (*p != ';')
7540 if (*p == '\0')
7542 invalid_exclusions:
7543 fatal_error ("multilib exclusions %qs is invalid",
7544 multilib_exclusions);
7547 if (! ok)
7549 ++p;
7550 continue;
7553 this_arg = p;
7554 while (*p != ' ' && *p != ';')
7556 if (*p == '\0')
7557 goto invalid_exclusions;
7558 ++p;
7561 if (*this_arg != '!')
7562 not_arg = 0;
7563 else
7565 not_arg = 1;
7566 ++this_arg;
7569 ok = used_arg (this_arg, p - this_arg);
7570 if (not_arg)
7571 ok = ! ok;
7573 if (*p == ' ')
7574 ++p;
7577 if (ok)
7578 return;
7580 ++p;
7583 first = 1;
7584 p = multilib_select;
7586 /* Append multilib reuse rules if any. With those rules, we can reuse
7587 one multilib for certain different options sets. */
7588 if (strlen (multilib_reuse) > 0)
7589 p = concat (p, multilib_reuse, NULL);
7591 while (*p != '\0')
7593 /* Ignore newlines. */
7594 if (*p == '\n')
7596 ++p;
7597 continue;
7600 /* Get the initial path. */
7601 this_path = p;
7602 while (*p != ' ')
7604 if (*p == '\0')
7606 invalid_select:
7607 fatal_error ("multilib select %qs %qs is invalid",
7608 multilib_select, multilib_reuse);
7610 ++p;
7612 this_path_len = p - this_path;
7614 /* Check the arguments. */
7615 ok = 1;
7616 ndfltok = 1;
7617 ++p;
7618 while (*p != ';')
7620 if (*p == '\0')
7621 goto invalid_select;
7623 if (! ok)
7625 ++p;
7626 continue;
7629 this_arg = p;
7630 while (*p != ' ' && *p != ';')
7632 if (*p == '\0')
7633 goto invalid_select;
7634 ++p;
7637 if (*this_arg != '!')
7638 not_arg = 0;
7639 else
7641 not_arg = 1;
7642 ++this_arg;
7645 /* If this is a default argument, we can just ignore it.
7646 This is true even if this_arg begins with '!'. Beginning
7647 with '!' does not mean that this argument is necessarily
7648 inappropriate for this library: it merely means that
7649 there is a more specific library which uses this
7650 argument. If this argument is a default, we need not
7651 consider that more specific library. */
7652 ok = used_arg (this_arg, p - this_arg);
7653 if (not_arg)
7654 ok = ! ok;
7656 if (! ok)
7657 ndfltok = 0;
7659 if (default_arg (this_arg, p - this_arg))
7660 ok = 1;
7662 if (*p == ' ')
7663 ++p;
7666 if (ok && first)
7668 if (this_path_len != 1
7669 || this_path[0] != '.')
7671 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
7672 char *q;
7674 strncpy (new_multilib_dir, this_path, this_path_len);
7675 new_multilib_dir[this_path_len] = '\0';
7676 q = strchr (new_multilib_dir, ':');
7677 if (q != NULL)
7678 *q = '\0';
7679 multilib_dir = new_multilib_dir;
7681 first = 0;
7684 if (ndfltok)
7686 const char *q = this_path, *end = this_path + this_path_len;
7688 while (q < end && *q != ':')
7689 q++;
7690 if (q < end)
7692 const char *q2 = q + 1, *ml_end = end;
7693 char *new_multilib_os_dir;
7695 while (q2 < end && *q2 != ':')
7696 q2++;
7697 if (*q2 == ':')
7698 ml_end = q2;
7699 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
7700 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
7701 new_multilib_os_dir[ml_end - q - 1] = '\0';
7702 multilib_os_dir = *new_multilib_os_dir ? new_multilib_os_dir : ".";
7704 if (q2 < end && *q2 == ':')
7706 char *new_multiarch_dir = XNEWVEC (char, end - q2);
7707 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
7708 new_multiarch_dir[end - q2 - 1] = '\0';
7709 multiarch_dir = new_multiarch_dir;
7711 break;
7715 ++p;
7718 if (multilib_dir == NULL && multilib_os_dir != NULL
7719 && strcmp (multilib_os_dir, ".") == 0)
7721 free (CONST_CAST (char *, multilib_os_dir));
7722 multilib_os_dir = NULL;
7724 else if (multilib_dir != NULL && multilib_os_dir == NULL)
7725 multilib_os_dir = multilib_dir;
7728 /* Print out the multiple library subdirectory selection
7729 information. This prints out a series of lines. Each line looks
7730 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
7731 required. Only the desired options are printed out, the negative
7732 matches. The options are print without a leading dash. There are
7733 no spaces to make it easy to use the information in the shell.
7734 Each subdirectory is printed only once. This assumes the ordering
7735 generated by the genmultilib script. Also, we leave out ones that match
7736 the exclusions. */
7738 static void
7739 print_multilib_info (void)
7741 const char *p = multilib_select;
7742 const char *last_path = 0, *this_path;
7743 int skip;
7744 unsigned int last_path_len = 0;
7746 while (*p != '\0')
7748 skip = 0;
7749 /* Ignore newlines. */
7750 if (*p == '\n')
7752 ++p;
7753 continue;
7756 /* Get the initial path. */
7757 this_path = p;
7758 while (*p != ' ')
7760 if (*p == '\0')
7762 invalid_select:
7763 fatal_error ("multilib select %qs is invalid", multilib_select);
7766 ++p;
7769 /* When --disable-multilib was used but target defines
7770 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
7771 with .:: for multiarch configurations) are there just to find
7772 multilib_os_dir, so skip them from output. */
7773 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
7774 skip = 1;
7776 /* Check for matches with the multilib_exclusions. We don't bother
7777 with the '!' in either list. If any of the exclusion rules match
7778 all of its options with the select rule, we skip it. */
7780 const char *e = multilib_exclusions;
7781 const char *this_arg;
7783 while (*e != '\0')
7785 int m = 1;
7786 /* Ignore newlines. */
7787 if (*e == '\n')
7789 ++e;
7790 continue;
7793 /* Check the arguments. */
7794 while (*e != ';')
7796 const char *q;
7797 int mp = 0;
7799 if (*e == '\0')
7801 invalid_exclusion:
7802 fatal_error ("multilib exclusion %qs is invalid",
7803 multilib_exclusions);
7806 if (! m)
7808 ++e;
7809 continue;
7812 this_arg = e;
7814 while (*e != ' ' && *e != ';')
7816 if (*e == '\0')
7817 goto invalid_exclusion;
7818 ++e;
7821 q = p + 1;
7822 while (*q != ';')
7824 const char *arg;
7825 int len = e - this_arg;
7827 if (*q == '\0')
7828 goto invalid_select;
7830 arg = q;
7832 while (*q != ' ' && *q != ';')
7834 if (*q == '\0')
7835 goto invalid_select;
7836 ++q;
7839 if (! strncmp (arg, this_arg,
7840 (len < q - arg) ? q - arg : len)
7841 || default_arg (this_arg, e - this_arg))
7843 mp = 1;
7844 break;
7847 if (*q == ' ')
7848 ++q;
7851 if (! mp)
7852 m = 0;
7854 if (*e == ' ')
7855 ++e;
7858 if (m)
7860 skip = 1;
7861 break;
7864 if (*e != '\0')
7865 ++e;
7869 if (! skip)
7871 /* If this is a duplicate, skip it. */
7872 skip = (last_path != 0
7873 && (unsigned int) (p - this_path) == last_path_len
7874 && ! filename_ncmp (last_path, this_path, last_path_len));
7876 last_path = this_path;
7877 last_path_len = p - this_path;
7880 /* If this directory requires any default arguments, we can skip
7881 it. We will already have printed a directory identical to
7882 this one which does not require that default argument. */
7883 if (! skip)
7885 const char *q;
7887 q = p + 1;
7888 while (*q != ';')
7890 const char *arg;
7892 if (*q == '\0')
7893 goto invalid_select;
7895 if (*q == '!')
7896 arg = NULL;
7897 else
7898 arg = q;
7900 while (*q != ' ' && *q != ';')
7902 if (*q == '\0')
7903 goto invalid_select;
7904 ++q;
7907 if (arg != NULL
7908 && default_arg (arg, q - arg))
7910 skip = 1;
7911 break;
7914 if (*q == ' ')
7915 ++q;
7919 if (! skip)
7921 const char *p1;
7923 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
7924 putchar (*p1);
7925 putchar (';');
7928 ++p;
7929 while (*p != ';')
7931 int use_arg;
7933 if (*p == '\0')
7934 goto invalid_select;
7936 if (skip)
7938 ++p;
7939 continue;
7942 use_arg = *p != '!';
7944 if (use_arg)
7945 putchar ('@');
7947 while (*p != ' ' && *p != ';')
7949 if (*p == '\0')
7950 goto invalid_select;
7951 if (use_arg)
7952 putchar (*p);
7953 ++p;
7956 if (*p == ' ')
7957 ++p;
7960 if (! skip)
7962 /* If there are extra options, print them now. */
7963 if (multilib_extra && *multilib_extra)
7965 int print_at = TRUE;
7966 const char *q;
7968 for (q = multilib_extra; *q != '\0'; q++)
7970 if (*q == ' ')
7971 print_at = TRUE;
7972 else
7974 if (print_at)
7975 putchar ('@');
7976 putchar (*q);
7977 print_at = FALSE;
7982 putchar ('\n');
7985 ++p;
7989 /* getenv built-in spec function.
7991 Returns the value of the environment variable given by its first
7992 argument, concatenated with the second argument. If the
7993 environment variable is not defined, a fatal error is issued. */
7995 static const char *
7996 getenv_spec_function (int argc, const char **argv)
7998 char *value;
7999 char *result;
8000 char *ptr;
8001 size_t len;
8003 if (argc != 2)
8004 return NULL;
8006 value = getenv (argv[0]);
8007 if (!value)
8008 fatal_error ("environment variable %qs not defined", argv[0]);
8010 /* We have to escape every character of the environment variable so
8011 they are not interpreted as active spec characters. A
8012 particularly painful case is when we are reading a variable
8013 holding a windows path complete with \ separators. */
8014 len = strlen (value) * 2 + strlen (argv[1]) + 1;
8015 result = XNEWVAR (char, len);
8016 for (ptr = result; *value; ptr += 2)
8018 ptr[0] = '\\';
8019 ptr[1] = *value++;
8022 strcpy (ptr, argv[1]);
8024 return result;
8027 /* if-exists built-in spec function.
8029 Checks to see if the file specified by the absolute pathname in
8030 ARGS exists. Returns that pathname if found.
8032 The usual use for this function is to check for a library file
8033 (whose name has been expanded with %s). */
8035 static const char *
8036 if_exists_spec_function (int argc, const char **argv)
8038 /* Must have only one argument. */
8039 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8040 return argv[0];
8042 return NULL;
8045 /* if-exists-else built-in spec function.
8047 This is like if-exists, but takes an additional argument which
8048 is returned if the first argument does not exist. */
8050 static const char *
8051 if_exists_else_spec_function (int argc, const char **argv)
8053 /* Must have exactly two arguments. */
8054 if (argc != 2)
8055 return NULL;
8057 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8058 return argv[0];
8060 return argv[1];
8063 /* replace-outfile built-in spec function.
8065 This looks for the first argument in the outfiles array's name and
8066 replaces it with the second argument. */
8068 static const char *
8069 replace_outfile_spec_function (int argc, const char **argv)
8071 int i;
8072 /* Must have exactly two arguments. */
8073 if (argc != 2)
8074 abort ();
8076 for (i = 0; i < n_infiles; i++)
8078 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
8079 outfiles[i] = xstrdup (argv[1]);
8081 return NULL;
8084 /* remove-outfile built-in spec function.
8086 * This looks for the first argument in the outfiles array's name and
8087 * removes it. */
8089 static const char *
8090 remove_outfile_spec_function (int argc, const char **argv)
8092 int i;
8093 /* Must have exactly one argument. */
8094 if (argc != 1)
8095 abort ();
8097 for (i = 0; i < n_infiles; i++)
8099 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
8100 outfiles[i] = NULL;
8102 return NULL;
8105 /* Given two version numbers, compares the two numbers.
8106 A version number must match the regular expression
8107 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8109 static int
8110 compare_version_strings (const char *v1, const char *v2)
8112 int rresult;
8113 regex_t r;
8115 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8116 REG_EXTENDED | REG_NOSUB) != 0)
8117 abort ();
8118 rresult = regexec (&r, v1, 0, NULL, 0);
8119 if (rresult == REG_NOMATCH)
8120 fatal_error ("invalid version number %qs", v1);
8121 else if (rresult != 0)
8122 abort ();
8123 rresult = regexec (&r, v2, 0, NULL, 0);
8124 if (rresult == REG_NOMATCH)
8125 fatal_error ("invalid version number %qs", v2);
8126 else if (rresult != 0)
8127 abort ();
8129 return strverscmp (v1, v2);
8133 /* version_compare built-in spec function.
8135 This takes an argument of the following form:
8137 <comparison-op> <arg1> [<arg2>] <switch> <result>
8139 and produces "result" if the comparison evaluates to true,
8140 and nothing if it doesn't.
8142 The supported <comparison-op> values are:
8144 >= true if switch is a later (or same) version than arg1
8145 !> opposite of >=
8146 < true if switch is an earlier version than arg1
8147 !< opposite of <
8148 >< true if switch is arg1 or later, and earlier than arg2
8149 <> true if switch is earlier than arg1 or is arg2 or later
8151 If the switch is not present, the condition is false unless
8152 the first character of the <comparison-op> is '!'.
8154 For example,
8155 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8156 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8158 static const char *
8159 version_compare_spec_function (int argc, const char **argv)
8161 int comp1, comp2;
8162 size_t switch_len;
8163 const char *switch_value = NULL;
8164 int nargs = 1, i;
8165 bool result;
8167 if (argc < 3)
8168 fatal_error ("too few arguments to %%:version-compare");
8169 if (argv[0][0] == '\0')
8170 abort ();
8171 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8172 nargs = 2;
8173 if (argc != nargs + 3)
8174 fatal_error ("too many arguments to %%:version-compare");
8176 switch_len = strlen (argv[nargs + 1]);
8177 for (i = 0; i < n_switches; i++)
8178 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8179 && check_live_switch (i, switch_len))
8180 switch_value = switches[i].part1 + switch_len;
8182 if (switch_value == NULL)
8183 comp1 = comp2 = -1;
8184 else
8186 comp1 = compare_version_strings (switch_value, argv[1]);
8187 if (nargs == 2)
8188 comp2 = compare_version_strings (switch_value, argv[2]);
8189 else
8190 comp2 = -1; /* This value unused. */
8193 switch (argv[0][0] << 8 | argv[0][1])
8195 case '>' << 8 | '=':
8196 result = comp1 >= 0;
8197 break;
8198 case '!' << 8 | '<':
8199 result = comp1 >= 0 || switch_value == NULL;
8200 break;
8201 case '<' << 8:
8202 result = comp1 < 0;
8203 break;
8204 case '!' << 8 | '>':
8205 result = comp1 < 0 || switch_value == NULL;
8206 break;
8207 case '>' << 8 | '<':
8208 result = comp1 >= 0 && comp2 < 0;
8209 break;
8210 case '<' << 8 | '>':
8211 result = comp1 < 0 || comp2 >= 0;
8212 break;
8214 default:
8215 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
8217 if (! result)
8218 return NULL;
8220 return argv[nargs + 2];
8223 /* %:include builtin spec function. This differs from %include in that it
8224 can be nested inside a spec, and thus be conditionalized. It takes
8225 one argument, the filename, and looks for it in the startfile path.
8226 The result is always NULL, i.e. an empty expansion. */
8228 static const char *
8229 include_spec_function (int argc, const char **argv)
8231 char *file;
8233 if (argc != 1)
8234 abort ();
8236 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
8237 read_specs (file ? file : argv[0], false, false);
8239 return NULL;
8242 /* %:find-file spec function. This function replaces its argument by
8243 the file found through find_file, that is the -print-file-name gcc
8244 program option. */
8245 static const char *
8246 find_file_spec_function (int argc, const char **argv)
8248 const char *file;
8250 if (argc != 1)
8251 abort ();
8253 file = find_file (argv[0]);
8254 return file;
8258 /* %:find-plugindir spec function. This function replaces its argument
8259 by the -iplugindir=<dir> option. `dir' is found through find_file, that
8260 is the -print-file-name gcc program option. */
8261 static const char *
8262 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
8264 const char *option;
8266 if (argc != 0)
8267 abort ();
8269 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
8270 return option;
8274 /* %:print-asm-header spec function. Print a banner to say that the
8275 following output is from the assembler. */
8277 static const char *
8278 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8279 const char **argv ATTRIBUTE_UNUSED)
8281 printf (_("Assembler options\n=================\n\n"));
8282 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8283 fflush (stdout);
8284 return NULL;
8287 /* Get a random number for -frandom-seed */
8289 static unsigned HOST_WIDE_INT
8290 get_random_number (void)
8292 unsigned HOST_WIDE_INT ret = 0;
8293 int fd;
8295 fd = open ("/dev/urandom", O_RDONLY);
8296 if (fd >= 0)
8298 read (fd, &ret, sizeof (HOST_WIDE_INT));
8299 close (fd);
8300 if (ret)
8301 return ret;
8304 /* Get some more or less random data. */
8305 #ifdef HAVE_GETTIMEOFDAY
8307 struct timeval tv;
8309 gettimeofday (&tv, NULL);
8310 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8312 #else
8314 time_t now = time (NULL);
8316 if (now != (time_t)-1)
8317 ret = (unsigned) now;
8319 #endif
8321 return ret ^ getpid();
8324 /* %:compare-debug-dump-opt spec function. Save the last argument,
8325 expected to be the last -fdump-final-insns option, or generate a
8326 temporary. */
8328 static const char *
8329 compare_debug_dump_opt_spec_function (int arg,
8330 const char **argv ATTRIBUTE_UNUSED)
8332 char *ret;
8333 char *name;
8334 int which;
8335 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
8337 if (arg != 0)
8338 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
8340 do_spec_2 ("%{fdump-final-insns=*:%*}");
8341 do_spec_1 (" ", 0, NULL);
8343 if (argbuf.length () > 0
8344 && strcmp (argv[argbuf.length () - 1], "."))
8346 if (!compare_debug)
8347 return NULL;
8349 name = xstrdup (argv[argbuf.length () - 1]);
8350 ret = NULL;
8352 else
8354 const char *ext = NULL;
8356 if (argbuf.length () > 0)
8358 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8359 ext = ".gkd";
8361 else if (!compare_debug)
8362 return NULL;
8363 else
8364 do_spec_2 ("%g.gkd");
8366 do_spec_1 (" ", 0, NULL);
8368 gcc_assert (argbuf.length () > 0);
8370 name = concat (argbuf.last (), ext, NULL);
8372 ret = concat ("-fdump-final-insns=", name, NULL);
8375 which = compare_debug < 0;
8376 debug_check_temp_file[which] = name;
8378 if (!which)
8380 unsigned HOST_WIDE_INT value = get_random_number ();
8382 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8385 if (*random_seed)
8387 char *tmp = ret;
8388 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8389 ret, NULL);
8390 free (tmp);
8393 if (which)
8394 *random_seed = 0;
8396 return ret;
8399 static const char *debug_auxbase_opt;
8401 /* %:compare-debug-self-opt spec function. Expands to the options
8402 that are to be passed in the second compilation of
8403 compare-debug. */
8405 static const char *
8406 compare_debug_self_opt_spec_function (int arg,
8407 const char **argv ATTRIBUTE_UNUSED)
8409 if (arg != 0)
8410 fatal_error ("too many arguments to %%:compare-debug-self-opt");
8412 if (compare_debug >= 0)
8413 return NULL;
8415 do_spec_2 ("%{c|S:%{o*:%*}}");
8416 do_spec_1 (" ", 0, NULL);
8418 if (argbuf.length () > 0)
8419 debug_auxbase_opt = concat ("-auxbase-strip ",
8420 argbuf.last (),
8421 NULL);
8422 else
8423 debug_auxbase_opt = NULL;
8425 return concat ("\
8426 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8427 %<fdump-final-insns=* -w -S -o %j \
8428 %{!fcompare-debug-second:-fcompare-debug-second} \
8429 ", compare_debug_opt, NULL);
8432 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8433 options that are to be passed in the second compilation of
8434 compare-debug. It expects, as an argument, the basename of the
8435 current input file name, with the .gk suffix appended to it. */
8437 static const char *
8438 compare_debug_auxbase_opt_spec_function (int arg,
8439 const char **argv)
8441 char *name;
8442 int len;
8444 if (arg == 0)
8445 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
8447 if (arg != 1)
8448 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
8450 if (compare_debug >= 0)
8451 return NULL;
8453 len = strlen (argv[0]);
8454 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
8455 fatal_error ("argument to %%:compare-debug-auxbase-opt "
8456 "does not end in .gk");
8458 if (debug_auxbase_opt)
8459 return debug_auxbase_opt;
8461 #define OPT "-auxbase "
8463 len -= 3;
8464 name = (char*) xmalloc (sizeof (OPT) + len);
8465 memcpy (name, OPT, sizeof (OPT) - 1);
8466 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8467 name[sizeof (OPT) - 1 + len] = '\0';
8469 #undef OPT
8471 return name;
8474 /* %:pass-through-libs spec function. Finds all -l options and input
8475 file names in the lib spec passed to it, and makes a list of them
8476 prepended with the plugin option to cause them to be passed through
8477 to the final link after all the new object files have been added. */
8479 const char *
8480 pass_through_libs_spec_func (int argc, const char **argv)
8482 char *prepended = xstrdup (" ");
8483 int n;
8484 /* Shlemiel the painter's algorithm. Innately horrible, but at least
8485 we know that there will never be more than a handful of strings to
8486 concat, and it's only once per run, so it's not worth optimising. */
8487 for (n = 0; n < argc; n++)
8489 char *old = prepended;
8490 /* Anything that isn't an option is a full path to an output
8491 file; pass it through if it ends in '.a'. Among options,
8492 pass only -l. */
8493 if (argv[n][0] == '-' && argv[n][1] == 'l')
8495 const char *lopt = argv[n] + 2;
8496 /* Handle both joined and non-joined -l options. If for any
8497 reason there's a trailing -l with no joined or following
8498 arg just discard it. */
8499 if (!*lopt && ++n >= argc)
8500 break;
8501 else if (!*lopt)
8502 lopt = argv[n];
8503 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
8504 lopt, " ", NULL);
8506 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
8508 prepended = concat (prepended, "-plugin-opt=-pass-through=",
8509 argv[n], " ", NULL);
8511 if (prepended != old)
8512 free (old);
8514 return prepended;
8517 /* %:replace-extension spec function. Replaces the extension of the
8518 first argument with the second argument. */
8520 const char *
8521 replace_extension_spec_func (int argc, const char **argv)
8523 char *name;
8524 char *p;
8525 char *result;
8526 int i;
8528 if (argc != 2)
8529 fatal_error ("too few arguments to %%:replace-extension");
8531 name = xstrdup (argv[0]);
8533 for (i = strlen(name) - 1; i >= 0; i--)
8534 if (IS_DIR_SEPARATOR (name[i]))
8535 break;
8537 p = strrchr (name + i + 1, '.');
8538 if (p != NULL)
8539 *p = '\0';
8541 result = concat (name, argv[1], NULL);
8543 free (name);
8544 return result;
8547 /* Insert backslash before spaces in ORIG (usually a file path), to
8548 avoid being broken by spec parser.
8550 This function is needed as do_spec_1 treats white space (' ' and '\t')
8551 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
8552 the file name should be treated as a single argument rather than being
8553 broken into multiple. Solution is to insert '\\' before the space in a
8554 file name.
8556 This function converts and only converts all occurrence of ' '
8557 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
8558 "a b" -> "a\\ b"
8559 "a b" -> "a\\ \\ b"
8560 "a\tb" -> "a\\\tb"
8561 "a\\ b" -> "a\\\\ b"
8563 orig: input null-terminating string that was allocated by xalloc. The
8564 memory it points to might be freed in this function. Behavior undefined
8565 if ORIG wasn't xalloced or was freed already at entry.
8567 Return: ORIG if no conversion needed. Otherwise a newly allocated string
8568 that was converted from ORIG. */
8570 static char *
8571 convert_white_space (char *orig)
8573 int len, number_of_space = 0;
8575 for (len = 0; orig[len]; len++)
8576 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
8578 if (number_of_space)
8580 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
8581 int j, k;
8582 for (j = 0, k = 0; j <= len; j++, k++)
8584 if (orig[j] == ' ' || orig[j] == '\t')
8585 new_spec[k++] = '\\';
8586 new_spec[k] = orig[j];
8588 free (orig);
8589 return new_spec;
8591 else
8592 return orig;