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