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