Bug Summary

File:build/gcc/gcc.c
Warning:line 5123, column 16
Although the value stored to 'temp' is used in the enclosing expression, the value is never actually read from 'temp'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name gcc.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model static -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib64/clang/11.0.0 -D STANDARD_STARTFILE_PREFIX="../../../" -D STANDARD_EXEC_PREFIX="/usr/local/lib/gcc/" -D STANDARD_LIBEXEC_PREFIX="/usr/local/libexec/gcc/" -D DEFAULT_TARGET_VERSION="11.0.0" -D DEFAULT_REAL_TARGET_MACHINE="x86_64-pc-linux-gnu" -D DEFAULT_TARGET_MACHINE="x86_64-pc-linux-gnu" -D STANDARD_BINDIR_PREFIX="/usr/local/bin/" -D TOOLDIR_BASE_PREFIX="../../../../" -D ACCEL_DIR_SUFFIX="" -D ENABLE_SHARED_LIBGCC -D CONFIGURE_SPECS="" -D TOOL_INCLUDE_DIR="/usr/local/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../x86_64-pc-linux-gnu/include" -D NATIVE_SYSTEM_HEADER_DIR="/usr/include" -D BASEVER="11.0.0" -D IN_GCC -D HAVE_CONFIG_H -I . -I . -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/. -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../include -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcpp/include -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcody -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber/bid -I ../libdecnumber -I /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libbacktrace -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/x86_64-suse-linux -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/10/../../../../include/c++/10/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib64/clang/11.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-narrowing -Wwrite-strings -Wno-error=format-diag -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fdeprecated-macro -fdebug-compilation-dir /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=plist-html -analyzer-config silence-checkers=core.NullDereference -faddrsig -o /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/clang-static-analyzer/2021-01-16-135054-17580-1/report-HhL6n8.plist -x c++ /home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c
1/* Compiler driver program that can handle many languages.
2 Copyright (C) 1987-2021 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
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
8Software Foundation; either version 3, or (at your option) any later
9version.
10
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.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
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". */
29
30#include "config.h"
31#include "system.h"
32#include "coretypes.h"
33#include "multilib.h" /* before tm.h */
34#include "tm.h"
35#include "xregex.h"
36#include "obstack.h"
37#include "intl.h"
38#include "prefix.h"
39#include "opt-suggestions.h"
40#include "gcc.h"
41#include "diagnostic.h"
42#include "flags.h"
43#include "opts.h"
44#include "filenames.h"
45#include "spellcheck.h"
46
47
48
49/* Manage the manipulation of env vars.
50
51 We poison "getenv" and "putenv", so that all enviroment-handling is
52 done through this class. Note that poisoning happens in the
53 preprocessor at the identifier level, and doesn't distinguish between
54 env.getenv ();
55 and
56 getenv ();
57 Hence we need to use "get" for the accessor method, not "getenv". */
58
59struct env_manager
60{
61 public:
62 void init (bool can_restore, bool debug);
63 const char *get (const char *name);
64 void xput (const char *string);
65 void restore ();
66
67 private:
68 bool m_can_restore;
69 bool m_debug;
70 struct kv
71 {
72 char *m_key;
73 char *m_value;
74 };
75 vec<kv> m_keys;
76
77};
78
79/* The singleton instance of class env_manager. */
80
81static env_manager env;
82
83/* Initializer for class env_manager.
84
85 We can't do this as a constructor since we have a statically
86 allocated instance ("env" above). */
87
88void
89env_manager::init (bool can_restore, bool debug)
90{
91 m_can_restore = can_restore;
92 m_debug = debug;
93}
94
95/* Get the value of NAME within the environment. Essentially
96 a wrapper for ::getenv, but adding logging, and the possibility
97 of caching results. */
98
99const char *
100env_manager::get (const char *name)
101{
102 const char *result = ::getenv (name);
103 if (m_debug)
104 fprintf (stderrstderr, "env_manager::getenv (%s) -> %s\n", name, result);
105 return result;
106}
107
108/* Put the given KEY=VALUE entry STRING into the environment.
109 If the env_manager was initialized with CAN_RESTORE set, then
110 also record the old value of KEY within the environment, so that it
111 can be later restored. */
112
113void
114env_manager::xput (const char *string)
115{
116 if (m_debug)
117 fprintf (stderrstderr, "env_manager::xput (%s)\n", string);
118 if (verbose_flagglobal_options.x_verbose_flag)
119 fnotice (stderrstderr, "%s\n", string);
120
121 if (m_can_restore)
122 {
123 char *equals = strchr (const_cast <char *> (string), '=');
124 gcc_assert (equals)((void)(!(equals) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 124, __FUNCTION__), 0 : 0))
;
125
126 struct kv kv;
127 kv.m_key = xstrndup (string, equals - string);
128 const char *cur_value = ::getenv (kv.m_key);
129 if (m_debug)
130 fprintf (stderrstderr, "saving old value: %s\n",cur_value);
131 kv.m_value = cur_value ? xstrdup (cur_value) : NULL__null;
132 m_keys.safe_push (kv);
133 }
134
135 ::putenv (CONST_CAST (char *, string)(const_cast<char *> ((string))));
136}
137
138/* Undo any xputenv changes made since last restore.
139 Can only be called if the env_manager was initialized with
140 CAN_RESTORE enabled. */
141
142void
143env_manager::restore ()
144{
145 unsigned int i;
146 struct kv *item;
147
148 gcc_assert (m_can_restore)((void)(!(m_can_restore) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 148, __FUNCTION__), 0 : 0))
;
149
150 FOR_EACH_VEC_ELT_REVERSE (m_keys, i, item)for (i = (m_keys).length () - 1; (m_keys).iterate ((i), &
(item)); (i)--)
151 {
152 if (m_debug)
153 printf ("restoring saved key: %s value: %s\n", item->m_key, item->m_value);
154 if (item->m_value)
155 ::setenv (item->m_key, item->m_value, 1);
156 else
157 ::unsetenv (item->m_key);
158 free (item->m_key);
159 free (item->m_value);
160 }
161
162 m_keys.truncate (0);
163}
164
165/* Forbid other uses of getenv and putenv. */
166#if (GCC_VERSION(4 * 1000 + 2) >= 3000)
167#pragma GCC poison getenv putenv
168#endif
169
170
171
172/* By default there is no special suffix for target executables. */
173#ifdef TARGET_EXECUTABLE_SUFFIX""
174#define HAVE_TARGET_EXECUTABLE_SUFFIX
175#else
176#define TARGET_EXECUTABLE_SUFFIX"" ""
177#endif
178
179/* By default there is no special suffix for host executables. */
180#ifdef HOST_EXECUTABLE_SUFFIX""
181#define HAVE_HOST_EXECUTABLE_SUFFIX
182#else
183#define HOST_EXECUTABLE_SUFFIX"" ""
184#endif
185
186/* By default, the suffix for target object files is ".o". */
187#ifdef TARGET_OBJECT_SUFFIX".o"
188#define HAVE_TARGET_OBJECT_SUFFIX
189#else
190#define TARGET_OBJECT_SUFFIX".o" ".o"
191#endif
192
193static const char dir_separator_str[] = { DIR_SEPARATOR'/', 0 };
194
195/* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
196#ifndef LIBRARY_PATH_ENV"LIBRARY_PATH"
197#define LIBRARY_PATH_ENV"LIBRARY_PATH" "LIBRARY_PATH"
198#endif
199
200/* If a stage of compilation returns an exit status >= 1,
201 compilation of that file ceases. */
202
203#define MIN_FATAL_STATUS1 1
204
205/* Flag set by cppspec.c to 1. */
206int is_cpp_driver;
207
208/* Flag set to nonzero if an @file argument has been supplied to gcc. */
209static bool at_file_supplied;
210
211/* Definition of string containing the arguments given to configure. */
212#include "configargs.h"
213
214/* Flag saying to print the command line options understood by gcc and its
215 sub-processes. */
216
217static int print_help_list;
218
219/* Flag saying to print the version of gcc and its sub-processes. */
220
221static int print_version;
222
223/* Flag that stores string prefix for which we provide bash completion. */
224
225static const char *completion = NULL__null;
226
227/* Flag indicating whether we should ONLY print the command and
228 arguments (like verbose_flag) without executing the command.
229 Displayed arguments are quoted so that the generated command
230 line is suitable for execution. This is intended for use in
231 shell scripts to capture the driver-generated command line. */
232static int verbose_only_flag;
233
234/* Flag indicating how to print command line options of sub-processes. */
235
236static int print_subprocess_help;
237
238/* Linker suffix passed to -fuse-ld=... */
239static const char *use_ld;
240
241/* Whether we should report subprocess execution times to a file. */
242
243FILE *report_times_to_file = NULL__null;
244
245/* Nonzero means place this string before uses of /, so that include
246 and library files can be found in an alternate location. */
247
248#ifdef TARGET_SYSTEM_ROOT
249#define DEFAULT_TARGET_SYSTEM_ROOT(0) (TARGET_SYSTEM_ROOT)
250#else
251#define DEFAULT_TARGET_SYSTEM_ROOT(0) (0)
252#endif
253static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT(0);
254
255/* Nonzero means pass the updated target_system_root to the compiler. */
256
257static int target_system_root_changed;
258
259/* Nonzero means append this string to target_system_root. */
260
261static const char *target_sysroot_suffix = 0;
262
263/* Nonzero means append this string to target_system_root for headers. */
264
265static const char *target_sysroot_hdrs_suffix = 0;
266
267/* Nonzero means write "temp" files in source directory
268 and use the source file's name in them, and don't delete them. */
269
270static enum save_temps {
271 SAVE_TEMPS_NONE, /* no -save-temps */
272 SAVE_TEMPS_CWD, /* -save-temps in current directory */
273 SAVE_TEMPS_DUMP, /* -save-temps in dumpdir */
274 SAVE_TEMPS_OBJ /* -save-temps in object directory */
275} save_temps_flag;
276
277/* Set this iff the dumppfx implied by a -save-temps=* option is to
278 override a -dumpdir option, if any. */
279static bool save_temps_overrides_dumpdir = false;
280
281/* -dumpdir, -dumpbase and -dumpbase-ext flags passed in, possibly
282 rearranged as they are to be passed down, e.g., dumpbase and
283 dumpbase_ext may be cleared if integrated with dumpdir or
284 dropped. */
285static char *dumpdir, *dumpbase, *dumpbase_ext;
286
287/* Usually the length of the string in dumpdir. However, during
288 linking, it may be shortened to omit a driver-added trailing dash,
289 by then replaced with a trailing period, that is still to be passed
290 to sub-processes in -dumpdir, but not to be generally used in spec
291 filename expansions. See maybe_run_linker. */
292static size_t dumpdir_length = 0;
293
294/* Set if the last character in dumpdir is (or was) a dash that the
295 driver added to dumpdir after dumpbase or linker output name. */
296static bool dumpdir_trailing_dash_added = false;
297
298/* Basename of dump and aux outputs, computed from dumpbase (given or
299 derived from output name), to override input_basename in non-%w %b
300 et al. */
301static char *outbase;
302static size_t outbase_length = 0;
303
304/* The compiler version. */
305
306static const char *compiler_version;
307
308/* The target version. */
309
310static const char *const spec_version = DEFAULT_TARGET_VERSION"11.0.0";
311
312/* The target machine. */
313
314static const char *spec_machine = DEFAULT_TARGET_MACHINE"x86_64-pc-linux-gnu";
315static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE"x86_64-pc-linux-gnu";
316
317/* List of offload targets. Separated by colon. Empty string for
318 -foffload=disable. */
319
320static char *offload_targets = NULL__null;
321
322/* Nonzero if cross-compiling.
323 When -b is used, the value comes from the `specs' file. */
324
325#ifdef CROSS_DIRECTORY_STRUCTURE
326static const char *cross_compile = "1";
327#else
328static const char *cross_compile = "0";
329#endif
330
331/* Greatest exit code of sub-processes that has been encountered up to
332 now. */
333static int greatest_status = 1;
334
335/* This is the obstack which we use to allocate many strings. */
336
337static struct obstack obstack;
338
339/* This is the obstack to build an environment variable to pass to
340 collect2 that describes all of the relevant switches of what to
341 pass the compiler in building the list of pointers to constructors
342 and destructors. */
343
344static struct obstack collect_obstack;
345
346/* Forward declaration for prototypes. */
347struct path_prefix;
348struct prefix_list;
349
350static void init_spec (void);
351static void store_arg (const char *, int, int);
352static void insert_wrapper (const char *);
353static char *load_specs (const char *);
354static void read_specs (const char *, bool, bool);
355static void set_spec (const char *, const char *, bool);
356static struct compiler *lookup_compiler (const char *, size_t, const char *);
357static char *build_search_list (const struct path_prefix *, const char *,
358 bool, bool);
359static void xputenv (const char *);
360static void putenv_from_prefixes (const struct path_prefix *, const char *,
361 bool);
362static int access_check (const char *, int);
363static char *find_a_file (const struct path_prefix *, const char *, int, bool);
364static void add_prefix (struct path_prefix *, const char *, const char *,
365 int, int, int);
366static void add_sysrooted_prefix (struct path_prefix *, const char *,
367 const char *, int, int, int);
368static char *skip_whitespace (char *);
369static void delete_if_ordinary (const char *);
370static void delete_temp_files (void);
371static void delete_failure_queue (void);
372static void clear_failure_queue (void);
373static int check_live_switch (int, int);
374static const char *handle_braces (const char *);
375static inline bool input_suffix_matches (const char *, const char *);
376static inline bool switch_matches (const char *, const char *, int);
377static inline void mark_matching_switches (const char *, const char *, int);
378static inline void process_marked_switches (void);
379static const char *process_brace_body (const char *, const char *, const char *, int, int);
380static const struct spec_function *lookup_spec_function (const char *);
381static const char *eval_spec_function (const char *, const char *, const char *);
382static const char *handle_spec_function (const char *, bool *, const char *);
383static char *save_string (const char *, int);
384static void set_collect_gcc_options (void);
385static int do_spec_1 (const char *, int, const char *);
386static int do_spec_2 (const char *, const char *);
387static void do_option_spec (const char *, const char *);
388static void do_self_spec (const char *);
389static const char *find_file (const char *);
390static int is_directory (const char *, bool);
391static const char *validate_switches (const char *, bool, bool);
392static void validate_all_switches (void);
393static inline void validate_switches_from_spec (const char *, bool);
394static void give_switch (int, int);
395static int default_arg (const char *, int);
396static void set_multilib_dir (void);
397static void print_multilib_info (void);
398static void display_help (void);
399static void add_preprocessor_option (const char *, int);
400static void add_assembler_option (const char *, int);
401static void add_linker_option (const char *, int);
402static void process_command (unsigned int, struct cl_decoded_option *);
403static int execute (void);
404static void alloc_args (void);
405static void clear_args (void);
406static void fatal_signal (int);
407#if defined(ENABLE_SHARED_LIBGCC1) && !defined(REAL_LIBGCC_SPEC)
408static void init_gcc_specs (struct obstack *, const char *, const char *,
409 const char *);
410#endif
411#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
412static const char *convert_filename (const char *, int, int);
413#endif
414
415static void try_generate_repro (const char **argv);
416static const char *getenv_spec_function (int, const char **);
417static const char *if_exists_spec_function (int, const char **);
418static const char *if_exists_else_spec_function (int, const char **);
419static const char *if_exists_then_else_spec_function (int, const char **);
420static const char *sanitize_spec_function (int, const char **);
421static const char *replace_outfile_spec_function (int, const char **);
422static const char *remove_outfile_spec_function (int, const char **);
423static const char *version_compare_spec_function (int, const char **);
424static const char *include_spec_function (int, const char **);
425static const char *find_file_spec_function (int, const char **);
426static const char *find_plugindir_spec_function (int, const char **);
427static const char *print_asm_header_spec_function (int, const char **);
428static const char *compare_debug_dump_opt_spec_function (int, const char **);
429static const char *compare_debug_self_opt_spec_function (int, const char **);
430static const char *pass_through_libs_spec_func (int, const char **);
431static const char *dumps_spec_func (int, const char **);
432static const char *greater_than_spec_func (int, const char **);
433static const char *debug_level_greater_than_spec_func (int, const char **);
434static const char *dwarf_version_greater_than_spec_func (int, const char **);
435static const char *find_fortran_preinclude_file (int, const char **);
436static char *convert_white_space (char *);
437static char *quote_spec (char *);
438static char *quote_spec_arg (char *);
439static bool not_actual_file_p (const char *);
440
441
442/* The Specs Language
443
444Specs are strings containing lines, each of which (if not blank)
445is made up of a program name, and arguments separated by spaces.
446The program name must be exact and start from root, since no path
447is searched and it is unreliable to depend on the current working directory.
448Redirection of input or output is not supported; the subprograms must
449accept filenames saying what files to read and write.
450
451In addition, the specs can contain %-sequences to substitute variable text
452or for conditional text. Here is a table of all defined %-sequences.
453Note that spaces are not generated automatically around the results of
454expanding these sequences; therefore, you can concatenate them together
455or with constant text in a single argument.
456
457 %% substitute one % into the program name or argument.
458 %" substitute an empty argument.
459 %i substitute the name of the input file being processed.
460 %b substitute the basename for outputs related with the input file
461 being processed. This is often a substring of the input file name,
462 up to (and not including) the last period but, unless %w is active,
463 it is affected by the directory selected by -save-temps=*, by
464 -dumpdir, and, in case of multiple compilations, even by -dumpbase
465 and -dumpbase-ext and, in case of linking, by the linker output
466 name. When %w is active, it derives the main output name only from
467 the input file base name; when it is not, it names aux/dump output
468 file.
469 %B same as %b, but include the input file suffix (text after the last
470 period).
471 %gSUFFIX
472 substitute a file name that has suffix SUFFIX and is chosen
473 once per compilation, and mark the argument a la %d. To reduce
474 exposure to denial-of-service attacks, the file name is now
475 chosen in a way that is hard to predict even when previously
476 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
477 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
478 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
479 had been pre-processed. Previously, %g was simply substituted
480 with a file name chosen once per compilation, without regard
481 to any appended suffix (which was therefore treated just like
482 ordinary text), making such attacks more likely to succeed.
483 %|SUFFIX
484 like %g, but if -pipe is in effect, expands simply to "-".
485 %mSUFFIX
486 like %g, but if -pipe is in effect, expands to nothing. (We have both
487 %| and %m to accommodate differences between system assemblers; see
488 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
489 %uSUFFIX
490 like %g, but generates a new temporary file name even if %uSUFFIX
491 was already seen.
492 %USUFFIX
493 substitutes the last file name generated with %uSUFFIX, generating a
494 new one if there is no such last file name. In the absence of any
495 %uSUFFIX, this is just like %gSUFFIX, except they don't share
496 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
497 would involve the generation of two distinct file names, one
498 for each `%g.s' and another for each `%U.s'. Previously, %U was
499 simply substituted with a file name chosen for the previous %u,
500 without regard to any appended suffix.
501 %jSUFFIX
502 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
503 writable, and if save-temps is off; otherwise, substitute the name
504 of a temporary file, just like %u. This temporary file is not
505 meant for communication between processes, but rather as a junk
506 disposal mechanism.
507 %.SUFFIX
508 substitutes .SUFFIX for the suffixes of a matched switch's args when
509 it is subsequently output with %*. SUFFIX is terminated by the next
510 space or %.
511 %d marks the argument containing or following the %d as a
512 temporary file name, so that file will be deleted if GCC exits
513 successfully. Unlike %g, this contributes no text to the argument.
514 %w marks the argument containing or following the %w as the
515 "output file" of this compilation. This puts the argument
516 into the sequence of arguments that %o will substitute later.
517 %V indicates that this compilation produces no "output file".
518 %W{...}
519 like %{...} but marks the last argument supplied within as a file
520 to be deleted on failure.
521 %@{...}
522 like %{...} but puts the result into a FILE and substitutes @FILE
523 if an @file argument has been supplied.
524 %o substitutes the names of all the output files, with spaces
525 automatically placed around them. You should write spaces
526 around the %o as well or the results are undefined.
527 %o is for use in the specs for running the linker.
528 Input files whose names have no recognized suffix are not compiled
529 at all, but they are included among the output files, so they will
530 be linked.
531 %O substitutes the suffix for object files. Note that this is
532 handled specially when it immediately follows %g, %u, or %U
533 (with or without a suffix argument) because of the need for
534 those to form complete file names. The handling is such that
535 %O is treated exactly as if it had already been substituted,
536 except that %g, %u, and %U do not currently support additional
537 SUFFIX characters following %O as they would following, for
538 example, `.o'.
539 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
540 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
541 and -B options) and -imultilib as necessary.
542 %s current argument is the name of a library or startup file of some sort.
543 Search for that file in a standard list of directories
544 and substitute the full name found.
545 %T current argument is the name of a linker script.
546 Search for that file in the current list of directories to scan for
547 libraries. If the file is located, insert a --script option into the
548 command line followed by the full path name found. If the file is
549 not found then generate an error message.
550 Note: the current working directory is not searched.
551 %eSTR Print STR as an error message. STR is terminated by a newline.
552 Use this when inconsistent options are detected.
553 %nSTR Print STR as a notice. STR is terminated by a newline.
554 %x{OPTION} Accumulate an option for %X.
555 %X Output the accumulated linker options specified by compilations.
556 %Y Output the accumulated assembler options specified by compilations.
557 %Z Output the accumulated preprocessor options specified by compilations.
558 %a process ASM_SPEC as a spec.
559 This allows config.h to specify part of the spec for running as.
560 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
561 used here. This can be used to run a post-processor after the
562 assembler has done its job.
563 %D Dump out a -L option for each directory in startfile_prefixes.
564 If multilib_dir is set, extra entries are generated with it affixed.
565 %l process LINK_SPEC as a spec.
566 %L process LIB_SPEC as a spec.
567 %M Output multilib_os_dir.
568 %G process LIBGCC_SPEC as a spec.
569 %R Output the concatenation of target_system_root and
570 target_sysroot_suffix.
571 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
572 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
573 %C process CPP_SPEC as a spec.
574 %1 process CC1_SPEC as a spec.
575 %2 process CC1PLUS_SPEC as a spec.
576 %* substitute the variable part of a matched option. (See below.)
577 Note that each comma in the substituted string is replaced by
578 a single space. A space is appended after the last substition
579 unless there is more text in current sequence.
580 %<S remove all occurrences of -S from the command line.
581 Note - this command is position dependent. % commands in the
582 spec string before this one will see -S, % commands in the
583 spec string after this one will not.
584 %>S Similar to "%<S", but keep it in the GCC command line.
585 %<S* remove all occurrences of all switches beginning with -S from the
586 command line.
587 %:function(args)
588 Call the named function FUNCTION, passing it ARGS. ARGS is
589 first processed as a nested spec string, then split into an
590 argument vector in the usual fashion. The function returns
591 a string which is processed as if it had appeared literally
592 as part of the current spec.
593 %{S} substitutes the -S switch, if that switch was given to GCC.
594 If that switch was not specified, this substitutes nothing.
595 Here S is a metasyntactic variable.
596 %{S*} substitutes all the switches specified to GCC whose names start
597 with -S. This is used for -o, -I, etc; switches that take
598 arguments. GCC considers `-o foo' as being one switch whose
599 name starts with `o'. %{o*} would substitute this text,
600 including the space; thus, two arguments would be generated.
601 %{S*&T*} likewise, but preserve order of S and T options (the order
602 of S and T in the spec is not significant). Can be any number
603 of ampersand-separated variables; for each the wild card is
604 optional. Useful for CPP as %{D*&U*&A*}.
605
606 %{S:X} substitutes X, if the -S switch was given to GCC.
607 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
608 %{S*:X} substitutes X if one or more switches whose names start
609 with -S was given to GCC. Normally X is substituted only
610 once, no matter how many such switches appeared. However,
611 if %* appears somewhere in X, then X will be substituted
612 once for each matching switch, with the %* replaced by the
613 part of that switch that matched the '*'. A space will be
614 appended after the last substition unless there is more
615 text in current sequence.
616 %{.S:X} substitutes X, if processing a file with suffix S.
617 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
618 %{,S:X} substitutes X, if processing a file which will use spec S.
619 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
620
621 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
622 combined with '!', '.', ',', and '*' as above binding stronger
623 than the OR.
624 If %* appears in X, all of the alternatives must be starred, and
625 only the first matching alternative is substituted.
626 %{%:function(args):X}
627 Call function named FUNCTION with args ARGS. If the function
628 returns non-NULL, then X is substituted, if it returns
629 NULL, it isn't substituted.
630 %{S:X; if S was given to GCC, substitutes X;
631 T:Y; else if T was given to GCC, substitutes Y;
632 :D} else substitutes D. There can be as many clauses as you need.
633 This may be combined with '.', '!', ',', '|', and '*' as above.
634
635 %(Spec) processes a specification defined in a specs file as *Spec:
636
637The switch matching text S in a %{S}, %{S:X}, or similar construct can use
638a backslash to ignore the special meaning of the character following it,
639thus allowing literal matching of a character that is otherwise specially
640treated. For example, %{std=iso9899\:1999:X} substitutes X if the
641-std=iso9899:1999 option is given.
642
643The conditional text X in a %{S:X} or similar construct may contain
644other nested % constructs or spaces, or even newlines. They are
645processed as usual, as described above. Trailing white space in X is
646ignored. White space may also appear anywhere on the left side of the
647colon in these constructs, except between . or * and the corresponding
648word.
649
650The -O, -f, -g, -m, and -W switches are handled specifically in these
651constructs. If another value of -O or the negated form of a -f, -m, or
652-W switch is found later in the command line, the earlier switch
653value is ignored, except with {S*} where S is just one letter; this
654passes all matching options.
655
656The character | at the beginning of the predicate text is used to indicate
657that a command should be piped to the following command, but only if -pipe
658is specified.
659
660Note that it is built into GCC which switches take arguments and which
661do not. You might think it would be useful to generalize this to
662allow each compiler's spec to say which switches take arguments. But
663this cannot be done in a consistent fashion. GCC cannot even decide
664which input files have been specified without knowing which switches
665take arguments, and it must know which input files to compile in order
666to tell which compilers to run.
667
668GCC also knows implicitly that arguments starting in `-l' are to be
669treated as compiler output files, and passed to the linker in their
670proper position among the other output files. */
671
672/* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
673
674/* config.h can define ASM_SPEC to provide extra args to the assembler
675 or extra switch-translations. */
676#ifndef ASM_SPEC"%{" "m16|m32" ":--32} %{" "m16|m32|mx32:;" ":--64} %{" "mx32"
":--x32} %{msse2avx:%{!mavx:-msse2avx}}"
677#define ASM_SPEC"%{" "m16|m32" ":--32} %{" "m16|m32|mx32:;" ":--64} %{" "mx32"
":--x32} %{msse2avx:%{!mavx:-msse2avx}}"
""
678#endif
679
680/* config.h can define ASM_FINAL_SPEC to run a post processor after
681 the assembler has run. */
682#ifndef ASM_FINAL_SPEC"%{gsplit-dwarf: \n objcopy --extract-dwo %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} %b.dwo \n objcopy --strip-dwo %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} }"
683#define ASM_FINAL_SPEC"%{gsplit-dwarf: \n objcopy --extract-dwo %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} %b.dwo \n objcopy --strip-dwo %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} }" \
684 "%{gsplit-dwarf: \n\
685 objcopy --extract-dwo \
686 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
687 %b.dwo \n\
688 objcopy --strip-dwo \
689 %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} \
690 }"
691#endif
692
693/* config.h can define CPP_SPEC to provide extra args to the C preprocessor
694 or extra switch-translations. */
695#ifndef CPP_SPEC"%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
696#define CPP_SPEC"%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}" ""
697#endif
698
699/* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
700 or extra switch-translations. */
701#ifndef CC1_SPEC"%{" "!mandroid" "|tno-android-cc:" "%(cc1_cpu) %{profile:-p}"
";:" "%(cc1_cpu) %{profile:-p}" " " "%{!mglibc:%{!muclibc:%{!mbionic: -mbionic}}} "
"%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: -fPIC}}}}" "}"
702#define CC1_SPEC"%{" "!mandroid" "|tno-android-cc:" "%(cc1_cpu) %{profile:-p}"
";:" "%(cc1_cpu) %{profile:-p}" " " "%{!mglibc:%{!muclibc:%{!mbionic: -mbionic}}} "
"%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: -fPIC}}}}" "}"
""
703#endif
704
705/* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
706 or extra switch-translations. */
707#ifndef CC1PLUS_SPEC""
708#define CC1PLUS_SPEC"" ""
709#endif
710
711/* config.h can define LINK_SPEC to provide extra args to the linker
712 or extra switch-translations. */
713#ifndef LINK_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{" "m16|m32|mx32:;" ":-m "
"elf_x86_64" "} %{" "m16|m32" ":-m " "elf_i386"
"} %{" "mx32" ":-m " "elf32_x86_64" "} %{shared:-shared} %{!shared: %{!static: %{!static-pie: %{rdynamic:-export-dynamic} %{"
"m16|m32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker" ";:%{" "mmusl" ":"
"/lib/ld-musl-i386.so.1" ";:" "/lib/ld-linux.so.2" "}}}" "} %{"
"m16|m32|mx32:;" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld64-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker64" ";:%{" "mmusl" ":"
"/lib/ld-musl-x86_64.so.1" ";:" "/lib64/ld-linux-x86-64.so.2"
"}}}" "} %{" "mx32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ldx32-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linkerx32" ";:%{" "mmusl" ":"
"/lib/ld-musl-x32.so.1" ";:" "/libx32/ld-linux-x32.so.2" "}}}"
"}}} %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}"
";:" "%{" "m16|m32|mx32:;" ":-m " "elf_x86_64" "} %{"
"m16|m32" ":-m " "elf_i386" "} %{" "mx32"
":-m " "elf32_x86_64" "} %{shared:-shared} %{!shared: %{!static: %{!static-pie: %{rdynamic:-export-dynamic} %{"
"m16|m32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker" ";:%{" "mmusl" ":"
"/lib/ld-musl-i386.so.1" ";:" "/lib/ld-linux.so.2" "}}}" "} %{"
"m16|m32|mx32:;" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld64-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker64" ";:%{" "mmusl" ":"
"/lib/ld-musl-x86_64.so.1" ";:" "/lib64/ld-linux-x86-64.so.2"
"}}}" "} %{" "mx32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ldx32-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linkerx32" ";:%{" "mmusl" ":"
"/lib/ld-musl-x32.so.1" ";:" "/libx32/ld-linux-x32.so.2" "}}}"
"}}} %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}"
" " "%{shared: -Bsymbolic}" "}"
714#define LINK_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{" "m16|m32|mx32:;" ":-m "
"elf_x86_64" "} %{" "m16|m32" ":-m " "elf_i386"
"} %{" "mx32" ":-m " "elf32_x86_64" "} %{shared:-shared} %{!shared: %{!static: %{!static-pie: %{rdynamic:-export-dynamic} %{"
"m16|m32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker" ";:%{" "mmusl" ":"
"/lib/ld-musl-i386.so.1" ";:" "/lib/ld-linux.so.2" "}}}" "} %{"
"m16|m32|mx32:;" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld64-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker64" ";:%{" "mmusl" ":"
"/lib/ld-musl-x86_64.so.1" ";:" "/lib64/ld-linux-x86-64.so.2"
"}}}" "} %{" "mx32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ldx32-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linkerx32" ";:%{" "mmusl" ":"
"/lib/ld-musl-x32.so.1" ";:" "/libx32/ld-linux-x32.so.2" "}}}"
"}}} %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}"
";:" "%{" "m16|m32|mx32:;" ":-m " "elf_x86_64" "} %{"
"m16|m32" ":-m " "elf_i386" "} %{" "mx32"
":-m " "elf32_x86_64" "} %{shared:-shared} %{!shared: %{!static: %{!static-pie: %{rdynamic:-export-dynamic} %{"
"m16|m32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker" ";:%{" "mmusl" ":"
"/lib/ld-musl-i386.so.1" ";:" "/lib/ld-linux.so.2" "}}}" "} %{"
"m16|m32|mx32:;" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld64-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker64" ";:%{" "mmusl" ":"
"/lib/ld-musl-x86_64.so.1" ";:" "/lib64/ld-linux-x86-64.so.2"
"}}}" "} %{" "mx32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ldx32-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linkerx32" ";:%{" "mmusl" ":"
"/lib/ld-musl-x32.so.1" ";:" "/libx32/ld-linux-x32.so.2" "}}}"
"}}} %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}"
" " "%{shared: -Bsymbolic}" "}"
""
715#endif
716
717/* config.h can define LIB_SPEC to override the default libraries. */
718#ifndef LIB_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{pthread:-lpthread} " "%{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
";:" "%{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
" " "%{!static: -ldl}" "}"
719#define LIB_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{pthread:-lpthread} " "%{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
";:" "%{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
" " "%{!static: -ldl}" "}"
"%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
720#endif
721
722/* When using -fsplit-stack we need to wrap pthread_create, in order
723 to initialize the stack guard. We always use wrapping, rather than
724 shared library ordering, and we keep the wrapper function in
725 libgcc. This is not yet a real spec, though it could become one;
726 it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
727 only works with GNU ld and gold. */
728#ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
729#define STACK_SPLIT_SPEC" %{fsplit-stack: --wrap=pthread_create}" " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
730#else
731#define STACK_SPLIT_SPEC" %{fsplit-stack: --wrap=pthread_create}" " %{fsplit-stack: --wrap=pthread_create}"
732#endif
733
734#ifndef LIBASAN_SPEC" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
735#define STATIC_LIBASAN_LIBS" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}" \
736 " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
737#ifdef LIBASAN_EARLY_SPEC"%{!shared:libasan_preinit%O%s} " "%{static-libasan:%{!shared:"
"-Bstatic" " --whole-archive -lasan --no-whole-archive " "-Bdynamic"
"}}%{!static-libasan:-lasan}"
738#define LIBASAN_SPEC" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}" STATIC_LIBASAN_LIBS" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
739#elif defined(HAVE_LD_STATIC_DYNAMIC1)
740#define LIBASAN_SPEC" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}" "%{static-libasan:" LD_STATIC_OPTION"-Bstatic" \
741 "} -lasan %{static-libasan:" LD_DYNAMIC_OPTION"-Bdynamic" "}" \
742 STATIC_LIBASAN_LIBS" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
743#else
744#define LIBASAN_SPEC" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}" "-lasan" STATIC_LIBASAN_LIBS" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
745#endif
746#endif
747
748#ifndef LIBASAN_EARLY_SPEC"%{!shared:libasan_preinit%O%s} " "%{static-libasan:%{!shared:"
"-Bstatic" " --whole-archive -lasan --no-whole-archive " "-Bdynamic"
"}}%{!static-libasan:-lasan}"
749#define LIBASAN_EARLY_SPEC"%{!shared:libasan_preinit%O%s} " "%{static-libasan:%{!shared:"
"-Bstatic" " --whole-archive -lasan --no-whole-archive " "-Bdynamic"
"}}%{!static-libasan:-lasan}"
""
750#endif
751
752#ifndef LIBHWASAN_SPEC" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
753#define STATIC_LIBHWASAN_LIBS" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}" \
754 " %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
755#ifdef LIBHWASAN_EARLY_SPEC"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}"
756#define LIBHWASAN_SPEC" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}" STATIC_LIBHWASAN_LIBS" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
757#elif defined(HAVE_LD_STATIC_DYNAMIC1)
758#define LIBHWASAN_SPEC" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}" "%{static-libhwasan:" LD_STATIC_OPTION"-Bstatic" \
759 "} -lhwasan %{static-libhwasan:" LD_DYNAMIC_OPTION"-Bdynamic" "}" \
760 STATIC_LIBHWASAN_LIBS" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
761#else
762#define LIBHWASAN_SPEC" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}" "-lhwasan" STATIC_LIBHWASAN_LIBS" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
763#endif
764#endif
765
766#ifndef LIBHWASAN_EARLY_SPEC"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}"
767#define LIBHWASAN_EARLY_SPEC"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}"
""
768#endif
769
770#ifndef LIBTSAN_SPEC" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
771#define STATIC_LIBTSAN_LIBS" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}" \
772 " %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
773#ifdef LIBTSAN_EARLY_SPEC"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}"
774#define LIBTSAN_SPEC" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}" STATIC_LIBTSAN_LIBS" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
775#elif defined(HAVE_LD_STATIC_DYNAMIC1)
776#define LIBTSAN_SPEC" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}" "%{static-libtsan:" LD_STATIC_OPTION"-Bstatic" \
777 "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION"-Bdynamic" "}" \
778 STATIC_LIBTSAN_LIBS" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
779#else
780#define LIBTSAN_SPEC" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}" "-ltsan" STATIC_LIBTSAN_LIBS" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
781#endif
782#endif
783
784#ifndef LIBTSAN_EARLY_SPEC"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}"
785#define LIBTSAN_EARLY_SPEC"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}"
""
786#endif
787
788#ifndef LIBLSAN_SPEC" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
789#define STATIC_LIBLSAN_LIBS" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}" \
790 " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
791#ifdef LIBLSAN_EARLY_SPEC"%{!shared:liblsan_preinit%O%s} " "%{static-liblsan:%{!shared:"
"-Bstatic" " --whole-archive -llsan --no-whole-archive " "-Bdynamic"
"}}%{!static-liblsan:-llsan}"
792#define LIBLSAN_SPEC" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}" STATIC_LIBLSAN_LIBS" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
793#elif defined(HAVE_LD_STATIC_DYNAMIC1)
794#define LIBLSAN_SPEC" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}" "%{static-liblsan:" LD_STATIC_OPTION"-Bstatic" \
795 "} -llsan %{static-liblsan:" LD_DYNAMIC_OPTION"-Bdynamic" "}" \
796 STATIC_LIBLSAN_LIBS" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
797#else
798#define LIBLSAN_SPEC" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}" "-llsan" STATIC_LIBLSAN_LIBS" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
799#endif
800#endif
801
802#ifndef LIBLSAN_EARLY_SPEC"%{!shared:liblsan_preinit%O%s} " "%{static-liblsan:%{!shared:"
"-Bstatic" " --whole-archive -llsan --no-whole-archive " "-Bdynamic"
"}}%{!static-liblsan:-llsan}"
803#define LIBLSAN_EARLY_SPEC"%{!shared:liblsan_preinit%O%s} " "%{static-liblsan:%{!shared:"
"-Bstatic" " --whole-archive -llsan --no-whole-archive " "-Bdynamic"
"}}%{!static-liblsan:-llsan}"
""
804#endif
805
806#ifndef LIBUBSAN_SPEC"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
807#define STATIC_LIBUBSAN_LIBS" %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}" \
808 " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
809#ifdef HAVE_LD_STATIC_DYNAMIC1
810#define LIBUBSAN_SPEC"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"%{static-libubsan:" LD_STATIC_OPTION"-Bstatic" \
811 "} -lubsan %{static-libubsan:" LD_DYNAMIC_OPTION"-Bdynamic" "}" \
812 STATIC_LIBUBSAN_LIBS" %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
813#else
814#define LIBUBSAN_SPEC"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"-lubsan" STATIC_LIBUBSAN_LIBS" %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
815#endif
816#endif
817
818/* Linker options for compressed debug sections. */
819#if HAVE_LD_COMPRESS_DEBUG3 == 0
820/* No linker support. */
821#define LINK_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
822 " %{gz*:%e-gz is not supported in this configuration} "
823#elif HAVE_LD_COMPRESS_DEBUG3 == 1
824/* GNU style on input, GNU ld options. Reject, not useful. */
825#define LINK_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
826 " %{gz*:%e-gz is not supported in this configuration} "
827#elif HAVE_LD_COMPRESS_DEBUG3 == 2
828/* GNU style, GNU gold options. */
829#define LINK_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
830 " %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=zlib}" \
831 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=none}" \
832 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
833#elif HAVE_LD_COMPRESS_DEBUG3 == 3
834/* ELF gABI style. */
835#define LINK_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
836 " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=zlib}" \
837 " %{gz=none:" LD_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=none}" \
838 " %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=zlib-gnu} "
839#else
840#error Unknown value for HAVE_LD_COMPRESS_DEBUG3.
841#endif
842
843/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
844 included. */
845#ifndef LIBGCC_SPEC"-lgcc"
846#if defined(REAL_LIBGCC_SPEC)
847#define LIBGCC_SPEC"-lgcc" REAL_LIBGCC_SPEC
848#elif defined(LINK_LIBGCC_SPECIAL_1)
849/* Have gcc do the search for libgcc.a. */
850#define LIBGCC_SPEC"-lgcc" "libgcc.a%s"
851#else
852#define LIBGCC_SPEC"-lgcc" "-lgcc"
853#endif
854#endif
855
856/* config.h can define STARTFILE_SPEC to override the default crt0 files. */
857#ifndef STARTFILE_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{shared:; pg|p|profile:%{static-pie:grcrt1.o%s;:gcrt1.o%s}; static:crt1.o%s; static-pie:rcrt1.o%s; "
"pie" ":Scrt1.o%s; :crt1.o%s} " "crti.o%s" " %{static:crtbeginT.o%s; shared|static-pie|"
"pie" ":crtbeginS.o%s; :crtbegin.o%s} %{fvtable-verify=none:%s; fvtable-verify=preinit:vtv_start_preinit.o%s; fvtable-verify=std:vtv_start.o%s} "
"" ";:" "%{shared: crtbegin_so%O%s;:" " %{static: crtbegin_static%O%s;: crtbegin_dynamic%O%s}}"
"}"
858#define STARTFILE_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{shared:; pg|p|profile:%{static-pie:grcrt1.o%s;:gcrt1.o%s}; static:crt1.o%s; static-pie:rcrt1.o%s; "
"pie" ":Scrt1.o%s; :crt1.o%s} " "crti.o%s" " %{static:crtbeginT.o%s; shared|static-pie|"
"pie" ":crtbeginS.o%s; :crtbegin.o%s} %{fvtable-verify=none:%s; fvtable-verify=preinit:vtv_start_preinit.o%s; fvtable-verify=std:vtv_start.o%s} "
"" ";:" "%{shared: crtbegin_so%O%s;:" " %{static: crtbegin_static%O%s;: crtbegin_dynamic%O%s}}"
"}"
\
859 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
860#endif
861
862/* config.h can define ENDFILE_SPEC to override the default crtn files. */
863#ifndef ENDFILE_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} %{mpc32:crtprec32.o%s} %{mpc64:crtprec64.o%s} %{mpc80:crtprec80.o%s}"
" " "%{!static:%{fvtable-verify=none:%s; fvtable-verify=preinit:vtv_end_preinit.o%s; fvtable-verify=std:vtv_end.o%s}} %{static:crtend.o%s; shared|static-pie|"
"pie" ":crtendS.o%s; :crtend.o%s} " "crtn.o%s" " " "" ";:"
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} %{mpc32:crtprec32.o%s} %{mpc64:crtprec64.o%s} %{mpc80:crtprec80.o%s}"
" " "%{shared: crtend_so%O%s;: crtend_android%O%s}" "}"
864#define ENDFILE_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} %{mpc32:crtprec32.o%s} %{mpc64:crtprec64.o%s} %{mpc80:crtprec80.o%s}"
" " "%{!static:%{fvtable-verify=none:%s; fvtable-verify=preinit:vtv_end_preinit.o%s; fvtable-verify=std:vtv_end.o%s}} %{static:crtend.o%s; shared|static-pie|"
"pie" ":crtendS.o%s; :crtend.o%s} " "crtn.o%s" " " "" ";:"
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} %{mpc32:crtprec32.o%s} %{mpc64:crtprec64.o%s} %{mpc80:crtprec80.o%s}"
" " "%{shared: crtend_so%O%s;: crtend_android%O%s}" "}"
""
865#endif
866
867#ifndef LINKER_NAME"collect2"
868#define LINKER_NAME"collect2" "collect2"
869#endif
870
871#ifdef HAVE_AS_DEBUG_PREFIX_MAP1
872#define ASM_MAP" %{fdebug-prefix-map=*:--debug-prefix-map %*}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
873#else
874#define ASM_MAP" %{fdebug-prefix-map=*:--debug-prefix-map %*}" ""
875#endif
876
877/* Assembler options for compressed debug sections. */
878#if HAVE_LD_COMPRESS_DEBUG3 < 2
879/* Reject if the linker cannot write compressed debug sections. */
880#define ASM_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
881 " %{gz*:%e-gz is not supported in this configuration} "
882#else /* HAVE_LD_COMPRESS_DEBUG >= 2 */
883#if HAVE_AS_COMPRESS_DEBUG2 == 0
884/* No assembler support. Ignore silently. */
885#define ASM_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
886 " %{gz*:} "
887#elif HAVE_AS_COMPRESS_DEBUG2 == 1
888/* GNU style, GNU as options. */
889#define ASM_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
890 " %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "}" \
891 " %{gz=none:" AS_NO_COMPRESS_DEBUG_OPTION"--nocompress-debug-sections" "}" \
892 " %{gz=zlib:%e-gz=zlib is not supported in this configuration} "
893#elif HAVE_AS_COMPRESS_DEBUG2 == 2
894/* ELF gABI style. */
895#define ASM_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
896 " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=zlib}" \
897 " %{gz=none:" AS_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=none}" \
898 " %{gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION"--compress-debug-sections" "=zlib-gnu} "
899#else
900#error Unknown value for HAVE_AS_COMPRESS_DEBUG2.
901#endif
902#endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */
903
904/* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
905 to the assembler, when compiling assembly sources only. */
906#ifndef ASM_DEBUG_SPEC(DWARF2_DEBUG == DBX_DEBUG ? "%{%:debug-level-gt(0):" "%{gdwarf*:"
"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}" "};" ":%{g*:--gstabs}}"
" %{fdebug-prefix-map=*:--debug-prefix-map %*}" : "%{%:debug-level-gt(0):"
"%{gstabs*:--gstabs;" ":%{g*:" "%{%:dwarf-version-gt(4):--gdwarf-5;"
"%:dwarf-version-gt(3):--gdwarf-4;" "%:dwarf-version-gt(2):--gdwarf-3;"
":--gdwarf2}" "}}}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
)
907# if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG1) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
908/* If --gdwarf-N is supported and as can handle even compiler generated
909 .debug_line with it, supply --gdwarf-N in ASM_DEBUG_OPTION_SPEC rather
910 than in ASM_DEBUG_SPEC, so that it applies to both .s and .c etc.
911 compilations. */
912# define ASM_DEBUG_DWARF_OPTION"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}"
""
913# elif defined(HAVE_AS_GDWARF_5_DEBUG_FLAG1)
914# define ASM_DEBUG_DWARF_OPTION"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}"
"%{%:dwarf-version-gt(4):--gdwarf-5;" \
915 "%:dwarf-version-gt(3):--gdwarf-4;" \
916 "%:dwarf-version-gt(2):--gdwarf-3;" \
917 ":--gdwarf2}"
918# else
919# define ASM_DEBUG_DWARF_OPTION"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}"
"--gdwarf2"
920# endif
921# if defined(DBX_DEBUGGING_INFO1) && defined(DWARF2_DEBUGGING_INFO1) \
922 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG1) && defined(HAVE_AS_GSTABS_DEBUG_FLAG1)
923# define ASM_DEBUG_SPEC(DWARF2_DEBUG == DBX_DEBUG ? "%{%:debug-level-gt(0):" "%{gdwarf*:"
"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}" "};" ":%{g*:--gstabs}}"
" %{fdebug-prefix-map=*:--debug-prefix-map %*}" : "%{%:debug-level-gt(0):"
"%{gstabs*:--gstabs;" ":%{g*:" "%{%:dwarf-version-gt(4):--gdwarf-5;"
"%:dwarf-version-gt(3):--gdwarf-4;" "%:dwarf-version-gt(2):--gdwarf-3;"
":--gdwarf2}" "}}}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
)
\
924 (PREFERRED_DEBUGGING_TYPEDWARF2_DEBUG == DBX_DEBUG \
925 ? "%{%:debug-level-gt(0):" \
926 "%{gdwarf*:" ASM_DEBUG_DWARF_OPTION"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}"
"};" \
927 ":%{g*:--gstabs}}" ASM_MAP" %{fdebug-prefix-map=*:--debug-prefix-map %*}" \
928 : "%{%:debug-level-gt(0):" \
929 "%{gstabs*:--gstabs;" \
930 ":%{g*:" ASM_DEBUG_DWARF_OPTION"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}"
"}}}" ASM_MAP" %{fdebug-prefix-map=*:--debug-prefix-map %*}")
931# else
932# if defined(DBX_DEBUGGING_INFO1) && defined(HAVE_AS_GSTABS_DEBUG_FLAG1)
933# define ASM_DEBUG_SPEC(DWARF2_DEBUG == DBX_DEBUG ? "%{%:debug-level-gt(0):" "%{gdwarf*:"
"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}" "};" ":%{g*:--gstabs}}"
" %{fdebug-prefix-map=*:--debug-prefix-map %*}" : "%{%:debug-level-gt(0):"
"%{gstabs*:--gstabs;" ":%{g*:" "%{%:dwarf-version-gt(4):--gdwarf-5;"
"%:dwarf-version-gt(3):--gdwarf-4;" "%:dwarf-version-gt(2):--gdwarf-3;"
":--gdwarf2}" "}}}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
)
"%{g*:%{%:debug-level-gt(0):--gstabs}}" ASM_MAP" %{fdebug-prefix-map=*:--debug-prefix-map %*}"
934# endif
935# if defined(DWARF2_DEBUGGING_INFO1) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG1)
936# define ASM_DEBUG_SPEC(DWARF2_DEBUG == DBX_DEBUG ? "%{%:debug-level-gt(0):" "%{gdwarf*:"
"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}" "};" ":%{g*:--gstabs}}"
" %{fdebug-prefix-map=*:--debug-prefix-map %*}" : "%{%:debug-level-gt(0):"
"%{gstabs*:--gstabs;" ":%{g*:" "%{%:dwarf-version-gt(4):--gdwarf-5;"
"%:dwarf-version-gt(3):--gdwarf-4;" "%:dwarf-version-gt(2):--gdwarf-3;"
":--gdwarf2}" "}}}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
)
"%{g*:%{%:debug-level-gt(0):" \
937 ASM_DEBUG_DWARF_OPTION"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}"
"}}" ASM_MAP" %{fdebug-prefix-map=*:--debug-prefix-map %*}"
938# endif
939# endif
940#endif
941#ifndef ASM_DEBUG_SPEC(DWARF2_DEBUG == DBX_DEBUG ? "%{%:debug-level-gt(0):" "%{gdwarf*:"
"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}" "};" ":%{g*:--gstabs}}"
" %{fdebug-prefix-map=*:--debug-prefix-map %*}" : "%{%:debug-level-gt(0):"
"%{gstabs*:--gstabs;" ":%{g*:" "%{%:dwarf-version-gt(4):--gdwarf-5;"
"%:dwarf-version-gt(3):--gdwarf-4;" "%:dwarf-version-gt(2):--gdwarf-3;"
":--gdwarf2}" "}}}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
)
942# define ASM_DEBUG_SPEC(DWARF2_DEBUG == DBX_DEBUG ? "%{%:debug-level-gt(0):" "%{gdwarf*:"
"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}" "};" ":%{g*:--gstabs}}"
" %{fdebug-prefix-map=*:--debug-prefix-map %*}" : "%{%:debug-level-gt(0):"
"%{gstabs*:--gstabs;" ":%{g*:" "%{%:dwarf-version-gt(4):--gdwarf-5;"
"%:dwarf-version-gt(3):--gdwarf-4;" "%:dwarf-version-gt(2):--gdwarf-3;"
":--gdwarf2}" "}}}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
)
""
943#endif
944
945/* Define ASM_DEBUG_OPTION_SPEC to be a spec suitable for translating '-g'
946 to the assembler when compiling all sources. */
947#ifndef ASM_DEBUG_OPTION_SPEC""
948# if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG1) && defined(HAVE_AS_WORKING_DWARF_N_FLAG)
949# define ASM_DEBUG_OPTION_DWARF_OPT \
950 "%{%:dwarf-version-gt(4):--gdwarf-5 ;" \
951 "%:dwarf-version-gt(3):--gdwarf-4 ;" \
952 "%:dwarf-version-gt(2):--gdwarf-3 ;" \
953 ":--gdwarf2 }"
954# if defined(DBX_DEBUGGING_INFO1) && defined(DWARF2_DEBUGGING_INFO1)
955# define ASM_DEBUG_OPTION_SPEC"" \
956 (PREFERRED_DEBUGGING_TYPEDWARF2_DEBUG == DBX_DEBUG \
957 ? "%{%:debug-level-gt(0):" \
958 "%{gdwarf*:" ASM_DEBUG_OPTION_DWARF_OPT "}}" \
959 : "%{%:debug-level-gt(0):" \
960 "%{!gstabs*:%{g*:" ASM_DEBUG_OPTION_DWARF_OPT "}}}")
961# elif defined(DWARF2_DEBUGGING_INFO1)
962# define ASM_DEBUG_OPTION_SPEC"" "%{g*:%{%:debug-level-gt(0):" \
963 ASM_DEBUG_OPTION_DWARF_OPT "}}"
964# endif
965# endif
966#endif
967#ifndef ASM_DEBUG_OPTION_SPEC""
968# define ASM_DEBUG_OPTION_SPEC"" ""
969#endif
970
971/* Here is the spec for running the linker, after compiling all files. */
972
973/* This is overridable by the target in case they need to specify the
974 -lgcc and -lc order specially, yet not require them to override all
975 of LINK_COMMAND_SPEC. */
976#ifndef LINK_GCC_C_SEQUENCE_SPEC"%{static|static-pie:--start-group} %G %{!nolibc:%L} %{static|static-pie:--end-group}%{!static:%{!static-pie:%G}}"
977#define LINK_GCC_C_SEQUENCE_SPEC"%{static|static-pie:--start-group} %G %{!nolibc:%L} %{static|static-pie:--end-group}%{!static:%{!static-pie:%G}}" "%G %{!nolibc:%L %G}"
978#endif
979
980#ifndef LINK_SSP_SPEC"%{fstack-protector|fstack-protector-all" "|fstack-protector-strong|fstack-protector-explicit:}"
981#ifdef TARGET_LIBC_PROVIDES_SSP1
982#define LINK_SSP_SPEC"%{fstack-protector|fstack-protector-all" "|fstack-protector-strong|fstack-protector-explicit:}" "%{fstack-protector|fstack-protector-all" \
983 "|fstack-protector-strong|fstack-protector-explicit:}"
984#else
985#define LINK_SSP_SPEC"%{fstack-protector|fstack-protector-all" "|fstack-protector-strong|fstack-protector-explicit:}" "%{fstack-protector|fstack-protector-all" \
986 "|fstack-protector-strong|fstack-protector-explicit" \
987 ":-lssp_nonshared -lssp}"
988#endif
989#endif
990
991#ifdef ENABLE_DEFAULT_PIE
992#define PIE_SPEC"pie" "!no-pie"
993#define NO_FPIE1_SPEC"fpie" ":;" "fno-pie"
994#define FPIE1_SPEC"fpie" NO_FPIE1_SPEC"fpie" ":;" ":;"
995#define NO_FPIE2_SPEC"fPIE" ":;" "fno-PIE"
996#define FPIE2_SPEC"fPIE" NO_FPIE2_SPEC"fPIE" ":;" ":;"
997#define NO_FPIE_SPEC"fpie" "|" "fPIE" ":;" NO_FPIE1_SPEC"fpie" ":;" "|" NO_FPIE2_SPEC"fPIE" ":;"
998#define FPIE_SPEC"fpie" "|" "fPIE" NO_FPIE_SPEC"fpie" "|" "fPIE" ":;" ":;"
999#define NO_FPIC1_SPEC"fpic" ":;" "fno-pic"
1000#define FPIC1_SPEC"fpic" NO_FPIC1_SPEC"fpic" ":;" ":;"
1001#define NO_FPIC2_SPEC"fPIC" ":;" "fno-PIC"
1002#define FPIC2_SPEC"fPIC" NO_FPIC2_SPEC"fPIC" ":;" ":;"
1003#define NO_FPIC_SPEC"fpic" "|" "fPIC" ":;" NO_FPIC1_SPEC"fpic" ":;" "|" NO_FPIC2_SPEC"fPIC" ":;"
1004#define FPIC_SPEC"fpic" "|" "fPIC" NO_FPIC_SPEC"fpic" "|" "fPIC" ":;" ":;"
1005#define NO_FPIE1_AND_FPIC1_SPEC"fpie" "|" "fpic" ":;" NO_FPIE1_SPEC"fpie" ":;" "|" NO_FPIC1_SPEC"fpic" ":;"
1006#define FPIE1_OR_FPIC1_SPEC"fpie" "|" "fpic" NO_FPIE1_AND_FPIC1_SPEC"fpie" "|" "fpic" ":;" ":;"
1007#define NO_FPIE2_AND_FPIC2_SPECFPIE1_OR_FPIC2_SPEC ":;" NO_FPIE2_SPEC"fPIE" ":;" "|" NO_FPIC2_SPEC"fPIC" ":;"
1008#define FPIE2_OR_FPIC2_SPEC"fPIE" "|" "fPIC" NO_FPIE2_AND_FPIC2_SPECFPIE1_OR_FPIC2_SPEC ":;" ":;"
1009#define NO_FPIE_AND_FPIC_SPEC"fpie" "|" "fPIE" "|" "fpic" "|" "fPIC" ":;" NO_FPIE_SPEC"fpie" "|" "fPIE" ":;" "|" NO_FPIC_SPEC"fpic" "|" "fPIC" ":;"
1010#define FPIE_OR_FPIC_SPEC"fpie" "|" "fPIE" "|" "fpic" "|" "fPIC" NO_FPIE_AND_FPIC_SPEC"fpie" "|" "fPIE" "|" "fpic" "|" "fPIC" ":;" ":;"
1011#else
1012#define PIE_SPEC"pie" "pie"
1013#define FPIE1_SPEC"fpie" "fpie"
1014#define NO_FPIE1_SPEC"fpie" ":;" FPIE1_SPEC"fpie" ":;"
1015#define FPIE2_SPEC"fPIE" "fPIE"
1016#define NO_FPIE2_SPEC"fPIE" ":;" FPIE2_SPEC"fPIE" ":;"
1017#define FPIE_SPEC"fpie" "|" "fPIE" FPIE1_SPEC"fpie" "|" FPIE2_SPEC"fPIE"
1018#define NO_FPIE_SPEC"fpie" "|" "fPIE" ":;" FPIE_SPEC"fpie" "|" "fPIE" ":;"
1019#define FPIC1_SPEC"fpic" "fpic"
1020#define NO_FPIC1_SPEC"fpic" ":;" FPIC1_SPEC"fpic" ":;"
1021#define FPIC2_SPEC"fPIC" "fPIC"
1022#define NO_FPIC2_SPEC"fPIC" ":;" FPIC2_SPEC"fPIC" ":;"
1023#define FPIC_SPEC"fpic" "|" "fPIC" FPIC1_SPEC"fpic" "|" FPIC2_SPEC"fPIC"
1024#define NO_FPIC_SPEC"fpic" "|" "fPIC" ":;" FPIC_SPEC"fpic" "|" "fPIC" ":;"
1025#define FPIE1_OR_FPIC1_SPEC"fpie" "|" "fpic" FPIE1_SPEC"fpie" "|" FPIC1_SPEC"fpic"
1026#define NO_FPIE1_AND_FPIC1_SPEC"fpie" "|" "fpic" ":;" FPIE1_OR_FPIC1_SPEC"fpie" "|" "fpic" ":;"
1027#define FPIE2_OR_FPIC2_SPEC"fPIE" "|" "fPIC" FPIE2_SPEC"fPIE" "|" FPIC2_SPEC"fPIC"
1028#define NO_FPIE2_AND_FPIC2_SPECFPIE1_OR_FPIC2_SPEC ":;" FPIE1_OR_FPIC2_SPEC ":;"
1029#define FPIE_OR_FPIC_SPEC"fpie" "|" "fPIE" "|" "fpic" "|" "fPIC" FPIE_SPEC"fpie" "|" "fPIE" "|" FPIC_SPEC"fpic" "|" "fPIC"
1030#define NO_FPIE_AND_FPIC_SPEC"fpie" "|" "fPIE" "|" "fpic" "|" "fPIC" ":;" FPIE_OR_FPIC_SPEC"fpie" "|" "fPIE" "|" "fpic" "|" "fPIC" ":;"
1031#endif
1032
1033#ifndef LINK_PIE_SPEC"%{static|shared|r:;" "pie" ":" "-pie" "} "
1034#ifdef HAVE_LD_PIE1
1035#ifndef LD_PIE_SPEC"-pie"
1036#define LD_PIE_SPEC"-pie" "-pie"
1037#endif
1038#else
1039#define LD_PIE_SPEC"-pie" ""
1040#endif
1041#define LINK_PIE_SPEC"%{static|shared|r:;" "pie" ":" "-pie" "} " "%{static|shared|r:;" PIE_SPEC"pie" ":" LD_PIE_SPEC"-pie" "} "
1042#endif
1043
1044#ifndef LINK_BUILDID_SPEC
1045# if defined(HAVE_LD_BUILDID1) && defined(ENABLE_LD_BUILDID)
1046# define LINK_BUILDID_SPEC "%{!r:--build-id} "
1047# endif
1048#endif
1049
1050#ifndef LTO_PLUGIN_SPEC""
1051#define LTO_PLUGIN_SPEC"" ""
1052#endif
1053
1054/* Conditional to test whether the LTO plugin is used or not.
1055 FIXME: For slim LTO we will need to enable plugin unconditionally. This
1056 still cause problems with PLUGIN_LD != LD and when plugin is built but
1057 not useable. For GCC 4.6 we don't support slim LTO and thus we can enable
1058 plugin only when LTO is enabled. We still honor explicit
1059 -fuse-linker-plugin if the linker used understands -plugin. */
1060
1061/* The linker has some plugin support. */
1062#if HAVE_LTO_PLUGIN2 > 0
1063/* The linker used has full plugin support, use LTO plugin by default. */
1064#if HAVE_LTO_PLUGIN2 == 2
1065#define PLUGIN_COND"!fno-use-linker-plugin:%{!fno-lto" "!fno-use-linker-plugin:%{!fno-lto"
1066#define PLUGIN_COND_CLOSE"}" "}"
1067#else
1068/* The linker used has limited plugin support, use LTO plugin with explicit
1069 -fuse-linker-plugin. */
1070#define PLUGIN_COND"!fno-use-linker-plugin:%{!fno-lto" "fuse-linker-plugin"
1071#define PLUGIN_COND_CLOSE"}" ""
1072#endif
1073#define LINK_PLUGIN_SPEC"%{" "!fno-use-linker-plugin:%{!fno-lto"": -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res "
"" " %{flinker-output=*:-plugin-opt=-linker-output-known} %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }"
"}"
\
1074 "%{" PLUGIN_COND"!fno-use-linker-plugin:%{!fno-lto"": \
1075 -plugin %(linker_plugin_file) \
1076 -plugin-opt=%(lto_wrapper) \
1077 -plugin-opt=-fresolution=%u.res \
1078 " LTO_PLUGIN_SPEC"" "\
1079 %{flinker-output=*:-plugin-opt=-linker-output-known} \
1080 %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
1081 }" PLUGIN_COND_CLOSE"}"
1082#else
1083/* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */
1084#define LINK_PLUGIN_SPEC"%{" "!fno-use-linker-plugin:%{!fno-lto"": -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res "
"" " %{flinker-output=*:-plugin-opt=-linker-output-known} %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }"
"}"
"%{fuse-linker-plugin:\
1085 %e-fuse-linker-plugin is not supported in this configuration}"
1086#endif
1087
1088/* Linker command line options for -fsanitize= early on the command line. */
1089#ifndef SANITIZER_EARLY_SPEC"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" "%{!shared:libasan_preinit%O%s} "
"%{static-libasan:%{!shared:" "-Bstatic" " --whole-archive -lasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libasan:-lasan}" "} %{%:sanitize(hwaddress):"
"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}" "} %{%:sanitize(thread):"
"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}" "} %{%:sanitize(leak):" "%{!shared:liblsan_preinit%O%s} "
"%{static-liblsan:%{!shared:" "-Bstatic" " --whole-archive -llsan --no-whole-archive "
"-Bdynamic" "}}%{!static-liblsan:-llsan}" "}}}}"
1090#define SANITIZER_EARLY_SPEC"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" "%{!shared:libasan_preinit%O%s} "
"%{static-libasan:%{!shared:" "-Bstatic" " --whole-archive -lasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libasan:-lasan}" "} %{%:sanitize(hwaddress):"
"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}" "} %{%:sanitize(thread):"
"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}" "} %{%:sanitize(leak):" "%{!shared:liblsan_preinit%O%s} "
"%{static-liblsan:%{!shared:" "-Bstatic" " --whole-archive -llsan --no-whole-archive "
"-Bdynamic" "}}%{!static-liblsan:-llsan}" "}}}}"
"\
1091%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_EARLY_SPEC"%{!shared:libasan_preinit%O%s} " "%{static-libasan:%{!shared:"
"-Bstatic" " --whole-archive -lasan --no-whole-archive " "-Bdynamic"
"}}%{!static-libasan:-lasan}"
"} \
1092 %{%:sanitize(hwaddress):" LIBHWASAN_EARLY_SPEC"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}"
"} \
1093 %{%:sanitize(thread):" LIBTSAN_EARLY_SPEC"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}"
"} \
1094 %{%:sanitize(leak):" LIBLSAN_EARLY_SPEC"%{!shared:liblsan_preinit%O%s} " "%{static-liblsan:%{!shared:"
"-Bstatic" " --whole-archive -llsan --no-whole-archive " "-Bdynamic"
"}}%{!static-liblsan:-llsan}"
"}}}}"
1095#endif
1096
1097/* Linker command line options for -fsanitize= late on the command line. */
1098#ifndef SANITIZER_SPEC"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
" %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(hwaddress):"
" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
" %{static:%ecannot specify -static with -fsanitize=hwaddress}} %{%:sanitize(thread):"
" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
" %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):"
"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"} %{%:sanitize(leak):" " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
"}}}}"
1099#define SANITIZER_SPEC"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
" %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(hwaddress):"
" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
" %{static:%ecannot specify -static with -fsanitize=hwaddress}} %{%:sanitize(thread):"
" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
" %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):"
"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"} %{%:sanitize(leak):" " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
"}}}}"
"\
1100%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" LIBASAN_SPEC" %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}" "\
1101 %{static:%ecannot specify -static with -fsanitize=address}}\
1102 %{%:sanitize(hwaddress):" LIBHWASAN_SPEC" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}" "\
1103 %{static:%ecannot specify -static with -fsanitize=hwaddress}}\
1104 %{%:sanitize(thread):" LIBTSAN_SPEC" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}" "\
1105 %{static:%ecannot specify -static with -fsanitize=thread}}\
1106 %{%:sanitize(undefined):" LIBUBSAN_SPEC"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"}\
1107 %{%:sanitize(leak):" LIBLSAN_SPEC" %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}" "}}}}"
1108#endif
1109
1110#ifndef POST_LINK_SPEC""
1111#define POST_LINK_SPEC"" ""
1112#endif
1113
1114/* This is the spec to use, once the code for creating the vtable
1115 verification runtime library, libvtv.so, has been created. Currently
1116 the vtable verification runtime functions are in libstdc++, so we use
1117 the spec just below this one. */
1118#ifndef VTABLE_VERIFICATION_SPEC"%{fvtable-verify=none:} %{fvtable-verify=std: %e-fvtable-verify=std is not supported in this configuration} %{fvtable-verify=preinit: %e-fvtable-verify=preinit is not supported in this configuration}"
1119#if ENABLE_VTABLE_VERIFY0
1120#define VTABLE_VERIFICATION_SPEC"%{fvtable-verify=none:} %{fvtable-verify=std: %e-fvtable-verify=std is not supported in this configuration} %{fvtable-verify=preinit: %e-fvtable-verify=preinit is not supported in this configuration}" "\
1121%{!nostdlib:%{!r:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}\
1122 %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}}"
1123#else
1124#define VTABLE_VERIFICATION_SPEC"%{fvtable-verify=none:} %{fvtable-verify=std: %e-fvtable-verify=std is not supported in this configuration} %{fvtable-verify=preinit: %e-fvtable-verify=preinit is not supported in this configuration}" "\
1125%{fvtable-verify=none:} \
1126%{fvtable-verify=std: \
1127 %e-fvtable-verify=std is not supported in this configuration} \
1128%{fvtable-verify=preinit: \
1129 %e-fvtable-verify=preinit is not supported in this configuration}"
1130#endif
1131#endif
1132
1133/* -u* was put back because both BSD and SysV seem to support it. */
1134/* %{static|no-pie|static-pie:} simply prevents an error message:
1135 1. If the target machine doesn't handle -static.
1136 2. If PIE isn't enabled by default.
1137 3. If the target machine doesn't handle -static-pie.
1138 */
1139/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
1140 scripts which exist in user specified directories, or in standard
1141 directories. */
1142/* We pass any -flto flags on to the linker, which is expected
1143 to understand them. In practice, this means it had better be collect2. */
1144/* %{e*} includes -export-dynamic; see comment in common.opt. */
1145#ifndef LINK_COMMAND_SPEC"%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) " "%{"
"!fno-use-linker-plugin:%{!fno-lto"": -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res "
"" " %{flinker-output=*:-plugin-opt=-linker-output-known} %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }"
"}" "%{flto|flto=*:%<fcompare-debug*} %{flto} %{fno-lto} %{flto=*} %l "
"%{static|shared|r:;" "pie" ":" "-pie" "} " "%{fuse-ld=*:-fuse-ld=%*} "
" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} " "%X %{o*} %{e*} %{N} %{n} %{r} %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) "
"%{fvtable-verify=none:} %{fvtable-verify=std: %e-fvtable-verify=std is not supported in this configuration} %{fvtable-verify=preinit: %e-fvtable-verify=preinit is not supported in this configuration}"
" " "%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):"
"%{!shared:libasan_preinit%O%s} " "%{static-libasan:%{!shared:"
"-Bstatic" " --whole-archive -lasan --no-whole-archive " "-Bdynamic"
"}}%{!static-libasan:-lasan}" "} %{%:sanitize(hwaddress):"
"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}" "} %{%:sanitize(thread):"
"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}" "} %{%:sanitize(leak):" "%{!shared:liblsan_preinit%O%s} "
"%{static-liblsan:%{!shared:" "-Bstatic" " --whole-archive -llsan --no-whole-archive "
"-Bdynamic" "}}%{!static-liblsan:-llsan}" "}}}}" " %o "" %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): %:include(libgomp.spec)%(link_gomp)} %{fgnu-tm:%:include(libitm.spec)%(link_itm)} %(mflib) "
" %{fsplit-stack: --wrap=pthread_create}" " %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} "
"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
" %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(hwaddress):"
" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
" %{static:%ecannot specify -static with -fsanitize=hwaddress}} %{%:sanitize(thread):"
" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
" %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):"
"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"} %{%:sanitize(leak):" " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
"}}}}" " %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}} %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1146#define LINK_COMMAND_SPEC"%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) " "%{"
"!fno-use-linker-plugin:%{!fno-lto"": -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res "
"" " %{flinker-output=*:-plugin-opt=-linker-output-known} %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }"
"}" "%{flto|flto=*:%<fcompare-debug*} %{flto} %{fno-lto} %{flto=*} %l "
"%{static|shared|r:;" "pie" ":" "-pie" "} " "%{fuse-ld=*:-fuse-ld=%*} "
" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} " "%X %{o*} %{e*} %{N} %{n} %{r} %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) "
"%{fvtable-verify=none:} %{fvtable-verify=std: %e-fvtable-verify=std is not supported in this configuration} %{fvtable-verify=preinit: %e-fvtable-verify=preinit is not supported in this configuration}"
" " "%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):"
"%{!shared:libasan_preinit%O%s} " "%{static-libasan:%{!shared:"
"-Bstatic" " --whole-archive -lasan --no-whole-archive " "-Bdynamic"
"}}%{!static-libasan:-lasan}" "} %{%:sanitize(hwaddress):"
"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}" "} %{%:sanitize(thread):"
"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}" "} %{%:sanitize(leak):" "%{!shared:liblsan_preinit%O%s} "
"%{static-liblsan:%{!shared:" "-Bstatic" " --whole-archive -llsan --no-whole-archive "
"-Bdynamic" "}}%{!static-liblsan:-llsan}" "}}}}" " %o "" %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): %:include(libgomp.spec)%(link_gomp)} %{fgnu-tm:%:include(libitm.spec)%(link_itm)} %(mflib) "
" %{fsplit-stack: --wrap=pthread_create}" " %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} "
"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
" %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(hwaddress):"
" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
" %{static:%ecannot specify -static with -fsanitize=hwaddress}} %{%:sanitize(thread):"
" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
" %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):"
"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"} %{%:sanitize(leak):" " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
"}}}}" " %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}} %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
"\
1147%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
1148 %(linker) " \
1149 LINK_PLUGIN_SPEC"%{" "!fno-use-linker-plugin:%{!fno-lto"": -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res "
"" " %{flinker-output=*:-plugin-opt=-linker-output-known} %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }"
"}"
\
1150 "%{flto|flto=*:%<fcompare-debug*} \
1151 %{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC"%{static|shared|r:;" "pie" ":" "-pie" "} " \
1152 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
\
1153 "%X %{o*} %{e*} %{N} %{n} %{r}\
1154 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
1155 %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
1156 VTABLE_VERIFICATION_SPEC"%{fvtable-verify=none:} %{fvtable-verify=std: %e-fvtable-verify=std is not supported in this configuration} %{fvtable-verify=preinit: %e-fvtable-verify=preinit is not supported in this configuration}" " " SANITIZER_EARLY_SPEC"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" "%{!shared:libasan_preinit%O%s} "
"%{static-libasan:%{!shared:" "-Bstatic" " --whole-archive -lasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libasan:-lasan}" "} %{%:sanitize(hwaddress):"
"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}" "} %{%:sanitize(thread):"
"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}" "} %{%:sanitize(leak):" "%{!shared:liblsan_preinit%O%s} "
"%{static-liblsan:%{!shared:" "-Bstatic" " --whole-archive -llsan --no-whole-archive "
"-Bdynamic" "}}%{!static-liblsan:-llsan}" "}}}}"
" %o "" \
1157 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
1158 %:include(libgomp.spec)%(link_gomp)}\
1159 %{fgnu-tm:%:include(libitm.spec)%(link_itm)}\
1160 %(mflib) " STACK_SPLIT_SPEC" %{fsplit-stack: --wrap=pthread_create}" "\
1161 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} " SANITIZER_SPEC"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
" %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(hwaddress):"
" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
" %{static:%ecannot specify -static with -fsanitize=hwaddress}} %{%:sanitize(thread):"
" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
" %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):"
"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"} %{%:sanitize(leak):" " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
"}}}}"
" \
1162 %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}}\
1163 %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
1164#endif
1165
1166#ifndef LINK_LIBGCC_SPEC"%D"
1167/* Generate -L options for startfile prefix list. */
1168# define LINK_LIBGCC_SPEC"%D" "%D"
1169#endif
1170
1171#ifndef STARTFILE_PREFIX_SPEC""
1172# define STARTFILE_PREFIX_SPEC"" ""
1173#endif
1174
1175#ifndef SYSROOT_SPEC"--sysroot=%R"
1176# define SYSROOT_SPEC"--sysroot=%R" "--sysroot=%R"
1177#endif
1178
1179#ifndef SYSROOT_SUFFIX_SPEC""
1180# define SYSROOT_SUFFIX_SPEC"" ""
1181#endif
1182
1183#ifndef SYSROOT_HEADERS_SUFFIX_SPEC""
1184# define SYSROOT_HEADERS_SUFFIX_SPEC"" ""
1185#endif
1186
1187static const char *asm_debug = ASM_DEBUG_SPEC(DWARF2_DEBUG == DBX_DEBUG ? "%{%:debug-level-gt(0):" "%{gdwarf*:"
"%{%:dwarf-version-gt(4):--gdwarf-5;" "%:dwarf-version-gt(3):--gdwarf-4;"
"%:dwarf-version-gt(2):--gdwarf-3;" ":--gdwarf2}" "};" ":%{g*:--gstabs}}"
" %{fdebug-prefix-map=*:--debug-prefix-map %*}" : "%{%:debug-level-gt(0):"
"%{gstabs*:--gstabs;" ":%{g*:" "%{%:dwarf-version-gt(4):--gdwarf-5;"
"%:dwarf-version-gt(3):--gdwarf-4;" "%:dwarf-version-gt(2):--gdwarf-3;"
":--gdwarf2}" "}}}" " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
)
;
1188static const char *asm_debug_option = ASM_DEBUG_OPTION_SPEC"";
1189static const char *cpp_spec = CPP_SPEC"%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}";
1190static const char *cc1_spec = CC1_SPEC"%{" "!mandroid" "|tno-android-cc:" "%(cc1_cpu) %{profile:-p}"
";:" "%(cc1_cpu) %{profile:-p}" " " "%{!mglibc:%{!muclibc:%{!mbionic: -mbionic}}} "
"%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: -fPIC}}}}" "}"
;
1191static const char *cc1plus_spec = CC1PLUS_SPEC"";
1192static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC"%{static|static-pie:--start-group} %G %{!nolibc:%L} %{static|static-pie:--end-group}%{!static:%{!static-pie:%G}}";
1193static const char *link_ssp_spec = LINK_SSP_SPEC"%{fstack-protector|fstack-protector-all" "|fstack-protector-strong|fstack-protector-explicit:}";
1194static const char *asm_spec = ASM_SPEC"%{" "m16|m32" ":--32} %{" "m16|m32|mx32:;" ":--64} %{" "mx32"
":--x32} %{msse2avx:%{!mavx:-msse2avx}}"
;
1195static const char *asm_final_spec = ASM_FINAL_SPEC"%{gsplit-dwarf: \n objcopy --extract-dwo %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} %b.dwo \n objcopy --strip-dwo %{c:%{o*:%*}%{!o*:%w%b%O}}%{!c:%U%O} }";
1196static const char *link_spec = LINK_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{" "m16|m32|mx32:;" ":-m "
"elf_x86_64" "} %{" "m16|m32" ":-m " "elf_i386"
"} %{" "mx32" ":-m " "elf32_x86_64" "} %{shared:-shared} %{!shared: %{!static: %{!static-pie: %{rdynamic:-export-dynamic} %{"
"m16|m32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker" ";:%{" "mmusl" ":"
"/lib/ld-musl-i386.so.1" ";:" "/lib/ld-linux.so.2" "}}}" "} %{"
"m16|m32|mx32:;" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld64-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker64" ";:%{" "mmusl" ":"
"/lib/ld-musl-x86_64.so.1" ";:" "/lib64/ld-linux-x86-64.so.2"
"}}}" "} %{" "mx32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ldx32-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linkerx32" ";:%{" "mmusl" ":"
"/lib/ld-musl-x32.so.1" ";:" "/libx32/ld-linux-x32.so.2" "}}}"
"}}} %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}"
";:" "%{" "m16|m32|mx32:;" ":-m " "elf_x86_64" "} %{"
"m16|m32" ":-m " "elf_i386" "} %{" "mx32"
":-m " "elf32_x86_64" "} %{shared:-shared} %{!shared: %{!static: %{!static-pie: %{rdynamic:-export-dynamic} %{"
"m16|m32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker" ";:%{" "mmusl" ":"
"/lib/ld-musl-i386.so.1" ";:" "/lib/ld-linux.so.2" "}}}" "} %{"
"m16|m32|mx32:;" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ld64-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linker64" ";:%{" "mmusl" ":"
"/lib/ld-musl-x86_64.so.1" ";:" "/lib64/ld-linux-x86-64.so.2"
"}}}" "} %{" "mx32" ":-dynamic-linker " "%{" "muclibc" ":" "/lib/ldx32-uClibc.so.0"
";:%{" "mbionic" ":" "/system/bin/linkerx32" ";:%{" "mmusl" ":"
"/lib/ld-musl-x32.so.1" ";:" "/libx32/ld-linux-x32.so.2" "}}}"
"}}} %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}"
" " "%{shared: -Bsymbolic}" "}"
;
1197static const char *lib_spec = LIB_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{pthread:-lpthread} " "%{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
";:" "%{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
" " "%{!static: -ldl}" "}"
;
1198static const char *link_gomp_spec = "";
1199static const char *libgcc_spec = LIBGCC_SPEC"-lgcc";
1200static const char *endfile_spec = ENDFILE_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} %{mpc32:crtprec32.o%s} %{mpc64:crtprec64.o%s} %{mpc80:crtprec80.o%s}"
" " "%{!static:%{fvtable-verify=none:%s; fvtable-verify=preinit:vtv_end_preinit.o%s; fvtable-verify=std:vtv_end.o%s}} %{static:crtend.o%s; shared|static-pie|"
"pie" ":crtendS.o%s; :crtend.o%s} " "crtn.o%s" " " "" ";:"
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} %{mpc32:crtprec32.o%s} %{mpc64:crtprec64.o%s} %{mpc80:crtprec80.o%s}"
" " "%{shared: crtend_so%O%s;: crtend_android%O%s}" "}"
;
1201static const char *startfile_spec = STARTFILE_SPEC"%{" "!mandroid" "|tno-android-ld:" "%{shared:; pg|p|profile:%{static-pie:grcrt1.o%s;:gcrt1.o%s}; static:crt1.o%s; static-pie:rcrt1.o%s; "
"pie" ":Scrt1.o%s; :crt1.o%s} " "crti.o%s" " %{static:crtbeginT.o%s; shared|static-pie|"
"pie" ":crtbeginS.o%s; :crtbegin.o%s} %{fvtable-verify=none:%s; fvtable-verify=preinit:vtv_start_preinit.o%s; fvtable-verify=std:vtv_start.o%s} "
"" ";:" "%{shared: crtbegin_so%O%s;:" " %{static: crtbegin_static%O%s;: crtbegin_dynamic%O%s}}"
"}"
;
1202static const char *linker_name_spec = LINKER_NAME"collect2";
1203static const char *linker_plugin_file_spec = "";
1204static const char *lto_wrapper_spec = "";
1205static const char *lto_gcc_spec = "";
1206static const char *post_link_spec = POST_LINK_SPEC"";
1207static const char *link_command_spec = LINK_COMMAND_SPEC"%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) " "%{"
"!fno-use-linker-plugin:%{!fno-lto"": -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res "
"" " %{flinker-output=*:-plugin-opt=-linker-output-known} %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }"
"}" "%{flto|flto=*:%<fcompare-debug*} %{flto} %{fno-lto} %{flto=*} %l "
"%{static|shared|r:;" "pie" ":" "-pie" "} " "%{fuse-ld=*:-fuse-ld=%*} "
" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} " "%X %{o*} %{e*} %{N} %{n} %{r} %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) "
"%{fvtable-verify=none:} %{fvtable-verify=std: %e-fvtable-verify=std is not supported in this configuration} %{fvtable-verify=preinit: %e-fvtable-verify=preinit is not supported in this configuration}"
" " "%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):"
"%{!shared:libasan_preinit%O%s} " "%{static-libasan:%{!shared:"
"-Bstatic" " --whole-archive -lasan --no-whole-archive " "-Bdynamic"
"}}%{!static-libasan:-lasan}" "} %{%:sanitize(hwaddress):"
"%{static-libhwasan:%{!shared:" "-Bstatic" " --whole-archive -lhwasan --no-whole-archive "
"-Bdynamic" "}}%{!static-libhwasan:-lhwasan}" "} %{%:sanitize(thread):"
"%{!shared:libtsan_preinit%O%s} " "%{static-libtsan:%{!shared:"
"-Bstatic" " --whole-archive -ltsan --no-whole-archive " "-Bdynamic"
"}}%{!static-libtsan:-ltsan}" "} %{%:sanitize(leak):" "%{!shared:liblsan_preinit%O%s} "
"%{static-liblsan:%{!shared:" "-Bstatic" " --whole-archive -llsan --no-whole-archive "
"-Bdynamic" "}}%{!static-liblsan:-llsan}" "}}}}" " %o "" %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): %:include(libgomp.spec)%(link_gomp)} %{fgnu-tm:%:include(libitm.spec)%(link_itm)} %(mflib) "
" %{fsplit-stack: --wrap=pthread_create}" " %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} "
"%{!nostdlib:%{!r:%{!nodefaultlibs:%{%:sanitize(address):" " %{static-libasan|static:%:include(libsanitizer.spec)%(link_libasan)}"
" %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(hwaddress):"
" %{static-libhwasan|static:%:include(libsanitizer.spec)%(link_libhwasan)}"
" %{static:%ecannot specify -static with -fsanitize=hwaddress}} %{%:sanitize(thread):"
" %{static-libtsan|static:%:include(libsanitizer.spec)%(link_libtsan)}"
" %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):"
"%{static-libubsan:" "-Bstatic" "} -lubsan %{static-libubsan:"
"-Bdynamic" "}" " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
"} %{%:sanitize(leak):" " %{static-liblsan|static:%:include(libsanitizer.spec)%(link_liblsan)}"
"}}}}" " %{!nostdlib:%{!r:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}} %{!nostdlib:%{!r:%{!nostartfiles:%E}}} %{T*} \n%(post_link) }}}}}}"
;
1208static const char *link_libgcc_spec = LINK_LIBGCC_SPEC"%D";
1209static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC"";
1210static const char *sysroot_spec = SYSROOT_SPEC"--sysroot=%R";
1211static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC"";
1212static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC"";
1213static const char *self_spec = "";
1214
1215/* Standard options to cpp, cc1, and as, to reduce duplication in specs.
1216 There should be no need to override these in target dependent files,
1217 but we need to copy them to the specs file so that newer versions
1218 of the GCC driver can correctly drive older tool chains with the
1219 appropriate -B options. */
1220
1221/* When cpplib handles traditional preprocessing, get rid of this, and
1222 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
1223 that we default the front end language better. */
1224static const char *trad_capable_cpp =
1225"cc1 -E %{traditional|traditional-cpp:-traditional-cpp}";
1226
1227/* We don't wrap .d files in %W{} since a missing .d file, and
1228 therefore no dependency entry, confuses make into thinking a .o
1229 file that happens to exist is up-to-date. */
1230static const char *cpp_unique_options =
1231"%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %@{I*&F*} %{P} %I\
1232 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
1233 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
1234 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
1235 %{Mmodules} %{Mno-modules}\
1236 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
1237 %{remap} %{%:debug-level-gt(2):-dD}\
1238 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1239 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
1240 %{E|M|MM:%W{o*}}";
1241
1242/* This contains cpp options which are common with cc1_options and are passed
1243 only when preprocessing only to avoid duplication. We pass the cc1 spec
1244 options to the preprocessor so that it the cc1 spec may manipulate
1245 options used to set target flags. Those special target flags settings may
1246 in turn cause preprocessor symbols to be defined specially. */
1247static const char *cpp_options =
1248"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
1249 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
1250 %{!fno-working-directory:-fworking-directory}}} %{O*}\
1251 %{undef} %{save-temps*:-fpch-preprocess}";
1252
1253/* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
1254
1255 Make it easy for a language to override the argument for the
1256 %:dumps specs function call. */
1257#define DUMPS_OPTIONS(EXTS)"%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps("
EXTS ")"
\
1258 "%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps(" EXTS ")"
1259
1260/* This contains cpp options which are not passed when the preprocessor
1261 output will be used by another program. */
1262static const char *cpp_debug_options = DUMPS_OPTIONS ("")"%<dumpdir %<dumpbase %<dumpbase-ext %{d*} %:dumps("
"" ")"
;
1263
1264/* NB: This is shared amongst all front-ends, except for Ada. */
1265static const char *cc1_options =
1266"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
1267 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
1268 %1 %{!Q:-quiet} %(cpp_debug_options) %{m*} %{aux-info*}\
1269 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
1270 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
1271 %{Qn:-fno-ident} %{Qy:} %{-help:--help}\
1272 %{-target-help:--target-help}\
1273 %{-version:--version}\
1274 %{-help=*:--help=%*}\
1275 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %w%b.s}}}\
1276 %{fsyntax-only:-o %j} %{-param*}\
1277 %{coverage:-fprofile-arcs -ftest-coverage}\
1278 %{fprofile-arcs|fprofile-generate*|coverage:\
1279 %{!fprofile-update=single:\
1280 %{pthread:-fprofile-update=prefer-atomic}}}";
1281
1282static const char *asm_options =
1283"%{-target-help:%:print-asm-header()} "
1284#if HAVE_GNU_AS1
1285/* If GNU AS is used, then convert -w (no warnings), -I, and -v
1286 to the assembler equivalents. */
1287"%{v} %{w:-W} %{I*} "
1288#endif
1289"%(asm_debug_option)"
1290ASM_COMPRESS_DEBUG_SPEC" %{gz|gz=zlib:" "--compress-debug-sections" "=zlib}" " %{gz=none:"
"--compress-debug-sections" "=none}" " %{gz=zlib-gnu:" "--compress-debug-sections"
"=zlib-gnu} "
1291"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
1292
1293static const char *invoke_as =
1294#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1295"%{!fwpa*:\
1296 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1297 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
1298 }";
1299#else
1300"%{!fwpa*:\
1301 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
1302 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
1303 }";
1304#endif
1305
1306/* Some compilers have limits on line lengths, and the multilib_select
1307 and/or multilib_matches strings can be very long, so we build them at
1308 run time. */
1309static struct obstack multilib_obstack;
1310static const char *multilib_select;
1311static const char *multilib_matches;
1312static const char *multilib_defaults;
1313static const char *multilib_exclusions;
1314static const char *multilib_reuse;
1315
1316/* Check whether a particular argument is a default argument. */
1317
1318#ifndef MULTILIB_DEFAULTS{ "m64" }
1319#define MULTILIB_DEFAULTS{ "m64" } { "" }
1320#endif
1321
1322static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS{ "m64" };
1323
1324#ifndef DRIVER_SELF_SPECS""
1325#define DRIVER_SELF_SPECS"" ""
1326#endif
1327
1328/* Linking to libgomp implies pthreads. This is particularly important
1329 for targets that use different start files and suchlike. */
1330#ifndef GOMP_SELF_SPECS"%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): "
"-pthread}"
1331#define GOMP_SELF_SPECS"%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): "
"-pthread}"
\
1332 "%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): " \
1333 "-pthread}"
1334#endif
1335
1336/* Likewise for -fgnu-tm. */
1337#ifndef GTM_SELF_SPECS"%{fgnu-tm: -pthread}"
1338#define GTM_SELF_SPECS"%{fgnu-tm: -pthread}" "%{fgnu-tm: -pthread}"
1339#endif
1340
1341static const char *const driver_self_specs[] = {
1342 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
1343 DRIVER_SELF_SPECS"", CONFIGURE_SPECS"", GOMP_SELF_SPECS"%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): "
"-pthread}"
, GTM_SELF_SPECS"%{fgnu-tm: -pthread}"
1344};
1345
1346#ifndef OPTION_DEFAULT_SPECS{"tune", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}"
}, {"tune_32", "%{" "m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"tune_64", "%{" "!m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"cpu", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}"
}, {"cpu_32", "%{" "m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"cpu_64", "%{" "!m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"arch", "%{!march=*:-march=%(VALUE)}"}, {"arch_32", "%{"
"m32" ":%{!march=*:-march=%(VALUE)}}"}, {"arch_64", "%{" "!m32"
":%{!march=*:-march=%(VALUE)}}"},
1347#define OPTION_DEFAULT_SPECS{"tune", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}"
}, {"tune_32", "%{" "m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"tune_64", "%{" "!m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"cpu", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}"
}, {"cpu_32", "%{" "m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"cpu_64", "%{" "!m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"arch", "%{!march=*:-march=%(VALUE)}"}, {"arch_32", "%{"
"m32" ":%{!march=*:-march=%(VALUE)}}"}, {"arch_64", "%{" "!m32"
":%{!march=*:-march=%(VALUE)}}"},
{ "", "" }
1348#endif
1349
1350struct default_spec
1351{
1352 const char *name;
1353 const char *spec;
1354};
1355
1356static const struct default_spec
1357 option_default_specs[] = { OPTION_DEFAULT_SPECS{"tune", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}"
}, {"tune_32", "%{" "m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"tune_64", "%{" "!m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"cpu", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}"
}, {"cpu_32", "%{" "m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"cpu_64", "%{" "!m32" ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}"
}, {"arch", "%{!march=*:-march=%(VALUE)}"}, {"arch_32", "%{"
"m32" ":%{!march=*:-march=%(VALUE)}}"}, {"arch_64", "%{" "!m32"
":%{!march=*:-march=%(VALUE)}}"},
};
1358
1359struct user_specs
1360{
1361 struct user_specs *next;
1362 const char *filename;
1363};
1364
1365static struct user_specs *user_specs_head, *user_specs_tail;
1366
1367
1368/* Record the mapping from file suffixes for compilation specs. */
1369
1370struct compiler
1371{
1372 const char *suffix; /* Use this compiler for input files
1373 whose names end in this suffix. */
1374
1375 const char *spec; /* To use this compiler, run this spec. */
1376
1377 const char *cpp_spec; /* If non-NULL, substitute this spec
1378 for `%C', rather than the usual
1379 cpp_spec. */
1380 int combinable; /* If nonzero, compiler can deal with
1381 multiple source files at once (IMA). */
1382 int needs_preprocessing; /* If nonzero, source files need to
1383 be run through a preprocessor. */
1384};
1385
1386/* Pointer to a vector of `struct compiler' that gives the spec for
1387 compiling a file, based on its suffix.
1388 A file that does not end in any of these suffixes will be passed
1389 unchanged to the loader and nothing else will be done to it.
1390
1391 An entry containing two 0s is used to terminate the vector.
1392
1393 If multiple entries match a file, the last matching one is used. */
1394
1395static struct compiler *compilers;
1396
1397/* Number of entries in `compilers', not counting the null terminator. */
1398
1399static int n_compilers;
1400
1401/* The default list of file name suffixes and their compilation specs. */
1402
1403static const struct compiler default_compilers[] =
1404{
1405 /* Add lists of suffixes of known languages here. If those languages
1406 were not present when we built the driver, we will hit these copies
1407 and be given a more meaningful error than "file not used since
1408 linking is not done". */
1409 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1410 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1411 {".mii", "#Objective-C++", 0, 0, 0},
1412 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1413 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1414 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1415 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1416 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1417 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1418 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1419 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1420 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1421 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1422 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1423 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1424 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1425 {".r", "#Ratfor", 0, 0, 0},
1426 {".go", "#Go", 0, 1, 0},
1427 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1428 /* Next come the entries for C. */
1429 {".c", "@c", 0, 0, 1},
1430 {"@c",
1431 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1432 external preprocessor if -save-temps is given. */
1433 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1434 %{!E:%{!M:%{!MM:\
1435 %{traditional:\
1436%eGNU C no longer supports -traditional without -E}\
1437 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1438 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1439 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1440 %(cc1_options)}\
1441 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1442 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1443 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1444 {"-",
1445 "%{!E:%e-E or -x required when input is from standard input}\
1446 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1447 {".h", "@c-header", 0, 0, 0},
1448 {"@c-header",
1449 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1450 external preprocessor if -save-temps is given. */
1451 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1452 %{!E:%{!M:%{!MM:\
1453 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1454 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1455 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1456 %(cc1_options)\
1457 %{!fsyntax-only:%{!S:-o %g.s} \
1458 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1459 %W{o*:--output-pch=%*}}%V}}\
1460 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1461 cc1 %(cpp_unique_options) %(cc1_options)\
1462 %{!fsyntax-only:%{!S:-o %g.s} \
1463 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1464 %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
1465 {".i", "@cpp-output", 0, 0, 0},
1466 {"@cpp-output",
1467 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1468 {".s", "@assembler", 0, 0, 0},
1469 {"@assembler",
1470 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1471 {".sx", "@assembler-with-cpp", 0, 0, 0},
1472 {".S", "@assembler-with-cpp", 0, 0, 0},
1473 {"@assembler-with-cpp",
1474#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1475 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1476 %{E|M|MM:%(cpp_debug_options)}\
1477 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1478 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1479#else
1480 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1481 %{E|M|MM:%(cpp_debug_options)}\
1482 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1483 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1484#endif
1485 , 0, 0, 0},
1486
1487#include "specs.h"
1488 /* Mark end of table. */
1489 {0, 0, 0, 0, 0}
1490};
1491
1492/* Number of elements in default_compilers, not counting the terminator. */
1493
1494static const int n_default_compilers = ARRAY_SIZE (default_compilers)(sizeof (default_compilers) / sizeof ((default_compilers)[0])
)
- 1;
1495
1496typedef char *char_p; /* For DEF_VEC_P. */
1497
1498/* A vector of options to give to the linker.
1499 These options are accumulated by %x,
1500 and substituted into the linker command with %X. */
1501static vec<char_p> linker_options;
1502
1503/* A vector of options to give to the assembler.
1504 These options are accumulated by -Wa,
1505 and substituted into the assembler command with %Y. */
1506static vec<char_p> assembler_options;
1507
1508/* A vector of options to give to the preprocessor.
1509 These options are accumulated by -Wp,
1510 and substituted into the preprocessor command with %Z. */
1511static vec<char_p> preprocessor_options;
1512
1513static char *
1514skip_whitespace (char *p)
1515{
1516 while (1)
1517 {
1518 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1519 be considered whitespace. */
1520 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1521 return p + 1;
1522 else if (*p == '\n' || *p == ' ' || *p == '\t')
1523 p++;
1524 else if (*p == '#')
1525 {
1526 while (*p != '\n')
1527 p++;
1528 p++;
1529 }
1530 else
1531 break;
1532 }
1533
1534 return p;
1535}
1536/* Structures to keep track of prefixes to try when looking for files. */
1537
1538struct prefix_list
1539{
1540 const char *prefix; /* String to prepend to the path. */
1541 struct prefix_list *next; /* Next in linked list. */
1542 int require_machine_suffix; /* Don't use without machine_suffix. */
1543 /* 2 means try both machine_suffix and just_machine_suffix. */
1544 int priority; /* Sort key - priority within list. */
1545 int os_multilib; /* 1 if OS multilib scheme should be used,
1546 0 for GCC multilib scheme. */
1547};
1548
1549struct path_prefix
1550{
1551 struct prefix_list *plist; /* List of prefixes to try */
1552 int max_len; /* Max length of a prefix in PLIST */
1553 const char *name; /* Name of this list (used in config stuff) */
1554};
1555
1556/* List of prefixes to try when looking for executables. */
1557
1558static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1559
1560/* List of prefixes to try when looking for startup (crt0) files. */
1561
1562static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1563
1564/* List of prefixes to try when looking for include files. */
1565
1566static struct path_prefix include_prefixes = { 0, 0, "include" };
1567
1568/* Suffix to attach to directories searched for commands.
1569 This looks like `MACHINE/VERSION/'. */
1570
1571static const char *machine_suffix = 0;
1572
1573/* Suffix to attach to directories searched for commands.
1574 This is just `MACHINE/'. */
1575
1576static const char *just_machine_suffix = 0;
1577
1578/* Adjusted value of GCC_EXEC_PREFIX envvar. */
1579
1580static const char *gcc_exec_prefix;
1581
1582/* Adjusted value of standard_libexec_prefix. */
1583
1584static const char *gcc_libexec_prefix;
1585
1586/* Default prefixes to attach to command names. */
1587
1588#ifndef STANDARD_STARTFILE_PREFIX_1"/lib/"
1589#define STANDARD_STARTFILE_PREFIX_1"/lib/" "/lib/"
1590#endif
1591#ifndef STANDARD_STARTFILE_PREFIX_2"/usr/lib/"
1592#define STANDARD_STARTFILE_PREFIX_2"/usr/lib/" "/usr/lib/"
1593#endif
1594
1595#ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1596#undef MD_EXEC_PREFIX""
1597#undef MD_STARTFILE_PREFIX""
1598#undef MD_STARTFILE_PREFIX_1""
1599#endif
1600
1601/* If no prefixes defined, use the null string, which will disable them. */
1602#ifndef MD_EXEC_PREFIX""
1603#define MD_EXEC_PREFIX"" ""
1604#endif
1605#ifndef MD_STARTFILE_PREFIX""
1606#define MD_STARTFILE_PREFIX"" ""
1607#endif
1608#ifndef MD_STARTFILE_PREFIX_1""
1609#define MD_STARTFILE_PREFIX_1"" ""
1610#endif
1611
1612/* These directories are locations set at configure-time based on the
1613 --prefix option provided to configure. Their initializers are
1614 defined in Makefile.in. These paths are not *directly* used when
1615 gcc_exec_prefix is set because, in that case, we know where the
1616 compiler has been installed, and use paths relative to that
1617 location instead. */
1618static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX"/usr/local/lib/gcc/";
1619static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX"/usr/local/libexec/gcc/";
1620static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX"/usr/local/bin/";
1621static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX"../../../";
1622
1623/* For native compilers, these are well-known paths containing
1624 components that may be provided by the system. For cross
1625 compilers, these paths are not used. */
1626static const char *md_exec_prefix = MD_EXEC_PREFIX"";
1627static const char *md_startfile_prefix = MD_STARTFILE_PREFIX"";
1628static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1"";
1629static const char *const standard_startfile_prefix_1
1630 = STANDARD_STARTFILE_PREFIX_1"/lib/";
1631static const char *const standard_startfile_prefix_2
1632 = STANDARD_STARTFILE_PREFIX_2"/usr/lib/";
1633
1634/* A relative path to be used in finding the location of tools
1635 relative to the driver. */
1636static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX"../../../../";
1637
1638/* A prefix to be used when this is an accelerator compiler. */
1639static const char *const accel_dir_suffix = ACCEL_DIR_SUFFIX"";
1640
1641/* Subdirectory to use for locating libraries. Set by
1642 set_multilib_dir based on the compilation options. */
1643
1644static const char *multilib_dir;
1645
1646/* Subdirectory to use for locating libraries in OS conventions. Set by
1647 set_multilib_dir based on the compilation options. */
1648
1649static const char *multilib_os_dir;
1650
1651/* Subdirectory to use for locating libraries in multiarch conventions. Set by
1652 set_multilib_dir based on the compilation options. */
1653
1654static const char *multiarch_dir;
1655
1656/* Structure to keep track of the specs that have been defined so far.
1657 These are accessed using %(specname) in a compiler or link
1658 spec. */
1659
1660struct spec_list
1661{
1662 /* The following 2 fields must be first */
1663 /* to allow EXTRA_SPECS to be initialized */
1664 const char *name; /* name of the spec. */
1665 const char *ptr; /* available ptr if no static pointer */
1666
1667 /* The following fields are not initialized */
1668 /* by EXTRA_SPECS */
1669 const char **ptr_spec; /* pointer to the spec itself. */
1670 struct spec_list *next; /* Next spec in linked list. */
1671 int name_len; /* length of the name */
1672 bool user_p; /* whether string come from file spec. */
1673 bool alloc_p; /* whether string was allocated */
1674 const char *default_ptr; /* The default value of *ptr_spec. */
1675};
1676
1677#define INIT_STATIC_SPEC(NAME,PTR){ NAME, __null, void *, (struct spec_list *) 0, sizeof (NAME)
- 1, false, false, *void * }
\
1678 { NAME, NULL__null, PTRvoid *, (struct spec_list *) 0, sizeof (NAME) - 1, false, false, \
1679 *PTRvoid * }
1680
1681/* List of statically defined specs. */
1682static struct spec_list static_specs[] =
1683{
1684 INIT_STATIC_SPEC ("asm", &asm_spec){ "asm", __null, &asm_spec, (struct spec_list *) 0, sizeof
("asm") - 1, false, false, *&asm_spec }
,
1685 INIT_STATIC_SPEC ("asm_debug", &asm_debug){ "asm_debug", __null, &asm_debug, (struct spec_list *) 0
, sizeof ("asm_debug") - 1, false, false, *&asm_debug }
,
1686 INIT_STATIC_SPEC ("asm_debug_option", &asm_debug_option){ "asm_debug_option", __null, &asm_debug_option, (struct spec_list
*) 0, sizeof ("asm_debug_option") - 1, false, false, *&asm_debug_option
}
,
1687 INIT_STATIC_SPEC ("asm_final", &asm_final_spec){ "asm_final", __null, &asm_final_spec, (struct spec_list
*) 0, sizeof ("asm_final") - 1, false, false, *&asm_final_spec
}
,
1688 INIT_STATIC_SPEC ("asm_options", &asm_options){ "asm_options", __null, &asm_options, (struct spec_list *
) 0, sizeof ("asm_options") - 1, false, false, *&asm_options
}
,
1689 INIT_STATIC_SPEC ("invoke_as", &invoke_as){ "invoke_as", __null, &invoke_as, (struct spec_list *) 0
, sizeof ("invoke_as") - 1, false, false, *&invoke_as }
,
1690 INIT_STATIC_SPEC ("cpp", &cpp_spec){ "cpp", __null, &cpp_spec, (struct spec_list *) 0, sizeof
("cpp") - 1, false, false, *&cpp_spec }
,
1691 INIT_STATIC_SPEC ("cpp_options", &cpp_options){ "cpp_options", __null, &cpp_options, (struct spec_list *
) 0, sizeof ("cpp_options") - 1, false, false, *&cpp_options
}
,
1692 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options){ "cpp_debug_options", __null, &cpp_debug_options, (struct
spec_list *) 0, sizeof ("cpp_debug_options") - 1, false, false
, *&cpp_debug_options }
,
1693 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options){ "cpp_unique_options", __null, &cpp_unique_options, (struct
spec_list *) 0, sizeof ("cpp_unique_options") - 1, false, false
, *&cpp_unique_options }
,
1694 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp){ "trad_capable_cpp", __null, &trad_capable_cpp, (struct spec_list
*) 0, sizeof ("trad_capable_cpp") - 1, false, false, *&trad_capable_cpp
}
,
1695 INIT_STATIC_SPEC ("cc1", &cc1_spec){ "cc1", __null, &cc1_spec, (struct spec_list *) 0, sizeof
("cc1") - 1, false, false, *&cc1_spec }
,
1696 INIT_STATIC_SPEC ("cc1_options", &cc1_options){ "cc1_options", __null, &cc1_options, (struct spec_list *
) 0, sizeof ("cc1_options") - 1, false, false, *&cc1_options
}
,
1697 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec){ "cc1plus", __null, &cc1plus_spec, (struct spec_list *) 0
, sizeof ("cc1plus") - 1, false, false, *&cc1plus_spec }
,
1698 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec){ "link_gcc_c_sequence", __null, &link_gcc_c_sequence_spec
, (struct spec_list *) 0, sizeof ("link_gcc_c_sequence") - 1,
false, false, *&link_gcc_c_sequence_spec }
,
1699 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec){ "link_ssp", __null, &link_ssp_spec, (struct spec_list *
) 0, sizeof ("link_ssp") - 1, false, false, *&link_ssp_spec
}
,
1700 INIT_STATIC_SPEC ("endfile", &endfile_spec){ "endfile", __null, &endfile_spec, (struct spec_list *) 0
, sizeof ("endfile") - 1, false, false, *&endfile_spec }
,
1701 INIT_STATIC_SPEC ("link", &link_spec){ "link", __null, &link_spec, (struct spec_list *) 0, sizeof
("link") - 1, false, false, *&link_spec }
,
1702 INIT_STATIC_SPEC ("lib", &lib_spec){ "lib", __null, &lib_spec, (struct spec_list *) 0, sizeof
("lib") - 1, false, false, *&lib_spec }
,
1703 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec){ "link_gomp", __null, &link_gomp_spec, (struct spec_list
*) 0, sizeof ("link_gomp") - 1, false, false, *&link_gomp_spec
}
,
1704 INIT_STATIC_SPEC ("libgcc", &libgcc_spec){ "libgcc", __null, &libgcc_spec, (struct spec_list *) 0,
sizeof ("libgcc") - 1, false, false, *&libgcc_spec }
,
1705 INIT_STATIC_SPEC ("startfile", &startfile_spec){ "startfile", __null, &startfile_spec, (struct spec_list
*) 0, sizeof ("startfile") - 1, false, false, *&startfile_spec
}
,
1706 INIT_STATIC_SPEC ("cross_compile", &cross_compile){ "cross_compile", __null, &cross_compile, (struct spec_list
*) 0, sizeof ("cross_compile") - 1, false, false, *&cross_compile
}
,
1707 INIT_STATIC_SPEC ("version", &compiler_version){ "version", __null, &compiler_version, (struct spec_list
*) 0, sizeof ("version") - 1, false, false, *&compiler_version
}
,
1708 INIT_STATIC_SPEC ("multilib", &multilib_select){ "multilib", __null, &multilib_select, (struct spec_list
*) 0, sizeof ("multilib") - 1, false, false, *&multilib_select
}
,
1709 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults){ "multilib_defaults", __null, &multilib_defaults, (struct
spec_list *) 0, sizeof ("multilib_defaults") - 1, false, false
, *&multilib_defaults }
,
1710 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra){ "multilib_extra", __null, &multilib_extra, (struct spec_list
*) 0, sizeof ("multilib_extra") - 1, false, false, *&multilib_extra
}
,
1711 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches){ "multilib_matches", __null, &multilib_matches, (struct spec_list
*) 0, sizeof ("multilib_matches") - 1, false, false, *&multilib_matches
}
,
1712 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions){ "multilib_exclusions", __null, &multilib_exclusions, (struct
spec_list *) 0, sizeof ("multilib_exclusions") - 1, false, false
, *&multilib_exclusions }
,
1713 INIT_STATIC_SPEC ("multilib_options", &multilib_options){ "multilib_options", __null, &multilib_options, (struct spec_list
*) 0, sizeof ("multilib_options") - 1, false, false, *&multilib_options
}
,
1714 INIT_STATIC_SPEC ("multilib_reuse", &multilib_reuse){ "multilib_reuse", __null, &multilib_reuse, (struct spec_list
*) 0, sizeof ("multilib_reuse") - 1, false, false, *&multilib_reuse
}
,
1715 INIT_STATIC_SPEC ("linker", &linker_name_spec){ "linker", __null, &linker_name_spec, (struct spec_list *
) 0, sizeof ("linker") - 1, false, false, *&linker_name_spec
}
,
1716 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec){ "linker_plugin_file", __null, &linker_plugin_file_spec,
(struct spec_list *) 0, sizeof ("linker_plugin_file") - 1, false
, false, *&linker_plugin_file_spec }
,
1717 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec){ "lto_wrapper", __null, &lto_wrapper_spec, (struct spec_list
*) 0, sizeof ("lto_wrapper") - 1, false, false, *&lto_wrapper_spec
}
,
1718 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec){ "lto_gcc", __null, &lto_gcc_spec, (struct spec_list *) 0
, sizeof ("lto_gcc") - 1, false, false, *&lto_gcc_spec }
,
1719 INIT_STATIC_SPEC ("post_link", &post_link_spec){ "post_link", __null, &post_link_spec, (struct spec_list
*) 0, sizeof ("post_link") - 1, false, false, *&post_link_spec
}
,
1720 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec){ "link_libgcc", __null, &link_libgcc_spec, (struct spec_list
*) 0, sizeof ("link_libgcc") - 1, false, false, *&link_libgcc_spec
}
,
1721 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix){ "md_exec_prefix", __null, &md_exec_prefix, (struct spec_list
*) 0, sizeof ("md_exec_prefix") - 1, false, false, *&md_exec_prefix
}
,
1722 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix){ "md_startfile_prefix", __null, &md_startfile_prefix, (struct
spec_list *) 0, sizeof ("md_startfile_prefix") - 1, false, false
, *&md_startfile_prefix }
,
1723 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1){ "md_startfile_prefix_1", __null, &md_startfile_prefix_1
, (struct spec_list *) 0, sizeof ("md_startfile_prefix_1") - 1
, false, false, *&md_startfile_prefix_1 }
,
1724 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec){ "startfile_prefix_spec", __null, &startfile_prefix_spec
, (struct spec_list *) 0, sizeof ("startfile_prefix_spec") - 1
, false, false, *&startfile_prefix_spec }
,
1725 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec){ "sysroot_spec", __null, &sysroot_spec, (struct spec_list
*) 0, sizeof ("sysroot_spec") - 1, false, false, *&sysroot_spec
}
,
1726 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec){ "sysroot_suffix_spec", __null, &sysroot_suffix_spec, (struct
spec_list *) 0, sizeof ("sysroot_suffix_spec") - 1, false, false
, *&sysroot_suffix_spec }
,
1727 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec){ "sysroot_hdrs_suffix_spec", __null, &sysroot_hdrs_suffix_spec
, (struct spec_list *) 0, sizeof ("sysroot_hdrs_suffix_spec")
- 1, false, false, *&sysroot_hdrs_suffix_spec }
,
1728 INIT_STATIC_SPEC ("self_spec", &self_spec){ "self_spec", __null, &self_spec, (struct spec_list *) 0
, sizeof ("self_spec") - 1, false, false, *&self_spec }
,
1729};
1730
1731#ifdef EXTRA_SPECS{ "cc1_cpu", "" "%{march=native:%>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}"
},
/* additional specs needed */
1732/* Structure to keep track of just the first two args of a spec_list.
1733 That is all that the EXTRA_SPECS macro gives us. */
1734struct spec_list_1
1735{
1736 const char *const name;
1737 const char *const ptr;
1738};
1739
1740static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS{ "cc1_cpu", "" "%{march=native:%>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}"
},
};
1741static struct spec_list *extra_specs = (struct spec_list *) 0;
1742#endif
1743
1744/* List of dynamically allocates specs that have been defined so far. */
1745
1746static struct spec_list *specs = (struct spec_list *) 0;
1747
1748/* List of static spec functions. */
1749
1750static const struct spec_function static_spec_functions[] =
1751{
1752 { "getenv", getenv_spec_function },
1753 { "if-exists", if_exists_spec_function },
1754 { "if-exists-else", if_exists_else_spec_function },
1755 { "if-exists-then-else", if_exists_then_else_spec_function },
1756 { "sanitize", sanitize_spec_function },
1757 { "replace-outfile", replace_outfile_spec_function },
1758 { "remove-outfile", remove_outfile_spec_function },
1759 { "version-compare", version_compare_spec_function },
1760 { "include", include_spec_function },
1761 { "find-file", find_file_spec_function },
1762 { "find-plugindir", find_plugindir_spec_function },
1763 { "print-asm-header", print_asm_header_spec_function },
1764 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1765 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1766 { "pass-through-libs", pass_through_libs_spec_func },
1767 { "dumps", dumps_spec_func },
1768 { "gt", greater_than_spec_func },
1769 { "debug-level-gt", debug_level_greater_than_spec_func },
1770 { "dwarf-version-gt", dwarf_version_greater_than_spec_func },
1771 { "fortran-preinclude-file", find_fortran_preinclude_file},
1772#ifdef EXTRA_SPEC_FUNCTIONS{ "local_cpu_detect", host_detect_local_cpu },
1773 EXTRA_SPEC_FUNCTIONS{ "local_cpu_detect", host_detect_local_cpu },
1774#endif
1775 { 0, 0 }
1776};
1777
1778static int processing_spec_function;
1779
1780/* Add appropriate libgcc specs to OBSTACK, taking into account
1781 various permutations of -shared-libgcc, -shared, and such. */
1782
1783#if defined(ENABLE_SHARED_LIBGCC1) && !defined(REAL_LIBGCC_SPEC)
1784
1785#ifndef USE_LD_AS_NEEDED1
1786#define USE_LD_AS_NEEDED1 0
1787#endif
1788
1789static void
1790init_gcc_specs (struct obstack *obstack, const char *shared_name,
1791 const char *static_name, const char *eh_name)
1792{
1793 char *buf;
1794
1795#if USE_LD_AS_NEEDED1
1796 buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
1797 "%{!static:%{!static-libgcc:%{!static-pie:"
1798 "%{!shared-libgcc:",
1799 static_name, " " LD_AS_NEEDED_OPTION"--push-state --as-needed" " ",
1800 shared_name, " " LD_NO_AS_NEEDED_OPTION"--pop-state"
1801 "}"
1802 "%{shared-libgcc:",
1803 shared_name, "%{!shared: ", static_name, "}"
1804 "}}"
1805#else
1806 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1807 "%{!static:%{!static-libgcc:"
1808 "%{!shared:"
1809 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1810 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1811 "}"
1812#ifdef LINK_EH_SPEC"%{!static|static-pie:--eh-frame-hdr} "
1813 "%{shared:"
1814 "%{shared-libgcc:", shared_name, "}"
1815 "%{!shared-libgcc:", static_name, "}"
1816 "}"
1817#else
1818 "%{shared:", shared_name, "}"
1819#endif
1820#endif
1821 "}}", NULL__null);
1822
1823 obstack_grow (obstack, buf, strlen (buf))__extension__ ({ struct obstack *__o = (obstack); size_t __len
= (strlen (buf)); if (__extension__ ({ struct obstack const *
__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free
); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o
->next_free, buf, __len); __o->next_free += __len; (void
) 0; })
;
1824 free (buf);
1825}
1826#endif /* ENABLE_SHARED_LIBGCC */
1827
1828/* Initialize the specs lookup routines. */
1829
1830static void
1831init_spec (void)
1832{
1833 struct spec_list *next = (struct spec_list *) 0;
1834 struct spec_list *sl = (struct spec_list *) 0;
1835 int i;
1836
1837 if (specs)
1838 return; /* Already initialized. */
1839
1840 if (verbose_flagglobal_options.x_verbose_flag)
1841 fnotice (stderrstderr, "Using built-in specs.\n");
1842
1843#ifdef EXTRA_SPECS{ "cc1_cpu", "" "%{march=native:%>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}"
},
1844 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1))((struct spec_list *) xcalloc (((sizeof (extra_specs_1) / sizeof
((extra_specs_1)[0]))), sizeof (struct spec_list)))
;
1845
1846 for (i = ARRAY_SIZE (extra_specs_1)(sizeof (extra_specs_1) / sizeof ((extra_specs_1)[0])) - 1; i >= 0; i--)
1847 {
1848 sl = &extra_specs[i];
1849 sl->name = extra_specs_1[i].name;
1850 sl->ptr = extra_specs_1[i].ptr;
1851 sl->next = next;
1852 sl->name_len = strlen (sl->name);
1853 sl->ptr_spec = &sl->ptr;
1854 gcc_assert (sl->ptr_spec != NULL)((void)(!(sl->ptr_spec != __null) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 1854, __FUNCTION__), 0 : 0))
;
1855 sl->default_ptr = sl->ptr;
1856 next = sl;
1857 }
1858#endif
1859
1860 for (i = ARRAY_SIZE (static_specs)(sizeof (static_specs) / sizeof ((static_specs)[0])) - 1; i >= 0; i--)
1861 {
1862 sl = &static_specs[i];
1863 sl->next = next;
1864 next = sl;
1865 }
1866
1867#if defined(ENABLE_SHARED_LIBGCC1) && !defined(REAL_LIBGCC_SPEC)
1868 /* ??? If neither -shared-libgcc nor --static-libgcc was
1869 seen, then we should be making an educated guess. Some proposed
1870 heuristics for ELF include:
1871
1872 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1873 program will be doing dynamic loading, which will likely
1874 need the shared libgcc.
1875
1876 (2) If "-ldl", then it's also a fair bet that we're doing
1877 dynamic loading.
1878
1879 (3) For each ET_DYN we're linking against (either through -lfoo
1880 or /some/path/foo.so), check to see whether it or one of
1881 its dependencies depends on a shared libgcc.
1882
1883 (4) If "-shared"
1884
1885 If the runtime is fixed to look for program headers instead
1886 of calling __register_frame_info at all, for each object,
1887 use the shared libgcc if any EH symbol referenced.
1888
1889 If crtstuff is fixed to not invoke __register_frame_info
1890 automatically, for each object, use the shared libgcc if
1891 any non-empty unwind section found.
1892
1893 Doing any of this probably requires invoking an external program to
1894 do the actual object file scanning. */
1895 {
1896 const char *p = libgcc_spec;
1897 int in_sep = 1;
1898
1899 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1900 when given the proper command line arguments. */
1901 while (*p)
1902 {
1903 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1904 {
1905 init_gcc_specs (&obstack,
1906 "-lgcc_s"
1907#ifdef USE_LIBUNWIND_EXCEPTIONS
1908 " -lunwind"
1909#endif
1910 ,
1911 "-lgcc",
1912 "-lgcc_eh"
1913#ifdef USE_LIBUNWIND_EXCEPTIONS
1914# ifdef HAVE_LD_STATIC_DYNAMIC1
1915 " %{!static:%{!static-pie:" LD_STATIC_OPTION"-Bstatic" "}} -lunwind"
1916 " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION"-Bdynamic" "}}"
1917# else
1918 " -lunwind"
1919# endif
1920#endif
1921 );
1922
1923 p += 5;
1924 in_sep = 0;
1925 }
1926 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1927 {
1928 /* Ug. We don't know shared library extensions. Hope that
1929 systems that use this form don't do shared libraries. */
1930 init_gcc_specs (&obstack,
1931 "-lgcc_s",
1932 "libgcc.a%s",
1933 "libgcc_eh.a%s"
1934#ifdef USE_LIBUNWIND_EXCEPTIONS
1935 " -lunwind"
1936#endif
1937 );
1938 p += 10;
1939 in_sep = 0;
1940 }
1941 else
1942 {
1943 obstack_1grow (&obstack, *p)__extension__ ({ struct obstack *__o = (&obstack); if (__extension__
({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < 1) _obstack_newchunk (__o, 1)
; ((void) (*((__o)->next_free)++ = (*p))); })
;
1944 in_sep = (*p == ' ');
1945 p += 1;
1946 }
1947 }
1948
1949 obstack_1grow (&obstack, '\0')__extension__ ({ struct obstack *__o = (&obstack); if (__extension__
({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < 1) _obstack_newchunk (__o, 1)
; ((void) (*((__o)->next_free)++ = ('\0'))); })
;
1950 libgcc_spec = XOBFINISH (&obstack, const char *)((const char *) __extension__ ({ struct obstack *__o1 = ((&
obstack)); void *__value = (void *) __o1->object_base; if (
__o1->next_free == __value) __o1->maybe_empty_object = 1
; __o1->next_free = ((sizeof (ptrdiff_t) < sizeof (void
*) ? (__o1->object_base) : (char *) 0) + (((__o1->next_free
) - (sizeof (ptrdiff_t) < sizeof (void *) ? (__o1->object_base
) : (char *) 0) + (__o1->alignment_mask)) & ~(__o1->
alignment_mask))); if ((size_t) (__o1->next_free - (char *
) __o1->chunk) > (size_t) (__o1->chunk_limit - (char
*) __o1->chunk)) __o1->next_free = __o1->chunk_limit
; __o1->object_base = __o1->next_free; __value; }))
;
1951 }
1952#endif
1953#ifdef USE_AS_TRADITIONAL_FORMAT
1954 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1955 {
1956 static const char tf[] = "--traditional-format ";
1957 obstack_grow (&obstack, tf, sizeof (tf) - 1)__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (sizeof (tf) - 1); if (__extension__ ({ struct obstack
const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->
next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy
(__o->next_free, tf, __len); __o->next_free += __len; (
void) 0; })
;
1958 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec))__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (strlen (asm_spec)); if (__extension__ ({ struct obstack
const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->
next_free); }) < __len + 1) _obstack_newchunk (__o, __len +
1); memcpy (__o->next_free, asm_spec, __len); __o->next_free
+= __len; *(__o->next_free)++ = 0; (void) 0; })
;
1959 asm_spec = XOBFINISH (&obstack, const char *)((const char *) __extension__ ({ struct obstack *__o1 = ((&
obstack)); void *__value = (void *) __o1->object_base; if (
__o1->next_free == __value) __o1->maybe_empty_object = 1
; __o1->next_free = ((sizeof (ptrdiff_t) < sizeof (void
*) ? (__o1->object_base) : (char *) 0) + (((__o1->next_free
) - (sizeof (ptrdiff_t) < sizeof (void *) ? (__o1->object_base
) : (char *) 0) + (__o1->alignment_mask)) & ~(__o1->
alignment_mask))); if ((size_t) (__o1->next_free - (char *
) __o1->chunk) > (size_t) (__o1->chunk_limit - (char
*) __o1->chunk)) __o1->next_free = __o1->chunk_limit
; __o1->object_base = __o1->next_free; __value; }))
;
1960 }
1961#endif
1962
1963#if defined LINK_EH_SPEC"%{!static|static-pie:--eh-frame-hdr} " || defined LINK_BUILDID_SPEC || \
1964 defined LINKER_HASH_STYLE
1965# ifdef LINK_BUILDID_SPEC
1966 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1967 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof (LINK_BUILDID_SPEC) - 1)__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (sizeof (LINK_BUILDID_SPEC) - 1); if (__extension__ (
{ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < __len) _obstack_newchunk (__o
, __len); memcpy (__o->next_free, LINK_BUILDID_SPEC, __len
); __o->next_free += __len; (void) 0; })
;
1968# endif
1969# ifdef LINK_EH_SPEC"%{!static|static-pie:--eh-frame-hdr} "
1970 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1971 obstack_grow (&obstack, LINK_EH_SPEC, sizeof (LINK_EH_SPEC) - 1)__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (sizeof ("%{!static|static-pie:--eh-frame-hdr} ") - 1
); if (__extension__ ({ struct obstack const *__o1 = (__o); (
size_t) (__o1->chunk_limit - __o1->next_free); }) < __len
) _obstack_newchunk (__o, __len); memcpy (__o->next_free, "%{!static|static-pie:--eh-frame-hdr} "
, __len); __o->next_free += __len; (void) 0; })
;
1972# endif
1973# ifdef LINKER_HASH_STYLE
1974 /* Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had
1975 before. */
1976 {
1977 static const char hash_style[] = "--hash-style=";
1978 obstack_grow (&obstack, hash_style, sizeof (hash_style) - 1)__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (sizeof (hash_style) - 1); if (__extension__ ({ struct
obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit -
__o1->next_free); }) < __len) _obstack_newchunk (__o, __len
); memcpy (__o->next_free, hash_style, __len); __o->next_free
+= __len; (void) 0; })
;
1979 obstack_grow (&obstack, LINKER_HASH_STYLE, sizeof (LINKER_HASH_STYLE) - 1)__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (sizeof (LINKER_HASH_STYLE) - 1); if (__extension__ (
{ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < __len) _obstack_newchunk (__o
, __len); memcpy (__o->next_free, LINKER_HASH_STYLE, __len
); __o->next_free += __len; (void) 0; })
;
1980 obstack_1grow (&obstack, ' ')__extension__ ({ struct obstack *__o = (&obstack); if (__extension__
({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < 1) _obstack_newchunk (__o, 1)
; ((void) (*((__o)->next_free)++ = (' '))); })
;
1981 }
1982# endif
1983 obstack_grow0 (&obstack, link_spec, strlen (link_spec))__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (strlen (link_spec)); if (__extension__ ({ struct obstack
const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->
next_free); }) < __len + 1) _obstack_newchunk (__o, __len +
1); memcpy (__o->next_free, link_spec, __len); __o->next_free
+= __len; *(__o->next_free)++ = 0; (void) 0; })
;
1984 link_spec = XOBFINISH (&obstack, const char *)((const char *) __extension__ ({ struct obstack *__o1 = ((&
obstack)); void *__value = (void *) __o1->object_base; if (
__o1->next_free == __value) __o1->maybe_empty_object = 1
; __o1->next_free = ((sizeof (ptrdiff_t) < sizeof (void
*) ? (__o1->object_base) : (char *) 0) + (((__o1->next_free
) - (sizeof (ptrdiff_t) < sizeof (void *) ? (__o1->object_base
) : (char *) 0) + (__o1->alignment_mask)) & ~(__o1->
alignment_mask))); if ((size_t) (__o1->next_free - (char *
) __o1->chunk) > (size_t) (__o1->chunk_limit - (char
*) __o1->chunk)) __o1->next_free = __o1->chunk_limit
; __o1->object_base = __o1->next_free; __value; }))
;
1985#endif
1986
1987 specs = sl;
1988}
1989
1990/* Update the entry for SPEC in the static_specs table to point to VALUE,
1991 ensuring that we free the previous value if necessary. Set alloc_p for the
1992 entry to ALLOC_P: this determines whether we take ownership of VALUE (i.e.
1993 whether we need to free it later on). */
1994static void
1995set_static_spec (const char **spec, const char *value, bool alloc_p)
1996{
1997 struct spec_list *sl = NULL__null;
1998
1999 for (unsigned i = 0; i < ARRAY_SIZE (static_specs)(sizeof (static_specs) / sizeof ((static_specs)[0])); i++)
2000 {
2001 if (static_specs[i].ptr_spec == spec)
2002 {
2003 sl = static_specs + i;
2004 break;
2005 }
2006 }
2007
2008 gcc_assert (sl)((void)(!(sl) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 2008, __FUNCTION__), 0 : 0))
;
2009
2010 if (sl->alloc_p)
2011 {
2012 const char *old = *spec;
2013 free (const_cast <char *> (old));
2014 }
2015
2016 *spec = value;
2017 sl->alloc_p = alloc_p;
2018}
2019
2020/* Update a static spec to a new string, taking ownership of that
2021 string's memory. */
2022static void set_static_spec_owned (const char **spec, const char *val)
2023{
2024 return set_static_spec (spec, val, true);
2025}
2026
2027/* Update a static spec to point to a new value, but don't take
2028 ownership of (i.e. don't free) that string. */
2029static void set_static_spec_shared (const char **spec, const char *val)
2030{
2031 return set_static_spec (spec, val, false);
2032}
2033
2034
2035/* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
2036 removed; If the spec starts with a + then SPEC is added to the end of the
2037 current spec. */
2038
2039static void
2040set_spec (const char *name, const char *spec, bool user_p)
2041{
2042 struct spec_list *sl;
2043 const char *old_spec;
2044 int name_len = strlen (name);
2045 int i;
2046
2047 /* If this is the first call, initialize the statically allocated specs. */
2048 if (!specs)
2049 {
2050 struct spec_list *next = (struct spec_list *) 0;
2051 for (i = ARRAY_SIZE (static_specs)(sizeof (static_specs) / sizeof ((static_specs)[0])) - 1; i >= 0; i--)
2052 {
2053 sl = &static_specs[i];
2054 sl->next = next;
2055 next = sl;
2056 }
2057 specs = sl;
2058 }
2059
2060 /* See if the spec already exists. */
2061 for (sl = specs; sl; sl = sl->next)
2062 if (name_len == sl->name_len && !strcmp (sl->name, name))
2063 break;
2064
2065 if (!sl)
2066 {
2067 /* Not found - make it. */
2068 sl = XNEW (struct spec_list)((struct spec_list *) xmalloc (sizeof (struct spec_list)));
2069 sl->name = xstrdup (name);
2070 sl->name_len = name_len;
2071 sl->ptr_spec = &sl->ptr;
2072 sl->alloc_p = 0;
2073 *(sl->ptr_spec) = "";
2074 sl->next = specs;
2075 sl->default_ptr = NULL__null;
2076 specs = sl;
2077 }
2078
2079 old_spec = *(sl->ptr_spec);
2080 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1])(_sch_istable[((unsigned char)spec[1]) & 0xff] & (unsigned
short)(_sch_isspace))
)
2081 ? concat (old_spec, spec + 1, NULL__null)
2082 : xstrdup (spec));
2083
2084#ifdef DEBUG_SPECS
2085 if (verbose_flagglobal_options.x_verbose_flag)
2086 fnotice (stderrstderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
2087#endif
2088
2089 /* Free the old spec. */
2090 if (old_spec && sl->alloc_p)
2091 free (CONST_CAST (char *, old_spec)(const_cast<char *> ((old_spec))));
2092
2093 sl->user_p = user_p;
2094 sl->alloc_p = true;
2095}
2096
2097/* Accumulate a command (program name and args), and run it. */
2098
2099typedef const char *const_char_p; /* For DEF_VEC_P. */
2100
2101/* Vector of pointers to arguments in the current line of specifications. */
2102static vec<const_char_p> argbuf;
2103
2104/* Likewise, but for the current @file. */
2105static vec<const_char_p> at_file_argbuf;
2106
2107/* Whether an @file is currently open. */
2108static bool in_at_file = false;
2109
2110/* Were the options -c, -S or -E passed. */
2111static int have_c = 0;
2112
2113/* Was the option -o passed. */
2114static int have_o = 0;
2115
2116/* Was the option -E passed. */
2117static int have_E = 0;
2118
2119/* Pointer to output file name passed in with -o. */
2120static const char *output_file = 0;
2121
2122/* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
2123 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
2124 it here. */
2125
2126static struct temp_name {
2127 const char *suffix; /* suffix associated with the code. */
2128 int length; /* strlen (suffix). */
2129 int unique; /* Indicates whether %g or %u/%U was used. */
2130 const char *filename; /* associated filename. */
2131 int filename_length; /* strlen (filename). */
2132 struct temp_name *next;
2133} *temp_names;
2134
2135/* Number of commands executed so far. */
2136
2137static int execution_count;
2138
2139/* Number of commands that exited with a signal. */
2140
2141static int signal_count;
2142
2143/* Allocate the argument vector. */
2144
2145static void
2146alloc_args (void)
2147{
2148 argbuf.create (10);
2149 at_file_argbuf.create (10);
2150}
2151
2152/* Clear out the vector of arguments (after a command is executed). */
2153
2154static void
2155clear_args (void)
2156{
2157 argbuf.truncate (0);
2158 at_file_argbuf.truncate (0);
2159}
2160
2161/* Add one argument to the vector at the end.
2162 This is done when a space is seen or at the end of the line.
2163 If DELETE_ALWAYS is nonzero, the arg is a filename
2164 and the file should be deleted eventually.
2165 If DELETE_FAILURE is nonzero, the arg is a filename
2166 and the file should be deleted if this compilation fails. */
2167
2168static void
2169store_arg (const char *arg, int delete_always, int delete_failure)
2170{
2171 if (in_at_file)
2172 at_file_argbuf.safe_push (arg);
2173 else
2174 argbuf.safe_push (arg);
2175
2176 if (delete_always || delete_failure)
2177 {
2178 const char *p;
2179 /* If the temporary file we should delete is specified as
2180 part of a joined argument extract the filename. */
2181 if (arg[0] == '-'
2182 && (p = strrchr (arg, '=')))
2183 arg = p + 1;
2184 record_temp_file (arg, delete_always, delete_failure);
2185 }
2186}
2187
2188/* Open a temporary @file into which subsequent arguments will be stored. */
2189
2190static void
2191open_at_file (void)
2192{
2193 if (in_at_file)
2194 fatal_error (input_location, "cannot open nested response file");
2195 else
2196 in_at_file = true;
2197}
2198
2199/* Create a temporary @file name. */
2200
2201static char *make_at_file (void)
2202{
2203 static int fileno = 0;
2204 char filename[20];
2205 const char *base, *ext;
2206
2207 if (!save_temps_flag)
2208 return make_temp_file ("");
2209
2210 base = dumpbase;
2211 if (!(base && *base))
2212 base = dumpdir;
2213 if (!(base && *base))
2214 base = "a";
2215
2216 sprintf (filename, ".args.%d", fileno++);
2217 ext = filename;
2218
2219 if (base == dumpdir && dumpdir_trailing_dash_added)
2220 ext++;
2221
2222 return concat (base, ext, NULL__null);
2223}
2224
2225/* Close the temporary @file and add @file to the argument list. */
2226
2227static void
2228close_at_file (void)
2229{
2230 if (!in_at_file)
2231 fatal_error (input_location, "cannot close nonexistent response file");
2232
2233 in_at_file = false;
2234
2235 const unsigned int n_args = at_file_argbuf.length ();
2236 if (n_args == 0)
2237 return;
2238
2239 char **argv = (char **) alloca (sizeof (char *) * (n_args + 1))__builtin_alloca(sizeof (char *) * (n_args + 1));
2240 char *temp_file = make_at_file ();
2241 char *at_argument = concat ("@", temp_file, NULL__null);
2242 FILE *f = fopen (temp_file, "w");
2243 int status;
2244 unsigned int i;
2245
2246 /* Copy the strings over. */
2247 for (i = 0; i < n_args; i++)
2248 argv[i] = CONST_CAST (char *, at_file_argbuf[i])(const_cast<char *> ((at_file_argbuf[i])));
2249 argv[i] = NULL__null;
2250
2251 at_file_argbuf.truncate (0);
2252
2253 if (f == NULL__null)
2254 fatal_error (input_location, "could not open temporary response file %s",
2255 temp_file);
2256
2257 status = writeargv (argv, f);
2258
2259 if (status)
2260 fatal_error (input_location,
2261 "could not write to temporary response file %s",
2262 temp_file);
2263
2264 status = fclose (f);
2265
2266 if (status == EOF(-1))
2267 fatal_error (input_location, "could not close temporary response file %s",
2268 temp_file);
2269
2270 store_arg (at_argument, 0, 0);
2271
2272 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
2273}
2274
2275/* Load specs from a file name named FILENAME, replacing occurrences of
2276 various different types of line-endings, \r\n, \n\r and just \r, with
2277 a single \n. */
2278
2279static char *
2280load_specs (const char *filename)
2281{
2282 int desc;
2283 int readlen;
2284 struct stat statbuf;
2285 char *buffer;
2286 char *buffer_p;
2287 char *specs;
2288 char *specs_p;
2289
2290 if (verbose_flagglobal_options.x_verbose_flag)
2291 fnotice (stderrstderr, "Reading specs from %s\n", filename);
2292
2293 /* Open and stat the file. */
2294 desc = open (filename, O_RDONLY00, 0);
2295 if (desc < 0)
2296 {
2297 failed:
2298 /* This leaves DESC open, but the OS will save us. */
2299 fatal_error (input_location, "cannot read spec file %qs: %m", filename);
2300 }
2301
2302 if (stat (filename, &statbuf) < 0)
2303 goto failed;
2304
2305 /* Read contents of file into BUFFER. */
2306 buffer = XNEWVEC (char, statbuf.st_size + 1)((char *) xmalloc (sizeof (char) * (statbuf.st_size + 1)));
2307 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2308 if (readlen < 0)
2309 goto failed;
2310 buffer[readlen] = 0;
2311 close (desc);
2312
2313 specs = XNEWVEC (char, readlen + 1)((char *) xmalloc (sizeof (char) * (readlen + 1)));
2314 specs_p = specs;
2315 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2316 {
2317 int skip = 0;
2318 char c = *buffer_p;
2319 if (c == '\r')
2320 {
2321 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2322 skip = 1;
2323 else if (*(buffer_p + 1) == '\n') /* \r\n */
2324 skip = 1;
2325 else /* \r */
2326 c = '\n';
2327 }
2328 if (! skip)
2329 *specs_p++ = c;
2330 }
2331 *specs_p = '\0';
2332
2333 free (buffer);
2334 return (specs);
2335}
2336
2337/* Read compilation specs from a file named FILENAME,
2338 replacing the default ones.
2339
2340 A suffix which starts with `*' is a definition for
2341 one of the machine-specific sub-specs. The "suffix" should be
2342 *asm, *cc1, *cpp, *link, *startfile, etc.
2343 The corresponding spec is stored in asm_spec, etc.,
2344 rather than in the `compilers' vector.
2345
2346 Anything invalid in the file is a fatal error. */
2347
2348static void
2349read_specs (const char *filename, bool main_p, bool user_p)
2350{
2351 char *buffer;
2352 char *p;
2353
2354 buffer = load_specs (filename);
2355
2356 /* Scan BUFFER for specs, putting them in the vector. */
2357 p = buffer;
2358 while (1)
2359 {
2360 char *suffix;
2361 char *spec;
2362 char *in, *out, *p1, *p2, *p3;
2363
2364 /* Advance P in BUFFER to the next nonblank nocomment line. */
2365 p = skip_whitespace (p);
2366 if (*p == 0)
2367 break;
2368
2369 /* Is this a special command that starts with '%'? */
2370 /* Don't allow this for the main specs file, since it would
2371 encourage people to overwrite it. */
2372 if (*p == '%' && !main_p)
2373 {
2374 p1 = p;
2375 while (*p && *p != '\n')
2376 p++;
2377
2378 /* Skip '\n'. */
2379 p++;
2380
2381 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2382 && (p1[sizeof "%include" - 1] == ' '
2383 || p1[sizeof "%include" - 1] == '\t'))
2384 {
2385 char *new_filename;
2386
2387 p1 += sizeof ("%include");
2388 while (*p1 == ' ' || *p1 == '\t')
2389 p1++;
2390
2391 if (*p1++ != '<' || p[-2] != '>')
2392 fatal_error (input_location,
2393 "specs %%include syntax malformed after "
2394 "%ld characters",
2395 (long) (p1 - buffer + 1));
2396
2397 p[-2] = '\0';
2398 new_filename = find_a_file (&startfile_prefixes, p1, R_OK4, true);
2399 read_specs (new_filename ? new_filename : p1, false, user_p);
2400 continue;
2401 }
2402 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2403 && (p1[sizeof "%include_noerr" - 1] == ' '
2404 || p1[sizeof "%include_noerr" - 1] == '\t'))
2405 {
2406 char *new_filename;
2407
2408 p1 += sizeof "%include_noerr";
2409 while (*p1 == ' ' || *p1 == '\t')
2410 p1++;
2411
2412 if (*p1++ != '<' || p[-2] != '>')
2413 fatal_error (input_location,
2414 "specs %%include syntax malformed after "
2415 "%ld characters",
2416 (long) (p1 - buffer + 1));
2417
2418 p[-2] = '\0';
2419 new_filename = find_a_file (&startfile_prefixes, p1, R_OK4, true);
2420 if (new_filename)
2421 read_specs (new_filename, false, user_p);
2422 else if (verbose_flagglobal_options.x_verbose_flag)
2423 fnotice (stderrstderr, "could not find specs file %s\n", p1);
2424 continue;
2425 }
2426 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2427 && (p1[sizeof "%rename" - 1] == ' '
2428 || p1[sizeof "%rename" - 1] == '\t'))
2429 {
2430 int name_len;
2431 struct spec_list *sl;
2432 struct spec_list *newsl;
2433
2434 /* Get original name. */
2435 p1 += sizeof "%rename";
2436 while (*p1 == ' ' || *p1 == '\t')
2437 p1++;
2438
2439 if (! ISALPHA ((unsigned char) *p1)(_sch_istable[((unsigned char) *p1) & 0xff] & (unsigned
short)(_sch_isalpha))
)
2440 fatal_error (input_location,
2441 "specs %%rename syntax malformed after "
2442 "%ld characters",
2443 (long) (p1 - buffer));
2444
2445 p2 = p1;
2446 while (*p2 && !ISSPACE ((unsigned char) *p2)(_sch_istable[((unsigned char) *p2) & 0xff] & (unsigned
short)(_sch_isspace))
)
2447 p2++;
2448
2449 if (*p2 != ' ' && *p2 != '\t')
2450 fatal_error (input_location,
2451 "specs %%rename syntax malformed after "
2452 "%ld characters",
2453 (long) (p2 - buffer));
2454
2455 name_len = p2 - p1;
2456 *p2++ = '\0';
2457 while (*p2 == ' ' || *p2 == '\t')
2458 p2++;
2459
2460 if (! ISALPHA ((unsigned char) *p2)(_sch_istable[((unsigned char) *p2) & 0xff] & (unsigned
short)(_sch_isalpha))
)
2461 fatal_error (input_location,
2462 "specs %%rename syntax malformed after "
2463 "%ld characters",
2464 (long) (p2 - buffer));
2465
2466 /* Get new spec name. */
2467 p3 = p2;
2468 while (*p3 && !ISSPACE ((unsigned char) *p3)(_sch_istable[((unsigned char) *p3) & 0xff] & (unsigned
short)(_sch_isspace))
)
2469 p3++;
2470
2471 if (p3 != p - 1)
2472 fatal_error (input_location,
2473 "specs %%rename syntax malformed after "
2474 "%ld characters",
2475 (long) (p3 - buffer));
2476 *p3 = '\0';
2477
2478 for (sl = specs; sl; sl = sl->next)
2479 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2480 break;
2481
2482 if (!sl)
2483 fatal_error (input_location,
2484 "specs %s spec was not found to be renamed", p1);
2485
2486 if (strcmp (p1, p2) == 0)
2487 continue;
2488
2489 for (newsl = specs; newsl; newsl = newsl->next)
2490 if (strcmp (newsl->name, p2) == 0)
2491 fatal_error (input_location,
2492 "%s: attempt to rename spec %qs to "
2493 "already defined spec %qs",
2494 filename, p1, p2);
2495
2496 if (verbose_flagglobal_options.x_verbose_flag)
2497 {
2498 fnotice (stderrstderr, "rename spec %s to %s\n", p1, p2);
2499#ifdef DEBUG_SPECS
2500 fnotice (stderrstderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2501#endif
2502 }
2503
2504 set_spec (p2, *(sl->ptr_spec), user_p);
2505 if (sl->alloc_p)
2506 free (CONST_CAST (char *, *(sl->ptr_spec))(const_cast<char *> ((*(sl->ptr_spec)))));
2507
2508 *(sl->ptr_spec) = "";
2509 sl->alloc_p = 0;
2510 continue;
2511 }
2512 else
2513 fatal_error (input_location,
2514 "specs unknown %% command after %ld characters",
2515 (long) (p1 - buffer));
2516 }
2517
2518 /* Find the colon that should end the suffix. */
2519 p1 = p;
2520 while (*p1 && *p1 != ':' && *p1 != '\n')
2521 p1++;
2522
2523 /* The colon shouldn't be missing. */
2524 if (*p1 != ':')
2525 fatal_error (input_location,
2526 "specs file malformed after %ld characters",
2527 (long) (p1 - buffer));
2528
2529 /* Skip back over trailing whitespace. */
2530 p2 = p1;
2531 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2532 p2--;
2533
2534 /* Copy the suffix to a string. */
2535 suffix = save_string (p, p2 - p);
2536 /* Find the next line. */
2537 p = skip_whitespace (p1 + 1);
2538 if (p[1] == 0)
2539 fatal_error (input_location,
2540 "specs file malformed after %ld characters",
2541 (long) (p - buffer));
2542
2543 p1 = p;
2544 /* Find next blank line or end of string. */
2545 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2546 p1++;
2547
2548 /* Specs end at the blank line and do not include the newline. */
2549 spec = save_string (p, p1 - p);
2550 p = p1;
2551
2552 /* Delete backslash-newline sequences from the spec. */
2553 in = spec;
2554 out = spec;
2555 while (*in != 0)
2556 {
2557 if (in[0] == '\\' && in[1] == '\n')
2558 in += 2;
2559 else if (in[0] == '#')
2560 while (*in && *in != '\n')
2561 in++;
2562
2563 else
2564 *out++ = *in++;
2565 }
2566 *out = 0;
2567
2568 if (suffix[0] == '*')
2569 {
2570 if (! strcmp (suffix, "*link_command"))
2571 link_command_spec = spec;
2572 else
2573 {
2574 set_spec (suffix + 1, spec, user_p);
2575 free (spec);
2576 }
2577 }
2578 else
2579 {
2580 /* Add this pair to the vector. */
2581 compilers
2582 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2)((struct compiler *) xrealloc ((void *) (compilers), sizeof (
struct compiler) * (n_compilers + 2)))
;
2583
2584 compilers[n_compilers].suffix = suffix;
2585 compilers[n_compilers].spec = spec;
2586 n_compilers++;
2587 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2588 }
2589
2590 if (*suffix == 0)
2591 link_command_spec = spec;
2592 }
2593
2594 if (link_command_spec == 0)
2595 fatal_error (input_location, "spec file has no spec for linking");
2596
2597 XDELETEVEC (buffer)free ((void*) (buffer));
2598}
2599
2600/* Record the names of temporary files we tell compilers to write,
2601 and delete them at the end of the run. */
2602
2603/* This is the common prefix we use to make temp file names.
2604 It is chosen once for each run of this program.
2605 It is substituted into a spec by %g or %j.
2606 Thus, all temp file names contain this prefix.
2607 In practice, all temp file names start with this prefix.
2608
2609 This prefix comes from the envvar TMPDIR if it is defined;
2610 otherwise, from the P_tmpdir macro if that is defined;
2611 otherwise, in /usr/tmp or /tmp;
2612 or finally the current directory if all else fails. */
2613
2614static const char *temp_filename;
2615
2616/* Length of the prefix. */
2617
2618static int temp_filename_length;
2619
2620/* Define the list of temporary files to delete. */
2621
2622struct temp_file
2623{
2624 const char *name;
2625 struct temp_file *next;
2626};
2627
2628/* Queue of files to delete on success or failure of compilation. */
2629static struct temp_file *always_delete_queue;
2630/* Queue of files to delete on failure of compilation. */
2631static struct temp_file *failure_delete_queue;
2632
2633/* Record FILENAME as a file to be deleted automatically.
2634 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2635 otherwise delete it in any case.
2636 FAIL_DELETE nonzero means delete it if a compilation step fails;
2637 otherwise delete it in any case. */
2638
2639void
2640record_temp_file (const char *filename, int always_delete, int fail_delete)
2641{
2642 char *const name = xstrdup (filename);
2643
2644 if (always_delete)
2645 {
2646 struct temp_file *temp;
2647 for (temp = always_delete_queue; temp; temp = temp->next)
2648 if (! filename_cmp (name, temp->name))
2649 {
2650 free (name);
2651 goto already1;
2652 }
2653
2654 temp = XNEW (struct temp_file)((struct temp_file *) xmalloc (sizeof (struct temp_file)));
2655 temp->next = always_delete_queue;
2656 temp->name = name;
2657 always_delete_queue = temp;
2658
2659 already1:;
2660 }
2661
2662 if (fail_delete)
2663 {
2664 struct temp_file *temp;
2665 for (temp = failure_delete_queue; temp; temp = temp->next)
2666 if (! filename_cmp (name, temp->name))
2667 {
2668 free (name);
2669 goto already2;
2670 }
2671
2672 temp = XNEW (struct temp_file)((struct temp_file *) xmalloc (sizeof (struct temp_file)));
2673 temp->next = failure_delete_queue;
2674 temp->name = name;
2675 failure_delete_queue = temp;
2676
2677 already2:;
2678 }
2679}
2680
2681/* Delete all the temporary files whose names we previously recorded. */
2682
2683#ifndef DELETE_IF_ORDINARY
2684#define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG)do { if (stat (NAME, &ST) >= 0 && ((((ST.st_mode
)) & 0170000) == (0100000))) if (unlink (NAME) < 0) if
(VERBOSE_FLAG) error ("%s: %m", (NAME)); } while (0)
\
2685do \
2686 { \
2687 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)((((ST.st_mode)) & 0170000) == (0100000))) \
2688 if (unlink (NAME) < 0) \
2689 if (VERBOSE_FLAG) \
2690 error ("%s: %m", (NAME)); \
2691 } while (0)
2692#endif
2693
2694static void
2695delete_if_ordinary (const char *name)
2696{
2697 struct stat st;
2698#ifdef DEBUG
2699 int i, c;
2700
2701 printf ("Delete %s? (y or n) ", name);
2702 fflush (stdoutstdout);
2703 i = getchar ();
2704 if (i != '\n')
2705 while ((c = getchar ()) != '\n' && c != EOF(-1))
2706 ;
2707
2708 if (i == 'y' || i == 'Y')
2709#endif /* DEBUG */
2710 DELETE_IF_ORDINARY (name, st, verbose_flag)do { if (stat (name, &st) >= 0 && ((((st.st_mode
)) & 0170000) == (0100000))) if (unlink (name) < 0) if
(global_options.x_verbose_flag) error ("%s: %m", (name)); } while
(0)
;
2711}
2712
2713static void
2714delete_temp_files (void)
2715{
2716 struct temp_file *temp;
2717
2718 for (temp = always_delete_queue; temp; temp = temp->next)
2719 delete_if_ordinary (temp->name);
2720 always_delete_queue = 0;
2721}
2722
2723/* Delete all the files to be deleted on error. */
2724
2725static void
2726delete_failure_queue (void)
2727{
2728 struct temp_file *temp;
2729
2730 for (temp = failure_delete_queue; temp; temp = temp->next)
2731 delete_if_ordinary (temp->name);
2732}
2733
2734static void
2735clear_failure_queue (void)
2736{
2737 failure_delete_queue = 0;
2738}
2739
2740/* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2741 returns non-NULL.
2742 If DO_MULTI is true iterate over the paths twice, first with multilib
2743 suffix then without, otherwise iterate over the paths once without
2744 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2745 to avoid visiting the same path twice, but we could do better. For
2746 instance, /usr/lib/../lib is considered different from /usr/lib.
2747 At least EXTRA_SPACE chars past the end of the path passed to
2748 CALLBACK are available for use by the callback.
2749 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2750
2751 Returns the value returned by CALLBACK. */
2752
2753static void *
2754for_each_path (const struct path_prefix *paths,
2755 bool do_multi,
2756 size_t extra_space,
2757 void *(*callback) (char *, void *),
2758 void *callback_info)
2759{
2760 struct prefix_list *pl;
2761 const char *multi_dir = NULL__null;
2762 const char *multi_os_dir = NULL__null;
2763 const char *multiarch_suffix = NULL__null;
2764 const char *multi_suffix;
2765 const char *just_multi_suffix;
2766 char *path = NULL__null;
2767 void *ret = NULL__null;
2768 bool skip_multi_dir = false;
2769 bool skip_multi_os_dir = false;
2770
2771 multi_suffix = machine_suffix;
2772 just_multi_suffix = just_machine_suffix;
2773 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2774 {
2775 multi_dir = concat (multilib_dir, dir_separator_str, NULL__null);
2776 multi_suffix = concat (multi_suffix, multi_dir, NULL__null);
2777 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL__null);
2778 }
2779 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2780 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL__null);
2781 if (multiarch_dir)
2782 multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL__null);
2783
2784 while (1)
2785 {
2786 size_t multi_dir_len = 0;
2787 size_t multi_os_dir_len = 0;
2788 size_t multiarch_len = 0;
2789 size_t suffix_len;
2790 size_t just_suffix_len;
2791 size_t len;
2792
2793 if (multi_dir)
2794 multi_dir_len = strlen (multi_dir);
2795 if (multi_os_dir)
2796 multi_os_dir_len = strlen (multi_os_dir);
2797 if (multiarch_suffix)
2798 multiarch_len = strlen (multiarch_suffix);
2799 suffix_len = strlen (multi_suffix);
2800 just_suffix_len = strlen (just_multi_suffix);
2801
2802 if (path == NULL__null)
2803 {
2804 len = paths->max_len + extra_space + 1;
2805 len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len)((((suffix_len) > (multi_os_dir_len) ? (suffix_len) : (multi_os_dir_len
))) > (multiarch_len) ? (((suffix_len) > (multi_os_dir_len
) ? (suffix_len) : (multi_os_dir_len))) : (multiarch_len))
;
2806 path = XNEWVEC (char, len)((char *) xmalloc (sizeof (char) * (len)));
2807 }
2808
2809 for (pl = paths->plist; pl != 0; pl = pl->next)
2810 {
2811 len = strlen (pl->prefix);
2812 memcpy (path, pl->prefix, len);
2813
2814 /* Look first in MACHINE/VERSION subdirectory. */
2815 if (!skip_multi_dir)
2816 {
2817 memcpy (path + len, multi_suffix, suffix_len + 1);
2818 ret = callback (path, callback_info);
2819 if (ret)
2820 break;
2821 }
2822
2823 /* Some paths are tried with just the machine (ie. target)
2824 subdir. This is used for finding as, ld, etc. */
2825 if (!skip_multi_dir
2826 && pl->require_machine_suffix == 2)
2827 {
2828 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2829 ret = callback (path, callback_info);
2830 if (ret)
2831 break;
2832 }
2833
2834 /* Now try the multiarch path. */
2835 if (!skip_multi_dir
2836 && !pl->require_machine_suffix && multiarch_dir)
2837 {
2838 memcpy (path + len, multiarch_suffix, multiarch_len + 1);
2839 ret = callback (path, callback_info);
2840 if (ret)
2841 break;
2842 }
2843
2844 /* Now try the base path. */
2845 if (!pl->require_machine_suffix
2846 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2847 {
2848 const char *this_multi;
2849 size_t this_multi_len;
2850
2851 if (pl->os_multilib)
2852 {
2853 this_multi = multi_os_dir;
2854 this_multi_len = multi_os_dir_len;
2855 }
2856 else
2857 {
2858 this_multi = multi_dir;
2859 this_multi_len = multi_dir_len;
2860 }
2861
2862 if (this_multi_len)
2863 memcpy (path + len, this_multi, this_multi_len + 1);
2864 else
2865 path[len] = '\0';
2866
2867 ret = callback (path, callback_info);
2868 if (ret)
2869 break;
2870 }
2871 }
2872 if (pl)
2873 break;
2874
2875 if (multi_dir == NULL__null && multi_os_dir == NULL__null)
2876 break;
2877
2878 /* Run through the paths again, this time without multilibs.
2879 Don't repeat any we have already seen. */
2880 if (multi_dir)
2881 {
2882 free (CONST_CAST (char *, multi_dir)(const_cast<char *> ((multi_dir))));
2883 multi_dir = NULL__null;
2884 free (CONST_CAST (char *, multi_suffix)(const_cast<char *> ((multi_suffix))));
2885 multi_suffix = machine_suffix;
2886 free (CONST_CAST (char *, just_multi_suffix)(const_cast<char *> ((just_multi_suffix))));
2887 just_multi_suffix = just_machine_suffix;
2888 }
2889 else
2890 skip_multi_dir = true;
2891 if (multi_os_dir)
2892 {
2893 free (CONST_CAST (char *, multi_os_dir)(const_cast<char *> ((multi_os_dir))));
2894 multi_os_dir = NULL__null;
2895 }
2896 else
2897 skip_multi_os_dir = true;
2898 }
2899
2900 if (multi_dir)
2901 {
2902 free (CONST_CAST (char *, multi_dir)(const_cast<char *> ((multi_dir))));
2903 free (CONST_CAST (char *, multi_suffix)(const_cast<char *> ((multi_suffix))));
2904 free (CONST_CAST (char *, just_multi_suffix)(const_cast<char *> ((just_multi_suffix))));
2905 }
2906 if (multi_os_dir)
2907 free (CONST_CAST (char *, multi_os_dir)(const_cast<char *> ((multi_os_dir))));
2908 if (ret != path)
2909 free (path);
2910 return ret;
2911}
2912
2913/* Callback for build_search_list. Adds path to obstack being built. */
2914
2915struct add_to_obstack_info {
2916 struct obstack *ob;
2917 bool check_dir;
2918 bool first_time;
2919};
2920
2921static void *
2922add_to_obstack (char *path, void *data)
2923{
2924 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2925
2926 if (info->check_dir && !is_directory (path, false))
2927 return NULL__null;
2928
2929 if (!info->first_time)
2930 obstack_1grow (info->ob, PATH_SEPARATOR)__extension__ ({ struct obstack *__o = (info->ob); if (__extension__
({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < 1) _obstack_newchunk (__o, 1)
; ((void) (*((__o)->next_free)++ = (':'))); })
;
2931
2932 obstack_grow (info->ob, path, strlen (path))__extension__ ({ struct obstack *__o = (info->ob); size_t __len
= (strlen (path)); if (__extension__ ({ struct obstack const
*__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free
); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o
->next_free, path, __len); __o->next_free += __len; (void
) 0; })
;
2933
2934 info->first_time = false;
2935 return NULL__null;
2936}
2937
2938/* Add or change the value of an environment variable, outputting the
2939 change to standard error if in verbose mode. */
2940static void
2941xputenv (const char *string)
2942{
2943 env.xput (string);
2944}
2945
2946/* Build a list of search directories from PATHS.
2947 PREFIX is a string to prepend to the list.
2948 If CHECK_DIR_P is true we ensure the directory exists.
2949 If DO_MULTI is true, multilib paths are output first, then
2950 non-multilib paths.
2951 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2952 It is also used by the --print-search-dirs flag. */
2953
2954static char *
2955build_search_list (const struct path_prefix *paths, const char *prefix,
2956 bool check_dir, bool do_multi)
2957{
2958 struct add_to_obstack_info info;
2959
2960 info.ob = &collect_obstack;
2961 info.check_dir = check_dir;
2962 info.first_time = true;
2963
2964 obstack_grow (&collect_obstack, prefix, strlen (prefix))__extension__ ({ struct obstack *__o = (&collect_obstack)
; size_t __len = (strlen (prefix)); if (__extension__ ({ struct
obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit -
__o1->next_free); }) < __len) _obstack_newchunk (__o, __len
); memcpy (__o->next_free, prefix, __len); __o->next_free
+= __len; (void) 0; })
;
2965 obstack_1grow (&collect_obstack, '=')__extension__ ({ struct obstack *__o = (&collect_obstack)
; if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t
) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk
(__o, 1); ((void) (*((__o)->next_free)++ = ('='))); })
;
2966
2967 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2968
2969 obstack_1grow (&collect_obstack, '\0')__extension__ ({ struct obstack *__o = (&collect_obstack)
; if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t
) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk
(__o, 1); ((void) (*((__o)->next_free)++ = ('\0'))); })
;
2970 return XOBFINISH (&collect_obstack, char *)((char *) __extension__ ({ struct obstack *__o1 = ((&collect_obstack
)); void *__value = (void *) __o1->object_base; if (__o1->
next_free == __value) __o1->maybe_empty_object = 1; __o1->
next_free = ((sizeof (ptrdiff_t) < sizeof (void *) ? (__o1
->object_base) : (char *) 0) + (((__o1->next_free) - (sizeof
(ptrdiff_t) < sizeof (void *) ? (__o1->object_base) : (
char *) 0) + (__o1->alignment_mask)) & ~(__o1->alignment_mask
))); if ((size_t) (__o1->next_free - (char *) __o1->chunk
) > (size_t) (__o1->chunk_limit - (char *) __o1->chunk
)) __o1->next_free = __o1->chunk_limit; __o1->object_base
= __o1->next_free; __value; }))
;
2971}
2972
2973/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2974 for collect. */
2975
2976static void
2977putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2978 bool do_multi)
2979{
2980 xputenv (build_search_list (paths, env_var, true, do_multi));
2981}
2982
2983/* Check whether NAME can be accessed in MODE. This is like access,
2984 except that it never considers directories to be executable. */
2985
2986static int
2987access_check (const char *name, int mode)
2988{
2989 if (mode == X_OK1)
2990 {
2991 struct stat st;
2992
2993 if (stat (name, &st) < 0
2994 || S_ISDIR (st.st_mode)((((st.st_mode)) & 0170000) == (0040000)))
2995 return -1;
2996 }
2997
2998 return access (name, mode);
2999}
3000
3001/* Callback for find_a_file. Appends the file name to the directory
3002 path. If the resulting file exists in the right mode, return the
3003 full pathname to the file. */
3004
3005struct file_at_path_info {
3006 const char *name;
3007 const char *suffix;
3008 int name_len;
3009 int suffix_len;
3010 int mode;
3011};
3012
3013static void *
3014file_at_path (char *path, void *data)
3015{
3016 struct file_at_path_info *info = (struct file_at_path_info *) data;
3017 size_t len = strlen (path);
3018
3019 memcpy (path + len, info->name, info->name_len);
3020 len += info->name_len;
3021
3022 /* Some systems have a suffix for executable files.
3023 So try appending that first. */
3024 if (info->suffix_len)
3025 {
3026 memcpy (path + len, info->suffix, info->suffix_len + 1);
3027 if (access_check (path, info->mode) == 0)
3028 return path;
3029 }
3030
3031 path[len] = '\0';
3032 if (access_check (path, info->mode) == 0)
3033 return path;
3034
3035 return NULL__null;
3036}
3037
3038/* Search for NAME using the prefix list PREFIXES. MODE is passed to
3039 access to check permissions. If DO_MULTI is true, search multilib
3040 paths then non-multilib paths, otherwise do not search multilib paths.
3041 Return 0 if not found, otherwise return its name, allocated with malloc. */
3042
3043static char *
3044find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
3045 bool do_multi)
3046{
3047 struct file_at_path_info info;
3048
3049#ifdef DEFAULT_ASSEMBLER
3050 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
3051 return xstrdup (DEFAULT_ASSEMBLER);
3052#endif
3053
3054#ifdef DEFAULT_LINKER
3055 if (! strcmp (name, "ld") && access (DEFAULT_LINKER, mode) == 0)
3056 return xstrdup (DEFAULT_LINKER);
3057#endif
3058
3059 /* Determine the filename to execute (special case for absolute paths). */
3060
3061 if (IS_ABSOLUTE_PATH (name)(((((name)[0]) == '/') || ((((name)[0]) == '\\') && (
0))) || ((name)[0] && ((name)[1] == ':') && (
0)))
)
3062 {
3063 if (access (name, mode) == 0)
3064 return xstrdup (name);
3065
3066 return NULL__null;
3067 }
3068
3069 info.name = name;
3070 info.suffix = (mode & X_OK1) != 0 ? HOST_EXECUTABLE_SUFFIX"" : "";
3071 info.name_len = strlen (info.name);
3072 info.suffix_len = strlen (info.suffix);
3073 info.mode = mode;
3074
3075 return (char*) for_each_path (pprefix, do_multi,
3076 info.name_len + info.suffix_len,
3077 file_at_path, &info);
3078}
3079
3080/* Ranking of prefixes in the sort list. -B prefixes are put before
3081 all others. */
3082
3083enum path_prefix_priority
3084{
3085 PREFIX_PRIORITY_B_OPT,
3086 PREFIX_PRIORITY_LAST
3087};
3088
3089/* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
3090 order according to PRIORITY. Within each PRIORITY, new entries are
3091 appended.
3092
3093 If WARN is nonzero, we will warn if no file is found
3094 through this prefix. WARN should point to an int
3095 which will be set to 1 if this entry is used.
3096
3097 COMPONENT is the value to be passed to update_path.
3098
3099 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
3100 the complete value of machine_suffix.
3101 2 means try both machine_suffix and just_machine_suffix. */
3102
3103static void
3104add_prefix (struct path_prefix *pprefix, const char *prefix,
3105 const char *component, /* enum prefix_priority */ int priority,
3106 int require_machine_suffix, int os_multilib)
3107{
3108 struct prefix_list *pl, **prev;
3109 int len;
3110
3111 for (prev = &pprefix->plist;
3112 (*prev) != NULL__null && (*prev)->priority <= priority;
3113 prev = &(*prev)->next)
3114 ;
3115
3116 /* Keep track of the longest prefix. */
3117
3118 prefix = update_path (prefix, component);
3119 len = strlen (prefix);
3120 if (len > pprefix->max_len)
3121 pprefix->max_len = len;
3122
3123 pl = XNEW (struct prefix_list)((struct prefix_list *) xmalloc (sizeof (struct prefix_list))
)
;
3124 pl->prefix = prefix;
3125 pl->require_machine_suffix = require_machine_suffix;
3126 pl->priority = priority;
3127 pl->os_multilib = os_multilib;
3128
3129 /* Insert after PREV. */
3130 pl->next = (*prev);
3131 (*prev) = pl;
3132}
3133
3134/* Same as add_prefix, but prepending target_system_root to prefix. */
3135/* The target_system_root prefix has been relocated by gcc_exec_prefix. */
3136static void
3137add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
3138 const char *component,
3139 /* enum prefix_priority */ int priority,
3140 int require_machine_suffix, int os_multilib)
3141{
3142 if (!IS_ABSOLUTE_PATH (prefix)(((((prefix)[0]) == '/') || ((((prefix)[0]) == '\\') &&
(0))) || ((prefix)[0] && ((prefix)[1] == ':') &&
(0)))
)
3143 fatal_error (input_location, "system path %qs is not absolute", prefix);
3144
3145 if (target_system_root)
3146 {
3147 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
3148 size_t sysroot_len = strlen (target_system_root);
3149
3150 if (sysroot_len > 0
3151 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR'/')
3152 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3153
3154 if (target_sysroot_suffix)
3155 prefix = concat (sysroot_no_trailing_dir_separator,
3156 target_sysroot_suffix, prefix, NULL__null);
3157 else
3158 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL__null);
3159
3160 free (sysroot_no_trailing_dir_separator);
3161
3162 /* We have to override this because GCC's notion of sysroot
3163 moves along with GCC. */
3164 component = "GCC";
3165 }
3166
3167 add_prefix (pprefix, prefix, component, priority,
3168 require_machine_suffix, os_multilib);
3169}
3170
3171/* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */
3172
3173static void
3174add_sysrooted_hdrs_prefix (struct path_prefix *pprefix, const char *prefix,
3175 const char *component,
3176 /* enum prefix_priority */ int priority,
3177 int require_machine_suffix, int os_multilib)
3178{
3179 if (!IS_ABSOLUTE_PATH (prefix)(((((prefix)[0]) == '/') || ((((prefix)[0]) == '\\') &&
(0))) || ((prefix)[0] && ((prefix)[1] == ':') &&
(0)))
)
3180 fatal_error (input_location, "system path %qs is not absolute", prefix);
3181
3182 if (target_system_root)
3183 {
3184 char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root);
3185 size_t sysroot_len = strlen (target_system_root);
3186
3187 if (sysroot_len > 0
3188 && target_system_root[sysroot_len - 1] == DIR_SEPARATOR'/')
3189 sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0';
3190
3191 if (target_sysroot_hdrs_suffix)
3192 prefix = concat (sysroot_no_trailing_dir_separator,
3193 target_sysroot_hdrs_suffix, prefix, NULL__null);
3194 else
3195 prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL__null);
3196
3197 free (sysroot_no_trailing_dir_separator);
3198
3199 /* We have to override this because GCC's notion of sysroot
3200 moves along with GCC. */
3201 component = "GCC";
3202 }
3203
3204 add_prefix (pprefix, prefix, component, priority,
3205 require_machine_suffix, os_multilib);
3206}
3207
3208
3209/* Execute the command specified by the arguments on the current line of spec.
3210 When using pipes, this includes several piped-together commands
3211 with `|' between them.
3212
3213 Return 0 if successful, -1 if failed. */
3214
3215static int
3216execute (void)
3217{
3218 int i;
3219 int n_commands; /* # of command. */
3220 char *string;
3221 struct pex_obj *pex;
3222 struct command
3223 {
3224 const char *prog; /* program name. */
3225 const char **argv; /* vector of args. */
3226 };
3227 const char *arg;
3228
3229 struct command *commands; /* each command buffer with above info. */
3230
3231 gcc_assert (!processing_spec_function)((void)(!(!processing_spec_function) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 3231, __FUNCTION__), 0 : 0))
;
3232
3233 if (wrapper_stringglobal_options.x_wrapper_string)
3234 {
3235 string = find_a_file (&exec_prefixes,
3236 argbuf[0], X_OK1, false);
3237 if (string)
3238 argbuf[0] = string;
3239 insert_wrapper (wrapper_stringglobal_options.x_wrapper_string);
3240 }
3241
3242 /* Count # of piped commands. */
3243 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3244 if (strcmp (arg, "|") == 0)
3245 n_commands++;
3246
3247 /* Get storage for each command. */
3248 commands = (struct command *) alloca (n_commands * sizeof (struct command))__builtin_alloca(n_commands * sizeof (struct command));
3249
3250 /* Split argbuf into its separate piped processes,
3251 and record info about each one.
3252 Also search for the programs that are to be run. */
3253
3254 argbuf.safe_push (0);
3255
3256 commands[0].prog = argbuf[0]; /* first command. */
3257 commands[0].argv = argbuf.address ();
3258
3259 if (!wrapper_stringglobal_options.x_wrapper_string)
3260 {
3261 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK1, false);
3262 if (string)
3263 commands[0].argv[0] = string;
3264 }
3265
3266 for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++)
3267 if (arg && strcmp (arg, "|") == 0)
3268 { /* each command. */
3269#if defined (__MSDOS__) || defined (OS2) || defined (VMS)
3270 fatal_error (input_location, "%<-pipe%> not supported");
3271#endif
3272 argbuf[i] = 0; /* Termination of command args. */
3273 commands[n_commands].prog = argbuf[i + 1];
3274 commands[n_commands].argv
3275 = &(argbuf.address ())[i + 1];
3276 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
3277 X_OK1, false);
3278 if (string)
3279 commands[n_commands].argv[0] = string;
3280 n_commands++;
3281 }
3282
3283 /* If -v, print what we are about to do, and maybe query. */
3284
3285 if (verbose_flagglobal_options.x_verbose_flag)
3286 {
3287 /* For help listings, put a blank line between sub-processes. */
3288 if (print_help_list)
3289 fputc ('\n', stderrstderr);
3290
3291 /* Print each piped command as a separate line. */
3292 for (i = 0; i < n_commands; i++)
3293 {
3294 const char *const *j;
3295
3296 if (verbose_only_flag)
3297 {
3298 for (j = commands[i].argv; *j; j++)
3299 {
3300 const char *p;
3301 for (p = *j; *p; ++p)
3302 if (!ISALNUM ((unsigned char) *p)(_sch_istable[((unsigned char) *p) & 0xff] & (unsigned
short)(_sch_isalnum))
3303 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
3304 break;
3305 if (*p || !*j)
3306 {
3307 fprintf (stderrstderr, " \"");
3308 for (p = *j; *p; ++p)
3309 {
3310 if (*p == '"' || *p == '\\' || *p == '$')
3311 fputc ('\\', stderrstderr);
3312 fputc (*p, stderrstderr);
3313 }
3314 fputc ('"', stderrstderr);
3315 }
3316 /* If it's empty, print "". */
3317 else if (!**j)
3318 fprintf (stderrstderr, " \"\"");
3319 else
3320 fprintf (stderrstderr, " %s", *j);
3321 }
3322 }
3323 else
3324 for (j = commands[i].argv; *j; j++)
3325 /* If it's empty, print "". */
3326 if (!**j)
3327 fprintf (stderrstderr, " \"\"");
3328 else
3329 fprintf (stderrstderr, " %s", *j);
3330
3331 /* Print a pipe symbol after all but the last command. */
3332 if (i + 1 != n_commands)
3333 fprintf (stderrstderr, " |");
3334 fprintf (stderrstderr, "\n");
3335 }
3336 fflush (stderrstderr);
3337 if (verbose_only_flag != 0)
3338 {
3339 /* verbose_only_flag should act as if the spec was
3340 executed, so increment execution_count before
3341 returning. This prevents spurious warnings about
3342 unused linker input files, etc. */
3343 execution_count++;
3344 return 0;
3345 }
3346#ifdef DEBUG
3347 fnotice (stderrstderr, "\nGo ahead? (y or n) ");
3348 fflush (stderrstderr);
3349 i = getchar ();
3350 if (i != '\n')
3351 while (getchar () != '\n')
3352 ;
3353
3354 if (i != 'y' && i != 'Y')
3355 return 0;
3356#endif /* DEBUG */
3357 }
3358
3359#ifdef ENABLE_VALGRIND_CHECKING
3360 /* Run the each command through valgrind. To simplify prepending the
3361 path to valgrind and the option "-q" (for quiet operation unless
3362 something triggers), we allocate a separate argv array. */
3363
3364 for (i = 0; i < n_commands; i++)
3365 {
3366 const char **argv;
3367 int argc;
3368 int j;
3369
3370 for (argc = 0; commands[i].argv[argc] != NULL__null; argc++)
3371 ;
3372
3373 argv = XALLOCAVEC (const char *, argc + 3)((const char * *) __builtin_alloca(sizeof (const char *) * (argc
+ 3)))
;
3374
3375 argv[0] = VALGRIND_PATH;
3376 argv[1] = "-q";
3377 for (j = 2; j < argc + 2; j++)
3378 argv[j] = commands[i].argv[j - 2];
3379 argv[j] = NULL__null;
3380
3381 commands[i].argv = argv;
3382 commands[i].prog = argv[0];
3383 }
3384#endif
3385
3386 /* Run each piped subprocess. */
3387
3388 pex = pex_init (PEX_USE_PIPES0x2 | ((report_timesglobal_options.x_report_times || report_times_to_file)
3389 ? PEX_RECORD_TIMES0x1 : 0),
3390 progname, temp_filename);
3391 if (pex == NULL__null)
3392 fatal_error (input_location, "%<pex_init%> failed: %m");
3393
3394 for (i = 0; i < n_commands; i++)
3395 {
3396 const char *errmsg;
3397 int err;
3398 const char *string = commands[i].argv[0];
3399
3400 errmsg = pex_run (pex,
3401 ((i + 1 == n_commands ? PEX_LAST0x1 : 0)
3402 | (string == commands[i].prog ? PEX_SEARCH0x2 : 0)),
3403 string, CONST_CAST (char **, commands[i].argv)(const_cast<char **> ((commands[i].argv))),
3404 NULL__null, NULL__null, &err);
3405 if (errmsg != NULL__null)
3406 {
3407 errno(*__errno_location ()) = err;
3408 fatal_error (input_location,
3409 err ? G_("cannot execute %qs: %s: %m")"cannot execute %qs: %s: %m"
3410 : G_("cannot execute %qs: %s")"cannot execute %qs: %s",
3411 string, errmsg);
3412 }
3413
3414 if (i && string != commands[i].prog)
3415 free (CONST_CAST (char *, string)(const_cast<char *> ((string))));
3416 }
3417
3418 execution_count++;
3419
3420 /* Wait for all the subprocesses to finish. */
3421
3422 {
3423 int *statuses;
3424 struct pex_time *times = NULL__null;
3425 int ret_code = 0;
3426
3427 statuses = (int *) alloca (n_commands * sizeof (int))__builtin_alloca(n_commands * sizeof (int));
3428 if (!pex_get_status (pex, n_commands, statuses))
3429 fatal_error (input_location, "failed to get exit status: %m");
3430
3431 if (report_timesglobal_options.x_report_times || report_times_to_file)
3432 {
3433 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time))__builtin_alloca(n_commands * sizeof (struct pex_time));
3434 if (!pex_get_times (pex, n_commands, times))
3435 fatal_error (input_location, "failed to get process times: %m");
3436 }
3437
3438 pex_free (pex);
3439
3440 for (i = 0; i < n_commands; ++i)
3441 {
3442 int status = statuses[i];
3443
3444 if (WIFSIGNALED (status)(((signed char) (((status) & 0x7f) + 1) >> 1) > 0
)
)
3445 switch (WTERMSIG (status)((status) & 0x7f))
3446 {
3447 case SIGINT2:
3448 case SIGTERM15:
3449 /* SIGQUIT and SIGKILL are not available on MinGW. */
3450#ifdef SIGQUIT3
3451 case SIGQUIT3:
3452#endif
3453#ifdef SIGKILL9
3454 case SIGKILL9:
3455#endif
3456 /* The user (or environment) did something to the
3457 inferior. Making this an ICE confuses the user into
3458 thinking there's a compiler bug. Much more likely is
3459 the user or OOM killer nuked it. */
3460 fatal_error (input_location,
3461 "%s signal terminated program %s",
3462 strsignal (WTERMSIG (status)((status) & 0x7f)),
3463 commands[i].prog);
3464 break;
3465
3466#ifdef SIGPIPE13
3467 case SIGPIPE13:
3468 /* SIGPIPE is a special case. It happens in -pipe mode
3469 when the compiler dies before the preprocessor is
3470 done, or the assembler dies before the compiler is
3471 done. There's generally been an error already, and
3472 this is just fallout. So don't generate another
3473 error unless we would otherwise have succeeded. */
3474 if (signal_count || greatest_status >= MIN_FATAL_STATUS1)
3475 {
3476 signal_count++;
3477 ret_code = -1;
3478 break;
3479 }
3480#endif
3481 /* FALLTHROUGH */
3482
3483 default:
3484 /* The inferior failed to catch the signal. */
3485 internal_error_no_backtrace ("%s signal terminated program %s",
3486 strsignal (WTERMSIG (status)((status) & 0x7f)),
3487 commands[i].prog);
3488 }
3489 else if (WIFEXITED (status)(((status) & 0x7f) == 0)
3490 && WEXITSTATUS (status)(((status) & 0xff00) >> 8) >= MIN_FATAL_STATUS1)
3491 {
3492 /* For ICEs in cc1, cc1obj, cc1plus see if it is
3493 reproducible or not. */
3494 const char *p;
3495 if (flag_report_bugglobal_options.x_flag_report_bug
3496 && WEXITSTATUS (status)(((status) & 0xff00) >> 8) == ICE_EXIT_CODE4
3497 && i == 0
3498 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR'/'))
3499 && ! strncmp (p + 1, "cc1", 3))
3500 try_generate_repro (commands[0].argv);
3501 if (WEXITSTATUS (status)(((status) & 0xff00) >> 8) > greatest_status)
3502 greatest_status = WEXITSTATUS (status)(((status) & 0xff00) >> 8);
3503 ret_code = -1;
3504 }
3505
3506 if (report_timesglobal_options.x_report_times || report_times_to_file)
3507 {
3508 struct pex_time *pt = &times[i];
3509 double ut, st;
3510
3511 ut = ((double) pt->user_seconds
3512 + (double) pt->user_microseconds / 1.0e6);
3513 st = ((double) pt->system_seconds
3514 + (double) pt->system_microseconds / 1.0e6);
3515
3516 if (ut + st != 0)
3517 {
3518 if (report_timesglobal_options.x_report_times)
3519 fnotice (stderrstderr, "# %s %.2f %.2f\n",
3520 commands[i].prog, ut, st);
3521
3522 if (report_times_to_file)
3523 {
3524 int c = 0;
3525 const char *const *j;
3526
3527 fprintf (report_times_to_file, "%g %g", ut, st);
3528
3529 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3530 {
3531 const char *p;
3532 for (p = *j; *p; ++p)
3533 if (*p == '"' || *p == '\\' || *p == '$'
3534 || ISSPACE (*p)(_sch_istable[(*p) & 0xff] & (unsigned short)(_sch_isspace
))
)
3535 break;
3536
3537 if (*p)
3538 {
3539 fprintf (report_times_to_file, " \"");
3540 for (p = *j; *p; ++p)
3541 {
3542 if (*p == '"' || *p == '\\' || *p == '$')
3543 fputc ('\\', report_times_to_file);
3544 fputc (*p, report_times_to_file);
3545 }
3546 fputc ('"', report_times_to_file);
3547 }
3548 else
3549 fprintf (report_times_to_file, " %s", *j);
3550 }
3551
3552 fputc ('\n', report_times_to_file);
3553 }
3554 }
3555 }
3556 }
3557
3558 if (commands[0].argv[0] != commands[0].prog)
3559 free (CONST_CAST (char *, commands[0].argv[0])(const_cast<char *> ((commands[0].argv[0]))));
3560
3561 return ret_code;
3562 }
3563}
3564
3565/* Find all the switches given to us
3566 and make a vector describing them.
3567 The elements of the vector are strings, one per switch given.
3568 If a switch uses following arguments, then the `part1' field
3569 is the switch itself and the `args' field
3570 is a null-terminated vector containing the following arguments.
3571 Bits in the `live_cond' field are:
3572 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3573 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3574 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3575 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored.
3576 SWITCH_KEEP_FOR_GCC to indicate that this switch, otherwise ignored,
3577 should be included in COLLECT_GCC_OPTIONS.
3578 in all do_spec calls afterwards. Used for %<S from self specs.
3579 The `known' field describes whether this is an internal switch.
3580 The `validated' field describes whether any spec has looked at this switch;
3581 if it remains false at the end of the run, the switch must be meaningless.
3582 The `ordering' field is used to temporarily mark switches that have to be
3583 kept in a specific order. */
3584
3585#define SWITCH_LIVE(1 << 0) (1 << 0)
3586#define SWITCH_FALSE(1 << 1) (1 << 1)
3587#define SWITCH_IGNORE(1 << 2) (1 << 2)
3588#define SWITCH_IGNORE_PERMANENTLY(1 << 3) (1 << 3)
3589#define SWITCH_KEEP_FOR_GCC(1 << 4) (1 << 4)
3590
3591struct switchstr
3592{
3593 const char *part1;
3594 const char **args;
3595 unsigned int live_cond;
3596 bool known;
3597 bool validated;
3598 bool ordering;
3599};
3600
3601static struct switchstr *switches;
3602
3603static int n_switches;
3604
3605static int n_switches_alloc;
3606
3607/* Set to zero if -fcompare-debug is disabled, positive if it's
3608 enabled and we're running the first compilation, negative if it's
3609 enabled and we're running the second compilation. For most of the
3610 time, it's in the range -1..1, but it can be temporarily set to 2
3611 or 3 to indicate that the -fcompare-debug flags didn't come from
3612 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3613 variable, until a synthesized -fcompare-debug flag is added to the
3614 command line. */
3615int compare_debug;
3616
3617/* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3618int compare_debug_second;
3619
3620/* Set to the flags that should be passed to the second compilation in
3621 a -fcompare-debug compilation. */
3622const char *compare_debug_opt;
3623
3624static struct switchstr *switches_debug_check[2];
3625
3626static int n_switches_debug_check[2];
3627
3628static int n_switches_alloc_debug_check[2];
3629
3630static char *debug_check_temp_file[2];
3631
3632/* Language is one of three things:
3633
3634 1) The name of a real programming language.
3635 2) NULL, indicating that no one has figured out
3636 what it is yet.
3637 3) '*', indicating that the file should be passed
3638 to the linker. */
3639struct infile
3640{
3641 const char *name;
3642 const char *language;
3643 struct compiler *incompiler;
3644 bool compiled;
3645 bool preprocessed;
3646};
3647
3648/* Also a vector of input files specified. */
3649
3650static struct infile *infiles;
3651
3652int n_infiles;
3653
3654static int n_infiles_alloc;
3655
3656/* True if undefined environment variables encountered during spec processing
3657 are ok to ignore, typically when we're running for --help or --version. */
3658
3659static bool spec_undefvar_allowed;
3660
3661/* True if multiple input files are being compiled to a single
3662 assembly file. */
3663
3664static bool combine_inputs;
3665
3666/* This counts the number of libraries added by lang_specific_driver, so that
3667 we can tell if there were any user supplied any files or libraries. */
3668
3669static int added_libraries;
3670
3671/* And a vector of corresponding output files is made up later. */
3672
3673const char **outfiles;
3674
3675#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3676
3677/* Convert NAME to a new name if it is the standard suffix. DO_EXE
3678 is true if we should look for an executable suffix. DO_OBJ
3679 is true if we should look for an object suffix. */
3680
3681static const char *
3682convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED__attribute__ ((__unused__)),
3683 int do_obj ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
3684{
3685#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3686 int i;
3687#endif
3688 int len;
3689
3690 if (name == NULL__null)
3691 return NULL__null;
3692
3693 len = strlen (name);
3694
3695#ifdef HAVE_TARGET_OBJECT_SUFFIX
3696 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3697 if (do_obj && len > 2
3698 && name[len - 2] == '.'
3699 && name[len - 1] == 'o')
3700 {
3701 obstack_grow (&obstack, name, len - 2)__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (len - 2); if (__extension__ ({ struct obstack const
*__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free
); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o
->next_free, name, __len); __o->next_free += __len; (void
) 0; })
;
3702 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX))__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (strlen (".o")); if (__extension__ ({ struct obstack
const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->
next_free); }) < __len + 1) _obstack_newchunk (__o, __len +
1); memcpy (__o->next_free, ".o", __len); __o->next_free
+= __len; *(__o->next_free)++ = 0; (void) 0; })
;
3703 name = XOBFINISH (&obstack, const char *)((const char *) __extension__ ({ struct obstack *__o1 = ((&
obstack)); void *__value = (void *) __o1->object_base; if (
__o1->next_free == __value) __o1->maybe_empty_object = 1
; __o1->next_free = ((sizeof (ptrdiff_t) < sizeof (void
*) ? (__o1->object_base) : (char *) 0) + (((__o1->next_free
) - (sizeof (ptrdiff_t) < sizeof (void *) ? (__o1->object_base
) : (char *) 0) + (__o1->alignment_mask)) & ~(__o1->
alignment_mask))); if ((size_t) (__o1->next_free - (char *
) __o1->chunk) > (size_t) (__o1->chunk_limit - (char
*) __o1->chunk)) __o1->next_free = __o1->chunk_limit
; __o1->object_base = __o1->next_free; __value; }))
;
3704 }
3705#endif
3706
3707#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3708 /* If there is no filetype, make it the executable suffix (which includes
3709 the "."). But don't get confused if we have just "-o". */
3710 if (! do_exe || TARGET_EXECUTABLE_SUFFIX""[0] == 0 || not_actual_file_p (name))
3711 return name;
3712
3713 for (i = len - 1; i >= 0; i--)
3714 if (IS_DIR_SEPARATOR (name[i])(((name[i]) == '/') || (((name[i]) == '\\') && (0))))
3715 break;
3716
3717 for (i++; i < len; i++)
3718 if (name[i] == '.')
3719 return name;
3720
3721 obstack_grow (&obstack, name, len)__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (len); if (__extension__ ({ struct obstack const *__o1
= (__o); (size_t) (__o1->chunk_limit - __o1->next_free
); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o
->next_free, name, __len); __o->next_free += __len; (void
) 0; })
;
3722 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (strlen ("")); if (__extension__ ({ struct obstack const
*__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free
); }) < __len + 1) _obstack_newchunk (__o, __len + 1); memcpy
(__o->next_free, "", __len); __o->next_free += __len; *
(__o->next_free)++ = 0; (void) 0; })
3723 strlen (TARGET_EXECUTABLE_SUFFIX))__extension__ ({ struct obstack *__o = (&obstack); size_t
__len = (strlen ("")); if (__extension__ ({ struct obstack const
*__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free
); }) < __len + 1) _obstack_newchunk (__o, __len + 1); memcpy
(__o->next_free, "", __len); __o->next_free += __len; *
(__o->next_free)++ = 0; (void) 0; })
;
3724 name = XOBFINISH (&obstack, const char *)((const char *) __extension__ ({ struct obstack *__o1 = ((&
obstack)); void *__value = (void *) __o1->object_base; if (
__o1->next_free == __value) __o1->maybe_empty_object = 1
; __o1->next_free = ((sizeof (ptrdiff_t) < sizeof (void
*) ? (__o1->object_base) : (char *) 0) + (((__o1->next_free
) - (sizeof (ptrdiff_t) < sizeof (void *) ? (__o1->object_base
) : (char *) 0) + (__o1->alignment_mask)) & ~(__o1->
alignment_mask))); if ((size_t) (__o1->next_free - (char *
) __o1->chunk) > (size_t) (__o1->chunk_limit - (char
*) __o1->chunk)) __o1->next_free = __o1->chunk_limit
; __o1->object_base = __o1->next_free; __value; }))
;
3725#endif
3726
3727 return name;
3728}
3729#endif
3730
3731/* Display the command line switches accepted by gcc. */
3732static void
3733display_help (void)
3734{
3735 printf (_("Usage: %s [options] file...\n")gettext ("Usage: %s [options] file...\n"), progname);
3736 fputs (_("Options:\n")gettext ("Options:\n"), stdoutstdout);
3737
3738 fputs (_(" -pass-exit-codes Exit with highest error code from a phase.\n")gettext (" -pass-exit-codes Exit with highest error code from a phase.\n"
)
, stdoutstdout);
3739 fputs (_(" --help Display this information.\n")gettext (" --help Display this information.\n"
)
, stdoutstdout);
3740 fputs (_(" --target-help Display target specific command line options.\n")gettext (" --target-help Display target specific command line options.\n"
)
, stdoutstdout);
3741 fputs (_(" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n")gettext (" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].\n"
)
, stdoutstdout);
3742 fputs (_(" Display specific types of command line options.\n")gettext (" Display specific types of command line options.\n"
)
, stdoutstdout);
3743 if (! verbose_flagglobal_options.x_verbose_flag)
3744 fputs (_(" (Use '-v --help' to display command line options of sub-processes).\n")gettext (" (Use '-v --help' to display command line options of sub-processes).\n"
)
, stdoutstdout);
3745 fputs (_(" --version Display compiler version information.\n")gettext (" --version Display compiler version information.\n"
)
, stdoutstdout);
3746 fputs (_(" -dumpspecs Display all of the built in spec strings.\n")gettext (" -dumpspecs Display all of the built in spec strings.\n"
)
, stdoutstdout);
3747 fputs (_(" -dumpversion Display the version of the compiler.\n")gettext (" -dumpversion Display the version of the compiler.\n"
)
, stdoutstdout);
3748 fputs (_(" -dumpmachine Display the compiler's target processor.\n")gettext (" -dumpmachine Display the compiler's target processor.\n"
)
, stdoutstdout);
3749 fputs (_(" -print-search-dirs Display the directories in the compiler's search path.\n")gettext (" -print-search-dirs Display the directories in the compiler's search path.\n"
)
, stdoutstdout);
3750 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library.\n")gettext (" -print-libgcc-file-name Display the name of the compiler's companion library.\n"
)
, stdoutstdout);
3751 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>.\n")gettext (" -print-file-name=<lib> Display the full path to library <lib>.\n"
)
, stdoutstdout);
3752 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n")gettext (" -print-prog-name=<prog> Display the full path to compiler component <prog>.\n"
)
, stdoutstdout);
3753 fputs (_("\gettext (" -print-multiarch Display the target's normalized GNU triplet, used as\n a component in the library path.\n"
)
3754 -print-multiarch Display the target's normalized GNU triplet, used as\n\gettext (" -print-multiarch Display the target's normalized GNU triplet, used as\n a component in the library path.\n"
)
3755 a component in the library path.\n")gettext (" -print-multiarch Display the target's normalized GNU triplet, used as\n a component in the library path.\n"
)
, stdoutstdout);
3756 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc.\n")gettext (" -print-multi-directory Display the root directory for versions of libgcc.\n"
)
, stdoutstdout);
3757 fputs (_("\gettext (" -print-multi-lib Display the mapping between command line options and\n multiple library search directories.\n"
)
3758 -print-multi-lib Display the mapping between command line options and\n\gettext (" -print-multi-lib Display the mapping between command line options and\n multiple library search directories.\n"
)
3759 multiple library search directories.\n")gettext (" -print-multi-lib Display the mapping between command line options and\n multiple library search directories.\n"
)
, stdoutstdout);
3760 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries.\n")gettext (" -print-multi-os-directory Display the relative path to OS libraries.\n"
)
, stdoutstdout);
3761 fputs (_(" -print-sysroot Display the target libraries directory.\n")gettext (" -print-sysroot Display the target libraries directory.\n"
)
, stdoutstdout);
3762 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n")gettext (" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.\n"
)
, stdoutstdout);
3763 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler.\n")gettext (" -Wa,<options> Pass comma-separated <options> on to the assembler.\n"
)
, stdoutstdout);
3764 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n")gettext (" -Wp,<options> Pass comma-separated <options> on to the preprocessor.\n"
)
, stdoutstdout);
3765 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker.\n")gettext (" -Wl,<options> Pass comma-separated <options> on to the linker.\n"
)
, stdoutstdout);
3766 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler.\n")gettext (" -Xassembler <arg> Pass <arg> on to the assembler.\n"
)
, stdoutstdout);
3767 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n")gettext (" -Xpreprocessor <arg> Pass <arg> on to the preprocessor.\n"
)
, stdoutstdout);
3768 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker.\n")gettext (" -Xlinker <arg> Pass <arg> on to the linker.\n"
)
, stdoutstdout);
3769 fputs (_(" -save-temps Do not delete intermediate files.\n")gettext (" -save-temps Do not delete intermediate files.\n"
)
, stdoutstdout);
3770 fputs (_(" -save-temps=<arg> Do not delete intermediate files.\n")gettext (" -save-temps=<arg> Do not delete intermediate files.\n"
)
, stdoutstdout);
3771 fputs (_("\gettext (" -no-canonical-prefixes Do not canonicalize paths when building relative\n prefixes to other gcc components.\n"
)
3772 -no-canonical-prefixes Do not canonicalize paths when building relative\n\gettext (" -no-canonical-prefixes Do not canonicalize paths when building relative\n prefixes to other gcc components.\n"
)
3773 prefixes to other gcc components.\n")gettext (" -no-canonical-prefixes Do not canonicalize paths when building relative\n prefixes to other gcc components.\n"
)
, stdoutstdout);
3774 fputs (_(" -pipe Use pipes rather than intermediate files.\n")gettext (" -pipe Use pipes rather than intermediate files.\n"
)
, stdoutstdout);
3775 fputs (_(" -time Time the execution of each subprocess.\n")gettext (" -time Time the execution of each subprocess.\n"
)
, stdoutstdout);
3776 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>.\n")gettext (" -specs=<file> Override built-in specs with the contents of <file>.\n"
)
, stdoutstdout);
3777 fputs (_(" -std=<standard> Assume that the input sources are for <standard>.\n")gettext (" -std=<standard> Assume that the input sources are for <standard>.\n"
)
, stdoutstdout);
3778 fputs (_("\gettext (" --sysroot=<directory> Use <directory> as the root directory for headers\n and libraries.\n"
)
3779 --sysroot=<directory> Use <directory> as the root directory for headers\n\gettext (" --sysroot=<directory> Use <directory> as the root directory for headers\n and libraries.\n"
)
3780 and libraries.\n")gettext (" --sysroot=<directory> Use <directory> as the root directory for headers\n and libraries.\n"
)
, stdoutstdout);
3781 fputs (_(" -B <directory> Add <directory> to the compiler's search paths.\n")gettext (" -B <directory> Add <directory> to the compiler's search paths.\n"
)
, stdoutstdout);
3782 fputs (_(" -v Display the programs invoked by the compiler.\n")gettext (" -v Display the programs invoked by the compiler.\n"
)
, stdoutstdout);
3783 fputs (_(" -### Like -v but options quoted and commands not executed.\n")gettext (" -### Like -v but options quoted and commands not executed.\n"
)
, stdoutstdout);
3784 fputs (_(" -E Preprocess only; do not compile, assemble or link.\n")gettext (" -E Preprocess only; do not compile, assemble or link.\n"
)
, stdoutstdout);
3785 fputs (_(" -S Compile only; do not assemble or link.\n")gettext (" -S Compile only; do not assemble or link.\n"
)
, stdoutstdout);
3786 fputs (_(" -c Compile and assemble, but do not link.\n")gettext (" -c Compile and assemble, but do not link.\n"
)
, stdoutstdout);
3787 fputs (_(" -o <file> Place the output into <file>.\n")gettext (" -o <file> Place the output into <file>.\n"
)
, stdoutstdout);
3788 fputs (_(" -pie Create a dynamically linked position independent\n\gettext (" -pie Create a dynamically linked position independent\n executable.\n"
)
3789 executable.\n")gettext (" -pie Create a dynamically linked position independent\n executable.\n"
)
, stdoutstdout);
3790 fputs (_(" -shared Create a shared library.\n")gettext (" -shared Create a shared library.\n"
)
, stdoutstdout);
3791 fputs (_("\gettext (" -x <language> Specify the language of the following input files.\n Permissible languages include: c c++ assembler none\n 'none' means revert to the default behavior of\n guessing the language based on the file's extension.\n"
)
3792 -x <language> Specify the language of the following input files.\n\gettext (" -x <language> Specify the language of the following input files.\n Permissible languages include: c c++ assembler none\n 'none' means revert to the default behavior of\n guessing the language based on the file's extension.\n"
)
3793 Permissible languages include: c c++ assembler none\n\gettext (" -x <language> Specify the language of the following input files.\n Permissible languages include: c c++ assembler none\n 'none' means revert to the default behavior of\n guessing the language based on the file's extension.\n"
)
3794 'none' means revert to the default behavior of\n\gettext (" -x <language> Specify the language of the following input files.\n Permissible languages include: c c++ assembler none\n 'none' means revert to the default behavior of\n guessing the language based on the file's extension.\n"
)
3795 guessing the language based on the file's extension.\n\gettext (" -x <language> Specify the language of the following input files.\n Permissible languages include: c c++ assembler none\n 'none' means revert to the default behavior of\n guessing the language based on the file's extension.\n"
)
3796")gettext (" -x <language> Specify the language of the following input files.\n Permissible languages include: c c++ assembler none\n 'none' means revert to the default behavior of\n guessing the language based on the file's extension.\n"
)
, stdoutstdout);
3797
3798 printf (_("\gettext ("\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n passed on to the various sub-processes invoked by %s. In order to pass\n other options on to these processes the -W<letter> options must be used.\n"
)
3799\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\gettext ("\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n passed on to the various sub-processes invoked by %s. In order to pass\n other options on to these processes the -W<letter> options must be used.\n"
)
3800 passed on to the various sub-processes invoked by %s. In order to pass\n\gettext ("\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n passed on to the various sub-processes invoked by %s. In order to pass\n other options on to these processes the -W<letter> options must be used.\n"
)
3801 other options on to these processes the -W<letter> options must be used.\n\gettext ("\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n passed on to the various sub-processes invoked by %s. In order to pass\n other options on to these processes the -W<letter> options must be used.\n"
)
3802")gettext ("\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n passed on to the various sub-processes invoked by %s. In order to pass\n other options on to these processes the -W<letter> options must be used.\n"
)
, progname);
3803
3804 /* The rest of the options are displayed by invocations of the various
3805 sub-processes. */
3806}
3807
3808static void
3809add_preprocessor_option (const char *option, int len)
3810{
3811 preprocessor_options.safe_push (save_string (option, len));
3812}
3813
3814static void
3815add_assembler_option (const char *option, int len)
3816{
3817 assembler_options.safe_push (save_string (option, len));
3818}
3819
3820static void
3821add_linker_option (const char *option, int len)
3822{
3823 linker_options.safe_push (save_string (option, len));
3824}
3825
3826/* Allocate space for an input file in infiles. */
3827
3828static void
3829alloc_infile (void)
3830{
3831 if (n_infiles_alloc == 0)
3832 {
3833 n_infiles_alloc = 16;
3834 infiles = XNEWVEC (struct infile, n_infiles_alloc)((struct infile *) xmalloc (sizeof (struct infile) * (n_infiles_alloc
)))
;
3835 }
3836 else if (n_infiles_alloc == n_infiles)
3837 {
3838 n_infiles_alloc *= 2;
3839 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc)((struct infile *) xrealloc ((void *) (infiles), sizeof (struct
infile) * (n_infiles_alloc)))
;
3840 }
3841}
3842
3843/* Store an input file with the given NAME and LANGUAGE in
3844 infiles. */
3845
3846static void
3847add_infile (const char *name, const char *language)
3848{
3849 alloc_infile ();
3850 infiles[n_infiles].name = name;
3851 infiles[n_infiles++].language = language;
3852}
3853
3854/* Allocate space for a switch in switches. */
3855
3856static void
3857alloc_switch (void)
3858{
3859 if (n_switches_alloc == 0)
3860 {
3861 n_switches_alloc = 16;
3862 switches = XNEWVEC (struct switchstr, n_switches_alloc)((struct switchstr *) xmalloc (sizeof (struct switchstr) * (n_switches_alloc
)))
;
3863 }
3864 else if (n_switches_alloc == n_switches)
3865 {
3866 n_switches_alloc *= 2;
3867 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc)((struct switchstr *) xrealloc ((void *) (switches), sizeof (
struct switchstr) * (n_switches_alloc)))
;
3868 }
3869}
3870
3871/* Save an option OPT with N_ARGS arguments in array ARGS, marking it
3872 as validated if VALIDATED and KNOWN if it is an internal switch. */
3873
3874static void
3875save_switch (const char *opt, size_t n_args, const char *const *args,
3876 bool validated, bool known)
3877{
3878 alloc_switch ();
3879 switches[n_switches].part1 = opt + 1;
3880 if (n_args == 0)
3881 switches[n_switches].args = 0;
3882 else
3883 {
3884 switches[n_switches].args = XNEWVEC (const char *, n_args + 1)((const char * *) xmalloc (sizeof (const char *) * (n_args + 1
)))
;
3885 memcpy (switches[n_switches].args, args, n_args * sizeof (const char *));
3886 switches[n_switches].args[n_args] = NULL__null;
3887 }
3888
3889 switches[n_switches].live_cond = 0;
3890 switches[n_switches].validated = validated;
3891 switches[n_switches].known = known;
3892 switches[n_switches].ordering = 0;
3893 n_switches++;
3894}
3895
3896/* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is
3897 not set already. */
3898
3899static void
3900set_source_date_epoch_envvar ()
3901{
3902 /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations
3903 of 64 bit integers. */
3904 char source_date_epoch[21];
3905 time_t tt;
3906
3907 errno(*__errno_location ()) = 0;
3908 tt = time (NULL__null);
3909 if (tt < (time_t) 0 || errno(*__errno_location ()) != 0)
3910 tt = (time_t) 0;
3911
3912 snprintf (source_date_epoch, 21, "%llu", (unsigned long long) tt);
3913 /* Using setenv instead of xputenv because we want the variable to remain
3914 after finalizing so that it's still set in the second run when using
3915 -fcompare-debug. */
3916 setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0);
3917}
3918
3919/* Handle an option DECODED that is unknown to the option-processing
3920 machinery. */
3921
3922static bool
3923driver_unknown_option_callback (const struct cl_decoded_option *decoded)
3924{
3925 const char *opt = decoded->arg;
3926 if (opt[1] == 'W' && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-'
3927 && !(decoded->errors & CL_ERR_NEGATIVE(1 << 6)))
3928 {
3929 /* Leave unknown -Wno-* options for the compiler proper, to be
3930 diagnosed only if there are warnings. */
3931 save_switch (decoded->canonical_option[0],
3932 decoded->canonical_option_num_elements - 1,
3933 &decoded->canonical_option[1], false, true);
3934 return false;
3935 }
3936 if (decoded->opt_index == OPT_SPECIAL_unknown)
3937 {
3938 /* Give it a chance to define it a spec file. */
3939 save_switch (decoded->canonical_option[0],
3940 decoded->canonical_option_num_elements - 1,
3941 &decoded->canonical_option[1], false, false);
3942 return false;
3943 }
3944 else
3945 return true;
3946}
3947
3948/* Handle an option DECODED that is not marked as CL_DRIVER.
3949 LANG_MASK will always be CL_DRIVER. */
3950
3951static void
3952driver_wrong_lang_callback (const struct cl_decoded_option *decoded,
3953 unsigned int lang_mask ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
3954{
3955 /* At this point, non-driver options are accepted (and expected to
3956 be passed down by specs) unless marked to be rejected by the
3957 driver. Options to be rejected by the driver but accepted by the
3958 compilers proper are treated just like completely unknown
3959 options. */
3960 const struct cl_option *option = &cl_options[decoded->opt_index];
3961
3962 if (option->cl_reject_driver)
3963 error ("unrecognized command-line option %qs",
3964 decoded->orig_option_with_args_text);
3965 else
3966 save_switch (decoded->canonical_option[0],
3967 decoded->canonical_option_num_elements - 1,
3968 &decoded->canonical_option[1], false, true);
3969}
3970
3971static const char *spec_lang = 0;
3972static int last_language_n_infiles;
3973
3974/* Parse -foffload option argument. */
3975
3976static void
3977handle_foffload_option (const char *arg)
3978{
3979 const char *c, *cur, *n, *next, *end;
3980 char *target;
3981
3982 /* If option argument starts with '-' then no target is specified and we
3983 do not need to parse it. */
3984 if (arg[0] == '-')
3985 return;
3986
3987 end = strchr (arg, '=');
3988 if (end == NULL__null)
3989 end = strchr (arg, '\0');
3990 cur = arg;
3991
3992 while (cur < end)
3993 {
3994 next = strchr (cur, ',');
3995 if (next == NULL__null)
3996 next = end;
3997 next = (next > end) ? end : next;
3998
3999 target = XNEWVEC (char, next - cur + 1)((char *) xmalloc (sizeof (char) * (next - cur + 1)));
4000 memcpy (target, cur, next - cur);
4001 target[next - cur] = '\0';
4002
4003 /* If 'disable' is passed to the option, stop parsing the option and clean
4004 the list of offload targets. */
4005 if (strcmp (target, "disable") == 0)
4006 {
4007 free (offload_targets);
4008 offload_targets = xstrdup ("");
4009 break;
4010 }
4011
4012 /* Check that GCC is configured to support the offload target. */
4013 c = OFFLOAD_TARGETS"";
4014 while (c)
4015 {
4016 n = strchr (c, ',');
4017 if (n == NULL__null)
4018 n = strchr (c, '\0');
4019
4020 if (next - cur == n - c && strncmp (target, c, n - c) == 0)
4021 break;
4022
4023 c = *n ? n + 1 : NULL__null;
4024 }
4025
4026 if (!c)
4027 fatal_error (input_location,
4028 "GCC is not configured to support %s as offload target",
4029 target);
4030
4031 if (!offload_targets)
4032 {
4033 offload_targets = target;
4034 target = NULL__null;
4035 }
4036 else
4037 {
4038 /* Check that the target hasn't already presented in the list. */
4039 c = offload_targets;
4040 do
4041 {
4042 n = strchr (c, ':');
4043 if (n == NULL__null)
4044 n = strchr (c, '\0');
4045
4046 if (next - cur == n - c && strncmp (c, target, n - c) == 0)
4047 break;
4048
4049 c = n + 1;
4050 }
4051 while (*n);
4052
4053 /* If duplicate is not found, append the target to the list. */
4054 if (c > n)
4055 {
4056 size_t offload_targets_len = strlen (offload_targets);
4057 offload_targets
4058 = XRESIZEVEC (char, offload_targets,((char *) xrealloc ((void *) (offload_targets), sizeof (char)
* (offload_targets_len + 1 + next - cur + 1)))
4059 offload_targets_len + 1 + next - cur + 1)((char *) xrealloc ((void *) (offload_targets), sizeof (char)
* (offload_targets_len + 1 + next - cur + 1)))
;
4060 offload_targets[offload_targets_len++] = ':';
4061 memcpy (offload_targets + offload_targets_len, target, next - cur + 1);
4062 }
4063 }
4064
4065 cur = next + 1;
4066 XDELETEVEC (target)free ((void*) (target));
4067 }
4068}
4069
4070/* Handle a driver option; arguments and return value as for
4071 handle_option. */
4072
4073static bool
4074driver_handle_option (struct gcc_options *opts,
4075 struct gcc_options *opts_set,
4076 const struct cl_decoded_option *decoded,
4077 unsigned int lang_mask ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int kind,
4078 location_t loc,
4079 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED__attribute__ ((__unused__)),
4080 diagnostic_context *dc,
4081 void (*) (void))
4082{
4083 size_t opt_index = decoded->opt_index;
4084 const char *arg = decoded->arg;
4085 const char *compare_debug_replacement_opt;
4086 int value = decoded->value;
4087 bool validated = false;
4088 bool do_save = true;
4089
4090 gcc_assert (opts == &global_options)((void)(!(opts == &global_options) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4090, __FUNCTION__), 0 : 0))
;
4091 gcc_assert (opts_set == &global_options_set)((void)(!(opts_set == &global_options_set) ? fancy_abort (
"/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4091, __FUNCTION__), 0 : 0))
;
4092 gcc_assert (kind == DK_UNSPECIFIED)((void)(!(kind == DK_UNSPECIFIED) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4092, __FUNCTION__), 0 : 0))
;
4093 gcc_assert (loc == UNKNOWN_LOCATION)((void)(!(loc == ((location_t) 0)) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4093, __FUNCTION__), 0 : 0))
;
4094 gcc_assert (dc == global_dc)((void)(!(dc == global_dc) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4094, __FUNCTION__), 0 : 0))
;
4095
4096 switch (opt_index)
4097 {
4098 case OPT_dumpspecs:
4099 {
4100 struct spec_list *sl;
4101 init_spec ();
4102 for (sl = specs; sl; sl = sl->next)
4103 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
4104 if (link_command_spec)
4105 printf ("*link_command:\n%s\n\n", link_command_spec);
4106 exit (0);
4107 }
4108
4109 case OPT_dumpversion:
4110 printf ("%s\n", spec_version);
4111 exit (0);
4112
4113 case OPT_dumpmachine:
4114 printf ("%s\n", spec_machine);
4115 exit (0);
4116
4117 case OPT_dumpfullversion:
4118 printf ("%s\n", BASEVER"11.0.0");
4119 exit (0);
4120
4121 case OPT__version:
4122 print_version = 1;
4123
4124 /* CPP driver cannot obtain switch from cc1_options. */
4125 if (is_cpp_driver)
4126 add_preprocessor_option ("--version", strlen ("--version"));
4127 add_assembler_option ("--version", strlen ("--version"));
4128 add_linker_option ("--version", strlen ("--version"));
4129 break;
4130
4131 case OPT__completion_:
4132 validated = true;
4133 completion = decoded->arg;
4134 break;
4135
4136 case OPT__help:
4137 print_help_list = 1;
4138
4139 /* CPP driver cannot obtain switch from cc1_options. */
4140 if (is_cpp_driver)
4141 add_preprocessor_option ("--help", 6);
4142 add_assembler_option ("--help", 6);
4143 add_linker_option ("--help", 6);
4144 break;
4145
4146 case OPT__help_:
4147 print_subprocess_help = 2;
4148 break;
4149
4150 case OPT__target_help:
4151 print_subprocess_help = 1;
4152
4153 /* CPP driver cannot obtain switch from cc1_options. */
4154 if (is_cpp_driver)
4155 add_preprocessor_option ("--target-help", 13);
4156 add_assembler_option ("--target-help", 13);
4157 add_linker_option ("--target-help", 13);
4158 break;
4159
4160 case OPT__no_sysroot_suffix:
4161 case OPT_pass_exit_codes:
4162 case OPT_print_search_dirs:
4163 case OPT_print_file_name_:
4164 case OPT_print_prog_name_:
4165 case OPT_print_multi_lib:
4166 case OPT_print_multi_directory:
4167 case OPT_print_sysroot:
4168 case OPT_print_multi_os_directory:
4169 case OPT_print_multiarch:
4170 case OPT_print_sysroot_headers_suffix:
4171 case OPT_time:
4172 case OPT_wrapper:
4173 /* These options set the variables specified in common.opt
4174 automatically, and do not need to be saved for spec
4175 processing. */
4176 do_save = false;
4177 break;
4178
4179 case OPT_print_libgcc_file_name:
4180 print_file_nameglobal_options.x_print_file_name = "libgcc.a";
4181 do_save = false;
4182 break;
4183
4184 case OPT_fuse_ld_bfd:
4185 use_ld = ".bfd";
4186 break;
4187
4188 case OPT_fuse_ld_gold:
4189 use_ld = ".gold";
4190 break;
4191
4192 case OPT_fcompare_debug_second:
4193 compare_debug_second = 1;
4194 break;
4195
4196 case OPT_fcompare_debug:
4197 switch (value)
4198 {
4199 case 0:
4200 compare_debug_replacement_opt = "-fcompare-debug=";
4201 arg = "";
4202 goto compare_debug_with_arg;
4203
4204 case 1:
4205 compare_debug_replacement_opt = "-fcompare-debug=-gtoggle";
4206 arg = "-gtoggle";
4207 goto compare_debug_with_arg;
4208
4209 default:
4210 gcc_unreachable ()(fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4210, __FUNCTION__))
;
4211 }
4212 break;
4213
4214 case OPT_fcompare_debug_:
4215 compare_debug_replacement_opt = decoded->canonical_option[0];
4216 compare_debug_with_arg:
4217 gcc_assert (decoded->canonical_option_num_elements == 1)((void)(!(decoded->canonical_option_num_elements == 1) ? fancy_abort
("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4217, __FUNCTION__), 0 : 0))
;
4218 gcc_assert (arg != NULL)((void)(!(arg != __null) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 4218, __FUNCTION__), 0 : 0))
;
4219 if (*arg)
4220 compare_debug = 1;
4221 else
4222 compare_debug = -1;
4223 if (compare_debug < 0)
4224 compare_debug_opt = NULL__null;
4225 else
4226 compare_debug_opt = arg;
4227 save_switch (compare_debug_replacement_opt, 0, NULL__null, validated, true);
4228 set_source_date_epoch_envvar ();
4229 return true;
4230
4231 case OPT_fdiagnostics_color_:
4232 diagnostic_color_init (dc, value);
4233 break;
4234
4235 case OPT_fdiagnostics_urls_:
4236 diagnostic_urls_init (dc, value);
4237 break;
4238
4239 case OPT_fdiagnostics_format_:
4240 diagnostic_output_format_init (dc,
4241 (enum diagnostics_output_format)value);
4242 break;
4243
4244 case OPT_Wa_:
4245 {
4246 int prev, j;
4247 /* Pass the rest of this option to the assembler. */
4248
4249 /* Split the argument at commas. */
4250 prev = 0;
4251 for (j = 0; arg[j]; j++)
4252 if (arg[j] == ',')
4253 {
4254 add_assembler_option (arg + prev, j - prev);
4255 prev = j + 1;
4256 }
4257
4258 /* Record the part after the last comma. */
4259 add_assembler_option (arg + prev, j - prev);
4260 }
4261 do_save = false;
4262 break;
4263
4264 case OPT_Wp_:
4265 {
4266 int prev, j;
4267 /* Pass the rest of this option to the preprocessor. */
4268
4269 /* Split the argument at commas. */
4270 prev = 0;
4271 for (j = 0; arg[j]; j++)
4272 if (arg[j] == ',')
4273 {
4274 add_preprocessor_option (arg + prev, j - prev);
4275 prev = j + 1;
4276 }
4277
4278 /* Record the part after the last comma. */
4279 add_preprocessor_option (arg + prev, j - prev);
4280 }
4281 do_save = false;
4282 break;
4283
4284 case OPT_Wl_:
4285 {
4286 int prev, j;
4287 /* Split the argument at commas. */
4288 prev = 0;
4289 for (j = 0; arg[j]; j++)
4290 if (arg[j] == ',')
4291 {
4292 add_infile (save_string (arg + prev, j - prev), "*");
4293 prev = j + 1;
4294 }
4295 /* Record the part after the last comma. */
4296 add_infile (arg + prev, "*");
4297 }
4298 do_save = false;
4299 break;
4300
4301 case OPT_Xlinker:
4302 add_infile (arg, "*");
4303 do_save = false;
4304 break;
4305
4306 case OPT_Xpreprocessor:
4307 add_preprocessor_option (arg, strlen (arg));
4308 do_save = false;
4309 break;
4310
4311 case OPT_Xassembler:
4312 add_assembler_option (arg, strlen (arg));
4313 do_save = false;
4314 break;
4315
4316 case OPT_l:
4317 /* POSIX allows separation of -l and the lib arg; canonicalize
4318 by concatenating -l with its arg */
4319 add_infile (concat ("-l", arg, NULL__null), "*");
4320 do_save = false;
4321 break;
4322
4323 case OPT_L:
4324 /* Similarly, canonicalize -L for linkers that may not accept
4325 separate arguments. */
4326 save_switch (concat ("-L", arg, NULL__null), 0, NULL__null, validated, true);
4327 return true;
4328
4329 case OPT_F:
4330 /* Likewise -F. */
4331 save_switch (concat ("-F", arg, NULL__null), 0, NULL__null, validated, true);
4332 return true;
4333
4334 case OPT_save_temps:
4335 if (!save_temps_flag)
4336 save_temps_flag = SAVE_TEMPS_DUMP;
4337 validated = true;
4338 break;
4339
4340 case OPT_save_temps_:
4341 if (strcmp (arg, "cwd") == 0)
4342 save_temps_flag = SAVE_TEMPS_CWD;
4343 else if (strcmp (arg, "obj") == 0
4344 || strcmp (arg, "object") == 0)
4345 save_temps_flag = SAVE_TEMPS_OBJ;
4346 else
4347 fatal_error (input_location, "%qs is an unknown %<-save-temps%> option",
4348 decoded->orig_option_with_args_text);
4349 save_temps_overrides_dumpdir = true;
4350 break;
4351
4352 case OPT_dumpdir:
4353 free (dumpdir);
4354 dumpdir = xstrdup (arg);
4355 save_temps_overrides_dumpdir = false;
4356 break;
4357
4358 case OPT_dumpbase:
4359 free (dumpbase);
4360 dumpbase = xstrdup (arg);
4361 break;
4362
4363 case OPT_dumpbase_ext:
4364 free (dumpbase_ext);
4365 dumpbase_ext = xstrdup (arg);
4366 break;
4367
4368 case OPT_no_canonical_prefixes:
4369 /* Already handled as a special case, so ignored here. */
4370 do_save = false;
4371 break;
4372
4373 case OPT_pipe:
4374 validated = true;
4375 /* These options set the variables specified in common.opt
4376 automatically, but do need to be saved for spec
4377 processing. */
4378 break;
4379
4380 case OPT_specs_:
4381 {
4382 struct user_specs *user = XNEW (struct user_specs)((struct user_specs *) xmalloc (sizeof (struct user_specs)));
4383
4384 user->next = (struct user_specs *) 0;
4385 user->filename = arg;
4386 if (user_specs_tail)
4387 user_specs_tail->next = user;
4388 else
4389 user_specs_head = user;
4390 user_specs_tail = user;
4391 }
4392 validated = true;
4393 break;
4394
4395 case OPT__sysroot_:
4396 target_system_root = arg;
4397 target_system_root_changed = 1;
4398 do_save = false;
4399 break;
4400
4401 case OPT_time_:
4402 if (report_times_to_file)
4403 fclose (report_times_to_file);
4404 report_times_to_file = fopen (arg, "a");
4405 do_save = false;
4406 break;
4407
4408 case OPT____:
4409 /* "-###"
4410 This is similar to -v except that there is no execution
4411 of the commands and the echoed arguments are quoted. It
4412 is intended for use in shell scripts to capture the
4413 driver-generated command line. */
4414 verbose_only_flag++;
4415 verbose_flagglobal_options.x_verbose_flag = 1;
4416 do_save = false;
4417 break;
4418
4419 case OPT_B:
4420 {
4421 size_t len = strlen (arg);
4422
4423 /* Catch the case where the user has forgotten to append a
4424 directory separator to the path. Note, they may be using
4425 -B to add an executable name prefix, eg "i386-elf-", in
4426 order to distinguish between multiple installations of
4427 GCC in the same directory. Hence we must check to see
4428 if appending a directory separator actually makes a
4429 valid directory name. */
4430 if (!IS_DIR_SEPARATOR (arg[len - 1])(((arg[len - 1]) == '/') || (((arg[len - 1]) == '\\') &&
(0)))
4431 && is_directory (arg, false))
4432 {
4433 char *tmp = XNEWVEC (char, len + 2)((char *) xmalloc (sizeof (char) * (len + 2)));
4434 strcpy (tmp, arg);
4435 tmp[len] = DIR_SEPARATOR'/';
4436 tmp[++len] = 0;
4437 arg = tmp;
4438 }
4439
4440 add_prefix (&exec_prefixes, arg, NULL__null,
4441 PREFIX_PRIORITY_B_OPT, 0, 0);
4442 add_prefix (&startfile_prefixes, arg, NULL__null,
4443 PREFIX_PRIORITY_B_OPT, 0, 0);
4444 add_prefix (&include_prefixes, arg, NULL__null,
4445 PREFIX_PRIORITY_B_OPT, 0, 0);
4446 }
4447 validated = true;
4448 break;
4449
4450 case OPT_E:
4451 have_E = true;
4452 break;
4453
4454 case OPT_x:
4455 spec_lang = arg;
4456 if (!strcmp (spec_lang, "none"))
4457 /* Suppress the warning if -xnone comes after the last input
4458 file, because alternate command interfaces like g++ might
4459 find it useful to place -xnone after each input file. */
4460 spec_lang = 0;
4461 else
4462 last_language_n_infiles = n_infiles;
4463 do_save = false;
4464 break;
4465
4466 case OPT_o:
4467 have_o = 1;
4468#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4469 arg = convert_filename (arg, ! have_c, 0);
4470#endif
4471 output_file = arg;
4472 /* On some systems, ld cannot handle "-o" without a space. So
4473 split the option from its argument. */
4474 save_switch ("-o", 1, &arg, validated, true);
4475 return true;
4476
4477#ifdef ENABLE_DEFAULT_PIE
4478 case OPT_pie:
4479 /* -pie is turned on by default. */
4480#endif
4481
4482 case OPT_static_libgcc:
4483 case OPT_shared_libgcc:
4484 case OPT_static_libgfortran:
4485 case OPT_static_libstdc__:
4486 /* These are always valid, since gcc.c itself understands the
4487 first two, gfortranspec.c understands -static-libgfortran and
4488 g++spec.c understands -static-libstdc++ */
4489 validated = true;
4490 break;
4491
4492 case OPT_fwpa:
4493 flag_wpaglobal_options.x_flag_wpa = "";
4494 break;
4495
4496 case OPT_foffload_:
4497 handle_foffload_option (arg);
4498 break;
4499
4500 default:
4501 /* Various driver options need no special processing at this
4502 point, having been handled in a prescan above or being
4503 handled by specs. */
4504 break;
4505 }
4506
4507 if (do_save)
4508 save_switch (decoded->canonical_option[0],
4509 decoded->canonical_option_num_elements - 1,
4510 &decoded->canonical_option[1], validated, true);
4511 return true;
4512}
4513
4514/* Return true if F2 is F1 followed by a single suffix, i.e., by a
4515 period and additional characters other than a period. */
4516
4517static inline bool
4518adds_single_suffix_p (const char *f2, const char *f1)
4519{
4520 size_t len = strlen (f1);
4521
4522 return (strncmp (f1, f2, len) == 0
4523 && f2[len] == '.'
4524 && strchr (f2 + len + 1, '.') == NULL__null);
4525}
4526
4527/* Put the driver's standard set of option handlers in *HANDLERS. */
4528
4529static void
4530set_option_handlers (struct cl_option_handlers *handlers)
4531{
4532 handlers->unknown_option_callback = driver_unknown_option_callback;
4533 handlers->wrong_lang_callback = driver_wrong_lang_callback;
4534 handlers->num_handlers = 3;
4535 handlers->handlers[0].handler = driver_handle_option;
4536 handlers->handlers[0].mask = CL_DRIVER(1U << 19);
4537 handlers->handlers[1].handler = common_handle_option;
4538 handlers->handlers[1].mask = CL_COMMON(1U << 21);
4539 handlers->handlers[2].handler = target_handle_option;
4540 handlers->handlers[2].mask = CL_TARGET(1U << 20);
4541}
4542
4543
4544/* Return the index into infiles for the single non-library
4545 non-lto-wpa input file, -1 if there isn't any, or -2 if there is
4546 more than one. */
4547static inline int
4548single_input_file_index ()
4549{
4550 int ret = -1;
4551
4552 for (int i = 0; i < n_infiles; i++)
4553 {
4554 if (infiles[i].language
4555 && (infiles[i].language[0] == '*'
4556 || (flag_wpaglobal_options.x_flag_wpa
4557 && strcmp (infiles[i].language, "lto") == 0)))
4558 continue;
4559
4560 if (ret != -1)
4561 return -2;
4562
4563 ret = i;
4564 }
4565
4566 return ret;
4567}
4568
4569/* Create the vector `switches' and its contents.
4570 Store its length in `n_switches'. */
4571
4572static void
4573process_command (unsigned int decoded_options_count,
4574 struct cl_decoded_option *decoded_options)
4575{
4576 const char *temp;
4577 char *temp1;
4578 char *tooldir_prefix, *tooldir_prefix2;
4579 char *(*get_relative_prefix) (const char *, const char *,
4580 const char *) = NULL__null;
4581 struct cl_option_handlers handlers;
4582 unsigned int j;
4583
4584 gcc_exec_prefix = env.get ("GCC_EXEC_PREFIX");
4585
4586 n_switches = 0;
4587 n_infiles = 0;
4588 added_libraries = 0;
4589
4590 /* Figure compiler version from version string. */
4591
4592 compiler_version = temp1 = xstrdup (version_string);
4593
4594 for (; *temp1; ++temp1)
4595 {
4596 if (*temp1 == ' ')
4597 {
4598 *temp1 = '\0';
4599 break;
4600 }
4601 }
4602
4603 /* Handle any -no-canonical-prefixes flag early, to assign the function
4604 that builds relative prefixes. This function creates default search
4605 paths that are needed later in normal option handling. */
4606
4607 for (j = 1; j < decoded_options_count; j++)
4608 {
4609 if (decoded_options[j].opt_index == OPT_no_canonical_prefixes)
4610 {
4611 get_relative_prefix = make_relative_prefix_ignore_links;
4612 break;
4613 }
4614 }
4615 if (! get_relative_prefix)
4616 get_relative_prefix = make_relative_prefix;
4617
4618 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
4619 see if we can create it from the pathname specified in
4620 decoded_options[0].arg. */
4621
4622 gcc_libexec_prefix = standard_libexec_prefix;
4623#ifndef VMS
4624 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
4625 if (!gcc_exec_prefix)
4626 {
4627 gcc_exec_prefix = get_relative_prefix (decoded_options[0].arg,
4628 standard_bindir_prefix,
4629 standard_exec_prefix);
4630 gcc_libexec_prefix = get_relative_prefix (decoded_options[0].arg,
4631 standard_bindir_prefix,
4632 standard_libexec_prefix);
4633 if (gcc_exec_prefix)
4634 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL__null));
4635 }
4636 else
4637 {
4638 /* make_relative_prefix requires a program name, but
4639 GCC_EXEC_PREFIX is typically a directory name with a trailing
4640 / (which is ignored by make_relative_prefix), so append a
4641 program name. */
4642 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL__null);
4643 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
4644 standard_exec_prefix,
4645 standard_libexec_prefix);
4646
4647 /* The path is unrelocated, so fallback to the original setting. */
4648 if (!gcc_libexec_prefix)
4649 gcc_libexec_prefix = standard_libexec_prefix;
4650
4651 free (tmp_prefix);
4652 }
4653#else
4654#endif
4655 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
4656 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
4657 or an automatically created GCC_EXEC_PREFIX from
4658 decoded_options[0].arg. */
4659
4660 /* Do language-specific adjustment/addition of flags. */
4661 lang_specific_driver (&decoded_options, &decoded_options_count,
4662 &added_libraries);
4663
4664 if (gcc_exec_prefix)
4665 {
4666 int len = strlen (gcc_exec_prefix);
4667
4668 if (len > (int) sizeof ("/lib/gcc/") - 1
4669 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])(((gcc_exec_prefix[len-1]) == '/') || (((gcc_exec_prefix[len-
1]) == '\\') && (0)))
))
4670 {
4671 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
4672 if (IS_DIR_SEPARATOR (*temp)(((*temp) == '/') || (((*temp) == '\\') && (0)))
4673 && filename_ncmp (temp + 1, "lib", 3) == 0
4674 && IS_DIR_SEPARATOR (temp[4])(((temp[4]) == '/') || (((temp[4]) == '\\') && (0)))
4675 && filename_ncmp (temp + 5, "gcc", 3) == 0)
4676 len -= sizeof ("/lib/gcc/") - 1;
4677 }
4678
4679 set_std_prefix (gcc_exec_prefix, len);
4680 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
4681 PREFIX_PRIORITY_LAST, 0, 0);
4682 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
4683 PREFIX_PRIORITY_LAST, 0, 0);
4684 }
4685
4686 /* COMPILER_PATH and LIBRARY_PATH have values
4687 that are lists of directory names with colons. */
4688
4689 temp = env.get ("COMPILER_PATH");
4690 if (temp)
4691 {
4692 const char *startp, *endp;
4693 char *nstore = (char *) alloca (strlen (temp) + 3)__builtin_alloca(strlen (temp) + 3);
4694
4695 startp = endp = temp;
4696 while (1)
4697 {
4698 if (*endp == PATH_SEPARATOR':' || *endp == 0)
4699 {
4700 strncpy (nstore, startp, endp - startp);
4701 if (endp == startp)
4702 strcpy (nstore, concat (".", dir_separator_str, NULL__null));
4703 else if (!IS_DIR_SEPARATOR (endp[-1])(((endp[-1]) == '/') || (((endp[-1]) == '\\') && (0))
)
)
4704 {
4705 nstore[endp - startp] = DIR_SEPARATOR'/';
4706 nstore[endp - startp + 1] = 0;
4707 }
4708 else
4709 nstore[endp - startp] = 0;
4710 add_prefix (&exec_prefixes, nstore, 0,
4711 PREFIX_PRIORITY_LAST, 0, 0);
4712 add_prefix (&include_prefixes, nstore, 0,
4713 PREFIX_PRIORITY_LAST, 0, 0);
4714 if (*endp == 0)
4715 break;
4716 endp = startp = endp + 1;
4717 }
4718 else
4719 endp++;
4720 }
4721 }
4722
4723 temp = env.get (LIBRARY_PATH_ENV"LIBRARY_PATH");
4724 if (temp && *cross_compile == '0')
4725 {
4726 const char *startp, *endp;
4727 char *nstore = (char *) alloca (strlen (temp) + 3)__builtin_alloca(strlen (temp) + 3);
4728
4729 startp = endp = temp;
4730 while (1)
4731 {
4732 if (*endp == PATH_SEPARATOR':' || *endp == 0)
4733 {
4734 strncpy (nstore, startp, endp - startp);
4735 if (endp == startp)
4736 strcpy (nstore, concat (".", dir_separator_str, NULL__null));
4737 else if (!IS_DIR_SEPARATOR (endp[-1])(((endp[-1]) == '/') || (((endp[-1]) == '\\') && (0))
)
)
4738 {
4739 nstore[endp - startp] = DIR_SEPARATOR'/';
4740 nstore[endp - startp + 1] = 0;
4741 }
4742 else
4743 nstore[endp - startp] = 0;
4744 add_prefix (&startfile_prefixes, nstore, NULL__null,
4745 PREFIX_PRIORITY_LAST, 0, 1);
4746 if (*endp == 0)
4747 break;
4748 endp = startp = endp + 1;
4749 }
4750 else
4751 endp++;
4752 }
4753 }
4754
4755 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
4756 temp = env.get ("LPATH");
4757 if (temp && *cross_compile == '0')
4758 {
4759 const char *startp, *endp;
4760 char *nstore = (char *) alloca (strlen (temp) + 3)__builtin_alloca(strlen (temp) + 3);
4761
4762 startp = endp = temp;
4763 while (1)
4764 {
4765 if (*endp == PATH_SEPARATOR':' || *endp == 0)
4766 {
4767 strncpy (nstore, startp, endp - startp);
4768 if (endp == startp)
4769 strcpy (nstore, concat (".", dir_separator_str, NULL__null));
4770 else if (!IS_DIR_SEPARATOR (endp[-1])(((endp[-1]) == '/') || (((endp[-1]) == '\\') && (0))
)
)
4771 {
4772 nstore[endp - startp] = DIR_SEPARATOR'/';
4773 nstore[endp - startp + 1] = 0;
4774 }
4775 else
4776 nstore[endp - startp] = 0;
4777 add_prefix (&startfile_prefixes, nstore, NULL__null,
4778 PREFIX_PRIORITY_LAST, 0, 1);
4779 if (*endp == 0)
4780 break;
4781 endp = startp = endp + 1;
4782 }
4783 else
4784 endp++;
4785 }
4786 }
4787
4788 /* Process the options and store input files and switches in their
4789 vectors. */
4790
4791 last_language_n_infiles = -1;
4792
4793 set_option_handlers (&handlers);
4794
4795 for (j = 1; j < decoded_options_count; j++)
4796 {
4797 switch (decoded_options[j].opt_index)
4798 {
4799 case OPT_S:
4800 case OPT_c:
4801 case OPT_E:
4802 have_c = 1;
4803 break;
4804 }
4805 if (have_c)
4806 break;
4807 }
4808
4809 for (j = 1; j < decoded_options_count; j++)
4810 {
4811 if (decoded_options[j].opt_index == OPT_SPECIAL_input_file)
4812 {
4813 const char *arg = decoded_options[j].arg;
4814 const char *p = strrchr (arg, '@');
4815 char *fname;
4816 long offset;
4817 int consumed;
4818#ifdef HAVE_TARGET_OBJECT_SUFFIX
4819 arg = convert_filename (arg, 0, access (arg, F_OK0));
4820#endif
4821 /* For LTO static archive support we handle input file
4822 specifications that are composed of a filename and
4823 an offset like FNAME@OFFSET. */
4824 if (p
4825 && p != arg
4826 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4827 && strlen (p) == (unsigned int)consumed)
4828 {
4829 fname = (char *)xmalloc (p - arg + 1);
4830 memcpy (fname, arg, p - arg);
4831 fname[p - arg] = '\0';
4832 /* Only accept non-stdin and existing FNAME parts, otherwise
4833 try with the full name. */
4834 if (strcmp (fname, "-") == 0 || access (fname, F_OK0) < 0)
4835 {
4836 free (fname);
4837 fname = xstrdup (arg);
4838 }
4839 }
4840 else
4841 fname = xstrdup (arg);
4842
4843 if (strcmp (fname, "-") != 0 && access (fname, F_OK0) < 0)
4844 {
4845 bool resp = fname[0] == '@' && access (fname + 1, F_OK0) < 0;
4846 error ("%s: %m", fname + resp);
4847 }
4848 else
4849 add_infile (arg, spec_lang);
4850
4851 free (fname);
4852 continue;
4853 }
4854
4855 read_cmdline_option (&global_options, &global_options_set,
4856 decoded_options + j, UNKNOWN_LOCATION((location_t) 0),
4857 CL_DRIVER(1U << 19), &handlers, global_dc);
4858 }
4859
4860 /* If the user didn't specify any, default to all configured offload
4861 targets. */
4862 if (ENABLE_OFFLOADING0 && offload_targets == NULL__null)
4863 handle_foffload_option (OFFLOAD_TARGETS"");
4864
4865 if (output_file
4866 && strcmp (output_file, "-") != 0
4867 && strcmp (output_file, HOST_BIT_BUCKET"/dev/null") != 0)
4868 {
4869 int i;
4870 for (i = 0; i < n_infiles; i++)
4871 if ((!infiles[i].language || infiles[i].language[0] != '*')
4872 && canonical_filename_eq (infiles[i].name, output_file))
4873 fatal_error (input_location,
4874 "input file %qs is the same as output file",
4875 output_file);
4876 }
4877
4878 if (output_file != NULL__null && output_file[0] == '\0')
4879 fatal_error (input_location, "output filename may not be empty");
4880
4881 /* -dumpdir and -save-temps=* both specify the location of aux/dump
4882 outputs; the one that appears last prevails. When compiling
4883 multiple sources, an explicit dumpbase (minus -ext) may be
4884 combined with an explicit or implicit dumpdir, whereas when
4885 linking, a specified or implied link output name (minus
4886 extension) may be combined with a prevailing -save-temps=* or an
4887 otherwise implied dumpdir, but not override a prevailing
4888 -dumpdir. Primary outputs (e.g., linker output when linking
4889 without -o, or .i, .s or .o outputs when processing multiple
4890 inputs with -E, -S or -c, respectively) are NOT affected by these
4891 -save-temps=/-dump* options, always landing in the current
4892 directory and with the same basename as the input when an output
4893 name is not given, but when they're intermediate outputs, they
4894 are named like other aux outputs, so the options affect their
4895 location and name.
4896
4897 Here are some examples. There are several more in the
4898 documentation of -o and -dump*, and some quite exhaustive tests
4899 in gcc.misc-tests/outputs.exp.
4900
4901 When compiling any number of sources, no -dump* nor
4902 -save-temps=*, all outputs in cwd without prefix:
4903
4904 # gcc -c b.c -gsplit-dwarf
4905 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
4906
4907 # gcc -c b.c d.c -gsplit-dwarf
4908 -> cc1 [-dumpdir ./] -dumpbase b.c -dumpbase-ext .c # b.o b.dwo
4909 && cc1 [-dumpdir ./] -dumpbase d.c -dumpbase-ext .c # d.o d.dwo
4910
4911 When compiling and linking, no -dump* nor -save-temps=*, .o
4912 outputs are temporary, aux outputs land in the dir of the output,
4913 prefixed with the basename of the linker output:
4914
4915 # gcc b.c d.c -o ab -gsplit-dwarf
4916 -> cc1 -dumpdir ab- -dumpbase b.c -dumpbase-ext .c # ab-b.dwo
4917 && cc1 -dumpdir ab- -dumpbase d.c -dumpbase-ext .c # ab-d.dwo
4918 && link ... -o ab
4919
4920 # gcc b.c d.c [-o a.out] -gsplit-dwarf
4921 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.dwo
4922 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.dwo
4923 && link ... [-o a.out]
4924
4925 When compiling and linking, a prevailing -dumpdir fully overrides
4926 the prefix of aux outputs given by the output name:
4927
4928 # gcc -dumpdir f b.c d.c -gsplit-dwarf [-o [dir/]whatever]
4929 -> cc1 -dumpdir f -dumpbase b.c -dumpbase-ext .c # fb.dwo
4930 && cc1 -dumpdir f -dumpbase d.c -dumpbase-ext .c # fd.dwo
4931 && link ... [-o whatever]
4932
4933 When compiling multiple inputs, an explicit -dumpbase is combined
4934 with -dumpdir, affecting aux outputs, but not the .o outputs:
4935
4936 # gcc -dumpdir f -dumpbase g- b.c d.c -gsplit-dwarf -c
4937 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # b.o fg-b.dwo
4938 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # d.o fg-d.dwo
4939
4940 When compiling and linking with -save-temps, the .o outputs that
4941 would have been temporary become aux outputs, so they get
4942 affected by -dump* flags:
4943
4944 # gcc -dumpdir f -dumpbase g- -save-temps b.c d.c
4945 -> cc1 -dumpdir fg- -dumpbase b.c -dumpbase-ext .c # fg-b.o
4946 && cc1 -dumpdir fg- -dumpbase d.c -dumpbase-ext .c # fg-d.o
4947 && link
4948
4949 If -save-temps=* prevails over -dumpdir, however, the explicit
4950 -dumpdir is discarded, as if it wasn't there. The basename of
4951 the implicit linker output, a.out or a.exe, becomes a- as the aux
4952 output prefix for all compilations:
4953
4954 # gcc [-dumpdir f] -save-temps=cwd b.c d.c
4955 -> cc1 -dumpdir a- -dumpbase b.c -dumpbase-ext .c # a-b.o
4956 && cc1 -dumpdir a- -dumpbase d.c -dumpbase-ext .c # a-d.o
4957 && link
4958
4959 A single -dumpbase, applying to multiple inputs, overrides the
4960 linker output name, implied or explicit, as the aux output prefix:
4961
4962 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c
4963 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
4964 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
4965 && link
4966
4967 # gcc [-dumpdir f] -dumpbase g- -save-temps=cwd b.c d.c -o dir/h.out
4968 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
4969 && cc1 -dumpdir g- -dumpbase d.c -dumpbase-ext .c # g-d.o
4970 && link -o dir/h.out
4971
4972 Now, if the linker output is NOT overridden as a prefix, but
4973 -save-temps=* overrides implicit or explicit -dumpdir, the
4974 effective dump dir combines the dir selected by the -save-temps=*
4975 option with the basename of the specified or implied link output:
4976
4977 # gcc [-dumpdir f] -save-temps=cwd b.c d.c -o dir/h.out
4978 -> cc1 -dumpdir h- -dumpbase b.c -dumpbase-ext .c # h-b.o
4979 && cc1 -dumpdir h- -dumpbase d.c -dumpbase-ext .c # h-d.o
4980 && link -o dir/h.out
4981
4982 # gcc [-dumpdir f] -save-temps=obj b.c d.c -o dir/h.out
4983 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
4984 && cc1 -dumpdir dir/h- -dumpbase d.c -dumpbase-ext .c # dir/h-d.o
4985 && link -o dir/h.out
4986
4987 But then again, a single -dumpbase applying to multiple inputs
4988 gets used instead of the linker output basename in the combined
4989 dumpdir:
4990
4991 # gcc [-dumpdir f] -dumpbase g- -save-temps=obj b.c d.c -o dir/h.out
4992 -> cc1 -dumpdir dir/g- -dumpbase b.c -dumpbase-ext .c # dir/g-b.o
4993 && cc1 -dumpdir dir/g- -dumpbase d.c -dumpbase-ext .c # dir/g-d.o
4994 && link -o dir/h.out
4995
4996 With a single input being compiled, the output basename does NOT
4997 affect the dumpdir prefix.
4998
4999 # gcc -save-temps=obj b.c -gsplit-dwarf -c -o dir/b.o
5000 -> cc1 -dumpdir dir/ -dumpbase b.c -dumpbase-ext .c # dir/b.o dir/b.dwo
5001
5002 but when compiling and linking even a single file, it does:
5003
5004 # gcc -save-temps=obj b.c -o dir/h.out
5005 -> cc1 -dumpdir dir/h- -dumpbase b.c -dumpbase-ext .c # dir/h-b.o
5006
5007 unless an explicit -dumpdir prevails:
5008
5009 # gcc -save-temps[=obj] -dumpdir g- b.c -o dir/h.out
5010 -> cc1 -dumpdir g- -dumpbase b.c -dumpbase-ext .c # g-b.o
5011
5012 */
5013
5014 bool explicit_dumpdir = dumpdir;
5015
5016 if (!save_temps_overrides_dumpdir && explicit_dumpdir)
5017 {
5018 /* Do nothing. */
5019 }
5020
5021 /* If -save-temps=obj and -o name, create the prefix to use for %b.
5022 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
5023 else if (save_temps_flag != SAVE_TEMPS_CWD && output_file != NULL__null)
5024 {
5025 free (dumpdir);
5026 dumpdir = NULL__null;
5027 temp = lbasename (output_file);
5028 if (temp != output_file)
5029 dumpdir = xstrndup (output_file,
5030 strlen (output_file) - strlen (temp));
5031 }
5032 else if (dumpdir)
5033 {
5034 free (dumpdir);
5035 dumpdir = NULL__null;
5036 }
5037
5038 if (save_temps_flag)
5039 save_temps_flag = SAVE_TEMPS_DUMP;
5040
5041 /* If there is any pathname component in an explicit -dumpbase, it
5042 overrides dumpdir entirely, so discard it right away. Although
5043 the presence of an explicit -dumpdir matters for the driver, it
5044 shouldn't matter for other processes, that get all that's needed
5045 from the -dumpdir and -dumpbase always passed to them. */
5046 if (dumpdir && dumpbase && lbasename (dumpbase) != dumpbase)
5047 {
5048 free (dumpdir);
5049 dumpdir = NULL__null;
5050 }
5051
5052 /* Check that dumpbase_ext matches the end of dumpbase, drop it
5053 otherwise. */
5054 if (dumpbase_ext && dumpbase && *dumpbase)
5055 {
5056 int lendb = strlen (dumpbase);
5057 int lendbx = strlen (dumpbase_ext);
5058
5059 /* -dumpbase-ext must be a suffix proper; discard it if it
5060 matches all of -dumpbase, as that would make for an empty
5061 basename. */
5062 if (lendbx >= lendb
5063 || strcmp (dumpbase + lendb - lendbx, dumpbase_ext) != 0)
5064 {
5065 free (dumpbase_ext);
5066 dumpbase_ext = NULL__null;
5067 }
5068 }
5069
5070 /* -dumpbase with multiple sources goes into dumpdir. With a single
5071 source, it does only if linking and if dumpdir was not explicitly
5072 specified. */
5073 if (dumpbase && *dumpbase
5074 && (single_input_file_index () == -2
5075 || (!have_c && !explicit_dumpdir)))
5076 {
5077 char *prefix;
5078
5079 if (dumpbase_ext)
5080 /* We checked that they match above. */
5081 dumpbase[strlen (dumpbase) - strlen (dumpbase_ext)] = '\0';
5082
5083 if (dumpdir)
5084 prefix = concat (dumpdir, dumpbase, "-", NULL__null);
5085 else
5086 prefix = concat (dumpbase, "-", NULL__null);
5087
5088 free (dumpdir);
5089 free (dumpbase);
5090 free (dumpbase_ext);
5091 dumpbase = dumpbase_ext = NULL__null;
5092 dumpdir = prefix;
5093 dumpdir_trailing_dash_added = true;
5094 }
5095
5096 /* If dumpbase was not brought into dumpdir but we're linking, bring
5097 output_file into dumpdir unless dumpdir was explicitly specified.
5098 The test for !explicit_dumpdir is further below, because we want
5099 to use the obase computation for a ghost outbase, passed to
5100 GCC_COLLECT_OPTIONS. */
5101 else if (!have_c && (!explicit_dumpdir || (dumpbase && !*dumpbase)))
5102 {
5103 /* If we get here, we know dumpbase was not specified, or it was
5104 specified as an empty string. If it was anything else, it
5105 would have combined with dumpdir above, because the condition
5106 for dumpbase to be used when present is broader than the
5107 condition that gets us here. */
5108 gcc_assert (!dumpbase || !*dumpbase)((void)(!(!dumpbase || !*dumpbase) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5108, __FUNCTION__), 0 : 0))
;
5109
5110 const char *obase;
5111 char *tofree = NULL__null;
5112 if (!output_file || not_actual_file_p (output_file))
5113 obase = "a";
5114 else
5115 {
5116 obase = lbasename (output_file);
5117 size_t blen = strlen (obase), xlen;
5118 /* Drop the suffix if it's dumpbase_ext, if given,
5119 otherwise .exe or the target executable suffix, or if the
5120 output was explicitly named a.out, but not otherwise. */
5121 if (dumpbase_ext
5122 ? (blen > (xlen = strlen (dumpbase_ext))
5123 && strcmp ((temp = (obase + blen - xlen)),
Although the value stored to 'temp' is used in the enclosing expression, the value is never actually read from 'temp'
5124 dumpbase_ext) == 0)
5125 : ((temp = strrchr (obase + 1, '.'))
5126 && (xlen = strlen (temp))
5127 && (strcmp (temp, ".exe") == 0
5128#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
5129 || strcmp (temp, TARGET_EXECUTABLE_SUFFIX"") == 0
5130#endif
5131 || strcmp (obase, "a.out") == 0)))
5132 {
5133 tofree = xstrndup (obase, blen - xlen);
5134 obase = tofree;
5135 }
5136 }
5137
5138 /* We wish to save this basename to the -dumpdir passed through
5139 GCC_COLLECT_OPTIONS within maybe_run_linker, for e.g. LTO,
5140 but we do NOT wish to add it to e.g. %b, so we keep
5141 outbase_length as zero. */
5142 gcc_assert (!outbase)((void)(!(!outbase) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5142, __FUNCTION__), 0 : 0))
;
5143 outbase_length = 0;
5144
5145 /* If we're building [dir1/]foo[.exe] out of a single input
5146 [dir2/]foo.c that shares the same basename, dump to
5147 [dir2/]foo.c.* rather than duplicating the basename into
5148 [dir2/]foo-foo.c.*. */
5149 int idxin;
5150 if (dumpbase
5151 || ((idxin = single_input_file_index ()) >= 0
5152 && adds_single_suffix_p (lbasename (infiles[idxin].name),
5153 obase)))
5154 {
5155 if (obase == tofree)
5156 outbase = tofree;
5157 else
5158 {
5159 outbase = xstrdup (obase);
5160 free (tofree);
5161 }
5162 obase = tofree = NULL__null;
5163 }
5164 else
5165 {
5166 if (dumpdir)
5167 {
5168 char *p = concat (dumpdir, obase, "-", NULL__null);
5169 free (dumpdir);
5170 dumpdir = p;
5171 }
5172 else
5173 dumpdir = concat (obase, "-", NULL__null);
5174
5175 dumpdir_trailing_dash_added = true;
5176
5177 free (tofree);
5178 obase = tofree = NULL__null;
5179 }
5180
5181 if (!explicit_dumpdir || dumpbase)
5182 {
5183 /* Absent -dumpbase and present -dumpbase-ext have been applied
5184 to the linker output name, so compute fresh defaults for each
5185 compilation. */
5186 free (dumpbase_ext);
5187 dumpbase_ext = NULL__null;
5188 }
5189 }
5190
5191 /* Now, if we're compiling, or if we haven't used the dumpbase
5192 above, then outbase (%B) is derived from dumpbase, if given, or
5193 from the output name, given or implied. We can't precompute
5194 implied output names, but that's ok, since they're derived from
5195 input names. Just make sure we skip this if dumpbase is the
5196 empty string: we want to use input names then, so don't set
5197 outbase. */
5198 if ((dumpbase || have_c)
5199 && !(dumpbase && !*dumpbase))
5200 {
5201 gcc_assert (!outbase)((void)(!(!outbase) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5201, __FUNCTION__), 0 : 0))
;
5202
5203 if (dumpbase)
5204 {
5205 gcc_assert (single_input_file_index () != -2)((void)(!(single_input_file_index () != -2) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5205, __FUNCTION__), 0 : 0))
;
5206 /* We do not want lbasename here; dumpbase with dirnames
5207 overrides dumpdir entirely, even if dumpdir is
5208 specified. */
5209 if (dumpbase_ext)
5210 /* We've already checked above that the suffix matches. */
5211 outbase = xstrndup (dumpbase,
5212 strlen (dumpbase) - strlen (dumpbase_ext));
5213 else
5214 outbase = xstrdup (dumpbase);
5215 }
5216 else if (output_file && !not_actual_file_p (output_file))
5217 {
5218 outbase = xstrdup (lbasename (output_file));
5219 char *p = strrchr (outbase + 1, '.');
5220 if (p)
5221 *p = '\0';
5222 }
5223
5224 if (outbase)
5225 outbase_length = strlen (outbase);
5226 }
5227
5228 /* If there is any pathname component in an explicit -dumpbase, do
5229 not use dumpdir, but retain it to pass it on to the compiler. */
5230 if (dumpdir)
5231 dumpdir_length = strlen (dumpdir);
5232 else
5233 dumpdir_length = 0;
5234
5235 /* Check that dumpbase_ext, if still present, still matches the end
5236 of dumpbase, if present, and drop it otherwise. We only retained
5237 it above when dumpbase was absent to maybe use it to drop the
5238 extension from output_name before combining it with dumpdir. We
5239 won't deal with -dumpbase-ext when -dumpbase is not explicitly
5240 given, even if just to activate backward-compatible dumpbase:
5241 dropping it on the floor is correct, expected and documented
5242 behavior. Attempting to deal with a -dumpbase-ext that might
5243 match the end of some input filename, or of the combination of
5244 the output basename with the suffix of the input filename,
5245 possible with an intermediate .gk extension for -fcompare-debug,
5246 is just calling for trouble. */
5247 if (dumpbase_ext)
5248 {
5249 if (!dumpbase || !*dumpbase)
5250 {
5251 free (dumpbase_ext);
5252 dumpbase_ext = NULL__null;
5253 }
5254 else
5255 gcc_assert (strcmp (dumpbase + strlen (dumpbase)((void)(!(strcmp (dumpbase + strlen (dumpbase) - strlen (dumpbase_ext
), dumpbase_ext) == 0) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5256, __FUNCTION__), 0 : 0))
5256 - strlen (dumpbase_ext), dumpbase_ext) == 0)((void)(!(strcmp (dumpbase + strlen (dumpbase) - strlen (dumpbase_ext
), dumpbase_ext) == 0) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5256, __FUNCTION__), 0 : 0))
;
5257 }
5258
5259 if (save_temps_flag && use_pipesglobal_options.x_use_pipes)
5260 {
5261 /* -save-temps overrides -pipe, so that temp files are produced */
5262 if (save_temps_flag)
5263 warning (0, "%<-pipe%> ignored because %<-save-temps%> specified");
5264 use_pipesglobal_options.x_use_pipes = 0;
5265 }
5266
5267 if (!compare_debug)
5268 {
5269 const char *gcd = env.get ("GCC_COMPARE_DEBUG");
5270
5271 if (gcd && gcd[0] == '-')
5272 {
5273 compare_debug = 2;
5274 compare_debug_opt = gcd;
5275 }
5276 else if (gcd && *gcd && strcmp (gcd, "0"))
5277 {
5278 compare_debug = 3;
5279 compare_debug_opt = "-gtoggle";
5280 }
5281 }
5282 else if (compare_debug < 0)
5283 {
5284 compare_debug = 0;
5285 gcc_assert (!compare_debug_opt)((void)(!(!compare_debug_opt) ? fancy_abort ("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5285, __FUNCTION__), 0 : 0))
;
5286 }
5287
5288 /* Set up the search paths. We add directories that we expect to
5289 contain GNU Toolchain components before directories specified by
5290 the machine description so that we will find GNU components (like
5291 the GNU assembler) before those of the host system. */
5292
5293 /* If we don't know where the toolchain has been installed, use the
5294 configured-in locations. */
5295 if (!gcc_exec_prefix)
5296 {
5297#ifndef OS2
5298 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
5299 PREFIX_PRIORITY_LAST, 1, 0);
5300 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
5301 PREFIX_PRIORITY_LAST, 2, 0);
5302 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
5303 PREFIX_PRIORITY_LAST, 2, 0);
5304#endif
5305 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
5306 PREFIX_PRIORITY_LAST, 1, 0);
5307 }
5308
5309 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix))((void)(!(!(((((tooldir_base_prefix)[0]) == '/') || ((((tooldir_base_prefix
)[0]) == '\\') && (0))) || ((tooldir_base_prefix)[0] &&
((tooldir_base_prefix)[1] == ':') && (0)))) ? fancy_abort
("/home/marxin/BIG/buildbot/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/gcc.c"
, 5309, __FUNCTION__), 0 : 0))
;
5310 tooldir_prefix2 = concat (tooldir_base_prefix, spec_machine,
5311 dir_separator_str, NULL__null);
5312
5313 /* Look for tools relative to the location from which the driver is
5314 running, or, if that is not available, the configured prefix. */
5315 tooldir_prefix
5316 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
5317 spec_host_machine, dir_separator_str, spec_version,
5318 accel_dir_suffix, dir_separator_str, tooldir_prefix2, NULL__null);
5319 free (tooldir_prefix2);
5320
5321 add_prefix (&exec_prefixes,
5322 concat (tooldir_prefix, "bin", dir_separator_str, NULL__null),
5323 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
5324 add_prefix (&startfile_prefixes,
5325 concat (tooldir_prefix, "lib", dir_separator_str, NULL__null),
5326 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
5327 free (tooldir_prefix);
5328
5329#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
5330 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
5331 then consider it to relocate with the rest of the GCC installation
5332 if GCC_EXEC_PREFIX is set.
5333 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
5334 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
5335 {
5336 char *tmp_prefix = get_relative_prefix (decoded_options[0].arg,
5337 standard_bindir_prefix,
5338 target_system_root);
5339 if (tmp_prefix && access_check (tmp_prefix, F_OK0) == 0)
5340 {
5341 target_system_root = tmp_prefix;
5342 target_system_root_changed = 1;
5343 }
5344 }
5345#endif
5346
5347 /* More prefixes are enabled in main, after we read the specs file
5348 and determine whether this is cross-compilation or not. */
5349
5350 if (n_infiles != 0 && n_infiles == last_language_n_infiles && spec_lang != 0)
5351 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
5352
5353 /* Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
5354 environment variable. */
5355 if (compare_debug == 2 || compare_debug == 3)
5356 {
5357 const char *opt = concat ("-fcompare-debug=", compare_debug_opt, NULL__null);
5358 save_switch (opt, 0, NULL__null, false, true);
5359 compare_debug = 1;
5360 }
5361
5362 /* Ensure we only invoke each subprocess once. */
5363 if (n_infiles == 0
5364 && (print_subprocess_help || print_help_list || print_version))
5365 {
5366 /* Create a dummy input file, so that we can pass
5367 the help option on to the various sub-processes. */
5368 add_infile ("help-dummy", "c");
5369 }
5370
5371 /* Decide if undefined variable references are allowed in specs. */
5372
5373 /* -v alone is safe. --version and --help alone or together are safe. Note
5374 that -v would make them unsafe, as they'd then be run for subprocesses as
5375 well, the location of which might depend on variables possibly coming
5376 from self-specs. Note also that the command name is counted in
5377 decoded_options_count. */
5378
5379 unsigned help_version_count = 0;
5380
5381 if (print_version)
5382 help_version_count++;
5383
5384 if (print_help_list)
5385 help_version_count++;
5386
5387 spec_undefvar_allowed =
5388 ((verbose_flagglobal_options.x_verbose_flag && decoded_options_count == 2)
5389 || help_version_count == decoded_options_count - 1);
5390
5391 alloc_switch ();
5392 switches[n_switches].part1 = 0;
5393 alloc_infile ();
5394 infiles[n_infiles].name = 0;
5395}
5396
5397/* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
5398 and place that in the environment. */
5399
5400static void
5401set_collect_gcc_options (void)
5402{
5403 int i;
5404 int first_time;
5405
5406 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5407 the compiler. */
5408 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",__extension__ ({ struct obstack *__o = (&collect_obstack)
; size_t __len = (sizeof ("COLLECT_GCC_OPTIONS=") - 1); if (__extension__
({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < __len) _obstack_newchunk (__o
, __len); memcpy (__o->next_free, "COLLECT_GCC_OPTIONS=", __len
); __o->next_free += __len; (void) 0; })
5409 sizeof ("COLLECT_GCC_OPTIONS=") - 1)__extension__ ({ struct obstack *__o = (&collect_obstack)
; size_t __len = (sizeof ("COLLECT_GCC_OPTIONS=") - 1); if (__extension__
({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit
- __o1->next_free); }) < __len) _obstack_newchunk (__o
, __len); memcpy (__o->next_free, "COLLECT_GCC_OPTIONS=", __len
); __o->next_free += __len; (void) 0; })
;
5410
5411