]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gcc.c
Merge ubsan into trunk.
[thirdparty/gcc.git] / gcc / gcc.c
CommitLineData
d7a9644e 1/* Compiler driver program that can handle many languages.
711789cc 2 Copyright (C) 1987-2013 Free Software Foundation, Inc.
d7a9644e 3
f12b58b3 4This file is part of GCC.
d7a9644e 5
f12b58b3 6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8c4c00c1 8Software Foundation; either version 3, or (at your option) any later
f12b58b3 9version.
d7a9644e 10
f12b58b3 11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
d7a9644e 15
16You should have received a copy of the GNU General Public License
8c4c00c1 17along with GCC; see the file COPYING3. If not see
3d70fb39 18<http://www.gnu.org/licenses/>. */
d7a9644e 19
20/* This program is the user interface to the C compiler and possibly to
21other compilers. It is used because compilation is a complicated procedure
22which involves running several programs and passing temporary files between
23them, forwarding the users switches to those programs selectively,
24and deleting the temporary files at the end.
25
26CC recognizes how to compile each input file by suffixes in the file names.
27Once it knows which kind of compilation to perform, the procedure for
28compilation is specified by a string called a "spec". */
7014838c 29
0dbd1c74 30#include "config.h"
405711de 31#include "system.h"
805e22b2 32#include "coretypes.h"
0a2326d6 33#include "multilib.h" /* before tm.h */
805e22b2 34#include "tm.h"
9b1f316f 35#include "xregex.h"
fe8833f8 36#include "obstack.h"
be2828ce 37#include "intl.h"
7bcdc3c7 38#include "prefix.h"
7f0b0c27 39#include "gcc.h"
460b8bb3 40#include "diagnostic.h"
a6a0d17a 41#include "flags.h"
a1baa5f1 42#include "opts.h"
90336809 43#include "params.h"
9d9edc85 44#include "vec.h"
82715bcd 45#include "filenames.h"
4ee8d66a 46
10f57222 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
d7a9644e 51#endif
99b832c9 52
10f57222 53/* By default there is no special suffix for host executables. */
54#ifdef HOST_EXECUTABLE_SUFFIX
55#define HAVE_HOST_EXECUTABLE_SUFFIX
9ec04dd9 56#else
10f57222 57#define HOST_EXECUTABLE_SUFFIX ""
58#endif
59
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"
499a0933 65#endif
66
e99c3a1d 67static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
b9374a77 68
397f1574 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
73
d7a9644e 74/* If a stage of compilation returns an exit status >= 1,
75 compilation of that file ceases. */
76
77#define MIN_FATAL_STATUS 1
78
258d3911 79/* Flag set by cppspec.c to 1. */
80int is_cpp_driver;
81
80777cd8 82/* Flag set to nonzero if an @file argument has been supplied to gcc. */
c159e0b7 83static bool at_file_supplied;
84
4a0e2d42 85/* Definition of string containing the arguments given to configure. */
86#include "configargs.h"
87
8ace789a 88/* Flag saying to print the command line options understood by gcc and its
89 sub-processes. */
90
91static int print_help_list;
92
39932bd2 93/* Flag saying to print the version of gcc and its sub-processes. */
94
95static int print_version;
96
74e4079a 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. */
102static int verbose_only_flag;
103
87c75316 104/* Flag indicating how to print command line options of sub-processes. */
7a6882ca 105
87c75316 106static int print_subprocess_help;
7a6882ca 107
4537c5d9 108/* Whether we should report subprocess execution times to a file. */
109
110FILE *report_times_to_file = NULL;
111
805e22b2 112/* Nonzero means place this string before uses of /, so that include
113 and library files can be found in an alternate location. */
114
d68c6656 115#ifdef TARGET_SYSTEM_ROOT
805e22b2 116static const char *target_system_root = TARGET_SYSTEM_ROOT;
d68c6656 117#else
118static const char *target_system_root = 0;
119#endif
805e22b2 120
17acc97a 121/* Nonzero means pass the updated target_system_root to the compiler. */
122
123static int target_system_root_changed;
124
4ea70922 125/* Nonzero means append this string to target_system_root. */
126
127static const char *target_sysroot_suffix = 0;
128
129/* Nonzero means append this string to target_system_root for headers. */
130
131static const char *target_sysroot_hdrs_suffix = 0;
132
d7a9644e 133/* Nonzero means write "temp" files in source directory
134 and use the source file's name in them, and don't delete them. */
135
cc92bc82 136static 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;
141
142/* Output file to use to get the object directory for -save-temps=obj */
143static char *save_temps_prefix = 0;
144static size_t save_temps_length = 0;
d7a9644e 145
4dd56bd9 146/* The compiler version. */
d7a9644e 147
e772a198 148static const char *compiler_version;
4dd56bd9 149
cf93b7e8 150/* The target version. */
4dd56bd9 151
3443e1be 152static const char *const spec_version = DEFAULT_TARGET_VERSION;
d7a9644e 153
cf93b7e8 154/* The target machine. */
d7a9644e 155
e40d43cc 156static const char *spec_machine = DEFAULT_TARGET_MACHINE;
d7a9644e 157
a45072dd 158/* Nonzero if cross-compiling.
159 When -b is used, the value comes from the `specs' file. */
160
29d774d0 161#ifdef CROSS_DIRECTORY_STRUCTURE
e772a198 162static const char *cross_compile = "1";
a45072dd 163#else
e772a198 164static const char *cross_compile = "0";
a45072dd 165#endif
166
155b05dc 167/* Greatest exit code of sub-processes that has been encountered up to
168 now. */
169static int greatest_status = 1;
170
d7a9644e 171/* This is the obstack which we use to allocate many strings. */
172
173static struct obstack obstack;
174
8894538a 175/* This is the obstack to build an environment variable to pass to
4bbea254 176 collect2 that describes all of the relevant switches of what to
8894538a 177 pass the compiler in building the list of pointers to constructors
178 and destructors. */
179
180static struct obstack collect_obstack;
181
cbc3c863 182/* Forward declaration for prototypes. */
183struct path_prefix;
42bbc7e6 184struct prefix_list;
cbc3c863 185
952f0048 186static void init_spec (void);
187static void store_arg (const char *, int, int);
0bfd146e 188static void insert_wrapper (const char *);
952f0048 189static char *load_specs (const char *);
556cfe53 190static void read_specs (const char *, bool, bool);
191static void set_spec (const char *, const char *, bool);
952f0048 192static struct compiler *lookup_compiler (const char *, size_t, const char *);
067277c3 193static char *build_search_list (const struct path_prefix *, const char *,
194 bool, bool);
e8105390 195static void xputenv (const char *);
067277c3 196static void putenv_from_prefixes (const struct path_prefix *, const char *,
197 bool);
952f0048 198static int access_check (const char *, int);
067277c3 199static char *find_a_file (const struct path_prefix *, const char *, int, bool);
952f0048 200static void add_prefix (struct path_prefix *, const char *, const char *,
2af84186 201 int, int, int);
952f0048 202static void add_sysrooted_prefix (struct path_prefix *, const char *,
2af84186 203 const char *, int, int, int);
952f0048 204static char *skip_whitespace (char *);
205static void delete_if_ordinary (const char *);
206static void delete_temp_files (void);
207static void delete_failure_queue (void);
208static void clear_failure_queue (void);
209static int check_live_switch (int, int);
210static const char *handle_braces (const char *);
211static inline bool input_suffix_matches (const char *, const char *);
212static inline bool switch_matches (const char *, const char *, int);
213static inline void mark_matching_switches (const char *, const char *, int);
214static inline void process_marked_switches (void);
215static const char *process_brace_body (const char *, const char *, const char *, int, int);
216static const struct spec_function *lookup_spec_function (const char *);
217static const char *eval_spec_function (const char *, const char *);
9e46467d 218static const char *handle_spec_function (const char *, bool *);
952f0048 219static char *save_string (const char *, int);
220static void set_collect_gcc_options (void);
221static int do_spec_1 (const char *, int, const char *);
222static int do_spec_2 (const char *);
223static void do_option_spec (const char *, const char *);
224static void do_self_spec (const char *);
225static const char *find_file (const char *);
067277c3 226static int is_directory (const char *, bool);
556cfe53 227static const char *validate_switches (const char *, bool);
952f0048 228static void validate_all_switches (void);
556cfe53 229static inline void validate_switches_from_spec (const char *, bool);
952f0048 230static void give_switch (int, int);
231static int used_arg (const char *, int);
232static int default_arg (const char *, int);
233static void set_multilib_dir (void);
234static void print_multilib_info (void);
235static void perror_with_name (const char *);
952f0048 236static void display_help (void);
237static void add_preprocessor_option (const char *, int);
238static void add_assembler_option (const char *, int);
239static void add_linker_option (const char *, int);
e62df35b 240static void process_command (unsigned int, struct cl_decoded_option *);
952f0048 241static int execute (void);
242static void alloc_args (void);
243static void clear_args (void);
a922df2e 244static void fatal_signal (int);
ecbfdc87 245#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
952f0048 246static void init_gcc_specs (struct obstack *, const char *, const char *,
247 const char *);
b51d5c7c 248#endif
7e6b5e54 249#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
952f0048 250static const char *convert_filename (const char *, int, int);
7e6b5e54 251#endif
c21b3276 252
0305c755 253static const char *getenv_spec_function (int, const char **);
952f0048 254static const char *if_exists_spec_function (int, const char **);
255static const char *if_exists_else_spec_function (int, const char **);
9e46467d 256static const char *sanitize_spec_function (int, const char **);
2288041e 257static const char *replace_outfile_spec_function (int, const char **);
8127ab5d 258static const char *remove_outfile_spec_function (int, const char **);
9b1f316f 259static const char *version_compare_spec_function (int, const char **);
1e8e9920 260static const char *include_spec_function (int, const char **);
19bc000d 261static const char *find_file_spec_function (int, const char **);
d6bff3e6 262static const char *find_plugindir_spec_function (int, const char **);
ceac8e8c 263static const char *print_asm_header_spec_function (int, const char **);
71278019 264static const char *compare_debug_dump_opt_spec_function (int, const char **);
265static const char *compare_debug_self_opt_spec_function (int, const char **);
266static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
280f8649 267static const char *pass_through_libs_spec_func (int, const char **);
b35329c7 268static const char *replace_extension_spec_func (int, const char **);
40c059b1 269static char *convert_white_space (char *);
d7a9644e 270\f
833a5c07 271/* The Specs Language
272
273Specs are strings containing lines, each of which (if not blank)
d7a9644e 274is made up of a program name, and arguments separated by spaces.
275The program name must be exact and start from root, since no path
276is searched and it is unreliable to depend on the current working directory.
277Redirection of input or output is not supported; the subprograms must
278accept filenames saying what files to read and write.
279
280In addition, the specs can contain %-sequences to substitute variable text
281or for conditional text. Here is a table of all defined %-sequences.
282Note that spaces are not generated automatically around the results of
283expanding these sequences; therefore, you can concatenate them together
284or with constant text in a single argument.
285
286 %% substitute one % into the program name or argument.
287 %i substitute the name of the input file being processed.
288 %b substitute the basename of the input file being processed.
289 This is the substring up to (and not including) the last period
cc92bc82 290 and not including the directory unless -save-temps was specified
d7ee9e9b 291 to put temporaries in a different location.
1cf79a1a 292 %B same as %b, but include the file suffix (text after the last period).
c78c5ee7 293 %gSUFFIX
294 substitute a file name that has suffix SUFFIX and is chosen
295 once per compilation, and mark the argument a la %d. To reduce
296 exposure to denial-of-service attacks, the file name is now
297 chosen in a way that is hard to predict even when previously
298 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
299 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
b78b6a05 300 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
2c2aaf10 301 had been pre-processed. Previously, %g was simply substituted
302 with a file name chosen once per compilation, without regard
303 to any appended suffix (which was therefore treated just like
304 ordinary text), making such attacks more likely to succeed.
805e22b2 305 %|SUFFIX
306 like %g, but if -pipe is in effect, expands simply to "-".
307 %mSUFFIX
308 like %g, but if -pipe is in effect, expands to nothing. (We have both
309 %| and %m to accommodate differences between system assemblers; see
310 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
c78c5ee7 311 %uSUFFIX
312 like %g, but generates a new temporary file name even if %uSUFFIX
313 was already seen.
314 %USUFFIX
315 substitutes the last file name generated with %uSUFFIX, generating a
316 new one if there is no such last file name. In the absence of any
317 %uSUFFIX, this is just like %gSUFFIX, except they don't share
318 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
319 would involve the generation of two distinct file names, one
320 for each `%g.s' and another for each `%U.s'. Previously, %U was
321 simply substituted with a file name chosen for the previous %u,
322 without regard to any appended suffix.
655a58fa 323 %jSUFFIX
324 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
325 writable, and if save-temps is off; otherwise, substitute the name
326 of a temporary file, just like %u. This temporary file is not
327 meant for communication between processes, but rather as a junk
328 disposal mechanism.
bdbd5352 329 %.SUFFIX
330 substitutes .SUFFIX for the suffixes of a matched switch's args when
331 it is subsequently output with %*. SUFFIX is terminated by the next
332 space or %.
d7a9644e 333 %d marks the argument containing or following the %d as a
c68bcf58 334 temporary file name, so that that file will be deleted if GCC exits
d7a9644e 335 successfully. Unlike %g, this contributes no text to the argument.
336 %w marks the argument containing or following the %w as the
337 "output file" of this compilation. This puts the argument
338 into the sequence of arguments that %o will substitute later.
573aba85 339 %V indicates that this compilation produces no "output file".
d7a9644e 340 %W{...}
341 like %{...} but mark last argument supplied within
342 as a file to be deleted on failure.
343 %o substitutes the names of all the output files, with spaces
344 automatically placed around them. You should write spaces
345 around the %o as well or the results are undefined.
346 %o is for use in the specs for running the linker.
347 Input files whose names have no recognized suffix are not compiled
348 at all, but they are included among the output files, so they will
349 be linked.
c78c5ee7 350 %O substitutes the suffix for object files. Note that this is
2c2aaf10 351 handled specially when it immediately follows %g, %u, or %U
352 (with or without a suffix argument) because of the need for
353 those to form complete file names. The handling is such that
354 %O is treated exactly as if it had already been substituted,
355 except that %g, %u, and %U do not currently support additional
356 SUFFIX characters following %O as they would following, for
357 example, `.o'.
17acc97a 358 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
72779020 359 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
360 and -B options) and -imultilib as necessary.
d7a9644e 361 %s current argument is the name of a library or startup file of some sort.
362 Search for that file in a standard list of directories
363 and substitute the full name found.
364 %eSTR Print STR as an error message. STR is terminated by a newline.
365 Use this when inconsistent options are detected.
edc2a478 366 %nSTR Print STR as a notice. STR is terminated by a newline.
d7a9644e 367 %x{OPTION} Accumulate an option for %X.
368 %X Output the accumulated linker options specified by compilations.
69587571 369 %Y Output the accumulated assembler options specified by compilations.
391d9b6e 370 %Z Output the accumulated preprocessor options specified by compilations.
d7a9644e 371 %a process ASM_SPEC as a spec.
372 This allows config.h to specify part of the spec for running as.
373 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
374 used here. This can be used to run a post-processor after the
9e042f31 375 assembler has done its job.
b9374a77 376 %D Dump out a -L option for each directory in startfile_prefixes.
9577d478 377 If multilib_dir is set, extra entries are generated with it affixed.
d7a9644e 378 %l process LINK_SPEC as a spec.
379 %L process LIB_SPEC as a spec.
c93570ad 380 %M Output multilib_os_dir.
b7c87ff2 381 %G process LIBGCC_SPEC as a spec.
b6bcc48f 382 %R Output the concatenation of target_system_root and
383 target_sysroot_suffix.
d7a9644e 384 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
385 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
43198b29 386 %C process CPP_SPEC as a spec.
d7a9644e 387 %1 process CC1_SPEC as a spec.
388 %2 process CC1PLUS_SPEC as a spec.
389 %* substitute the variable part of a matched option. (See below.)
390 Note that each comma in the substituted string is replaced by
391 a single space.
805e22b2 392 %<S remove all occurrences of -S from the command line.
393 Note - this command is position dependent. % commands in the
394 spec string before this one will see -S, % commands in the
395 spec string after this one will not.
5c1421d7 396 %>S Similar to "%<S", but keep it in the GCC command line.
805e22b2 397 %<S* remove all occurrences of all switches beginning with -S from the
398 command line.
c21b3276 399 %:function(args)
400 Call the named function FUNCTION, passing it ARGS. ARGS is
401 first processed as a nested spec string, then split into an
402 argument vector in the usual fashion. The function returns
403 a string which is processed as if it had appeared literally
404 as part of the current spec.
c68bcf58 405 %{S} substitutes the -S switch, if that switch was given to GCC.
d7a9644e 406 If that switch was not specified, this substitutes nothing.
407 Here S is a metasyntactic variable.
c68bcf58 408 %{S*} substitutes all the switches specified to GCC whose names start
e1478c0f 409 with -S. This is used for -o, -I, etc; switches that take
c68bcf58 410 arguments. GCC considers `-o foo' as being one switch whose
d7a9644e 411 name starts with `o'. %{o*} would substitute this text,
412 including the space; thus, two arguments would be generated.
e1478c0f 413 %{S*&T*} likewise, but preserve order of S and T options (the order
952f0048 414 of S and T in the spec is not significant). Can be any number
415 of ampersand-separated variables; for each the wild card is
416 optional. Useful for CPP as %{D*&U*&A*}.
805e22b2 417
c68bcf58 418 %{S:X} substitutes X, if the -S switch was given to GCC.
419 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
805e22b2 420 %{S*:X} substitutes X if one or more switches whose names start
c68bcf58 421 with -S was given to GCC. Normally X is substituted only
805e22b2 422 once, no matter how many such switches appeared. However,
423 if %* appears somewhere in X, then X will be substituted
424 once for each matching switch, with the %* replaced by the
425 part of that switch that matched the '*'.
426 %{.S:X} substitutes X, if processing a file with suffix S.
427 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
90e35d1a 428 %{,S:X} substitutes X, if processing a file which will use spec S.
429 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
d7ee9e9b 430
c68bcf58 431 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
90e35d1a 432 combined with '!', '.', ',', and '*' as above binding stronger
433 than the OR.
805e22b2 434 If %* appears in X, all of the alternatives must be starred, and
435 only the first matching alternative is substituted.
9e46467d 436 %{%:function(args):X}
437 Call function named FUNCTION with args ARGS. If the function
438 returns non-NULL, then X is substituted, if it returns
439 NULL, it isn't substituted.
c68bcf58 440 %{S:X; if S was given to GCC, substitutes X;
441 T:Y; else if T was given to GCC, substitutes Y;
805e22b2 442 :D} else substitutes D. There can be as many clauses as you need.
90e35d1a 443 This may be combined with '.', '!', ',', '|', and '*' as above.
805e22b2 444
8894538a 445 %(Spec) processes a specification defined in a specs file as *Spec:
d7a9644e 446
805e22b2 447The conditional text X in a %{S:X} or similar construct may contain
d7a9644e 448other nested % constructs or spaces, or even newlines. They are
805e22b2 449processed as usual, as described above. Trailing white space in X is
450ignored. White space may also appear anywhere on the left side of the
451colon in these constructs, except between . or * and the corresponding
452word.
d7a9644e 453
b35329c7 454The -O, -f, -g, -m, and -W switches are handled specifically in these
cde688ab 455constructs. If another value of -O or the negated form of a -f, -m, or
456-W switch is found later in the command line, the earlier switch
d870e215 457value is ignored, except with {S*} where S is just one letter; this
458passes all matching options.
cde688ab 459
ae70654c 460The character | at the beginning of the predicate text is used to indicate
461that a command should be piped to the following command, but only if -pipe
462is specified.
d7a9644e 463
c68bcf58 464Note that it is built into GCC which switches take arguments and which
d7a9644e 465do not. You might think it would be useful to generalize this to
466allow each compiler's spec to say which switches take arguments. But
c68bcf58 467this cannot be done in a consistent fashion. GCC cannot even decide
d7a9644e 468which input files have been specified without knowing which switches
469take arguments, and it must know which input files to compile in order
470to tell which compilers to run.
471
c68bcf58 472GCC also knows implicitly that arguments starting in `-l' are to be
d7a9644e 473treated as compiler output files, and passed to the linker in their
474proper position among the other output files. */
475\f
537c4bc6 476/* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
d7a9644e 477
478/* config.h can define ASM_SPEC to provide extra args to the assembler
479 or extra switch-translations. */
480#ifndef ASM_SPEC
481#define ASM_SPEC ""
482#endif
483
484/* config.h can define ASM_FINAL_SPEC to run a post processor after
485 the assembler has run. */
486#ifndef ASM_FINAL_SPEC
b35329c7 487#define ASM_FINAL_SPEC \
488 "%{gsplit-dwarf: \n\
489 objcopy --extract-dwo \
490 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
491 %{c:%{o*:%:replace-extension(%{o*:%*} .dwo)}%{!o*:%b.dwo}}%{!c:%b.dwo} \n\
492 objcopy --strip-dwo \
493 %{c:%{o*:%*}%{!o*:%b%O}}%{!c:%U%O} \
494 }"
d7a9644e 495#endif
496
497/* config.h can define CPP_SPEC to provide extra args to the C preprocessor
498 or extra switch-translations. */
499#ifndef CPP_SPEC
500#define CPP_SPEC ""
501#endif
502
503/* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
504 or extra switch-translations. */
505#ifndef CC1_SPEC
506#define CC1_SPEC ""
507#endif
508
509/* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
510 or extra switch-translations. */
511#ifndef CC1PLUS_SPEC
512#define CC1PLUS_SPEC ""
513#endif
514
515/* config.h can define LINK_SPEC to provide extra args to the linker
516 or extra switch-translations. */
517#ifndef LINK_SPEC
518#define LINK_SPEC ""
519#endif
520
521/* config.h can define LIB_SPEC to override the default libraries. */
522#ifndef LIB_SPEC
b7c87ff2 523#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
524#endif
525
4ee9c684 526/* mudflap specs */
527#ifndef MFWRAP_SPEC
528/* XXX: valid only for GNU ld */
529/* XXX: should exactly match hooks provided by libmudflap.a */
530#define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
531 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
1043205d 532 --wrap=mmap --wrap=mmap64 --wrap=munmap --wrap=alloca\
ee3213a3 533} %{fmudflapth: --wrap=pthread_create\
4ee9c684 534}} %{fmudflap|fmudflapth: --wrap=main}"
535#endif
536#ifndef MFLIB_SPEC
2f2c6aee 537#define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
4ee9c684 538#endif
539
48b14f50 540/* When using -fsplit-stack we need to wrap pthread_create, in order
541 to initialize the stack guard. We always use wrapping, rather than
542 shared library ordering, and we keep the wrapper function in
543 libgcc. This is not yet a real spec, though it could become one;
544 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
545 only works with GNU ld and gold. FIXME: This is incompatible with
546 -fmudflap when linking statically, which wants to do its own
547 wrapping. */
548#define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
549
6db5160a 550#ifndef LIBASAN_SPEC
6aea389d 551#ifdef STATIC_LIBASAN_LIBS
552#define ADD_STATIC_LIBASAN_LIBS \
553 " %{static-libasan:" STATIC_LIBASAN_LIBS "}"
554#else
555#define ADD_STATIC_LIBASAN_LIBS
556#endif
53486a83 557#ifdef LIBASAN_EARLY_SPEC
558#define LIBASAN_SPEC ADD_STATIC_LIBASAN_LIBS
559#elif defined(HAVE_LD_STATIC_DYNAMIC)
6db5160a 560#define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION \
6aea389d 561 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION "}" \
562 ADD_STATIC_LIBASAN_LIBS
6db5160a 563#else
6aea389d 564#define LIBASAN_SPEC "-lasan" ADD_STATIC_LIBASAN_LIBS
6db5160a 565#endif
566#endif
567
53486a83 568#ifndef LIBASAN_EARLY_SPEC
569#define LIBASAN_EARLY_SPEC ""
570#endif
571
b077695d 572#ifndef LIBTSAN_SPEC
5f13745b 573#ifdef STATIC_LIBTSAN_LIBS
574#define ADD_STATIC_LIBTSAN_LIBS \
575 " %{static-libtsan:" STATIC_LIBTSAN_LIBS "}"
576#else
577#define ADD_STATIC_LIBTSAN_LIBS
578#endif
579#ifdef LIBTSAN_EARLY_SPEC
580#define LIBTSAN_SPEC ADD_STATIC_LIBTSAN_LIBS
581#elif defined(HAVE_LD_STATIC_DYNAMIC)
b077695d 582#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
5f13745b 583 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
584 ADD_STATIC_LIBTSAN_LIBS
b077695d 585#else
5f13745b 586#define LIBTSAN_SPEC "-ltsan" ADD_STATIC_LIBTSAN_LIBS
587#endif
b077695d 588#endif
5f13745b 589
590#ifndef LIBTSAN_EARLY_SPEC
591#define LIBTSAN_EARLY_SPEC ""
b077695d 592#endif
593
9e46467d 594#ifndef LIBUBSAN_SPEC
595#ifdef STATIC_LIBUBSAN_LIBS
596#define ADD_STATIC_LIBUBSAN_LIBS \
597 " %{static-libubsan:" STATIC_LIBUBSAN_LIBS "}"
598#else
599#define ADD_STATIC_LIBUBSAN_LIBS
600#endif
601#ifdef LIBUBSAN_EARLY_SPEC
602#define LIBUBSAN_SPEC ADD_STATIC_LIBUBSAN_LIBS
603#elif defined(HAVE_LD_STATIC_DYNAMIC)
604#define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION \
605 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
606 ADD_STATIC_LIBUBSAN_LIBS
607#else
608#define LIBUBSAN_SPEC "-lubsan" ADD_STATIC_LIBUBSAN_LIBS
609#endif
610#endif
611
612#ifndef LIBUBSAN_EARLY_SPEC
613#define LIBUBSAN_EARLY_SPEC ""
614#endif
615
b7c87ff2 616/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
617 included. */
618#ifndef LIBGCC_SPEC
ecbfdc87 619#if defined(REAL_LIBGCC_SPEC)
620#define LIBGCC_SPEC REAL_LIBGCC_SPEC
03829d4a 621#elif defined(LINK_LIBGCC_SPECIAL_1)
b7c87ff2 622/* Have gcc do the search for libgcc.a. */
21eaebc3 623#define LIBGCC_SPEC "libgcc.a%s"
b7c87ff2 624#else
21eaebc3 625#define LIBGCC_SPEC "-lgcc"
b7c87ff2 626#endif
d7a9644e 627#endif
628
629/* config.h can define STARTFILE_SPEC to override the default crt0 files. */
630#ifndef STARTFILE_SPEC
631#define STARTFILE_SPEC \
995c1b4d 632 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
d7a9644e 633#endif
634
d7a9644e 635/* config.h can define ENDFILE_SPEC to override the default crtn files. */
636#ifndef ENDFILE_SPEC
637#define ENDFILE_SPEC ""
638#endif
639
0c787992 640#ifndef LINKER_NAME
641#define LINKER_NAME "collect2"
642#endif
643
5f1f2de5 644#ifdef HAVE_AS_DEBUG_PREFIX_MAP
645#define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
646#else
647#define ASM_MAP ""
648#endif
649
1a6f9700 650/* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
651 to the assembler. */
652#ifndef ASM_DEBUG_SPEC
82505826 653# if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
654 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
5f1f2de5 655# define ASM_DEBUG_SPEC \
656 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
8786b72c 657 ? "%{!g0:%{gdwarf*:--gdwarf2}%{!gdwarf*:%{g*:--gstabs}}}" ASM_MAP \
674ca8bf 658 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
82505826 659# else
660# if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
674ca8bf 661# define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
82505826 662# endif
663# if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
674ca8bf 664# define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
1a6f9700 665# endif
1a6f9700 666# endif
667#endif
a6a0d17a 668#ifndef ASM_DEBUG_SPEC
669# define ASM_DEBUG_SPEC ""
670#endif
1a6f9700 671
1cf79a1a 672/* Here is the spec for running the linker, after compiling all files. */
673
da98d114 674/* This is overridable by the target in case they need to specify the
675 -lgcc and -lc order specially, yet not require them to override all
676 of LINK_COMMAND_SPEC. */
677#ifndef LINK_GCC_C_SEQUENCE_SPEC
678#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
679#endif
680
0d55f4d0 681#ifndef LINK_SSP_SPEC
682#ifdef TARGET_LIBC_PROVIDES_SSP
683#define LINK_SSP_SPEC "%{fstack-protector:}"
684#else
b156ec37 685#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-strong|fstack-protector-all:-lssp_nonshared -lssp}"
0d55f4d0 686#endif
687#endif
688
c3ce66b0 689#ifndef LINK_PIE_SPEC
690#ifdef HAVE_LD_PIE
691#define LINK_PIE_SPEC "%{pie:-pie} "
692#else
693#define LINK_PIE_SPEC "%{pie:} "
694#endif
695#endif
696
8271b966 697#ifndef LINK_BUILDID_SPEC
698# if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
699# define LINK_BUILDID_SPEC "%{!r:--build-id} "
700# endif
701#endif
702
c5f741b3 703/* Conditional to test whether the LTO plugin is used or not.
0f8cfb36 704 FIXME: For slim LTO we will need to enable plugin unconditionally. This
705 still cause problems with PLUGIN_LD != LD and when plugin is built but
706 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
707 plugin only when LTO is enabled. We still honor explicit
c5f741b3 708 -fuse-linker-plugin if the linker used understands -plugin. */
709
710/* The linker has some plugin support. */
711#if HAVE_LTO_PLUGIN > 0
712/* The linker used has full plugin support, use LTO plugin by default. */
713#if HAVE_LTO_PLUGIN == 2
0f8cfb36 714#define PLUGIN_COND "!fno-use-linker-plugin:%{flto|flto=*|fuse-linker-plugin"
715#define PLUGIN_COND_CLOSE "}"
de4d280b 716#else
c5f741b3 717/* The linker used has limited plugin support, use LTO plugin with explicit
718 -fuse-linker-plugin. */
de4d280b 719#define PLUGIN_COND "fuse-linker-plugin"
0f8cfb36 720#define PLUGIN_COND_CLOSE ""
de4d280b 721#endif
c5f741b3 722#define LINK_PLUGIN_SPEC \
723 "%{"PLUGIN_COND": \
724 -plugin %(linker_plugin_file) \
725 -plugin-opt=%(lto_wrapper) \
726 -plugin-opt=-fresolution=%u.res \
727 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
728 }"PLUGIN_COND_CLOSE
729#else
730/* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
731#define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\
732 %e-fuse-linker-plugin is not supported in this configuration}"
733#endif
de4d280b 734
5f13745b 735/* Linker command line options for -fsanitize= early on the command line. */
736#ifndef SANITIZER_EARLY_SPEC
737#define SANITIZER_EARLY_SPEC "\
9e46467d 738%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC "} \
739 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC "} \
740 %{%:sanitize(undefined):" LIBUBSAN_EARLY_SPEC "}}}"
5f13745b 741#endif
742
743/* Linker command line options for -fsanitize= late on the command line. */
744#ifndef SANITIZER_SPEC
745#define SANITIZER_SPEC "\
9e46467d 746%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC "\
86d5f657 747 %{static:%ecannot specify -static with -fsanitize=address}\
9e46467d 748 %{%:sanitize(thread):%e-fsanitize=address is incompatible with -fsanitize=thread}}\
749 %{%:sanitize(thread):" LIBTSAN_SPEC "\
750 %{!pie:%{!shared:%e-fsanitize=thread linking must be done with -pie or -shared}}}\
751 %{%:sanitize(undefined):" LIBUBSAN_SPEC "}}}"
5f13745b 752#endif
8271b966 753
b710ec85 754/* This is the spec to use, once the code for creating the vtable
755 verification runtime library, libvtv.so, has been created. Currently
756 the vtable verification runtime functions are in libstdc++, so we use
757 the spec just below this one. */
758#ifndef VTABLE_VERIFICATION_SPEC
759#define VTABLE_VERIFICATION_SPEC "\
760%{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
761 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}"
762#endif
763
1cf79a1a 764/* -u* was put back because both BSD and SysV seem to support it. */
765/* %{static:} simply prevents an error message if the target machine
766 doesn't handle -static. */
767/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
768 scripts which exist in user specified directories, or in standard
769 directories. */
cbcf2791 770/* We pass any -flto flags on to the linker, which is expected
7bfefa9d 771 to understand them. In practice, this means it had better be collect2. */
455188e9 772/* %{e*} includes -export-dynamic; see comment in common.opt. */
1cf79a1a 773#ifndef LINK_COMMAND_SPEC
774#define LINK_COMMAND_SPEC "\
775%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
c5f741b3 776 %(linker) " \
777 LINK_PLUGIN_SPEC \
5f13745b 778 "%{flto|flto=*:%<fcompare-debug*} \
0f8cfb36 779 %{flto} %{flto=*} %l " LINK_PIE_SPEC \
99d5fe2d 780 "%{fuse-ld=*:-fuse-ld=%*}\
781 %X %{o*} %{e*} %{N} %{n} %{r}\
b710ec85 782 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
5f13745b 783 %{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
48b14f50 784 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\
9a8d01ee 785 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
48b14f50 786 %(mflib) " STACK_SPLIT_SPEC "\
5f13745b 787 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC " \
b21d5608 788 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
b9504307 789 %{!nostdlib:%{!nostartfiles:%E}} %{T*} }}}}}}"
1cf79a1a 790#endif
791
792#ifndef LINK_LIBGCC_SPEC
03829d4a 793/* Generate -L options for startfile prefix list. */
794# define LINK_LIBGCC_SPEC "%D"
1cf79a1a 795#endif
796
4ae4e5e8 797#ifndef STARTFILE_PREFIX_SPEC
798# define STARTFILE_PREFIX_SPEC ""
799#endif
800
b6bcc48f 801#ifndef SYSROOT_SPEC
802# define SYSROOT_SPEC "--sysroot=%R"
803#endif
804
4ea70922 805#ifndef SYSROOT_SUFFIX_SPEC
806# define SYSROOT_SUFFIX_SPEC ""
807#endif
808
809#ifndef SYSROOT_HEADERS_SUFFIX_SPEC
810# define SYSROOT_HEADERS_SUFFIX_SPEC ""
811#endif
812
5641963c 813static const char *asm_debug = ASM_DEBUG_SPEC;
e772a198 814static const char *cpp_spec = CPP_SPEC;
e772a198 815static const char *cc1_spec = CC1_SPEC;
816static const char *cc1plus_spec = CC1PLUS_SPEC;
da98d114 817static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
0d55f4d0 818static const char *link_ssp_spec = LINK_SSP_SPEC;
e772a198 819static const char *asm_spec = ASM_SPEC;
820static const char *asm_final_spec = ASM_FINAL_SPEC;
821static const char *link_spec = LINK_SPEC;
822static const char *lib_spec = LIB_SPEC;
4ee9c684 823static const char *mfwrap_spec = MFWRAP_SPEC;
824static const char *mflib_spec = MFLIB_SPEC;
1e8e9920 825static const char *link_gomp_spec = "";
e772a198 826static const char *libgcc_spec = LIBGCC_SPEC;
827static const char *endfile_spec = ENDFILE_SPEC;
828static const char *startfile_spec = STARTFILE_SPEC;
e772a198 829static const char *linker_name_spec = LINKER_NAME;
7bfefa9d 830static const char *linker_plugin_file_spec = "";
831static const char *lto_wrapper_spec = "";
832static const char *lto_gcc_spec = "";
1cf79a1a 833static const char *link_command_spec = LINK_COMMAND_SPEC;
834static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
4ae4e5e8 835static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
b6bcc48f 836static const char *sysroot_spec = SYSROOT_SPEC;
4ea70922 837static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
838static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
bd3ce038 839static const char *self_spec = "";
1cf79a1a 840
841/* Standard options to cpp, cc1, and as, to reduce duplication in specs.
842 There should be no need to override these in target dependent files,
843 but we need to copy them to the specs file so that newer versions
844 of the GCC driver can correctly drive older tool chains with the
845 appropriate -B options. */
846
62683efd 847/* When cpplib handles traditional preprocessing, get rid of this, and
848 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
849 that we default the front end language better. */
1cf79a1a 850static const char *trad_capable_cpp =
f1a0bc73 851"cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1cf79a1a 852
eb95e7f7 853/* We don't wrap .d files in %W{} since a missing .d file, and
854 therefore no dependency entry, confuses make into thinking a .o
855 file that happens to exist is up-to-date. */
a182c763 856static const char *cpp_unique_options =
f608fcb7 857"%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
89c69892 858 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
859 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
eb95e7f7 860 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
e238d235 861 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
a8c200f7 862 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
d6bff3e6 863 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
a8c200f7 864 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
4ee9c684 865 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
866 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
5ca8af9f 867 %{E|M|MM:%W{o*}}";
a182c763 868
869/* This contains cpp options which are common with cc1_options and are passed
39c188c5 870 only when preprocessing only to avoid duplication. We pass the cc1 spec
871 options to the preprocessor so that it the cc1 spec may manipulate
872 options used to set target flags. Those special target flags settings may
873 in turn cause preprocessor symbols to be defined specially. */
a182c763 874static const char *cpp_options =
52367767 875"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
cbf55437 876 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
cc92bc82 877 %{undef} %{save-temps*:-fpch-preprocess}";
1cf79a1a 878
4702fc25 879/* This contains cpp options which are not passed when the preprocessor
880 output will be used by another program. */
881static const char *cpp_debug_options = "%{d*}";
882
68f4c740 883/* NB: This is shared amongst all front-ends, except for Ada. */
1cf79a1a 884static const char *cc1_options =
885"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
d6bff3e6 886 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
9b091a73 887 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
71278019 888 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
889 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
52367767 890 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1ed9d5f5 891 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
3bfde2af 892 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
5789e05b 893 %{-target-help:--target-help}\
894 %{-version:--version}\
895 %{-help=*:--help=%*}\
655a58fa 896 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
4ee9c684 897 %{fsyntax-only:-o %j} %{-param*}\
2c669579 898 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
899 %{coverage:-fprofile-arcs -ftest-coverage}";
1cf79a1a 900
901static const char *asm_options =
a4a58ea8 902"%{-target-help:%:print-asm-header()} "
c6429fa9 903#if HAVE_GNU_AS
904/* If GNU AS is used, then convert -w (no warnings), -I, and -v
905 to the assembler equivalents. */
906"%{v} %{w:-W} %{I*} "
907#endif
908"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
709c4e1b 909
99b02af1 910static const char *invoke_as =
805e22b2 911#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
7bfefa9d 912"%{!fwpa:\
913 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
914 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
915 }";
805e22b2 916#else
7bfefa9d 917"%{!fwpa:\
918 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
919 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
920 }";
805e22b2 921#endif
99b02af1 922
709c4e1b 923/* Some compilers have limits on line lengths, and the multilib_select
3d97d965 924 and/or multilib_matches strings can be very long, so we build them at
925 run time. */
709c4e1b 926static struct obstack multilib_obstack;
e772a198 927static const char *multilib_select;
928static const char *multilib_matches;
929static const char *multilib_defaults;
930static const char *multilib_exclusions;
7137cdac 931static const char *multilib_reuse;
3d97d965 932
933/* Check whether a particular argument is a default argument. */
934
935#ifndef MULTILIB_DEFAULTS
936#define MULTILIB_DEFAULTS { "" }
937#endif
938
026f2c7a 939static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
d7a9644e 940
73023f49 941#ifndef DRIVER_SELF_SPECS
942#define DRIVER_SELF_SPECS ""
943#endif
944
1e8e9920 945/* Adding -fopenmp should imply pthreads. This is particularly important
946 for targets that use different start files and suchlike. */
947#ifndef GOMP_SELF_SPECS
061202f8 948#define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
1e8e9920 949#endif
950
9a8d01ee 951/* Likewise for -fgnu-tm. */
952#ifndef GTM_SELF_SPECS
953#define GTM_SELF_SPECS "%{fgnu-tm: -pthread}"
954#endif
955
1e8e9920 956static const char *const driver_self_specs[] = {
9845d120 957 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
9a8d01ee 958 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS, GTM_SELF_SPECS
1e8e9920 959};
73023f49 960
7dd97ab6 961#ifndef OPTION_DEFAULT_SPECS
962#define OPTION_DEFAULT_SPECS { "", "" }
963#endif
964
965struct default_spec
966{
967 const char *name;
968 const char *spec;
969};
970
971static const struct default_spec
972 option_default_specs[] = { OPTION_DEFAULT_SPECS };
973
d4ea3b1f 974struct user_specs
975{
9d70d39c 976 struct user_specs *next;
e40d43cc 977 const char *filename;
9d70d39c 978};
979
980static struct user_specs *user_specs_head, *user_specs_tail;
981
d7a9644e 982\f
983/* Record the mapping from file suffixes for compilation specs. */
984
985struct compiler
986{
e40d43cc 987 const char *suffix; /* Use this compiler for input files
d7a9644e 988 whose names end in this suffix. */
6db05d3a 989
1cf79a1a 990 const char *spec; /* To use this compiler, run this spec. */
96842e40 991
992 const char *cpp_spec; /* If non-NULL, substitute this spec
993 for `%C', rather than the usual
994 cpp_spec. */
365db11e 995 const int combinable; /* If nonzero, compiler can deal with
dc1dd09b 996 multiple source files at once (IMA). */
365db11e 997 const int needs_preprocessing; /* If nonzero, source files need to
dc1dd09b 998 be run through a preprocessor. */
d7a9644e 999};
1000
1001/* Pointer to a vector of `struct compiler' that gives the spec for
1002 compiling a file, based on its suffix.
1003 A file that does not end in any of these suffixes will be passed
1004 unchanged to the loader and nothing else will be done to it.
1005
1006 An entry containing two 0s is used to terminate the vector.
1007
1008 If multiple entries match a file, the last matching one is used. */
1009
1010static struct compiler *compilers;
1011
1012/* Number of entries in `compilers', not counting the null terminator. */
1013
1014static int n_compilers;
1015
1016/* The default list of file name suffixes and their compilation specs. */
1017
c077395f 1018static const struct compiler default_compilers[] =
d7a9644e 1019{
6e8b4b1d 1020 /* Add lists of suffixes of known languages here. If those languages
0dbd1c74 1021 were not present when we built the driver, we will hit these copies
1022 and be given a more meaningful error than "file not used since
6e8b4b1d 1023 linking is not done". */
dc1dd09b 1024 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
9728bde3 1025 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1026 {".mii", "#Objective-C++", 0, 0, 0},
2f2c6aee 1027 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1028 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
dc1dd09b 1029 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1030 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1031 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
00c6e780 1032 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1033 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1034 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1035 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1036 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1037 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1038 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1039 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
dc1dd09b 1040 {".r", "#Ratfor", 0, 0, 0},
1041 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1042 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1043 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
e440a328 1044 {".go", "#Go", 0, 1, 0},
6e8b4b1d 1045 /* Next come the entries for C. */
78d063c8 1046 {".c", "@c", 0, 0, 1},
d7a9644e 1047 {"@c",
99b02af1 1048 /* cc1 has an integrated ISO C preprocessor. We should invoke the
455730ef 1049 external preprocessor if -save-temps is given. */
3ae4c9f3 1050 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
99b02af1 1051 %{!E:%{!M:%{!MM:\
f1a0bc73 1052 %{traditional:\
455730ef 1053%eGNU C no longer supports -traditional without -E}\
78d063c8 1054 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1055 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1056 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1057 %(cc1_options)}\
1058 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1059 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1060 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
d7a9644e 1061 {"-",
a5050534 1062 "%{!E:%e-E or -x required when input is from standard input}\
dc1dd09b 1063 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1064 {".h", "@c-header", 0, 0, 0},
d7a9644e 1065 {"@c-header",
573aba85 1066 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1067 external preprocessor if -save-temps is given. */
1068 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1069 %{!E:%{!M:%{!MM:\
cc92bc82 1070 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1071 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1072 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
4e6a6999 1073 %(cc1_options)\
f608fcb7 1074 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1075 %W{o*:--output-pch=%*}}%V}\
cc92bc82 1076 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
573aba85 1077 cc1 %(cpp_unique_options) %(cc1_options)\
f608fcb7 1078 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1079 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
78d063c8 1080 {".i", "@cpp-output", 0, 0, 0},
d7a9644e 1081 {"@cpp-output",
60c10fe6 1082 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
871aed8a 1083 {".s", "@assembler", 0, 0, 0},
d7a9644e 1084 {"@assembler",
871aed8a 1085 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1086 {".sx", "@assembler-with-cpp", 0, 0, 0},
1087 {".S", "@assembler-with-cpp", 0, 0, 0},
d7a9644e 1088 {"@assembler-with-cpp",
805e22b2 1089#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
8d3e018c 1090 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
4702fc25 1091 %{E|M|MM:%(cpp_debug_options)}\
805e22b2 1092 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1093 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1094#else
8d3e018c 1095 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
805e22b2 1096 %{E|M|MM:%(cpp_debug_options)}\
1097 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1098 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1099#endif
871aed8a 1100 , 0, 0, 0},
952f0048 1101
45b17600 1102#include "specs.h"
2358393e 1103 /* Mark end of table. */
dc1dd09b 1104 {0, 0, 0, 0, 0}
d7a9644e 1105};
1106
1107/* Number of elements in default_compilers, not counting the terminator. */
1108
3585dac7 1109static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
d7a9644e 1110
74c33122 1111typedef char *char_p; /* For DEF_VEC_P. */
74c33122 1112
d7a9644e 1113/* A vector of options to give to the linker.
fcdc45aa 1114 These options are accumulated by %x,
d7a9644e 1115 and substituted into the linker command with %X. */
f1f41a6c 1116static vec<char_p> linker_options;
69587571 1117
1118/* A vector of options to give to the assembler.
1119 These options are accumulated by -Wa,
391d9b6e 1120 and substituted into the assembler command with %Y. */
f1f41a6c 1121static vec<char_p> assembler_options;
391d9b6e 1122
1123/* A vector of options to give to the preprocessor.
1124 These options are accumulated by -Wp,
1125 and substituted into the preprocessor command with %Z. */
f1f41a6c 1126static vec<char_p> preprocessor_options;
d7a9644e 1127\f
d7a9644e 1128static char *
952f0048 1129skip_whitespace (char *p)
d7a9644e 1130{
1131 while (1)
1132 {
1133 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1134 be considered whitespace. */
1135 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1136 return p + 1;
1137 else if (*p == '\n' || *p == ' ' || *p == '\t')
1138 p++;
1139 else if (*p == '#')
1140 {
026f2c7a 1141 while (*p != '\n')
1142 p++;
d7a9644e 1143 p++;
1144 }
1145 else
1146 break;
1147 }
1148
1149 return p;
1150}
bfb9bc39 1151/* Structures to keep track of prefixes to try when looking for files. */
1152
1153struct prefix_list
1154{
afe739a7 1155 const char *prefix; /* String to prepend to the path. */
bfb9bc39 1156 struct prefix_list *next; /* Next in linked list. */
1157 int require_machine_suffix; /* Don't use without machine_suffix. */
1158 /* 2 means try both machine_suffix and just_machine_suffix. */
c954ff02 1159 int priority; /* Sort key - priority within list. */
1160 int os_multilib; /* 1 if OS multilib scheme should be used,
1161 0 for GCC multilib scheme. */
bfb9bc39 1162};
1163
1164struct path_prefix
1165{
1166 struct prefix_list *plist; /* List of prefixes to try */
1167 int max_len; /* Max length of a prefix in PLIST */
1168 const char *name; /* Name of this list (used in config stuff) */
1169};
1170
1171/* List of prefixes to try when looking for executables. */
1172
1173static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1174
1175/* List of prefixes to try when looking for startup (crt0) files. */
1176
1177static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1178
1179/* List of prefixes to try when looking for include files. */
1180
1181static struct path_prefix include_prefixes = { 0, 0, "include" };
1182
1183/* Suffix to attach to directories searched for commands.
1184 This looks like `MACHINE/VERSION/'. */
1185
1186static const char *machine_suffix = 0;
1187
1188/* Suffix to attach to directories searched for commands.
1189 This is just `MACHINE/'. */
1190
1191static const char *just_machine_suffix = 0;
1192
1193/* Adjusted value of GCC_EXEC_PREFIX envvar. */
1194
1195static const char *gcc_exec_prefix;
1196
9db45a87 1197/* Adjusted value of standard_libexec_prefix. */
1198
1199static const char *gcc_libexec_prefix;
1200
bfb9bc39 1201/* Default prefixes to attach to command names. */
1202
3c2ba0de 1203#ifndef STANDARD_STARTFILE_PREFIX_1
1204#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1205#endif
1206#ifndef STANDARD_STARTFILE_PREFIX_2
1207#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1208#endif
2f2c6aee 1209
29d774d0 1210#ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
bfb9bc39 1211#undef MD_EXEC_PREFIX
1212#undef MD_STARTFILE_PREFIX
1213#undef MD_STARTFILE_PREFIX_1
1214#endif
1215
1216/* If no prefixes defined, use the null string, which will disable them. */
1217#ifndef MD_EXEC_PREFIX
1218#define MD_EXEC_PREFIX ""
1219#endif
1220#ifndef MD_STARTFILE_PREFIX
1221#define MD_STARTFILE_PREFIX ""
1222#endif
1223#ifndef MD_STARTFILE_PREFIX_1
1224#define MD_STARTFILE_PREFIX_1 ""
1225#endif
1226
c4328bcc 1227/* These directories are locations set at configure-time based on the
1228 --prefix option provided to configure. Their initializers are
1229 defined in Makefile.in. These paths are not *directly* used when
1230 gcc_exec_prefix is set because, in that case, we know where the
1231 compiler has been installed, and use paths relative to that
1232 location instead. */
35823b64 1233static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
c4328bcc 1234static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1235static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1236static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1237
1238/* For native compilers, these are well-known paths containing
1239 components that may be provided by the system. For cross
1240 compilers, these paths are not used. */
bfb9bc39 1241static const char *md_exec_prefix = MD_EXEC_PREFIX;
bfb9bc39 1242static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1243static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
87c75316 1244static const char *const standard_startfile_prefix_1
3c2ba0de 1245 = STANDARD_STARTFILE_PREFIX_1;
1246static const char *const standard_startfile_prefix_2
1247 = STANDARD_STARTFILE_PREFIX_2;
bfb9bc39 1248
c4328bcc 1249/* A relative path to be used in finding the location of tools
1250 relative to the driver. */
35823b64 1251static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
9db45a87 1252
bfb9bc39 1253/* Subdirectory to use for locating libraries. Set by
1254 set_multilib_dir based on the compilation options. */
1255
1256static const char *multilib_dir;
c954ff02 1257
1258/* Subdirectory to use for locating libraries in OS conventions. Set by
1259 set_multilib_dir based on the compilation options. */
1260
1261static const char *multilib_os_dir;
77adc39e 1262
1263/* Subdirectory to use for locating libraries in multiarch conventions. Set by
1264 set_multilib_dir based on the compilation options. */
1265
1266static const char *multiarch_dir;
d7a9644e 1267\f
a92771b8 1268/* Structure to keep track of the specs that have been defined so far.
88483769 1269 These are accessed using %(specname) in a compiler or link
1270 spec. */
d7a9644e 1271
1272struct spec_list
1273{
988c0ffe 1274 /* The following 2 fields must be first */
1275 /* to allow EXTRA_SPECS to be initialized */
e772a198 1276 const char *name; /* name of the spec. */
1277 const char *ptr; /* available ptr if no static pointer */
988c0ffe 1278
1279 /* The following fields are not initialized */
1280 /* by EXTRA_SPECS */
e772a198 1281 const char **ptr_spec; /* pointer to the spec itself. */
988c0ffe 1282 struct spec_list *next; /* Next spec in linked list. */
1283 int name_len; /* length of the name */
556cfe53 1284 bool user_p; /* whether string come from file spec. */
1285 bool alloc_p; /* whether string was allocated */
d7a9644e 1286};
1287
988c0ffe 1288#define INIT_STATIC_SPEC(NAME,PTR) \
556cfe53 1289 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, false, false }
988c0ffe 1290
d4ea3b1f 1291/* List of statically defined specs. */
1292static struct spec_list static_specs[] =
1293{
988c0ffe 1294 INIT_STATIC_SPEC ("asm", &asm_spec),
1a6f9700 1295 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
988c0ffe 1296 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1cf79a1a 1297 INIT_STATIC_SPEC ("asm_options", &asm_options),
99b02af1 1298 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
988c0ffe 1299 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1cf79a1a 1300 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
4702fc25 1301 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
a182c763 1302 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1cf79a1a 1303 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
988c0ffe 1304 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1cf79a1a 1305 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
988c0ffe 1306 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
da98d114 1307 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
0d55f4d0 1308 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
988c0ffe 1309 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1310 INIT_STATIC_SPEC ("link", &link_spec),
1311 INIT_STATIC_SPEC ("lib", &lib_spec),
4ee9c684 1312 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1313 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1e8e9920 1314 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
988c0ffe 1315 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1316 INIT_STATIC_SPEC ("startfile", &startfile_spec),
988c0ffe 1317 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1318 INIT_STATIC_SPEC ("version", &compiler_version),
1319 INIT_STATIC_SPEC ("multilib", &multilib_select),
1320 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1321 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1322 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
54518c3b 1323 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
c954ff02 1324 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
7137cdac 1325 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse),
0c787992 1326 INIT_STATIC_SPEC ("linker", &linker_name_spec),
7bfefa9d 1327 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1328 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1329 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1cf79a1a 1330 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
bfb9bc39 1331 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1332 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1333 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
4ae4e5e8 1334 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
b6bcc48f 1335 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
4ea70922 1336 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1337 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
bd3ce038 1338 INIT_STATIC_SPEC ("self_spec", &self_spec),
988c0ffe 1339};
1340
1341#ifdef EXTRA_SPECS /* additional specs needed */
6b40eba4 1342/* Structure to keep track of just the first two args of a spec_list.
d4ea3b1f 1343 That is all that the EXTRA_SPECS macro gives us. */
6b40eba4 1344struct spec_list_1
1345{
e99c3a1d 1346 const char *const name;
1347 const char *const ptr;
6b40eba4 1348};
1349
e99c3a1d 1350static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
026f2c7a 1351static struct spec_list *extra_specs = (struct spec_list *) 0;
988c0ffe 1352#endif
1353
1354/* List of dynamically allocates specs that have been defined so far. */
1355
2c815aff 1356static struct spec_list *specs = (struct spec_list *) 0;
988c0ffe 1357\f
c21b3276 1358/* List of static spec functions. */
1359
1360static const struct spec_function static_spec_functions[] =
1361{
0305c755 1362 { "getenv", getenv_spec_function },
c21b3276 1363 { "if-exists", if_exists_spec_function },
68d74c02 1364 { "if-exists-else", if_exists_else_spec_function },
9e46467d 1365 { "sanitize", sanitize_spec_function },
2288041e 1366 { "replace-outfile", replace_outfile_spec_function },
8127ab5d 1367 { "remove-outfile", remove_outfile_spec_function },
9b1f316f 1368 { "version-compare", version_compare_spec_function },
1e8e9920 1369 { "include", include_spec_function },
19bc000d 1370 { "find-file", find_file_spec_function },
d6bff3e6 1371 { "find-plugindir", find_plugindir_spec_function },
ceac8e8c 1372 { "print-asm-header", print_asm_header_spec_function },
71278019 1373 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1374 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1375 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
280f8649 1376 { "pass-through-libs", pass_through_libs_spec_func },
b35329c7 1377 { "replace-extension", replace_extension_spec_func },
4009b53f 1378#ifdef EXTRA_SPEC_FUNCTIONS
1379 EXTRA_SPEC_FUNCTIONS
1380#endif
c21b3276 1381 { 0, 0 }
1382};
1383
1384static int processing_spec_function;
1385\f
5cb4c868 1386/* Add appropriate libgcc specs to OBSTACK, taking into account
1387 various permutations of -shared-libgcc, -shared, and such. */
1388
ecbfdc87 1389#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
be4e8b82 1390
1391#ifndef USE_LD_AS_NEEDED
1392#define USE_LD_AS_NEEDED 0
1393#endif
1394
5cb4c868 1395static void
952f0048 1396init_gcc_specs (struct obstack *obstack, const char *shared_name,
1397 const char *static_name, const char *eh_name)
5cb4c868 1398{
48285a3c 1399 char *buf;
1400
e885c832 1401 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1402 "%{!static:%{!static-libgcc:"
be4e8b82 1403#if USE_LD_AS_NEEDED
e885c832 1404 "%{!shared-libgcc:",
8aaed91d 1405 static_name, " " LD_AS_NEEDED_OPTION " ",
1406 shared_name, " " LD_NO_AS_NEEDED_OPTION
e885c832 1407 "}"
1408 "%{shared-libgcc:",
1409 shared_name, "%{!shared: ", static_name, "}"
1410 "}"
6a40149e 1411#else
e885c832 1412 "%{!shared:"
1413 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1414 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1415 "}"
0d6378a9 1416#ifdef LINK_EH_SPEC
e885c832 1417 "%{shared:"
1418 "%{shared-libgcc:", shared_name, "}"
1419 "%{!shared-libgcc:", static_name, "}"
1420 "}"
0d6378a9 1421#else
e885c832 1422 "%{shared:", shared_name, "}"
6a40149e 1423#endif
0d6378a9 1424#endif
e885c832 1425 "}}", NULL);
48285a3c 1426
1427 obstack_grow (obstack, buf, strlen (buf));
1428 free (buf);
5cb4c868 1429}
b51d5c7c 1430#endif /* ENABLE_SHARED_LIBGCC */
5cb4c868 1431
988c0ffe 1432/* Initialize the specs lookup routines. */
1433
1434static void
a046944b 1435init_spec (void)
988c0ffe 1436{
2c815aff 1437 struct spec_list *next = (struct spec_list *) 0;
1438 struct spec_list *sl = (struct spec_list *) 0;
988c0ffe 1439 int i;
1440
1441 if (specs)
d4ea3b1f 1442 return; /* Already initialized. */
988c0ffe 1443
4582d741 1444 if (verbose_flag)
a922df2e 1445 fnotice (stderr, "Using built-in specs.\n");
4582d741 1446
988c0ffe 1447#ifdef EXTRA_SPECS
25a1c410 1448 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
2c815aff 1449
3098b2d3 1450 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
810309ce 1451 {
1452 sl = &extra_specs[i];
6b40eba4 1453 sl->name = extra_specs_1[i].name;
1454 sl->ptr = extra_specs_1[i].ptr;
810309ce 1455 sl->next = next;
1456 sl->name_len = strlen (sl->name);
1457 sl->ptr_spec = &sl->ptr;
1458 next = sl;
1459 }
988c0ffe 1460#endif
1461
3098b2d3 1462 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
988c0ffe 1463 {
1464 sl = &static_specs[i];
1465 sl->next = next;
1466 next = sl;
1467 }
1468
ecbfdc87 1469#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
43198b29 1470 /* ??? If neither -shared-libgcc nor --static-libgcc was
1471 seen, then we should be making an educated guess. Some proposed
1472 heuristics for ELF include:
1473
1474 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1475 program will be doing dynamic loading, which will likely
1476 need the shared libgcc.
1477
1478 (2) If "-ldl", then it's also a fair bet that we're doing
1479 dynamic loading.
1480
1481 (3) For each ET_DYN we're linking against (either through -lfoo
1482 or /some/path/foo.so), check to see whether it or one of
424da949 1483 its dependencies depends on a shared libgcc.
43198b29 1484
1485 (4) If "-shared"
1486
1487 If the runtime is fixed to look for program headers instead
1488 of calling __register_frame_info at all, for each object,
1489 use the shared libgcc if any EH symbol referenced.
1490
1491 If crtstuff is fixed to not invoke __register_frame_info
1492 automatically, for each object, use the shared libgcc if
1493 any non-empty unwind section found.
1494
1495 Doing any of this probably requires invoking an external program to
1496 do the actual object file scanning. */
1497 {
1498 const char *p = libgcc_spec;
1499 int in_sep = 1;
3cfec666 1500
6fba09a6 1501 /* Transform the extant libgcc_spec into one that uses the shared libgcc
43198b29 1502 when given the proper command line arguments. */
1503 while (*p)
1504 {
3cfec666 1505 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
43198b29 1506 {
5cb4c868 1507 init_gcc_specs (&obstack,
5cb4c868 1508 "-lgcc_s"
8bdf23ae 1509#ifdef USE_LIBUNWIND_EXCEPTIONS
1510 " -lunwind"
805e22b2 1511#endif
81e210c3 1512 ,
1513 "-lgcc",
1514 "-lgcc_eh"
805e22b2 1515#ifdef USE_LIBUNWIND_EXCEPTIONS
79f90e2b 1516# ifdef HAVE_LD_STATIC_DYNAMIC
e6937b3a 1517 " %{!static:" LD_STATIC_OPTION "} -lunwind"
1518 " %{!static:" LD_DYNAMIC_OPTION "}"
79f90e2b 1519# else
805e22b2 1520 " -lunwind"
79f90e2b 1521# endif
43198b29 1522#endif
81e210c3 1523 );
1524
21eaebc3 1525 p += 5;
43198b29 1526 in_sep = 0;
1527 }
21eaebc3 1528 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
43198b29 1529 {
1530 /* Ug. We don't know shared library extensions. Hope that
1531 systems that use this form don't do shared libraries. */
5cb4c868 1532 init_gcc_specs (&obstack,
6ffda34c 1533 "-lgcc_s",
0d6378a9 1534 "libgcc.a%s",
974df224 1535 "libgcc_eh.a%s"
1536#ifdef USE_LIBUNWIND_EXCEPTIONS
1537 " -lunwind"
1538#endif
1539 );
21eaebc3 1540 p += 10;
43198b29 1541 in_sep = 0;
1542 }
1543 else
1544 {
1545 obstack_1grow (&obstack, *p);
1546 in_sep = (*p == ' ');
1547 p += 1;
1548 }
1549 }
1550
1551 obstack_1grow (&obstack, '\0');
4fac984f 1552 libgcc_spec = XOBFINISH (&obstack, const char *);
43198b29 1553 }
1554#endif
c3f311c4 1555#ifdef USE_AS_TRADITIONAL_FORMAT
1556 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1557 {
e99c3a1d 1558 static const char tf[] = "--traditional-format ";
c3f311c4 1559 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1560 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
4fac984f 1561 asm_spec = XOBFINISH (&obstack, const char *);
c3f311c4 1562 }
1563#endif
8271b966 1564
3cb9bbfa 1565#if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC || \
1566 defined LINKER_HASH_STYLE
8271b966 1567# ifdef LINK_BUILDID_SPEC
1568 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1569 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
1570# endif
1571# ifdef LINK_EH_SPEC
0d6378a9 1572 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1573 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
3cb9bbfa 1574# endif
1575# ifdef LINKER_HASH_STYLE
1576 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1577 before. */
1578 {
1579 static const char hash_style[] = "--hash-style=";
1580 obstack_grow (&obstack, hash_style, sizeof(hash_style) - 1);
1581 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof(LINKER_HASH_STYLE) - 1);
1582 obstack_1grow (&obstack, ' ');
1583 }
8271b966 1584# endif
0d6378a9 1585 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
4fac984f 1586 link_spec = XOBFINISH (&obstack, const char *);
0d6378a9 1587#endif
43198b29 1588
988c0ffe 1589 specs = sl;
1590}
d7a9644e 1591\f
1592/* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1593 removed; If the spec starts with a + then SPEC is added to the end of the
a92771b8 1594 current spec. */
d7a9644e 1595
1596static void
556cfe53 1597set_spec (const char *name, const char *spec, bool user_p)
d7a9644e 1598{
1599 struct spec_list *sl;
e772a198 1600 const char *old_spec;
988c0ffe 1601 int name_len = strlen (name);
1602 int i;
1603
d4ea3b1f 1604 /* If this is the first call, initialize the statically allocated specs. */
4582d741 1605 if (!specs)
1606 {
2c815aff 1607 struct spec_list *next = (struct spec_list *) 0;
3098b2d3 1608 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
4582d741 1609 {
1610 sl = &static_specs[i];
1611 sl->next = next;
1612 next = sl;
1613 }
1614 specs = sl;
1615 }
1616
d4ea3b1f 1617 /* See if the spec already exists. */
d7a9644e 1618 for (sl = specs; sl; sl = sl->next)
988c0ffe 1619 if (name_len == sl->name_len && !strcmp (sl->name, name))
d7a9644e 1620 break;
1621
1622 if (!sl)
1623 {
d4ea3b1f 1624 /* Not found - make it. */
4c36ffe6 1625 sl = XNEW (struct spec_list);
713829e9 1626 sl->name = xstrdup (name);
988c0ffe 1627 sl->name_len = name_len;
1628 sl->ptr_spec = &sl->ptr;
1629 sl->alloc_p = 0;
1630 *(sl->ptr_spec) = "";
d7a9644e 1631 sl->next = specs;
1632 specs = sl;
1633 }
1634
988c0ffe 1635 old_spec = *(sl->ptr_spec);
274c11d8 1636 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
4e2023c8 1637 ? concat (old_spec, spec + 1, NULL)
713829e9 1638 : xstrdup (spec));
8b351d3c 1639
4582d741 1640#ifdef DEBUG_SPECS
1641 if (verbose_flag)
a922df2e 1642 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
4582d741 1643#endif
1644
d4ea3b1f 1645 /* Free the old spec. */
988c0ffe 1646 if (old_spec && sl->alloc_p)
e47a6f81 1647 free (CONST_CAST(char *, old_spec));
988c0ffe 1648
556cfe53 1649 sl->user_p = user_p;
1650 sl->alloc_p = true;
d7a9644e 1651}
1652\f
1653/* Accumulate a command (program name and args), and run it. */
1654
9d9edc85 1655typedef const char *const_char_p; /* For DEF_VEC_P. */
d7a9644e 1656
9d9edc85 1657/* Vector of pointers to arguments in the current line of specifications. */
d7a9644e 1658
f1f41a6c 1659static vec<const_char_p> argbuf;
d7a9644e 1660
9d9edc85 1661/* Position in the argbuf vector containing the name of the output file
dc1dd09b 1662 (the value associated with the "-o" flag). */
1663
1664static int have_o_argbuf_index = 0;
1665
a2000777 1666/* Were the options -c, -S or -E passed. */
89dfd38d 1667static int have_c = 0;
1668
1669/* Was the option -o passed. */
1670static int have_o = 0;
1671
655a58fa 1672/* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1673 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1674 it here. */
4576c73f 1675
1676static struct temp_name {
e40d43cc 1677 const char *suffix; /* suffix associated with the code. */
4576c73f 1678 int length; /* strlen (suffix). */
1679 int unique; /* Indicates whether %g or %u/%U was used. */
e40d43cc 1680 const char *filename; /* associated filename. */
4576c73f 1681 int filename_length; /* strlen (filename). */
1682 struct temp_name *next;
1683} *temp_names;
1526a87c 1684
d7a9644e 1685/* Number of commands executed so far. */
1686
1687static int execution_count;
1688
68360609 1689/* Number of commands that exited with a signal. */
1690
1691static int signal_count;
d7a9644e 1692\f
c21b3276 1693/* Allocate the argument vector. */
1694
1695static void
a046944b 1696alloc_args (void)
c21b3276 1697{
f1f41a6c 1698 argbuf.create (10);
c21b3276 1699}
1700
d7a9644e 1701/* Clear out the vector of arguments (after a command is executed). */
1702
1703static void
952f0048 1704clear_args (void)
d7a9644e 1705{
f1f41a6c 1706 argbuf.truncate (0);
d7a9644e 1707}
1708
1709/* Add one argument to the vector at the end.
1710 This is done when a space is seen or at the end of the line.
1711 If DELETE_ALWAYS is nonzero, the arg is a filename
1712 and the file should be deleted eventually.
1713 If DELETE_FAILURE is nonzero, the arg is a filename
1714 and the file should be deleted if this compilation fails. */
1715
1716static void
952f0048 1717store_arg (const char *arg, int delete_always, int delete_failure)
d7a9644e 1718{
f1f41a6c 1719 argbuf.safe_push (arg);
d7a9644e 1720
dc1dd09b 1721 if (strcmp (arg, "-o") == 0)
f1f41a6c 1722 have_o_argbuf_index = argbuf.length ();
d7a9644e 1723 if (delete_always || delete_failure)
d9f0ee99 1724 {
1725 const char *p;
1726 /* If the temporary file we should delete is specified as
1727 part of a joined argument extract the filename. */
1728 if (arg[0] == '-'
1729 && (p = strrchr (arg, '=')))
1730 arg = p + 1;
1731 record_temp_file (arg, delete_always, delete_failure);
1732 }
d7a9644e 1733}
1734\f
424da949 1735/* Load specs from a file name named FILENAME, replacing occurrences of
2c815aff 1736 various different types of line-endings, \r\n, \n\r and just \r, with
bee69028 1737 a single \n. */
4582d741 1738
026f2c7a 1739static char *
952f0048 1740load_specs (const char *filename)
4582d741 1741{
1742 int desc;
1743 int readlen;
1744 struct stat statbuf;
1745 char *buffer;
bee69028 1746 char *buffer_p;
1747 char *specs;
1748 char *specs_p;
4582d741 1749
1750 if (verbose_flag)
a922df2e 1751 fnotice (stderr, "Reading specs from %s\n", filename);
4582d741 1752
1753 /* Open and stat the file. */
1754 desc = open (filename, O_RDONLY, 0);
1755 if (desc < 0)
1756 pfatal_with_name (filename);
1757 if (stat (filename, &statbuf) < 0)
1758 pfatal_with_name (filename);
1759
1760 /* Read contents of file into BUFFER. */
4c36ffe6 1761 buffer = XNEWVEC (char, statbuf.st_size + 1);
4582d741 1762 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1763 if (readlen < 0)
1764 pfatal_with_name (filename);
1765 buffer[readlen] = 0;
1766 close (desc);
1767
4c36ffe6 1768 specs = XNEWVEC (char, readlen + 1);
bee69028 1769 specs_p = specs;
1770 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1771 {
1772 int skip = 0;
1773 char c = *buffer_p;
1774 if (c == '\r')
026f2c7a 1775 {
1776 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
bee69028 1777 skip = 1;
026f2c7a 1778 else if (*(buffer_p + 1) == '\n') /* \r\n */
bee69028 1779 skip = 1;
1780 else /* \r */
1781 c = '\n';
1782 }
1783 if (! skip)
1784 *specs_p++ = c;
1785 }
1786 *specs_p = '\0';
1787
1788 free (buffer);
1789 return (specs);
1790}
1791
1792/* Read compilation specs from a file named FILENAME,
1793 replacing the default ones.
1794
1795 A suffix which starts with `*' is a definition for
1796 one of the machine-specific sub-specs. The "suffix" should be
537c4bc6 1797 *asm, *cc1, *cpp, *link, *startfile, etc.
bee69028 1798 The corresponding spec is stored in asm_spec, etc.,
1799 rather than in the `compilers' vector.
1800
1801 Anything invalid in the file is a fatal error. */
1802
1803static void
556cfe53 1804read_specs (const char *filename, bool main_p, bool user_p)
bee69028 1805{
1806 char *buffer;
19cb6b50 1807 char *p;
bee69028 1808
1809 buffer = load_specs (filename);
1810
4582d741 1811 /* Scan BUFFER for specs, putting them in the vector. */
1812 p = buffer;
1813 while (1)
1814 {
1815 char *suffix;
1816 char *spec;
1817 char *in, *out, *p1, *p2, *p3;
1818
1819 /* Advance P in BUFFER to the next nonblank nocomment line. */
1820 p = skip_whitespace (p);
1821 if (*p == 0)
1822 break;
1823
1824 /* Is this a special command that starts with '%'? */
1825 /* Don't allow this for the main specs file, since it would
1826 encourage people to overwrite it. */
1827 if (*p == '%' && !main_p)
1828 {
1829 p1 = p;
0dbd1c74 1830 while (*p && *p != '\n')
1831 p++;
1832
026f2c7a 1833 /* Skip '\n'. */
1834 p++;
4582d741 1835
026f2c7a 1836 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
0dbd1c74 1837 && (p1[sizeof "%include" - 1] == ' '
1838 || p1[sizeof "%include" - 1] == '\t'))
4582d741 1839 {
1840 char *new_filename;
1841
1842 p1 += sizeof ("%include");
0dbd1c74 1843 while (*p1 == ' ' || *p1 == '\t')
1844 p1++;
4582d741 1845
1846 if (*p1++ != '<' || p[-2] != '>')
a922df2e 1847 fatal_error ("specs %%include syntax malformed after "
1848 "%ld characters",
1849 (long) (p1 - buffer + 1));
4582d741 1850
1851 p[-2] = '\0';
067277c3 1852 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
556cfe53 1853 read_specs (new_filename ? new_filename : p1, false, user_p);
4582d741 1854 continue;
1855 }
0dbd1c74 1856 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1857 && (p1[sizeof "%include_noerr" - 1] == ' '
1858 || p1[sizeof "%include_noerr" - 1] == '\t'))
4582d741 1859 {
1860 char *new_filename;
1861
0dbd1c74 1862 p1 += sizeof "%include_noerr";
026f2c7a 1863 while (*p1 == ' ' || *p1 == '\t')
1864 p1++;
4582d741 1865
1866 if (*p1++ != '<' || p[-2] != '>')
a922df2e 1867 fatal_error ("specs %%include syntax malformed after "
1868 "%ld characters",
1869 (long) (p1 - buffer + 1));
4582d741 1870
1871 p[-2] = '\0';
067277c3 1872 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
4582d741 1873 if (new_filename)
556cfe53 1874 read_specs (new_filename, false, user_p);
4582d741 1875 else if (verbose_flag)
a922df2e 1876 fnotice (stderr, "could not find specs file %s\n", p1);
4582d741 1877 continue;
1878 }
0dbd1c74 1879 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1880 && (p1[sizeof "%rename" - 1] == ' '
1881 || p1[sizeof "%rename" - 1] == '\t'))
4582d741 1882 {
1883 int name_len;
1884 struct spec_list *sl;
1686d9b4 1885 struct spec_list *newsl;
4582d741 1886
1686d9b4 1887 /* Get original name. */
0dbd1c74 1888 p1 += sizeof "%rename";
1889 while (*p1 == ' ' || *p1 == '\t')
1890 p1++;
1891
2c815aff 1892 if (! ISALPHA ((unsigned char) *p1))
a922df2e 1893 fatal_error ("specs %%rename syntax malformed after "
1894 "%ld characters",
1895 (long) (p1 - buffer));
4582d741 1896
1897 p2 = p1;
2c815aff 1898 while (*p2 && !ISSPACE ((unsigned char) *p2))
0dbd1c74 1899 p2++;
1900
4582d741 1901 if (*p2 != ' ' && *p2 != '\t')
a922df2e 1902 fatal_error ("specs %%rename syntax malformed after "
1903 "%ld characters",
1904 (long) (p2 - buffer));
4582d741 1905
1906 name_len = p2 - p1;
1907 *p2++ = '\0';
0dbd1c74 1908 while (*p2 == ' ' || *p2 == '\t')
1909 p2++;
1910
2c815aff 1911 if (! ISALPHA ((unsigned char) *p2))
a922df2e 1912 fatal_error ("specs %%rename syntax malformed after "
1913 "%ld characters",
1914 (long) (p2 - buffer));
4582d741 1915
026f2c7a 1916 /* Get new spec name. */
4582d741 1917 p3 = p2;
2c815aff 1918 while (*p3 && !ISSPACE ((unsigned char) *p3))
0dbd1c74 1919 p3++;
1920
026f2c7a 1921 if (p3 != p - 1)
a922df2e 1922 fatal_error ("specs %%rename syntax malformed after "
1923 "%ld characters",
1924 (long) (p3 - buffer));
4582d741 1925 *p3 = '\0';
1926
1927 for (sl = specs; sl; sl = sl->next)
1928 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1929 break;
1930
1931 if (!sl)
a922df2e 1932 fatal_error ("specs %s spec was not found to be renamed", p1);
4582d741 1933
0dbd1c74 1934 if (strcmp (p1, p2) == 0)
4582d741 1935 continue;
1936
1686d9b4 1937 for (newsl = specs; newsl; newsl = newsl->next)
1938 if (strcmp (newsl->name, p2) == 0)
a8c464ac 1939 fatal_error ("%s: attempt to rename spec %qs to "
1940 "already defined spec %qs",
1686d9b4 1941 filename, p1, p2);
1942
4582d741 1943 if (verbose_flag)
1944 {
a922df2e 1945 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
4582d741 1946#ifdef DEBUG_SPECS
a922df2e 1947 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
4582d741 1948#endif
1949 }
1950
556cfe53 1951 set_spec (p2, *(sl->ptr_spec), user_p);
4582d741 1952 if (sl->alloc_p)
e47a6f81 1953 free (CONST_CAST (char *, *(sl->ptr_spec)));
4582d741 1954
1955 *(sl->ptr_spec) = "";
1956 sl->alloc_p = 0;
1957 continue;
1958 }
1959 else
a922df2e 1960 fatal_error ("specs unknown %% command after %ld characters",
1961 (long) (p1 - buffer));
4582d741 1962 }
1963
1964 /* Find the colon that should end the suffix. */
1965 p1 = p;
0dbd1c74 1966 while (*p1 && *p1 != ':' && *p1 != '\n')
1967 p1++;
1968
4582d741 1969 /* The colon shouldn't be missing. */
1970 if (*p1 != ':')
a922df2e 1971 fatal_error ("specs file malformed after %ld characters",
1972 (long) (p1 - buffer));
0dbd1c74 1973
4582d741 1974 /* Skip back over trailing whitespace. */
1975 p2 = p1;
0dbd1c74 1976 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1977 p2--;
1978
4582d741 1979 /* Copy the suffix to a string. */
1980 suffix = save_string (p, p2 - p);
1981 /* Find the next line. */
1982 p = skip_whitespace (p1 + 1);
1983 if (p[1] == 0)
a922df2e 1984 fatal_error ("specs file malformed after %ld characters",
1985 (long) (p - buffer));
0dbd1c74 1986
4582d741 1987 p1 = p;
623feb20 1988 /* Find next blank line or end of string. */
1989 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
0dbd1c74 1990 p1++;
1991
4582d741 1992 /* Specs end at the blank line and do not include the newline. */
1993 spec = save_string (p, p1 - p);
1994 p = p1;
1995
1996 /* Delete backslash-newline sequences from the spec. */
1997 in = spec;
1998 out = spec;
1999 while (*in != 0)
2000 {
2001 if (in[0] == '\\' && in[1] == '\n')
2002 in += 2;
2003 else if (in[0] == '#')
0dbd1c74 2004 while (*in && *in != '\n')
2005 in++;
2006
4582d741 2007 else
2008 *out++ = *in++;
2009 }
2010 *out = 0;
2011
2012 if (suffix[0] == '*')
2013 {
2014 if (! strcmp (suffix, "*link_command"))
2015 link_command_spec = spec;
2016 else
556cfe53 2017 set_spec (suffix + 1, spec, user_p);
4582d741 2018 }
2019 else
2020 {
2021 /* Add this pair to the vector. */
2022 compilers
25a1c410 2023 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
0dbd1c74 2024
4582d741 2025 compilers[n_compilers].suffix = suffix;
1cf79a1a 2026 compilers[n_compilers].spec = spec;
4582d741 2027 n_compilers++;
7f0b0c27 2028 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
4582d741 2029 }
2030
2031 if (*suffix == 0)
2032 link_command_spec = spec;
2033 }
2034
2035 if (link_command_spec == 0)
a922df2e 2036 fatal_error ("spec file has no spec for linking");
4582d741 2037}
2038\f
d7a9644e 2039/* Record the names of temporary files we tell compilers to write,
2040 and delete them at the end of the run. */
2041
774abee6 2042/* This is the common prefix we use to make temp file names.
2043 It is chosen once for each run of this program.
2044 It is substituted into a spec by %g or %j.
2045 Thus, all temp file names contain this prefix.
2046 In practice, all temp file names start with this prefix.
2047
2048 This prefix comes from the envvar TMPDIR if it is defined;
2049 otherwise, from the P_tmpdir macro if that is defined;
2050 otherwise, in /usr/tmp or /tmp;
2051 or finally the current directory if all else fails. */
2052
2053static const char *temp_filename;
2054
2055/* Length of the prefix. */
2056
2057static int temp_filename_length;
2058
d7a9644e 2059/* Define the list of temporary files to delete. */
2060
2061struct temp_file
2062{
e40d43cc 2063 const char *name;
d7a9644e 2064 struct temp_file *next;
2065};
2066
2067/* Queue of files to delete on success or failure of compilation. */
2068static struct temp_file *always_delete_queue;
2069/* Queue of files to delete on failure of compilation. */
2070static struct temp_file *failure_delete_queue;
2071
2072/* Record FILENAME as a file to be deleted automatically.
2073 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2074 otherwise delete it in any case.
2075 FAIL_DELETE nonzero means delete it if a compilation step fails;
2076 otherwise delete it in any case. */
2077
833a5c07 2078void
952f0048 2079record_temp_file (const char *filename, int always_delete, int fail_delete)
d7a9644e 2080{
19cb6b50 2081 char *const name = xstrdup (filename);
d7a9644e 2082
2083 if (always_delete)
2084 {
19cb6b50 2085 struct temp_file *temp;
d7a9644e 2086 for (temp = always_delete_queue; temp; temp = temp->next)
82715bcd 2087 if (! filename_cmp (name, temp->name))
d7a9644e 2088 goto already1;
0dbd1c74 2089
4c36ffe6 2090 temp = XNEW (struct temp_file);
d7a9644e 2091 temp->next = always_delete_queue;
2092 temp->name = name;
2093 always_delete_queue = temp;
0dbd1c74 2094
d7a9644e 2095 already1:;
2096 }
2097
2098 if (fail_delete)
2099 {
19cb6b50 2100 struct temp_file *temp;
d7a9644e 2101 for (temp = failure_delete_queue; temp; temp = temp->next)
82715bcd 2102 if (! filename_cmp (name, temp->name))
ce0fdb91 2103 {
2104 free (name);
2105 goto already2;
2106 }
0dbd1c74 2107
4c36ffe6 2108 temp = XNEW (struct temp_file);
d7a9644e 2109 temp->next = failure_delete_queue;
2110 temp->name = name;
2111 failure_delete_queue = temp;
0dbd1c74 2112
d7a9644e 2113 already2:;
2114 }
2115}
2116
2117/* Delete all the temporary files whose names we previously recorded. */
2118
767efd18 2119#ifndef DELETE_IF_ORDINARY
2120#define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2121do \
2122 { \
2123 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2124 if (unlink (NAME) < 0) \
2125 if (VERBOSE_FLAG) \
2126 perror_with_name (NAME); \
2127 } while (0)
2128#endif
2129
8149a4fc 2130static void
952f0048 2131delete_if_ordinary (const char *name)
8149a4fc 2132{
2133 struct stat st;
2134#ifdef DEBUG
2135 int i, c;
2136
2137 printf ("Delete %s? (y or n) ", name);
2138 fflush (stdout);
2139 i = getchar ();
2140 if (i != '\n')
0dbd1c74 2141 while ((c = getchar ()) != '\n' && c != EOF)
2142 ;
2143
8149a4fc 2144 if (i == 'y' || i == 'Y')
2145#endif /* DEBUG */
767efd18 2146 DELETE_IF_ORDINARY (name, st, verbose_flag);
8149a4fc 2147}
2148
d7a9644e 2149static void
952f0048 2150delete_temp_files (void)
d7a9644e 2151{
19cb6b50 2152 struct temp_file *temp;
d7a9644e 2153
2154 for (temp = always_delete_queue; temp; temp = temp->next)
8149a4fc 2155 delete_if_ordinary (temp->name);
d7a9644e 2156 always_delete_queue = 0;
2157}
2158
2159/* Delete all the files to be deleted on error. */
2160
2161static void
952f0048 2162delete_failure_queue (void)
d7a9644e 2163{
19cb6b50 2164 struct temp_file *temp;
d7a9644e 2165
2166 for (temp = failure_delete_queue; temp; temp = temp->next)
8149a4fc 2167 delete_if_ordinary (temp->name);
d7a9644e 2168}
2169
2170static void
952f0048 2171clear_failure_queue (void)
d7a9644e 2172{
2173 failure_delete_queue = 0;
2174}
8894538a 2175\f
067277c3 2176/* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2177 returns non-NULL.
2178 If DO_MULTI is true iterate over the paths twice, first with multilib
2179 suffix then without, otherwise iterate over the paths once without
2180 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2181 to avoid visiting the same path twice, but we could do better. For
2182 instance, /usr/lib/../lib is considered different from /usr/lib.
2183 At least EXTRA_SPACE chars past the end of the path passed to
2184 CALLBACK are available for use by the callback.
2185 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2186
2187 Returns the value returned by CALLBACK. */
2188
2189static void *
2190for_each_path (const struct path_prefix *paths,
2191 bool do_multi,
2192 size_t extra_space,
2193 void *(*callback) (char *, void *),
2194 void *callback_info)
8894538a 2195{
067277c3 2196 struct prefix_list *pl;
2197 const char *multi_dir = NULL;
2198 const char *multi_os_dir = NULL;
77adc39e 2199 const char *multiarch_suffix = NULL;
067277c3 2200 const char *multi_suffix;
2201 const char *just_multi_suffix;
2202 char *path = NULL;
2203 void *ret = NULL;
2204 bool skip_multi_dir = false;
2205 bool skip_multi_os_dir = false;
2206
2207 multi_suffix = machine_suffix;
2208 just_multi_suffix = just_machine_suffix;
2209 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
8894538a 2210 {
067277c3 2211 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2212 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2213 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2214 }
2215 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2216 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
77adc39e 2217 if (multiarch_dir)
2218 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
8894538a 2219
067277c3 2220 while (1)
2221 {
2222 size_t multi_dir_len = 0;
2223 size_t multi_os_dir_len = 0;
77adc39e 2224 size_t multiarch_len = 0;
067277c3 2225 size_t suffix_len;
2226 size_t just_suffix_len;
2227 size_t len;
2228
2229 if (multi_dir)
2230 multi_dir_len = strlen (multi_dir);
2231 if (multi_os_dir)
2232 multi_os_dir_len = strlen (multi_os_dir);
77adc39e 2233 if (multiarch_suffix)
2234 multiarch_len = strlen (multiarch_suffix);
067277c3 2235 suffix_len = strlen (multi_suffix);
2236 just_suffix_len = strlen (just_multi_suffix);
2237
2238 if (path == NULL)
8894538a 2239 {
067277c3 2240 len = paths->max_len + extra_space + 1;
77adc39e 2241 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
4c36ffe6 2242 path = XNEWVEC (char, len);
8894538a 2243 }
2244
067277c3 2245 for (pl = paths->plist; pl != 0; pl = pl->next)
3ec1fc1b 2246 {
067277c3 2247 len = strlen (pl->prefix);
2248 memcpy (path, pl->prefix, len);
2c815aff 2249
067277c3 2250 /* Look first in MACHINE/VERSION subdirectory. */
2251 if (!skip_multi_dir)
2252 {
2253 memcpy (path + len, multi_suffix, suffix_len + 1);
2254 ret = callback (path, callback_info);
2255 if (ret)
2256 break;
2257 }
2258
2259 /* Some paths are tried with just the machine (ie. target)
2260 subdir. This is used for finding as, ld, etc. */
2261 if (!skip_multi_dir
2262 && pl->require_machine_suffix == 2)
2263 {
2264 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2265 ret = callback (path, callback_info);
2266 if (ret)
2267 break;
2268 }
2269
77adc39e 2270 /* Now try the multiarch path. */
2271 if (!skip_multi_dir
2272 && !pl->require_machine_suffix && multiarch_dir)
2273 {
2274 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2275 ret = callback (path, callback_info);
2276 if (ret)
2277 break;
2278 }
2279
067277c3 2280 /* Now try the base path. */
2281 if (!pl->require_machine_suffix
2282 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2283 {
2284 const char *this_multi;
2285 size_t this_multi_len;
2286
2287 if (pl->os_multilib)
2288 {
2289 this_multi = multi_os_dir;
2290 this_multi_len = multi_os_dir_len;
2291 }
2292 else
2293 {
2294 this_multi = multi_dir;
2295 this_multi_len = multi_dir_len;
2296 }
2297
2298 if (this_multi_len)
2299 memcpy (path + len, this_multi, this_multi_len + 1);
2300 else
2301 path[len] = '\0';
2302
2303 ret = callback (path, callback_info);
2304 if (ret)
2305 break;
2306 }
3ec1fc1b 2307 }
067277c3 2308 if (pl)
2309 break;
3ec1fc1b 2310
067277c3 2311 if (multi_dir == NULL && multi_os_dir == NULL)
2312 break;
8894538a 2313
067277c3 2314 /* Run through the paths again, this time without multilibs.
2315 Don't repeat any we have already seen. */
2316 if (multi_dir)
2317 {
e47a6f81 2318 free (CONST_CAST (char *, multi_dir));
067277c3 2319 multi_dir = NULL;
e47a6f81 2320 free (CONST_CAST (char *, multi_suffix));
067277c3 2321 multi_suffix = machine_suffix;
e47a6f81 2322 free (CONST_CAST (char *, just_multi_suffix));
067277c3 2323 just_multi_suffix = just_machine_suffix;
8894538a 2324 }
067277c3 2325 else
2326 skip_multi_dir = true;
2327 if (multi_os_dir)
2328 {
e47a6f81 2329 free (CONST_CAST (char *, multi_os_dir));
067277c3 2330 multi_os_dir = NULL;
2331 }
2332 else
2333 skip_multi_os_dir = true;
2334 }
2335
2336 if (multi_dir)
2337 {
e47a6f81 2338 free (CONST_CAST (char *, multi_dir));
2339 free (CONST_CAST (char *, multi_suffix));
2340 free (CONST_CAST (char *, just_multi_suffix));
8894538a 2341 }
067277c3 2342 if (multi_os_dir)
e47a6f81 2343 free (CONST_CAST (char *, multi_os_dir));
067277c3 2344 if (ret != path)
2345 free (path);
2346 return ret;
2347}
2348
2349/* Callback for build_search_list. Adds path to obstack being built. */
2350
2351struct add_to_obstack_info {
2352 struct obstack *ob;
2353 bool check_dir;
2354 bool first_time;
2355};
2356
2357static void *
2358add_to_obstack (char *path, void *data)
2359{
25a1c410 2360 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
067277c3 2361
2362 if (info->check_dir && !is_directory (path, false))
2363 return NULL;
2364
2365 if (!info->first_time)
2366 obstack_1grow (info->ob, PATH_SEPARATOR);
2367
2368 obstack_grow (info->ob, path, strlen (path));
2369
2370 info->first_time = false;
2371 return NULL;
2372}
2373
99c00302 2374/* Add or change the value of an environment variable, outputting the
2375 change to standard error if in verbose mode. */
2376static void
e8105390 2377xputenv (const char *string)
99c00302 2378{
2379 if (verbose_flag)
a922df2e 2380 fnotice (stderr, "%s\n", string);
e8105390 2381 putenv (CONST_CAST (char *, string));
99c00302 2382}
2383
067277c3 2384/* Build a list of search directories from PATHS.
2385 PREFIX is a string to prepend to the list.
2386 If CHECK_DIR_P is true we ensure the directory exists.
2387 If DO_MULTI is true, multilib paths are output first, then
2388 non-multilib paths.
2389 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2390 It is also used by the --print-search-dirs flag. */
2391
2392static char *
2393build_search_list (const struct path_prefix *paths, const char *prefix,
2394 bool check_dir, bool do_multi)
2395{
2396 struct add_to_obstack_info info;
2397
2398 info.ob = &collect_obstack;
2399 info.check_dir = check_dir;
2400 info.first_time = true;
2401
2402 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2403 obstack_1grow (&collect_obstack, '=');
2404
2405 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
0dbd1c74 2406
4347db8e 2407 obstack_1grow (&collect_obstack, '\0');
4fac984f 2408 return XOBFINISH (&collect_obstack, char *);
8894538a 2409}
2410
a92771b8 2411/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2412 for collect. */
71cee7b1 2413
2414static void
067277c3 2415putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2416 bool do_multi)
71cee7b1 2417{
99c00302 2418 xputenv (build_search_list (paths, env_var, true, do_multi));
71cee7b1 2419}
d7a9644e 2420\f
4d5a901b 2421/* Check whether NAME can be accessed in MODE. This is like access,
2422 except that it never considers directories to be executable. */
2423
2424static int
952f0048 2425access_check (const char *name, int mode)
4d5a901b 2426{
2427 if (mode == X_OK)
2428 {
2429 struct stat st;
2430
2431 if (stat (name, &st) < 0
2432 || S_ISDIR (st.st_mode))
2433 return -1;
2434 }
2435
2436 return access (name, mode);
2437}
2438
067277c3 2439/* Callback for find_a_file. Appends the file name to the directory
2440 path. If the resulting file exists in the right mode, return the
2441 full pathname to the file. */
2442
2443struct file_at_path_info {
2444 const char *name;
2445 const char *suffix;
2446 int name_len;
2447 int suffix_len;
2448 int mode;
2449};
2450
2451static void *
2452file_at_path (char *path, void *data)
2453{
25a1c410 2454 struct file_at_path_info *info = (struct file_at_path_info *) data;
067277c3 2455 size_t len = strlen (path);
2456
2457 memcpy (path + len, info->name, info->name_len);
2458 len += info->name_len;
2459
2460 /* Some systems have a suffix for executable files.
2461 So try appending that first. */
2462 if (info->suffix_len)
2463 {
2464 memcpy (path + len, info->suffix, info->suffix_len + 1);
2465 if (access_check (path, info->mode) == 0)
2466 return path;
2467 }
2468
2469 path[len] = '\0';
2470 if (access_check (path, info->mode) == 0)
2471 return path;
2472
2473 return NULL;
2474}
2475
d7a9644e 2476/* Search for NAME using the prefix list PREFIXES. MODE is passed to
067277c3 2477 access to check permissions. If DO_MULTI is true, search multilib
2478 paths then non-multilib paths, otherwise do not search multilib paths.
a92771b8 2479 Return 0 if not found, otherwise return its name, allocated with malloc. */
d7a9644e 2480
2481static char *
067277c3 2482find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2483 bool do_multi)
d7a9644e 2484{
067277c3 2485 struct file_at_path_info info;
d7a9644e 2486
f07251bc 2487#ifdef DEFAULT_ASSEMBLER
7d3bd8c0 2488 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
713829e9 2489 return xstrdup (DEFAULT_ASSEMBLER);
f07251bc 2490#endif
2491
2492#ifdef DEFAULT_LINKER
713829e9 2493 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2494 return xstrdup (DEFAULT_LINKER);
f07251bc 2495#endif
2496
d7a9644e 2497 /* Determine the filename to execute (special case for absolute paths). */
2498
a5c088d4 2499 if (IS_ABSOLUTE_PATH (name))
d7a9644e 2500 {
f07251bc 2501 if (access (name, mode) == 0)
067277c3 2502 return xstrdup (name);
757f7e66 2503
067277c3 2504 return NULL;
2505 }
757f7e66 2506
067277c3 2507 info.name = name;
2508 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2509 info.name_len = strlen (info.name);
2510 info.suffix_len = strlen (info.suffix);
2511 info.mode = mode;
d7a9644e 2512
25a1c410 2513 return (char*) for_each_path (pprefix, do_multi,
2514 info.name_len + info.suffix_len,
2515 file_at_path, &info);
d7a9644e 2516}
2517
acd84059 2518/* Ranking of prefixes in the sort list. -B prefixes are put before
2c815aff 2519 all others. */
acd84059 2520
2521enum path_prefix_priority
2522{
2523 PREFIX_PRIORITY_B_OPT,
2524 PREFIX_PRIORITY_LAST
2525};
2526
98667efb 2527/* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
acd84059 2528 order according to PRIORITY. Within each PRIORITY, new entries are
2529 appended.
d7a9644e 2530
2531 If WARN is nonzero, we will warn if no file is found
2532 through this prefix. WARN should point to an int
3ec1fc1b 2533 which will be set to 1 if this entry is used.
2534
0dbd1c74 2535 COMPONENT is the value to be passed to update_path.
2536
3ec1fc1b 2537 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2538 the complete value of machine_suffix.
2539 2 means try both machine_suffix and just_machine_suffix. */
d7a9644e 2540
2541static void
952f0048 2542add_prefix (struct path_prefix *pprefix, const char *prefix,
2543 const char *component, /* enum prefix_priority */ int priority,
2af84186 2544 int require_machine_suffix, int os_multilib)
d7a9644e 2545{
2546 struct prefix_list *pl, **prev;
2547 int len;
2548
acd84059 2549 for (prev = &pprefix->plist;
2550 (*prev) != NULL && (*prev)->priority <= priority;
2551 prev = &(*prev)->next)
2552 ;
d7a9644e 2553
2358393e 2554 /* Keep track of the longest prefix. */
d7a9644e 2555
0dbd1c74 2556 prefix = update_path (prefix, component);
d7a9644e 2557 len = strlen (prefix);
2558 if (len > pprefix->max_len)
2559 pprefix->max_len = len;
2560
4c36ffe6 2561 pl = XNEW (struct prefix_list);
17b80c08 2562 pl->prefix = prefix;
d7a9644e 2563 pl->require_machine_suffix = require_machine_suffix;
acd84059 2564 pl->priority = priority;
c954ff02 2565 pl->os_multilib = os_multilib;
d7a9644e 2566
2358393e 2567 /* Insert after PREV. */
acd84059 2568 pl->next = (*prev);
2569 (*prev) = pl;
d7a9644e 2570}
805e22b2 2571
2572/* Same as add_prefix, but prepending target_system_root to prefix. */
c4328bcc 2573/* The target_system_root prefix has been relocated by gcc_exec_prefix. */
805e22b2 2574static void
952f0048 2575add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2576 const char *component,
2577 /* enum prefix_priority */ int priority,
2af84186 2578 int require_machine_suffix, int os_multilib)
805e22b2 2579{
a5c088d4 2580 if (!IS_ABSOLUTE_PATH (prefix))
a8c464ac 2581 fatal_error ("system path %qs is not absolute", prefix);
805e22b2 2582
2583 if (target_system_root)
2584 {
c5698d9f 2585 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
2586 size_t sysroot_len = strlen (target_system_root);
2587
2588 if (sysroot_len > 0
2589 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR)
2590 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
2591
4ea70922 2592 if (target_sysroot_suffix)
ce0fdb91 2593 prefix = concat (sysroot_no_trailing_dir_separator,
2594 target_sysroot_suffix, prefix, NULL);
2595 else
2596 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL);
2597
c5698d9f 2598 free (sysroot_no_trailing_dir_separator);
4ea70922 2599
805e22b2 2600 /* We have to override this because GCC's notion of sysroot
2601 moves along with GCC. */
2602 component = "GCC";
2603 }
2604
2605 add_prefix (pprefix, prefix, component, priority,
2af84186 2606 require_machine_suffix, os_multilib);
805e22b2 2607}
d7a9644e 2608\f
2609/* Execute the command specified by the arguments on the current line of spec.
2610 When using pipes, this includes several piped-together commands
2611 with `|' between them.
2612
2613 Return 0 if successful, -1 if failed. */
2614
2615static int
952f0048 2616execute (void)
d7a9644e 2617{
2618 int i;
2619 int n_commands; /* # of command. */
2620 char *string;
288e5bba 2621 struct pex_obj *pex;
d7a9644e 2622 struct command
026f2c7a 2623 {
2624 const char *prog; /* program name. */
2625 const char **argv; /* vector of args. */
026f2c7a 2626 };
9d9edc85 2627 const char *arg;
d7a9644e 2628
2629 struct command *commands; /* each command buffer with above info. */
2630
5e8f3c31 2631 gcc_assert (!processing_spec_function);
c21b3276 2632
0bfd146e 2633 if (wrapper_string)
2634 {
9d9edc85 2635 string = find_a_file (&exec_prefixes,
f1f41a6c 2636 argbuf[0], X_OK, false);
9d9edc85 2637 if (string)
f1f41a6c 2638 argbuf[0] = string;
0bfd146e 2639 insert_wrapper (wrapper_string);
2640 }
2641
d7a9644e 2642 /* Count # of piped commands. */
f1f41a6c 2643 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
9d9edc85 2644 if (strcmp (arg, "|") == 0)
d7a9644e 2645 n_commands++;
2646
2647 /* Get storage for each command. */
25a1c410 2648 commands = (struct command *) alloca (n_commands * sizeof (struct command));
d7a9644e 2649
2650 /* Split argbuf into its separate piped processes,
2651 and record info about each one.
2652 Also search for the programs that are to be run. */
2653
f1f41a6c 2654 argbuf.safe_push (0);
9d9edc85 2655
f1f41a6c 2656 commands[0].prog = argbuf[0]; /* first command. */
2657 commands[0].argv = argbuf.address ();
48e1416a 2658
0bfd146e 2659 if (!wrapper_string)
2660 {
2661 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2662 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2663 }
d7a9644e 2664
f1f41a6c 2665 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
9d9edc85 2666 if (arg && strcmp (arg, "|") == 0)
d7a9644e 2667 { /* each command. */
35151e7a 2668#if defined (__MSDOS__) || defined (OS2) || defined (VMS)
a922df2e 2669 fatal_error ("-pipe not supported");
d7a9644e 2670#endif
f1f41a6c 2671 argbuf[i] = 0; /* Termination of
9d9edc85 2672 command args. */
f1f41a6c 2673 commands[n_commands].prog = argbuf[i + 1];
9d9edc85 2674 commands[n_commands].argv
f1f41a6c 2675 = &(argbuf.address ())[i + 1];
c954ff02 2676 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
067277c3 2677 X_OK, false);
d7a9644e 2678 if (string)
2679 commands[n_commands].argv[0] = string;
2680 n_commands++;
2681 }
2682
d7a9644e 2683 /* If -v, print what we are about to do, and maybe query. */
2684
8894538a 2685 if (verbose_flag)
d7a9644e 2686 {
8ace789a 2687 /* For help listings, put a blank line between sub-processes. */
2688 if (print_help_list)
2689 fputc ('\n', stderr);
2c815aff 2690
d7a9644e 2691 /* Print each piped command as a separate line. */
026f2c7a 2692 for (i = 0; i < n_commands; i++)
d7a9644e 2693 {
826f6505 2694 const char *const *j;
d7a9644e 2695
3cfec666 2696 if (verbose_only_flag)
2697 {
74e4079a 2698 for (j = commands[i].argv; *j; j++)
2699 {
7cc1628d 2700 const char *p;
74e4079a 2701 for (p = *j; *p; ++p)
663e8646 2702 if (!ISALNUM ((unsigned char) *p)
2703 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
2704 break;
2705 if (*p || !*j)
74e4079a 2706 {
663e8646 2707 fprintf (stderr, " \"");
2708 for (p = *j; *p; ++p)
2709 {
2710 if (*p == '"' || *p == '\\' || *p == '$')
2711 fputc ('\\', stderr);
2712 fputc (*p, stderr);
2713 }
2714 fputc ('"', stderr);
74e4079a 2715 }
fde5bd5c 2716 /* If it's empty, print "". */
2717 else if (!**j)
2718 fprintf (stderr, " \"\"");
663e8646 2719 else
2720 fprintf (stderr, " %s", *j);
74e4079a 2721 }
3cfec666 2722 }
2723 else
74e4079a 2724 for (j = commands[i].argv; *j; j++)
fde5bd5c 2725 /* If it's empty, print "". */
2726 if (!**j)
2727 fprintf (stderr, " \"\"");
2728 else
2729 fprintf (stderr, " %s", *j);
d7a9644e 2730
2731 /* Print a pipe symbol after all but the last command. */
2732 if (i + 1 != n_commands)
2733 fprintf (stderr, " |");
2734 fprintf (stderr, "\n");
2735 }
2736 fflush (stderr);
74e4079a 2737 if (verbose_only_flag != 0)
0f709d72 2738 {
2739 /* verbose_only_flag should act as if the spec was
2740 executed, so increment execution_count before
c7bf1374 2741 returning. This prevents spurious warnings about
0f709d72 2742 unused linker input files, etc. */
2743 execution_count++;
2744 return 0;
2745 }
d7a9644e 2746#ifdef DEBUG
a922df2e 2747 fnotice (stderr, "\nGo ahead? (y or n) ");
d7a9644e 2748 fflush (stderr);
2749 i = getchar ();
2750 if (i != '\n')
0dbd1c74 2751 while (getchar () != '\n')
2752 ;
2753
d7a9644e 2754 if (i != 'y' && i != 'Y')
2755 return 0;
2756#endif /* DEBUG */
2757 }
2758
0fa54ff1 2759#ifdef ENABLE_VALGRIND_CHECKING
98667efb 2760 /* Run the each command through valgrind. To simplify prepending the
0fa54ff1 2761 path to valgrind and the option "-q" (for quiet operation unless
2762 something triggers), we allocate a separate argv array. */
2763
2764 for (i = 0; i < n_commands; i++)
2765 {
2766 const char **argv;
2767 int argc;
2768 int j;
2769
2770 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
2771 ;
2772
561c1db5 2773 argv = XALLOCAVEC (const char *, argc + 3);
0fa54ff1 2774
2775 argv[0] = VALGRIND_PATH;
2776 argv[1] = "-q";
2777 for (j = 2; j < argc + 2; j++)
2778 argv[j] = commands[i].argv[j - 2];
2779 argv[j] = NULL;
2780
2781 commands[i].argv = argv;
2782 commands[i].prog = argv[0];
2783 }
2784#endif
2785
d7a9644e 2786 /* Run each piped subprocess. */
2787
4537c5d9 2788 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
2789 ? PEX_RECORD_TIMES : 0),
460b8bb3 2790 progname, temp_filename);
288e5bba 2791 if (pex == NULL)
a8c464ac 2792 fatal_error ("pex_init failed: %m");
288e5bba 2793
d7a9644e 2794 for (i = 0; i < n_commands; i++)
2795 {
288e5bba 2796 const char *errmsg;
2797 int err;
2508fdc3 2798 const char *string = commands[i].argv[0];
d7a9644e 2799
288e5bba 2800 errmsg = pex_run (pex,
2801 ((i + 1 == n_commands ? PEX_LAST : 0)
2802 | (string == commands[i].prog ? PEX_SEARCH : 0)),
e47a6f81 2803 string, CONST_CAST (char **, commands[i].argv),
288e5bba 2804 NULL, NULL, &err);
2805 if (errmsg != NULL)
2806 {
2807 if (err == 0)
a922df2e 2808 fatal_error (errmsg);
288e5bba 2809 else
2810 {
2811 errno = err;
2812 pfatal_with_name (errmsg);
2813 }
2814 }
d7a9644e 2815
2816 if (string != commands[i].prog)
e47a6f81 2817 free (CONST_CAST (char *, string));
d7a9644e 2818 }
2819
2820 execution_count++;
2821
288e5bba 2822 /* Wait for all the subprocesses to finish. */
d7a9644e 2823
2824 {
288e5bba 2825 int *statuses;
2826 struct pex_time *times = NULL;
d7a9644e 2827 int ret_code = 0;
2828
25a1c410 2829 statuses = (int *) alloca (n_commands * sizeof (int));
288e5bba 2830 if (!pex_get_status (pex, n_commands, statuses))
a8c464ac 2831 fatal_error ("failed to get exit status: %m");
288e5bba 2832
4537c5d9 2833 if (report_times || report_times_to_file)
d7a9644e 2834 {
25a1c410 2835 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
288e5bba 2836 if (!pex_get_times (pex, n_commands, times))
a8c464ac 2837 fatal_error ("failed to get process times: %m");
288e5bba 2838 }
d7a9644e 2839
288e5bba 2840 pex_free (pex);
d7a9644e 2841
288e5bba 2842 for (i = 0; i < n_commands; ++i)
2843 {
2844 int status = statuses[i];
a876e5f8 2845
288e5bba 2846 if (WIFSIGNALED (status))
2847 {
4ed34b76 2848#ifdef SIGPIPE
288e5bba 2849 /* SIGPIPE is a special case. It happens in -pipe mode
2850 when the compiler dies before the preprocessor is done,
2851 or the assembler dies before the compiler is done.
2852 There's generally been an error already, and this is
2853 just fallout. So don't generate another error unless
2854 we would otherwise have succeeded. */
2855 if (WTERMSIG (status) == SIGPIPE
2856 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
d4523b3e 2857 {
2858 signal_count++;
2859 ret_code = -1;
2860 }
288e5bba 2861 else
2862#endif
460b8bb3 2863 internal_error ("%s (program %s)",
2864 strsignal (WTERMSIG (status)), commands[i].prog);
288e5bba 2865 }
2866 else if (WIFEXITED (status)
2867 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2868 {
2869 if (WEXITSTATUS (status) > greatest_status)
2870 greatest_status = WEXITSTATUS (status);
2871 ret_code = -1;
2872 }
2873
4537c5d9 2874 if (report_times || report_times_to_file)
288e5bba 2875 {
2876 struct pex_time *pt = &times[i];
2877 double ut, st;
2878
2879 ut = ((double) pt->user_seconds
2880 + (double) pt->user_microseconds / 1.0e6);
2881 st = ((double) pt->system_seconds
2882 + (double) pt->system_microseconds / 1.0e6);
2883
2884 if (ut + st != 0)
4537c5d9 2885 {
2886 if (report_times)
a922df2e 2887 fnotice (stderr, "# %s %.2f %.2f\n",
2888 commands[i].prog, ut, st);
4537c5d9 2889
2890 if (report_times_to_file)
2891 {
2892 int c = 0;
2893 const char *const *j;
2894
2895 fprintf (report_times_to_file, "%g %g", ut, st);
2896
2897 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
2898 {
2899 const char *p;
2900 for (p = *j; *p; ++p)
2901 if (*p == '"' || *p == '\\' || *p == '$'
2902 || ISSPACE (*p))
2903 break;
2904
2905 if (*p)
2906 {
2907 fprintf (report_times_to_file, " \"");
2908 for (p = *j; *p; ++p)
2909 {
2910 if (*p == '"' || *p == '\\' || *p == '$')
2911 fputc ('\\', report_times_to_file);
2912 fputc (*p, report_times_to_file);
2913 }
2914 fputc ('"', report_times_to_file);
2915 }
2916 else
2917 fprintf (report_times_to_file, " %s", *j);
2918 }
2919
2920 fputc ('\n', report_times_to_file);
2921 }
2922 }
288e5bba 2923 }
d7a9644e 2924 }
288e5bba 2925
d7a9644e 2926 return ret_code;
2927 }
2928}
2929\f
2930/* Find all the switches given to us
2931 and make a vector describing them.
2932 The elements of the vector are strings, one per switch given.
2933 If a switch uses following arguments, then the `part1' field
2934 is the switch itself and the `args' field
2935 is a null-terminated vector containing the following arguments.
79d52444 2936 Bits in the `live_cond' field are:
2937 SWITCH_LIVE to indicate this switch is true in a conditional spec.
2938 SWITCH_FALSE to indicate this switch is overridden by a later switch.
2939 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
87a6a1b5 2940 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
2941 in all do_spec calls afterwards. Used for %<S from self specs.
be2828ce 2942 The `validated' field is nonzero if any spec has looked at this switch;
d7a9644e 2943 if it remains zero at the end of the run, it must be meaningless. */
2944
5c1421d7 2945#define SWITCH_LIVE (1 << 0)
2946#define SWITCH_FALSE (1 << 1)
2947#define SWITCH_IGNORE (1 << 2)
2948#define SWITCH_IGNORE_PERMANENTLY (1 << 3)
2949#define SWITCH_KEEP_FOR_GCC (1 << 4)
4a10d696 2950
d7a9644e 2951struct switchstr
2952{
e40d43cc 2953 const char *part1;
2508fdc3 2954 const char **args;
79d52444 2955 unsigned int live_cond;
556cfe53 2956 bool known;
2957 bool validated;
2958 bool ordering;
d7a9644e 2959};
2960
2961static struct switchstr *switches;
2962
2963static int n_switches;
2964
bd338b2c 2965static int n_switches_alloc;
2966
71278019 2967/* Set to zero if -fcompare-debug is disabled, positive if it's
2968 enabled and we're running the first compilation, negative if it's
2969 enabled and we're running the second compilation. For most of the
2970 time, it's in the range -1..1, but it can be temporarily set to 2
2971 or 3 to indicate that the -fcompare-debug flags didn't come from
2972 the command-line, but rather from the GCC_COMPARE_DEBUG environment
2973 variable, until a synthesized -fcompare-debug flag is added to the
2974 command line. */
2975int compare_debug;
2976
2977/* Set to nonzero if we've seen the -fcompare-debug-second flag. */
2978int compare_debug_second;
2979
2980/* Set to the flags that should be passed to the second compilation in
2981 a -fcompare-debug compilation. */
2982const char *compare_debug_opt;
2983
2984static struct switchstr *switches_debug_check[2];
2985
2986static int n_switches_debug_check[2];
2987
4ff887c5 2988static int n_switches_alloc_debug_check[2];
2989
71278019 2990static char *debug_check_temp_file[2];
2991
fbf54d9a 2992/* Language is one of three things:
2993
2994 1) The name of a real programming language.
2995 2) NULL, indicating that no one has figured out
2996 what it is yet.
2997 3) '*', indicating that the file should be passed
2998 to the linker. */
d7a9644e 2999struct infile
3000{
e40d43cc 3001 const char *name;
3002 const char *language;
dc1dd09b 3003 struct compiler *incompiler;
3004 bool compiled;
3005 bool preprocessed;
d7a9644e 3006};
3007
3008/* Also a vector of input files specified. */
3009
3010static struct infile *infiles;
3011
943bf3c7 3012int n_infiles;
d7a9644e 3013
bd338b2c 3014static int n_infiles_alloc;
3015
40109983 3016/* True if multiple input files are being compiled to a single
3017 assembly file. */
3018
3019static bool combine_inputs;
3020
cdf76fe2 3021/* This counts the number of libraries added by lang_specific_driver, so that
9e56255a 3022 we can tell if there were any user supplied any files or libraries. */
3023
3024static int added_libraries;
3025
d7a9644e 3026/* And a vector of corresponding output files is made up later. */
3027
943bf3c7 3028const char **outfiles;
2e58e75e 3029\f
10f57222 3030#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2e58e75e 3031
3032/* Convert NAME to a new name if it is the standard suffix. DO_EXE
c5025ad6 3033 is true if we should look for an executable suffix. DO_OBJ
3034 is true if we should look for an object suffix. */
2e58e75e 3035
7e6b5e54 3036static const char *
952f0048 3037convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3038 int do_obj ATTRIBUTE_UNUSED)
2e58e75e 3039{
7e6b5e54 3040#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2e58e75e 3041 int i;
7e6b5e54 3042#endif
2e3ecf64 3043 int len;
3044
3045 if (name == NULL)
3046 return NULL;
2c815aff 3047
2e3ecf64 3048 len = strlen (name);
2e58e75e 3049
10f57222 3050#ifdef HAVE_TARGET_OBJECT_SUFFIX
3051 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
c5025ad6 3052 if (do_obj && len > 2
2e58e75e 3053 && name[len - 2] == '.'
3054 && name[len - 1] == 'o')
3055 {
7c8c3232 3056 obstack_grow (&obstack, name, len - 2);
10f57222 3057 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4fac984f 3058 name = XOBFINISH (&obstack, const char *);
2e58e75e 3059 }
3060#endif
3061
10f57222 3062#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2e58e75e 3063 /* If there is no filetype, make it the executable suffix (which includes
3064 the "."). But don't get confused if we have just "-o". */
10f57222 3065 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2e58e75e 3066 return name;
3067
dea8dca4 3068 for (i = len - 1; i >= 0; i--)
79b23a1e 3069 if (IS_DIR_SEPARATOR (name[i]))
dea8dca4 3070 break;
3071
3072 for (i++; i < len; i++)
2e58e75e 3073 if (name[i] == '.')
3074 return name;
3075
3076 obstack_grow (&obstack, name, len);
ee866761 3077 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3078 strlen (TARGET_EXECUTABLE_SUFFIX));
4fac984f 3079 name = XOBFINISH (&obstack, const char *);
2e58e75e 3080#endif
3081
3082 return name;
3083}
3084#endif
8ace789a 3085\f
3086/* Display the command line switches accepted by gcc. */
3087static void
952f0048 3088display_help (void)
8ace789a 3089{
460b8bb3 3090 printf (_("Usage: %s [options] file...\n"), progname);
a4db0a1d 3091 fputs (_("Options:\n"), stdout);
8ace789a 3092
a4db0a1d 3093 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3094 fputs (_(" --help Display this information\n"), stdout);
7a6882ca 3095 fputs (_(" --target-help Display target specific command line options\n"), stdout);
042a76cf 3096 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
87c75316 3097 fputs (_(" Display specific types of command line options\n"), stdout);
8ace789a 3098 if (! verbose_flag)
a4db0a1d 3099 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
53f9a00b 3100 fputs (_(" --version Display compiler version information\n"), stdout);
a4db0a1d 3101 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3102 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3103 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3104 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3105 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3106 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3107 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
77adc39e 3108 fputs (_("\
3109 -print-multiarch Display the target's normalized GNU triplet, used as\n\
3110 a component in the library path\n"), stdout);
a4db0a1d 3111 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3112 fputs (_("\
3113 -print-multi-lib Display the mapping between command line options and\n\
3114 multiple library search directories\n"), stdout);
c954ff02 3115 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
098cc23f 3116 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
6ea4242f 3117 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
a4db0a1d 3118 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3119 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3120 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
805e22b2 3121 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3122 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
a4db0a1d 3123 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3124 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
cc92bc82 3125 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
d05a1771 3126 fputs (_("\
3127 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3128 prefixes to other gcc components\n"), stdout);
a4db0a1d 3129 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3130 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
f4ec69cb 3131 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
a4db0a1d 3132 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
a99be165 3133 fputs (_("\
3134 --sysroot=<directory> Use <directory> as the root directory for headers\n\
6702edc2 3135 and libraries\n"), stdout);
a4db0a1d 3136 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
a4db0a1d 3137 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
74e4079a 3138 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
a4db0a1d 3139 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3140 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3141 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3142 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
1412b935 3143 fputs (_(" -pie Create a position independent executable\n"), stdout);
3144 fputs (_(" -shared Create a shared library\n"), stdout);
a4db0a1d 3145 fputs (_("\
3146 -x <language> Specify the language of the following input files\n\
6122f188 3147 Permissible languages include: c c++ assembler none\n\
1d8c4563 3148 'none' means revert to the default behavior of\n\
a4db0a1d 3149 guessing the language based on the file's extension\n\
3150"), stdout);
3151
60933322 3152 printf (_("\
833a5c07 3153\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3154 passed on to the various sub-processes invoked by %s. In order to pass\n\
3155 other options on to these processes the -W<letter> options must be used.\n\
460b8bb3 3156"), progname);
8ace789a 3157
3158 /* The rest of the options are displayed by invocations of the various
3159 sub-processes. */
3160}
3161
2c815aff 3162static void
952f0048 3163add_preprocessor_option (const char *option, int len)
2c815aff 3164{
f1f41a6c 3165 preprocessor_options.safe_push (save_string (option, len));
9a109943 3166}
2c815aff 3167
3168static void
952f0048 3169add_assembler_option (const char *option, int len)
e40d43cc 3170{
f1f41a6c 3171 assembler_options.safe_push (save_string (option, len));
8ace789a 3172}
2c815aff 3173
3174static void
952f0048 3175add_linker_option (const char *option, int len)
e40d43cc 3176{
f1f41a6c 3177 linker_options.safe_push (save_string (option, len));
9a109943 3178}
2e58e75e 3179\f
bd338b2c 3180/* Allocate space for an input file in infiles. */
3181
3182static void
3183alloc_infile (void)
3184{
3185 if (n_infiles_alloc == 0)
3186 {
3187 n_infiles_alloc = 16;
3188 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3189 }
3190 else if (n_infiles_alloc == n_infiles)
3191 {
3192 n_infiles_alloc *= 2;
3193 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3194 }
3195}
3196
3197/* Store an input file with the given NAME and LANGUAGE in
3198 infiles. */
3199
3200static void
3201add_infile (const char *name, const char *language)
3202{
3203 alloc_infile ();
3204 infiles[n_infiles].name = name;
3205 infiles[n_infiles++].language = language;
3206}
3207
3208/* Allocate space for a switch in switches. */
3209
3210static void
3211alloc_switch (void)
3212{
3213 if (n_switches_alloc == 0)
3214 {
3215 n_switches_alloc = 16;
3216 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3217 }
3218 else if (n_switches_alloc == n_switches)
3219 {
3220 n_switches_alloc *= 2;
3221 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3222 }
3223}
3224
e28aa114 3225/* Save an option OPT with N_ARGS arguments in array ARGS, marking it
556cfe53 3226 as validated if VALIDATED and KNOWN if it is an internal switch. */
e28aa114 3227
3228static void
3229save_switch (const char *opt, size_t n_args, const char *const *args,
556cfe53 3230 bool validated, bool known)
e28aa114 3231{
3232 alloc_switch ();
3233 switches[n_switches].part1 = opt + 1;
3234 if (n_args == 0)
3235 switches[n_switches].args = 0;
3236 else
3237 {
3238 switches[n_switches].args = XNEWVEC (const char *, n_args + 1);
3239 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3240 switches[n_switches].args[n_args] = NULL;
3241 }
3242
3243 switches[n_switches].live_cond = 0;
3244 switches[n_switches].validated = validated;
556cfe53 3245 switches[n_switches].known = known;
e28aa114 3246 switches[n_switches].ordering = 0;
3247 n_switches++;
3248}
3249
3250/* Handle an option DECODED that is unknown to the option-processing
a4e747a2 3251 machinery. */
e28aa114 3252
3253static bool
3254driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3255{
a4e747a2 3256 const char *opt = decoded->arg;
3257 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3258 && !(decoded->errors & CL_ERR_NEGATIVE))
3259 {
3260 /* Leave unknown -Wno-* options for the compiler proper, to be
3261 diagnosed only if there are warnings. */
3262 save_switch (decoded->canonical_option[0],
3263 decoded->canonical_option_num_elements - 1,
556cfe53 3264 &decoded->canonical_option[1], false, true);
3265 return false;
3266 }
3267 if (decoded->opt_index == OPT_SPECIAL_unknown)
3268 {
3269 /* Give it a chance to define it a a spec file. */
3270 save_switch (decoded->canonical_option[0],
3271 decoded->canonical_option_num_elements - 1,
3272 &decoded->canonical_option[1], false, false);
a4e747a2 3273 return false;
3274 }
3275 else
3276 return true;
e28aa114 3277}
3278
3279/* Handle an option DECODED that is not marked as CL_DRIVER.
3280 LANG_MASK will always be CL_DRIVER. */
3281
3282static void
3283driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3284 unsigned int lang_mask ATTRIBUTE_UNUSED)
3285{
3286 /* At this point, non-driver options are accepted (and expected to
3287 be passed down by specs) unless marked to be rejected by the
3288 driver. Options to be rejected by the driver but accepted by the
3289 compilers proper are treated just like completely unknown
3290 options. */
3291 const struct cl_option *option = &cl_options[decoded->opt_index];
3292
ec840af4 3293 if (option->cl_reject_driver)
e28aa114 3294 error ("unrecognized command line option %qs",
3295 decoded->orig_option_with_args_text);
3296 else
a4e747a2 3297 save_switch (decoded->canonical_option[0],
3298 decoded->canonical_option_num_elements - 1,
556cfe53 3299 &decoded->canonical_option[1], false, true);
e28aa114 3300}
3301
e28aa114 3302static const char *spec_lang = 0;
3303static int last_language_n_infiles;
3304
3305/* Handle a driver option; arguments and return value as for
3306 handle_option. */
3307
3308static bool
2c5d2e39 3309driver_handle_option (struct gcc_options *opts,
f83b64ca 3310 struct gcc_options *opts_set,
2c5d2e39 3311 const struct cl_decoded_option *decoded,
e28aa114 3312 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
3c6c0e40 3313 location_t loc,
6bd9d862 3314 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
3315 diagnostic_context *dc)
e28aa114 3316{
3317 size_t opt_index = decoded->opt_index;
3318 const char *arg = decoded->arg;
3319 const char *compare_debug_replacement_opt;
3320 int value = decoded->value;
3321 bool validated = false;
3322 bool do_save = true;
3323
2c5d2e39 3324 gcc_assert (opts == &global_options);
f83b64ca 3325 gcc_assert (opts_set == &global_options_set);
e28aa114 3326 gcc_assert (kind == DK_UNSPECIFIED);
3c6c0e40 3327 gcc_assert (loc == UNKNOWN_LOCATION);
6bd9d862 3328 gcc_assert (dc == global_dc);
e28aa114 3329
3330 switch (opt_index)
3331 {
3332 case OPT_dumpspecs:
3333 {
3334 struct spec_list *sl;
3335 init_spec ();
3336 for (sl = specs; sl; sl = sl->next)
3337 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3338 if (link_command_spec)
3339 printf ("*link_command:\n%s\n\n", link_command_spec);
3340 exit (0);
3341 }
3342
3343 case OPT_dumpversion:
3344 printf ("%s\n", spec_version);
3345 exit (0);
3346
3347 case OPT_dumpmachine:
3348 printf ("%s\n", spec_machine);
3349 exit (0);
3350
5789e05b 3351 case OPT__version:
e28aa114 3352 print_version = 1;
3353
3354 /* CPP driver cannot obtain switch from cc1_options. */
3355 if (is_cpp_driver)
3356 add_preprocessor_option ("--version", strlen ("--version"));
3357 add_assembler_option ("--version", strlen ("--version"));
3358 add_linker_option ("--version", strlen ("--version"));
3359 break;
3360
5789e05b 3361 case OPT__help:
e28aa114 3362 print_help_list = 1;
3363
3364 /* CPP driver cannot obtain switch from cc1_options. */
3365 if (is_cpp_driver)
3366 add_preprocessor_option ("--help", 6);
3367 add_assembler_option ("--help", 6);
3368 add_linker_option ("--help", 6);
3369 break;
3370
5789e05b 3371 case OPT__help_:
e28aa114 3372 print_subprocess_help = 2;
3373 break;
3374
5789e05b 3375 case OPT__target_help:
e28aa114 3376 print_subprocess_help = 1;
3377
3378 /* CPP driver cannot obtain switch from cc1_options. */
3379 if (is_cpp_driver)
3380 add_preprocessor_option ("--target-help", 13);
3381 add_assembler_option ("--target-help", 13);
3382 add_linker_option ("--target-help", 13);
3383 break;
3384
70eb49f5 3385 case OPT__no_sysroot_suffix:
e28aa114 3386 case OPT_pass_exit_codes:
3387 case OPT_print_search_dirs:
3388 case OPT_print_file_name_:
3389 case OPT_print_prog_name_:
3390 case OPT_print_multi_lib:
3391 case OPT_print_multi_directory:
3392 case OPT_print_sysroot:
3393 case OPT_print_multi_os_directory:
77adc39e 3394 case OPT_print_multiarch:
e28aa114 3395 case OPT_print_sysroot_headers_suffix:
3396 case OPT_time:
3397 case OPT_wrapper:
3398 /* These options set the variables specified in common.opt
3399 automatically, and do not need to be saved for spec
3400 processing. */
3401 do_save = false;
3402 break;
3403
3404 case OPT_print_libgcc_file_name:
3405 print_file_name = "libgcc.a";
3406 do_save = false;
3407 break;
3408
3409 case OPT_fcompare_debug_second:
3410 compare_debug_second = 1;
3411 break;
3412
3413 case OPT_fcompare_debug:
3414 switch (value)
3415 {
3416 case 0:
3417 compare_debug_replacement_opt = "-fcompare-debug=";
3418 arg = "";
3419 goto compare_debug_with_arg;
3420
3421 case 1:
3422 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
3423 arg = "-gtoggle";
3424 goto compare_debug_with_arg;
3425
3426 default:
3427 gcc_unreachable ();
3428 }
3429 break;
3430
3431 case OPT_fcompare_debug_:
3432 compare_debug_replacement_opt = decoded->canonical_option[0];
3433 compare_debug_with_arg:
3434 gcc_assert (decoded->canonical_option_num_elements == 1);
3435 gcc_assert (arg != NULL);
400b18e7 3436 if (*arg)
e28aa114 3437 compare_debug = 1;
3438 else
3439 compare_debug = -1;
3440 if (compare_debug < 0)
3441 compare_debug_opt = NULL;
3442 else
3443 compare_debug_opt = arg;
556cfe53 3444 save_switch (compare_debug_replacement_opt, 0, NULL, validated, true);
e28aa114 3445 return true;
3446
3447 case OPT_Wa_:
3448 {
3449 int prev, j;
3450 /* Pass the rest of this option to the assembler. */
3451
3452 /* Split the argument at commas. */
3453 prev = 0;
3454 for (j = 0; arg[j]; j++)
3455 if (arg[j] == ',')
3456 {
3457 add_assembler_option (arg + prev, j - prev);
3458 prev = j + 1;
3459 }
3460
3461 /* Record the part after the last comma. */
3462 add_assembler_option (arg + prev, j - prev);
3463 }
3464 do_save = false;
3465 break;
3466
3467 case OPT_Wp_:
3468 {
3469 int prev, j;
3470 /* Pass the rest of this option to the preprocessor. */
3471
3472 /* Split the argument at commas. */
3473 prev = 0;
3474 for (j = 0; arg[j]; j++)
3475 if (arg[j] == ',')
3476 {
3477 add_preprocessor_option (arg + prev, j - prev);
3478 prev = j + 1;
3479 }
3480
3481 /* Record the part after the last comma. */
3482 add_preprocessor_option (arg + prev, j - prev);
3483 }
3484 do_save = false;
3485 break;
3486
3487 case OPT_Wl_:
3488 {
3489 int prev, j;
3490 /* Split the argument at commas. */
3491 prev = 0;
3492 for (j = 0; arg[j]; j++)
3493 if (arg[j] == ',')
3494 {
3495 add_infile (save_string (arg + prev, j - prev), "*");
3496 prev = j + 1;
3497 }
3498 /* Record the part after the last comma. */
3499 add_infile (arg + prev, "*");
3500 }
3501 do_save = false;
3502 break;
3503
3504 case OPT_Xlinker:
3505 add_infile (arg, "*");
3506 do_save = false;
3507 break;
3508
3509 case OPT_Xpreprocessor:
3510 add_preprocessor_option (arg, strlen (arg));
3511 do_save = false;
3512 break;
3513
3514 case OPT_Xassembler:
3515 add_assembler_option (arg, strlen (arg));
3516 do_save = false;
3517 break;
3518
3519 case OPT_l:
3520 /* POSIX allows separation of -l and the lib arg; canonicalize
3521 by concatenating -l with its arg */
3522 add_infile (concat ("-l", arg, NULL), "*");
3523 do_save = false;
3524 break;
3525
67089c6b 3526 case OPT_L:
3527 /* Similarly, canonicalize -L for linkers that may not accept
3528 separate arguments. */
556cfe53 3529 save_switch (concat ("-L", arg, NULL), 0, NULL, validated, true);
67089c6b 3530 return true;
3531
accf4556 3532 case OPT_F:
3533 /* Likewise -F. */
556cfe53 3534 save_switch (concat ("-F", arg, NULL), 0, NULL, validated, true);
accf4556 3535 return true;
3536
e28aa114 3537 case OPT_save_temps:
3538 save_temps_flag = SAVE_TEMPS_CWD;
3539 validated = true;
3540 break;
3541
3542 case OPT_save_temps_:
3543 if (strcmp (arg, "cwd") == 0)
3544 save_temps_flag = SAVE_TEMPS_CWD;
3545 else if (strcmp (arg, "obj") == 0
3546 || strcmp (arg, "object") == 0)
3547 save_temps_flag = SAVE_TEMPS_OBJ;
3548 else
3549 fatal_error ("%qs is an unknown -save-temps option",
3550 decoded->orig_option_with_args_text);
3551 break;
3552
3553 case OPT_no_canonical_prefixes:
3554 /* Already handled as a special case, so ignored here. */
3555 do_save = false;
3556 break;
3557
3558 case OPT_pipe:
3559 validated = true;
e28aa114 3560 /* These options set the variables specified in common.opt
3561 automatically, but do need to be saved for spec
3562 processing. */
3563 break;
3564
e28aa114 3565 case OPT_specs_:
3566 {
3567 struct user_specs *user = XNEW (struct user_specs);
3568
3569 user->next = (struct user_specs *) 0;
3570 user->filename = arg;
3571 if (user_specs_tail)
3572 user_specs_tail->next = user;
3573 else
3574 user_specs_head = user;
3575 user_specs_tail = user;
3576 }
556cfe53 3577 validated = true;
e28aa114 3578 break;
3579
3580 case OPT__sysroot_:
3581 target_system_root = arg;
3582 target_system_root_changed = 1;
3583 do_save = false;
3584 break;
3585
3586 case OPT_time_:
3587 if (report_times_to_file)
3588 fclose (report_times_to_file);
3589 report_times_to_file = fopen (arg, "a");
3590 do_save = false;
3591 break;
3592
3593 case OPT____:
3594 /* "-###"
3595 This is similar to -v except that there is no execution
3596 of the commands and the echoed arguments are quoted. It
3597 is intended for use in shell scripts to capture the
3598 driver-generated command line. */
3599 verbose_only_flag++;
6bd9d862 3600 verbose_flag = 1;
e28aa114 3601 do_save = false;
3602 break;
3603
3604 case OPT_B:
3605 {
3606 size_t len = strlen (arg);
3607
3608 /* Catch the case where the user has forgotten to append a
3609 directory separator to the path. Note, they may be using
3610 -B to add an executable name prefix, eg "i386-elf-", in
3611 order to distinguish between multiple installations of
3612 GCC in the same directory. Hence we must check to see
3613 if appending a directory separator actually makes a
3614 valid directory name. */
3615 if (!IS_DIR_SEPARATOR (arg[len - 1])
3616 && is_directory (arg, false))
3617 {
3618 char *tmp = XNEWVEC (char, len + 2);
3619 strcpy (tmp, arg);
3620 tmp[len] = DIR_SEPARATOR;
3621 tmp[++len] = 0;
3622 arg = tmp;
3623 }
3624
3625 add_prefix (&exec_prefixes, arg, NULL,
3626 PREFIX_PRIORITY_B_OPT, 0, 0);
3627 add_prefix (&startfile_prefixes, arg, NULL,
3628 PREFIX_PRIORITY_B_OPT, 0, 0);
3629 add_prefix (&include_prefixes, arg, NULL,
3630 PREFIX_PRIORITY_B_OPT, 0, 0);
3631 }
3632 validated = true;
3633 break;
3634
e28aa114 3635 case OPT_x:
3636 spec_lang = arg;
3637 if (!strcmp (spec_lang, "none"))
3638 /* Suppress the warning if -xnone comes after the last input
3639 file, because alternate command interfaces like g++ might
3640 find it useful to place -xnone after each input file. */
3641 spec_lang = 0;
3642 else
3643 last_language_n_infiles = n_infiles;
3644 do_save = false;
3645 break;
3646
e28aa114 3647 case OPT_o:
3648 have_o = 1;
3649#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3650 arg = convert_filename (arg, ! have_c, 0);
3651#endif
3652 /* Save the output name in case -save-temps=obj was used. */
3653 save_temps_prefix = xstrdup (arg);
3654 /* On some systems, ld cannot handle "-o" without a space. So
3655 split the option from its argument. */
556cfe53 3656 save_switch ("-o", 1, &arg, validated, true);
e28aa114 3657 return true;
3658
3659 case OPT_static_libgcc:
3660 case OPT_shared_libgcc:
3661 case OPT_static_libgfortran:
3662 case OPT_static_libstdc__:
3663 /* These are always valid, since gcc.c itself understands the
3664 first two, gfortranspec.c understands -static-libgfortran and
3665 g++spec.c understands -static-libstdc++ */
3666 validated = true;
3667 break;
3668
3669 default:
cb22f930 3670 /* Various driver options need no special processing at this
3671 point, having been handled in a prescan above or being
3672 handled by specs. */
3673 break;
e28aa114 3674 }
3675
3676 if (do_save)
3677 save_switch (decoded->canonical_option[0],
3678 decoded->canonical_option_num_elements - 1,
556cfe53 3679 &decoded->canonical_option[1], validated, true);
e28aa114 3680 return true;
3681}
3682
4ff887c5 3683/* Put the driver's standard set of option handlers in *HANDLERS. */
3684
3685static void
3686set_option_handlers (struct cl_option_handlers *handlers)
3687{
3688 handlers->unknown_option_callback = driver_unknown_option_callback;
3689 handlers->wrong_lang_callback = driver_wrong_lang_callback;
90336809 3690 handlers->num_handlers = 3;
4ff887c5 3691 handlers->handlers[0].handler = driver_handle_option;
3692 handlers->handlers[0].mask = CL_DRIVER;
90336809 3693 handlers->handlers[1].handler = common_handle_option;
3694 handlers->handlers[1].mask = CL_COMMON;
3695 handlers->handlers[2].handler = target_handle_option;
3696 handlers->handlers[2].mask = CL_TARGET;
4ff887c5 3697}
3698
d7a9644e 3699/* Create the vector `switches' and its contents.
3700 Store its length in `n_switches'. */
3701
3702static void
e62df35b 3703process_command (unsigned int decoded_options_count,
3704 struct cl_decoded_option *decoded_options)
d7a9644e 3705{
e40d43cc 3706 const char *temp;
3707 char *temp1;
ce0fdb91 3708 char *tooldir_prefix, *tooldir_prefix2;
d05a1771 3709 char *(*get_relative_prefix) (const char *, const char *,
3710 const char *) = NULL;
e28aa114 3711 struct cl_option_handlers handlers;
e62df35b 3712 unsigned int j;
d7a9644e 3713
967958e4 3714 gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
bfef3e2f 3715
d7a9644e 3716 n_switches = 0;
3717 n_infiles = 0;
9e56255a 3718 added_libraries = 0;
0d3f9dba 3719
4dd56bd9 3720 /* Figure compiler version from version string. */
3721
2c815aff 3722 compiler_version = temp1 = xstrdup (version_string);
713829e9 3723
e40d43cc 3724 for (; *temp1; ++temp1)
4dd56bd9 3725 {
e40d43cc 3726 if (*temp1 == ' ')
4dd56bd9 3727 {
e40d43cc 3728 *temp1 = '\0';
4dd56bd9 3729 break;
3730 }
3731 }
d7a9644e 3732
d05a1771 3733 /* Handle any -no-canonical-prefixes flag early, to assign the function
3734 that builds relative prefixes. This function creates default search
3735 paths that are needed later in normal option handling. */
3736
5789e05b 3737 for (j = 1; j < decoded_options_count; j++)
d05a1771 3738 {
5789e05b 3739 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
d05a1771 3740 {
3741 get_relative_prefix = make_relative_prefix_ignore_links;
3742 break;
3743 }
3744 }
3745 if (! get_relative_prefix)
3746 get_relative_prefix = make_relative_prefix;
3747
b155ba2f 3748 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
e62df35b 3749 see if we can create it from the pathname specified in
3750 decoded_options[0].arg. */
b155ba2f 3751
9db45a87 3752 gcc_libexec_prefix = standard_libexec_prefix;
b155ba2f 3753#ifndef VMS
3754 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3755 if (!gcc_exec_prefix)
3756 {
e62df35b 3757 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
d05a1771 3758 standard_bindir_prefix,
3759 standard_exec_prefix);
e62df35b 3760 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
d05a1771 3761 standard_bindir_prefix,
3762 standard_libexec_prefix);
b155ba2f 3763 if (gcc_exec_prefix)
99c00302 3764 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
b155ba2f 3765 }
9db45a87 3766 else
01b26439 3767 {
3768 /* make_relative_prefix requires a program name, but
3769 GCC_EXEC_PREFIX is typically a directory name with a trailing
3770 / (which is ignored by make_relative_prefix), so append a
3771 program name. */
3772 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
d05a1771 3773 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3774 standard_exec_prefix,
3775 standard_libexec_prefix);
c4328bcc 3776
3777 /* The path is unrelocated, so fallback to the original setting. */
3778 if (!gcc_libexec_prefix)
3779 gcc_libexec_prefix = standard_libexec_prefix;
3780
01b26439 3781 free (tmp_prefix);
3782 }
9db45a87 3783#else
b155ba2f 3784#endif
c4328bcc 3785 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3786 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
e62df35b 3787 or an automatically created GCC_EXEC_PREFIX from
3788 decoded_options[0].arg. */
d7a9644e 3789
15b28e16 3790 /* Do language-specific adjustment/addition of flags. */
cb22f930 3791 lang_specific_driver (&decoded_options, &decoded_options_count,
15b28e16 3792 &added_libraries);
3793
bfef3e2f 3794 if (gcc_exec_prefix)
d7a9644e 3795 {
055237ef 3796 int len = strlen (gcc_exec_prefix);
7d3bd8c0 3797
9db45a87 3798 if (len > (int) sizeof ("/lib/gcc/") - 1
79b23a1e 3799 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
055237ef 3800 {
9db45a87 3801 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
79b23a1e 3802 if (IS_DIR_SEPARATOR (*temp)
82715bcd 3803 && filename_ncmp (temp + 1, "lib", 3) == 0
79b23a1e 3804 && IS_DIR_SEPARATOR (temp[4])
82715bcd 3805 && filename_ncmp (temp + 5, "gcc", 3) == 0)
9db45a87 3806 len -= sizeof ("/lib/gcc/") - 1;
055237ef 3807 }
3808
3809 set_std_prefix (gcc_exec_prefix, len);
9db45a87 3810 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
2af84186 3811 PREFIX_PRIORITY_LAST, 0, 0);
acd84059 3812 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
2af84186 3813 PREFIX_PRIORITY_LAST, 0, 0);
d7a9644e 3814 }
3815
3816 /* COMPILER_PATH and LIBRARY_PATH have values
3817 that are lists of directory names with colons. */
3818
967958e4 3819 temp = getenv ("COMPILER_PATH");
d7a9644e 3820 if (temp)
3821 {
e40d43cc 3822 const char *startp, *endp;
25a1c410 3823 char *nstore = (char *) alloca (strlen (temp) + 3);
d7a9644e 3824
3825 startp = endp = temp;
3826 while (1)
3827 {
99b832c9 3828 if (*endp == PATH_SEPARATOR || *endp == 0)
d7a9644e 3829 {
026f2c7a 3830 strncpy (nstore, startp, endp - startp);
d7a9644e 3831 if (endp == startp)
4e2023c8 3832 strcpy (nstore, concat (".", dir_separator_str, NULL));
79b23a1e 3833 else if (!IS_DIR_SEPARATOR (endp[-1]))
d7a9644e 3834 {
026f2c7a 3835 nstore[endp - startp] = DIR_SEPARATOR;
3836 nstore[endp - startp + 1] = 0;
d7a9644e 3837 }
3838 else
026f2c7a 3839 nstore[endp - startp] = 0;
acd84059 3840 add_prefix (&exec_prefixes, nstore, 0,
2af84186 3841 PREFIX_PRIORITY_LAST, 0, 0);
42bbc7e6 3842 add_prefix (&include_prefixes, nstore, 0,
2af84186 3843 PREFIX_PRIORITY_LAST, 0, 0);
d7a9644e 3844 if (*endp == 0)
3845 break;
3846 endp = startp = endp + 1;
3847 }
3848 else
3849 endp++;
3850 }
3851 }
3852
967958e4 3853 temp = getenv (LIBRARY_PATH_ENV);
c6456dcd 3854 if (temp && *cross_compile == '0')
d7a9644e 3855 {
e40d43cc 3856 const char *startp, *endp;
25a1c410 3857 char *nstore = (char *) alloca (strlen (temp) + 3);
d7a9644e 3858
3859 startp = endp = temp;
3860 while (1)
3861 {
99b832c9 3862 if (*endp == PATH_SEPARATOR || *endp == 0)
d7a9644e 3863 {
026f2c7a 3864 strncpy (nstore, startp, endp - startp);
d7a9644e 3865 if (endp == startp)
4e2023c8 3866 strcpy (nstore, concat (".", dir_separator_str, NULL));
79b23a1e 3867 else if (!IS_DIR_SEPARATOR (endp[-1]))
d7a9644e 3868 {
026f2c7a 3869 nstore[endp - startp] = DIR_SEPARATOR;
3870 nstore[endp - startp + 1] = 0;
d7a9644e 3871 }
3872 else
026f2c7a 3873 nstore[endp - startp] = 0;
d946ea19 3874 add_prefix (&startfile_prefixes, nstore, NULL,
2af84186 3875 PREFIX_PRIORITY_LAST, 0, 1);
d7a9644e 3876 if (*endp == 0)
3877 break;
3878 endp = startp = endp + 1;
3879 }
3880 else
3881 endp++;
3882 }
3883 }
3884
3885 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
967958e4 3886 temp = getenv ("LPATH");
c6456dcd 3887 if (temp && *cross_compile == '0')
d7a9644e 3888 {
e40d43cc 3889 const char *startp, *endp;
25a1c410 3890 char *nstore = (char *) alloca (strlen (temp) + 3);
d7a9644e 3891
3892 startp = endp = temp;
3893 while (1)
3894 {
99b832c9 3895 if (*endp == PATH_SEPARATOR || *endp == 0)
d7a9644e 3896 {
026f2c7a 3897 strncpy (nstore, startp, endp - startp);
d7a9644e 3898 if (endp == startp)
4e2023c8 3899 strcpy (nstore, concat (".", dir_separator_str, NULL));
79b23a1e 3900 else if (!IS_DIR_SEPARATOR (endp[-1]))
d7a9644e 3901 {
026f2c7a 3902 nstore[endp - startp] = DIR_SEPARATOR;
3903 nstore[endp - startp + 1] = 0;
d7a9644e 3904 }
3905 else
026f2c7a 3906 nstore[endp - startp] = 0;
d946ea19 3907 add_prefix (&startfile_prefixes, nstore, NULL,
2af84186 3908 PREFIX_PRIORITY_LAST, 0, 1);
d7a9644e 3909 if (*endp == 0)
3910 break;
3911 endp = startp = endp + 1;
3912 }
3913 else
3914 endp++;
3915 }
3916 }
3917
bd338b2c 3918 /* Process the options and store input files and switches in their
3919 vectors. */
3920
3921 last_language_n_infiles = -1;
d7a9644e 3922
4ff887c5 3923 set_option_handlers (&handlers);
0bfd146e 3924
e28aa114 3925 for (j = 1; j < decoded_options_count; j++)
3926 {
3927 switch (decoded_options[j].opt_index)
74e4079a 3928 {
e28aa114 3929 case OPT_S:
3930 case OPT_c:
3931 case OPT_E:
3932 have_c = 1;
3933 break;
74e4079a 3934 }
e28aa114 3935 if (have_c)
3936 break;
3937 }
d7a9644e 3938
e28aa114 3939 for (j = 1; j < decoded_options_count; j++)
3940 {
3941 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
e71cc307 3942 {
e28aa114 3943 const char *arg = decoded_options[j].arg;
3944 const char *p = strrchr (arg, '@');
bd338b2c 3945 char *fname;
3946 long offset;
3947 int consumed;
3948#ifdef HAVE_TARGET_OBJECT_SUFFIX
e28aa114 3949 arg = convert_filename (arg, 0, access (arg, F_OK));
bd338b2c 3950#endif
3951 /* For LTO static archive support we handle input file
3952 specifications that are composed of a filename and
3953 an offset like FNAME@OFFSET. */
3954 if (p
e28aa114 3955 && p != arg
bd338b2c 3956 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
3957 && strlen (p) == (unsigned int)consumed)
3958 {
e28aa114 3959 fname = (char *)xmalloc (p - arg + 1);
3960 memcpy (fname, arg, p - arg);
3961 fname[p - arg] = '\0';
bd338b2c 3962 /* Only accept non-stdin and existing FNAME parts, otherwise
3963 try with the full name. */
3964 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
3965 {
3966 free (fname);
e28aa114 3967 fname = xstrdup (arg);
bd338b2c 3968 }
3969 }
3970 else
e28aa114 3971 fname = xstrdup (arg);
556cfe53 3972
bd338b2c 3973 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
3974 perror_with_name (fname);
3975 else
e28aa114 3976 add_infile (arg, spec_lang);
bd338b2c 3977
3978 free (fname);
e28aa114 3979 continue;
e71cc307 3980 }
e28aa114 3981
f83b64ca 3982 read_cmdline_option (&global_options, &global_options_set,
3c6c0e40 3983 decoded_options + j, UNKNOWN_LOCATION,
3984 CL_DRIVER, &handlers, global_dc);
d7a9644e 3985 }
3986
cc92bc82 3987 /* If -save-temps=obj and -o name, create the prefix to use for %b.
3988 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
3989 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
3990 {
3991 save_temps_length = strlen (save_temps_prefix);
3992 temp = strrchr (lbasename (save_temps_prefix), '.');
3993 if (temp)
3994 {
3995 save_temps_length -= strlen (temp);
3996 save_temps_prefix[save_temps_length] = '\0';
3997 }
3998
3999 }
4000 else if (save_temps_prefix != NULL)
4001 {
4002 free (save_temps_prefix);
4003 save_temps_prefix = NULL;
4004 }
4005
288e5bba 4006 if (save_temps_flag && use_pipes)
805e22b2 4007 {
4008 /* -save-temps overrides -pipe, so that temp files are produced */
4009 if (save_temps_flag)
a922df2e 4010 warning (0, "-pipe ignored because -save-temps specified");
805e22b2 4011 use_pipes = 0;
4012 }
952f0048 4013
71278019 4014 if (!compare_debug)
4015 {
4016 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
4017
4018 if (gcd && gcd[0] == '-')
4019 {
4020 compare_debug = 2;
4021 compare_debug_opt = gcd;
71278019 4022 }
4023 else if (gcd && *gcd && strcmp (gcd, "0"))
4024 {
4025 compare_debug = 3;
4026 compare_debug_opt = "-gtoggle";
71278019 4027 }
4028 }
4029 else if (compare_debug < 0)
4030 {
4031 compare_debug = 0;
4032 gcc_assert (!compare_debug_opt);
4033 }
4034
c4328bcc 4035 /* Set up the search paths. We add directories that we expect to
4036 contain GNU Toolchain components before directories specified by
4037 the machine description so that we will find GNU components (like
48e1416a 4038 the GNU assembler) before those of the host system. */
d7a9644e 4039
c4328bcc 4040 /* If we don't know where the toolchain has been installed, use the
4041 configured-in locations. */
4042 if (!gcc_exec_prefix)
4043 {
b9374a77 4044#ifndef OS2
c4328bcc 4045 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4046 PREFIX_PRIORITY_LAST, 1, 0);
4047 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4048 PREFIX_PRIORITY_LAST, 2, 0);
4049 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4050 PREFIX_PRIORITY_LAST, 2, 0);
b9374a77 4051#endif
c4328bcc 4052 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4053 PREFIX_PRIORITY_LAST, 1, 0);
4054 }
d7a9644e 4055
c4328bcc 4056 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
ce0fdb91 4057 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
4058 dir_separator_str, NULL);
6c6aff9e 4059
c4328bcc 4060 /* Look for tools relative to the location from which the driver is
4061 running, or, if that is not available, the configured prefix. */
4062 tooldir_prefix
4063 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4064 spec_machine, dir_separator_str,
ce0fdb91 4065 spec_version, dir_separator_str, tooldir_prefix2, NULL);
4066 free (tooldir_prefix2);
6c6aff9e 4067
2c815aff 4068 add_prefix (&exec_prefixes,
4e2023c8 4069 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
2af84186 4070 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
b9374a77 4071 add_prefix (&startfile_prefixes,
4e2023c8 4072 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
2af84186 4073 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
ce0fdb91 4074 free (tooldir_prefix);
06e67e16 4075
17acc97a 4076#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4077 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4078 then consider it to relocate with the rest of the GCC installation
4079 if GCC_EXEC_PREFIX is set.
4080 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
bd338b2c 4081 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
805e22b2 4082 {
e62df35b 4083 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
d05a1771 4084 standard_bindir_prefix,
4085 target_system_root);
805e22b2 4086 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
17acc97a 4087 {
4088 target_system_root = tmp_prefix;
4089 target_system_root_changed = 1;
4090 }
805e22b2 4091 }
17acc97a 4092#endif
805e22b2 4093
a45072dd 4094 /* More prefixes are enabled in main, after we read the specs file
4095 and determine whether this is cross-compilation or not. */
d7a9644e 4096
b0e7b414 4097 if (n_infiles == last_language_n_infiles && spec_lang != 0)
a8c464ac 4098 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
d7a9644e 4099
c5f21b95 4100 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
4101 environment variable. */
71278019 4102 if (compare_debug == 2 || compare_debug == 3)
4103 {
c5f21b95 4104 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL);
4105 save_switch (opt, 0, NULL, false, true);
71278019 4106 compare_debug = 1;
4107 }
4108
258d3911 4109 /* Ensure we only invoke each subprocess once. */
39932bd2 4110 if (print_subprocess_help || print_help_list || print_version)
258d3911 4111 {
bd338b2c 4112 n_infiles = 0;
258d3911 4113
87c75316 4114 /* Create a dummy input file, so that we can pass
4115 the help option on to the various sub-processes. */
bd338b2c 4116 add_infile ("help-dummy", "c");
258d3911 4117 }
4118
bd338b2c 4119 alloc_switch ();
d7a9644e 4120 switches[n_switches].part1 = 0;
bd338b2c 4121 alloc_infile ();
d7a9644e 4122 infiles[n_infiles].name = 0;
4123}
32d661fc 4124
805e22b2 4125/* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
32d661fc 4126 and place that in the environment. */
4127
4128static void
952f0048 4129set_collect_gcc_options (void)
32d661fc 4130{
4131 int i;
4132 int first_time;
4133
4134 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4135 the compiler. */
4136 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4137 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4138
4139 first_time = TRUE;
4140 for (i = 0; (int) i < n_switches; i++)
4141 {
4142 const char *const *args;
4143 const char *p, *q;
4144 if (!first_time)
4145 obstack_grow (&collect_obstack, " ", 1);
4146
4147 first_time = FALSE;
4148
4149 /* Ignore elided switches. */
5c1421d7 4150 if ((switches[i].live_cond
4151 & (SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC))
4152 == SWITCH_IGNORE)
32d661fc 4153 continue;
4154
4155 obstack_grow (&collect_obstack, "'-", 2);
4156 q = switches[i].part1;
4157 while ((p = strchr (q, '\'')))
4158 {
4159 obstack_grow (&collect_obstack, q, p - q);
4160 obstack_grow (&collect_obstack, "'\\''", 4);
4161 q = ++p;
4162 }
4163 obstack_grow (&collect_obstack, q, strlen (q));
4164 obstack_grow (&collect_obstack, "'", 1);
4165
4166 for (args = switches[i].args; args && *args; args++)
4167 {
4168 obstack_grow (&collect_obstack, " '", 2);
4169 q = *args;
4170 while ((p = strchr (q, '\'')))
4171 {
4172 obstack_grow (&collect_obstack, q, p - q);
4173 obstack_grow (&collect_obstack, "'\\''", 4);
4174 q = ++p;
4175 }
4176 obstack_grow (&collect_obstack, q, strlen (q));
4177 obstack_grow (&collect_obstack, "'", 1);
4178 }
4179 }
4180 obstack_grow (&collect_obstack, "\0", 1);
99c00302 4181 xputenv (XOBFINISH (&collect_obstack, char *));
32d661fc 4182}
d7a9644e 4183\f
4184/* Process a spec string, accumulating and running commands. */
4185
4186/* These variables describe the input file name.
4187 input_file_number is the index on outfiles of this file,
4188 so that the output file name can be stored for later use by %o.
4189 input_basename is the start of the part of the input file
4190 sans all directory names, and basename_length is the number
4191 of characters starting there excluding the suffix .c or whatever. */
4192
460b8bb3 4193static const char *gcc_input_filename;
d7a9644e 4194static int input_file_number;
f9b7c0b9 4195size_t input_filename_length;
d7a9644e 4196static int basename_length;
1cf79a1a 4197static int suffixed_basename_length;
e40d43cc 4198static const char *input_basename;
4199static const char *input_suffix;
030ec15c 4200#ifndef HOST_LACKS_INODE_NUMBERS
74e4079a 4201static struct stat input_stat;
030ec15c 4202#endif
74e4079a 4203static int input_stat_set;
d7a9644e 4204
96842e40 4205/* The compiler used to process the current input file. */
4206static struct compiler *input_file_compiler;
4207
d7a9644e 4208/* These are variables used within do_spec and do_spec_1. */
4209
4210/* Nonzero if an arg has been started and not yet terminated
4211 (with space, tab or newline). */
4212static int arg_going;
4213
4214/* Nonzero means %d or %g has been seen; the next arg to be terminated
4215 is a temporary file name. */
4216static int delete_this_arg;
4217
4218/* Nonzero means %w has been seen; the next arg to be terminated
4219 is the output file name of this compilation. */
4220static int this_is_output_file;
4221
4222/* Nonzero means %s has been seen; the next arg to be terminated
4223 is the name of a library file and we should try the standard
4224 search dirs for it. */
4225static int this_is_library_file;
4226
d7ee9e9b 4227/* Nonzero means %T has been seen; the next arg to be terminated
4228 is the name of a linker script and we should try all of the
4229 standard search dirs for it. If it is found insert a --script
4230 command line switch and then substitute the full path in place,
4231 otherwise generate an error message. */
4232static int this_is_linker_script;
4233
f90016ef 4234/* Nonzero means that the input of this command is coming from a pipe. */
4235static int input_from_pipe;
4236
bdbd5352 4237/* Nonnull means substitute this for any suffix when outputting a switches
aa40f561 4238 arguments. */
bdbd5352 4239static const char *suffix_subst;
4240
558cc3be 4241/* If there is an argument being accumulated, terminate it and store it. */
4242
4243static void
4244end_going_arg (void)
4245{
4246 if (arg_going)
4247 {
4248 const char *string;
4249
4250 obstack_1grow (&obstack, 0);
4251 string = XOBFINISH (&obstack, const char *);
4252 if (this_is_library_file)
4253 string = find_file (string);
d7ee9e9b 4254 if (this_is_linker_script)
4255 {
4256 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4257
4258 if (full_script_path == NULL)
4259 {
a8c464ac 4260 error ("unable to locate default linker script %qs in the library search paths", string);
d7ee9e9b 4261 /* Script was not found on search path. */
4262 return;
4263 }
4264 store_arg ("--script", false, false);
4265 string = full_script_path;
4266 }
558cc3be 4267 store_arg (string, delete_this_arg, this_is_output_file);
4268 if (this_is_output_file)
4269 outfiles[input_file_number] = string;
4270 arg_going = 0;
4271 }
4272}
4273
0bfd146e 4274
4275/* Parse the WRAPPER string which is a comma separated list of the command line
4276 and insert them into the beginning of argbuf. */
4277
4278static void
4279insert_wrapper (const char *wrapper)
4280{
4281 int n = 0;
4282 int i;
4283 char *buf = xstrdup (wrapper);
4284 char *p = buf;
f1f41a6c 4285 unsigned int old_length = argbuf.length ();
0bfd146e 4286
4287 do
4288 {
4289 n++;
4290 while (*p == ',')
4291 p++;
4292 }
4293 while ((p = strchr (p, ',')) != NULL);
4294
f1f41a6c 4295 argbuf.safe_grow (old_length + n);
4296 memmove (argbuf.address () + n,
4297 argbuf.address (),
9d9edc85 4298 old_length * sizeof (const_char_p));
0bfd146e 4299
4300 i = 0;
4301 p = buf;
4302 do
4303 {
4304 while (*p == ',')
4305 {
4306 *p = 0;
4307 p++;
4308 }
f1f41a6c 4309 argbuf[i] = p;
9d9edc85 4310 i++;
0bfd146e 4311 }
4312 while ((p = strchr (p, ',')) != NULL);
4313 gcc_assert (i == n);
0bfd146e 4314}
4315
d7a9644e 4316/* Process the spec SPEC and run the commands specified therein.
4317 Returns 0 if the spec is successfully processed; -1 if failed. */
4318
f9b7c0b9 4319int
952f0048 4320do_spec (const char *spec)
d7a9644e 4321{
4322 int value;
4323
4ae4e5e8 4324 value = do_spec_2 (spec);
d7a9644e 4325
4326 /* Force out any unfinished command.
4327 If -pipe, this forces out the last command if it ended in `|'. */
4328 if (value == 0)
4329 {
f1f41a6c 4330 if (argbuf.length () > 0
4331 && !strcmp (argbuf.last (), "|"))
4332 argbuf.pop ();
d7a9644e 4333
32d661fc 4334 set_collect_gcc_options ();
4335
f1f41a6c 4336 if (argbuf.length () > 0)
d7a9644e 4337 value = execute ();
4338 }
4339
4340 return value;
4341}
4342
4ae4e5e8 4343static int
952f0048 4344do_spec_2 (const char *spec)
4ae4e5e8 4345{
5842765d 4346 int result;
4347
4ae4e5e8 4348 clear_args ();
4349 arg_going = 0;
4350 delete_this_arg = 0;
4351 this_is_output_file = 0;
4352 this_is_library_file = 0;
d7ee9e9b 4353 this_is_linker_script = 0;
4ae4e5e8 4354 input_from_pipe = 0;
4355 suffix_subst = NULL;
4356
5842765d 4357 result = do_spec_1 (spec, 0, NULL);
4358
558cc3be 4359 end_going_arg ();
5842765d 4360
4361 return result;
4ae4e5e8 4362}
4363
73023f49 4364
7dd97ab6 4365/* Process the given spec string and add any new options to the end
4366 of the switches/n_switches array. */
4367
4368static void
952f0048 4369do_option_spec (const char *name, const char *spec)
7dd97ab6 4370{
4371 unsigned int i, value_count, value_len;
4372 const char *p, *q, *value;
4373 char *tmp_spec, *tmp_spec_p;
4374
4375 if (configure_default_options[0].name == NULL)
4376 return;
4377
4378 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4379 if (strcmp (configure_default_options[i].name, name) == 0)
4380 break;
4381 if (i == ARRAY_SIZE (configure_default_options))
4382 return;
4383
4384 value = configure_default_options[i].value;
4385 value_len = strlen (value);
4386
4387 /* Compute the size of the final spec. */
4388 value_count = 0;
4389 p = spec;
4390 while ((p = strstr (p, "%(VALUE)")) != NULL)
4391 {
4392 p ++;
4393 value_count ++;
4394 }
4395
4396 /* Replace each %(VALUE) by the specified value. */
25a1c410 4397 tmp_spec = (char *) alloca (strlen (spec) + 1
7dd97ab6 4398 + value_count * (value_len - strlen ("%(VALUE)")));
4399 tmp_spec_p = tmp_spec;
4400 q = spec;
4401 while ((p = strstr (q, "%(VALUE)")) != NULL)
4402 {
4403 memcpy (tmp_spec_p, q, p - q);
4404 tmp_spec_p = tmp_spec_p + (p - q);
4405 memcpy (tmp_spec_p, value, value_len);
4406 tmp_spec_p += value_len;
4407 q = p + strlen ("%(VALUE)");
4408 }
4409 strcpy (tmp_spec_p, q);
4410
4411 do_self_spec (tmp_spec);
4412}
4413
73023f49 4414/* Process the given spec string and add any new options to the end
4415 of the switches/n_switches array. */
4416
4417static void
952f0048 4418do_self_spec (const char *spec)
73023f49 4419{
87a6a1b5 4420 int i;
4421
73023f49 4422 do_spec_2 (spec);
4423 do_spec_1 (" ", 0, NULL);
4424
87a6a1b5 4425 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4426 do_self_specs adds the replacements to switches array, so it shouldn't
4427 be processed afterwards. */
4428 for (i = 0; i < n_switches; i++)
4429 if ((switches[i].live_cond & SWITCH_IGNORE))
4430 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4431
f1f41a6c 4432 if (argbuf.length () > 0)
73023f49 4433 {
4ff887c5 4434 const char **argbuf_copy;
4435 struct cl_decoded_option *decoded_options;
4436 struct cl_option_handlers handlers;
4437 unsigned int decoded_options_count;
4438 unsigned int j;
73023f49 4439
4ff887c5 4440 /* Create a copy of argbuf with a dummy argv[0] entry for
4441 decode_cmdline_options_to_array. */
9d9edc85 4442 argbuf_copy = XNEWVEC (const char *,
f1f41a6c 4443 argbuf.length () + 1);
4ff887c5 4444 argbuf_copy[0] = "";
f1f41a6c 4445 memcpy (argbuf_copy + 1, argbuf.address (),
4446 argbuf.length () * sizeof (const char *));
73023f49 4447
f1f41a6c 4448 decode_cmdline_options_to_array (argbuf.length () + 1,
9d9edc85 4449 argbuf_copy,
4ff887c5 4450 CL_DRIVER, &decoded_options,
4451 &decoded_options_count);
ce0fdb91 4452 free (argbuf_copy);
71278019 4453
4ff887c5 4454 set_option_handlers (&handlers);
71278019 4455
4ff887c5 4456 for (j = 1; j < decoded_options_count; j++)
4457 {
4458 switch (decoded_options[j].opt_index)
71278019 4459 {
4ff887c5 4460 case OPT_SPECIAL_input_file:
4461 /* Specs should only generate options, not input
4462 files. */
4463 if (strcmp (decoded_options[j].arg, "-") != 0)
4464 fatal_error ("switch %qs does not start with %<-%>",
4465 decoded_options[j].arg);
4466 else
4467 fatal_error ("spec-generated switch is just %<-%>");
4468 break;
71278019 4469
4ff887c5 4470 case OPT_fcompare_debug_second:
4471 case OPT_fcompare_debug:
4472 case OPT_fcompare_debug_:
4473 case OPT_o:
4474 /* Avoid duplicate processing of some options from
4475 compare-debug specs; just save them here. */
4476 save_switch (decoded_options[j].canonical_option[0],
4477 (decoded_options[j].canonical_option_num_elements
4478 - 1),
556cfe53 4479 &decoded_options[j].canonical_option[1], false, true);
4ff887c5 4480 break;
4481
4482 default:
4483 read_cmdline_option (&global_options, &global_options_set,
3c6c0e40 4484 decoded_options + j, UNKNOWN_LOCATION,
4485 CL_DRIVER, &handlers, global_dc);
4ff887c5 4486 break;
71278019 4487 }
73023f49 4488 }
71278019 4489
4ff887c5 4490 alloc_switch ();
71278019 4491 switches[n_switches].part1 = 0;
73023f49 4492 }
4493}
4494
067277c3 4495/* Callback for processing %D and %I specs. */
4496
4497struct spec_path_info {
4498 const char *option;
4499 const char *append;
4500 size_t append_len;
4501 bool omit_relative;
4502 bool separate_options;
4503};
4504
4505static void *
4506spec_path (char *path, void *data)
42bbc7e6 4507{
25a1c410 4508 struct spec_path_info *info = (struct spec_path_info *) data;
067277c3 4509 size_t len = 0;
4510 char save = 0;
42bbc7e6 4511
067277c3 4512 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4513 return NULL;
4514
4515 if (info->append_len != 0)
42bbc7e6 4516 {
067277c3 4517 len = strlen (path);
4518 memcpy (path + len, info->append, info->append_len + 1);
42bbc7e6 4519 }
4520
067277c3 4521 if (!is_directory (path, true))
4522 return NULL;
42bbc7e6 4523
067277c3 4524 do_spec_1 (info->option, 1, NULL);
4525 if (info->separate_options)
4526 do_spec_1 (" ", 0, NULL);
4527
4528 if (info->append_len == 0)
42bbc7e6 4529 {
067277c3 4530 len = strlen (path);
4531 save = path[len - 1];
4532 if (IS_DIR_SEPARATOR (path[len - 1]))
4533 path[len - 1] = '\0';
42bbc7e6 4534 }
067277c3 4535
4536 do_spec_1 (path, 1, NULL);
4537 do_spec_1 (" ", 0, NULL);
4538
4539 /* Must not damage the original path. */
4540 if (info->append_len == 0)
4541 path[len - 1] = save;
4542
4543 return NULL;
42bbc7e6 4544}
4545
46782931 4546/* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4547 argument list. */
4548
4549static void
4550create_at_file (char **argv)
4551{
4552 char *temp_file = make_temp_file ("");
4553 char *at_argument = concat ("@", temp_file, NULL);
4554 FILE *f = fopen (temp_file, "w");
4555 int status;
4556
4557 if (f == NULL)
a922df2e 4558 fatal_error ("could not open temporary response file %s",
4559 temp_file);
46782931 4560
4561 status = writeargv (argv, f);
4562
4563 if (status)
a922df2e 4564 fatal_error ("could not write to temporary response file %s",
4565 temp_file);
46782931 4566
4567 status = fclose (f);
4568
4569 if (EOF == status)
a922df2e 4570 fatal_error ("could not close temporary response file %s",
4571 temp_file);
46782931 4572
4573 store_arg (at_argument, 0, 0);
4574
4575 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
4576}
4577
4578/* True if we should compile INFILE. */
4579
4580static bool
4581compile_input_file_p (struct infile *infile)
4582{
4583 if ((!infile->language) || (infile->language[0] != '*'))
4584 if (infile->incompiler == input_file_compiler)
4585 return true;
4586 return false;
4587}
4588
74c33122 4589/* Process each member of VEC as a spec. */
4590
4591static void
f1f41a6c 4592do_specs_vec (vec<char_p> vec)
74c33122 4593{
4594 unsigned ix;
4595 char *opt;
4596
f1f41a6c 4597 FOR_EACH_VEC_ELT (vec, ix, opt)
74c33122 4598 {
4599 do_spec_1 (opt, 1, NULL);
4600 /* Make each accumulated option a separate argument. */
4601 do_spec_1 (" ", 0, NULL);
4602 }
4603}
4604
d7a9644e 4605/* Process the sub-spec SPEC as a portion of a larger spec.
4606 This is like processing a whole spec except that we do
4607 not initialize at the beginning and we do not supply a
4608 newline by default at the end.
4609 INSWITCH nonzero means don't process %-sequences in SPEC;
4610 in this case, % is treated as an ordinary character.
4611 This is used while substituting switches.
4612 INSWITCH nonzero also causes SPC not to terminate an argument.
4613
4614 Value is zero unless a line was finished
4615 and the command on that line reported an error. */
4616
4617static int
952f0048 4618do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
d7a9644e 4619{
19cb6b50 4620 const char *p = spec;
4621 int c;
d7a9644e 4622 int i;
fd8c18f0 4623 int value;
d7a9644e 4624
fde5bd5c 4625 /* If it's an empty string argument to a switch, keep it as is. */
4626 if (inswitch && !*p)
4627 arg_going = 1;
4628
00e598e3 4629 while ((c = *p++))
d7a9644e 4630 /* If substituting a switch, treat all chars like letters.
4631 Otherwise, NL, SPC, TAB and % are special. */
4632 switch (inswitch ? 'a' : c)
4633 {
4634 case '\n':
558cc3be 4635 end_going_arg ();
d7a9644e 4636
f1f41a6c 4637 if (argbuf.length () > 0
4638 && !strcmp (argbuf.last (), "|"))
d7a9644e 4639 {
d7a9644e 4640 /* A `|' before the newline means use a pipe here,
4641 but only if -pipe was specified.
4642 Otherwise, execute now and don't pass the `|' as an arg. */
805e22b2 4643 if (use_pipes)
d7a9644e 4644 {
f90016ef 4645 input_from_pipe = 1;
d7a9644e 4646 break;
4647 }
4648 else
f1f41a6c 4649 argbuf.pop ();
d7a9644e 4650 }
4651
32d661fc 4652 set_collect_gcc_options ();
4653
f1f41a6c 4654 if (argbuf.length () > 0)
d7a9644e 4655 {
fd8c18f0 4656 value = execute ();
d7a9644e 4657 if (value)
4658 return value;
4659 }
4660 /* Reinitialize for a new command, and for a new argument. */
4661 clear_args ();
4662 arg_going = 0;
4663 delete_this_arg = 0;
4664 this_is_output_file = 0;
4665 this_is_library_file = 0;
d7ee9e9b 4666 this_is_linker_script = 0;
f90016ef 4667 input_from_pipe = 0;
d7a9644e 4668 break;
4669
4670 case '|':
558cc3be 4671 end_going_arg ();
d7a9644e 4672
4673 /* Use pipe */
4674 obstack_1grow (&obstack, c);
4675 arg_going = 1;
4676 break;
4677
4678 case '\t':
4679 case ' ':
558cc3be 4680 end_going_arg ();
4681
d7a9644e 4682 /* Reinitialize for a new argument. */
d7a9644e 4683 delete_this_arg = 0;
4684 this_is_output_file = 0;
4685 this_is_library_file = 0;
d7ee9e9b 4686 this_is_linker_script = 0;
d7a9644e 4687 break;
4688
4689 case '%':
4690 switch (c = *p++)
4691 {
4692 case 0:
a8c464ac 4693 fatal_error ("spec %qs invalid", spec);
d7a9644e 4694
4695 case 'b':
cc92bc82 4696 if (save_temps_length)
4697 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4698 else
4699 obstack_grow (&obstack, input_basename, basename_length);
71278019 4700 if (compare_debug < 0)
4701 obstack_grow (&obstack, ".gk", 3);
d7a9644e 4702 arg_going = 1;
4703 break;
4704
1cf79a1a 4705 case 'B':
cc92bc82 4706 if (save_temps_length)
4707 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4708 else
4709 obstack_grow (&obstack, input_basename, suffixed_basename_length);
71278019 4710 if (compare_debug < 0)
4711 obstack_grow (&obstack, ".gk", 3);
1cf79a1a 4712 arg_going = 1;
4713 break;
4714
d7a9644e 4715 case 'd':
4716 delete_this_arg = 2;
4717 break;
4718
4719 /* Dump out the directories specified with LIBRARY_PATH,
a45072dd 4720 followed by the absolute directories
4721 that we search for startfiles. */
d7a9644e 4722 case 'D':
466996dd 4723 {
067277c3 4724 struct spec_path_info info;
9942f943 4725
067277c3 4726 info.option = "-L";
4727 info.append_len = 0;
42bbc7e6 4728#ifdef RELATIVE_PREFIX_NOT_LINKDIR
067277c3 4729 /* Used on systems which record the specified -L dirs
4730 and use them to search for dynamic linking.
4731 Relative directories always come from -B,
4732 and it is better not to use them for searching
4733 at run time. In particular, stage1 loses. */
4734 info.omit_relative = true;
42bbc7e6 4735#else
067277c3 4736 info.omit_relative = false;
a45072dd 4737#endif
067277c3 4738 info.separate_options = false;
4739
4740 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
466996dd 4741 }
d7a9644e 4742 break;
4743
4744 case 'e':
be2828ce 4745 /* %efoo means report an error with `foo' as error message
d7a9644e 4746 and don't execute any more commands for this file. */
4747 {
e40d43cc 4748 const char *q = p;
d7a9644e 4749 char *buf;
026f2c7a 4750 while (*p != 0 && *p != '\n')
4751 p++;
25a1c410 4752 buf = (char *) alloca (p - q + 1);
d7a9644e 4753 strncpy (buf, q, p - q);
4754 buf[p - q] = 0;
5a3530cb 4755 error ("%s", _(buf));
d7a9644e 4756 return -1;
4757 }
4758 break;
90286764 4759 case 'n':
edc2a478 4760 /* %nfoo means report a notice with `foo' on stderr. */
90286764 4761 {
4762 const char *q = p;
4763 char *buf;
4764 while (*p != 0 && *p != '\n')
4765 p++;
25a1c410 4766 buf = (char *) alloca (p - q + 1);
90286764 4767 strncpy (buf, q, p - q);
4768 buf[p - q] = 0;
a922df2e 4769 inform (0, "%s", _(buf));
90286764 4770 if (*p)
4771 p++;
4772 }
4773 break;
d7a9644e 4774
026f2c7a 4775 case 'j':
4776 {
4777 struct stat st;
4778
805e22b2 4779 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4780 defined, and it is not a directory, and it is
4781 writable, use it. Otherwise, treat this like any
4782 other temporary file. */
026f2c7a 4783
4784 if ((!save_temps_flag)
4785 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4786 && (access (HOST_BIT_BUCKET, W_OK) == 0))
4787 {
4788 obstack_grow (&obstack, HOST_BIT_BUCKET,
4789 strlen (HOST_BIT_BUCKET));
4790 delete_this_arg = 0;
4791 arg_going = 1;
4792 break;
4793 }
4794 }
805e22b2 4795 goto create_temp_file;
4796 case '|':
4797 if (use_pipes)
4798 {
4799 obstack_1grow (&obstack, '-');
4800 delete_this_arg = 0;
4801 arg_going = 1;
4802
4803 /* consume suffix */
b78b6a05 4804 while (*p == '.' || ISALNUM ((unsigned char) *p))
805e22b2 4805 p++;
4806 if (p[0] == '%' && p[1] == 'O')
4807 p += 2;
952f0048 4808
805e22b2 4809 break;
4810 }
4811 goto create_temp_file;
4812 case 'm':
4813 if (use_pipes)
4814 {
4815 /* consume suffix */
b78b6a05 4816 while (*p == '.' || ISALNUM ((unsigned char) *p))
805e22b2 4817 p++;
4818 if (p[0] == '%' && p[1] == 'O')
4819 p += 2;
952f0048 4820
805e22b2 4821 break;
4822 }
4823 goto create_temp_file;
d7a9644e 4824 case 'g':
5ee0d826 4825 case 'u':
e70085f9 4826 case 'U':
805e22b2 4827 create_temp_file:
d7a9644e 4828 {
4576c73f 4829 struct temp_name *t;
c78c5ee7 4830 int suffix_length;
e40d43cc 4831 const char *suffix = p;
2c2aaf10 4832 char *saved_suffix = NULL;
c78c5ee7 4833
b78b6a05 4834 while (*p == '.' || ISALNUM ((unsigned char) *p))
2c2aaf10 4835 p++;
4836 suffix_length = p - suffix;
c78c5ee7 4837 if (p[0] == '%' && p[1] == 'O')
4838 {
97c9de01 4839 p += 2;
c78c5ee7 4840 /* We don't support extra suffix characters after %O. */
b78b6a05 4841 if (*p == '.' || ISALNUM ((unsigned char) *p))
a8c464ac 4842 fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
2c2aaf10 4843 if (suffix_length == 0)
10f57222 4844 suffix = TARGET_OBJECT_SUFFIX;
2c2aaf10 4845 else
4846 {
4847 saved_suffix
4c36ffe6 4848 = XNEWVEC (char, suffix_length
f0af5a88 4849 + strlen (TARGET_OBJECT_SUFFIX));
2c2aaf10 4850 strncpy (saved_suffix, suffix, suffix_length);
4851 strcpy (saved_suffix + suffix_length,
10f57222 4852 TARGET_OBJECT_SUFFIX);
2c2aaf10 4853 }
10f57222 4854 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
c78c5ee7 4855 }
3cfec666 4856
71278019 4857 if (compare_debug < 0)
4858 {
4859 suffix = concat (".gk", suffix, NULL);
4860 suffix_length += 3;
4861 }
4862
cc92bc82 4863 /* If -save-temps=obj and -o were specified, use that for the
4864 temp file. */
4865 if (save_temps_length)
4866 {
4867 char *tmp;
4868 temp_filename_length
4869 = save_temps_length + suffix_length + 1;
4870 tmp = (char *) alloca (temp_filename_length);
4871 memcpy (tmp, save_temps_prefix, save_temps_length);
4872 memcpy (tmp + save_temps_length, suffix, suffix_length);
4873 tmp[save_temps_length + suffix_length] = '\0';
ce0fdb91 4874 temp_filename = save_string (tmp, save_temps_length
4875 + suffix_length);
cc92bc82 4876 obstack_grow (&obstack, temp_filename,
4877 temp_filename_length);
4878 arg_going = 1;
4879 delete_this_arg = 0;
4880 break;
4881 }
4882
460b8bb3 4883 /* If the gcc_input_filename has the same suffix specified
74e4079a 4884 for the %g, %u, or %U, and -save-temps is specified,
4885 we could end up using that file as an intermediate
4886 thus clobbering the user's source file (.e.g.,
4887 gcc -save-temps foo.s would clobber foo.s with the
4888 output of cpp0). So check for this condition and
4889 generate a temp file as the intermediate. */
3cfec666 4890
74e4079a 4891 if (save_temps_flag)
4892 {
5d1b319b 4893 char *tmp;
cc92bc82 4894 temp_filename_length = basename_length + suffix_length + 1;
4895 tmp = (char *) alloca (temp_filename_length);
4896 memcpy (tmp, input_basename, basename_length);
4897 memcpy (tmp + basename_length, suffix, suffix_length);
4898 tmp[basename_length + suffix_length] = '\0';
5d1b319b 4899 temp_filename = tmp;
cc92bc82 4900
82715bcd 4901 if (filename_cmp (temp_filename, gcc_input_filename) != 0)
74e4079a 4902 {
030ec15c 4903#ifndef HOST_LACKS_INODE_NUMBERS
952f0048 4904 struct stat st_temp;
3cfec666 4905
952f0048 4906 /* Note, set_input() resets input_stat_set to 0. */
4907 if (input_stat_set == 0)
4908 {
460b8bb3 4909 input_stat_set = stat (gcc_input_filename,
4910 &input_stat);
952f0048 4911 if (input_stat_set >= 0)
4912 input_stat_set = 1;
4913 }
3cfec666 4914
460b8bb3 4915 /* If we have the stat for the gcc_input_filename
952f0048 4916 and we can do the stat for the temp_filename
4917 then the they could still refer to the same
4918 file if st_dev/st_ino's are the same. */
74e4079a 4919 if (input_stat_set != 1
4920 || stat (temp_filename, &st_temp) < 0
4921 || input_stat.st_dev != st_temp.st_dev
4922 || input_stat.st_ino != st_temp.st_ino)
030ec15c 4923#else
4924 /* Just compare canonical pathnames. */
460b8bb3 4925 char* input_realname = lrealpath (gcc_input_filename);
030ec15c 4926 char* temp_realname = lrealpath (temp_filename);
82715bcd 4927 bool files_differ = filename_cmp (input_realname, temp_realname);
030ec15c 4928 free (input_realname);
4929 free (temp_realname);
2f2c6aee 4930 if (files_differ)
030ec15c 4931#endif
3cfec666 4932 {
74e4079a 4933 temp_filename = save_string (temp_filename,
4934 temp_filename_length + 1);
4935 obstack_grow (&obstack, temp_filename,
952f0048 4936 temp_filename_length);
74e4079a 4937 arg_going = 1;
03b358c6 4938 delete_this_arg = 0;
74e4079a 4939 break;
4940 }
4941 }
4942 }
4576c73f 4943
4944 /* See if we already have an association of %g/%u/%U and
4945 suffix. */
4946 for (t = temp_names; t; t = t->next)
c78c5ee7 4947 if (t->length == suffix_length
4948 && strncmp (t->suffix, suffix, suffix_length) == 0
5f6af493 4949 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
4576c73f 4950 break;
4951
d362e897 4952 /* Make a new association if needed. %u and %j
4953 require one. */
655a58fa 4954 if (t == 0 || c == 'u' || c == 'j')
4576c73f 4955 {
4956 if (t == 0)
4957 {
25a1c410 4958 t = XNEW (struct temp_name);
4576c73f 4959 t->next = temp_names;
4960 temp_names = t;
4961 }
c78c5ee7 4962 t->length = suffix_length;
d362e897 4963 if (saved_suffix)
4964 {
4965 t->suffix = saved_suffix;
4966 saved_suffix = NULL;
4967 }
4968 else
4969 t->suffix = save_string (suffix, suffix_length);
5f6af493 4970 t->unique = (c == 'u' || c == 'U' || c == 'j');
c78c5ee7 4971 temp_filename = make_temp_file (t->suffix);
3441e5dd 4972 temp_filename_length = strlen (temp_filename);
4576c73f 4973 t->filename = temp_filename;
4974 t->filename_length = temp_filename_length;
4975 }
4976
dd045aee 4977 free (saved_suffix);
2c2aaf10 4978
4576c73f 4979 obstack_grow (&obstack, t->filename, t->filename_length);
e2a5805f 4980 delete_this_arg = 1;
d7a9644e 4981 }
4982 arg_going = 1;
4983 break;
4984
4985 case 'i':
40109983 4986 if (combine_inputs)
4987 {
46782931 4988 if (at_file_supplied)
4989 {
4990 /* We are going to expand `%i' to `@FILE', where FILE
4991 is a newly-created temporary filename. The filenames
4992 that would usually be expanded in place of %o will be
4993 written to the temporary file. */
4994 char **argv;
4995 int n_files = 0;
4996 int j;
4997
4998 for (i = 0; i < n_infiles; i++)
4999 if (compile_input_file_p (&infiles[i]))
5000 n_files++;
5001
5002 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5003
5004 /* Copy the strings over. */
5005 for (i = 0, j = 0; i < n_infiles; i++)
5006 if (compile_input_file_p (&infiles[i]))
5007 {
5008 argv[j] = CONST_CAST (char *, infiles[i].name);
5009 infiles[i].compiled = true;
5010 j++;
5011 }
5012 argv[j] = NULL;
5013
5014 create_at_file (argv);
5015 }
5016 else
5017 for (i = 0; (int) i < n_infiles; i++)
5018 if (compile_input_file_p (&infiles[i]))
dc1dd09b 5019 {
5020 store_arg (infiles[i].name, 0, 0);
5021 infiles[i].compiled = true;
5022 }
40109983 5023 }
5024 else
5025 {
460b8bb3 5026 obstack_grow (&obstack, gcc_input_filename,
5027 input_filename_length);
40109983 5028 arg_going = 1;
5029 }
d7a9644e 5030 break;
5031
bfef3e2f 5032 case 'I':
524c2193 5033 {
067277c3 5034 struct spec_path_info info;
524c2193 5035
72779020 5036 if (multilib_dir)
5037 {
5038 do_spec_1 ("-imultilib", 1, NULL);
5039 /* Make this a separate argument. */
5040 do_spec_1 (" ", 0, NULL);
5041 do_spec_1 (multilib_dir, 1, NULL);
5042 do_spec_1 (" ", 0, NULL);
5043 }
5044
77adc39e 5045 if (multiarch_dir)
5046 {
5047 do_spec_1 ("-imultiarch", 1, NULL);
5048 /* Make this a separate argument. */
5049 do_spec_1 (" ", 0, NULL);
5050 do_spec_1 (multiarch_dir, 1, NULL);
5051 do_spec_1 (" ", 0, NULL);
5052 }
5053
524c2193 5054 if (gcc_exec_prefix)
5055 {
d946ea19 5056 do_spec_1 ("-iprefix", 1, NULL);
524c2193 5057 /* Make this a separate argument. */
d946ea19 5058 do_spec_1 (" ", 0, NULL);
5059 do_spec_1 (gcc_exec_prefix, 1, NULL);
5060 do_spec_1 (" ", 0, NULL);
524c2193 5061 }
5062
4ea70922 5063 if (target_system_root_changed ||
5064 (target_system_root && target_sysroot_hdrs_suffix))
17acc97a 5065 {
5066 do_spec_1 ("-isysroot", 1, NULL);
5067 /* Make this a separate argument. */
5068 do_spec_1 (" ", 0, NULL);
5069 do_spec_1 (target_system_root, 1, NULL);
4ea70922 5070 if (target_sysroot_hdrs_suffix)
5071 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
17acc97a 5072 do_spec_1 (" ", 0, NULL);
5073 }
5074
067277c3 5075 info.option = "-isystem";
5076 info.append = "include";
5077 info.append_len = strlen (info.append);
5078 info.omit_relative = false;
5079 info.separate_options = true;
5080
5081 for_each_path (&include_prefixes, false, info.append_len,
5082 spec_path, &info);
d3036f42 5083
5084 info.append = "include-fixed";
6ea4242f 5085 if (*sysroot_hdrs_suffix_spec)
5086 info.append = concat (info.append, dir_separator_str,
5087 multilib_dir, NULL);
d3036f42 5088 info.append_len = strlen (info.append);
5089 for_each_path (&include_prefixes, false, info.append_len,
5090 spec_path, &info);
524c2193 5091 }
bfef3e2f 5092 break;
5093
d7a9644e 5094 case 'o':
2b191381 5095 {
5096 int max = n_infiles;
2b191381 5097 max += lang_specific_extra_outfiles;
cdf76fe2 5098
c159e0b7 5099 if (HAVE_GNU_LD && at_file_supplied)
5100 {
5101 /* We are going to expand `%o' to `@FILE', where FILE
5102 is a newly-created temporary filename. The filenames
5103 that would usually be expanded in place of %o will be
5104 written to the temporary file. */
5105
c159e0b7 5106 char **argv;
46782931 5107 int n_files, j;
c159e0b7 5108
5109 /* Convert OUTFILES into a form suitable for writeargv. */
5110
5111 /* Determine how many are non-NULL. */
5112 for (n_files = 0, i = 0; i < max; i++)
5113 n_files += outfiles[i] != NULL;
5114
25a1c410 5115 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
c159e0b7 5116
5117 /* Copy the strings over. */
5118 for (i = 0, j = 0; i < max; i++)
5119 if (outfiles[i])
5120 {
e47a6f81 5121 argv[j] = CONST_CAST (char *, outfiles[i]);
c159e0b7 5122 j++;
5123 }
5124 argv[j] = NULL;
5125
46782931 5126 create_at_file (argv);
c159e0b7 5127 }
5128 else
5129 for (i = 0; i < max; i++)
5130 if (outfiles[i])
5131 store_arg (outfiles[i], 0, 0);
2b191381 5132 break;
5133 }
d7a9644e 5134
499a0933 5135 case 'O':
10f57222 5136 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
499a0933 5137 arg_going = 1;
5138 break;
5139
d7a9644e 5140 case 's':
5141 this_is_library_file = 1;
5142 break;
5143
d7ee9e9b 5144 case 'T':
5145 this_is_linker_script = 1;
5146 break;
5147
573aba85 5148 case 'V':
5149 outfiles[input_file_number] = NULL;
5150 break;
5151
d7a9644e 5152 case 'w':
5153 this_is_output_file = 1;
5154 break;
5155
5156 case 'W':
5157 {
f1f41a6c 5158 unsigned int cur_index = argbuf.length ();
d7a9644e 5159 /* Handle the {...} following the %W. */
5160 if (*p != '{')
a8c464ac 5161 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
d7a9644e 5162 p = handle_braces (p + 1);
5163 if (p == 0)
5164 return -1;
558cc3be 5165 end_going_arg ();
d7a9644e 5166 /* If any args were output, mark the last one for deletion
5167 on failure. */
f1f41a6c 5168 if (argbuf.length () != cur_index)
5169 record_temp_file (argbuf.last (), 0, 1);
d7a9644e 5170 break;
5171 }
5172
5173 /* %x{OPTION} records OPTION for %X to output. */
5174 case 'x':
5175 {
e40d43cc 5176 const char *p1 = p;
d7a9644e 5177 char *string;
74c33122 5178 char *opt;
5179 unsigned ix;
d7a9644e 5180
5181 /* Skip past the option value and make a copy. */
5182 if (*p != '{')
a8c464ac 5183 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
d7a9644e 5184 while (*p++ != '}')
5185 ;
5186 string = save_string (p1 + 1, p - p1 - 2);
5187
5188 /* See if we already recorded this option. */
f1f41a6c 5189 FOR_EACH_VEC_ELT (linker_options, ix, opt)
74c33122 5190 if (! strcmp (string, opt))
d7a9644e 5191 {
5192 free (string);
5193 return 0;
5194 }
5195
5196 /* This option is new; add it. */
8ace789a 5197 add_linker_option (string, strlen (string));
ce0fdb91 5198 free (string);
d7a9644e 5199 }
5200 break;
5201
fcdc45aa 5202 /* Dump out the options accumulated previously using %x. */
d7a9644e 5203 case 'X':
74c33122 5204 do_specs_vec (linker_options);
d7a9644e 5205 break;
5206
69587571 5207 /* Dump out the options accumulated previously using -Wa,. */
5208 case 'Y':
74c33122 5209 do_specs_vec (assembler_options);
69587571 5210 break;
5211
391d9b6e 5212 /* Dump out the options accumulated previously using -Wp,. */
5213 case 'Z':
74c33122 5214 do_specs_vec (preprocessor_options);
391d9b6e 5215 break;
5216
d7a9644e 5217 /* Here are digits and numbers that just process
5218 a certain constant string as a spec. */
5219
5220 case '1':
d946ea19 5221 value = do_spec_1 (cc1_spec, 0, NULL);
fd8c18f0 5222 if (value != 0)
5223 return value;
d7a9644e 5224 break;
5225
5226 case '2':
d946ea19 5227 value = do_spec_1 (cc1plus_spec, 0, NULL);
fd8c18f0 5228 if (value != 0)
5229 return value;
d7a9644e 5230 break;
5231
5232 case 'a':
d946ea19 5233 value = do_spec_1 (asm_spec, 0, NULL);
fd8c18f0 5234 if (value != 0)
5235 return value;
d7a9644e 5236 break;
5237
5238 case 'A':
d946ea19 5239 value = do_spec_1 (asm_final_spec, 0, NULL);
fd8c18f0 5240 if (value != 0)
5241 return value;
d7a9644e 5242 break;
5243
d7a9644e 5244 case 'C':
96842e40 5245 {
0d95286f 5246 const char *const spec
3cfec666 5247 = (input_file_compiler->cpp_spec
5248 ? input_file_compiler->cpp_spec
96842e40 5249 : cpp_spec);
d946ea19 5250 value = do_spec_1 (spec, 0, NULL);
96842e40 5251 if (value != 0)
5252 return value;
5253 }
d7a9644e 5254 break;
5255
5256 case 'E':
d946ea19 5257 value = do_spec_1 (endfile_spec, 0, NULL);
fd8c18f0 5258 if (value != 0)
5259 return value;
d7a9644e 5260 break;
5261
5262 case 'l':
d946ea19 5263 value = do_spec_1 (link_spec, 0, NULL);
fd8c18f0 5264 if (value != 0)
5265 return value;
d7a9644e 5266 break;
5267
5268 case 'L':
d946ea19 5269 value = do_spec_1 (lib_spec, 0, NULL);
fd8c18f0 5270 if (value != 0)
5271 return value;
d7a9644e 5272 break;
5273
c93570ad 5274 case 'M':
5275 if (multilib_os_dir == NULL)
5276 obstack_1grow (&obstack, '.');
5277 else
5278 obstack_grow (&obstack, multilib_os_dir,
5279 strlen (multilib_os_dir));
5280 break;
5281
b7c87ff2 5282 case 'G':
d946ea19 5283 value = do_spec_1 (libgcc_spec, 0, NULL);
b7c87ff2 5284 if (value != 0)
5285 return value;
5286 break;
5287
805e22b2 5288 case 'R':
5289 /* We assume there is a directory
5290 separator at the end of this string. */
5291 if (target_system_root)
952f0048 5292 {
5293 obstack_grow (&obstack, target_system_root,
4ea70922 5294 strlen (target_system_root));
5295 if (target_sysroot_suffix)
952f0048 5296 obstack_grow (&obstack, target_sysroot_suffix,
4ea70922 5297 strlen (target_sysroot_suffix));
5298 }
805e22b2 5299 break;
5300
d7a9644e 5301 case 'S':
d946ea19 5302 value = do_spec_1 (startfile_spec, 0, NULL);
fd8c18f0 5303 if (value != 0)
5304 return value;
d7a9644e 5305 break;
5306
5307 /* Here we define characters other than letters and digits. */
5308
5309 case '{':
5310 p = handle_braces (p);
5311 if (p == 0)
5312 return -1;
5313 break;
5314
c21b3276 5315 case ':':
9e46467d 5316 p = handle_spec_function (p, NULL);
c21b3276 5317 if (p == 0)
5318 return -1;
5319 break;
5320
d7a9644e 5321 case '%':
5322 obstack_1grow (&obstack, '%');
5323 break;
5324
3cfec666 5325 case '.':
5326 {
5327 unsigned len = 0;
bdbd5352 5328
3cfec666 5329 while (p[len] && p[len] != ' ' && p[len] != '%')
5330 len++;
5331 suffix_subst = save_string (p - 1, len + 1);
5332 p += len;
5333 }
bdbd5352 5334 break;
3cfec666 5335
805e22b2 5336 /* Henceforth ignore the option(s) matching the pattern
5337 after the %<. */
5338 case '<':
5c1421d7 5339 case '>':
805e22b2 5340 {
5341 unsigned len = 0;
5342 int have_wildcard = 0;
5343 int i;
5c1421d7 5344 int switch_option;
5345
5346 if (c == '>')
5347 switch_option = SWITCH_IGNORE | SWITCH_KEEP_FOR_GCC;
5348 else
5349 switch_option = SWITCH_IGNORE;
805e22b2 5350
5351 while (p[len] && p[len] != ' ' && p[len] != '\t')
5352 len++;
5353
5354 if (p[len-1] == '*')
5355 have_wildcard = 1;
5356
5357 for (i = 0; i < n_switches; i++)
5358 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5359 && (have_wildcard || switches[i].part1[len] == '\0'))
5360 {
5c1421d7 5361 switches[i].live_cond |= switch_option;
556cfe53 5362 /* User switch be validated from validate_all_switches.
5363 when the definition is seen from the spec file.
5364 If not defined anywhere, will be rejected. */
5365 if (switches[i].known)
5366 switches[i].validated = true;
805e22b2 5367 }
5368
5369 p += len;
5370 }
5371 break;
5372
d7a9644e 5373 case '*':
d4ea3b1f 5374 if (soft_matched_part)
5375 {
fde5bd5c 5376 if (soft_matched_part[0])
5377 do_spec_1 (soft_matched_part, 1, NULL);
d946ea19 5378 do_spec_1 (" ", 0, NULL);
d4ea3b1f 5379 }
5380 else
5381 /* Catch the case where a spec string contains something like
0c6d8c36 5382 '%{foo:%*}'. i.e. there is no * in the pattern on the left
d4ea3b1f 5383 hand side of the :. */
a8c464ac 5384 error ("spec failure: %<%%*%> has not been initialized by pattern match");
d7a9644e 5385 break;
5386
5387 /* Process a string found as the value of a spec given by name.
5388 This feature allows individual machine descriptions
88483769 5389 to add and use their own specs. */
d7a9644e 5390 case '(':
d7a9644e 5391 {
e40d43cc 5392 const char *name = p;
d7a9644e 5393 struct spec_list *sl;
5394 int len;
5395
5396 /* The string after the S/P is the name of a spec that is to be
a92771b8 5397 processed. */
88483769 5398 while (*p && *p != ')')
d7a9644e 5399 p++;
5400
d4ea3b1f 5401 /* See if it's in the list. */
d7a9644e 5402 for (len = p - name, sl = specs; sl; sl = sl->next)
988c0ffe 5403 if (sl->name_len == len && !strncmp (sl->name, name, len))
d7a9644e 5404 {
988c0ffe 5405 name = *(sl->ptr_spec);
4582d741 5406#ifdef DEBUG_SPECS
88483769 5407 fnotice (stderr, "Processing spec (%s), which is '%s'\n",
5408 sl->name, name);
4582d741 5409#endif
d7a9644e 5410 break;
5411 }
5412
5413 if (sl)
5414 {
88483769 5415 value = do_spec_1 (name, 0, NULL);
5416 if (value != 0)
5417 return value;
d7a9644e 5418 }
8894538a 5419
88483769 5420 /* Discard the closing paren. */
8894538a 5421 if (*p)
5422 p++;
d7a9644e 5423 }
5424 break;
5425
5426 default:
a8c464ac 5427 error ("spec failure: unrecognized spec option %qc", c);
d4ea3b1f 5428 break;
d7a9644e 5429 }
5430 break;
5431
5432 case '\\':
5433 /* Backslash: treat next character as ordinary. */
5434 c = *p++;
5435
b4b174c3 5436 /* Fall through. */
d7a9644e 5437 default:
5438 /* Ordinary character: put it into the current argument. */
5439 obstack_1grow (&obstack, c);
5440 arg_going = 1;
5441 }
5442
c21b3276 5443 /* End of string. If we are processing a spec function, we need to
5444 end any pending argument. */
558cc3be 5445 if (processing_spec_function)
5446 end_going_arg ();
c21b3276 5447
026f2c7a 5448 return 0;
d7a9644e 5449}
5450
c21b3276 5451/* Look up a spec function. */
5452
5453static const struct spec_function *
952f0048 5454lookup_spec_function (const char *name)
c21b3276 5455{
c21b3276 5456 const struct spec_function *sf;
c21b3276 5457
0bb0fa6a 5458 for (sf = static_spec_functions; sf->name != NULL; sf++)
5459 if (strcmp (sf->name, name) == 0)
5460 return sf;
c21b3276 5461
5462 return NULL;
5463}
5464
5465/* Evaluate a spec function. */
5466
5467static const char *
952f0048 5468eval_spec_function (const char *func, const char *args)
c21b3276 5469{
5470 const struct spec_function *sf;
5471 const char *funcval;
5472
5473 /* Saved spec processing context. */
f1f41a6c 5474 vec<const_char_p> save_argbuf;
c21b3276 5475
5476 int save_arg_going;
5477 int save_delete_this_arg;
5478 int save_this_is_output_file;
5479 int save_this_is_library_file;
5480 int save_input_from_pipe;
d7ee9e9b 5481 int save_this_is_linker_script;
c21b3276 5482 const char *save_suffix_subst;
5483
e2efe9af 5484 int save_growing_size;
5485 void *save_growing_value;
c21b3276 5486
5487 sf = lookup_spec_function (func);
5488 if (sf == NULL)
a8c464ac 5489 fatal_error ("unknown spec function %qs", func);
c21b3276 5490
5491 /* Push the spec processing context. */
c21b3276 5492 save_argbuf = argbuf;
5493
5494 save_arg_going = arg_going;
5495 save_delete_this_arg = delete_this_arg;
5496 save_this_is_output_file = this_is_output_file;
5497 save_this_is_library_file = this_is_library_file;
d7ee9e9b 5498 save_this_is_linker_script = this_is_linker_script;
c21b3276 5499 save_input_from_pipe = input_from_pipe;
5500 save_suffix_subst = suffix_subst;
5501
e2efe9af 5502 /* If we have some object growing now, finalize it so the args and function
5503 eval proceed from a cleared context. This is needed to prevent the first
5504 constructed arg from mistakenly including the growing value. We'll push
5505 this value back on the obstack once the function evaluation is done, to
5506 restore a consistent processing context for our caller. This is fine as
5507 the address of growing objects isn't guaranteed to remain stable until
5508 they are finalized, and we expect this situation to be rare enough for
5509 the extra copy not to be an issue. */
5510 save_growing_size = obstack_object_size (&obstack);
5511 if (save_growing_size > 0)
5512 save_growing_value = obstack_finish (&obstack);
5513
c21b3276 5514 /* Create a new spec processing context, and build the function
5515 arguments. */
5516
5517 alloc_args ();
5518 if (do_spec_2 (args) < 0)
a8c464ac 5519 fatal_error ("error in args to spec function %qs", func);
c21b3276 5520
5521 /* argbuf_index is an index for the next argument to be inserted, and
5522 so contains the count of the args already inserted. */
5523
f1f41a6c 5524 funcval = (*sf->func) (argbuf.length (),
5525 argbuf.address ());
c21b3276 5526
5527 /* Pop the spec processing context. */
f1f41a6c 5528 argbuf.release ();
c21b3276 5529 argbuf = save_argbuf;
5530
5531 arg_going = save_arg_going;
5532 delete_this_arg = save_delete_this_arg;
5533 this_is_output_file = save_this_is_output_file;
5534 this_is_library_file = save_this_is_library_file;
d7ee9e9b 5535 this_is_linker_script = save_this_is_linker_script;
c21b3276 5536 input_from_pipe = save_input_from_pipe;
5537 suffix_subst = save_suffix_subst;
5538
e2efe9af 5539 if (save_growing_size > 0)
5540 obstack_grow (&obstack, save_growing_value, save_growing_size);
5541
c21b3276 5542 return funcval;
5543}
5544
5545/* Handle a spec function call of the form:
5546
5547 %:function(args)
5548
5549 ARGS is processed as a spec in a separate context and split into an
5550 argument vector in the normal fashion. The function returns a string
5551 containing a spec which we then process in the caller's context, or
9e46467d 5552 NULL if no processing is required.
5553
5554 If RETVAL_NONNULL is not NULL, then store a bool whether function
5555 returned non-NULL. */
c21b3276 5556
5557static const char *
9e46467d 5558handle_spec_function (const char *p, bool *retval_nonnull)
c21b3276 5559{
5560 char *func, *args;
5561 const char *endp, *funcval;
5562 int count;
5563
5564 processing_spec_function++;
5565
5566 /* Get the function name. */
5567 for (endp = p; *endp != '\0'; endp++)
5568 {
5569 if (*endp == '(') /* ) */
5570 break;
5571 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5572 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
a922df2e 5573 fatal_error ("malformed spec function name");
c21b3276 5574 }
5575 if (*endp != '(') /* ) */
a922df2e 5576 fatal_error ("no arguments for spec function");
c21b3276 5577 func = save_string (p, endp - p);
5578 p = ++endp;
5579
5580 /* Get the arguments. */
5581 for (count = 0; *endp != '\0'; endp++)
5582 {
5583 /* ( */
5584 if (*endp == ')')
5585 {
5586 if (count == 0)
5587 break;
5588 count--;
5589 }
5590 else if (*endp == '(') /* ) */
5591 count++;
5592 }
5593 /* ( */
5594 if (*endp != ')')
a922df2e 5595 fatal_error ("malformed spec function arguments");
c21b3276 5596 args = save_string (p, endp - p);
5597 p = ++endp;
5598
5599 /* p now points to just past the end of the spec function expression. */
5600
5601 funcval = eval_spec_function (func, args);
5602 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5603 p = NULL;
9e46467d 5604 if (retval_nonnull)
5605 *retval_nonnull = funcval != NULL;
c21b3276 5606
5607 free (func);
5608 free (args);
5609
5610 processing_spec_function--;
5611
5612 return p;
5613}
5614
805e22b2 5615/* Inline subroutine of handle_braces. Returns true if the current
5616 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5617static inline bool
952f0048 5618input_suffix_matches (const char *atom, const char *end_atom)
805e22b2 5619{
5620 return (input_suffix
5621 && !strncmp (input_suffix, atom, end_atom - atom)
5622 && input_suffix[end_atom - atom] == '\0');
5623}
d7a9644e 5624
90e35d1a 5625/* Subroutine of handle_braces. Returns true if the current
5626 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
5627static bool
5628input_spec_matches (const char *atom, const char *end_atom)
5629{
5630 return (input_file_compiler
5631 && input_file_compiler->suffix
5632 && input_file_compiler->suffix[0] != '\0'
5633 && !strncmp (input_file_compiler->suffix + 1, atom,
5634 end_atom - atom)
5635 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
5636}
5637
1e8e9920 5638/* Subroutine of handle_braces. Returns true if a switch
805e22b2 5639 matching the atom bracketed by ATOM and END_ATOM appeared on the
5640 command line. */
1e8e9920 5641static bool
952f0048 5642switch_matches (const char *atom, const char *end_atom, int starred)
d7a9644e 5643{
805e22b2 5644 int i;
5645 int len = end_atom - atom;
5646 int plen = starred ? len : -1;
d7a9644e 5647
805e22b2 5648 for (i = 0; i < n_switches; i++)
5649 if (!strncmp (switches[i].part1, atom, len)
5650 && (starred || switches[i].part1[len] == '\0')
5651 && check_live_switch (i, plen))
5652 return true;
4a10d696 5653
cbe25b89 5654 /* Check if a switch with separated form matching the atom.
5655 We check -D and -U switches. */
5656 else if (switches[i].args != 0)
5657 {
5658 if ((*switches[i].part1 == 'D' || *switches[i].part1 == 'U')
5659 && *switches[i].part1 == atom[0])
5660 {
5661 if (!strncmp (switches[i].args[0], &atom[1], len - 1)
5662 && (starred || (switches[i].part1[1] == '\0'
5663 && switches[i].args[0][len - 1] == '\0'))
5664 && check_live_switch (i, (starred ? 1 : -1)))
5665 return true;
5666 }
5667 }
5668
805e22b2 5669 return false;
5670}
d7a9644e 5671
805e22b2 5672/* Inline subroutine of handle_braces. Mark all of the switches which
5673 match ATOM (extends to END_ATOM; STARRED indicates whether there
5674 was a star after the atom) for later processing. */
5675static inline void
952f0048 5676mark_matching_switches (const char *atom, const char *end_atom, int starred)
805e22b2 5677{
5678 int i;
5679 int len = end_atom - atom;
5680 int plen = starred ? len : -1;
5681
5682 for (i = 0; i < n_switches; i++)
5683 if (!strncmp (switches[i].part1, atom, len)
5684 && (starred || switches[i].part1[len] == '\0')
5685 && check_live_switch (i, plen))
5686 switches[i].ordering = 1;
5687}
ae70654c 5688
805e22b2 5689/* Inline subroutine of handle_braces. Process all the currently
5690 marked switches through give_switch, and clear the marks. */
5691static inline void
952f0048 5692process_marked_switches (void)
805e22b2 5693{
5694 int i;
d7a9644e 5695
805e22b2 5696 for (i = 0; i < n_switches; i++)
5697 if (switches[i].ordering == 1)
5698 {
5699 switches[i].ordering = 0;
5700 give_switch (i, 0);
5701 }
5702}
d7a9644e 5703
805e22b2 5704/* Handle a %{ ... } construct. P points just inside the leading {.
5705 Returns a pointer one past the end of the brace block, or 0
5706 if we call do_spec_1 and that returns -1. */
d7a9644e 5707
805e22b2 5708static const char *
952f0048 5709handle_braces (const char *p)
805e22b2 5710{
5711 const char *atom, *end_atom;
5712 const char *d_atom = NULL, *d_end_atom = NULL;
5e8f3c31 5713 const char *orig = p;
4a10d696 5714
805e22b2 5715 bool a_is_suffix;
90e35d1a 5716 bool a_is_spectype;
805e22b2 5717 bool a_is_starred;
5718 bool a_is_negated;
5719 bool a_matched;
ae70654c 5720
805e22b2 5721 bool a_must_be_last = false;
5722 bool ordered_set = false;
5723 bool disjunct_set = false;
5724 bool disj_matched = false;
5725 bool disj_starred = true;
5726 bool n_way_choice = false;
5727 bool n_way_matched = false;
5728
5729#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
ae70654c 5730
805e22b2 5731 do
d7a9644e 5732 {
805e22b2 5733 if (a_must_be_last)
5e8f3c31 5734 goto invalid;
ae70654c 5735
805e22b2 5736 /* Scan one "atom" (S in the description above of %{}, possibly
90e35d1a 5737 with '!', '.', '@', ',', or '*' modifiers). */
5738 a_matched = false;
5739 a_is_suffix = false;
5740 a_is_starred = false;
5741 a_is_negated = false;
5742 a_is_spectype = false;
2c815aff 5743
805e22b2 5744 SKIP_WHITE();
5745 if (*p == '!')
5746 p++, a_is_negated = true;
d7a9644e 5747
805e22b2 5748 SKIP_WHITE();
9e46467d 5749 if (*p == '%' && p[1] == ':')
5750 {
5751 atom = NULL;
5752 end_atom = NULL;
5753 p = handle_spec_function (p + 2, &a_matched);
5754 }
5755 else
5756 {
5757 if (*p == '.')
5758 p++, a_is_suffix = true;
5759 else if (*p == ',')
5760 p++, a_is_spectype = true;
5761
5762 atom = p;
5763 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
5764 || *p == ',' || *p == '.' || *p == '@')
5765 p++;
5766 end_atom = p;
d7a9644e 5767
9e46467d 5768 if (*p == '*')
5769 p++, a_is_starred = 1;
5770 }
e1478c0f 5771
805e22b2 5772 SKIP_WHITE();
5e8f3c31 5773 switch (*p)
805e22b2 5774 {
5e8f3c31 5775 case '&': case '}':
805e22b2 5776 /* Substitute the switch(es) indicated by the current atom. */
5777 ordered_set = true;
5778 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
90e35d1a 5779 || a_is_spectype || atom == end_atom)
5e8f3c31 5780 goto invalid;
d7a9644e 5781
805e22b2 5782 mark_matching_switches (atom, end_atom, a_is_starred);
5783
5784 if (*p == '}')
5785 process_marked_switches ();
5e8f3c31 5786 break;
5787
5788 case '|': case ':':
805e22b2 5789 /* Substitute some text if the current atom appears as a switch
5790 or suffix. */
5791 disjunct_set = true;
5792 if (ordered_set)
5e8f3c31 5793 goto invalid;
d7a9644e 5794
9e46467d 5795 if (atom && atom == end_atom)
d7a9644e 5796 {
805e22b2 5797 if (!n_way_choice || disj_matched || *p == '|'
48e1416a 5798 || a_is_negated || a_is_suffix || a_is_spectype
90e35d1a 5799 || a_is_starred)
5e8f3c31 5800 goto invalid;
805e22b2 5801
5802 /* An empty term may appear as the last choice of an
5803 N-way choice set; it means "otherwise". */
5804 a_must_be_last = true;
5805 disj_matched = !n_way_matched;
5806 disj_starred = false;
d7a9644e 5807 }
805e22b2 5808 else
d7a9644e 5809 {
90e35d1a 5810 if ((a_is_suffix || a_is_spectype) && a_is_starred)
5811 goto invalid;
d7ee9e9b 5812
90e35d1a 5813 if (!a_is_starred)
5814 disj_starred = false;
5815
5816 /* Don't bother testing this atom if we already have a
5817 match. */
5818 if (!disj_matched && !n_way_matched)
5819 {
9e46467d 5820 if (atom == NULL)
5821 /* a_matched is already set by handle_spec_function. */;
5822 else if (a_is_suffix)
90e35d1a 5823 a_matched = input_suffix_matches (atom, end_atom);
5824 else if (a_is_spectype)
5825 a_matched = input_spec_matches (atom, end_atom);
5826 else
5827 a_matched = switch_matches (atom, end_atom, a_is_starred);
d7ee9e9b 5828
90e35d1a 5829 if (a_matched != a_is_negated)
5830 {
5831 disj_matched = true;
5832 d_atom = atom;
5833 d_end_atom = end_atom;
5834 }
5835 }
d7a9644e 5836 }
d7a9644e 5837
805e22b2 5838 if (*p == ':')
d7a9644e 5839 {
805e22b2 5840 /* Found the body, that is, the text to substitute if the
5841 current disjunction matches. */
5842 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
5843 disj_matched && !n_way_matched);
5844 if (p == 0)
5845 return 0;
d7a9644e 5846
805e22b2 5847 /* If we have an N-way choice, reset state for the next
5848 disjunction. */
5849 if (*p == ';')
d7a9644e 5850 {
805e22b2 5851 n_way_choice = true;
5852 n_way_matched |= disj_matched;
5853 disj_matched = false;
5854 disj_starred = true;
5855 d_atom = d_end_atom = NULL;
d7a9644e 5856 }
5857 }
5e8f3c31 5858 break;
5859
5860 default:
5861 goto invalid;
d7a9644e 5862 }
805e22b2 5863 }
5864 while (*p++ != '}');
d7a9644e 5865
805e22b2 5866 return p;
2f2c6aee 5867
5e8f3c31 5868 invalid:
a8c464ac 5869 fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
2f2c6aee 5870
805e22b2 5871#undef SKIP_WHITE
5872}
5873
5874/* Subroutine of handle_braces. Scan and process a brace substitution body
5875 (X in the description of %{} syntax). P points one past the colon;
5876 ATOM and END_ATOM bracket the first atom which was found to be true
5877 (present) in the current disjunction; STARRED indicates whether all
5878 the atoms in the current disjunction were starred (for syntax validation);
5879 MATCHED indicates whether the disjunction matched or not, and therefore
5880 whether or not the body is to be processed through do_spec_1 or just
5881 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
5882 returns -1. */
5883
5884static const char *
952f0048 5885process_brace_body (const char *p, const char *atom, const char *end_atom,
5886 int starred, int matched)
805e22b2 5887{
5888 const char *body, *end_body;
5889 unsigned int nesting_level;
5890 bool have_subst = false;
5891
5892 /* Locate the closing } or ;, honoring nested braces.
5893 Trim trailing whitespace. */
5894 body = p;
5895 nesting_level = 1;
5896 for (;;)
5897 {
5898 if (*p == '{')
5899 nesting_level++;
5900 else if (*p == '}')
d7a9644e 5901 {
805e22b2 5902 if (!--nesting_level)
5903 break;
d7a9644e 5904 }
805e22b2 5905 else if (*p == ';' && nesting_level == 1)
5906 break;
5907 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
5908 have_subst = true;
5909 else if (*p == '\0')
5e8f3c31 5910 goto invalid;
805e22b2 5911 p++;
d7a9644e 5912 }
952f0048 5913
805e22b2 5914 end_body = p;
5915 while (end_body[-1] == ' ' || end_body[-1] == '\t')
5916 end_body--;
d7a9644e 5917
805e22b2 5918 if (have_subst && !starred)
5e8f3c31 5919 goto invalid;
ae70654c 5920
805e22b2 5921 if (matched)
e1478c0f 5922 {
805e22b2 5923 /* Copy the substitution body to permanent storage and execute it.
5924 If have_subst is false, this is a simple matter of running the
5925 body through do_spec_1... */
5926 char *string = save_string (body, end_body - body);
5927 if (!have_subst)
5928 {
5929 if (do_spec_1 (string, 0, NULL) < 0)
5930 return 0;
5931 }
5932 else
5933 {
5934 /* ... but if have_subst is true, we have to process the
5935 body once for each matching switch, with %* set to the
5936 variant part of the switch. */
5937 unsigned int hard_match_len = end_atom - atom;
5938 int i;
e1478c0f 5939
805e22b2 5940 for (i = 0; i < n_switches; i++)
5941 if (!strncmp (switches[i].part1, atom, hard_match_len)
5942 && check_live_switch (i, hard_match_len))
5943 {
5944 if (do_spec_1 (string, 0,
5945 &switches[i].part1[hard_match_len]) < 0)
5946 return 0;
5947 /* Pass any arguments this switch has. */
5948 give_switch (i, 1);
5949 suffix_subst = NULL;
5950 }
5951 }
dead3293 5952 }
5953
805e22b2 5954 return p;
5e8f3c31 5955
5956 invalid:
a8c464ac 5957 fatal_error ("braced spec body %qs is invalid", body);
d7a9644e 5958}
cde688ab 5959\f
d870e215 5960/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5961 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
5962 spec, or -1 if either exact match or %* is used.
cde688ab 5963
b35329c7 5964 A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch
cde688ab 5965 whose value does not begin with "no-" is obsoleted by the same value
5966 with the "no-", similarly for a switch with the "no-" prefix. */
5967
5968static int
952f0048 5969check_live_switch (int switchnum, int prefix_length)
cde688ab 5970{
e40d43cc 5971 const char *name = switches[switchnum].part1;
cde688ab 5972 int i;
5973
71278019 5974 /* If we already processed this switch and determined if it was
5975 live or not, return our past determination. */
5976 if (switches[switchnum].live_cond != 0)
5977 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
5978 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
87a6a1b5 5979 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
5980 == 0);
71278019 5981
d870e215 5982 /* In the common case of {<at-most-one-letter>*}, a negating
cde688ab 5983 switch would always match, so ignore that case. We will just
5984 send the conflicting switches to the compiler phase. */
d870e215 5985 if (prefix_length >= 0 && prefix_length <= 1)
cde688ab 5986 return 1;
5987
cde688ab 5988 /* Now search for duplicate in a manner that depends on the name. */
5989 switch (*name)
5990 {
5991 case 'O':
026f2c7a 5992 for (i = switchnum + 1; i < n_switches; i++)
5993 if (switches[i].part1[0] == 'O')
5994 {
556cfe53 5995 switches[switchnum].validated = true;
026f2c7a 5996 switches[switchnum].live_cond = SWITCH_FALSE;
5997 return 0;
5998 }
cde688ab 5999 break;
d7a9644e 6000
b35329c7 6001 case 'W': case 'f': case 'm': case 'g':
d870e215 6002 if (! strncmp (name + 1, "no-", 3))
cde688ab 6003 {
a92771b8 6004 /* We have Xno-YYY, search for XYYY. */
cde688ab 6005 for (i = switchnum + 1; i < n_switches; i++)
6006 if (switches[i].part1[0] == name[0]
6007 && ! strcmp (&switches[i].part1[1], &name[4]))
026f2c7a 6008 {
556cfe53 6009 /* --specs are validated with the validate_switches mechanism. */
6010 if (switches[switchnum].known)
6011 switches[switchnum].validated = true;
026f2c7a 6012 switches[switchnum].live_cond = SWITCH_FALSE;
6013 return 0;
6014 }
cde688ab 6015 }
6016 else
6017 {
6018 /* We have XYYY, search for Xno-YYY. */
6019 for (i = switchnum + 1; i < n_switches; i++)
6020 if (switches[i].part1[0] == name[0]
6021 && switches[i].part1[1] == 'n'
6022 && switches[i].part1[2] == 'o'
6023 && switches[i].part1[3] == '-'
6024 && !strcmp (&switches[i].part1[4], &name[1]))
026f2c7a 6025 {
556cfe53 6026 /* --specs are validated with the validate_switches mechanism. */
6027 if (switches[switchnum].known)
6028 switches[switchnum].validated = true;
026f2c7a 6029 switches[switchnum].live_cond = SWITCH_FALSE;
6030 return 0;
6031 }
cde688ab 6032 }
6033 break;
6034 }
6035
6036 /* Otherwise the switch is live. */
79d52444 6037 switches[switchnum].live_cond |= SWITCH_LIVE;
cde688ab 6038 return 1;
6039}
6040\f
d7a9644e 6041/* Pass a switch to the current accumulating command
6042 in the same form that we received it.
6043 SWITCHNUM identifies the switch; it is an index into
6044 the vector of switches gcc received, which is `switches'.
6045 This cannot fail since it never finishes a command line.
6046
805e22b2 6047 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
d7a9644e 6048
6049static void
952f0048 6050give_switch (int switchnum, int omit_first_word)
d7a9644e 6051{
79d52444 6052 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
4a10d696 6053 return;
6054
d7a9644e 6055 if (!omit_first_word)
6056 {
d946ea19 6057 do_spec_1 ("-", 0, NULL);
6058 do_spec_1 (switches[switchnum].part1, 1, NULL);
d7a9644e 6059 }
3796373b 6060
d7a9644e 6061 if (switches[switchnum].args != 0)
6062 {
2508fdc3 6063 const char **p;
d7a9644e 6064 for (p = switches[switchnum].args; *p; p++)
6065 {
bdbd5352 6066 const char *arg = *p;
6067
805e22b2 6068 do_spec_1 (" ", 0, NULL);
bdbd5352 6069 if (suffix_subst)
6070 {
6071 unsigned length = strlen (arg);
633199a0 6072 int dot = 0;
bdbd5352 6073
6074 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6075 if (arg[length] == '.')
6076 {
e47a6f81 6077 (CONST_CAST(char *, arg))[length] = 0;
633199a0 6078 dot = 1;
bdbd5352 6079 break;
6080 }
d946ea19 6081 do_spec_1 (arg, 1, NULL);
633199a0 6082 if (dot)
e47a6f81 6083 (CONST_CAST(char *, arg))[length] = '.';
633199a0 6084 do_spec_1 (suffix_subst, 1, NULL);
bdbd5352 6085 }
6086 else
d946ea19 6087 do_spec_1 (arg, 1, NULL);
d7a9644e 6088 }
6089 }
3796373b 6090
d946ea19 6091 do_spec_1 (" ", 0, NULL);
556cfe53 6092 switches[switchnum].validated = true;
d7a9644e 6093}
6094\f
6095/* Search for a file named NAME trying various prefixes including the
6096 user's -B prefix and some standard ones.
6097 Return the absolute file name found. If nothing is found, return NAME. */
6098
e40d43cc 6099static const char *
952f0048 6100find_file (const char *name)
d7a9644e 6101{
067277c3 6102 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
d7a9644e 6103 return newname ? newname : name;
6104}
6105
c049b2ee 6106/* Determine whether a directory exists. If LINKER, return 0 for
067277c3 6107 certain fixed names not needed by the linker. */
d7a9644e 6108
6109static int
067277c3 6110is_directory (const char *path1, bool linker)
d7a9644e 6111{
067277c3 6112 int len1;
6113 char *path;
d7a9644e 6114 char *cp;
6115 struct stat st;
6116
067277c3 6117 /* Ensure the string ends with "/.". The resulting path will be a
6118 directory even if the given path is a symbolic link. */
6119 len1 = strlen (path1);
25a1c410 6120 path = (char *) alloca (3 + len1);
d7e36a01 6121 memcpy (path, path1, len1);
067277c3 6122 cp = path + len1;
79b23a1e 6123 if (!IS_DIR_SEPARATOR (cp[-1]))
b9374a77 6124 *cp++ = DIR_SEPARATOR;
d7a9644e 6125 *cp++ = '.';
6126 *cp = '\0';
6127
6128 /* Exclude directories that the linker is known to search. */
c049b2ee 6129 if (linker
067277c3 6130 && IS_DIR_SEPARATOR (path[0])
b9374a77 6131 && ((cp - path == 6
82715bcd 6132 && filename_ncmp (path + 1, "lib", 3) == 0)
b9374a77 6133 || (cp - path == 10
82715bcd 6134 && filename_ncmp (path + 1, "usr", 3) == 0
067277c3 6135 && IS_DIR_SEPARATOR (path[4])
82715bcd 6136 && filename_ncmp (path + 5, "lib", 3) == 0)))
d7a9644e 6137 return 0;
6138
6139 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6140}
397f1574 6141
6142/* Set up the various global variables to indicate that we're processing
6143 the input file named FILENAME. */
6144
32d661fc 6145void
952f0048 6146set_input (const char *filename)
397f1574 6147{
19cb6b50 6148 const char *p;
397f1574 6149
460b8bb3 6150 gcc_input_filename = filename;
6151 input_filename_length = strlen (gcc_input_filename);
6152 input_basename = lbasename (gcc_input_filename);
397f1574 6153
6154 /* Find a suffix starting with the last period,
6155 and set basename_length to exclude that suffix. */
6156 basename_length = strlen (input_basename);
1cf79a1a 6157 suffixed_basename_length = basename_length;
397f1574 6158 p = input_basename + basename_length;
026f2c7a 6159 while (p != input_basename && *p != '.')
6160 --p;
397f1574 6161 if (*p == '.' && p != input_basename)
6162 {
6163 basename_length = p - input_basename;
6164 input_suffix = p + 1;
6165 }
6166 else
6167 input_suffix = "";
3cfec666 6168
74e4079a 6169 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
460b8bb3 6170 we will need to do a stat on the gcc_input_filename. The
74e4079a 6171 INPUT_STAT_SET signals that the stat is needed. */
6172 input_stat_set = 0;
397f1574 6173}
d7a9644e 6174\f
6175/* On fatal signals, delete all the temporary files. */
6176
6177static void
a922df2e 6178fatal_signal (int signum)
d7a9644e 6179{
6180 signal (signum, SIG_DFL);
6181 delete_failure_queue ();
6182 delete_temp_files ();
6183 /* Get the same signal again, this time not handled,
6184 so its normal effect occurs. */
6185 kill (getpid (), signum);
6186}
6187
71278019 6188/* Compare the contents of the two files named CMPFILE[0] and
6189 CMPFILE[1]. Return zero if they're identical, nonzero
6190 otherwise. */
6191
6192static int
6193compare_files (char *cmpfile[])
6194{
6195 int ret = 0;
6196 FILE *temp[2] = { NULL, NULL };
6197 int i;
6198
6199#if HAVE_MMAP_FILE
6200 {
6201 size_t length[2];
6202 void *map[2] = { NULL, NULL };
6203
6204 for (i = 0; i < 2; i++)
6205 {
6206 struct stat st;
6207
6208 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6209 {
6210 error ("%s: could not determine length of compare-debug file %s",
460b8bb3 6211 gcc_input_filename, cmpfile[i]);
71278019 6212 ret = 1;
6213 break;
6214 }
6215
6216 length[i] = st.st_size;
6217 }
6218
6219 if (!ret && length[0] != length[1])
6220 {
460b8bb3 6221 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
71278019 6222 ret = 1;
6223 }
6224
6225 if (!ret)
6226 for (i = 0; i < 2; i++)
6227 {
6228 int fd = open (cmpfile[i], O_RDONLY);
6229 if (fd < 0)
6230 {
6231 error ("%s: could not open compare-debug file %s",
460b8bb3 6232 gcc_input_filename, cmpfile[i]);
71278019 6233 ret = 1;
6234 break;
6235 }
6236
6237 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6238 close (fd);
6239
6240 if (map[i] == (void *) MAP_FAILED)
6241 {
6242 ret = -1;
6243 break;
6244 }
6245 }
6246
6247 if (!ret)
6248 {
6249 if (memcmp (map[0], map[1], length[0]) != 0)
6250 {
460b8bb3 6251 error ("%s: -fcompare-debug failure", gcc_input_filename);
71278019 6252 ret = 1;
6253 }
6254 }
6255
6256 for (i = 0; i < 2; i++)
6257 if (map[i])
7a63ab96 6258 munmap ((caddr_t) map[i], length[i]);
71278019 6259
6260 if (ret >= 0)
6261 return ret;
6262
6263 ret = 0;
6264 }
6265#endif
6266
6267 for (i = 0; i < 2; i++)
6268 {
6269 temp[i] = fopen (cmpfile[i], "r");
6270 if (!temp[i])
6271 {
6272 error ("%s: could not open compare-debug file %s",
460b8bb3 6273 gcc_input_filename, cmpfile[i]);
71278019 6274 ret = 1;
6275 break;
6276 }
6277 }
6278
6279 if (!ret && temp[0] && temp[1])
6280 for (;;)
6281 {
6282 int c0, c1;
6283 c0 = fgetc (temp[0]);
6284 c1 = fgetc (temp[1]);
6285
6286 if (c0 != c1)
6287 {
6288 error ("%s: -fcompare-debug failure",
460b8bb3 6289 gcc_input_filename);
71278019 6290 ret = 1;
6291 break;
6292 }
6293
6294 if (c0 == EOF)
6295 break;
6296 }
6297
6298 for (i = 1; i >= 0; i--)
6299 {
6300 if (temp[i])
6301 fclose (temp[i]);
6302 }
6303
6304 return ret;
6305}
6306
b71cbc18 6307extern int main (int, char **);
2ff5acce 6308
d7a9644e 6309int
b71cbc18 6310main (int argc, char **argv)
d7a9644e 6311{
1cf79a1a 6312 size_t i;
d7a9644e 6313 int value;
d7a9644e 6314 int linker_was_run = 0;
dc1dd09b 6315 int lang_n_infiles = 0;
573aba85 6316 int num_linker_inputs = 0;
d7a9644e 6317 char *explicit_link_files;
6318 char *specs_file;
a1051b02 6319 char *lto_wrapper_file;
e40d43cc 6320 const char *p;
9d70d39c 6321 struct user_specs *uptr;
c159e0b7 6322 char **old_argv = argv;
e62df35b 6323 struct cl_decoded_option *decoded_options;
6324 unsigned int decoded_options_count;
d7a9644e 6325
1764779d 6326 p = argv[0] + strlen (argv[0]);
79b23a1e 6327 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6328 --p;
460b8bb3 6329 progname = p;
d7a9644e 6330
460b8bb3 6331 xmalloc_set_program_name (progname);
6deeea15 6332
64271450 6333 expandargv (&argc, &argv);
6334
c159e0b7 6335 /* Determine if any expansions were made. */
6336 if (argv != old_argv)
6337 at_file_supplied = true;
6338
90336809 6339 /* Register the language-independent parameters. */
6340 global_init_params ();
6341 finish_params ();
6342
6343 init_options_struct (&global_options, &global_options_set);
f3f006ad 6344
e62df35b 6345 decode_cmdline_options_to_array (argc, CONST_CAST2 (const char **, char **,
6346 argv),
6347 CL_DRIVER,
6348 &decoded_options, &decoded_options_count);
a1baa5f1 6349
4367c81f 6350 /* Unlock the stdio streams. */
9c8f076b 6351 unlock_std_streams ();
4367c81f 6352
eb718689 6353 gcc_init_libintl ();
be2828ce 6354
460b8bb3 6355 diagnostic_initialize (global_dc, 0);
2cdbb326 6356
6357#ifdef GCC_DRIVER_HOST_INITIALIZATION
6358 /* Perform host dependent initialization when needed. */
6359 GCC_DRIVER_HOST_INITIALIZATION;
6360#endif
6361
460b8bb3 6362 if (atexit (delete_temp_files) != 0)
6363 fatal_error ("atexit failed");
6364
d7a9644e 6365 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
a922df2e 6366 signal (SIGINT, fatal_signal);
294a029f 6367#ifdef SIGHUP
d7a9644e 6368 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
a922df2e 6369 signal (SIGHUP, fatal_signal);
294a029f 6370#endif
d7a9644e 6371 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
a922df2e 6372 signal (SIGTERM, fatal_signal);
d7a9644e 6373#ifdef SIGPIPE
6374 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
a922df2e 6375 signal (SIGPIPE, fatal_signal);
d7a9644e 6376#endif
6b917287 6377#ifdef SIGCHLD
1a3768bc 6378 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6379 receive the signal. A different setting is inheritable */
6380 signal (SIGCHLD, SIG_DFL);
6b917287 6381#endif
d7a9644e 6382
00dacc40 6383 /* Parsing and gimplification sometimes need quite large stack.
6384 Increase stack size limits if possible. */
6385 stack_limit_increase (64 * 1024 * 1024);
6386
c21b3276 6387 /* Allocate the argument vector. */
6388 alloc_args ();
d7a9644e 6389
6390 obstack_init (&obstack);
6391
3d97d965 6392 /* Build multilib_select, et. al from the separate lines that make up each
6393 multilib selection. */
709c4e1b 6394 {
e772a198 6395 const char *const *q = multilib_raw;
3d97d965 6396 int need_space;
709c4e1b 6397
6398 obstack_init (&multilib_obstack);
a92771b8 6399 while ((p = *q++) != (char *) 0)
709c4e1b 6400 obstack_grow (&multilib_obstack, p, strlen (p));
6401
6402 obstack_1grow (&multilib_obstack, 0);
4fac984f 6403 multilib_select = XOBFINISH (&multilib_obstack, const char *);
3d97d965 6404
6405 q = multilib_matches_raw;
6406 while ((p = *q++) != (char *) 0)
6407 obstack_grow (&multilib_obstack, p, strlen (p));
6408
6409 obstack_1grow (&multilib_obstack, 0);
4fac984f 6410 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
3d97d965 6411
54518c3b 6412 q = multilib_exclusions_raw;
6413 while ((p = *q++) != (char *) 0)
026f2c7a 6414 obstack_grow (&multilib_obstack, p, strlen (p));
54518c3b 6415
6416 obstack_1grow (&multilib_obstack, 0);
4fac984f 6417 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
2c815aff 6418
7137cdac 6419 q = multilib_reuse_raw;
6420 while ((p = *q++) != (char *) 0)
6421 obstack_grow (&multilib_obstack, p, strlen (p));
6422
6423 obstack_1grow (&multilib_obstack, 0);
6424 multilib_reuse = XOBFINISH (&multilib_obstack, const char *);
6425
3d97d965 6426 need_space = FALSE;
3098b2d3 6427 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
3d97d965 6428 {
6429 if (need_space)
6430 obstack_1grow (&multilib_obstack, ' ');
6431 obstack_grow (&multilib_obstack,
6432 multilib_defaults_raw[i],
6433 strlen (multilib_defaults_raw[i]));
6434 need_space = TRUE;
6435 }
6436
6437 obstack_1grow (&multilib_obstack, 0);
4fac984f 6438 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
709c4e1b 6439 }
6440
bba01ba8 6441#ifdef INIT_ENVIRONMENT
6442 /* Set up any other necessary machine specific environment variables. */
99c00302 6443 xputenv (INIT_ENVIRONMENT);
bba01ba8 6444#endif
6445
d7a9644e 6446 /* Make a table of what switches there are (switches, n_switches).
6447 Make a table of specified input files (infiles, n_infiles).
6448 Decode switches that are handled locally. */
6449
e62df35b 6450 process_command (decoded_options_count, decoded_options);
d7a9644e 6451
6452 /* Initialize the vector of specs to just the default.
6453 This means one element containing 0s, as a terminator. */
6454
25a1c410 6455 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
f0af5a88 6456 memcpy (compilers, default_compilers, sizeof default_compilers);
d7a9644e 6457 n_compilers = n_default_compilers;
6458
6459 /* Read specs from a file if there is one. */
6460
3441e5dd 6461 machine_suffix = concat (spec_machine, dir_separator_str,
4e2023c8 6462 spec_version, dir_separator_str, NULL);
6463 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
d7a9644e 6464
067277c3 6465 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
d7a9644e 6466 /* Read the specs file unless it is a default one. */
6467 if (specs_file != 0 && strcmp (specs_file, "specs"))
556cfe53 6468 read_specs (specs_file, true, false);
4582d741 6469 else
6470 init_spec ();
8b351d3c 6471
c71f4af0 6472 /* We need to check standard_exec_prefix/just_machine_suffix/specs
d4ea3b1f 6473 for any override of as, ld and libraries. */
25a1c410 6474 specs_file = (char *) alloca (strlen (standard_exec_prefix)
f0af5a88 6475 + strlen (just_machine_suffix) + sizeof ("specs"));
c71f4af0 6476
6477 strcpy (specs_file, standard_exec_prefix);
6478 strcat (specs_file, just_machine_suffix);
6479 strcat (specs_file, "specs");
6480 if (access (specs_file, R_OK) == 0)
556cfe53 6481 read_specs (specs_file, true, false);
2c815aff 6482
7dd97ab6 6483 /* Process any configure-time defaults specified for the command line
6484 options, via OPTION_DEFAULT_SPECS. */
6485 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6486 do_option_spec (option_default_specs[i].name,
6487 option_default_specs[i].spec);
6488
d0faeb9d 6489 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6490 of the command line. */
6491
6492 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6493 do_self_spec (driver_self_specs[i]);
6494
805e22b2 6495 /* If not cross-compiling, look for executables in the standard
6496 places. */
6497 if (*cross_compile == '0')
a45072dd 6498 {
bfb9bc39 6499 if (*md_exec_prefix)
6500 {
6501 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
2af84186 6502 PREFIX_PRIORITY_LAST, 0, 0);
bfb9bc39 6503 }
805e22b2 6504 }
6505
6473f3f4 6506 /* Process sysroot_suffix_spec. */
4ea70922 6507 if (*sysroot_suffix_spec != 0
70eb49f5 6508 && !no_sysroot_suffix
4ea70922 6509 && do_spec_2 (sysroot_suffix_spec) == 0)
6510 {
f1f41a6c 6511 if (argbuf.length () > 1)
0a81f5a0 6512 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
f1f41a6c 6513 else if (argbuf.length () == 1)
6514 target_sysroot_suffix = xstrdup (argbuf.last ());
4ea70922 6515 }
6516
b6bcc48f 6517#ifdef HAVE_LD_SYSROOT
6518 /* Pass the --sysroot option to the linker, if it supports that. If
6519 there is a sysroot_suffix_spec, it has already been processed by
6520 this point, so target_system_root really is the system root we
6521 should be using. */
6522 if (target_system_root)
6523 {
6524 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6525 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
556cfe53 6526 set_spec ("link", XOBFINISH (&obstack, const char *), false);
b6bcc48f 6527 }
6528#endif
6529
6473f3f4 6530 /* Process sysroot_hdrs_suffix_spec. */
4ea70922 6531 if (*sysroot_hdrs_suffix_spec != 0
70eb49f5 6532 && !no_sysroot_suffix
4ea70922 6533 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6534 {
f1f41a6c 6535 if (argbuf.length () > 1)
0a81f5a0 6536 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
f1f41a6c 6537 else if (argbuf.length () == 1)
6538 target_sysroot_hdrs_suffix = xstrdup (argbuf.last ());
4ea70922 6539 }
6540
805e22b2 6541 /* Look for startfiles in the standard places. */
6542 if (*startfile_prefix_spec != 0
6543 && do_spec_2 (startfile_prefix_spec) == 0
6544 && do_spec_1 (" ", 0, NULL) == 0)
6545 {
9d9edc85 6546 const char *arg;
805e22b2 6547 int ndx;
f1f41a6c 6548 FOR_EACH_VEC_ELT (argbuf, ndx, arg)
9d9edc85 6549 add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
2af84186 6550 PREFIX_PRIORITY_LAST, 0, 1);
805e22b2 6551 }
6552 /* We should eventually get rid of all these and stick to
6553 startfile_prefix_spec exclusively. */
6554 else if (*cross_compile == '0' || target_system_root)
6555 {
bfb9bc39 6556 if (*md_startfile_prefix)
805e22b2 6557 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
2af84186 6558 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
a45072dd 6559
bfb9bc39 6560 if (*md_startfile_prefix_1)
805e22b2 6561 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
2af84186 6562 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
1121f96b 6563
86e5f097 6564 /* If standard_startfile_prefix is relative, base it on
6565 standard_exec_prefix. This lets us move the installed tree
6566 as a unit. If GCC_EXEC_PREFIX is defined, base
1fbb4a86 6567 standard_startfile_prefix on that as well.
6568
6569 If the prefix is relative, only search it for native compilers;
6570 otherwise we will search a directory containing host libraries. */
a5c088d4 6571 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
805e22b2 6572 add_sysrooted_prefix (&startfile_prefixes,
6573 standard_startfile_prefix, "BINUTILS",
2af84186 6574 PREFIX_PRIORITY_LAST, 0, 1);
1fbb4a86 6575 else if (*cross_compile == '0')
86e5f097 6576 {
b9374a77 6577 add_prefix (&startfile_prefixes,
48e1416a 6578 concat (gcc_exec_prefix
6579 ? gcc_exec_prefix : standard_exec_prefix,
6580 machine_suffix,
4e2023c8 6581 standard_startfile_prefix, NULL),
2af84186 6582 NULL, PREFIX_PRIORITY_LAST, 0, 1);
2c815aff 6583 }
86e5f097 6584
c4328bcc 6585 /* Sysrooted prefixes are relocated because target_system_root is
6586 also relocated by gcc_exec_prefix. */
3c2ba0de 6587 if (*standard_startfile_prefix_1)
6588 add_sysrooted_prefix (&startfile_prefixes,
6589 standard_startfile_prefix_1, "BINUTILS",
2af84186 6590 PREFIX_PRIORITY_LAST, 0, 1);
3c2ba0de 6591 if (*standard_startfile_prefix_2)
6592 add_sysrooted_prefix (&startfile_prefixes,
6593 standard_startfile_prefix_2, "BINUTILS",
2af84186 6594 PREFIX_PRIORITY_LAST, 0, 1);
a45072dd 6595 }
4ae4e5e8 6596
c15af0eb 6597 /* Process any user specified specs in the order given on the command
6598 line. */
6599 for (uptr = user_specs_head; uptr; uptr = uptr->next)
6600 {
c954ff02 6601 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
067277c3 6602 R_OK, true);
556cfe53 6603 read_specs (filename ? filename : uptr->filename, false, true);
c15af0eb 6604 }
6605
bd3ce038 6606 /* Process any user self specs. */
6607 {
6608 struct spec_list *sl;
6609 for (sl = specs; sl; sl = sl->next)
6610 if (sl->name_len == sizeof "self_spec" - 1
6611 && !strcmp (sl->name, "self_spec"))
6612 do_self_spec (*sl->ptr_spec);
6613 }
6614
6615 if (compare_debug)
6616 {
6617 enum save_temps save;
6618
6619 if (!compare_debug_second)
6620 {
6621 n_switches_debug_check[1] = n_switches;
6622 n_switches_alloc_debug_check[1] = n_switches_alloc;
6623 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
6624 n_switches_alloc);
6625
6626 do_self_spec ("%:compare-debug-self-opt()");
6627 n_switches_debug_check[0] = n_switches;
6628 n_switches_alloc_debug_check[0] = n_switches_alloc;
6629 switches_debug_check[0] = switches;
6630
6631 n_switches = n_switches_debug_check[1];
6632 n_switches_alloc = n_switches_alloc_debug_check[1];
6633 switches = switches_debug_check[1];
6634 }
6635
6636 /* Avoid crash when computing %j in this early. */
6637 save = save_temps_flag;
6638 save_temps_flag = SAVE_TEMPS_NONE;
6639
6640 compare_debug = -compare_debug;
6641 do_self_spec ("%:compare-debug-self-opt()");
6642
6643 save_temps_flag = save;
6644
6645 if (!compare_debug_second)
6646 {
6647 n_switches_debug_check[1] = n_switches;
6648 n_switches_alloc_debug_check[1] = n_switches_alloc;
6649 switches_debug_check[1] = switches;
6650 compare_debug = -compare_debug;
6651 n_switches = n_switches_debug_check[0];
6652 n_switches_alloc = n_switches_debug_check[0];
6653 switches = switches_debug_check[0];
6654 }
6655 }
6656
6657
533d7727 6658 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
6659 if (gcc_exec_prefix)
47950139 6660 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6661 spec_version, dir_separator_str, NULL);
a45072dd 6662
d7a9644e 6663 /* Now we have the specs.
6664 Set the `valid' bits for switches that match anything in any spec. */
6665
6666 validate_all_switches ();
6667
9577d478 6668 /* Now that we have the switches and the specs, set
6669 the subdirectory based on the options. */
6670 set_multilib_dir ();
6671
7bfefa9d 6672 /* Set up to remember the pathname of gcc and any options
460b8bb3 6673 needed for collect. We use argv[0] instead of progname because
7bfefa9d 6674 we need the complete pathname. */
6675 obstack_init (&collect_obstack);
6676 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6677 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6678 xputenv (XOBFINISH (&collect_obstack, char *));
6679
6680 /* Set up to remember the pathname of the lto wrapper. */
6681
1d784785 6682 if (have_c)
6683 lto_wrapper_file = NULL;
6684 else
6685 lto_wrapper_file = find_a_file (&exec_prefixes, "lto-wrapper",
6686 X_OK, false);
a1051b02 6687 if (lto_wrapper_file)
7bfefa9d 6688 {
40c059b1 6689 lto_wrapper_file = convert_white_space (lto_wrapper_file);
a1051b02 6690 lto_wrapper_spec = lto_wrapper_file;
7bfefa9d 6691 obstack_init (&collect_obstack);
6692 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
6693 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
6694 obstack_grow (&collect_obstack, lto_wrapper_spec,
6695 strlen (lto_wrapper_spec) + 1);
6696 xputenv (XOBFINISH (&collect_obstack, char *));
6697 }
6698
556cfe53 6699 /* Reject switches that no pass was interested in. */
d7a9644e 6700
026f2c7a 6701 for (i = 0; (int) i < n_switches; i++)
be2828ce 6702 if (! switches[i].validated)
556cfe53 6703 error ("unrecognized command line option %<-%s%>", switches[i].part1);
d7a9644e 6704
1c1a1c70 6705 /* Obey some of the options. */
6706
71cee7b1 6707 if (print_search_dirs)
6708 {
c4328bcc 6709 printf (_("install: %s%s\n"),
6710 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
6711 gcc_exec_prefix ? "" : machine_suffix);
067277c3 6712 printf (_("programs: %s\n"),
6713 build_search_list (&exec_prefixes, "", false, false));
6714 printf (_("libraries: %s\n"),
6715 build_search_list (&startfile_prefixes, "", false, true));
7f0b0c27 6716 return (0);
71cee7b1 6717 }
6718
1c1a1c70 6719 if (print_file_name)
5e3dea2b 6720 {
1c1a1c70 6721 printf ("%s\n", find_file (print_file_name));
7f0b0c27 6722 return (0);
5e3dea2b 6723 }
6724
1c1a1c70 6725 if (print_prog_name)
6726 {
c954ff02 6727 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
1c1a1c70 6728 printf ("%s\n", (newname ? newname : print_prog_name));
7f0b0c27 6729 return (0);
1c1a1c70 6730 }
d7a9644e 6731
9577d478 6732 if (print_multi_lib)
6733 {
6734 print_multilib_info ();
7f0b0c27 6735 return (0);
9577d478 6736 }
6737
6738 if (print_multi_directory)
6739 {
6740 if (multilib_dir == NULL)
6741 printf (".\n");
6742 else
6743 printf ("%s\n", multilib_dir);
7f0b0c27 6744 return (0);
9577d478 6745 }
6746
77adc39e 6747 if (print_multiarch)
6748 {
6749 if (multiarch_dir == NULL)
6750 printf ("\n");
6751 else
6752 printf ("%s\n", multiarch_dir);
6753 return (0);
6754 }
6755
098cc23f 6756 if (print_sysroot)
6757 {
6758 if (target_system_root)
6759 {
6760 if (target_sysroot_suffix)
6761 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
6762 else
6763 printf ("%s\n", target_system_root);
6764 }
6765 return (0);
6766 }
6767
c954ff02 6768 if (print_multi_os_directory)
6769 {
6770 if (multilib_os_dir == NULL)
6771 printf (".\n");
6772 else
6773 printf ("%s\n", multilib_os_dir);
6774 return (0);
6775 }
6776
6ea4242f 6777 if (print_sysroot_headers_suffix)
6778 {
6779 if (*sysroot_hdrs_suffix_spec)
6780 {
021d874e 6781 printf("%s\n", (target_sysroot_hdrs_suffix
6782 ? target_sysroot_hdrs_suffix
6783 : ""));
6ea4242f 6784 return (0);
6785 }
6786 else
6787 /* The error status indicates that only one set of fixed
6788 headers should be built. */
a922df2e 6789 fatal_error ("not configured with sysroot headers suffix");
6ea4242f 6790 }
6791
8ace789a 6792 if (print_help_list)
6793 {
6794 display_help ();
6795
6796 if (! verbose_flag)
6797 {
a4db0a1d 6798 printf (_("\nFor bug reporting instructions, please see:\n"));
4b5ee00b 6799 printf ("%s.\n", bug_report_url);
2c815aff 6800
7f0b0c27 6801 return (0);
8ace789a 6802 }
6803
6804 /* We do not exit here. Instead we have created a fake input file
6805 called 'help-dummy' which needs to be compiled, and we pass this
0445c349 6806 on the various sub-processes, along with the --help switch.
6807 Ensure their output appears after ours. */
6808 fputc ('\n', stdout);
6809 fflush (stdout);
8ace789a 6810 }
2c815aff 6811
39932bd2 6812 if (print_version)
6813 {
460b8bb3 6814 printf (_("%s %s%s\n"), progname, pkgversion_string,
39932bd2 6815 version_string);
1f3894c9 6816 printf ("Copyright %s 2013 Free Software Foundation, Inc.\n",
39932bd2 6817 _("(C)"));
6818 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
6819warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
6820 stdout);
6821 if (! verbose_flag)
6822 return 0;
6823
6824 /* We do not exit here. We use the same mechanism of --help to print
6825 the version of the sub-processes. */
6826 fputc ('\n', stdout);
6827 fflush (stdout);
6828 }
6829
d7a9644e 6830 if (verbose_flag)
6831 {
e3ccb76d 6832 int n;
d1cac662 6833 const char *thrmod;
e3ccb76d 6834
a922df2e 6835 fnotice (stderr, "Target: %s\n", spec_machine);
6836 fnotice (stderr, "Configured with: %s\n", configuration_arguments);
4a0e2d42 6837
d1cac662 6838#ifdef THREAD_MODEL_SPEC
6839 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6840 but there's no point in doing all this processing just to get
6841 thread_model back. */
6842 obstack_init (&obstack);
6843 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6844 obstack_1grow (&obstack, '\0');
4fac984f 6845 thrmod = XOBFINISH (&obstack, const char *);
d1cac662 6846#else
6847 thrmod = thread_model;
6848#endif
6849
a922df2e 6850 fnotice (stderr, "Thread model: %s\n", thrmod);
6d72c630 6851
e3ccb76d 6852 /* compiler_version is truncated at the first space when initialized
6853 from version string, so truncate version_string at the first space
6854 before comparing. */
6855 for (n = 0; version_string[n]; n++)
6856 if (version_string[n] == ' ')
6857 break;
6858
6859 if (! strncmp (version_string, compiler_version, n)
6860 && compiler_version[n] == 0)
a922df2e 6861 fnotice (stderr, "gcc version %s %s\n", version_string,
6862 pkgversion_string);
845bccef 6863 else
a922df2e 6864 fnotice (stderr, "gcc driver version %s %sexecuting gcc version %s\n",
6865 version_string, pkgversion_string, compiler_version);
845bccef 6866
d7a9644e 6867 if (n_infiles == 0)
7f0b0c27 6868 return (0);
d7a9644e 6869 }
6870
9e56255a 6871 if (n_infiles == added_libraries)
a922df2e 6872 fatal_error ("no input files");
d7a9644e 6873
5585cfe8 6874 if (seen_error ())
6875 goto out;
6876
d7a9644e 6877 /* Make a place to record the compiler output file names
6878 that correspond to the input files. */
6879
f9b7c0b9 6880 i = n_infiles;
5272ae11 6881 i += lang_specific_extra_outfiles;
4c36ffe6 6882 outfiles = XCNEWVEC (const char *, i);
d7a9644e 6883
6884 /* Record which files were specified explicitly as link input. */
6885
468329f6 6886 explicit_link_files = XCNEWVEC (char, n_infiles);
d7a9644e 6887
9dbb005d 6888 combine_inputs = have_o || flag_wpa;
dc1dd09b 6889
6890 for (i = 0; (int) i < n_infiles; i++)
40109983 6891 {
dc1dd09b 6892 const char *name = infiles[i].name;
2f2c6aee 6893 struct compiler *compiler = lookup_compiler (name,
6894 strlen (name),
dc1dd09b 6895 infiles[i].language);
2f2c6aee 6896
dc1dd09b 6897 if (compiler && !(compiler->combinable))
6898 combine_inputs = false;
2f2c6aee 6899
dc1dd09b 6900 if (lang_n_infiles > 0 && compiler != input_file_compiler
6901 && infiles[i].language && infiles[i].language[0] != '*')
6902 infiles[i].incompiler = compiler;
6903 else if (compiler)
6904 {
6905 lang_n_infiles++;
6906 input_file_compiler = compiler;
6907 infiles[i].incompiler = compiler;
6908 }
6909 else
6910 {
6911 /* Since there is no compiler for this input file, assume it is a
0bed3869 6912 linker file. */
dc1dd09b 6913 explicit_link_files[i] = 1;
6914 infiles[i].incompiler = NULL;
6915 }
6916 infiles[i].compiled = false;
6917 infiles[i].preprocessed = false;
40109983 6918 }
1e8e9920 6919
1c15f131 6920 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
78d063c8 6921 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
dc1dd09b 6922
6923 for (i = 0; (int) i < n_infiles; i++)
d7a9644e 6924 {
d7a9644e 6925 int this_file_error = 0;
6926
6927 /* Tell do_spec what to substitute for %i. */
6928
d7a9644e 6929 input_file_number = i;
397f1574 6930 set_input (infiles[i].name);
d7a9644e 6931
dc1dd09b 6932 if (infiles[i].compiled)
6933 continue;
6934
d7a9644e 6935 /* Use the same thing in %o, unless cp->spec says otherwise. */
6936
460b8bb3 6937 outfiles[i] = gcc_input_filename;
d7a9644e 6938
6939 /* Figure out which compiler from the file's suffix. */
6940
78d063c8 6941 input_file_compiler
6942 = lookup_compiler (infiles[i].name, input_filename_length,
6943 infiles[i].language);
3cfec666 6944
96842e40 6945 if (input_file_compiler)
d7a9644e 6946 {
6947 /* Ok, we found an applicable compiler. Run its spec. */
d7a9644e 6948
96842e40 6949 if (input_file_compiler->spec[0] == '#')
ce52dcfa 6950 {
6951 error ("%s: %s compiler not installed on this system",
460b8bb3 6952 gcc_input_filename, &input_file_compiler->spec[1]);
ce52dcfa 6953 this_file_error = 1;
6954 }
6955 else
6956 {
71278019 6957 if (compare_debug)
6958 {
dd045aee 6959 free (debug_check_temp_file[0]);
71278019 6960 debug_check_temp_file[0] = NULL;
6961
dd045aee 6962 free (debug_check_temp_file[1]);
71278019 6963 debug_check_temp_file[1] = NULL;
6964 }
6965
ce52dcfa 6966 value = do_spec (input_file_compiler->spec);
dc1dd09b 6967 infiles[i].compiled = true;
ce52dcfa 6968 if (value < 0)
e40d30f5 6969 this_file_error = 1;
71278019 6970 else if (compare_debug && debug_check_temp_file[0])
6971 {
6972 if (verbose_flag)
a922df2e 6973 inform (0, "recompiling with -fcompare-debug");
71278019 6974
6975 compare_debug = -compare_debug;
6976 n_switches = n_switches_debug_check[1];
4ff887c5 6977 n_switches_alloc = n_switches_alloc_debug_check[1];
71278019 6978 switches = switches_debug_check[1];
6979
6980 value = do_spec (input_file_compiler->spec);
6981
6982 compare_debug = -compare_debug;
6983 n_switches = n_switches_debug_check[0];
4ff887c5 6984 n_switches_alloc = n_switches_alloc_debug_check[0];
71278019 6985 switches = switches_debug_check[0];
6986
6987 if (value < 0)
6988 {
6989 error ("during -fcompare-debug recompilation");
6990 this_file_error = 1;
6991 }
6992
6993 gcc_assert (debug_check_temp_file[1]
82715bcd 6994 && filename_cmp (debug_check_temp_file[0],
6995 debug_check_temp_file[1]));
71278019 6996
6997 if (verbose_flag)
a922df2e 6998 inform (0, "comparing final insns dumps");
71278019 6999
7000 if (compare_files (debug_check_temp_file))
7001 this_file_error = 1;
7002 }
7003
7004 if (compare_debug)
7005 {
dd045aee 7006 free (debug_check_temp_file[0]);
71278019 7007 debug_check_temp_file[0] = NULL;
7008
dd045aee 7009 free (debug_check_temp_file[1]);
71278019 7010 debug_check_temp_file[1] = NULL;
7011 }
ce52dcfa 7012 }
d7a9644e 7013 }
7014
7015 /* If this file's name does not contain a recognized suffix,
7016 record it as explicit linker input. */
7017
7018 else
7019 explicit_link_files[i] = 1;
7020
7021 /* Clear the delete-on-failure queue, deleting the files in it
7022 if this compilation failed. */
7023
7024 if (this_file_error)
7025 {
7026 delete_failure_queue ();
460b8bb3 7027 errorcount++;
d7a9644e 7028 }
7029 /* If this compilation succeeded, don't delete those files later. */
7030 clear_failure_queue ();
7031 }
7032
fbf54d9a 7033 /* Reset the input file name to the first compile/object file name, for use
7034 with %b in LINK_SPEC. We use the first input file that we can find
2f2c6aee 7035 a compiler to compile it instead of using infiles.language since for
fbf54d9a 7036 languages other than C we use aliases that we then lookup later. */
397f1574 7037 if (n_infiles > 0)
fbf54d9a 7038 {
7039 int i;
7040
7041 for (i = 0; i < n_infiles ; i++)
02d52d9e 7042 if (infiles[i].incompiler
7043 || (infiles[i].language && infiles[i].language[0] != '*'))
fbf54d9a 7044 {
7045 set_input (infiles[i].name);
7046 break;
7047 }
7048 }
397f1574 7049
460b8bb3 7050 if (!seen_error ())
2b191381 7051 {
7052 /* Make sure INPUT_FILE_NUMBER points to first available open
7053 slot. */
7054 input_file_number = n_infiles;
7055 if (lang_specific_pre_link ())
460b8bb3 7056 errorcount++;
2b191381 7057 }
f9b7c0b9 7058
573aba85 7059 /* Determine if there are any linker input files. */
7060 num_linker_inputs = 0;
7061 for (i = 0; (int) i < n_infiles; i++)
7062 if (explicit_link_files[i] || outfiles[i] != NULL)
7063 num_linker_inputs++;
7064
d7a9644e 7065 /* Run ld to link all the compiler output files. */
7066
460b8bb3 7067 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
d7a9644e 7068 {
7069 int tmp = execution_count;
1d784785 7070
7071 if (! have_c)
7072 {
c5f741b3 7073#if HAVE_LTO_PLUGIN > 0
7074#if HAVE_LTO_PLUGIN == 2
1d784785 7075 const char *fno_use_linker_plugin = "fno-use-linker-plugin";
de4d280b 7076#else
1d784785 7077 const char *fuse_linker_plugin = "fuse-linker-plugin";
c5f741b3 7078#endif
de4d280b 7079#endif
8894538a 7080
1d784785 7081 /* We'll use ld if we can't find collect2. */
7082 if (! strcmp (linker_name_spec, "collect2"))
7083 {
7084 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7085 if (s == NULL)
7086 linker_name_spec = "ld";
7087 }
7bfefa9d 7088
c5f741b3 7089#if HAVE_LTO_PLUGIN > 0
7090#if HAVE_LTO_PLUGIN == 2
1d784785 7091 if (!switch_matches (fno_use_linker_plugin,
7092 fno_use_linker_plugin
7093 + strlen (fno_use_linker_plugin), 0))
de4d280b 7094#else
1d784785 7095 if (switch_matches (fuse_linker_plugin,
7096 fuse_linker_plugin
7097 + strlen (fuse_linker_plugin), 0))
de4d280b 7098#endif
1d784785 7099 {
40c059b1 7100 char *temp_spec = find_a_file (&exec_prefixes,
7101 LTOPLUGINSONAME, R_OK,
7102 false);
7103 if (!temp_spec)
1d784785 7104 fatal_error ("-fuse-linker-plugin, but %s not found",
7105 LTOPLUGINSONAME);
40c059b1 7106 linker_plugin_file_spec = convert_white_space (temp_spec);
1d784785 7107 }
c5f741b3 7108#endif
1d784785 7109 lto_gcc_spec = argv[0];
7110 }
7bfefa9d 7111
8894538a 7112 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7113 for collect. */
067277c3 7114 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7115 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
8894538a 7116
ceac8e8c 7117 if (print_subprocess_help == 1)
7118 {
7119 printf (_("\nLinker options\n==============\n\n"));
7120 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7121 " to the linker.\n\n"));
7122 fflush (stdout);
7123 }
d7a9644e 7124 value = do_spec (link_command_spec);
7125 if (value < 0)
460b8bb3 7126 errorcount = 1;
d7a9644e 7127 linker_was_run = (tmp != execution_count);
7128 }
7129
d7a9644e 7130 /* If options said don't run linker,
7131 complain about input files to be given to the linker. */
7132
460b8bb3 7133 if (! linker_was_run && !seen_error ())
026f2c7a 7134 for (i = 0; (int) i < n_infiles; i++)
3293d046 7135 if (explicit_link_files[i]
7136 && !(infiles[i].language && infiles[i].language[0] == '*'))
a922df2e 7137 warning (0, "%s: linker input file unused because linking not done",
7138 outfiles[i]);
d7a9644e 7139
7140 /* Delete some or all of the temporary files we made. */
7141
460b8bb3 7142 if (seen_error ())
d7a9644e 7143 delete_failure_queue ();
7144 delete_temp_files ();
7145
8ace789a 7146 if (print_help_list)
7147 {
a4db0a1d 7148 printf (("\nFor bug reporting instructions, please see:\n"));
4b5ee00b 7149 printf ("%s\n", bug_report_url);
8ace789a 7150 }
2c815aff 7151
5585cfe8 7152 out:
155b05dc 7153 return (signal_count != 0 ? 2
460b8bb3 7154 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
155b05dc 7155 : 0);
d7a9644e 7156}
7157
7158/* Find the proper compilation spec for the file name NAME,
a45072dd 7159 whose length is LENGTH. LANGUAGE is the specified language,
997d68fe 7160 or 0 if this file is to be passed to the linker. */
d7a9644e 7161
7162static struct compiler *
952f0048 7163lookup_compiler (const char *name, size_t length, const char *language)
d7a9644e 7164{
7165 struct compiler *cp;
7166
d4ea3b1f 7167 /* If this was specified by the user to be a linker input, indicate that. */
997d68fe 7168 if (language != 0 && language[0] == '*')
7169 return 0;
7170
7171 /* Otherwise, look for the language, if one is spec'd. */
d7a9644e 7172 if (language != 0)
7173 {
7174 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
997d68fe 7175 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7176 return cp;
7177
d7a9644e 7178 error ("language %s not recognized", language);
997d68fe 7179 return 0;
d7a9644e 7180 }
7181
7182 /* Look for a suffix. */
7183 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7184 {
a3102c3c 7185 if (/* The suffix `-' matches only the file name `-'. */
7186 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
997d68fe 7187 || (strlen (cp->suffix) < length
7188 /* See if the suffix matches the end of NAME. */
997d68fe 7189 && !strcmp (cp->suffix,
7190 name + length - strlen (cp->suffix))
997d68fe 7191 ))
3cfec666 7192 break;
22869eeb 7193 }
997d68fe 7194
22869eeb 7195#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
aab2cf92 7196 /* Look again, but case-insensitively this time. */
22869eeb 7197 if (cp < compilers)
7198 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7199 {
7200 if (/* The suffix `-' matches only the file name `-'. */
7201 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7202 || (strlen (cp->suffix) < length
7203 /* See if the suffix matches the end of NAME. */
7204 && ((!strcmp (cp->suffix,
7205 name + length - strlen (cp->suffix))
7206 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7207 && !strcasecmp (cp->suffix,
7208 name + length - strlen (cp->suffix)))
7209 ))
7210 break;
7211 }
7212#endif
7213
22869eeb 7214 if (cp >= compilers)
7215 {
1cf79a1a 7216 if (cp->spec[0] != '@')
7217 /* A non-alias entry: return it. */
7218 return cp;
2c815aff 7219
1cf79a1a 7220 /* An alias entry maps a suffix to a language.
7221 Search for the language; pass 0 for NAME and LENGTH
7222 to avoid infinite recursion if language not found. */
d946ea19 7223 return lookup_compiler (NULL, 0, cp->spec + 1);
d7a9644e 7224 }
d7a9644e 7225 return 0;
7226}
7227\f
d7a9644e 7228static char *
952f0048 7229save_string (const char *s, int len)
d7a9644e 7230{
4c36ffe6 7231 char *result = XNEWVEC (char, len + 1);
d7a9644e 7232
d5130039 7233 memcpy (result, s, len);
d7a9644e 7234 result[len] = 0;
7235 return result;
7236}
7237
833a5c07 7238void
952f0048 7239pfatal_with_name (const char *name)
d7a9644e 7240{
be2828ce 7241 perror_with_name (name);
7242 delete_temp_files ();
7243 exit (1);
d7a9644e 7244}
7245
7246static void
952f0048 7247perror_with_name (const char *name)
d7a9644e 7248{
a8c464ac 7249 error ("%s: %m", name);
d7a9644e 7250}
d7a9644e 7251\f
805e22b2 7252static inline void
556cfe53 7253validate_switches_from_spec (const char *spec, bool user)
805e22b2 7254{
7255 const char *p = spec;
7256 char c;
7257 while ((c = *p++))
7258 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7259 /* We have a switch spec. */
556cfe53 7260 p = validate_switches (p + 1, user);
805e22b2 7261}
7262
d7a9644e 7263static void
952f0048 7264validate_all_switches (void)
d7a9644e 7265{
7266 struct compiler *comp;
8894538a 7267 struct spec_list *spec;
d7a9644e 7268
1cf79a1a 7269 for (comp = compilers; comp->spec; comp++)
556cfe53 7270 validate_switches_from_spec (comp->spec, false);
d7a9644e 7271
d4ea3b1f 7272 /* Look through the linked list of specs read from the specs file. */
026f2c7a 7273 for (spec = specs; spec; spec = spec->next)
556cfe53 7274 validate_switches_from_spec (*spec->ptr_spec, spec->user_p);
8894538a 7275
556cfe53 7276 validate_switches_from_spec (link_command_spec, false);
d7a9644e 7277}
7278
7279/* Look at the switch-name that comes after START
7280 and mark as valid all supplied switches that match it. */
7281
805e22b2 7282static const char *
556cfe53 7283validate_switches (const char *start, bool user_spec)
d7a9644e 7284{
19cb6b50 7285 const char *p = start;
805e22b2 7286 const char *atom;
7287 size_t len;
19cb6b50 7288 int i;
805e22b2 7289 bool suffix = false;
7290 bool starred = false;
952f0048 7291
805e22b2 7292#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
952f0048 7293
dead3293 7294next_member:
805e22b2 7295 SKIP_WHITE ();
7296
d7a9644e 7297 if (*p == '!')
805e22b2 7298 p++;
d7a9644e 7299
805e22b2 7300 SKIP_WHITE ();
90e35d1a 7301 if (*p == '.' || *p == ',')
805e22b2 7302 suffix = true, p++;
d7a9644e 7303
805e22b2 7304 atom = p;
7305 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
9a4a603c 7306 || *p == ',' || *p == '.' || *p == '@')
026f2c7a 7307 p++;
805e22b2 7308 len = p - atom;
d7a9644e 7309
805e22b2 7310 if (*p == '*')
7311 starred = true, p++;
7312
7313 SKIP_WHITE ();
7314
7315 if (!suffix)
d7a9644e 7316 {
7317 /* Mark all matching switches as valid. */
d7a9644e 7318 for (i = 0; i < n_switches; i++)
805e22b2 7319 if (!strncmp (switches[i].part1, atom, len)
556cfe53 7320 && (starred || switches[i].part1[len] == '\0')
7321 && (switches[i].known || user_spec))
7322 switches[i].validated = true;
d7a9644e 7323 }
805e22b2 7324
49aaac6f 7325 if (*p) p++;
7326 if (*p && (p[-1] == '|' || p[-1] == '&'))
805e22b2 7327 goto next_member;
7328
49aaac6f 7329 if (*p && p[-1] == ':')
d7a9644e 7330 {
805e22b2 7331 while (*p && *p != ';' && *p != '}')
d7a9644e 7332 {
805e22b2 7333 if (*p == '%')
7334 {
7335 p++;
7336 if (*p == '{' || *p == '<')
556cfe53 7337 p = validate_switches (p+1, user_spec);
805e22b2 7338 else if (p[0] == 'W' && p[1] == '{')
556cfe53 7339 p = validate_switches (p+2, user_spec);
805e22b2 7340 }
41b8b07e 7341 else
7342 p++;
d7a9644e 7343 }
805e22b2 7344
49aaac6f 7345 if (*p) p++;
7346 if (*p && p[-1] == ';')
805e22b2 7347 goto next_member;
d7a9644e 7348 }
dead3293 7349
805e22b2 7350 return p;
7351#undef SKIP_WHITE
d7a9644e 7352}
9577d478 7353\f
c954ff02 7354struct mdswitchstr
7355{
7356 const char *str;
7357 int len;
7358};
7359
7360static struct mdswitchstr *mdswitches;
7361static int n_mdswitches;
7362
3d97d965 7363/* Check whether a particular argument was used. The first time we
ad87de1e 7364 canonicalize the switches to keep only the ones we care about. */
9577d478 7365
7366static int
952f0048 7367used_arg (const char *p, int len)
9577d478 7368{
d4ea3b1f 7369 struct mswitchstr
7370 {
e772a198 7371 const char *str;
7372 const char *replace;
3d97d965 7373 int len;
7374 int rep_len;
7375 };
7376
7377 static struct mswitchstr *mswitches;
7378 static int n_mswitches;
7379 int i, j;
7380
7381 if (!mswitches)
7382 {
7383 struct mswitchstr *matches;
e772a198 7384 const char *q;
d0fdc842 7385 int cnt = 0;
3d97d965 7386
026f2c7a 7387 /* Break multilib_matches into the component strings of string
7388 and replacement string. */
c4fa40de 7389 for (q = multilib_matches; *q != '\0'; q++)
7390 if (*q == ';')
3d97d965 7391 cnt++;
7392
25a1c410 7393 matches
7394 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
3d97d965 7395 i = 0;
7396 q = multilib_matches;
7397 while (*q != '\0')
7398 {
7399 matches[i].str = q;
7400 while (*q != ' ')
7401 {
7402 if (*q == '\0')
5e8f3c31 7403 {
7404 invalid_matches:
a8c464ac 7405 fatal_error ("multilib spec %qs is invalid",
a922df2e 7406 multilib_matches);
5e8f3c31 7407 }
3d97d965 7408 q++;
7409 }
3d97d965 7410 matches[i].len = q - matches[i].str;
9577d478 7411
3d97d965 7412 matches[i].replace = ++q;
7413 while (*q != ';' && *q != '\0')
7414 {
7415 if (*q == ' ')
5e8f3c31 7416 goto invalid_matches;
3d97d965 7417 q++;
7418 }
7419 matches[i].rep_len = q - matches[i].replace;
7420 i++;
401574b8 7421 if (*q == ';')
7422 q++;
3d97d965 7423 }
9577d478 7424
0a4dc6a9 7425 /* Now build a list of the replacement string for switches that we care
7426 about. Make sure we allocate at least one entry. This prevents
7427 xmalloc from calling fatal, and prevents us from re-executing this
7428 block of code. */
7429 mswitches
4c36ffe6 7430 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
3d97d965 7431 for (i = 0; i < n_switches; i++)
79d52444 7432 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
0c76b21e 7433 {
7434 int xlen = strlen (switches[i].part1);
7435 for (j = 0; j < cnt; j++)
7436 if (xlen == matches[j].len
7437 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7438 {
7439 mswitches[n_mswitches].str = matches[j].replace;
7440 mswitches[n_mswitches].len = matches[j].rep_len;
7441 mswitches[n_mswitches].replace = (char *) 0;
7442 mswitches[n_mswitches].rep_len = 0;
7443 n_mswitches++;
7444 break;
7445 }
7446 }
c954ff02 7447
7448 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7449 on the command line nor any options mutually incompatible with
7450 them. */
7451 for (i = 0; i < n_mdswitches; i++)
7452 {
7453 const char *r;
7454
7455 for (q = multilib_options; *q != '\0'; q++)
7456 {
7457 while (*q == ' ')
7458 q++;
7459
7460 r = q;
7461 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7462 || strchr (" /", q[mdswitches[i].len]) == NULL)
7463 {
7464 while (*q != ' ' && *q != '/' && *q != '\0')
7465 q++;
7466 if (*q != '/')
7467 break;
7468 q++;
7469 }
7470
7471 if (*q != ' ' && *q != '\0')
7472 {
7473 while (*r != ' ' && *r != '\0')
7474 {
7475 q = r;
7476 while (*q != ' ' && *q != '/' && *q != '\0')
7477 q++;
7478
7479 if (used_arg (r, q - r))
7480 break;
7481
7482 if (*q != '/')
7483 {
7484 mswitches[n_mswitches].str = mdswitches[i].str;
7485 mswitches[n_mswitches].len = mdswitches[i].len;
7486 mswitches[n_mswitches].replace = (char *) 0;
7487 mswitches[n_mswitches].rep_len = 0;
7488 n_mswitches++;
7489 break;
7490 }
7491
7492 r = q + 1;
7493 }
7494 break;
7495 }
7496 }
7497 }
3d97d965 7498 }
48583106 7499
3d97d965 7500 for (i = 0; i < n_mswitches; i++)
7501 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7502 return 1;
48583106 7503
3d97d965 7504 return 0;
7505}
48583106 7506
7507static int
952f0048 7508default_arg (const char *p, int len)
48583106 7509{
c954ff02 7510 int i;
618c6dbb 7511
c954ff02 7512 for (i = 0; i < n_mdswitches; i++)
7513 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7514 return 1;
48583106 7515
7516 return 0;
7517}
7518
54518c3b 7519/* Work out the subdirectory to use based on the options. The format of
7520 multilib_select is a list of elements. Each element is a subdirectory
7521 name followed by a list of options followed by a semicolon. The format
7522 of multilib_exclusions is the same, but without the preceding
7523 directory. First gcc will check the exclusions, if none of the options
7524 beginning with an exclamation point are present, and all of the other
7525 options are present, then we will ignore this completely. Passing
7526 that, gcc will consider each multilib_select in turn using the same
7527 rules for matching the options. If a match is found, that subdirectory
77adc39e 7528 will be used.
7529 A subdirectory name is optionally followed by a colon and the corresponding
7530 multiarch name. */
9577d478 7531
7532static void
952f0048 7533set_multilib_dir (void)
9577d478 7534{
e772a198 7535 const char *p;
d4ea3b1f 7536 unsigned int this_path_len;
e772a198 7537 const char *this_path, *this_arg;
c954ff02 7538 const char *start, *end;
48583106 7539 int not_arg;
c954ff02 7540 int ok, ndfltok, first;
7541
7542 n_mdswitches = 0;
7543 start = multilib_defaults;
7544 while (*start == ' ' || *start == '\t')
7545 start++;
7546 while (*start != '\0')
7547 {
7548 n_mdswitches++;
7549 while (*start != ' ' && *start != '\t' && *start != '\0')
7550 start++;
7551 while (*start == ' ' || *start == '\t')
7552 start++;
7553 }
7554
7555 if (n_mdswitches)
7556 {
7557 int i = 0;
7558
4c36ffe6 7559 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
c954ff02 7560 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7561 {
7562 while (*start == ' ' || *start == '\t')
7563 start++;
7564
7565 if (*start == '\0')
7566 break;
952f0048 7567
c954ff02 7568 for (end = start + 1;
7569 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7570 ;
7571
7572 obstack_grow (&multilib_obstack, start, end - start);
7573 obstack_1grow (&multilib_obstack, 0);
4fac984f 7574 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
c954ff02 7575 mdswitches[i++].len = end - start;
7576
7577 if (*end == '\0')
7578 break;
7579 }
7580 }
9577d478 7581
54518c3b 7582 p = multilib_exclusions;
7583 while (*p != '\0')
7584 {
7585 /* Ignore newlines. */
7586 if (*p == '\n')
026f2c7a 7587 {
7588 ++p;
7589 continue;
7590 }
54518c3b 7591
7592 /* Check the arguments. */
7593 ok = 1;
7594 while (*p != ';')
026f2c7a 7595 {
7596 if (*p == '\0')
5e8f3c31 7597 {
7598 invalid_exclusions:
a8c464ac 7599 fatal_error ("multilib exclusions %qs is invalid",
a922df2e 7600 multilib_exclusions);
5e8f3c31 7601 }
026f2c7a 7602
7603 if (! ok)
7604 {
7605 ++p;
7606 continue;
7607 }
7608
7609 this_arg = p;
7610 while (*p != ' ' && *p != ';')
7611 {
7612 if (*p == '\0')
5e8f3c31 7613 goto invalid_exclusions;
026f2c7a 7614 ++p;
7615 }
7616
7617 if (*this_arg != '!')
7618 not_arg = 0;
7619 else
7620 {
7621 not_arg = 1;
7622 ++this_arg;
7623 }
2c815aff 7624
54518c3b 7625 ok = used_arg (this_arg, p - this_arg);
7626 if (not_arg)
7627 ok = ! ok;
7628
026f2c7a 7629 if (*p == ' ')
7630 ++p;
7631 }
54518c3b 7632
7633 if (ok)
d4ea3b1f 7634 return;
54518c3b 7635
7636 ++p;
7637 }
7638
c954ff02 7639 first = 1;
54518c3b 7640 p = multilib_select;
7137cdac 7641
7642 /* Append multilib reuse rules if any. With those rules, we can reuse
7643 one multilib for certain different options sets. */
7644 if (strlen (multilib_reuse) > 0)
7645 p = concat (p, multilib_reuse, NULL);
7646
9577d478 7647 while (*p != '\0')
7648 {
7649 /* Ignore newlines. */
7650 if (*p == '\n')
7651 {
7652 ++p;
7653 continue;
7654 }
7655
7656 /* Get the initial path. */
7657 this_path = p;
7658 while (*p != ' ')
7659 {
7660 if (*p == '\0')
5e8f3c31 7661 {
7662 invalid_select:
7137cdac 7663 fatal_error ("multilib select %qs %qs is invalid",
7664 multilib_select, multilib_reuse);
5e8f3c31 7665 }
9577d478 7666 ++p;
7667 }
7668 this_path_len = p - this_path;
7669
7670 /* Check the arguments. */
48583106 7671 ok = 1;
c954ff02 7672 ndfltok = 1;
9577d478 7673 ++p;
7674 while (*p != ';')
7675 {
7676 if (*p == '\0')
5e8f3c31 7677 goto invalid_select;
9577d478 7678
48583106 7679 if (! ok)
9577d478 7680 {
7681 ++p;
7682 continue;
7683 }
7684
7685 this_arg = p;
7686 while (*p != ' ' && *p != ';')
7687 {
7688 if (*p == '\0')
5e8f3c31 7689 goto invalid_select;
9577d478 7690 ++p;
7691 }
7692
48583106 7693 if (*this_arg != '!')
7694 not_arg = 0;
9577d478 7695 else
48583106 7696 {
7697 not_arg = 1;
7698 ++this_arg;
7699 }
7700
7701 /* If this is a default argument, we can just ignore it.
7702 This is true even if this_arg begins with '!'. Beginning
7703 with '!' does not mean that this argument is necessarily
7704 inappropriate for this library: it merely means that
7705 there is a more specific library which uses this
7706 argument. If this argument is a default, we need not
7707 consider that more specific library. */
c954ff02 7708 ok = used_arg (this_arg, p - this_arg);
7709 if (not_arg)
7710 ok = ! ok;
7711
7712 if (! ok)
7713 ndfltok = 0;
7714
7715 if (default_arg (this_arg, p - this_arg))
7716 ok = 1;
9577d478 7717
7718 if (*p == ' ')
7719 ++p;
7720 }
7721
c954ff02 7722 if (ok && first)
9577d478 7723 {
7724 if (this_path_len != 1
7725 || this_path[0] != '.')
7726 {
4c36ffe6 7727 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
c954ff02 7728 char *q;
7729
e40d43cc 7730 strncpy (new_multilib_dir, this_path, this_path_len);
7731 new_multilib_dir[this_path_len] = '\0';
c954ff02 7732 q = strchr (new_multilib_dir, ':');
7733 if (q != NULL)
7734 *q = '\0';
e40d43cc 7735 multilib_dir = new_multilib_dir;
9577d478 7736 }
c954ff02 7737 first = 0;
7738 }
7739
7740 if (ndfltok)
7741 {
7742 const char *q = this_path, *end = this_path + this_path_len;
7743
7744 while (q < end && *q != ':')
7745 q++;
a2770a85 7746 if (q < end)
c954ff02 7747 {
77adc39e 7748 const char *q2 = q + 1, *ml_end = end;
7749 char *new_multilib_os_dir;
7750
7751 while (q2 < end && *q2 != ':')
7752 q2++;
7753 if (*q2 == ':')
7754 ml_end = q2;
7755 new_multilib_os_dir = XNEWVEC (char, ml_end - q);
7756 memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
7757 new_multilib_os_dir[ml_end - q - 1] = '\0';
7758 multilib_os_dir = *new_multilib_os_dir ? new_multilib_os_dir : ".";
7759
7760 if (q2 < end && *q2 == ':')
7761 {
7762 char *new_multiarch_dir = XNEWVEC (char, end - q2);
7763 memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
7764 new_multiarch_dir[end - q2 - 1] = '\0';
7765 multiarch_dir = new_multiarch_dir;
7766 }
c954ff02 7767 break;
7768 }
9577d478 7769 }
7770
7771 ++p;
2c815aff 7772 }
c954ff02 7773
7774 if (multilib_dir == NULL && multilib_os_dir != NULL
7775 && strcmp (multilib_os_dir, ".") == 0)
7776 {
e47a6f81 7777 free (CONST_CAST (char *, multilib_os_dir));
c954ff02 7778 multilib_os_dir = NULL;
7779 }
7780 else if (multilib_dir != NULL && multilib_os_dir == NULL)
7781 multilib_os_dir = multilib_dir;
9577d478 7782}
7783
7784/* Print out the multiple library subdirectory selection
7785 information. This prints out a series of lines. Each line looks
7786 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
7787 required. Only the desired options are printed out, the negative
7788 matches. The options are print without a leading dash. There are
7789 no spaces to make it easy to use the information in the shell.
7790 Each subdirectory is printed only once. This assumes the ordering
54518c3b 7791 generated by the genmultilib script. Also, we leave out ones that match
7792 the exclusions. */
9577d478 7793
7794static void
952f0048 7795print_multilib_info (void)
9577d478 7796{
e772a198 7797 const char *p = multilib_select;
7798 const char *last_path = 0, *this_path;
48583106 7799 int skip;
d4ea3b1f 7800 unsigned int last_path_len = 0;
9577d478 7801
7802 while (*p != '\0')
7803 {
54518c3b 7804 skip = 0;
9577d478 7805 /* Ignore newlines. */
7806 if (*p == '\n')
7807 {
7808 ++p;
7809 continue;
7810 }
7811
7812 /* Get the initial path. */
7813 this_path = p;
7814 while (*p != ' ')
7815 {
7816 if (*p == '\0')
5e8f3c31 7817 {
7818 invalid_select:
a8c464ac 7819 fatal_error ("multilib select %qs is invalid", multilib_select);
5e8f3c31 7820 }
2f2c6aee 7821
9577d478 7822 ++p;
7823 }
7824
a2770a85 7825 /* When --disable-multilib was used but target defines
77adc39e 7826 MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
7827 with .:: for multiarch configurations) are there just to find
7828 multilib_os_dir, so skip them from output. */
7829 if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
a2770a85 7830 skip = 1;
7831
54518c3b 7832 /* Check for matches with the multilib_exclusions. We don't bother
7833 with the '!' in either list. If any of the exclusion rules match
7834 all of its options with the select rule, we skip it. */
026f2c7a 7835 {
7836 const char *e = multilib_exclusions;
7837 const char *this_arg;
54518c3b 7838
026f2c7a 7839 while (*e != '\0')
7840 {
7841 int m = 1;
7842 /* Ignore newlines. */
7843 if (*e == '\n')
7844 {
7845 ++e;
7846 continue;
7847 }
54518c3b 7848
026f2c7a 7849 /* Check the arguments. */
7850 while (*e != ';')
7851 {
7852 const char *q;
7853 int mp = 0;
54518c3b 7854
026f2c7a 7855 if (*e == '\0')
5e8f3c31 7856 {
7857 invalid_exclusion:
a8c464ac 7858 fatal_error ("multilib exclusion %qs is invalid",
a922df2e 7859 multilib_exclusions);
5e8f3c31 7860 }
2c815aff 7861
026f2c7a 7862 if (! m)
7863 {
7864 ++e;
7865 continue;
7866 }
54518c3b 7867
026f2c7a 7868 this_arg = e;
2c815aff 7869
026f2c7a 7870 while (*e != ' ' && *e != ';')
7871 {
7872 if (*e == '\0')
5e8f3c31 7873 goto invalid_exclusion;
026f2c7a 7874 ++e;
7875 }
54518c3b 7876
026f2c7a 7877 q = p + 1;
7878 while (*q != ';')
7879 {
7880 const char *arg;
7881 int len = e - this_arg;
54518c3b 7882
026f2c7a 7883 if (*q == '\0')
5e8f3c31 7884 goto invalid_select;
54518c3b 7885
026f2c7a 7886 arg = q;
7887
7888 while (*q != ' ' && *q != ';')
7889 {
7890 if (*q == '\0')
5e8f3c31 7891 goto invalid_select;
54518c3b 7892 ++q;
026f2c7a 7893 }
54518c3b 7894
5e8f3c31 7895 if (! strncmp (arg, this_arg,
7896 (len < q - arg) ? q - arg : len)
7897 || default_arg (this_arg, e - this_arg))
026f2c7a 7898 {
7899 mp = 1;
7900 break;
7901 }
54518c3b 7902
026f2c7a 7903 if (*q == ' ')
7904 ++q;
7905 }
2c815aff 7906
026f2c7a 7907 if (! mp)
7908 m = 0;
54518c3b 7909
026f2c7a 7910 if (*e == ' ')
7911 ++e;
7912 }
7913
7914 if (m)
7915 {
7916 skip = 1;
7917 break;
7918 }
7919
7920 if (*e != '\0')
7921 ++e;
7922 }
7923 }
54518c3b 7924
7925 if (! skip)
026f2c7a 7926 {
7927 /* If this is a duplicate, skip it. */
5e8f3c31 7928 skip = (last_path != 0
7929 && (unsigned int) (p - this_path) == last_path_len
82715bcd 7930 && ! filename_ncmp (last_path, this_path, last_path_len));
9577d478 7931
026f2c7a 7932 last_path = this_path;
7933 last_path_len = p - this_path;
54518c3b 7934 }
9577d478 7935
48583106 7936 /* If this directory requires any default arguments, we can skip
7937 it. We will already have printed a directory identical to
7938 this one which does not require that default argument. */
7939 if (! skip)
7940 {
e772a198 7941 const char *q;
48583106 7942
7943 q = p + 1;
7944 while (*q != ';')
7945 {
e772a198 7946 const char *arg;
48583106 7947
7948 if (*q == '\0')
5e8f3c31 7949 goto invalid_select;
48583106 7950
7951 if (*q == '!')
7952 arg = NULL;
7953 else
7954 arg = q;
7955
7956 while (*q != ' ' && *q != ';')
7957 {
7958 if (*q == '\0')
5e8f3c31 7959 goto invalid_select;
48583106 7960 ++q;
7961 }
7962
7963 if (arg != NULL
7964 && default_arg (arg, q - arg))
7965 {
7966 skip = 1;
7967 break;
7968 }
7969
7970 if (*q == ' ')
7971 ++q;
7972 }
7973 }
7974
9577d478 7975 if (! skip)
7976 {
e772a198 7977 const char *p1;
9577d478 7978
c954ff02 7979 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
9577d478 7980 putchar (*p1);
7981 putchar (';');
7982 }
7983
7984 ++p;
7985 while (*p != ';')
7986 {
7987 int use_arg;
7988
7989 if (*p == '\0')
5e8f3c31 7990 goto invalid_select;
9577d478 7991
7992 if (skip)
7993 {
7994 ++p;
7995 continue;
7996 }
7997
7998 use_arg = *p != '!';
7999
8000 if (use_arg)
8001 putchar ('@');
8002
8003 while (*p != ' ' && *p != ';')
8004 {
8005 if (*p == '\0')
5e8f3c31 8006 goto invalid_select;
9577d478 8007 if (use_arg)
8008 putchar (*p);
8009 ++p;
8010 }
8011
8012 if (*p == ' ')
8013 ++p;
8014 }
8015
8016 if (! skip)
3d97d965 8017 {
d4ea3b1f 8018 /* If there are extra options, print them now. */
3d97d965 8019 if (multilib_extra && *multilib_extra)
8020 {
8021 int print_at = TRUE;
e772a198 8022 const char *q;
3d97d965 8023
8024 for (q = multilib_extra; *q != '\0'; q++)
8025 {
8026 if (*q == ' ')
8027 print_at = TRUE;
8028 else
8029 {
8030 if (print_at)
8031 putchar ('@');
8032 putchar (*q);
8033 print_at = FALSE;
8034 }
8035 }
8036 }
2c815aff 8037
3d97d965 8038 putchar ('\n');
8039 }
9577d478 8040
8041 ++p;
8042 }
8043}
c21b3276 8044\f
0305c755 8045/* getenv built-in spec function.
8046
8047 Returns the value of the environment variable given by its first
8048 argument, concatenated with the second argument. If the
8049 environment variable is not defined, a fatal error is issued. */
8050
8051static const char *
8052getenv_spec_function (int argc, const char **argv)
8053{
8054 char *value;
4b20bbaf 8055 char *result;
8056 char *ptr;
8057 size_t len;
0305c755 8058
8059 if (argc != 2)
8060 return NULL;
8061
8062 value = getenv (argv[0]);
8063 if (!value)
a8c464ac 8064 fatal_error ("environment variable %qs not defined", argv[0]);
0305c755 8065
4b20bbaf 8066 /* We have to escape every character of the environment variable so
f0b5f617 8067 they are not interpreted as active spec characters. A
8068 particularly painful case is when we are reading a variable
4b20bbaf 8069 holding a windows path complete with \ separators. */
8070 len = strlen (value) * 2 + strlen (argv[1]) + 1;
25a1c410 8071 result = XNEWVAR (char, len);
4b20bbaf 8072 for (ptr = result; *value; ptr += 2)
8073 {
8074 ptr[0] = '\\';
8075 ptr[1] = *value++;
8076 }
48e1416a 8077
4b20bbaf 8078 strcpy (ptr, argv[1]);
48e1416a 8079
4b20bbaf 8080 return result;
0305c755 8081}
8082
c21b3276 8083/* if-exists built-in spec function.
8084
8085 Checks to see if the file specified by the absolute pathname in
8086 ARGS exists. Returns that pathname if found.
8087
8088 The usual use for this function is to check for a library file
8089 (whose name has been expanded with %s). */
8090
8091static const char *
952f0048 8092if_exists_spec_function (int argc, const char **argv)
c21b3276 8093{
8094 /* Must have only one argument. */
a5c088d4 8095 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
c21b3276 8096 return argv[0];
8097
8098 return NULL;
8099}
68d74c02 8100
8101/* if-exists-else built-in spec function.
8102
8103 This is like if-exists, but takes an additional argument which
8104 is returned if the first argument does not exist. */
8105
8106static const char *
952f0048 8107if_exists_else_spec_function (int argc, const char **argv)
68d74c02 8108{
8109 /* Must have exactly two arguments. */
8110 if (argc != 2)
8111 return NULL;
8112
a5c088d4 8113 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
68d74c02 8114 return argv[0];
8115
8116 return argv[1];
8117}
2288041e 8118
9e46467d 8119/* sanitize built-in spec function.
8120
8121 This returns non-NULL, if sanitizing address, thread or
8122 any of the undefined behavior sanitizers. */
8123
8124static const char *
8125sanitize_spec_function (int argc, const char **argv)
8126{
8127 if (argc != 1)
8128 return NULL;
8129
8130 if (strcmp (argv[0], "address") == 0)
8131 return (flag_sanitize & SANITIZE_ADDRESS) ? "" : NULL;
8132 if (strcmp (argv[0], "thread") == 0)
8133 return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
8134 if (strcmp (argv[0], "undefined") == 0)
8135 return (flag_sanitize & SANITIZE_UNDEFINED) ? "" : NULL;
8136
8137 return NULL;
8138}
8139
2288041e 8140/* replace-outfile built-in spec function.
9b1f316f 8141
8142 This looks for the first argument in the outfiles array's name and
8143 replaces it with the second argument. */
2288041e 8144
8145static const char *
8146replace_outfile_spec_function (int argc, const char **argv)
8147{
8148 int i;
8149 /* Must have exactly two arguments. */
8150 if (argc != 2)
8151 abort ();
2f2c6aee 8152
2288041e 8153 for (i = 0; i < n_infiles; i++)
8154 {
82715bcd 8155 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
2288041e 8156 outfiles[i] = xstrdup (argv[1]);
8157 }
8158 return NULL;
8159}
8160
8127ab5d 8161/* remove-outfile built-in spec function.
8162 *
8163 * This looks for the first argument in the outfiles array's name and
8164 * removes it. */
8165
8166static const char *
8167remove_outfile_spec_function (int argc, const char **argv)
8168{
8169 int i;
8170 /* Must have exactly one argument. */
8171 if (argc != 1)
8172 abort ();
8173
8174 for (i = 0; i < n_infiles; i++)
8175 {
82715bcd 8176 if (outfiles[i] && !filename_cmp (outfiles[i], argv[0]))
8127ab5d 8177 outfiles[i] = NULL;
8178 }
8179 return NULL;
8180}
8181
2f2c6aee 8182/* Given two version numbers, compares the two numbers.
9b1f316f 8183 A version number must match the regular expression
8184 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8185*/
8186static int
8187compare_version_strings (const char *v1, const char *v2)
8188{
8189 int rresult;
8190 regex_t r;
2f2c6aee 8191
9b1f316f 8192 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8193 REG_EXTENDED | REG_NOSUB) != 0)
8194 abort ();
8195 rresult = regexec (&r, v1, 0, NULL, 0);
8196 if (rresult == REG_NOMATCH)
a8c464ac 8197 fatal_error ("invalid version number %qs", v1);
9b1f316f 8198 else if (rresult != 0)
8199 abort ();
8200 rresult = regexec (&r, v2, 0, NULL, 0);
8201 if (rresult == REG_NOMATCH)
a8c464ac 8202 fatal_error ("invalid version number %qs", v2);
9b1f316f 8203 else if (rresult != 0)
8204 abort ();
8205
8206 return strverscmp (v1, v2);
8207}
8208
8209
8210/* version_compare built-in spec function.
8211
8212 This takes an argument of the following form:
8213
8214 <comparison-op> <arg1> [<arg2>] <switch> <result>
8215
8216 and produces "result" if the comparison evaluates to true,
8217 and nothing if it doesn't.
8218
8219 The supported <comparison-op> values are:
2f2c6aee 8220
9b1f316f 8221 >= true if switch is a later (or same) version than arg1
8222 !> opposite of >=
8223 < true if switch is an earlier version than arg1
8224 !< opposite of <
8225 >< true if switch is arg1 or later, and earlier than arg2
8226 <> true if switch is earlier than arg1 or is arg2 or later
8227
8228 If the switch is not present, the condition is false unless
8229 the first character of the <comparison-op> is '!'.
8230
8231 For example,
8232 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8233 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8234
8235static const char *
8236version_compare_spec_function (int argc, const char **argv)
8237{
8238 int comp1, comp2;
8239 size_t switch_len;
8240 const char *switch_value = NULL;
8241 int nargs = 1, i;
8242 bool result;
8243
8244 if (argc < 3)
a922df2e 8245 fatal_error ("too few arguments to %%:version-compare");
9b1f316f 8246 if (argv[0][0] == '\0')
8247 abort ();
8248 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8249 nargs = 2;
8250 if (argc != nargs + 3)
a922df2e 8251 fatal_error ("too many arguments to %%:version-compare");
9b1f316f 8252
8253 switch_len = strlen (argv[nargs + 1]);
8254 for (i = 0; i < n_switches; i++)
8255 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8256 && check_live_switch (i, switch_len))
8257 switch_value = switches[i].part1 + switch_len;
8258
8259 if (switch_value == NULL)
8260 comp1 = comp2 = -1;
8261 else
8262 {
8263 comp1 = compare_version_strings (switch_value, argv[1]);
8264 if (nargs == 2)
8265 comp2 = compare_version_strings (switch_value, argv[2]);
8266 else
8267 comp2 = -1; /* This value unused. */
8268 }
8269
8270 switch (argv[0][0] << 8 | argv[0][1])
8271 {
8272 case '>' << 8 | '=':
8273 result = comp1 >= 0;
8274 break;
8275 case '!' << 8 | '<':
8276 result = comp1 >= 0 || switch_value == NULL;
8277 break;
8278 case '<' << 8:
8279 result = comp1 < 0;
8280 break;
8281 case '!' << 8 | '>':
8282 result = comp1 < 0 || switch_value == NULL;
8283 break;
8284 case '>' << 8 | '<':
8285 result = comp1 >= 0 && comp2 < 0;
8286 break;
8287 case '<' << 8 | '>':
8288 result = comp1 < 0 || comp2 >= 0;
8289 break;
2f2c6aee 8290
9b1f316f 8291 default:
a8c464ac 8292 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
9b1f316f 8293 }
8294 if (! result)
8295 return NULL;
8296
8297 return argv[nargs + 2];
8298}
1e8e9920 8299
8300/* %:include builtin spec function. This differs from %include in that it
8301 can be nested inside a spec, and thus be conditionalized. It takes
8302 one argument, the filename, and looks for it in the startfile path.
8303 The result is always NULL, i.e. an empty expansion. */
8304
8305static const char *
8306include_spec_function (int argc, const char **argv)
8307{
8308 char *file;
8309
8310 if (argc != 1)
8311 abort ();
8312
f9ebe19f 8313 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
556cfe53 8314 read_specs (file ? file : argv[0], false, false);
1e8e9920 8315
8316 return NULL;
8317}
ceac8e8c 8318
d6bff3e6 8319/* %:find-file spec function. This function replaces its argument by
9d75589a 8320 the file found through find_file, that is the -print-file-name gcc
19bc000d 8321 program option. */
8322static const char *
d6bff3e6 8323find_file_spec_function (int argc, const char **argv)
19bc000d 8324{
8325 const char *file;
8326
8327 if (argc != 1)
8328 abort ();
8329
8330 file = find_file (argv[0]);
8331 return file;
8332}
8333
8334
d6bff3e6 8335/* %:find-plugindir spec function. This function replaces its argument
9d75589a 8336 by the -iplugindir=<dir> option. `dir' is found through find_file, that
d6bff3e6 8337 is the -print-file-name gcc program option. */
8338static const char *
8339find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
8340{
8341 const char *option;
8342
8343 if (argc != 0)
8344 abort ();
8345
8346 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
8347 return option;
8348}
8349
8350
ceac8e8c 8351/* %:print-asm-header spec function. Print a banner to say that the
8352 following output is from the assembler. */
8353
8354static const char *
8355print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8356 const char **argv ATTRIBUTE_UNUSED)
8357{
666137bc 8358 printf (_("Assembler options\n=================\n\n"));
ceac8e8c 8359 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8360 fflush (stdout);
8361 return NULL;
8362}
71278019 8363
0f41df2b 8364/* Get a random number for -frandom-seed */
9845d120 8365
0f41df2b 8366static unsigned HOST_WIDE_INT
8367get_random_number (void)
9845d120 8368{
0f41df2b 8369 unsigned HOST_WIDE_INT ret = 0;
8370 int fd;
8371
8372 fd = open ("/dev/urandom", O_RDONLY);
8373 if (fd >= 0)
8374 {
8375 read (fd, &ret, sizeof (HOST_WIDE_INT));
8376 close (fd);
8377 if (ret)
8378 return ret;
8379 }
9845d120 8380
8381 /* Get some more or less random data. */
8382#ifdef HAVE_GETTIMEOFDAY
8383 {
8384 struct timeval tv;
8385
8386 gettimeofday (&tv, NULL);
8387 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8388 }
8389#else
8390 {
8391 time_t now = time (NULL);
8392
8393 if (now != (time_t)-1)
8394 ret = (unsigned) now;
8395 }
8396#endif
8397
0f41df2b 8398 return ret ^ getpid();
9845d120 8399}
8400
71278019 8401/* %:compare-debug-dump-opt spec function. Save the last argument,
8402 expected to be the last -fdump-final-insns option, or generate a
8403 temporary. */
8404
8405static const char *
8406compare_debug_dump_opt_spec_function (int arg,
8407 const char **argv ATTRIBUTE_UNUSED)
8408{
ce0fdb91 8409 char *ret;
71278019 8410 char *name;
8411 int which;
9845d120 8412 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
71278019 8413
8414 if (arg != 0)
a922df2e 8415 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
71278019 8416
71278019 8417 do_spec_2 ("%{fdump-final-insns=*:%*}");
8418 do_spec_1 (" ", 0, NULL);
8419
f1f41a6c 8420 if (argbuf.length () > 0
8421 && strcmp (argv[argbuf.length () - 1], "."))
71278019 8422 {
9845d120 8423 if (!compare_debug)
8424 return NULL;
8425
f1f41a6c 8426 name = xstrdup (argv[argbuf.length () - 1]);
71278019 8427 ret = NULL;
8428 }
8429 else
8430 {
9845d120 8431 const char *ext = NULL;
8432
f1f41a6c 8433 if (argbuf.length () > 0)
9845d120 8434 {
8435 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8436 ext = ".gkd";
8437 }
8438 else if (!compare_debug)
8439 return NULL;
8440 else
8441 do_spec_2 ("%g.gkd");
71278019 8442
71278019 8443 do_spec_1 (" ", 0, NULL);
71278019 8444
f1f41a6c 8445 gcc_assert (argbuf.length () > 0);
71278019 8446
f1f41a6c 8447 name = concat (argbuf.last (), ext, NULL);
9845d120 8448
8449 ret = concat ("-fdump-final-insns=", name, NULL);
71278019 8450 }
8451
8452 which = compare_debug < 0;
8453 debug_check_temp_file[which] = name;
8454
9845d120 8455 if (!which)
8456 {
0f41df2b 8457 unsigned HOST_WIDE_INT value = get_random_number ();
9845d120 8458
8459 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8460 }
8461
8462 if (*random_seed)
ce0fdb91 8463 {
8464 char *tmp = ret;
8465 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8466 ret, NULL);
8467 free (tmp);
8468 }
9845d120 8469
8470 if (which)
8471 *random_seed = 0;
71278019 8472
8473 return ret;
8474}
8475
8476static const char *debug_auxbase_opt;
8477
8478/* %:compare-debug-self-opt spec function. Expands to the options
8479 that are to be passed in the second compilation of
8480 compare-debug. */
8481
8482static const char *
8483compare_debug_self_opt_spec_function (int arg,
8484 const char **argv ATTRIBUTE_UNUSED)
8485{
8486 if (arg != 0)
a922df2e 8487 fatal_error ("too many arguments to %%:compare-debug-self-opt");
71278019 8488
8489 if (compare_debug >= 0)
8490 return NULL;
8491
8492 do_spec_2 ("%{c|S:%{o*:%*}}");
8493 do_spec_1 (" ", 0, NULL);
8494
f1f41a6c 8495 if (argbuf.length () > 0)
71278019 8496 debug_auxbase_opt = concat ("-auxbase-strip ",
f1f41a6c 8497 argbuf.last (),
71278019 8498 NULL);
8499 else
8500 debug_auxbase_opt = NULL;
8501
8502 return concat ("\
8503%<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8504%<fdump-final-insns=* -w -S -o %j \
8505%{!fcompare-debug-second:-fcompare-debug-second} \
8506", compare_debug_opt, NULL);
8507}
8508
8509/* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8510 options that are to be passed in the second compilation of
8511 compare-debug. It expects, as an argument, the basename of the
8512 current input file name, with the .gk suffix appended to it. */
8513
8514static const char *
8515compare_debug_auxbase_opt_spec_function (int arg,
8516 const char **argv)
8517{
8518 char *name;
8519 int len;
8520
8521 if (arg == 0)
a922df2e 8522 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
71278019 8523
8524 if (arg != 1)
a922df2e 8525 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
71278019 8526
8527 if (compare_debug >= 0)
8528 return NULL;
8529
8530 len = strlen (argv[0]);
8531 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
a922df2e 8532 fatal_error ("argument to %%:compare-debug-auxbase-opt "
8533 "does not end in .gk");
71278019 8534
8535 if (debug_auxbase_opt)
8536 return debug_auxbase_opt;
8537
8538#define OPT "-auxbase "
8539
8540 len -= 3;
8541 name = (char*) xmalloc (sizeof (OPT) + len);
8542 memcpy (name, OPT, sizeof (OPT) - 1);
8543 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8544 name[sizeof (OPT) - 1 + len] = '\0';
8545
9845d120 8546#undef OPT
8547
71278019 8548 return name;
8549}
280f8649 8550
8551/* %:pass-through-libs spec function. Finds all -l options and input
8552 file names in the lib spec passed to it, and makes a list of them
8553 prepended with the plugin option to cause them to be passed through
8554 to the final link after all the new object files have been added. */
8555
8556const char *
8557pass_through_libs_spec_func (int argc, const char **argv)
8558{
8559 char *prepended = xstrdup (" ");
8560 int n;
8561 /* Shlemiel the painter's algorithm. Innately horrible, but at least
8562 we know that there will never be more than a handful of strings to
8563 concat, and it's only once per run, so it's not worth optimising. */
8564 for (n = 0; n < argc; n++)
8565 {
8566 char *old = prepended;
8567 /* Anything that isn't an option is a full path to an output
8568 file; pass it through if it ends in '.a'. Among options,
8569 pass only -l. */
8570 if (argv[n][0] == '-' && argv[n][1] == 'l')
8571 {
8572 const char *lopt = argv[n] + 2;
8573 /* Handle both joined and non-joined -l options. If for any
8574 reason there's a trailing -l with no joined or following
8575 arg just discard it. */
8576 if (!*lopt && ++n >= argc)
8577 break;
8578 else if (!*lopt)
8579 lopt = argv[n];
8580 prepended = concat (prepended, "-plugin-opt=-pass-through=-l",
8581 lopt, " ", NULL);
8582 }
8583 else if (!strcmp (".a", argv[n] + strlen (argv[n]) - 2))
8584 {
8585 prepended = concat (prepended, "-plugin-opt=-pass-through=",
8586 argv[n], " ", NULL);
8587 }
8588 if (prepended != old)
8589 free (old);
8590 }
8591 return prepended;
8592}
b35329c7 8593
8594/* %:replace-extension spec function. Replaces the extension of the
8595 first argument with the second argument. */
8596
8597const char *
8598replace_extension_spec_func (int argc, const char **argv)
8599{
8600 char *name;
8601 char *p;
8602 char *result;
8603 int i;
8604
8605 if (argc != 2)
8606 fatal_error ("too few arguments to %%:replace-extension");
8607
8608 name = xstrdup (argv[0]);
8609
8610 for (i = strlen(name) - 1; i >= 0; i--)
8611 if (IS_DIR_SEPARATOR (name[i]))
8612 break;
8613
8614 p = strrchr (name + i + 1, '.');
8615 if (p != NULL)
8616 *p = '\0';
8617
8618 result = concat (name, argv[1], NULL);
8619
8620 free (name);
8621 return result;
8622}
40c059b1 8623
8624/* Insert backslash before spaces in ORIG (usually a file path), to
8625 avoid being broken by spec parser.
8626
8627 This function is needed as do_spec_1 treats white space (' ' and '\t')
8628 as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
8629 the file name should be treated as a single argument rather than being
8630 broken into multiple. Solution is to insert '\\' before the space in a
8631 file name.
8632
8633 This function converts and only converts all occurrence of ' '
8634 to '\\' + ' ' and '\t' to '\\' + '\t'. For example:
8635 "a b" -> "a\\ b"
8636 "a b" -> "a\\ \\ b"
8637 "a\tb" -> "a\\\tb"
8638 "a\\ b" -> "a\\\\ b"
8639
8640 orig: input null-terminating string that was allocated by xalloc. The
8641 memory it points to might be freed in this function. Behavior undefined
8642 if ORIG wasn't xalloced or was freed already at entry.
8643
8644 Return: ORIG if no conversion needed. Otherwise a newly allocated string
8645 that was converted from ORIG. */
8646
8647static char *
8648convert_white_space (char *orig)
8649{
8650 int len, number_of_space = 0;
8651
8652 for (len = 0; orig[len]; len++)
8653 if (orig[len] == ' ' || orig[len] == '\t') number_of_space++;
8654
8655 if (number_of_space)
8656 {
8657 char *new_spec = (char *) xmalloc (len + number_of_space + 1);
8658 int j, k;
8659 for (j = 0, k = 0; j <= len; j++, k++)
8660 {
8661 if (orig[j] == ' ' || orig[j] == '\t')
8662 new_spec[k++] = '\\';
8663 new_spec[k] = orig[j];
8664 }
8665 free (orig);
8666 return new_spec;
8667 }
8668 else
8669 return orig;
8670}