Support AVX for cmpss/cmpsd.
[official-gcc.git] / gcc / gcc.c
blob6455437a907ebf7744c28e8ad7cf31945635b4ad
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.
7 This file is part of GCC.
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.
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.
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/>. */
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.
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". */
33 /* A Short Introduction to Adding a Command-Line Option.
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.
39 In the following, consider adding the command-line argument
40 `--bar'.
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.
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 `-'.
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'.
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'.
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.
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(). */
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 "flags.h"
86 #include "opts.h"
88 #ifdef HAVE_MMAP_FILE
89 # include <sys/mman.h>
90 # ifdef HAVE_MINCORE
91 /* This is on Solaris. */
92 # include <sys/types.h>
93 # endif
94 #endif
96 #ifndef MAP_FAILED
97 # define MAP_FAILED ((void *)-1)
98 #endif
100 /* By default there is no special suffix for target executables. */
101 /* FIXME: when autoconf is fixed, remove the host check - dj */
102 #if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
103 #define HAVE_TARGET_EXECUTABLE_SUFFIX
104 #endif
106 /* By default there is no special suffix for host executables. */
107 #ifdef HOST_EXECUTABLE_SUFFIX
108 #define HAVE_HOST_EXECUTABLE_SUFFIX
109 #else
110 #define HOST_EXECUTABLE_SUFFIX ""
111 #endif
113 /* By default, the suffix for target object files is ".o". */
114 #ifdef TARGET_OBJECT_SUFFIX
115 #define HAVE_TARGET_OBJECT_SUFFIX
116 #else
117 #define TARGET_OBJECT_SUFFIX ".o"
118 #endif
120 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
122 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
123 #ifndef LIBRARY_PATH_ENV
124 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
125 #endif
127 #ifndef HAVE_KILL
128 #define kill(p,s) raise(s)
129 #endif
131 /* If a stage of compilation returns an exit status >= 1,
132 compilation of that file ceases. */
134 #define MIN_FATAL_STATUS 1
136 /* Flag set by cppspec.c to 1. */
137 int is_cpp_driver;
139 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
140 static bool at_file_supplied;
142 /* Flag saying to pass the greatest exit code returned by a sub-process
143 to the calling program. */
144 static int pass_exit_codes;
146 /* Definition of string containing the arguments given to configure. */
147 #include "configargs.h"
149 /* Flag saying to print the directories gcc will search through looking for
150 programs, libraries, etc. */
152 static int print_search_dirs;
154 /* Flag saying to print the full filename of this file
155 as found through our usual search mechanism. */
157 static const char *print_file_name = NULL;
159 /* As print_file_name, but search for executable file. */
161 static const char *print_prog_name = NULL;
163 /* Flag saying to print the relative path we'd use to
164 find libgcc.a given the current compiler flags. */
166 static int print_multi_directory;
168 static int print_sysroot;
170 /* Flag saying to print the relative path we'd use to
171 find OS libraries given the current compiler flags. */
173 static int print_multi_os_directory;
175 /* Flag saying to print the list of subdirectories and
176 compiler flags used to select them in a standard form. */
178 static int print_multi_lib;
180 /* Flag saying to print the command line options understood by gcc and its
181 sub-processes. */
183 static int print_help_list;
185 /* Flag saying to print the version of gcc and its sub-processes. */
187 static int print_version;
189 /* Flag saying to print the sysroot suffix used for searching for
190 headers. */
192 static int print_sysroot_headers_suffix;
194 /* Flag indicating whether we should print the command and arguments */
196 static int verbose_flag;
198 /* Flag indicating whether we should ONLY print the command and
199 arguments (like verbose_flag) without executing the command.
200 Displayed arguments are quoted so that the generated command
201 line is suitable for execution. This is intended for use in
202 shell scripts to capture the driver-generated command line. */
203 static int verbose_only_flag;
205 /* Flag indicating how to print command line options of sub-processes. */
207 static int print_subprocess_help;
209 /* Flag indicating whether we should report subprocess execution times
210 (if this is supported by the system - see pexecute.c). */
212 static int report_times;
214 /* Whether we should report subprocess execution times to a file. */
216 FILE *report_times_to_file = NULL;
218 /* Nonzero means place this string before uses of /, so that include
219 and library files can be found in an alternate location. */
221 #ifdef TARGET_SYSTEM_ROOT
222 static const char *target_system_root = TARGET_SYSTEM_ROOT;
223 #else
224 static const char *target_system_root = 0;
225 #endif
227 /* Nonzero means pass the updated target_system_root to the compiler. */
229 static int target_system_root_changed;
231 /* Nonzero means append this string to target_system_root. */
233 static const char *target_sysroot_suffix = 0;
235 /* Nonzero means append this string to target_system_root for headers. */
237 static const char *target_sysroot_hdrs_suffix = 0;
239 /* Nonzero means write "temp" files in source directory
240 and use the source file's name in them, and don't delete them. */
242 static enum save_temps {
243 SAVE_TEMPS_NONE, /* no -save-temps */
244 SAVE_TEMPS_CWD, /* -save-temps in current directory */
245 SAVE_TEMPS_OBJ /* -save-temps in object directory */
246 } save_temps_flag;
248 /* Output file to use to get the object directory for -save-temps=obj */
249 static char *save_temps_prefix = 0;
250 static size_t save_temps_length = 0;
252 /* Nonzero means pass multiple source files to the compiler at one time. */
254 static int combine_flag = 0;
256 /* Nonzero means use pipes to communicate between subprocesses.
257 Overridden by either of the above two flags. */
259 static int use_pipes;
261 /* The compiler version. */
263 static const char *compiler_version;
265 /* The target version. */
267 static const char *const spec_version = DEFAULT_TARGET_VERSION;
269 /* The target machine. */
271 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
273 /* Nonzero if cross-compiling.
274 When -b is used, the value comes from the `specs' file. */
276 #ifdef CROSS_DIRECTORY_STRUCTURE
277 static const char *cross_compile = "1";
278 #else
279 static const char *cross_compile = "0";
280 #endif
282 #ifdef MODIFY_TARGET_NAME
284 /* Information on how to alter the target name based on a command-line
285 switch. The only case we support now is simply appending or deleting a
286 string to or from the end of the first part of the configuration name. */
288 enum add_del {ADD, DELETE};
290 static const struct modify_target
292 const char *const sw;
293 const enum add_del add_del;
294 const char *const str;
296 modify_target[] = MODIFY_TARGET_NAME;
297 #endif
299 /* The number of errors that have occurred; the link phase will not be
300 run if this is nonzero. */
301 static int error_count = 0;
303 /* Greatest exit code of sub-processes that has been encountered up to
304 now. */
305 static int greatest_status = 1;
307 /* This is the obstack which we use to allocate many strings. */
309 static struct obstack obstack;
311 /* This is the obstack to build an environment variable to pass to
312 collect2 that describes all of the relevant switches of what to
313 pass the compiler in building the list of pointers to constructors
314 and destructors. */
316 static struct obstack collect_obstack;
318 /* This is a list of a wrapper program and its arguments.
319 e.g. wrapper_string of "strace,-c"
320 will cause all programs to run as
321 strace -c program arguments
322 instead of just
323 program arguments */
324 static const char *wrapper_string;
326 /* Forward declaration for prototypes. */
327 struct path_prefix;
328 struct prefix_list;
330 static void init_spec (void);
331 static void store_arg (const char *, int, int);
332 static void insert_wrapper (const char *);
333 static char *load_specs (const char *);
334 static void read_specs (const char *, int);
335 static void set_spec (const char *, const char *);
336 static struct compiler *lookup_compiler (const char *, size_t, const char *);
337 static char *build_search_list (const struct path_prefix *, const char *,
338 bool, bool);
339 static void xputenv (const char *);
340 static void putenv_from_prefixes (const struct path_prefix *, const char *,
341 bool);
342 static int access_check (const char *, int);
343 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
344 static void add_prefix (struct path_prefix *, const char *, const char *,
345 int, int, int);
346 static void add_sysrooted_prefix (struct path_prefix *, const char *,
347 const char *, int, int, int);
348 static void translate_options (int *, const char *const **);
349 static char *skip_whitespace (char *);
350 static void delete_if_ordinary (const char *);
351 static void delete_temp_files (void);
352 static void delete_failure_queue (void);
353 static void clear_failure_queue (void);
354 static int check_live_switch (int, int);
355 static const char *handle_braces (const char *);
356 static inline bool input_suffix_matches (const char *, const char *);
357 static inline bool switch_matches (const char *, const char *, int);
358 static inline void mark_matching_switches (const char *, const char *, int);
359 static inline void process_marked_switches (void);
360 static const char *process_brace_body (const char *, const char *, const char *, int, int);
361 static const struct spec_function *lookup_spec_function (const char *);
362 static const char *eval_spec_function (const char *, const char *);
363 static const char *handle_spec_function (const char *);
364 static char *save_string (const char *, int);
365 static void set_collect_gcc_options (void);
366 static int do_spec_1 (const char *, int, const char *);
367 static int do_spec_2 (const char *);
368 static void do_option_spec (const char *, const char *);
369 static void do_self_spec (const char *);
370 static const char *find_file (const char *);
371 static int is_directory (const char *, bool);
372 static const char *validate_switches (const char *);
373 static void validate_all_switches (void);
374 static inline void validate_switches_from_spec (const char *);
375 static void give_switch (int, int);
376 static int used_arg (const char *, int);
377 static int default_arg (const char *, int);
378 static void set_multilib_dir (void);
379 static void print_multilib_info (void);
380 static void perror_with_name (const char *);
381 static void fatal_ice (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
382 static void notice (const char *, ...) ATTRIBUTE_PRINTF_1;
383 static void display_help (void);
384 static void add_preprocessor_option (const char *, int);
385 static void add_assembler_option (const char *, int);
386 static void add_linker_option (const char *, int);
387 static void process_command (int, const char **);
388 static int execute (void);
389 static void alloc_args (void);
390 static void clear_args (void);
391 static void fatal_error (int);
392 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
393 static void init_gcc_specs (struct obstack *, const char *, const char *,
394 const char *);
395 #endif
396 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
397 static const char *convert_filename (const char *, int, int);
398 #endif
400 static const char *getenv_spec_function (int, const char **);
401 static const char *if_exists_spec_function (int, const char **);
402 static const char *if_exists_else_spec_function (int, const char **);
403 static const char *replace_outfile_spec_function (int, const char **);
404 static const char *version_compare_spec_function (int, const char **);
405 static const char *include_spec_function (int, const char **);
406 static const char *find_file_spec_function (int, const char **);
407 static const char *print_asm_header_spec_function (int, const char **);
408 static const char *compare_debug_dump_opt_spec_function (int, const char **);
409 static const char *compare_debug_self_opt_spec_function (int, const char **);
410 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
412 /* The Specs Language
414 Specs are strings containing lines, each of which (if not blank)
415 is made up of a program name, and arguments separated by spaces.
416 The program name must be exact and start from root, since no path
417 is searched and it is unreliable to depend on the current working directory.
418 Redirection of input or output is not supported; the subprograms must
419 accept filenames saying what files to read and write.
421 In addition, the specs can contain %-sequences to substitute variable text
422 or for conditional text. Here is a table of all defined %-sequences.
423 Note that spaces are not generated automatically around the results of
424 expanding these sequences; therefore, you can concatenate them together
425 or with constant text in a single argument.
427 %% substitute one % into the program name or argument.
428 %i substitute the name of the input file being processed.
429 %b substitute the basename of the input file being processed.
430 This is the substring up to (and not including) the last period
431 and not including the directory unless -save-temps was specified
432 to put temporaries in a different location.
433 %B same as %b, but include the file suffix (text after the last period).
434 %gSUFFIX
435 substitute a file name that has suffix SUFFIX and is chosen
436 once per compilation, and mark the argument a la %d. To reduce
437 exposure to denial-of-service attacks, the file name is now
438 chosen in a way that is hard to predict even when previously
439 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
440 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
441 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
442 had been pre-processed. Previously, %g was simply substituted
443 with a file name chosen once per compilation, without regard
444 to any appended suffix (which was therefore treated just like
445 ordinary text), making such attacks more likely to succeed.
446 %|SUFFIX
447 like %g, but if -pipe is in effect, expands simply to "-".
448 %mSUFFIX
449 like %g, but if -pipe is in effect, expands to nothing. (We have both
450 %| and %m to accommodate differences between system assemblers; see
451 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
452 %uSUFFIX
453 like %g, but generates a new temporary file name even if %uSUFFIX
454 was already seen.
455 %USUFFIX
456 substitutes the last file name generated with %uSUFFIX, generating a
457 new one if there is no such last file name. In the absence of any
458 %uSUFFIX, this is just like %gSUFFIX, except they don't share
459 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
460 would involve the generation of two distinct file names, one
461 for each `%g.s' and another for each `%U.s'. Previously, %U was
462 simply substituted with a file name chosen for the previous %u,
463 without regard to any appended suffix.
464 %jSUFFIX
465 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
466 writable, and if save-temps is off; otherwise, substitute the name
467 of a temporary file, just like %u. This temporary file is not
468 meant for communication between processes, but rather as a junk
469 disposal mechanism.
470 %.SUFFIX
471 substitutes .SUFFIX for the suffixes of a matched switch's args when
472 it is subsequently output with %*. SUFFIX is terminated by the next
473 space or %.
474 %d marks the argument containing or following the %d as a
475 temporary file name, so that that file will be deleted if GCC exits
476 successfully. Unlike %g, this contributes no text to the argument.
477 %w marks the argument containing or following the %w as the
478 "output file" of this compilation. This puts the argument
479 into the sequence of arguments that %o will substitute later.
480 %V indicates that this compilation produces no "output file".
481 %W{...}
482 like %{...} but mark last argument supplied within
483 as a file to be deleted on failure.
484 %o substitutes the names of all the output files, with spaces
485 automatically placed around them. You should write spaces
486 around the %o as well or the results are undefined.
487 %o is for use in the specs for running the linker.
488 Input files whose names have no recognized suffix are not compiled
489 at all, but they are included among the output files, so they will
490 be linked.
491 %O substitutes the suffix for object files. Note that this is
492 handled specially when it immediately follows %g, %u, or %U
493 (with or without a suffix argument) because of the need for
494 those to form complete file names. The handling is such that
495 %O is treated exactly as if it had already been substituted,
496 except that %g, %u, and %U do not currently support additional
497 SUFFIX characters following %O as they would following, for
498 example, `.o'.
499 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
500 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
501 and -B options) and -imultilib as necessary.
502 %s current argument is the name of a library or startup file of some sort.
503 Search for that file in a standard list of directories
504 and substitute the full name found.
505 %eSTR Print STR as an error message. STR is terminated by a newline.
506 Use this when inconsistent options are detected.
507 %nSTR Print STR as a notice. STR is terminated by a newline.
508 %x{OPTION} Accumulate an option for %X.
509 %X Output the accumulated linker options specified by compilations.
510 %Y Output the accumulated assembler options specified by compilations.
511 %Z Output the accumulated preprocessor options specified by compilations.
512 %a process ASM_SPEC as a spec.
513 This allows config.h to specify part of the spec for running as.
514 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
515 used here. This can be used to run a post-processor after the
516 assembler has done its job.
517 %D Dump out a -L option for each directory in startfile_prefixes.
518 If multilib_dir is set, extra entries are generated with it affixed.
519 %l process LINK_SPEC as a spec.
520 %L process LIB_SPEC as a spec.
521 %G process LIBGCC_SPEC as a spec.
522 %R Output the concatenation of target_system_root and
523 target_sysroot_suffix.
524 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
525 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
526 %C process CPP_SPEC as a spec.
527 %1 process CC1_SPEC as a spec.
528 %2 process CC1PLUS_SPEC as a spec.
529 %* substitute the variable part of a matched option. (See below.)
530 Note that each comma in the substituted string is replaced by
531 a single space.
532 %<S remove all occurrences of -S from the command line.
533 Note - this command is position dependent. % commands in the
534 spec string before this one will see -S, % commands in the
535 spec string after this one will not.
536 %<S* remove all occurrences of all switches beginning with -S from the
537 command line.
538 %:function(args)
539 Call the named function FUNCTION, passing it ARGS. ARGS is
540 first processed as a nested spec string, then split into an
541 argument vector in the usual fashion. The function returns
542 a string which is processed as if it had appeared literally
543 as part of the current spec.
544 %{S} substitutes the -S switch, if that switch was given to GCC.
545 If that switch was not specified, this substitutes nothing.
546 Here S is a metasyntactic variable.
547 %{S*} substitutes all the switches specified to GCC whose names start
548 with -S. This is used for -o, -I, etc; switches that take
549 arguments. GCC considers `-o foo' as being one switch whose
550 name starts with `o'. %{o*} would substitute this text,
551 including the space; thus, two arguments would be generated.
552 %{S*&T*} likewise, but preserve order of S and T options (the order
553 of S and T in the spec is not significant). Can be any number
554 of ampersand-separated variables; for each the wild card is
555 optional. Useful for CPP as %{D*&U*&A*}.
557 %{S:X} substitutes X, if the -S switch was given to GCC.
558 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
559 %{S*:X} substitutes X if one or more switches whose names start
560 with -S was given to GCC. Normally X is substituted only
561 once, no matter how many such switches appeared. However,
562 if %* appears somewhere in X, then X will be substituted
563 once for each matching switch, with the %* replaced by the
564 part of that switch that matched the '*'.
565 %{.S:X} substitutes X, if processing a file with suffix S.
566 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
567 %{,S:X} substitutes X, if processing a file which will use spec S.
568 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
570 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
571 combined with '!', '.', ',', and '*' as above binding stronger
572 than the OR.
573 If %* appears in X, all of the alternatives must be starred, and
574 only the first matching alternative is substituted.
575 %{S:X; if S was given to GCC, substitutes X;
576 T:Y; else if T was given to GCC, substitutes Y;
577 :D} else substitutes D. There can be as many clauses as you need.
578 This may be combined with '.', '!', ',', '|', and '*' as above.
580 %(Spec) processes a specification defined in a specs file as *Spec:
581 %[Spec] as above, but put __ around -D arguments
583 The conditional text X in a %{S:X} or similar construct may contain
584 other nested % constructs or spaces, or even newlines. They are
585 processed as usual, as described above. Trailing white space in X is
586 ignored. White space may also appear anywhere on the left side of the
587 colon in these constructs, except between . or * and the corresponding
588 word.
590 The -O, -f, -m, and -W switches are handled specifically in these
591 constructs. If another value of -O or the negated form of a -f, -m, or
592 -W switch is found later in the command line, the earlier switch
593 value is ignored, except with {S*} where S is just one letter; this
594 passes all matching options.
596 The character | at the beginning of the predicate text is used to indicate
597 that a command should be piped to the following command, but only if -pipe
598 is specified.
600 Note that it is built into GCC which switches take arguments and which
601 do not. You might think it would be useful to generalize this to
602 allow each compiler's spec to say which switches take arguments. But
603 this cannot be done in a consistent fashion. GCC cannot even decide
604 which input files have been specified without knowing which switches
605 take arguments, and it must know which input files to compile in order
606 to tell which compilers to run.
608 GCC also knows implicitly that arguments starting in `-l' are to be
609 treated as compiler output files, and passed to the linker in their
610 proper position among the other output files. */
612 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
614 /* config.h can define ASM_SPEC to provide extra args to the assembler
615 or extra switch-translations. */
616 #ifndef ASM_SPEC
617 #define ASM_SPEC ""
618 #endif
620 /* config.h can define ASM_FINAL_SPEC to run a post processor after
621 the assembler has run. */
622 #ifndef ASM_FINAL_SPEC
623 #define ASM_FINAL_SPEC ""
624 #endif
626 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
627 or extra switch-translations. */
628 #ifndef CPP_SPEC
629 #define CPP_SPEC ""
630 #endif
632 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
633 or extra switch-translations. */
634 #ifndef CC1_SPEC
635 #define CC1_SPEC ""
636 #endif
638 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
639 or extra switch-translations. */
640 #ifndef CC1PLUS_SPEC
641 #define CC1PLUS_SPEC ""
642 #endif
644 /* config.h can define LINK_SPEC to provide extra args to the linker
645 or extra switch-translations. */
646 #ifndef LINK_SPEC
647 #define LINK_SPEC ""
648 #endif
650 /* config.h can define LIB_SPEC to override the default libraries. */
651 #ifndef LIB_SPEC
652 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
653 #endif
655 /* mudflap specs */
656 #ifndef MFWRAP_SPEC
657 /* XXX: valid only for GNU ld */
658 /* XXX: should exactly match hooks provided by libmudflap.a */
659 #define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
660 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
661 --wrap=mmap --wrap=munmap --wrap=alloca\
662 } %{fmudflapth: --wrap=pthread_create\
663 }} %{fmudflap|fmudflapth: --wrap=main}"
664 #endif
665 #ifndef MFLIB_SPEC
666 #define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
667 #endif
669 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
670 included. */
671 #ifndef LIBGCC_SPEC
672 #if defined(REAL_LIBGCC_SPEC)
673 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
674 #elif defined(LINK_LIBGCC_SPECIAL_1)
675 /* Have gcc do the search for libgcc.a. */
676 #define LIBGCC_SPEC "libgcc.a%s"
677 #else
678 #define LIBGCC_SPEC "-lgcc"
679 #endif
680 #endif
682 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
683 #ifndef STARTFILE_SPEC
684 #define STARTFILE_SPEC \
685 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
686 #endif
688 /* config.h can define SWITCHES_NEED_SPACES to control which options
689 require spaces between the option and the argument.
691 We define SWITCHES_NEED_SPACES to include "o" by default. This
692 causes "-ofoo.o" to be split into "-o foo.o" during the initial
693 processing of the command-line, before being seen by the specs
694 machinery. This makes sure we record "foo.o" as the temporary file
695 to be deleted in the case of error, rather than "-ofoo.o". */
696 #ifndef SWITCHES_NEED_SPACES
697 #define SWITCHES_NEED_SPACES "o"
698 #endif
700 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
701 #ifndef ENDFILE_SPEC
702 #define ENDFILE_SPEC ""
703 #endif
705 #ifndef LINKER_NAME
706 #define LINKER_NAME "collect2"
707 #endif
709 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
710 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
711 #else
712 #define ASM_MAP ""
713 #endif
715 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
716 to the assembler. */
717 #ifndef ASM_DEBUG_SPEC
718 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
719 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
720 # define ASM_DEBUG_SPEC \
721 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
722 ? "%{!g0:%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}}" ASM_MAP \
723 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
724 # else
725 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
726 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
727 # endif
728 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
729 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
730 # endif
731 # endif
732 #endif
733 #ifndef ASM_DEBUG_SPEC
734 # define ASM_DEBUG_SPEC ""
735 #endif
737 /* Here is the spec for running the linker, after compiling all files. */
739 /* This is overridable by the target in case they need to specify the
740 -lgcc and -lc order specially, yet not require them to override all
741 of LINK_COMMAND_SPEC. */
742 #ifndef LINK_GCC_C_SEQUENCE_SPEC
743 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
744 #endif
746 #ifndef LINK_SSP_SPEC
747 #ifdef TARGET_LIBC_PROVIDES_SSP
748 #define LINK_SSP_SPEC "%{fstack-protector:}"
749 #else
750 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
751 #endif
752 #endif
754 #ifndef LINK_PIE_SPEC
755 #ifdef HAVE_LD_PIE
756 #define LINK_PIE_SPEC "%{pie:-pie} "
757 #else
758 #define LINK_PIE_SPEC "%{pie:} "
759 #endif
760 #endif
762 #ifndef LINK_BUILDID_SPEC
763 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
764 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
765 # endif
766 #endif
769 /* -u* was put back because both BSD and SysV seem to support it. */
770 /* %{static:} simply prevents an error message if the target machine
771 doesn't handle -static. */
772 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
773 scripts which exist in user specified directories, or in standard
774 directories. */
775 /* We pass any -flto and -fwhopr flags on to the linker, which is expected
776 to understand them. In practice, this means it had better be collect2. */
777 #ifndef LINK_COMMAND_SPEC
778 #define LINK_COMMAND_SPEC "\
779 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
780 %(linker) \
781 %{fuse-linker-plugin: \
782 -plugin %(linker_plugin_file) \
783 -plugin-opt=%(lto_wrapper) \
784 -plugin-opt=%(lto_gcc) \
785 -plugin-opt=-fresolution=%u.res \
786 %{static|static-libgcc:-plugin-opt=-pass-through=%(lto_libgcc)} \
787 %{static:-plugin-opt=-pass-through=-lc} \
788 %{O*:-plugin-opt=-O%*} \
789 %{w:-plugin-opt=-w} \
790 %{f*:-plugin-opt=-f%*} \
791 %{m*:-plugin-opt=-m%*} \
792 %{v:-plugin-opt=-v} \
794 %{flto} %{fwhopr} %l " LINK_PIE_SPEC \
795 "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
796 %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
797 %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
798 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
799 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov}\
800 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
801 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
802 #endif
804 #ifndef LINK_LIBGCC_SPEC
805 /* Generate -L options for startfile prefix list. */
806 # define LINK_LIBGCC_SPEC "%D"
807 #endif
809 #ifndef STARTFILE_PREFIX_SPEC
810 # define STARTFILE_PREFIX_SPEC ""
811 #endif
813 #ifndef SYSROOT_SPEC
814 # define SYSROOT_SPEC "--sysroot=%R"
815 #endif
817 #ifndef SYSROOT_SUFFIX_SPEC
818 # define SYSROOT_SUFFIX_SPEC ""
819 #endif
821 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
822 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
823 #endif
825 static const char *asm_debug;
826 static const char *cpp_spec = CPP_SPEC;
827 static const char *cc1_spec = CC1_SPEC;
828 static const char *cc1plus_spec = CC1PLUS_SPEC;
829 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
830 static const char *link_ssp_spec = LINK_SSP_SPEC;
831 static const char *asm_spec = ASM_SPEC;
832 static const char *asm_final_spec = ASM_FINAL_SPEC;
833 static const char *link_spec = LINK_SPEC;
834 static const char *lib_spec = LIB_SPEC;
835 static const char *mfwrap_spec = MFWRAP_SPEC;
836 static const char *mflib_spec = MFLIB_SPEC;
837 static const char *link_gomp_spec = "";
838 static const char *libgcc_spec = LIBGCC_SPEC;
839 static const char *endfile_spec = ENDFILE_SPEC;
840 static const char *startfile_spec = STARTFILE_SPEC;
841 static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
842 static const char *linker_name_spec = LINKER_NAME;
843 static const char *linker_plugin_file_spec = "";
844 static const char *lto_wrapper_spec = "";
845 static const char *lto_gcc_spec = "";
846 static const char *lto_libgcc_spec = "";
847 static const char *link_command_spec = LINK_COMMAND_SPEC;
848 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
849 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
850 static const char *sysroot_spec = SYSROOT_SPEC;
851 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
852 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
854 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
855 There should be no need to override these in target dependent files,
856 but we need to copy them to the specs file so that newer versions
857 of the GCC driver can correctly drive older tool chains with the
858 appropriate -B options. */
860 /* When cpplib handles traditional preprocessing, get rid of this, and
861 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
862 that we default the front end language better. */
863 static const char *trad_capable_cpp =
864 "cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
866 /* We don't wrap .d files in %W{} since a missing .d file, and
867 therefore no dependency entry, confuses make into thinking a .o
868 file that happens to exist is up-to-date. */
869 static const char *cpp_unique_options =
870 "%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}}\
871 %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
872 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
873 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
874 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
875 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
876 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
877 %{!iplugindir*:%{fplugin*:-iplugindir=%:find-file(plugin)}}\
878 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
879 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
880 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
881 %{E|M|MM:%W{o*}}";
883 /* This contains cpp options which are common with cc1_options and are passed
884 only when preprocessing only to avoid duplication. We pass the cc1 spec
885 options to the preprocessor so that it the cc1 spec may manipulate
886 options used to set target flags. Those special target flags settings may
887 in turn cause preprocessor symbols to be defined specially. */
888 static const char *cpp_options =
889 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
890 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
891 %{undef} %{save-temps*:-fpch-preprocess}";
893 /* This contains cpp options which are not passed when the preprocessor
894 output will be used by another program. */
895 static const char *cpp_debug_options = "%{d*}";
897 /* NB: This is shared amongst all front-ends, except for Ada. */
898 static const char *cc1_options =
899 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
900 %{!iplugindir*:%{fplugin*:-iplugindir=%:find-file(plugin)}}\
901 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{a*}\
902 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
903 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
904 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
905 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
906 %{Qn:-fno-ident} %{--help:--help}\
907 %{--target-help:--target-help}\
908 %{--help=*:--help=%(VALUE)}\
909 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
910 %{fsyntax-only:-o %j} %{-param*}\
911 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
912 %{coverage:-fprofile-arcs -ftest-coverage}";
914 static const char *asm_options =
915 "%{--target-help:%:print-asm-header()} "
916 #if HAVE_GNU_AS
917 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
918 to the assembler equivalents. */
919 "%{v} %{w:-W} %{I*} "
920 #endif
921 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
923 static const char *invoke_as =
924 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
925 "%{!fwpa:\
926 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
927 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
929 #else
930 "%{!fwpa:\
931 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
932 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
934 #endif
936 /* Some compilers have limits on line lengths, and the multilib_select
937 and/or multilib_matches strings can be very long, so we build them at
938 run time. */
939 static struct obstack multilib_obstack;
940 static const char *multilib_select;
941 static const char *multilib_matches;
942 static const char *multilib_defaults;
943 static const char *multilib_exclusions;
945 /* Check whether a particular argument is a default argument. */
947 #ifndef MULTILIB_DEFAULTS
948 #define MULTILIB_DEFAULTS { "" }
949 #endif
951 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
953 #ifndef DRIVER_SELF_SPECS
954 #define DRIVER_SELF_SPECS ""
955 #endif
957 /* Adding -fopenmp should imply pthreads. This is particularly important
958 for targets that use different start files and suchlike. */
959 #ifndef GOMP_SELF_SPECS
960 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
961 #endif
963 static const char *const driver_self_specs[] = {
964 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
965 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS
968 #ifndef OPTION_DEFAULT_SPECS
969 #define OPTION_DEFAULT_SPECS { "", "" }
970 #endif
972 struct default_spec
974 const char *name;
975 const char *spec;
978 static const struct default_spec
979 option_default_specs[] = { OPTION_DEFAULT_SPECS };
981 struct user_specs
983 struct user_specs *next;
984 const char *filename;
987 static struct user_specs *user_specs_head, *user_specs_tail;
989 #ifndef SWITCH_TAKES_ARG
990 #define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
991 #endif
993 #ifndef WORD_SWITCH_TAKES_ARG
994 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
995 #endif
997 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
998 /* This defines which switches stop a full compilation. */
999 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
1000 ((CHAR) == 'c' || (CHAR) == 'S' || (CHAR) == 'E')
1002 #ifndef SWITCH_CURTAILS_COMPILATION
1003 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
1004 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
1005 #endif
1006 #endif
1008 /* Record the mapping from file suffixes for compilation specs. */
1010 struct compiler
1012 const char *suffix; /* Use this compiler for input files
1013 whose names end in this suffix. */
1015 const char *spec; /* To use this compiler, run this spec. */
1017 const char *cpp_spec; /* If non-NULL, substitute this spec
1018 for `%C', rather than the usual
1019 cpp_spec. */
1020 const int combinable; /* If nonzero, compiler can deal with
1021 multiple source files at once (IMA). */
1022 const int needs_preprocessing; /* If nonzero, source files need to
1023 be run through a preprocessor. */
1026 /* Pointer to a vector of `struct compiler' that gives the spec for
1027 compiling a file, based on its suffix.
1028 A file that does not end in any of these suffixes will be passed
1029 unchanged to the loader and nothing else will be done to it.
1031 An entry containing two 0s is used to terminate the vector.
1033 If multiple entries match a file, the last matching one is used. */
1035 static struct compiler *compilers;
1037 /* Number of entries in `compilers', not counting the null terminator. */
1039 static int n_compilers;
1041 /* The default list of file name suffixes and their compilation specs. */
1043 static const struct compiler default_compilers[] =
1045 /* Add lists of suffixes of known languages here. If those languages
1046 were not present when we built the driver, we will hit these copies
1047 and be given a more meaningful error than "file not used since
1048 linking is not done". */
1049 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1050 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1051 {".mii", "#Objective-C++", 0, 0, 0},
1052 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1053 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1054 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1055 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1056 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1057 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1058 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1059 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1060 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1061 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1062 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1063 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1064 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1065 {".r", "#Ratfor", 0, 0, 0},
1066 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1067 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1068 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
1069 /* Next come the entries for C. */
1070 {".c", "@c", 0, 1, 1},
1071 {"@c",
1072 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1073 external preprocessor if -save-temps is given. */
1074 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1075 %{!E:%{!M:%{!MM:\
1076 %{traditional|ftraditional:\
1077 %eGNU C no longer supports -traditional without -E}\
1078 %{!combine:\
1079 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1080 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1081 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1082 %(cc1_options)}\
1083 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1084 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1085 %{!fsyntax-only:%(invoke_as)}} \
1086 %{combine:\
1087 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1088 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i}}\
1089 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1090 cc1 %(cpp_unique_options) %(cc1_options)}}\
1091 %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
1092 {"-",
1093 "%{!E:%e-E or -x required when input is from standard input}\
1094 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1095 {".h", "@c-header", 0, 0, 0},
1096 {"@c-header",
1097 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1098 external preprocessor if -save-temps is given. */
1099 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1100 %{!E:%{!M:%{!MM:\
1101 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1102 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1103 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1104 %(cc1_options)\
1105 -o %g.s %{!o*:--output-pch=%i.gch}\
1106 %W{o*:--output-pch=%*}%V}\
1107 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1108 cc1 %(cpp_unique_options) %(cc1_options)\
1109 -o %g.s %{!o*:--output-pch=%i.gch}\
1110 %W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},
1111 {".i", "@cpp-output", 0, 1, 0},
1112 {"@cpp-output",
1113 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
1114 {".s", "@assembler", 0, 1, 0},
1115 {"@assembler",
1116 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
1117 {".sx", "@assembler-with-cpp", 0, 1, 0},
1118 {".S", "@assembler-with-cpp", 0, 1, 0},
1119 {"@assembler-with-cpp",
1120 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1121 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1122 %{E|M|MM:%(cpp_debug_options)}\
1123 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1124 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1125 #else
1126 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1127 %{E|M|MM:%(cpp_debug_options)}\
1128 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1129 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1130 #endif
1131 , 0, 1, 0},
1133 #include "specs.h"
1134 /* Mark end of table. */
1135 {0, 0, 0, 0, 0}
1138 /* Number of elements in default_compilers, not counting the terminator. */
1140 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1142 /* A vector of options to give to the linker.
1143 These options are accumulated by %x,
1144 and substituted into the linker command with %X. */
1145 static int n_linker_options;
1146 static char **linker_options;
1148 /* A vector of options to give to the assembler.
1149 These options are accumulated by -Wa,
1150 and substituted into the assembler command with %Y. */
1151 static int n_assembler_options;
1152 static char **assembler_options;
1154 /* A vector of options to give to the preprocessor.
1155 These options are accumulated by -Wp,
1156 and substituted into the preprocessor command with %Z. */
1157 static int n_preprocessor_options;
1158 static char **preprocessor_options;
1160 /* Define how to map long options into short ones. */
1162 /* This structure describes one mapping. */
1163 struct option_map
1165 /* The long option's name. */
1166 const char *const name;
1167 /* The equivalent short option. */
1168 const char *const equivalent;
1169 /* Argument info. A string of flag chars; NULL equals no options.
1170 a => argument required.
1171 o => argument optional.
1172 j => join argument to equivalent, making one word.
1173 * => require other text after NAME as an argument. */
1174 const char *const arg_info;
1177 /* This is the table of mappings. Mappings are tried sequentially
1178 for each option encountered; the first one that matches, wins. */
1180 static const struct option_map option_map[] =
1182 {"--all-warnings", "-Wall", 0},
1183 {"--ansi", "-ansi", 0},
1184 {"--assemble", "-S", 0},
1185 {"--assert", "-A", "a"},
1186 {"--classpath", "-fclasspath=", "aj"},
1187 {"--bootclasspath", "-fbootclasspath=", "aj"},
1188 {"--CLASSPATH", "-fclasspath=", "aj"},
1189 {"--combine", "-combine", 0},
1190 {"--comments", "-C", 0},
1191 {"--comments-in-macros", "-CC", 0},
1192 {"--compile", "-c", 0},
1193 {"--debug", "-g", "oj"},
1194 {"--define-macro", "-D", "aj"},
1195 {"--dependencies", "-M", 0},
1196 {"--dump", "-d", "a"},
1197 {"--dumpbase", "-dumpbase", "a"},
1198 {"--dumpdir", "-dumpdir", "a"},
1199 {"--encoding", "-fencoding=", "aj"},
1200 {"--entry", "-e", 0},
1201 {"--extra-warnings", "-W", 0},
1202 {"--extdirs", "-fextdirs=", "aj"},
1203 {"--for-assembler", "-Wa", "a"},
1204 {"--for-linker", "-Xlinker", "a"},
1205 {"--force-link", "-u", "a"},
1206 {"--coverage", "-coverage", 0},
1207 {"--imacros", "-imacros", "a"},
1208 {"--include", "-include", "a"},
1209 {"--include-barrier", "-I-", 0},
1210 {"--include-directory", "-I", "aj"},
1211 {"--include-directory-after", "-idirafter", "a"},
1212 {"--include-prefix", "-iprefix", "a"},
1213 {"--include-with-prefix", "-iwithprefix", "a"},
1214 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
1215 {"--include-with-prefix-after", "-iwithprefix", "a"},
1216 {"--language", "-x", "a"},
1217 {"--library-directory", "-L", "a"},
1218 {"--machine", "-m", "aj"},
1219 {"--machine-", "-m", "*j"},
1220 {"--no-canonical-prefixes", "-no-canonical-prefixes", 0},
1221 {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1222 {"--no-line-commands", "-P", 0},
1223 {"--no-precompiled-includes", "-noprecomp", 0},
1224 {"--no-standard-includes", "-nostdinc", 0},
1225 {"--no-standard-libraries", "-nostdlib", 0},
1226 {"--no-warnings", "-w", 0},
1227 {"--optimize", "-O", "oj"},
1228 {"--output", "-o", "a"},
1229 {"--output-class-directory", "-foutput-class-dir=", "ja"},
1230 {"--param", "--param", "a"},
1231 {"--pass-exit-codes", "-pass-exit-codes", 0},
1232 {"--pedantic", "-pedantic", 0},
1233 {"--pedantic-errors", "-pedantic-errors", 0},
1234 {"--pie", "-pie", 0},
1235 {"--pipe", "-pipe", 0},
1236 {"--prefix", "-B", "a"},
1237 {"--preprocess", "-E", 0},
1238 {"--print-search-dirs", "-print-search-dirs", 0},
1239 {"--print-file-name", "-print-file-name=", "aj"},
1240 {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
1241 {"--print-missing-file-dependencies", "-MG", 0},
1242 {"--print-multi-lib", "-print-multi-lib", 0},
1243 {"--print-multi-directory", "-print-multi-directory", 0},
1244 {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1245 {"--print-prog-name", "-print-prog-name=", "aj"},
1246 {"--print-sysroot", "-print-sysroot", 0},
1247 {"--print-sysroot-headers-suffix", "-print-sysroot-headers-suffix", 0},
1248 {"--profile", "-p", 0},
1249 {"--profile-blocks", "-a", 0},
1250 {"--quiet", "-q", 0},
1251 {"--resource", "-fcompile-resource=", "aj"},
1252 {"--save-temps", "-save-temps", 0},
1253 {"--shared", "-shared", 0},
1254 {"--silent", "-q", 0},
1255 {"--specs", "-specs=", "aj"},
1256 {"--static", "-static", 0},
1257 {"--std", "-std=", "aj"},
1258 {"--symbolic", "-symbolic", 0},
1259 {"--sysroot", "--sysroot=", "aj"},
1260 {"--time", "-time", 0},
1261 {"--trace-includes", "-H", 0},
1262 {"--traditional", "-traditional", 0},
1263 {"--traditional-cpp", "-traditional-cpp", 0},
1264 {"--trigraphs", "-trigraphs", 0},
1265 {"--undefine-macro", "-U", "aj"},
1266 {"--user-dependencies", "-MM", 0},
1267 {"--verbose", "-v", 0},
1268 {"--warn-", "-W", "*j"},
1269 {"--write-dependencies", "-MD", 0},
1270 {"--write-user-dependencies", "-MMD", 0},
1271 {"--", "-f", "*j"}
1275 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1276 static const struct {
1277 const char *const option_found;
1278 const char *const replacements;
1279 } target_option_translations[] =
1281 TARGET_OPTION_TRANSLATE_TABLE,
1282 { 0, 0 }
1284 #endif
1286 /* Translate the options described by *ARGCP and *ARGVP.
1287 Make a new vector and store it back in *ARGVP,
1288 and store its length in *ARGCP. */
1290 static void
1291 translate_options (int *argcp, const char *const **argvp)
1293 int i;
1294 int argc = *argcp;
1295 const char *const *argv = *argvp;
1296 int newvsize = (argc + 2) * 2 * sizeof (const char *);
1297 const char **newv = XNEWVAR (const char *, newvsize);
1298 int newindex = 0;
1300 i = 0;
1301 newv[newindex++] = argv[i++];
1303 while (i < argc)
1305 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1306 int tott_idx;
1308 for (tott_idx = 0;
1309 target_option_translations[tott_idx].option_found;
1310 tott_idx++)
1312 if (strcmp (target_option_translations[tott_idx].option_found,
1313 argv[i]) == 0)
1315 int spaces = 1;
1316 const char *sp;
1317 char *np;
1319 for (sp = target_option_translations[tott_idx].replacements;
1320 *sp; sp++)
1322 if (*sp == ' ')
1323 spaces ++;
1326 newvsize += spaces * sizeof (const char *);
1327 newv = XRESIZEVAR (const char *, newv, newvsize);
1329 sp = target_option_translations[tott_idx].replacements;
1330 np = xstrdup (sp);
1332 while (1)
1334 while (*np == ' ')
1335 np++;
1336 if (*np == 0)
1337 break;
1338 newv[newindex++] = np;
1339 while (*np != ' ' && *np)
1340 np++;
1341 if (*np == 0)
1342 break;
1343 *np++ = 0;
1346 i ++;
1347 break;
1350 if (target_option_translations[tott_idx].option_found)
1351 continue;
1352 #endif
1354 /* Translate -- options. */
1355 if (argv[i][0] == '-' && argv[i][1] == '-')
1357 size_t j;
1358 /* Find a mapping that applies to this option. */
1359 for (j = 0; j < ARRAY_SIZE (option_map); j++)
1361 size_t optlen = strlen (option_map[j].name);
1362 size_t arglen = strlen (argv[i]);
1363 size_t complen = arglen > optlen ? optlen : arglen;
1364 const char *arginfo = option_map[j].arg_info;
1366 if (arginfo == 0)
1367 arginfo = "";
1369 if (!strncmp (argv[i], option_map[j].name, complen))
1371 const char *arg = 0;
1373 if (arglen < optlen)
1375 size_t k;
1376 for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1377 if (strlen (option_map[k].name) >= arglen
1378 && !strncmp (argv[i], option_map[k].name, arglen))
1380 error ("ambiguous abbreviation %s", argv[i]);
1381 break;
1384 if (k != ARRAY_SIZE (option_map))
1385 break;
1388 if (arglen > optlen)
1390 /* If the option has an argument, accept that. */
1391 if (argv[i][optlen] == '=')
1392 arg = argv[i] + optlen + 1;
1394 /* If this mapping requires extra text at end of name,
1395 accept that as "argument". */
1396 else if (strchr (arginfo, '*') != 0)
1397 arg = argv[i] + optlen;
1399 /* Otherwise, extra text at end means mismatch.
1400 Try other mappings. */
1401 else
1402 continue;
1405 else if (strchr (arginfo, '*') != 0)
1407 error ("incomplete '%s' option", option_map[j].name);
1408 break;
1411 /* Handle arguments. */
1412 if (strchr (arginfo, 'a') != 0)
1414 if (arg == 0)
1416 if (i + 1 == argc)
1418 error ("missing argument to '%s' option",
1419 option_map[j].name);
1420 break;
1423 arg = argv[++i];
1426 else if (strchr (arginfo, '*') != 0)
1428 else if (strchr (arginfo, 'o') == 0)
1430 if (arg != 0)
1431 error ("extraneous argument to '%s' option",
1432 option_map[j].name);
1433 arg = 0;
1436 /* Store the translation as one argv elt or as two. */
1437 if (arg != 0 && strchr (arginfo, 'j') != 0)
1438 newv[newindex++] = concat (option_map[j].equivalent, arg,
1439 NULL);
1440 else if (arg != 0)
1442 newv[newindex++] = option_map[j].equivalent;
1443 newv[newindex++] = arg;
1445 else
1446 newv[newindex++] = option_map[j].equivalent;
1448 break;
1451 i++;
1454 /* Handle old-fashioned options--just copy them through,
1455 with their arguments. */
1456 else if (argv[i][0] == '-')
1458 const char *p = argv[i] + 1;
1459 int c = *p;
1460 int nskip = 1;
1462 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1463 nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1464 else if (WORD_SWITCH_TAKES_ARG (p))
1465 nskip += WORD_SWITCH_TAKES_ARG (p);
1466 else if ((c == 'B' || c == 'b' || c == 'x')
1467 && p[1] == 0)
1468 nskip += 1;
1469 else if (! strcmp (p, "Xlinker"))
1470 nskip += 1;
1471 else if (! strcmp (p, "Xpreprocessor"))
1472 nskip += 1;
1473 else if (! strcmp (p, "Xassembler"))
1474 nskip += 1;
1476 /* Watch out for an option at the end of the command line that
1477 is missing arguments, and avoid skipping past the end of the
1478 command line. */
1479 if (nskip + i > argc)
1480 nskip = argc - i;
1482 while (nskip > 0)
1484 newv[newindex++] = argv[i++];
1485 nskip--;
1488 else
1489 /* Ordinary operands, or +e options. */
1490 newv[newindex++] = argv[i++];
1493 newv[newindex] = 0;
1495 *argvp = newv;
1496 *argcp = newindex;
1499 static char *
1500 skip_whitespace (char *p)
1502 while (1)
1504 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1505 be considered whitespace. */
1506 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1507 return p + 1;
1508 else if (*p == '\n' || *p == ' ' || *p == '\t')
1509 p++;
1510 else if (*p == '#')
1512 while (*p != '\n')
1513 p++;
1514 p++;
1516 else
1517 break;
1520 return p;
1522 /* Structures to keep track of prefixes to try when looking for files. */
1524 struct prefix_list
1526 const char *prefix; /* String to prepend to the path. */
1527 struct prefix_list *next; /* Next in linked list. */
1528 int require_machine_suffix; /* Don't use without machine_suffix. */
1529 /* 2 means try both machine_suffix and just_machine_suffix. */
1530 int priority; /* Sort key - priority within list. */
1531 int os_multilib; /* 1 if OS multilib scheme should be used,
1532 0 for GCC multilib scheme. */
1535 struct path_prefix
1537 struct prefix_list *plist; /* List of prefixes to try */
1538 int max_len; /* Max length of a prefix in PLIST */
1539 const char *name; /* Name of this list (used in config stuff) */
1542 /* List of prefixes to try when looking for executables. */
1544 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1546 /* List of prefixes to try when looking for startup (crt0) files. */
1548 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1550 /* List of prefixes to try when looking for include files. */
1552 static struct path_prefix include_prefixes = { 0, 0, "include" };
1554 /* Suffix to attach to directories searched for commands.
1555 This looks like `MACHINE/VERSION/'. */
1557 static const char *machine_suffix = 0;
1559 /* Suffix to attach to directories searched for commands.
1560 This is just `MACHINE/'. */
1562 static const char *just_machine_suffix = 0;
1564 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1566 static const char *gcc_exec_prefix;
1568 /* Adjusted value of standard_libexec_prefix. */
1570 static const char *gcc_libexec_prefix;
1572 /* Default prefixes to attach to command names. */
1574 #ifndef STANDARD_STARTFILE_PREFIX_1
1575 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1576 #endif
1577 #ifndef STANDARD_STARTFILE_PREFIX_2
1578 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1579 #endif
1581 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1582 #undef MD_EXEC_PREFIX
1583 #undef MD_STARTFILE_PREFIX
1584 #undef MD_STARTFILE_PREFIX_1
1585 #endif
1587 /* If no prefixes defined, use the null string, which will disable them. */
1588 #ifndef MD_EXEC_PREFIX
1589 #define MD_EXEC_PREFIX ""
1590 #endif
1591 #ifndef MD_STARTFILE_PREFIX
1592 #define MD_STARTFILE_PREFIX ""
1593 #endif
1594 #ifndef MD_STARTFILE_PREFIX_1
1595 #define MD_STARTFILE_PREFIX_1 ""
1596 #endif
1598 /* These directories are locations set at configure-time based on the
1599 --prefix option provided to configure. Their initializers are
1600 defined in Makefile.in. These paths are not *directly* used when
1601 gcc_exec_prefix is set because, in that case, we know where the
1602 compiler has been installed, and use paths relative to that
1603 location instead. */
1604 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1605 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1606 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1607 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1609 /* For native compilers, these are well-known paths containing
1610 components that may be provided by the system. For cross
1611 compilers, these paths are not used. */
1612 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1613 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1614 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1615 static const char *const standard_startfile_prefix_1
1616 = STANDARD_STARTFILE_PREFIX_1;
1617 static const char *const standard_startfile_prefix_2
1618 = STANDARD_STARTFILE_PREFIX_2;
1620 /* A relative path to be used in finding the location of tools
1621 relative to the driver. */
1622 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1624 /* Subdirectory to use for locating libraries. Set by
1625 set_multilib_dir based on the compilation options. */
1627 static const char *multilib_dir;
1629 /* Subdirectory to use for locating libraries in OS conventions. Set by
1630 set_multilib_dir based on the compilation options. */
1632 static const char *multilib_os_dir;
1634 /* Structure to keep track of the specs that have been defined so far.
1635 These are accessed using %(specname) or %[specname] in a compiler
1636 or link spec. */
1638 struct spec_list
1640 /* The following 2 fields must be first */
1641 /* to allow EXTRA_SPECS to be initialized */
1642 const char *name; /* name of the spec. */
1643 const char *ptr; /* available ptr if no static pointer */
1645 /* The following fields are not initialized */
1646 /* by EXTRA_SPECS */
1647 const char **ptr_spec; /* pointer to the spec itself. */
1648 struct spec_list *next; /* Next spec in linked list. */
1649 int name_len; /* length of the name */
1650 int alloc_p; /* whether string was allocated */
1653 #define INIT_STATIC_SPEC(NAME,PTR) \
1654 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1656 /* List of statically defined specs. */
1657 static struct spec_list static_specs[] =
1659 INIT_STATIC_SPEC ("asm", &asm_spec),
1660 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1661 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1662 INIT_STATIC_SPEC ("asm_options", &asm_options),
1663 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1664 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1665 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1666 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1667 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1668 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1669 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1670 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1671 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1672 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1673 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1674 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1675 INIT_STATIC_SPEC ("link", &link_spec),
1676 INIT_STATIC_SPEC ("lib", &lib_spec),
1677 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1678 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1679 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1680 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1681 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1682 INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
1683 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1684 INIT_STATIC_SPEC ("version", &compiler_version),
1685 INIT_STATIC_SPEC ("multilib", &multilib_select),
1686 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1687 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1688 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1689 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1690 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1691 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1692 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1693 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1694 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1695 INIT_STATIC_SPEC ("lto_libgcc", &lto_libgcc_spec),
1696 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1697 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1698 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1699 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1700 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1701 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1702 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1703 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1706 #ifdef EXTRA_SPECS /* additional specs needed */
1707 /* Structure to keep track of just the first two args of a spec_list.
1708 That is all that the EXTRA_SPECS macro gives us. */
1709 struct spec_list_1
1711 const char *const name;
1712 const char *const ptr;
1715 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1716 static struct spec_list *extra_specs = (struct spec_list *) 0;
1717 #endif
1719 /* List of dynamically allocates specs that have been defined so far. */
1721 static struct spec_list *specs = (struct spec_list *) 0;
1723 /* List of static spec functions. */
1725 static const struct spec_function static_spec_functions[] =
1727 { "getenv", getenv_spec_function },
1728 { "if-exists", if_exists_spec_function },
1729 { "if-exists-else", if_exists_else_spec_function },
1730 { "replace-outfile", replace_outfile_spec_function },
1731 { "version-compare", version_compare_spec_function },
1732 { "include", include_spec_function },
1733 { "find-file", find_file_spec_function },
1734 { "print-asm-header", print_asm_header_spec_function },
1735 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1736 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1737 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1738 #ifdef EXTRA_SPEC_FUNCTIONS
1739 EXTRA_SPEC_FUNCTIONS
1740 #endif
1741 { 0, 0 }
1744 static int processing_spec_function;
1746 /* Add appropriate libgcc specs to OBSTACK, taking into account
1747 various permutations of -shared-libgcc, -shared, and such. */
1749 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1751 #ifndef USE_LD_AS_NEEDED
1752 #define USE_LD_AS_NEEDED 0
1753 #endif
1755 static void
1756 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1757 const char *static_name, const char *eh_name)
1759 char *buf;
1761 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1762 "%{!static:%{!static-libgcc:"
1763 #if USE_LD_AS_NEEDED
1764 "%{!shared-libgcc:",
1765 static_name, " --as-needed ", shared_name, " --no-as-needed"
1767 "%{shared-libgcc:",
1768 shared_name, "%{!shared: ", static_name, "}"
1770 #else
1771 "%{!shared:"
1772 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1773 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1775 #ifdef LINK_EH_SPEC
1776 "%{shared:"
1777 "%{shared-libgcc:", shared_name, "}"
1778 "%{!shared-libgcc:", static_name, "}"
1780 #else
1781 "%{shared:", shared_name, "}"
1782 #endif
1783 #endif
1784 "}}", NULL);
1786 obstack_grow (obstack, buf, strlen (buf));
1787 free (buf);
1789 #endif /* ENABLE_SHARED_LIBGCC */
1791 /* Initialize the specs lookup routines. */
1793 static void
1794 init_spec (void)
1796 struct spec_list *next = (struct spec_list *) 0;
1797 struct spec_list *sl = (struct spec_list *) 0;
1798 int i;
1800 if (specs)
1801 return; /* Already initialized. */
1803 if (verbose_flag)
1804 notice ("Using built-in specs.\n");
1806 #ifdef EXTRA_SPECS
1807 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1809 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1811 sl = &extra_specs[i];
1812 sl->name = extra_specs_1[i].name;
1813 sl->ptr = extra_specs_1[i].ptr;
1814 sl->next = next;
1815 sl->name_len = strlen (sl->name);
1816 sl->ptr_spec = &sl->ptr;
1817 next = sl;
1819 #endif
1821 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1823 sl = &static_specs[i];
1824 sl->next = next;
1825 next = sl;
1828 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1829 /* ??? If neither -shared-libgcc nor --static-libgcc was
1830 seen, then we should be making an educated guess. Some proposed
1831 heuristics for ELF include:
1833 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1834 program will be doing dynamic loading, which will likely
1835 need the shared libgcc.
1837 (2) If "-ldl", then it's also a fair bet that we're doing
1838 dynamic loading.
1840 (3) For each ET_DYN we're linking against (either through -lfoo
1841 or /some/path/foo.so), check to see whether it or one of
1842 its dependencies depends on a shared libgcc.
1844 (4) If "-shared"
1846 If the runtime is fixed to look for program headers instead
1847 of calling __register_frame_info at all, for each object,
1848 use the shared libgcc if any EH symbol referenced.
1850 If crtstuff is fixed to not invoke __register_frame_info
1851 automatically, for each object, use the shared libgcc if
1852 any non-empty unwind section found.
1854 Doing any of this probably requires invoking an external program to
1855 do the actual object file scanning. */
1857 const char *p = libgcc_spec;
1858 int in_sep = 1;
1860 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1861 when given the proper command line arguments. */
1862 while (*p)
1864 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1866 init_gcc_specs (&obstack,
1867 "-lgcc_s"
1868 #ifdef USE_LIBUNWIND_EXCEPTIONS
1869 " -lunwind"
1870 #endif
1872 "-lgcc",
1873 "-lgcc_eh"
1874 #ifdef USE_LIBUNWIND_EXCEPTIONS
1875 # ifdef HAVE_LD_STATIC_DYNAMIC
1876 " %{!static:-Bstatic} -lunwind %{!static:-Bdynamic}"
1877 # else
1878 " -lunwind"
1879 # endif
1880 #endif
1883 p += 5;
1884 in_sep = 0;
1886 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1888 /* Ug. We don't know shared library extensions. Hope that
1889 systems that use this form don't do shared libraries. */
1890 init_gcc_specs (&obstack,
1891 "-lgcc_s",
1892 "libgcc.a%s",
1893 "libgcc_eh.a%s"
1894 #ifdef USE_LIBUNWIND_EXCEPTIONS
1895 " -lunwind"
1896 #endif
1898 p += 10;
1899 in_sep = 0;
1901 else
1903 obstack_1grow (&obstack, *p);
1904 in_sep = (*p == ' ');
1905 p += 1;
1909 obstack_1grow (&obstack, '\0');
1910 libgcc_spec = XOBFINISH (&obstack, const char *);
1912 #endif
1913 #ifdef USE_AS_TRADITIONAL_FORMAT
1914 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1916 static const char tf[] = "--traditional-format ";
1917 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1918 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1919 asm_spec = XOBFINISH (&obstack, const char *);
1921 #endif
1923 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC
1924 # ifdef LINK_BUILDID_SPEC
1925 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1926 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
1927 # endif
1928 # ifdef LINK_EH_SPEC
1929 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1930 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1931 # endif
1932 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1933 link_spec = XOBFINISH (&obstack, const char *);
1934 #endif
1936 specs = sl;
1939 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1940 removed; If the spec starts with a + then SPEC is added to the end of the
1941 current spec. */
1943 static void
1944 set_spec (const char *name, const char *spec)
1946 struct spec_list *sl;
1947 const char *old_spec;
1948 int name_len = strlen (name);
1949 int i;
1951 /* If this is the first call, initialize the statically allocated specs. */
1952 if (!specs)
1954 struct spec_list *next = (struct spec_list *) 0;
1955 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1957 sl = &static_specs[i];
1958 sl->next = next;
1959 next = sl;
1961 specs = sl;
1964 /* See if the spec already exists. */
1965 for (sl = specs; sl; sl = sl->next)
1966 if (name_len == sl->name_len && !strcmp (sl->name, name))
1967 break;
1969 if (!sl)
1971 /* Not found - make it. */
1972 sl = XNEW (struct spec_list);
1973 sl->name = xstrdup (name);
1974 sl->name_len = name_len;
1975 sl->ptr_spec = &sl->ptr;
1976 sl->alloc_p = 0;
1977 *(sl->ptr_spec) = "";
1978 sl->next = specs;
1979 specs = sl;
1982 old_spec = *(sl->ptr_spec);
1983 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1984 ? concat (old_spec, spec + 1, NULL)
1985 : xstrdup (spec));
1987 #ifdef DEBUG_SPECS
1988 if (verbose_flag)
1989 notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1990 #endif
1992 /* Free the old spec. */
1993 if (old_spec && sl->alloc_p)
1994 free (CONST_CAST(char *, old_spec));
1996 sl->alloc_p = 1;
1999 /* Accumulate a command (program name and args), and run it. */
2001 /* Vector of pointers to arguments in the current line of specifications. */
2003 static const char **argbuf;
2005 /* Number of elements allocated in argbuf. */
2007 static int argbuf_length;
2009 /* Number of elements in argbuf currently in use (containing args). */
2011 static int argbuf_index;
2013 /* Position in the argbuf array containing the name of the output file
2014 (the value associated with the "-o" flag). */
2016 static int have_o_argbuf_index = 0;
2018 /* Were the options -c, -S or -E passed. */
2019 static int have_c = 0;
2021 /* Was the option -o passed. */
2022 static int have_o = 0;
2024 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
2025 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
2026 it here. */
2028 static struct temp_name {
2029 const char *suffix; /* suffix associated with the code. */
2030 int length; /* strlen (suffix). */
2031 int unique; /* Indicates whether %g or %u/%U was used. */
2032 const char *filename; /* associated filename. */
2033 int filename_length; /* strlen (filename). */
2034 struct temp_name *next;
2035 } *temp_names;
2037 /* Number of commands executed so far. */
2039 static int execution_count;
2041 /* Number of commands that exited with a signal. */
2043 static int signal_count;
2045 /* Name with which this program was invoked. */
2047 static const char *programname;
2049 /* Allocate the argument vector. */
2051 static void
2052 alloc_args (void)
2054 argbuf_length = 10;
2055 argbuf = XNEWVEC (const char *, argbuf_length);
2058 /* Clear out the vector of arguments (after a command is executed). */
2060 static void
2061 clear_args (void)
2063 argbuf_index = 0;
2066 /* Add one argument to the vector at the end.
2067 This is done when a space is seen or at the end of the line.
2068 If DELETE_ALWAYS is nonzero, the arg is a filename
2069 and the file should be deleted eventually.
2070 If DELETE_FAILURE is nonzero, the arg is a filename
2071 and the file should be deleted if this compilation fails. */
2073 static void
2074 store_arg (const char *arg, int delete_always, int delete_failure)
2076 if (argbuf_index + 1 == argbuf_length)
2077 argbuf = XRESIZEVEC (const char *, argbuf, (argbuf_length *= 2));
2079 argbuf[argbuf_index++] = arg;
2080 argbuf[argbuf_index] = 0;
2082 if (strcmp (arg, "-o") == 0)
2083 have_o_argbuf_index = argbuf_index;
2084 if (delete_always || delete_failure)
2086 const char *p;
2087 /* If the temporary file we should delete is specified as
2088 part of a joined argument extract the filename. */
2089 if (arg[0] == '-'
2090 && (p = strrchr (arg, '=')))
2091 arg = p + 1;
2092 record_temp_file (arg, delete_always, delete_failure);
2096 /* Load specs from a file name named FILENAME, replacing occurrences of
2097 various different types of line-endings, \r\n, \n\r and just \r, with
2098 a single \n. */
2100 static char *
2101 load_specs (const char *filename)
2103 int desc;
2104 int readlen;
2105 struct stat statbuf;
2106 char *buffer;
2107 char *buffer_p;
2108 char *specs;
2109 char *specs_p;
2111 if (verbose_flag)
2112 notice ("Reading specs from %s\n", filename);
2114 /* Open and stat the file. */
2115 desc = open (filename, O_RDONLY, 0);
2116 if (desc < 0)
2117 pfatal_with_name (filename);
2118 if (stat (filename, &statbuf) < 0)
2119 pfatal_with_name (filename);
2121 /* Read contents of file into BUFFER. */
2122 buffer = XNEWVEC (char, statbuf.st_size + 1);
2123 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2124 if (readlen < 0)
2125 pfatal_with_name (filename);
2126 buffer[readlen] = 0;
2127 close (desc);
2129 specs = XNEWVEC (char, readlen + 1);
2130 specs_p = specs;
2131 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2133 int skip = 0;
2134 char c = *buffer_p;
2135 if (c == '\r')
2137 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2138 skip = 1;
2139 else if (*(buffer_p + 1) == '\n') /* \r\n */
2140 skip = 1;
2141 else /* \r */
2142 c = '\n';
2144 if (! skip)
2145 *specs_p++ = c;
2147 *specs_p = '\0';
2149 free (buffer);
2150 return (specs);
2153 /* Read compilation specs from a file named FILENAME,
2154 replacing the default ones.
2156 A suffix which starts with `*' is a definition for
2157 one of the machine-specific sub-specs. The "suffix" should be
2158 *asm, *cc1, *cpp, *link, *startfile, etc.
2159 The corresponding spec is stored in asm_spec, etc.,
2160 rather than in the `compilers' vector.
2162 Anything invalid in the file is a fatal error. */
2164 static void
2165 read_specs (const char *filename, int main_p)
2167 char *buffer;
2168 char *p;
2170 buffer = load_specs (filename);
2172 /* Scan BUFFER for specs, putting them in the vector. */
2173 p = buffer;
2174 while (1)
2176 char *suffix;
2177 char *spec;
2178 char *in, *out, *p1, *p2, *p3;
2180 /* Advance P in BUFFER to the next nonblank nocomment line. */
2181 p = skip_whitespace (p);
2182 if (*p == 0)
2183 break;
2185 /* Is this a special command that starts with '%'? */
2186 /* Don't allow this for the main specs file, since it would
2187 encourage people to overwrite it. */
2188 if (*p == '%' && !main_p)
2190 p1 = p;
2191 while (*p && *p != '\n')
2192 p++;
2194 /* Skip '\n'. */
2195 p++;
2197 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2198 && (p1[sizeof "%include" - 1] == ' '
2199 || p1[sizeof "%include" - 1] == '\t'))
2201 char *new_filename;
2203 p1 += sizeof ("%include");
2204 while (*p1 == ' ' || *p1 == '\t')
2205 p1++;
2207 if (*p1++ != '<' || p[-2] != '>')
2208 fatal ("specs %%include syntax malformed after %ld characters",
2209 (long) (p1 - buffer + 1));
2211 p[-2] = '\0';
2212 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2213 read_specs (new_filename ? new_filename : p1, FALSE);
2214 continue;
2216 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2217 && (p1[sizeof "%include_noerr" - 1] == ' '
2218 || p1[sizeof "%include_noerr" - 1] == '\t'))
2220 char *new_filename;
2222 p1 += sizeof "%include_noerr";
2223 while (*p1 == ' ' || *p1 == '\t')
2224 p1++;
2226 if (*p1++ != '<' || p[-2] != '>')
2227 fatal ("specs %%include syntax malformed after %ld characters",
2228 (long) (p1 - buffer + 1));
2230 p[-2] = '\0';
2231 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2232 if (new_filename)
2233 read_specs (new_filename, FALSE);
2234 else if (verbose_flag)
2235 notice ("could not find specs file %s\n", p1);
2236 continue;
2238 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2239 && (p1[sizeof "%rename" - 1] == ' '
2240 || p1[sizeof "%rename" - 1] == '\t'))
2242 int name_len;
2243 struct spec_list *sl;
2244 struct spec_list *newsl;
2246 /* Get original name. */
2247 p1 += sizeof "%rename";
2248 while (*p1 == ' ' || *p1 == '\t')
2249 p1++;
2251 if (! ISALPHA ((unsigned char) *p1))
2252 fatal ("specs %%rename syntax malformed after %ld characters",
2253 (long) (p1 - buffer));
2255 p2 = p1;
2256 while (*p2 && !ISSPACE ((unsigned char) *p2))
2257 p2++;
2259 if (*p2 != ' ' && *p2 != '\t')
2260 fatal ("specs %%rename syntax malformed after %ld characters",
2261 (long) (p2 - buffer));
2263 name_len = p2 - p1;
2264 *p2++ = '\0';
2265 while (*p2 == ' ' || *p2 == '\t')
2266 p2++;
2268 if (! ISALPHA ((unsigned char) *p2))
2269 fatal ("specs %%rename syntax malformed after %ld characters",
2270 (long) (p2 - buffer));
2272 /* Get new spec name. */
2273 p3 = p2;
2274 while (*p3 && !ISSPACE ((unsigned char) *p3))
2275 p3++;
2277 if (p3 != p - 1)
2278 fatal ("specs %%rename syntax malformed after %ld characters",
2279 (long) (p3 - buffer));
2280 *p3 = '\0';
2282 for (sl = specs; sl; sl = sl->next)
2283 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2284 break;
2286 if (!sl)
2287 fatal ("specs %s spec was not found to be renamed", p1);
2289 if (strcmp (p1, p2) == 0)
2290 continue;
2292 for (newsl = specs; newsl; newsl = newsl->next)
2293 if (strcmp (newsl->name, p2) == 0)
2294 fatal ("%s: attempt to rename spec '%s' to already defined spec '%s'",
2295 filename, p1, p2);
2297 if (verbose_flag)
2299 notice ("rename spec %s to %s\n", p1, p2);
2300 #ifdef DEBUG_SPECS
2301 notice ("spec is '%s'\n\n", *(sl->ptr_spec));
2302 #endif
2305 set_spec (p2, *(sl->ptr_spec));
2306 if (sl->alloc_p)
2307 free (CONST_CAST (char *, *(sl->ptr_spec)));
2309 *(sl->ptr_spec) = "";
2310 sl->alloc_p = 0;
2311 continue;
2313 else
2314 fatal ("specs unknown %% command after %ld characters",
2315 (long) (p1 - buffer));
2318 /* Find the colon that should end the suffix. */
2319 p1 = p;
2320 while (*p1 && *p1 != ':' && *p1 != '\n')
2321 p1++;
2323 /* The colon shouldn't be missing. */
2324 if (*p1 != ':')
2325 fatal ("specs file malformed after %ld characters",
2326 (long) (p1 - buffer));
2328 /* Skip back over trailing whitespace. */
2329 p2 = p1;
2330 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2331 p2--;
2333 /* Copy the suffix to a string. */
2334 suffix = save_string (p, p2 - p);
2335 /* Find the next line. */
2336 p = skip_whitespace (p1 + 1);
2337 if (p[1] == 0)
2338 fatal ("specs file malformed after %ld characters",
2339 (long) (p - buffer));
2341 p1 = p;
2342 /* Find next blank line or end of string. */
2343 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2344 p1++;
2346 /* Specs end at the blank line and do not include the newline. */
2347 spec = save_string (p, p1 - p);
2348 p = p1;
2350 /* Delete backslash-newline sequences from the spec. */
2351 in = spec;
2352 out = spec;
2353 while (*in != 0)
2355 if (in[0] == '\\' && in[1] == '\n')
2356 in += 2;
2357 else if (in[0] == '#')
2358 while (*in && *in != '\n')
2359 in++;
2361 else
2362 *out++ = *in++;
2364 *out = 0;
2366 if (suffix[0] == '*')
2368 if (! strcmp (suffix, "*link_command"))
2369 link_command_spec = spec;
2370 else
2371 set_spec (suffix + 1, spec);
2373 else
2375 /* Add this pair to the vector. */
2376 compilers
2377 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2379 compilers[n_compilers].suffix = suffix;
2380 compilers[n_compilers].spec = spec;
2381 n_compilers++;
2382 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2385 if (*suffix == 0)
2386 link_command_spec = spec;
2389 if (link_command_spec == 0)
2390 fatal ("spec file has no spec for linking");
2393 /* Record the names of temporary files we tell compilers to write,
2394 and delete them at the end of the run. */
2396 /* This is the common prefix we use to make temp file names.
2397 It is chosen once for each run of this program.
2398 It is substituted into a spec by %g or %j.
2399 Thus, all temp file names contain this prefix.
2400 In practice, all temp file names start with this prefix.
2402 This prefix comes from the envvar TMPDIR if it is defined;
2403 otherwise, from the P_tmpdir macro if that is defined;
2404 otherwise, in /usr/tmp or /tmp;
2405 or finally the current directory if all else fails. */
2407 static const char *temp_filename;
2409 /* Length of the prefix. */
2411 static int temp_filename_length;
2413 /* Define the list of temporary files to delete. */
2415 struct temp_file
2417 const char *name;
2418 struct temp_file *next;
2421 /* Queue of files to delete on success or failure of compilation. */
2422 static struct temp_file *always_delete_queue;
2423 /* Queue of files to delete on failure of compilation. */
2424 static struct temp_file *failure_delete_queue;
2426 /* Record FILENAME as a file to be deleted automatically.
2427 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2428 otherwise delete it in any case.
2429 FAIL_DELETE nonzero means delete it if a compilation step fails;
2430 otherwise delete it in any case. */
2432 void
2433 record_temp_file (const char *filename, int always_delete, int fail_delete)
2435 char *const name = xstrdup (filename);
2437 if (always_delete)
2439 struct temp_file *temp;
2440 for (temp = always_delete_queue; temp; temp = temp->next)
2441 if (! strcmp (name, temp->name))
2442 goto already1;
2444 temp = XNEW (struct temp_file);
2445 temp->next = always_delete_queue;
2446 temp->name = name;
2447 always_delete_queue = temp;
2449 already1:;
2452 if (fail_delete)
2454 struct temp_file *temp;
2455 for (temp = failure_delete_queue; temp; temp = temp->next)
2456 if (! strcmp (name, temp->name))
2457 goto already2;
2459 temp = XNEW (struct temp_file);
2460 temp->next = failure_delete_queue;
2461 temp->name = name;
2462 failure_delete_queue = temp;
2464 already2:;
2468 /* Delete all the temporary files whose names we previously recorded. */
2470 #ifndef DELETE_IF_ORDINARY
2471 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2472 do \
2474 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2475 if (unlink (NAME) < 0) \
2476 if (VERBOSE_FLAG) \
2477 perror_with_name (NAME); \
2478 } while (0)
2479 #endif
2481 static void
2482 delete_if_ordinary (const char *name)
2484 struct stat st;
2485 #ifdef DEBUG
2486 int i, c;
2488 printf ("Delete %s? (y or n) ", name);
2489 fflush (stdout);
2490 i = getchar ();
2491 if (i != '\n')
2492 while ((c = getchar ()) != '\n' && c != EOF)
2495 if (i == 'y' || i == 'Y')
2496 #endif /* DEBUG */
2497 DELETE_IF_ORDINARY (name, st, verbose_flag);
2500 static void
2501 delete_temp_files (void)
2503 struct temp_file *temp;
2505 for (temp = always_delete_queue; temp; temp = temp->next)
2506 delete_if_ordinary (temp->name);
2507 always_delete_queue = 0;
2510 /* Delete all the files to be deleted on error. */
2512 static void
2513 delete_failure_queue (void)
2515 struct temp_file *temp;
2517 for (temp = failure_delete_queue; temp; temp = temp->next)
2518 delete_if_ordinary (temp->name);
2521 static void
2522 clear_failure_queue (void)
2524 failure_delete_queue = 0;
2527 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2528 returns non-NULL.
2529 If DO_MULTI is true iterate over the paths twice, first with multilib
2530 suffix then without, otherwise iterate over the paths once without
2531 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2532 to avoid visiting the same path twice, but we could do better. For
2533 instance, /usr/lib/../lib is considered different from /usr/lib.
2534 At least EXTRA_SPACE chars past the end of the path passed to
2535 CALLBACK are available for use by the callback.
2536 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2538 Returns the value returned by CALLBACK. */
2540 static void *
2541 for_each_path (const struct path_prefix *paths,
2542 bool do_multi,
2543 size_t extra_space,
2544 void *(*callback) (char *, void *),
2545 void *callback_info)
2547 struct prefix_list *pl;
2548 const char *multi_dir = NULL;
2549 const char *multi_os_dir = NULL;
2550 const char *multi_suffix;
2551 const char *just_multi_suffix;
2552 char *path = NULL;
2553 void *ret = NULL;
2554 bool skip_multi_dir = false;
2555 bool skip_multi_os_dir = false;
2557 multi_suffix = machine_suffix;
2558 just_multi_suffix = just_machine_suffix;
2559 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2561 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2562 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2563 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2565 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2566 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2568 while (1)
2570 size_t multi_dir_len = 0;
2571 size_t multi_os_dir_len = 0;
2572 size_t suffix_len;
2573 size_t just_suffix_len;
2574 size_t len;
2576 if (multi_dir)
2577 multi_dir_len = strlen (multi_dir);
2578 if (multi_os_dir)
2579 multi_os_dir_len = strlen (multi_os_dir);
2580 suffix_len = strlen (multi_suffix);
2581 just_suffix_len = strlen (just_multi_suffix);
2583 if (path == NULL)
2585 len = paths->max_len + extra_space + 1;
2586 if (suffix_len > multi_os_dir_len)
2587 len += suffix_len;
2588 else
2589 len += multi_os_dir_len;
2590 path = XNEWVEC (char, len);
2593 for (pl = paths->plist; pl != 0; pl = pl->next)
2595 len = strlen (pl->prefix);
2596 memcpy (path, pl->prefix, len);
2598 /* Look first in MACHINE/VERSION subdirectory. */
2599 if (!skip_multi_dir)
2601 memcpy (path + len, multi_suffix, suffix_len + 1);
2602 ret = callback (path, callback_info);
2603 if (ret)
2604 break;
2607 /* Some paths are tried with just the machine (ie. target)
2608 subdir. This is used for finding as, ld, etc. */
2609 if (!skip_multi_dir
2610 && pl->require_machine_suffix == 2)
2612 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2613 ret = callback (path, callback_info);
2614 if (ret)
2615 break;
2618 /* Now try the base path. */
2619 if (!pl->require_machine_suffix
2620 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2622 const char *this_multi;
2623 size_t this_multi_len;
2625 if (pl->os_multilib)
2627 this_multi = multi_os_dir;
2628 this_multi_len = multi_os_dir_len;
2630 else
2632 this_multi = multi_dir;
2633 this_multi_len = multi_dir_len;
2636 if (this_multi_len)
2637 memcpy (path + len, this_multi, this_multi_len + 1);
2638 else
2639 path[len] = '\0';
2641 ret = callback (path, callback_info);
2642 if (ret)
2643 break;
2646 if (pl)
2647 break;
2649 if (multi_dir == NULL && multi_os_dir == NULL)
2650 break;
2652 /* Run through the paths again, this time without multilibs.
2653 Don't repeat any we have already seen. */
2654 if (multi_dir)
2656 free (CONST_CAST (char *, multi_dir));
2657 multi_dir = NULL;
2658 free (CONST_CAST (char *, multi_suffix));
2659 multi_suffix = machine_suffix;
2660 free (CONST_CAST (char *, just_multi_suffix));
2661 just_multi_suffix = just_machine_suffix;
2663 else
2664 skip_multi_dir = true;
2665 if (multi_os_dir)
2667 free (CONST_CAST (char *, multi_os_dir));
2668 multi_os_dir = NULL;
2670 else
2671 skip_multi_os_dir = true;
2674 if (multi_dir)
2676 free (CONST_CAST (char *, multi_dir));
2677 free (CONST_CAST (char *, multi_suffix));
2678 free (CONST_CAST (char *, just_multi_suffix));
2680 if (multi_os_dir)
2681 free (CONST_CAST (char *, multi_os_dir));
2682 if (ret != path)
2683 free (path);
2684 return ret;
2687 /* Callback for build_search_list. Adds path to obstack being built. */
2689 struct add_to_obstack_info {
2690 struct obstack *ob;
2691 bool check_dir;
2692 bool first_time;
2695 static void *
2696 add_to_obstack (char *path, void *data)
2698 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2700 if (info->check_dir && !is_directory (path, false))
2701 return NULL;
2703 if (!info->first_time)
2704 obstack_1grow (info->ob, PATH_SEPARATOR);
2706 obstack_grow (info->ob, path, strlen (path));
2708 info->first_time = false;
2709 return NULL;
2712 /* Add or change the value of an environment variable, outputting the
2713 change to standard error if in verbose mode. */
2714 static void
2715 xputenv (const char *string)
2717 if (verbose_flag)
2718 notice ("%s\n", string);
2719 putenv (CONST_CAST (char *, string));
2722 /* Build a list of search directories from PATHS.
2723 PREFIX is a string to prepend to the list.
2724 If CHECK_DIR_P is true we ensure the directory exists.
2725 If DO_MULTI is true, multilib paths are output first, then
2726 non-multilib paths.
2727 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2728 It is also used by the --print-search-dirs flag. */
2730 static char *
2731 build_search_list (const struct path_prefix *paths, const char *prefix,
2732 bool check_dir, bool do_multi)
2734 struct add_to_obstack_info info;
2736 info.ob = &collect_obstack;
2737 info.check_dir = check_dir;
2738 info.first_time = true;
2740 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2741 obstack_1grow (&collect_obstack, '=');
2743 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2745 obstack_1grow (&collect_obstack, '\0');
2746 return XOBFINISH (&collect_obstack, char *);
2749 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2750 for collect. */
2752 static void
2753 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2754 bool do_multi)
2756 xputenv (build_search_list (paths, env_var, true, do_multi));
2759 /* Check whether NAME can be accessed in MODE. This is like access,
2760 except that it never considers directories to be executable. */
2762 static int
2763 access_check (const char *name, int mode)
2765 if (mode == X_OK)
2767 struct stat st;
2769 if (stat (name, &st) < 0
2770 || S_ISDIR (st.st_mode))
2771 return -1;
2774 return access (name, mode);
2777 /* Callback for find_a_file. Appends the file name to the directory
2778 path. If the resulting file exists in the right mode, return the
2779 full pathname to the file. */
2781 struct file_at_path_info {
2782 const char *name;
2783 const char *suffix;
2784 int name_len;
2785 int suffix_len;
2786 int mode;
2789 static void *
2790 file_at_path (char *path, void *data)
2792 struct file_at_path_info *info = (struct file_at_path_info *) data;
2793 size_t len = strlen (path);
2795 memcpy (path + len, info->name, info->name_len);
2796 len += info->name_len;
2798 /* Some systems have a suffix for executable files.
2799 So try appending that first. */
2800 if (info->suffix_len)
2802 memcpy (path + len, info->suffix, info->suffix_len + 1);
2803 if (access_check (path, info->mode) == 0)
2804 return path;
2807 path[len] = '\0';
2808 if (access_check (path, info->mode) == 0)
2809 return path;
2811 return NULL;
2814 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2815 access to check permissions. If DO_MULTI is true, search multilib
2816 paths then non-multilib paths, otherwise do not search multilib paths.
2817 Return 0 if not found, otherwise return its name, allocated with malloc. */
2819 static char *
2820 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2821 bool do_multi)
2823 struct file_at_path_info info;
2825 #ifdef DEFAULT_ASSEMBLER
2826 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2827 return xstrdup (DEFAULT_ASSEMBLER);
2828 #endif
2830 #ifdef DEFAULT_LINKER
2831 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2832 return xstrdup (DEFAULT_LINKER);
2833 #endif
2835 /* Determine the filename to execute (special case for absolute paths). */
2837 if (IS_ABSOLUTE_PATH (name))
2839 if (access (name, mode) == 0)
2840 return xstrdup (name);
2842 return NULL;
2845 info.name = name;
2846 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2847 info.name_len = strlen (info.name);
2848 info.suffix_len = strlen (info.suffix);
2849 info.mode = mode;
2851 return (char*) for_each_path (pprefix, do_multi,
2852 info.name_len + info.suffix_len,
2853 file_at_path, &info);
2856 /* Ranking of prefixes in the sort list. -B prefixes are put before
2857 all others. */
2859 enum path_prefix_priority
2861 PREFIX_PRIORITY_B_OPT,
2862 PREFIX_PRIORITY_LAST
2865 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2866 order according to PRIORITY. Within each PRIORITY, new entries are
2867 appended.
2869 If WARN is nonzero, we will warn if no file is found
2870 through this prefix. WARN should point to an int
2871 which will be set to 1 if this entry is used.
2873 COMPONENT is the value to be passed to update_path.
2875 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2876 the complete value of machine_suffix.
2877 2 means try both machine_suffix and just_machine_suffix. */
2879 static void
2880 add_prefix (struct path_prefix *pprefix, const char *prefix,
2881 const char *component, /* enum prefix_priority */ int priority,
2882 int require_machine_suffix, int os_multilib)
2884 struct prefix_list *pl, **prev;
2885 int len;
2887 for (prev = &pprefix->plist;
2888 (*prev) != NULL && (*prev)->priority <= priority;
2889 prev = &(*prev)->next)
2892 /* Keep track of the longest prefix. */
2894 prefix = update_path (prefix, component);
2895 len = strlen (prefix);
2896 if (len > pprefix->max_len)
2897 pprefix->max_len = len;
2899 pl = XNEW (struct prefix_list);
2900 pl->prefix = prefix;
2901 pl->require_machine_suffix = require_machine_suffix;
2902 pl->priority = priority;
2903 pl->os_multilib = os_multilib;
2905 /* Insert after PREV. */
2906 pl->next = (*prev);
2907 (*prev) = pl;
2910 /* Same as add_prefix, but prepending target_system_root to prefix. */
2911 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2912 static void
2913 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2914 const char *component,
2915 /* enum prefix_priority */ int priority,
2916 int require_machine_suffix, int os_multilib)
2918 if (!IS_ABSOLUTE_PATH (prefix))
2919 fatal ("system path '%s' is not absolute", prefix);
2921 if (target_system_root)
2923 if (target_sysroot_suffix)
2924 prefix = concat (target_sysroot_suffix, prefix, NULL);
2925 prefix = concat (target_system_root, prefix, NULL);
2927 /* We have to override this because GCC's notion of sysroot
2928 moves along with GCC. */
2929 component = "GCC";
2932 add_prefix (pprefix, prefix, component, priority,
2933 require_machine_suffix, os_multilib);
2936 /* Execute the command specified by the arguments on the current line of spec.
2937 When using pipes, this includes several piped-together commands
2938 with `|' between them.
2940 Return 0 if successful, -1 if failed. */
2942 static int
2943 execute (void)
2945 int i;
2946 int n_commands; /* # of command. */
2947 char *string;
2948 struct pex_obj *pex;
2949 struct command
2951 const char *prog; /* program name. */
2952 const char **argv; /* vector of args. */
2955 struct command *commands; /* each command buffer with above info. */
2957 gcc_assert (!processing_spec_function);
2959 if (wrapper_string)
2961 string = find_a_file (&exec_prefixes, argbuf[0], X_OK, false);
2962 argbuf[0] = (string) ? string : argbuf[0];
2963 insert_wrapper (wrapper_string);
2966 /* Count # of piped commands. */
2967 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2968 if (strcmp (argbuf[i], "|") == 0)
2969 n_commands++;
2971 /* Get storage for each command. */
2972 commands = (struct command *) alloca (n_commands * sizeof (struct command));
2974 /* Split argbuf into its separate piped processes,
2975 and record info about each one.
2976 Also search for the programs that are to be run. */
2978 commands[0].prog = argbuf[0]; /* first command. */
2979 commands[0].argv = &argbuf[0];
2981 if (!wrapper_string)
2983 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2984 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2987 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2988 if (strcmp (argbuf[i], "|") == 0)
2989 { /* each command. */
2990 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2991 fatal ("-pipe not supported");
2992 #endif
2993 argbuf[i] = 0; /* termination of command args. */
2994 commands[n_commands].prog = argbuf[i + 1];
2995 commands[n_commands].argv = &argbuf[i + 1];
2996 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2997 X_OK, false);
2998 if (string)
2999 commands[n_commands].argv[0] = string;
3000 n_commands++;
3003 argbuf[argbuf_index] = 0;
3005 /* If -v, print what we are about to do, and maybe query. */
3007 if (verbose_flag)
3009 /* For help listings, put a blank line between sub-processes. */
3010 if (print_help_list)
3011 fputc ('\n', stderr);
3013 /* Print each piped command as a separate line. */
3014 for (i = 0; i < n_commands; i++)
3016 const char *const *j;
3018 if (verbose_only_flag)
3020 for (j = commands[i].argv; *j; j++)
3022 const char *p;
3023 for (p = *j; *p; ++p)
3024 if (!ISALNUM ((unsigned char) *p)
3025 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
3026 break;
3027 if (*p || !*j)
3029 fprintf (stderr, " \"");
3030 for (p = *j; *p; ++p)
3032 if (*p == '"' || *p == '\\' || *p == '$')
3033 fputc ('\\', stderr);
3034 fputc (*p, stderr);
3036 fputc ('"', stderr);
3038 else
3039 fprintf (stderr, " %s", *j);
3042 else
3043 for (j = commands[i].argv; *j; j++)
3044 fprintf (stderr, " %s", *j);
3046 /* Print a pipe symbol after all but the last command. */
3047 if (i + 1 != n_commands)
3048 fprintf (stderr, " |");
3049 fprintf (stderr, "\n");
3051 fflush (stderr);
3052 if (verbose_only_flag != 0)
3054 /* verbose_only_flag should act as if the spec was
3055 executed, so increment execution_count before
3056 returning. This prevents spurious warnings about
3057 unused linker input files, etc. */
3058 execution_count++;
3059 return 0;
3061 #ifdef DEBUG
3062 notice ("\nGo ahead? (y or n) ");
3063 fflush (stderr);
3064 i = getchar ();
3065 if (i != '\n')
3066 while (getchar () != '\n')
3069 if (i != 'y' && i != 'Y')
3070 return 0;
3071 #endif /* DEBUG */
3074 #ifdef ENABLE_VALGRIND_CHECKING
3075 /* Run the each command through valgrind. To simplify prepending the
3076 path to valgrind and the option "-q" (for quiet operation unless
3077 something triggers), we allocate a separate argv array. */
3079 for (i = 0; i < n_commands; i++)
3081 const char **argv;
3082 int argc;
3083 int j;
3085 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3088 argv = XALLOCAVEC (const char *, argc + 3);
3090 argv[0] = VALGRIND_PATH;
3091 argv[1] = "-q";
3092 for (j = 2; j < argc + 2; j++)
3093 argv[j] = commands[i].argv[j - 2];
3094 argv[j] = NULL;
3096 commands[i].argv = argv;
3097 commands[i].prog = argv[0];
3099 #endif
3101 /* Run each piped subprocess. */
3103 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3104 ? PEX_RECORD_TIMES : 0),
3105 programname, temp_filename);
3106 if (pex == NULL)
3107 pfatal_with_name (_("pex_init failed"));
3109 for (i = 0; i < n_commands; i++)
3111 const char *errmsg;
3112 int err;
3113 const char *string = commands[i].argv[0];
3115 errmsg = pex_run (pex,
3116 ((i + 1 == n_commands ? PEX_LAST : 0)
3117 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3118 string, CONST_CAST (char **, commands[i].argv),
3119 NULL, NULL, &err);
3120 if (errmsg != NULL)
3122 if (err == 0)
3123 fatal (errmsg);
3124 else
3126 errno = err;
3127 pfatal_with_name (errmsg);
3131 if (string != commands[i].prog)
3132 free (CONST_CAST (char *, string));
3135 execution_count++;
3137 /* Wait for all the subprocesses to finish. */
3140 int *statuses;
3141 struct pex_time *times = NULL;
3142 int ret_code = 0;
3144 statuses = (int *) alloca (n_commands * sizeof (int));
3145 if (!pex_get_status (pex, n_commands, statuses))
3146 pfatal_with_name (_("failed to get exit status"));
3148 if (report_times || report_times_to_file)
3150 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
3151 if (!pex_get_times (pex, n_commands, times))
3152 pfatal_with_name (_("failed to get process times"));
3155 pex_free (pex);
3157 for (i = 0; i < n_commands; ++i)
3159 int status = statuses[i];
3161 if (WIFSIGNALED (status))
3163 #ifdef SIGPIPE
3164 /* SIGPIPE is a special case. It happens in -pipe mode
3165 when the compiler dies before the preprocessor is done,
3166 or the assembler dies before the compiler is done.
3167 There's generally been an error already, and this is
3168 just fallout. So don't generate another error unless
3169 we would otherwise have succeeded. */
3170 if (WTERMSIG (status) == SIGPIPE
3171 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
3173 signal_count++;
3174 ret_code = -1;
3176 else
3177 #endif
3178 fatal_ice ("\
3179 Internal error: %s (program %s)\n\
3180 Please submit a full bug report.\n\
3181 See %s for instructions.",
3182 strsignal (WTERMSIG (status)), commands[i].prog,
3183 bug_report_url);
3185 else if (WIFEXITED (status)
3186 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3188 if (WEXITSTATUS (status) > greatest_status)
3189 greatest_status = WEXITSTATUS (status);
3190 ret_code = -1;
3193 if (report_times || report_times_to_file)
3195 struct pex_time *pt = &times[i];
3196 double ut, st;
3198 ut = ((double) pt->user_seconds
3199 + (double) pt->user_microseconds / 1.0e6);
3200 st = ((double) pt->system_seconds
3201 + (double) pt->system_microseconds / 1.0e6);
3203 if (ut + st != 0)
3205 if (report_times)
3206 notice ("# %s %.2f %.2f\n", commands[i].prog, ut, st);
3208 if (report_times_to_file)
3210 int c = 0;
3211 const char *const *j;
3213 fprintf (report_times_to_file, "%g %g", ut, st);
3215 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3217 const char *p;
3218 for (p = *j; *p; ++p)
3219 if (*p == '"' || *p == '\\' || *p == '$'
3220 || ISSPACE (*p))
3221 break;
3223 if (*p)
3225 fprintf (report_times_to_file, " \"");
3226 for (p = *j; *p; ++p)
3228 if (*p == '"' || *p == '\\' || *p == '$')
3229 fputc ('\\', report_times_to_file);
3230 fputc (*p, report_times_to_file);
3232 fputc ('"', report_times_to_file);
3234 else
3235 fprintf (report_times_to_file, " %s", *j);
3238 fputc ('\n', report_times_to_file);
3244 return ret_code;
3248 /* Find all the switches given to us
3249 and make a vector describing them.
3250 The elements of the vector are strings, one per switch given.
3251 If a switch uses following arguments, then the `part1' field
3252 is the switch itself and the `args' field
3253 is a null-terminated vector containing the following arguments.
3254 Bits in the `live_cond' field are:
3255 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3256 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3257 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3258 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
3259 in all do_spec calls afterwards. Used for %<S from self specs.
3260 The `validated' field is nonzero if any spec has looked at this switch;
3261 if it remains zero at the end of the run, it must be meaningless. */
3263 #define SWITCH_LIVE 0x1
3264 #define SWITCH_FALSE 0x2
3265 #define SWITCH_IGNORE 0x4
3266 #define SWITCH_IGNORE_PERMANENTLY 0x8
3268 struct switchstr
3270 const char *part1;
3271 const char **args;
3272 unsigned int live_cond;
3273 unsigned char validated;
3274 unsigned char ordering;
3277 static struct switchstr *switches;
3279 static int n_switches;
3281 /* Set to zero if -fcompare-debug is disabled, positive if it's
3282 enabled and we're running the first compilation, negative if it's
3283 enabled and we're running the second compilation. For most of the
3284 time, it's in the range -1..1, but it can be temporarily set to 2
3285 or 3 to indicate that the -fcompare-debug flags didn't come from
3286 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3287 variable, until a synthesized -fcompare-debug flag is added to the
3288 command line. */
3289 int compare_debug;
3291 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3292 int compare_debug_second;
3294 /* Set to the flags that should be passed to the second compilation in
3295 a -fcompare-debug compilation. */
3296 const char *compare_debug_opt;
3298 static struct switchstr *switches_debug_check[2];
3300 static int n_switches_debug_check[2];
3302 static char *debug_check_temp_file[2];
3304 /* Language is one of three things:
3306 1) The name of a real programming language.
3307 2) NULL, indicating that no one has figured out
3308 what it is yet.
3309 3) '*', indicating that the file should be passed
3310 to the linker. */
3311 struct infile
3313 const char *name;
3314 const char *language;
3315 struct compiler *incompiler;
3316 bool compiled;
3317 bool preprocessed;
3320 /* Also a vector of input files specified. */
3322 static struct infile *infiles;
3324 int n_infiles;
3326 /* True if multiple input files are being compiled to a single
3327 assembly file. */
3329 static bool combine_inputs;
3331 /* This counts the number of libraries added by lang_specific_driver, so that
3332 we can tell if there were any user supplied any files or libraries. */
3334 static int added_libraries;
3336 /* And a vector of corresponding output files is made up later. */
3338 const char **outfiles;
3340 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3342 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3343 is true if we should look for an executable suffix. DO_OBJ
3344 is true if we should look for an object suffix. */
3346 static const char *
3347 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3348 int do_obj ATTRIBUTE_UNUSED)
3350 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3351 int i;
3352 #endif
3353 int len;
3355 if (name == NULL)
3356 return NULL;
3358 len = strlen (name);
3360 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3361 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3362 if (do_obj && len > 2
3363 && name[len - 2] == '.'
3364 && name[len - 1] == 'o')
3366 obstack_grow (&obstack, name, len - 2);
3367 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3368 name = XOBFINISH (&obstack, const char *);
3370 #endif
3372 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3373 /* If there is no filetype, make it the executable suffix (which includes
3374 the "."). But don't get confused if we have just "-o". */
3375 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3376 return name;
3378 for (i = len - 1; i >= 0; i--)
3379 if (IS_DIR_SEPARATOR (name[i]))
3380 break;
3382 for (i++; i < len; i++)
3383 if (name[i] == '.')
3384 return name;
3386 obstack_grow (&obstack, name, len);
3387 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3388 strlen (TARGET_EXECUTABLE_SUFFIX));
3389 name = XOBFINISH (&obstack, const char *);
3390 #endif
3392 return name;
3394 #endif
3396 /* Display the command line switches accepted by gcc. */
3397 static void
3398 display_help (void)
3400 printf (_("Usage: %s [options] file...\n"), programname);
3401 fputs (_("Options:\n"), stdout);
3403 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3404 fputs (_(" --help Display this information\n"), stdout);
3405 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3406 fputs (_(" --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3407 fputs (_(" Display specific types of command line options\n"), stdout);
3408 if (! verbose_flag)
3409 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3410 fputs (_(" --version Display compiler version information\n"), stdout);
3411 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3412 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3413 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3414 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3415 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3416 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3417 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3418 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3419 fputs (_("\
3420 -print-multi-lib Display the mapping between command line options and\n\
3421 multiple library search directories\n"), stdout);
3422 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3423 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
3424 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3425 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3426 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3427 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3428 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3429 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3430 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3431 fputs (_(" -combine Pass multiple source files to compiler at once\n"), stdout);
3432 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3433 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
3434 fputs (_("\
3435 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3436 prefixes to other gcc components\n"), stdout);
3437 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3438 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3439 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3440 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3441 fputs (_("\
3442 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3443 and libraries\n"), stdout);
3444 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3445 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3446 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3447 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3448 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3449 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3450 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3451 fputs (_("\
3452 -x <language> Specify the language of the following input files\n\
3453 Permissible languages include: c c++ assembler none\n\
3454 'none' means revert to the default behavior of\n\
3455 guessing the language based on the file's extension\n\
3456 "), stdout);
3458 printf (_("\
3459 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3460 passed on to the various sub-processes invoked by %s. In order to pass\n\
3461 other options on to these processes the -W<letter> options must be used.\n\
3462 "), programname);
3464 /* The rest of the options are displayed by invocations of the various
3465 sub-processes. */
3468 static void
3469 add_preprocessor_option (const char *option, int len)
3471 n_preprocessor_options++;
3473 if (! preprocessor_options)
3474 preprocessor_options = XNEWVEC (char *, n_preprocessor_options);
3475 else
3476 preprocessor_options = XRESIZEVEC (char *, preprocessor_options,
3477 n_preprocessor_options);
3479 preprocessor_options [n_preprocessor_options - 1] =
3480 save_string (option, len);
3483 static void
3484 add_assembler_option (const char *option, int len)
3486 n_assembler_options++;
3488 if (! assembler_options)
3489 assembler_options = XNEWVEC (char *, n_assembler_options);
3490 else
3491 assembler_options = XRESIZEVEC (char *, assembler_options,
3492 n_assembler_options);
3494 assembler_options [n_assembler_options - 1] = save_string (option, len);
3497 static void
3498 add_linker_option (const char *option, int len)
3500 n_linker_options++;
3502 if (! linker_options)
3503 linker_options = XNEWVEC (char *, n_linker_options);
3504 else
3505 linker_options = XRESIZEVEC (char *, linker_options, n_linker_options);
3507 linker_options [n_linker_options - 1] = save_string (option, len);
3510 /* Create the vector `switches' and its contents.
3511 Store its length in `n_switches'. */
3513 static void
3514 process_command (int argc, const char **argv)
3516 int i;
3517 const char *temp;
3518 char *temp1;
3519 const char *spec_lang = 0;
3520 int last_language_n_infiles;
3521 int lang_n_infiles = 0;
3522 #ifdef MODIFY_TARGET_NAME
3523 int is_modify_target_name;
3524 unsigned int j;
3525 #endif
3526 const char *tooldir_prefix;
3527 char *(*get_relative_prefix) (const char *, const char *,
3528 const char *) = NULL;
3530 GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3532 n_switches = 0;
3533 n_infiles = 0;
3534 added_libraries = 0;
3536 /* Figure compiler version from version string. */
3538 compiler_version = temp1 = xstrdup (version_string);
3540 for (; *temp1; ++temp1)
3542 if (*temp1 == ' ')
3544 *temp1 = '\0';
3545 break;
3549 /* Convert new-style -- options to old-style. */
3550 translate_options (&argc,
3551 CONST_CAST2 (const char *const **, const char ***,
3552 &argv));
3554 /* Handle any -no-canonical-prefixes flag early, to assign the function
3555 that builds relative prefixes. This function creates default search
3556 paths that are needed later in normal option handling. */
3558 for (i = 1; i < argc; i++)
3560 if (! strcmp (argv[i], "-no-canonical-prefixes"))
3562 get_relative_prefix = make_relative_prefix_ignore_links;
3563 break;
3566 if (! get_relative_prefix)
3567 get_relative_prefix = make_relative_prefix;
3569 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3570 see if we can create it from the pathname specified in argv[0]. */
3572 gcc_libexec_prefix = standard_libexec_prefix;
3573 #ifndef VMS
3574 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3575 if (!gcc_exec_prefix)
3577 gcc_exec_prefix = get_relative_prefix (argv[0],
3578 standard_bindir_prefix,
3579 standard_exec_prefix);
3580 gcc_libexec_prefix = get_relative_prefix (argv[0],
3581 standard_bindir_prefix,
3582 standard_libexec_prefix);
3583 if (gcc_exec_prefix)
3584 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3586 else
3588 /* make_relative_prefix requires a program name, but
3589 GCC_EXEC_PREFIX is typically a directory name with a trailing
3590 / (which is ignored by make_relative_prefix), so append a
3591 program name. */
3592 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
3593 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3594 standard_exec_prefix,
3595 standard_libexec_prefix);
3597 /* The path is unrelocated, so fallback to the original setting. */
3598 if (!gcc_libexec_prefix)
3599 gcc_libexec_prefix = standard_libexec_prefix;
3601 free (tmp_prefix);
3603 #else
3604 #endif
3605 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3606 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
3607 or an automatically created GCC_EXEC_PREFIX from argv[0]. */
3609 /* Do language-specific adjustment/addition of flags. */
3610 lang_specific_driver (&argc,
3611 CONST_CAST2 (const char *const **, const char ***,
3612 &argv),
3613 &added_libraries);
3615 if (gcc_exec_prefix)
3617 int len = strlen (gcc_exec_prefix);
3619 if (len > (int) sizeof ("/lib/gcc/") - 1
3620 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3622 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3623 if (IS_DIR_SEPARATOR (*temp)
3624 && strncmp (temp + 1, "lib", 3) == 0
3625 && IS_DIR_SEPARATOR (temp[4])
3626 && strncmp (temp + 5, "gcc", 3) == 0)
3627 len -= sizeof ("/lib/gcc/") - 1;
3630 set_std_prefix (gcc_exec_prefix, len);
3631 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3632 PREFIX_PRIORITY_LAST, 0, 0);
3633 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3634 PREFIX_PRIORITY_LAST, 0, 0);
3637 /* COMPILER_PATH and LIBRARY_PATH have values
3638 that are lists of directory names with colons. */
3640 GET_ENVIRONMENT (temp, "COMPILER_PATH");
3641 if (temp)
3643 const char *startp, *endp;
3644 char *nstore = (char *) alloca (strlen (temp) + 3);
3646 startp = endp = temp;
3647 while (1)
3649 if (*endp == PATH_SEPARATOR || *endp == 0)
3651 strncpy (nstore, startp, endp - startp);
3652 if (endp == startp)
3653 strcpy (nstore, concat (".", dir_separator_str, NULL));
3654 else if (!IS_DIR_SEPARATOR (endp[-1]))
3656 nstore[endp - startp] = DIR_SEPARATOR;
3657 nstore[endp - startp + 1] = 0;
3659 else
3660 nstore[endp - startp] = 0;
3661 add_prefix (&exec_prefixes, nstore, 0,
3662 PREFIX_PRIORITY_LAST, 0, 0);
3663 add_prefix (&include_prefixes, nstore, 0,
3664 PREFIX_PRIORITY_LAST, 0, 0);
3665 if (*endp == 0)
3666 break;
3667 endp = startp = endp + 1;
3669 else
3670 endp++;
3674 GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
3675 if (temp && *cross_compile == '0')
3677 const char *startp, *endp;
3678 char *nstore = (char *) alloca (strlen (temp) + 3);
3680 startp = endp = temp;
3681 while (1)
3683 if (*endp == PATH_SEPARATOR || *endp == 0)
3685 strncpy (nstore, startp, endp - startp);
3686 if (endp == startp)
3687 strcpy (nstore, concat (".", dir_separator_str, NULL));
3688 else if (!IS_DIR_SEPARATOR (endp[-1]))
3690 nstore[endp - startp] = DIR_SEPARATOR;
3691 nstore[endp - startp + 1] = 0;
3693 else
3694 nstore[endp - startp] = 0;
3695 add_prefix (&startfile_prefixes, nstore, NULL,
3696 PREFIX_PRIORITY_LAST, 0, 1);
3697 if (*endp == 0)
3698 break;
3699 endp = startp = endp + 1;
3701 else
3702 endp++;
3706 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3707 GET_ENVIRONMENT (temp, "LPATH");
3708 if (temp && *cross_compile == '0')
3710 const char *startp, *endp;
3711 char *nstore = (char *) alloca (strlen (temp) + 3);
3713 startp = endp = temp;
3714 while (1)
3716 if (*endp == PATH_SEPARATOR || *endp == 0)
3718 strncpy (nstore, startp, endp - startp);
3719 if (endp == startp)
3720 strcpy (nstore, concat (".", dir_separator_str, NULL));
3721 else if (!IS_DIR_SEPARATOR (endp[-1]))
3723 nstore[endp - startp] = DIR_SEPARATOR;
3724 nstore[endp - startp + 1] = 0;
3726 else
3727 nstore[endp - startp] = 0;
3728 add_prefix (&startfile_prefixes, nstore, NULL,
3729 PREFIX_PRIORITY_LAST, 0, 1);
3730 if (*endp == 0)
3731 break;
3732 endp = startp = endp + 1;
3734 else
3735 endp++;
3739 /* Scan argv twice. Here, the first time, just count how many switches
3740 there will be in their vector, and how many input files in theirs.
3741 Here we also parse the switches that cc itself uses (e.g. -v). */
3743 for (i = 1; i < argc; i++)
3745 if (! strcmp (argv[i], "-dumpspecs"))
3747 struct spec_list *sl;
3748 init_spec ();
3749 for (sl = specs; sl; sl = sl->next)
3750 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3751 if (link_command_spec)
3752 printf ("*link_command:\n%s\n\n", link_command_spec);
3753 exit (0);
3755 else if (! strcmp (argv[i], "-dumpversion"))
3757 printf ("%s\n", spec_version);
3758 exit (0);
3760 else if (! strcmp (argv[i], "-dumpmachine"))
3762 printf ("%s\n", spec_machine);
3763 exit (0);
3765 else if (strcmp (argv[i], "-fversion") == 0)
3767 /* translate_options () has turned --version into -fversion. */
3768 print_version = 1;
3770 /* We will be passing a dummy file on to the sub-processes. */
3771 n_infiles++;
3772 n_switches++;
3774 /* CPP driver cannot obtain switch from cc1_options. */
3775 if (is_cpp_driver)
3776 add_preprocessor_option ("--version", strlen ("--version"));
3777 add_assembler_option ("--version", strlen ("--version"));
3778 add_linker_option ("--version", strlen ("--version"));
3780 else if (strcmp (argv[i], "-fhelp") == 0)
3782 /* translate_options () has turned --help into -fhelp. */
3783 print_help_list = 1;
3785 /* We will be passing a dummy file on to the sub-processes. */
3786 n_infiles++;
3787 n_switches++;
3789 /* CPP driver cannot obtain switch from cc1_options. */
3790 if (is_cpp_driver)
3791 add_preprocessor_option ("--help", 6);
3792 add_assembler_option ("--help", 6);
3793 add_linker_option ("--help", 6);
3795 else if (strncmp (argv[i], "-fhelp=", 7) == 0)
3797 /* translate_options () has turned --help into -fhelp. */
3798 print_subprocess_help = 2;
3800 /* We will be passing a dummy file on to the sub-processes. */
3801 n_infiles++;
3802 n_switches++;
3804 else if (strcmp (argv[i], "-ftarget-help") == 0)
3806 /* translate_options() has turned --target-help into -ftarget-help. */
3807 print_subprocess_help = 1;
3809 /* We will be passing a dummy file on to the sub-processes. */
3810 n_infiles++;
3811 n_switches++;
3813 /* CPP driver cannot obtain switch from cc1_options. */
3814 if (is_cpp_driver)
3815 add_preprocessor_option ("--target-help", 13);
3816 add_assembler_option ("--target-help", 13);
3817 add_linker_option ("--target-help", 13);
3819 else if (! strcmp (argv[i], "-pass-exit-codes"))
3821 pass_exit_codes = 1;
3822 n_switches++;
3824 else if (! strcmp (argv[i], "-print-search-dirs"))
3825 print_search_dirs = 1;
3826 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3827 print_file_name = "libgcc.a";
3828 else if (! strncmp (argv[i], "-print-file-name=", 17))
3829 print_file_name = argv[i] + 17;
3830 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3831 print_prog_name = argv[i] + 17;
3832 else if (! strcmp (argv[i], "-print-multi-lib"))
3833 print_multi_lib = 1;
3834 else if (! strcmp (argv[i], "-print-multi-directory"))
3835 print_multi_directory = 1;
3836 else if (! strcmp (argv[i], "-print-sysroot"))
3837 print_sysroot = 1;
3838 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3839 print_multi_os_directory = 1;
3840 else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
3841 print_sysroot_headers_suffix = 1;
3842 else if (! strcmp (argv[i], "-fcompare-debug-second"))
3844 compare_debug_second = 1;
3845 n_switches++;
3847 else if (! strcmp (argv[i], "-fno-compare-debug"))
3849 argv[i] = "-fcompare-debug=";
3850 goto compare_debug_with_arg;
3852 else if (! strcmp (argv[i], "-fcompare-debug"))
3854 argv[i] = "-fcompare-debug=-gtoggle";
3855 goto compare_debug_with_arg;
3857 #define OPT "-fcompare-debug="
3858 else if (! strncmp (argv[i], OPT, sizeof (OPT) - 1))
3860 const char *opt;
3861 compare_debug_with_arg:
3862 opt = argv[i] + sizeof (OPT) - 1;
3863 #undef OPT
3864 if (*opt)
3865 compare_debug = 1;
3866 else
3867 compare_debug = -1;
3868 if (compare_debug < 0)
3869 compare_debug_opt = NULL;
3870 else
3871 compare_debug_opt = opt;
3872 n_switches++;
3874 else if (! strncmp (argv[i], "-Wa,", 4))
3876 int prev, j;
3877 /* Pass the rest of this option to the assembler. */
3879 /* Split the argument at commas. */
3880 prev = 4;
3881 for (j = 4; argv[i][j]; j++)
3882 if (argv[i][j] == ',')
3884 add_assembler_option (argv[i] + prev, j - prev);
3885 prev = j + 1;
3888 /* Record the part after the last comma. */
3889 add_assembler_option (argv[i] + prev, j - prev);
3891 else if (! strncmp (argv[i], "-Wp,", 4))
3893 int prev, j;
3894 /* Pass the rest of this option to the preprocessor. */
3896 /* Split the argument at commas. */
3897 prev = 4;
3898 for (j = 4; argv[i][j]; j++)
3899 if (argv[i][j] == ',')
3901 add_preprocessor_option (argv[i] + prev, j - prev);
3902 prev = j + 1;
3905 /* Record the part after the last comma. */
3906 add_preprocessor_option (argv[i] + prev, j - prev);
3908 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3909 /* The +e options to the C++ front-end. */
3910 n_switches++;
3911 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3913 int j;
3914 /* Split the argument at commas. */
3915 for (j = 3; argv[i][j]; j++)
3916 n_infiles += (argv[i][j] == ',');
3918 else if (strcmp (argv[i], "-Xlinker") == 0)
3920 if (i + 1 == argc)
3921 fatal ("argument to '-Xlinker' is missing");
3923 n_infiles++;
3924 i++;
3926 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3928 if (i + 1 == argc)
3929 fatal ("argument to '-Xpreprocessor' is missing");
3931 add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
3933 else if (strcmp (argv[i], "-Xassembler") == 0)
3935 if (i + 1 == argc)
3936 fatal ("argument to '-Xassembler' is missing");
3938 add_assembler_option (argv[i+1], strlen (argv[i+1]));
3940 else if (strcmp (argv[i], "-l") == 0)
3942 if (i + 1 == argc)
3943 fatal ("argument to '-l' is missing");
3945 n_infiles++;
3946 i++;
3948 else if (strncmp (argv[i], "-l", 2) == 0)
3949 n_infiles++;
3950 else if (strcmp (argv[i], "-save-temps") == 0)
3952 save_temps_flag = SAVE_TEMPS_CWD;
3953 n_switches++;
3955 else if (strncmp (argv[i], "-save-temps=", 12) == 0)
3957 n_switches++;
3958 if (strcmp (argv[i]+12, "cwd") == 0)
3959 save_temps_flag = SAVE_TEMPS_CWD;
3960 else if (strcmp (argv[i]+12, "obj") == 0
3961 || strcmp (argv[i]+12, "object") == 0)
3962 save_temps_flag = SAVE_TEMPS_OBJ;
3963 else
3964 fatal ("'%s' is an unknown -save-temps option", argv[i]);
3966 else if (strcmp (argv[i], "-no-canonical-prefixes") == 0)
3967 /* Already handled as a special case, so ignored here. */
3969 else if (strcmp (argv[i], "-combine") == 0)
3971 combine_flag = 1;
3972 n_switches++;
3974 else if (strcmp (argv[i], "-specs") == 0)
3976 struct user_specs *user = XNEW (struct user_specs);
3977 if (++i >= argc)
3978 fatal ("argument to '-specs' is missing");
3980 user->next = (struct user_specs *) 0;
3981 user->filename = argv[i];
3982 if (user_specs_tail)
3983 user_specs_tail->next = user;
3984 else
3985 user_specs_head = user;
3986 user_specs_tail = user;
3988 else if (strncmp (argv[i], "-specs=", 7) == 0)
3990 struct user_specs *user = XNEW (struct user_specs);
3991 if (strlen (argv[i]) == 7)
3992 fatal ("argument to '-specs=' is missing");
3994 user->next = (struct user_specs *) 0;
3995 user->filename = argv[i] + 7;
3996 if (user_specs_tail)
3997 user_specs_tail->next = user;
3998 else
3999 user_specs_head = user;
4000 user_specs_tail = user;
4002 else if (strcmp (argv[i], "-time") == 0)
4003 report_times = 1;
4004 else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
4006 if (report_times_to_file)
4007 fclose (report_times_to_file);
4008 report_times_to_file = fopen (argv[i] + sizeof ("-time=") - 1, "a");
4010 else if (strcmp (argv[i], "-pipe") == 0)
4012 /* -pipe has to go into the switches array as well as
4013 setting a flag. */
4014 use_pipes = 1;
4015 n_switches++;
4017 else if (strcmp (argv[i], "-wrapper") == 0)
4019 if (++i >= argc)
4020 fatal ("argument to '-wrapper' is missing");
4022 wrapper_string = argv[i];
4023 n_switches++;
4024 n_switches++;
4026 else if (strcmp (argv[i], "-###") == 0)
4028 /* This is similar to -v except that there is no execution
4029 of the commands and the echoed arguments are quoted. It
4030 is intended for use in shell scripts to capture the
4031 driver-generated command line. */
4032 verbose_only_flag++;
4033 verbose_flag++;
4035 else if (argv[i][0] == '-' && argv[i][1] != 0)
4037 const char *p = &argv[i][1];
4038 int c = *p;
4040 switch (c)
4042 case 'B':
4044 const char *value;
4045 int len;
4047 if (p[1] == 0 && i + 1 == argc)
4048 fatal ("argument to '-B' is missing");
4049 if (p[1] == 0)
4050 value = argv[++i];
4051 else
4052 value = p + 1;
4054 len = strlen (value);
4056 /* Catch the case where the user has forgotten to append a
4057 directory separator to the path. Note, they may be using
4058 -B to add an executable name prefix, eg "i386-elf-", in
4059 order to distinguish between multiple installations of
4060 GCC in the same directory. Hence we must check to see
4061 if appending a directory separator actually makes a
4062 valid directory name. */
4063 if (! IS_DIR_SEPARATOR (value [len - 1])
4064 && is_directory (value, false))
4066 char *tmp = XNEWVEC (char, len + 2);
4067 strcpy (tmp, value);
4068 tmp[len] = DIR_SEPARATOR;
4069 tmp[++ len] = 0;
4070 value = tmp;
4073 add_prefix (&exec_prefixes, value, NULL,
4074 PREFIX_PRIORITY_B_OPT, 0, 0);
4075 add_prefix (&startfile_prefixes, value, NULL,
4076 PREFIX_PRIORITY_B_OPT, 0, 0);
4077 add_prefix (&include_prefixes, value, NULL,
4078 PREFIX_PRIORITY_B_OPT, 0, 0);
4079 n_switches++;
4081 break;
4083 case 'v': /* Print our subcommands and print versions. */
4084 n_switches++;
4085 /* If they do anything other than exactly `-v', don't set
4086 verbose_flag; rather, continue on to give the error. */
4087 if (p[1] != 0)
4088 break;
4089 verbose_flag++;
4090 break;
4092 case 'S':
4093 case 'c':
4094 case 'E':
4095 if (p[1] == 0)
4097 have_c = 1;
4098 n_switches++;
4099 break;
4101 goto normal_switch;
4103 case 'o':
4104 have_o = 1;
4105 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
4106 if (! have_c)
4108 int skip;
4110 /* Forward scan, just in case -S, -E or -c is specified
4111 after -o. */
4112 int j = i + 1;
4113 if (p[1] == 0)
4114 ++j;
4115 while (j < argc)
4117 if (argv[j][0] == '-')
4119 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
4120 && argv[j][2] == 0)
4122 have_c = 1;
4123 break;
4125 else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
4126 j += skip - (argv[j][2] != 0);
4127 else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
4128 j += skip;
4130 j++;
4133 #endif
4134 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4135 if (p[1] == 0)
4136 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
4137 else
4138 argv[i] = convert_filename (argv[i], ! have_c, 0);
4139 #endif
4140 /* Save the output name in case -save-temps=obj was used. */
4141 if ((p[1] == 0) && argv[i + 1])
4142 save_temps_prefix = xstrdup(argv[i + 1]);
4143 else
4144 save_temps_prefix = xstrdup(argv[i] + 1);
4145 goto normal_switch;
4147 default:
4148 normal_switch:
4150 #ifdef MODIFY_TARGET_NAME
4151 is_modify_target_name = 0;
4153 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
4154 if (! strcmp (argv[i], modify_target[j].sw))
4156 char *new_name = XNEWVEC (char, strlen (modify_target[j].str)
4157 + strlen (spec_machine));
4158 const char *p, *r;
4159 char *q;
4160 int made_addition = 0;
4162 is_modify_target_name = 1;
4163 for (p = spec_machine, q = new_name; *p != 0; )
4165 if (modify_target[j].add_del == DELETE
4166 && (! strncmp (q, modify_target[j].str,
4167 strlen (modify_target[j].str))))
4168 p += strlen (modify_target[j].str);
4169 else if (modify_target[j].add_del == ADD
4170 && ! made_addition && *p == '-')
4172 for (r = modify_target[j].str; *r != 0; )
4173 *q++ = *r++;
4174 made_addition = 1;
4177 *q++ = *p++;
4180 spec_machine = new_name;
4183 if (is_modify_target_name)
4184 break;
4185 #endif
4187 n_switches++;
4189 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
4190 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
4191 else if (WORD_SWITCH_TAKES_ARG (p))
4192 i += WORD_SWITCH_TAKES_ARG (p);
4195 else
4197 n_infiles++;
4198 lang_n_infiles++;
4202 /* If -save-temps=obj and -o name, create the prefix to use for %b.
4203 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
4204 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4206 save_temps_length = strlen (save_temps_prefix);
4207 temp = strrchr (lbasename (save_temps_prefix), '.');
4208 if (temp)
4210 save_temps_length -= strlen (temp);
4211 save_temps_prefix[save_temps_length] = '\0';
4215 else if (save_temps_prefix != NULL)
4217 free (save_temps_prefix);
4218 save_temps_prefix = NULL;
4221 if (save_temps_flag && use_pipes)
4223 /* -save-temps overrides -pipe, so that temp files are produced */
4224 if (save_temps_flag)
4225 error ("warning: -pipe ignored because -save-temps specified");
4226 use_pipes = 0;
4229 if (!compare_debug)
4231 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
4233 if (gcd && gcd[0] == '-')
4235 compare_debug = 2;
4236 compare_debug_opt = gcd;
4237 n_switches++;
4239 else if (gcd && *gcd && strcmp (gcd, "0"))
4241 compare_debug = 3;
4242 compare_debug_opt = "-gtoggle";
4243 n_switches++;
4246 else if (compare_debug < 0)
4248 compare_debug = 0;
4249 gcc_assert (!compare_debug_opt);
4252 /* Set up the search paths. We add directories that we expect to
4253 contain GNU Toolchain components before directories specified by
4254 the machine description so that we will find GNU components (like
4255 the GNU assembler) before those of the host system. */
4257 /* If we don't know where the toolchain has been installed, use the
4258 configured-in locations. */
4259 if (!gcc_exec_prefix)
4261 #ifndef OS2
4262 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4263 PREFIX_PRIORITY_LAST, 1, 0);
4264 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4265 PREFIX_PRIORITY_LAST, 2, 0);
4266 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4267 PREFIX_PRIORITY_LAST, 2, 0);
4268 #endif
4269 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4270 PREFIX_PRIORITY_LAST, 1, 0);
4273 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4274 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
4275 dir_separator_str, NULL);
4277 /* Look for tools relative to the location from which the driver is
4278 running, or, if that is not available, the configured prefix. */
4279 tooldir_prefix
4280 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4281 spec_machine, dir_separator_str,
4282 spec_version, dir_separator_str, tooldir_prefix, NULL);
4284 add_prefix (&exec_prefixes,
4285 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4286 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4287 add_prefix (&startfile_prefixes,
4288 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4289 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4291 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4292 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4293 then consider it to relocate with the rest of the GCC installation
4294 if GCC_EXEC_PREFIX is set.
4295 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4296 if (target_system_root && gcc_exec_prefix)
4298 char *tmp_prefix = get_relative_prefix (argv[0],
4299 standard_bindir_prefix,
4300 target_system_root);
4301 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4303 target_system_root = tmp_prefix;
4304 target_system_root_changed = 1;
4307 #endif
4309 /* More prefixes are enabled in main, after we read the specs file
4310 and determine whether this is cross-compilation or not. */
4312 /* Then create the space for the vectors and scan again. */
4314 switches = XNEWVEC (struct switchstr, n_switches + 1);
4315 infiles = XNEWVEC (struct infile, n_infiles + 1);
4316 n_switches = 0;
4317 n_infiles = 0;
4318 last_language_n_infiles = -1;
4320 /* This, time, copy the text of each switch and store a pointer
4321 to the copy in the vector of switches.
4322 Store all the infiles in their vector. */
4324 for (i = 1; i < argc; i++)
4326 /* Just skip the switches that were handled by the preceding loop. */
4327 #ifdef MODIFY_TARGET_NAME
4328 is_modify_target_name = 0;
4330 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
4331 if (! strcmp (argv[i], modify_target[j].sw))
4332 is_modify_target_name = 1;
4334 if (is_modify_target_name)
4336 else
4337 #endif
4338 if (! strncmp (argv[i], "-Wa,", 4))
4340 else if (! strncmp (argv[i], "-Wp,", 4))
4342 else if (! strcmp (argv[i], "-no-canonical-prefixes"))
4344 else if (! strcmp (argv[i], "-pass-exit-codes"))
4346 else if (! strcmp (argv[i], "-print-search-dirs"))
4348 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
4350 else if (! strncmp (argv[i], "-print-file-name=", 17))
4352 else if (! strncmp (argv[i], "-print-prog-name=", 17))
4354 else if (! strcmp (argv[i], "-print-multi-lib"))
4356 else if (! strcmp (argv[i], "-print-multi-directory"))
4358 else if (! strcmp (argv[i], "-print-sysroot"))
4360 else if (! strcmp (argv[i], "-print-multi-os-directory"))
4362 else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
4364 else if (! strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")))
4366 target_system_root = argv[i] + strlen ("--sysroot=");
4367 target_system_root_changed = 1;
4369 else if (argv[i][0] == '+' && argv[i][1] == 'e')
4371 /* Compensate for the +e options to the C++ front-end;
4372 they're there simply for cfront call-compatibility. We do
4373 some magic in default_compilers to pass them down properly.
4374 Note we deliberately start at the `+' here, to avoid passing
4375 -e0 or -e1 down into the linker. */
4376 switches[n_switches].part1 = &argv[i][0];
4377 switches[n_switches].args = 0;
4378 switches[n_switches].live_cond = 0;
4379 switches[n_switches].validated = 0;
4380 n_switches++;
4382 else if (strncmp (argv[i], "-Wl,", 4) == 0)
4384 int prev, j;
4385 /* Split the argument at commas. */
4386 prev = 4;
4387 for (j = 4; argv[i][j]; j++)
4388 if (argv[i][j] == ',')
4390 infiles[n_infiles].language = "*";
4391 infiles[n_infiles++].name
4392 = save_string (argv[i] + prev, j - prev);
4393 prev = j + 1;
4395 /* Record the part after the last comma. */
4396 infiles[n_infiles].language = "*";
4397 infiles[n_infiles++].name = argv[i] + prev;
4399 else if (strcmp (argv[i], "-Xlinker") == 0)
4401 infiles[n_infiles].language = "*";
4402 infiles[n_infiles++].name = argv[++i];
4404 /* Xassembler and Xpreprocessor were already handled in the first argv
4405 scan, so all we need to do here is ignore them and their argument. */
4406 else if (strcmp (argv[i], "-Xassembler") == 0)
4407 i++;
4408 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
4409 i++;
4410 else if (strcmp (argv[i], "-l") == 0)
4411 { /* POSIX allows separation of -l and the lib arg;
4412 canonicalize by concatenating -l with its arg */
4413 infiles[n_infiles].language = "*";
4414 infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
4416 else if (strncmp (argv[i], "-l", 2) == 0)
4418 infiles[n_infiles].language = "*";
4419 infiles[n_infiles++].name = argv[i];
4421 else if (strcmp (argv[i], "-wrapper") == 0)
4422 i++;
4423 else if (strcmp (argv[i], "-specs") == 0)
4424 i++;
4425 else if (strncmp (argv[i], "-specs=", 7) == 0)
4427 else if (strcmp (argv[i], "-time") == 0)
4429 else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
4431 else if (strcmp (argv[i], "-###") == 0)
4433 else if (argv[i][0] == '-' && argv[i][1] != 0)
4435 const char *p = &argv[i][1];
4436 int c = *p;
4438 if (c == 'x')
4440 if (p[1] == 0 && i + 1 == argc)
4441 fatal ("argument to '-x' is missing");
4442 if (p[1] == 0)
4443 spec_lang = argv[++i];
4444 else
4445 spec_lang = p + 1;
4446 if (! strcmp (spec_lang, "none"))
4447 /* Suppress the warning if -xnone comes after the last input
4448 file, because alternate command interfaces like g++ might
4449 find it useful to place -xnone after each input file. */
4450 spec_lang = 0;
4451 else
4452 last_language_n_infiles = n_infiles;
4453 continue;
4455 switches[n_switches].part1 = p;
4456 /* Deal with option arguments in separate argv elements. */
4457 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4458 || WORD_SWITCH_TAKES_ARG (p))
4460 int j = 0;
4461 int n_args = WORD_SWITCH_TAKES_ARG (p);
4463 if (n_args == 0)
4465 /* Count only the option arguments in separate argv elements. */
4466 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4468 if (i + n_args >= argc)
4469 fatal ("argument to '-%s' is missing", p);
4470 switches[n_switches].args
4471 = XNEWVEC (const char *, n_args + 1);
4472 while (j < n_args)
4473 switches[n_switches].args[j++] = argv[++i];
4474 /* Null-terminate the vector. */
4475 switches[n_switches].args[j] = 0;
4477 else if (strchr (switches_need_spaces, c))
4479 /* On some systems, ld cannot handle some options without
4480 a space. So split the option from its argument. */
4481 char *part1 = XNEWVEC (char, 2);
4482 part1[0] = c;
4483 part1[1] = '\0';
4485 switches[n_switches].part1 = part1;
4486 switches[n_switches].args = XNEWVEC (const char *, 2);
4487 switches[n_switches].args[0] = xstrdup (p+1);
4488 switches[n_switches].args[1] = 0;
4490 else
4491 switches[n_switches].args = 0;
4493 switches[n_switches].live_cond = 0;
4494 switches[n_switches].validated = 0;
4495 switches[n_switches].ordering = 0;
4496 /* These are always valid, since gcc.c itself understands the
4497 first four, gfortranspec.c understands -static-libgfortran
4498 and g++spec.c understands -static-libstdc++ */
4499 if (!strcmp (p, "save-temps")
4500 || !strcmp (p, "static-libgcc")
4501 || !strcmp (p, "shared-libgcc")
4502 || !strcmp (p, "pipe")
4503 || !strcmp (p, "static-libgfortran")
4504 || !strcmp (p, "static-libstdc++"))
4505 switches[n_switches].validated = 1;
4506 else
4508 char ch = switches[n_switches].part1[0];
4509 if (ch == 'B')
4510 switches[n_switches].validated = 1;
4512 n_switches++;
4514 else
4516 const char *p = strrchr (argv[i], '@');
4517 char *fname;
4518 long offset;
4519 int consumed;
4520 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4521 argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
4522 #endif
4523 /* For LTO static archive support we handle input file
4524 specifications that are composed of a filename and
4525 an offset like FNAME@OFFSET. */
4526 if (p
4527 && p != argv[i]
4528 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4529 && strlen (p) == (unsigned int)consumed)
4531 fname = (char *)xmalloc (p - argv[i] + 1);
4532 memcpy (fname, argv[i], p - argv[i]);
4533 fname[p - argv[i]] = '\0';
4534 /* Only accept non-stdin and existing FNAME parts, otherwise
4535 try with the full name. */
4536 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4538 free (fname);
4539 fname = xstrdup (argv[i]);
4542 else
4543 fname = xstrdup (argv[i]);
4545 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4547 perror_with_name (fname);
4548 error_count++;
4550 else
4552 infiles[n_infiles].language = spec_lang;
4553 infiles[n_infiles++].name = argv[i];
4556 free (fname);
4560 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4561 error ("warning: '-x %s' after last input file has no effect", spec_lang);
4563 if (compare_debug == 2 || compare_debug == 3)
4565 switches[n_switches].part1 = concat ("fcompare-debug=",
4566 compare_debug_opt,
4567 NULL);
4568 switches[n_switches].args = 0;
4569 switches[n_switches].live_cond = 0;
4570 switches[n_switches].validated = 0;
4571 switches[n_switches].ordering = 0;
4572 n_switches++;
4573 compare_debug = 1;
4576 /* Ensure we only invoke each subprocess once. */
4577 if (print_subprocess_help || print_help_list || print_version)
4579 n_infiles = 1;
4581 /* Create a dummy input file, so that we can pass
4582 the help option on to the various sub-processes. */
4583 infiles[0].language = "c";
4584 infiles[0].name = "help-dummy";
4587 switches[n_switches].part1 = 0;
4588 infiles[n_infiles].name = 0;
4591 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4592 and place that in the environment. */
4594 static void
4595 set_collect_gcc_options (void)
4597 int i;
4598 int first_time;
4600 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4601 the compiler. */
4602 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4603 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4605 first_time = TRUE;
4606 for (i = 0; (int) i < n_switches; i++)
4608 const char *const *args;
4609 const char *p, *q;
4610 if (!first_time)
4611 obstack_grow (&collect_obstack, " ", 1);
4613 first_time = FALSE;
4615 /* Ignore elided switches. */
4616 if ((switches[i].live_cond & SWITCH_IGNORE) != 0)
4617 continue;
4619 obstack_grow (&collect_obstack, "'-", 2);
4620 q = switches[i].part1;
4621 while ((p = strchr (q, '\'')))
4623 obstack_grow (&collect_obstack, q, p - q);
4624 obstack_grow (&collect_obstack, "'\\''", 4);
4625 q = ++p;
4627 obstack_grow (&collect_obstack, q, strlen (q));
4628 obstack_grow (&collect_obstack, "'", 1);
4630 for (args = switches[i].args; args && *args; args++)
4632 obstack_grow (&collect_obstack, " '", 2);
4633 q = *args;
4634 while ((p = strchr (q, '\'')))
4636 obstack_grow (&collect_obstack, q, p - q);
4637 obstack_grow (&collect_obstack, "'\\''", 4);
4638 q = ++p;
4640 obstack_grow (&collect_obstack, q, strlen (q));
4641 obstack_grow (&collect_obstack, "'", 1);
4644 obstack_grow (&collect_obstack, "\0", 1);
4645 xputenv (XOBFINISH (&collect_obstack, char *));
4648 /* Process a spec string, accumulating and running commands. */
4650 /* These variables describe the input file name.
4651 input_file_number is the index on outfiles of this file,
4652 so that the output file name can be stored for later use by %o.
4653 input_basename is the start of the part of the input file
4654 sans all directory names, and basename_length is the number
4655 of characters starting there excluding the suffix .c or whatever. */
4657 static const char *input_filename;
4658 static int input_file_number;
4659 size_t input_filename_length;
4660 static int basename_length;
4661 static int suffixed_basename_length;
4662 static const char *input_basename;
4663 static const char *input_suffix;
4664 #ifndef HOST_LACKS_INODE_NUMBERS
4665 static struct stat input_stat;
4666 #endif
4667 static int input_stat_set;
4669 /* The compiler used to process the current input file. */
4670 static struct compiler *input_file_compiler;
4672 /* These are variables used within do_spec and do_spec_1. */
4674 /* Nonzero if an arg has been started and not yet terminated
4675 (with space, tab or newline). */
4676 static int arg_going;
4678 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4679 is a temporary file name. */
4680 static int delete_this_arg;
4682 /* Nonzero means %w has been seen; the next arg to be terminated
4683 is the output file name of this compilation. */
4684 static int this_is_output_file;
4686 /* Nonzero means %s has been seen; the next arg to be terminated
4687 is the name of a library file and we should try the standard
4688 search dirs for it. */
4689 static int this_is_library_file;
4691 /* Nonzero means %T has been seen; the next arg to be terminated
4692 is the name of a linker script and we should try all of the
4693 standard search dirs for it. If it is found insert a --script
4694 command line switch and then substitute the full path in place,
4695 otherwise generate an error message. */
4696 static int this_is_linker_script;
4698 /* Nonzero means that the input of this command is coming from a pipe. */
4699 static int input_from_pipe;
4701 /* Nonnull means substitute this for any suffix when outputting a switches
4702 arguments. */
4703 static const char *suffix_subst;
4705 /* If there is an argument being accumulated, terminate it and store it. */
4707 static void
4708 end_going_arg (void)
4710 if (arg_going)
4712 const char *string;
4714 obstack_1grow (&obstack, 0);
4715 string = XOBFINISH (&obstack, const char *);
4716 if (this_is_library_file)
4717 string = find_file (string);
4718 if (this_is_linker_script)
4720 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4722 if (full_script_path == NULL)
4724 error (_("unable to locate default linker script '%s' in the library search paths"), string);
4725 /* Script was not found on search path. */
4726 return;
4728 store_arg ("--script", false, false);
4729 string = full_script_path;
4731 store_arg (string, delete_this_arg, this_is_output_file);
4732 if (this_is_output_file)
4733 outfiles[input_file_number] = string;
4734 arg_going = 0;
4739 /* Parse the WRAPPER string which is a comma separated list of the command line
4740 and insert them into the beginning of argbuf. */
4742 static void
4743 insert_wrapper (const char *wrapper)
4745 int n = 0;
4746 int i;
4747 char *buf = xstrdup (wrapper);
4748 char *p = buf;
4752 n++;
4753 while (*p == ',')
4754 p++;
4756 while ((p = strchr (p, ',')) != NULL);
4758 if (argbuf_index + n >= argbuf_length)
4760 argbuf_length = argbuf_length * 2;
4761 while (argbuf_length < argbuf_index + n)
4762 argbuf_length *= 2;
4763 argbuf = XRESIZEVEC (const char *, argbuf, argbuf_length);
4765 for (i = argbuf_index - 1; i >= 0; i--)
4766 argbuf[i + n] = argbuf[i];
4768 i = 0;
4769 p = buf;
4772 while (*p == ',')
4774 *p = 0;
4775 p++;
4777 argbuf[i++] = p;
4779 while ((p = strchr (p, ',')) != NULL);
4780 gcc_assert (i == n);
4781 argbuf_index += n;
4784 /* Process the spec SPEC and run the commands specified therein.
4785 Returns 0 if the spec is successfully processed; -1 if failed. */
4788 do_spec (const char *spec)
4790 int value;
4792 value = do_spec_2 (spec);
4794 /* Force out any unfinished command.
4795 If -pipe, this forces out the last command if it ended in `|'. */
4796 if (value == 0)
4798 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4799 argbuf_index--;
4801 set_collect_gcc_options ();
4803 if (argbuf_index > 0)
4804 value = execute ();
4807 return value;
4810 static int
4811 do_spec_2 (const char *spec)
4813 int result;
4815 clear_args ();
4816 arg_going = 0;
4817 delete_this_arg = 0;
4818 this_is_output_file = 0;
4819 this_is_library_file = 0;
4820 this_is_linker_script = 0;
4821 input_from_pipe = 0;
4822 suffix_subst = NULL;
4824 result = do_spec_1 (spec, 0, NULL);
4826 end_going_arg ();
4828 return result;
4832 /* Process the given spec string and add any new options to the end
4833 of the switches/n_switches array. */
4835 static void
4836 do_option_spec (const char *name, const char *spec)
4838 unsigned int i, value_count, value_len;
4839 const char *p, *q, *value;
4840 char *tmp_spec, *tmp_spec_p;
4842 if (configure_default_options[0].name == NULL)
4843 return;
4845 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4846 if (strcmp (configure_default_options[i].name, name) == 0)
4847 break;
4848 if (i == ARRAY_SIZE (configure_default_options))
4849 return;
4851 value = configure_default_options[i].value;
4852 value_len = strlen (value);
4854 /* Compute the size of the final spec. */
4855 value_count = 0;
4856 p = spec;
4857 while ((p = strstr (p, "%(VALUE)")) != NULL)
4859 p ++;
4860 value_count ++;
4863 /* Replace each %(VALUE) by the specified value. */
4864 tmp_spec = (char *) alloca (strlen (spec) + 1
4865 + value_count * (value_len - strlen ("%(VALUE)")));
4866 tmp_spec_p = tmp_spec;
4867 q = spec;
4868 while ((p = strstr (q, "%(VALUE)")) != NULL)
4870 memcpy (tmp_spec_p, q, p - q);
4871 tmp_spec_p = tmp_spec_p + (p - q);
4872 memcpy (tmp_spec_p, value, value_len);
4873 tmp_spec_p += value_len;
4874 q = p + strlen ("%(VALUE)");
4876 strcpy (tmp_spec_p, q);
4878 do_self_spec (tmp_spec);
4881 /* Process the given spec string and add any new options to the end
4882 of the switches/n_switches array. */
4884 static void
4885 do_self_spec (const char *spec)
4887 int i;
4889 do_spec_2 (spec);
4890 do_spec_1 (" ", 0, NULL);
4892 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4893 do_self_specs adds the replacements to switches array, so it shouldn't
4894 be processed afterwards. */
4895 for (i = 0; i < n_switches; i++)
4896 if ((switches[i].live_cond & SWITCH_IGNORE))
4897 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4899 if (argbuf_index > 0)
4901 switches = XRESIZEVEC (struct switchstr, switches,
4902 n_switches + argbuf_index + 1);
4904 for (i = 0; i < argbuf_index; i++)
4906 struct switchstr *sw;
4907 const char *p = argbuf[i];
4908 int c = *p;
4910 /* Each switch should start with '-'. */
4911 if (c != '-')
4912 fatal ("switch '%s' does not start with '-'", argbuf[i]);
4914 p++;
4915 c = *p;
4917 sw = &switches[n_switches++];
4918 sw->part1 = p;
4919 sw->live_cond = 0;
4920 sw->validated = 0;
4921 sw->ordering = 0;
4923 /* Deal with option arguments in separate argv elements. */
4924 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4925 || WORD_SWITCH_TAKES_ARG (p))
4927 int j = 0;
4928 int n_args = WORD_SWITCH_TAKES_ARG (p);
4930 if (n_args == 0)
4932 /* Count only the option arguments in separate argv elements. */
4933 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4935 if (i + n_args >= argbuf_index)
4936 fatal ("argument to '-%s' is missing", p);
4937 sw->args
4938 = XNEWVEC (const char *, n_args + 1);
4939 while (j < n_args)
4940 sw->args[j++] = argbuf[++i];
4941 /* Null-terminate the vector. */
4942 sw->args[j] = 0;
4944 else if (strchr (switches_need_spaces, c))
4946 /* On some systems, ld cannot handle some options without
4947 a space. So split the option from its argument. */
4948 char *part1 = XNEWVEC (char, 2);
4949 part1[0] = c;
4950 part1[1] = '\0';
4952 sw->part1 = part1;
4953 sw->args = XNEWVEC (const char *, 2);
4954 sw->args[0] = xstrdup (p+1);
4955 sw->args[1] = 0;
4957 else
4958 sw->args = 0;
4961 switches[n_switches].part1 = 0;
4965 /* Callback for processing %D and %I specs. */
4967 struct spec_path_info {
4968 const char *option;
4969 const char *append;
4970 size_t append_len;
4971 bool omit_relative;
4972 bool separate_options;
4975 static void *
4976 spec_path (char *path, void *data)
4978 struct spec_path_info *info = (struct spec_path_info *) data;
4979 size_t len = 0;
4980 char save = 0;
4982 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4983 return NULL;
4985 if (info->append_len != 0)
4987 len = strlen (path);
4988 memcpy (path + len, info->append, info->append_len + 1);
4991 if (!is_directory (path, true))
4992 return NULL;
4994 do_spec_1 (info->option, 1, NULL);
4995 if (info->separate_options)
4996 do_spec_1 (" ", 0, NULL);
4998 if (info->append_len == 0)
5000 len = strlen (path);
5001 save = path[len - 1];
5002 if (IS_DIR_SEPARATOR (path[len - 1]))
5003 path[len - 1] = '\0';
5006 do_spec_1 (path, 1, NULL);
5007 do_spec_1 (" ", 0, NULL);
5009 /* Must not damage the original path. */
5010 if (info->append_len == 0)
5011 path[len - 1] = save;
5013 return NULL;
5016 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
5017 argument list. */
5019 static void
5020 create_at_file (char **argv)
5022 char *temp_file = make_temp_file ("");
5023 char *at_argument = concat ("@", temp_file, NULL);
5024 FILE *f = fopen (temp_file, "w");
5025 int status;
5027 if (f == NULL)
5028 fatal ("could not open temporary response file %s",
5029 temp_file);
5031 status = writeargv (argv, f);
5033 if (status)
5034 fatal ("could not write to temporary response file %s",
5035 temp_file);
5037 status = fclose (f);
5039 if (EOF == status)
5040 fatal ("could not close temporary response file %s",
5041 temp_file);
5043 store_arg (at_argument, 0, 0);
5045 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
5048 /* True if we should compile INFILE. */
5050 static bool
5051 compile_input_file_p (struct infile *infile)
5053 if ((!infile->language) || (infile->language[0] != '*'))
5054 if (infile->incompiler == input_file_compiler)
5055 return true;
5056 return false;
5059 /* Process the sub-spec SPEC as a portion of a larger spec.
5060 This is like processing a whole spec except that we do
5061 not initialize at the beginning and we do not supply a
5062 newline by default at the end.
5063 INSWITCH nonzero means don't process %-sequences in SPEC;
5064 in this case, % is treated as an ordinary character.
5065 This is used while substituting switches.
5066 INSWITCH nonzero also causes SPC not to terminate an argument.
5068 Value is zero unless a line was finished
5069 and the command on that line reported an error. */
5071 static int
5072 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
5074 const char *p = spec;
5075 int c;
5076 int i;
5077 int value;
5079 while ((c = *p++))
5080 /* If substituting a switch, treat all chars like letters.
5081 Otherwise, NL, SPC, TAB and % are special. */
5082 switch (inswitch ? 'a' : c)
5084 case '\n':
5085 end_going_arg ();
5087 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
5089 /* A `|' before the newline means use a pipe here,
5090 but only if -pipe was specified.
5091 Otherwise, execute now and don't pass the `|' as an arg. */
5092 if (use_pipes)
5094 input_from_pipe = 1;
5095 break;
5097 else
5098 argbuf_index--;
5101 set_collect_gcc_options ();
5103 if (argbuf_index > 0)
5105 value = execute ();
5106 if (value)
5107 return value;
5109 /* Reinitialize for a new command, and for a new argument. */
5110 clear_args ();
5111 arg_going = 0;
5112 delete_this_arg = 0;
5113 this_is_output_file = 0;
5114 this_is_library_file = 0;
5115 this_is_linker_script = 0;
5116 input_from_pipe = 0;
5117 break;
5119 case '|':
5120 end_going_arg ();
5122 /* Use pipe */
5123 obstack_1grow (&obstack, c);
5124 arg_going = 1;
5125 break;
5127 case '\t':
5128 case ' ':
5129 end_going_arg ();
5131 /* Reinitialize for a new argument. */
5132 delete_this_arg = 0;
5133 this_is_output_file = 0;
5134 this_is_library_file = 0;
5135 this_is_linker_script = 0;
5136 break;
5138 case '%':
5139 switch (c = *p++)
5141 case 0:
5142 fatal ("spec '%s' invalid", spec);
5144 case 'b':
5145 if (save_temps_length)
5146 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5147 else
5148 obstack_grow (&obstack, input_basename, basename_length);
5149 if (compare_debug < 0)
5150 obstack_grow (&obstack, ".gk", 3);
5151 arg_going = 1;
5152 break;
5154 case 'B':
5155 if (save_temps_length)
5156 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5157 else
5158 obstack_grow (&obstack, input_basename, suffixed_basename_length);
5159 if (compare_debug < 0)
5160 obstack_grow (&obstack, ".gk", 3);
5161 arg_going = 1;
5162 break;
5164 case 'd':
5165 delete_this_arg = 2;
5166 break;
5168 /* Dump out the directories specified with LIBRARY_PATH,
5169 followed by the absolute directories
5170 that we search for startfiles. */
5171 case 'D':
5173 struct spec_path_info info;
5175 info.option = "-L";
5176 info.append_len = 0;
5177 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
5178 /* Used on systems which record the specified -L dirs
5179 and use them to search for dynamic linking.
5180 Relative directories always come from -B,
5181 and it is better not to use them for searching
5182 at run time. In particular, stage1 loses. */
5183 info.omit_relative = true;
5184 #else
5185 info.omit_relative = false;
5186 #endif
5187 info.separate_options = false;
5189 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5191 break;
5193 case 'e':
5194 /* %efoo means report an error with `foo' as error message
5195 and don't execute any more commands for this file. */
5197 const char *q = p;
5198 char *buf;
5199 while (*p != 0 && *p != '\n')
5200 p++;
5201 buf = (char *) alloca (p - q + 1);
5202 strncpy (buf, q, p - q);
5203 buf[p - q] = 0;
5204 error ("%s", _(buf));
5205 return -1;
5207 break;
5208 case 'n':
5209 /* %nfoo means report a notice with `foo' on stderr. */
5211 const char *q = p;
5212 char *buf;
5213 while (*p != 0 && *p != '\n')
5214 p++;
5215 buf = (char *) alloca (p - q + 1);
5216 strncpy (buf, q, p - q);
5217 buf[p - q] = 0;
5218 notice ("%s\n", _(buf));
5219 if (*p)
5220 p++;
5222 break;
5224 case 'j':
5226 struct stat st;
5228 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
5229 defined, and it is not a directory, and it is
5230 writable, use it. Otherwise, treat this like any
5231 other temporary file. */
5233 if ((!save_temps_flag)
5234 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
5235 && (access (HOST_BIT_BUCKET, W_OK) == 0))
5237 obstack_grow (&obstack, HOST_BIT_BUCKET,
5238 strlen (HOST_BIT_BUCKET));
5239 delete_this_arg = 0;
5240 arg_going = 1;
5241 break;
5244 goto create_temp_file;
5245 case '|':
5246 if (use_pipes)
5248 obstack_1grow (&obstack, '-');
5249 delete_this_arg = 0;
5250 arg_going = 1;
5252 /* consume suffix */
5253 while (*p == '.' || ISALNUM ((unsigned char) *p))
5254 p++;
5255 if (p[0] == '%' && p[1] == 'O')
5256 p += 2;
5258 break;
5260 goto create_temp_file;
5261 case 'm':
5262 if (use_pipes)
5264 /* consume suffix */
5265 while (*p == '.' || ISALNUM ((unsigned char) *p))
5266 p++;
5267 if (p[0] == '%' && p[1] == 'O')
5268 p += 2;
5270 break;
5272 goto create_temp_file;
5273 case 'g':
5274 case 'u':
5275 case 'U':
5276 create_temp_file:
5278 struct temp_name *t;
5279 int suffix_length;
5280 const char *suffix = p;
5281 char *saved_suffix = NULL;
5283 while (*p == '.' || ISALNUM ((unsigned char) *p))
5284 p++;
5285 suffix_length = p - suffix;
5286 if (p[0] == '%' && p[1] == 'O')
5288 p += 2;
5289 /* We don't support extra suffix characters after %O. */
5290 if (*p == '.' || ISALNUM ((unsigned char) *p))
5291 fatal ("spec '%s' has invalid '%%0%c'", spec, *p);
5292 if (suffix_length == 0)
5293 suffix = TARGET_OBJECT_SUFFIX;
5294 else
5296 saved_suffix
5297 = XNEWVEC (char, suffix_length
5298 + strlen (TARGET_OBJECT_SUFFIX));
5299 strncpy (saved_suffix, suffix, suffix_length);
5300 strcpy (saved_suffix + suffix_length,
5301 TARGET_OBJECT_SUFFIX);
5303 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5306 if (compare_debug < 0)
5308 suffix = concat (".gk", suffix, NULL);
5309 suffix_length += 3;
5312 /* If -save-temps=obj and -o were specified, use that for the
5313 temp file. */
5314 if (save_temps_length)
5316 char *tmp;
5317 temp_filename_length
5318 = save_temps_length + suffix_length + 1;
5319 tmp = (char *) alloca (temp_filename_length);
5320 memcpy (tmp, save_temps_prefix, save_temps_length);
5321 memcpy (tmp + save_temps_length, suffix, suffix_length);
5322 tmp[save_temps_length + suffix_length] = '\0';
5323 temp_filename = save_string (tmp,
5324 temp_filename_length + 1);
5325 obstack_grow (&obstack, temp_filename,
5326 temp_filename_length);
5327 arg_going = 1;
5328 delete_this_arg = 0;
5329 break;
5332 /* If the input_filename has the same suffix specified
5333 for the %g, %u, or %U, and -save-temps is specified,
5334 we could end up using that file as an intermediate
5335 thus clobbering the user's source file (.e.g.,
5336 gcc -save-temps foo.s would clobber foo.s with the
5337 output of cpp0). So check for this condition and
5338 generate a temp file as the intermediate. */
5340 if (save_temps_flag)
5342 char *tmp;
5343 temp_filename_length = basename_length + suffix_length + 1;
5344 tmp = (char *) alloca (temp_filename_length);
5345 memcpy (tmp, input_basename, basename_length);
5346 memcpy (tmp + basename_length, suffix, suffix_length);
5347 tmp[basename_length + suffix_length] = '\0';
5348 temp_filename = tmp;
5350 if (strcmp (temp_filename, input_filename) != 0)
5352 #ifndef HOST_LACKS_INODE_NUMBERS
5353 struct stat st_temp;
5355 /* Note, set_input() resets input_stat_set to 0. */
5356 if (input_stat_set == 0)
5358 input_stat_set = stat (input_filename, &input_stat);
5359 if (input_stat_set >= 0)
5360 input_stat_set = 1;
5363 /* If we have the stat for the input_filename
5364 and we can do the stat for the temp_filename
5365 then the they could still refer to the same
5366 file if st_dev/st_ino's are the same. */
5367 if (input_stat_set != 1
5368 || stat (temp_filename, &st_temp) < 0
5369 || input_stat.st_dev != st_temp.st_dev
5370 || input_stat.st_ino != st_temp.st_ino)
5371 #else
5372 /* Just compare canonical pathnames. */
5373 char* input_realname = lrealpath (input_filename);
5374 char* temp_realname = lrealpath (temp_filename);
5375 bool files_differ = strcmp (input_realname, temp_realname);
5376 free (input_realname);
5377 free (temp_realname);
5378 if (files_differ)
5379 #endif
5381 temp_filename = save_string (temp_filename,
5382 temp_filename_length + 1);
5383 obstack_grow (&obstack, temp_filename,
5384 temp_filename_length);
5385 arg_going = 1;
5386 delete_this_arg = 0;
5387 break;
5392 /* See if we already have an association of %g/%u/%U and
5393 suffix. */
5394 for (t = temp_names; t; t = t->next)
5395 if (t->length == suffix_length
5396 && strncmp (t->suffix, suffix, suffix_length) == 0
5397 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5398 break;
5400 /* Make a new association if needed. %u and %j
5401 require one. */
5402 if (t == 0 || c == 'u' || c == 'j')
5404 if (t == 0)
5406 t = XNEW (struct temp_name);
5407 t->next = temp_names;
5408 temp_names = t;
5410 t->length = suffix_length;
5411 if (saved_suffix)
5413 t->suffix = saved_suffix;
5414 saved_suffix = NULL;
5416 else
5417 t->suffix = save_string (suffix, suffix_length);
5418 t->unique = (c == 'u' || c == 'U' || c == 'j');
5419 temp_filename = make_temp_file (t->suffix);
5420 temp_filename_length = strlen (temp_filename);
5421 t->filename = temp_filename;
5422 t->filename_length = temp_filename_length;
5425 if (saved_suffix)
5426 free (saved_suffix);
5428 obstack_grow (&obstack, t->filename, t->filename_length);
5429 delete_this_arg = 1;
5431 arg_going = 1;
5432 break;
5434 case 'i':
5435 if (combine_inputs)
5437 if (at_file_supplied)
5439 /* We are going to expand `%i' to `@FILE', where FILE
5440 is a newly-created temporary filename. The filenames
5441 that would usually be expanded in place of %o will be
5442 written to the temporary file. */
5443 char **argv;
5444 int n_files = 0;
5445 int j;
5447 for (i = 0; i < n_infiles; i++)
5448 if (compile_input_file_p (&infiles[i]))
5449 n_files++;
5451 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5453 /* Copy the strings over. */
5454 for (i = 0, j = 0; i < n_infiles; i++)
5455 if (compile_input_file_p (&infiles[i]))
5457 argv[j] = CONST_CAST (char *, infiles[i].name);
5458 infiles[i].compiled = true;
5459 j++;
5461 argv[j] = NULL;
5463 create_at_file (argv);
5465 else
5466 for (i = 0; (int) i < n_infiles; i++)
5467 if (compile_input_file_p (&infiles[i]))
5469 store_arg (infiles[i].name, 0, 0);
5470 infiles[i].compiled = true;
5473 else
5475 obstack_grow (&obstack, input_filename, input_filename_length);
5476 arg_going = 1;
5478 break;
5480 case 'I':
5482 struct spec_path_info info;
5484 if (multilib_dir)
5486 do_spec_1 ("-imultilib", 1, NULL);
5487 /* Make this a separate argument. */
5488 do_spec_1 (" ", 0, NULL);
5489 do_spec_1 (multilib_dir, 1, NULL);
5490 do_spec_1 (" ", 0, NULL);
5493 if (gcc_exec_prefix)
5495 do_spec_1 ("-iprefix", 1, NULL);
5496 /* Make this a separate argument. */
5497 do_spec_1 (" ", 0, NULL);
5498 do_spec_1 (gcc_exec_prefix, 1, NULL);
5499 do_spec_1 (" ", 0, NULL);
5502 if (target_system_root_changed ||
5503 (target_system_root && target_sysroot_hdrs_suffix))
5505 do_spec_1 ("-isysroot", 1, NULL);
5506 /* Make this a separate argument. */
5507 do_spec_1 (" ", 0, NULL);
5508 do_spec_1 (target_system_root, 1, NULL);
5509 if (target_sysroot_hdrs_suffix)
5510 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5511 do_spec_1 (" ", 0, NULL);
5514 info.option = "-isystem";
5515 info.append = "include";
5516 info.append_len = strlen (info.append);
5517 info.omit_relative = false;
5518 info.separate_options = true;
5520 for_each_path (&include_prefixes, false, info.append_len,
5521 spec_path, &info);
5523 info.append = "include-fixed";
5524 if (*sysroot_hdrs_suffix_spec)
5525 info.append = concat (info.append, dir_separator_str,
5526 multilib_dir, NULL);
5527 info.append_len = strlen (info.append);
5528 for_each_path (&include_prefixes, false, info.append_len,
5529 spec_path, &info);
5531 break;
5533 case 'o':
5535 int max = n_infiles;
5536 max += lang_specific_extra_outfiles;
5538 if (HAVE_GNU_LD && at_file_supplied)
5540 /* We are going to expand `%o' to `@FILE', where FILE
5541 is a newly-created temporary filename. The filenames
5542 that would usually be expanded in place of %o will be
5543 written to the temporary file. */
5545 char **argv;
5546 int n_files, j;
5548 /* Convert OUTFILES into a form suitable for writeargv. */
5550 /* Determine how many are non-NULL. */
5551 for (n_files = 0, i = 0; i < max; i++)
5552 n_files += outfiles[i] != NULL;
5554 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5556 /* Copy the strings over. */
5557 for (i = 0, j = 0; i < max; i++)
5558 if (outfiles[i])
5560 argv[j] = CONST_CAST (char *, outfiles[i]);
5561 j++;
5563 argv[j] = NULL;
5565 create_at_file (argv);
5567 else
5568 for (i = 0; i < max; i++)
5569 if (outfiles[i])
5570 store_arg (outfiles[i], 0, 0);
5571 break;
5574 case 'O':
5575 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5576 arg_going = 1;
5577 break;
5579 case 's':
5580 this_is_library_file = 1;
5581 break;
5583 case 'T':
5584 this_is_linker_script = 1;
5585 break;
5587 case 'V':
5588 outfiles[input_file_number] = NULL;
5589 break;
5591 case 'w':
5592 this_is_output_file = 1;
5593 break;
5595 case 'W':
5597 int cur_index = argbuf_index;
5598 /* Handle the {...} following the %W. */
5599 if (*p != '{')
5600 fatal ("spec '%s' has invalid '%%W%c", spec, *p);
5601 p = handle_braces (p + 1);
5602 if (p == 0)
5603 return -1;
5604 end_going_arg ();
5605 /* If any args were output, mark the last one for deletion
5606 on failure. */
5607 if (argbuf_index != cur_index)
5608 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
5609 break;
5612 /* %x{OPTION} records OPTION for %X to output. */
5613 case 'x':
5615 const char *p1 = p;
5616 char *string;
5618 /* Skip past the option value and make a copy. */
5619 if (*p != '{')
5620 fatal ("spec '%s' has invalid '%%x%c'", spec, *p);
5621 while (*p++ != '}')
5623 string = save_string (p1 + 1, p - p1 - 2);
5625 /* See if we already recorded this option. */
5626 for (i = 0; i < n_linker_options; i++)
5627 if (! strcmp (string, linker_options[i]))
5629 free (string);
5630 return 0;
5633 /* This option is new; add it. */
5634 add_linker_option (string, strlen (string));
5636 break;
5638 /* Dump out the options accumulated previously using %x. */
5639 case 'X':
5640 for (i = 0; i < n_linker_options; i++)
5642 do_spec_1 (linker_options[i], 1, NULL);
5643 /* Make each accumulated option a separate argument. */
5644 do_spec_1 (" ", 0, NULL);
5646 break;
5648 /* Dump out the options accumulated previously using -Wa,. */
5649 case 'Y':
5650 for (i = 0; i < n_assembler_options; i++)
5652 do_spec_1 (assembler_options[i], 1, NULL);
5653 /* Make each accumulated option a separate argument. */
5654 do_spec_1 (" ", 0, NULL);
5656 break;
5658 /* Dump out the options accumulated previously using -Wp,. */
5659 case 'Z':
5660 for (i = 0; i < n_preprocessor_options; i++)
5662 do_spec_1 (preprocessor_options[i], 1, NULL);
5663 /* Make each accumulated option a separate argument. */
5664 do_spec_1 (" ", 0, NULL);
5666 break;
5668 /* Here are digits and numbers that just process
5669 a certain constant string as a spec. */
5671 case '1':
5672 value = do_spec_1 (cc1_spec, 0, NULL);
5673 if (value != 0)
5674 return value;
5675 break;
5677 case '2':
5678 value = do_spec_1 (cc1plus_spec, 0, NULL);
5679 if (value != 0)
5680 return value;
5681 break;
5683 case 'a':
5684 value = do_spec_1 (asm_spec, 0, NULL);
5685 if (value != 0)
5686 return value;
5687 break;
5689 case 'A':
5690 value = do_spec_1 (asm_final_spec, 0, NULL);
5691 if (value != 0)
5692 return value;
5693 break;
5695 case 'C':
5697 const char *const spec
5698 = (input_file_compiler->cpp_spec
5699 ? input_file_compiler->cpp_spec
5700 : cpp_spec);
5701 value = do_spec_1 (spec, 0, NULL);
5702 if (value != 0)
5703 return value;
5705 break;
5707 case 'E':
5708 value = do_spec_1 (endfile_spec, 0, NULL);
5709 if (value != 0)
5710 return value;
5711 break;
5713 case 'l':
5714 value = do_spec_1 (link_spec, 0, NULL);
5715 if (value != 0)
5716 return value;
5717 break;
5719 case 'L':
5720 value = do_spec_1 (lib_spec, 0, NULL);
5721 if (value != 0)
5722 return value;
5723 break;
5725 case 'G':
5726 value = do_spec_1 (libgcc_spec, 0, NULL);
5727 if (value != 0)
5728 return value;
5729 break;
5731 case 'R':
5732 /* We assume there is a directory
5733 separator at the end of this string. */
5734 if (target_system_root)
5736 obstack_grow (&obstack, target_system_root,
5737 strlen (target_system_root));
5738 if (target_sysroot_suffix)
5739 obstack_grow (&obstack, target_sysroot_suffix,
5740 strlen (target_sysroot_suffix));
5742 break;
5744 case 'S':
5745 value = do_spec_1 (startfile_spec, 0, NULL);
5746 if (value != 0)
5747 return value;
5748 break;
5750 /* Here we define characters other than letters and digits. */
5752 case '{':
5753 p = handle_braces (p);
5754 if (p == 0)
5755 return -1;
5756 break;
5758 case ':':
5759 p = handle_spec_function (p);
5760 if (p == 0)
5761 return -1;
5762 break;
5764 case '%':
5765 obstack_1grow (&obstack, '%');
5766 break;
5768 case '.':
5770 unsigned len = 0;
5772 while (p[len] && p[len] != ' ' && p[len] != '%')
5773 len++;
5774 suffix_subst = save_string (p - 1, len + 1);
5775 p += len;
5777 break;
5779 /* Henceforth ignore the option(s) matching the pattern
5780 after the %<. */
5781 case '<':
5783 unsigned len = 0;
5784 int have_wildcard = 0;
5785 int i;
5787 while (p[len] && p[len] != ' ' && p[len] != '\t')
5788 len++;
5790 if (p[len-1] == '*')
5791 have_wildcard = 1;
5793 for (i = 0; i < n_switches; i++)
5794 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5795 && (have_wildcard || switches[i].part1[len] == '\0'))
5797 switches[i].live_cond |= SWITCH_IGNORE;
5798 switches[i].validated = 1;
5801 p += len;
5803 break;
5805 case '*':
5806 if (soft_matched_part)
5808 do_spec_1 (soft_matched_part, 1, NULL);
5809 do_spec_1 (" ", 0, NULL);
5811 else
5812 /* Catch the case where a spec string contains something like
5813 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5814 hand side of the :. */
5815 error ("spec failure: '%%*' has not been initialized by pattern match");
5816 break;
5818 /* Process a string found as the value of a spec given by name.
5819 This feature allows individual machine descriptions
5820 to add and use their own specs.
5821 %[...] modifies -D options the way %P does;
5822 %(...) uses the spec unmodified. */
5823 case '[':
5824 error ("warning: use of obsolete %%[ operator in specs");
5825 case '(':
5827 const char *name = p;
5828 struct spec_list *sl;
5829 int len;
5831 /* The string after the S/P is the name of a spec that is to be
5832 processed. */
5833 while (*p && *p != ')' && *p != ']')
5834 p++;
5836 /* See if it's in the list. */
5837 for (len = p - name, sl = specs; sl; sl = sl->next)
5838 if (sl->name_len == len && !strncmp (sl->name, name, len))
5840 name = *(sl->ptr_spec);
5841 #ifdef DEBUG_SPECS
5842 notice ("Processing spec %c%s%c, which is '%s'\n",
5843 c, sl->name, (c == '(') ? ')' : ']', name);
5844 #endif
5845 break;
5848 if (sl)
5850 if (c == '(')
5852 value = do_spec_1 (name, 0, NULL);
5853 if (value != 0)
5854 return value;
5856 else
5858 char *x = (char *) alloca (strlen (name) * 2 + 1);
5859 char *buf = x;
5860 const char *y = name;
5861 int flag = 0;
5863 /* Copy all of NAME into BUF, but put __ after
5864 every -D and at the end of each arg. */
5865 while (1)
5867 if (! strncmp (y, "-D", 2))
5869 *x++ = '-';
5870 *x++ = 'D';
5871 *x++ = '_';
5872 *x++ = '_';
5873 y += 2;
5874 flag = 1;
5875 continue;
5877 else if (flag
5878 && (*y == ' ' || *y == '\t' || *y == '='
5879 || *y == '}' || *y == 0))
5881 *x++ = '_';
5882 *x++ = '_';
5883 flag = 0;
5885 if (*y == 0)
5886 break;
5887 else
5888 *x++ = *y++;
5890 *x = 0;
5892 value = do_spec_1 (buf, 0, NULL);
5893 if (value != 0)
5894 return value;
5898 /* Discard the closing paren or bracket. */
5899 if (*p)
5900 p++;
5902 break;
5904 default:
5905 error ("spec failure: unrecognized spec option '%c'", c);
5906 break;
5908 break;
5910 case '\\':
5911 /* Backslash: treat next character as ordinary. */
5912 c = *p++;
5914 /* Fall through. */
5915 default:
5916 /* Ordinary character: put it into the current argument. */
5917 obstack_1grow (&obstack, c);
5918 arg_going = 1;
5921 /* End of string. If we are processing a spec function, we need to
5922 end any pending argument. */
5923 if (processing_spec_function)
5924 end_going_arg ();
5926 return 0;
5929 /* Look up a spec function. */
5931 static const struct spec_function *
5932 lookup_spec_function (const char *name)
5934 const struct spec_function *sf;
5936 for (sf = static_spec_functions; sf->name != NULL; sf++)
5937 if (strcmp (sf->name, name) == 0)
5938 return sf;
5940 return NULL;
5943 /* Evaluate a spec function. */
5945 static const char *
5946 eval_spec_function (const char *func, const char *args)
5948 const struct spec_function *sf;
5949 const char *funcval;
5951 /* Saved spec processing context. */
5952 int save_argbuf_index;
5953 int save_argbuf_length;
5954 const char **save_argbuf;
5956 int save_arg_going;
5957 int save_delete_this_arg;
5958 int save_this_is_output_file;
5959 int save_this_is_library_file;
5960 int save_input_from_pipe;
5961 int save_this_is_linker_script;
5962 const char *save_suffix_subst;
5965 sf = lookup_spec_function (func);
5966 if (sf == NULL)
5967 fatal ("unknown spec function '%s'", func);
5969 /* Push the spec processing context. */
5970 save_argbuf_index = argbuf_index;
5971 save_argbuf_length = argbuf_length;
5972 save_argbuf = argbuf;
5974 save_arg_going = arg_going;
5975 save_delete_this_arg = delete_this_arg;
5976 save_this_is_output_file = this_is_output_file;
5977 save_this_is_library_file = this_is_library_file;
5978 save_this_is_linker_script = this_is_linker_script;
5979 save_input_from_pipe = input_from_pipe;
5980 save_suffix_subst = suffix_subst;
5982 /* Create a new spec processing context, and build the function
5983 arguments. */
5985 alloc_args ();
5986 if (do_spec_2 (args) < 0)
5987 fatal ("error in args to spec function '%s'", func);
5989 /* argbuf_index is an index for the next argument to be inserted, and
5990 so contains the count of the args already inserted. */
5992 funcval = (*sf->func) (argbuf_index, argbuf);
5994 /* Pop the spec processing context. */
5995 argbuf_index = save_argbuf_index;
5996 argbuf_length = save_argbuf_length;
5997 free (argbuf);
5998 argbuf = save_argbuf;
6000 arg_going = save_arg_going;
6001 delete_this_arg = save_delete_this_arg;
6002 this_is_output_file = save_this_is_output_file;
6003 this_is_library_file = save_this_is_library_file;
6004 this_is_linker_script = save_this_is_linker_script;
6005 input_from_pipe = save_input_from_pipe;
6006 suffix_subst = save_suffix_subst;
6008 return funcval;
6011 /* Handle a spec function call of the form:
6013 %:function(args)
6015 ARGS is processed as a spec in a separate context and split into an
6016 argument vector in the normal fashion. The function returns a string
6017 containing a spec which we then process in the caller's context, or
6018 NULL if no processing is required. */
6020 static const char *
6021 handle_spec_function (const char *p)
6023 char *func, *args;
6024 const char *endp, *funcval;
6025 int count;
6027 processing_spec_function++;
6029 /* Get the function name. */
6030 for (endp = p; *endp != '\0'; endp++)
6032 if (*endp == '(') /* ) */
6033 break;
6034 /* Only allow [A-Za-z0-9], -, and _ in function names. */
6035 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
6036 fatal ("malformed spec function name");
6038 if (*endp != '(') /* ) */
6039 fatal ("no arguments for spec function");
6040 func = save_string (p, endp - p);
6041 p = ++endp;
6043 /* Get the arguments. */
6044 for (count = 0; *endp != '\0'; endp++)
6046 /* ( */
6047 if (*endp == ')')
6049 if (count == 0)
6050 break;
6051 count--;
6053 else if (*endp == '(') /* ) */
6054 count++;
6056 /* ( */
6057 if (*endp != ')')
6058 fatal ("malformed spec function arguments");
6059 args = save_string (p, endp - p);
6060 p = ++endp;
6062 /* p now points to just past the end of the spec function expression. */
6064 funcval = eval_spec_function (func, args);
6065 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
6066 p = NULL;
6068 free (func);
6069 free (args);
6071 processing_spec_function--;
6073 return p;
6076 /* Inline subroutine of handle_braces. Returns true if the current
6077 input suffix matches the atom bracketed by ATOM and END_ATOM. */
6078 static inline bool
6079 input_suffix_matches (const char *atom, const char *end_atom)
6081 return (input_suffix
6082 && !strncmp (input_suffix, atom, end_atom - atom)
6083 && input_suffix[end_atom - atom] == '\0');
6086 /* Subroutine of handle_braces. Returns true if the current
6087 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
6088 static bool
6089 input_spec_matches (const char *atom, const char *end_atom)
6091 return (input_file_compiler
6092 && input_file_compiler->suffix
6093 && input_file_compiler->suffix[0] != '\0'
6094 && !strncmp (input_file_compiler->suffix + 1, atom,
6095 end_atom - atom)
6096 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
6099 /* Subroutine of handle_braces. Returns true if a switch
6100 matching the atom bracketed by ATOM and END_ATOM appeared on the
6101 command line. */
6102 static bool
6103 switch_matches (const char *atom, const char *end_atom, int starred)
6105 int i;
6106 int len = end_atom - atom;
6107 int plen = starred ? len : -1;
6109 for (i = 0; i < n_switches; i++)
6110 if (!strncmp (switches[i].part1, atom, len)
6111 && (starred || switches[i].part1[len] == '\0')
6112 && check_live_switch (i, plen))
6113 return true;
6115 return false;
6118 /* Inline subroutine of handle_braces. Mark all of the switches which
6119 match ATOM (extends to END_ATOM; STARRED indicates whether there
6120 was a star after the atom) for later processing. */
6121 static inline void
6122 mark_matching_switches (const char *atom, const char *end_atom, int starred)
6124 int i;
6125 int len = end_atom - atom;
6126 int plen = starred ? len : -1;
6128 for (i = 0; i < n_switches; i++)
6129 if (!strncmp (switches[i].part1, atom, len)
6130 && (starred || switches[i].part1[len] == '\0')
6131 && check_live_switch (i, plen))
6132 switches[i].ordering = 1;
6135 /* Inline subroutine of handle_braces. Process all the currently
6136 marked switches through give_switch, and clear the marks. */
6137 static inline void
6138 process_marked_switches (void)
6140 int i;
6142 for (i = 0; i < n_switches; i++)
6143 if (switches[i].ordering == 1)
6145 switches[i].ordering = 0;
6146 give_switch (i, 0);
6150 /* Handle a %{ ... } construct. P points just inside the leading {.
6151 Returns a pointer one past the end of the brace block, or 0
6152 if we call do_spec_1 and that returns -1. */
6154 static const char *
6155 handle_braces (const char *p)
6157 const char *atom, *end_atom;
6158 const char *d_atom = NULL, *d_end_atom = NULL;
6159 const char *orig = p;
6161 bool a_is_suffix;
6162 bool a_is_spectype;
6163 bool a_is_starred;
6164 bool a_is_negated;
6165 bool a_matched;
6167 bool a_must_be_last = false;
6168 bool ordered_set = false;
6169 bool disjunct_set = false;
6170 bool disj_matched = false;
6171 bool disj_starred = true;
6172 bool n_way_choice = false;
6173 bool n_way_matched = false;
6175 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6179 if (a_must_be_last)
6180 goto invalid;
6182 /* Scan one "atom" (S in the description above of %{}, possibly
6183 with '!', '.', '@', ',', or '*' modifiers). */
6184 a_matched = false;
6185 a_is_suffix = false;
6186 a_is_starred = false;
6187 a_is_negated = false;
6188 a_is_spectype = false;
6190 SKIP_WHITE();
6191 if (*p == '!')
6192 p++, a_is_negated = true;
6194 SKIP_WHITE();
6195 if (*p == '.')
6196 p++, a_is_suffix = true;
6197 else if (*p == ',')
6198 p++, a_is_spectype = true;
6200 atom = p;
6201 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
6202 || *p == ',' || *p == '.' || *p == '@')
6203 p++;
6204 end_atom = p;
6206 if (*p == '*')
6207 p++, a_is_starred = 1;
6209 SKIP_WHITE();
6210 switch (*p)
6212 case '&': case '}':
6213 /* Substitute the switch(es) indicated by the current atom. */
6214 ordered_set = true;
6215 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
6216 || a_is_spectype || atom == end_atom)
6217 goto invalid;
6219 mark_matching_switches (atom, end_atom, a_is_starred);
6221 if (*p == '}')
6222 process_marked_switches ();
6223 break;
6225 case '|': case ':':
6226 /* Substitute some text if the current atom appears as a switch
6227 or suffix. */
6228 disjunct_set = true;
6229 if (ordered_set)
6230 goto invalid;
6232 if (atom == end_atom)
6234 if (!n_way_choice || disj_matched || *p == '|'
6235 || a_is_negated || a_is_suffix || a_is_spectype
6236 || a_is_starred)
6237 goto invalid;
6239 /* An empty term may appear as the last choice of an
6240 N-way choice set; it means "otherwise". */
6241 a_must_be_last = true;
6242 disj_matched = !n_way_matched;
6243 disj_starred = false;
6245 else
6247 if ((a_is_suffix || a_is_spectype) && a_is_starred)
6248 goto invalid;
6250 if (!a_is_starred)
6251 disj_starred = false;
6253 /* Don't bother testing this atom if we already have a
6254 match. */
6255 if (!disj_matched && !n_way_matched)
6257 if (a_is_suffix)
6258 a_matched = input_suffix_matches (atom, end_atom);
6259 else if (a_is_spectype)
6260 a_matched = input_spec_matches (atom, end_atom);
6261 else
6262 a_matched = switch_matches (atom, end_atom, a_is_starred);
6264 if (a_matched != a_is_negated)
6266 disj_matched = true;
6267 d_atom = atom;
6268 d_end_atom = end_atom;
6273 if (*p == ':')
6275 /* Found the body, that is, the text to substitute if the
6276 current disjunction matches. */
6277 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
6278 disj_matched && !n_way_matched);
6279 if (p == 0)
6280 return 0;
6282 /* If we have an N-way choice, reset state for the next
6283 disjunction. */
6284 if (*p == ';')
6286 n_way_choice = true;
6287 n_way_matched |= disj_matched;
6288 disj_matched = false;
6289 disj_starred = true;
6290 d_atom = d_end_atom = NULL;
6293 break;
6295 default:
6296 goto invalid;
6299 while (*p++ != '}');
6301 return p;
6303 invalid:
6304 fatal ("braced spec '%s' is invalid at '%c'", orig, *p);
6306 #undef SKIP_WHITE
6309 /* Subroutine of handle_braces. Scan and process a brace substitution body
6310 (X in the description of %{} syntax). P points one past the colon;
6311 ATOM and END_ATOM bracket the first atom which was found to be true
6312 (present) in the current disjunction; STARRED indicates whether all
6313 the atoms in the current disjunction were starred (for syntax validation);
6314 MATCHED indicates whether the disjunction matched or not, and therefore
6315 whether or not the body is to be processed through do_spec_1 or just
6316 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
6317 returns -1. */
6319 static const char *
6320 process_brace_body (const char *p, const char *atom, const char *end_atom,
6321 int starred, int matched)
6323 const char *body, *end_body;
6324 unsigned int nesting_level;
6325 bool have_subst = false;
6327 /* Locate the closing } or ;, honoring nested braces.
6328 Trim trailing whitespace. */
6329 body = p;
6330 nesting_level = 1;
6331 for (;;)
6333 if (*p == '{')
6334 nesting_level++;
6335 else if (*p == '}')
6337 if (!--nesting_level)
6338 break;
6340 else if (*p == ';' && nesting_level == 1)
6341 break;
6342 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
6343 have_subst = true;
6344 else if (*p == '\0')
6345 goto invalid;
6346 p++;
6349 end_body = p;
6350 while (end_body[-1] == ' ' || end_body[-1] == '\t')
6351 end_body--;
6353 if (have_subst && !starred)
6354 goto invalid;
6356 if (matched)
6358 /* Copy the substitution body to permanent storage and execute it.
6359 If have_subst is false, this is a simple matter of running the
6360 body through do_spec_1... */
6361 char *string = save_string (body, end_body - body);
6362 if (!have_subst)
6364 if (do_spec_1 (string, 0, NULL) < 0)
6365 return 0;
6367 else
6369 /* ... but if have_subst is true, we have to process the
6370 body once for each matching switch, with %* set to the
6371 variant part of the switch. */
6372 unsigned int hard_match_len = end_atom - atom;
6373 int i;
6375 for (i = 0; i < n_switches; i++)
6376 if (!strncmp (switches[i].part1, atom, hard_match_len)
6377 && check_live_switch (i, hard_match_len))
6379 if (do_spec_1 (string, 0,
6380 &switches[i].part1[hard_match_len]) < 0)
6381 return 0;
6382 /* Pass any arguments this switch has. */
6383 give_switch (i, 1);
6384 suffix_subst = NULL;
6389 return p;
6391 invalid:
6392 fatal ("braced spec body '%s' is invalid", body);
6395 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6396 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
6397 spec, or -1 if either exact match or %* is used.
6399 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
6400 whose value does not begin with "no-" is obsoleted by the same value
6401 with the "no-", similarly for a switch with the "no-" prefix. */
6403 static int
6404 check_live_switch (int switchnum, int prefix_length)
6406 const char *name = switches[switchnum].part1;
6407 int i;
6409 /* If we already processed this switch and determined if it was
6410 live or not, return our past determination. */
6411 if (switches[switchnum].live_cond != 0)
6412 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6413 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
6414 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6415 == 0);
6417 /* In the common case of {<at-most-one-letter>*}, a negating
6418 switch would always match, so ignore that case. We will just
6419 send the conflicting switches to the compiler phase. */
6420 if (prefix_length >= 0 && prefix_length <= 1)
6421 return 1;
6423 /* Now search for duplicate in a manner that depends on the name. */
6424 switch (*name)
6426 case 'O':
6427 for (i = switchnum + 1; i < n_switches; i++)
6428 if (switches[i].part1[0] == 'O')
6430 switches[switchnum].validated = 1;
6431 switches[switchnum].live_cond = SWITCH_FALSE;
6432 return 0;
6434 break;
6436 case 'W': case 'f': case 'm':
6437 if (! strncmp (name + 1, "no-", 3))
6439 /* We have Xno-YYY, search for XYYY. */
6440 for (i = switchnum + 1; i < n_switches; i++)
6441 if (switches[i].part1[0] == name[0]
6442 && ! strcmp (&switches[i].part1[1], &name[4]))
6444 switches[switchnum].validated = 1;
6445 switches[switchnum].live_cond = SWITCH_FALSE;
6446 return 0;
6449 else
6451 /* We have XYYY, search for Xno-YYY. */
6452 for (i = switchnum + 1; i < n_switches; i++)
6453 if (switches[i].part1[0] == name[0]
6454 && switches[i].part1[1] == 'n'
6455 && switches[i].part1[2] == 'o'
6456 && switches[i].part1[3] == '-'
6457 && !strcmp (&switches[i].part1[4], &name[1]))
6459 switches[switchnum].validated = 1;
6460 switches[switchnum].live_cond = SWITCH_FALSE;
6461 return 0;
6464 break;
6467 /* Otherwise the switch is live. */
6468 switches[switchnum].live_cond |= SWITCH_LIVE;
6469 return 1;
6472 /* Pass a switch to the current accumulating command
6473 in the same form that we received it.
6474 SWITCHNUM identifies the switch; it is an index into
6475 the vector of switches gcc received, which is `switches'.
6476 This cannot fail since it never finishes a command line.
6478 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6480 static void
6481 give_switch (int switchnum, int omit_first_word)
6483 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6484 return;
6486 if (!omit_first_word)
6488 do_spec_1 ("-", 0, NULL);
6489 do_spec_1 (switches[switchnum].part1, 1, NULL);
6492 if (switches[switchnum].args != 0)
6494 const char **p;
6495 for (p = switches[switchnum].args; *p; p++)
6497 const char *arg = *p;
6499 do_spec_1 (" ", 0, NULL);
6500 if (suffix_subst)
6502 unsigned length = strlen (arg);
6503 int dot = 0;
6505 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6506 if (arg[length] == '.')
6508 (CONST_CAST(char *, arg))[length] = 0;
6509 dot = 1;
6510 break;
6512 do_spec_1 (arg, 1, NULL);
6513 if (dot)
6514 (CONST_CAST(char *, arg))[length] = '.';
6515 do_spec_1 (suffix_subst, 1, NULL);
6517 else
6518 do_spec_1 (arg, 1, NULL);
6522 do_spec_1 (" ", 0, NULL);
6523 switches[switchnum].validated = 1;
6526 /* Search for a file named NAME trying various prefixes including the
6527 user's -B prefix and some standard ones.
6528 Return the absolute file name found. If nothing is found, return NAME. */
6530 static const char *
6531 find_file (const char *name)
6533 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6534 return newname ? newname : name;
6537 /* Determine whether a directory exists. If LINKER, return 0 for
6538 certain fixed names not needed by the linker. */
6540 static int
6541 is_directory (const char *path1, bool linker)
6543 int len1;
6544 char *path;
6545 char *cp;
6546 struct stat st;
6548 /* Ensure the string ends with "/.". The resulting path will be a
6549 directory even if the given path is a symbolic link. */
6550 len1 = strlen (path1);
6551 path = (char *) alloca (3 + len1);
6552 memcpy (path, path1, len1);
6553 cp = path + len1;
6554 if (!IS_DIR_SEPARATOR (cp[-1]))
6555 *cp++ = DIR_SEPARATOR;
6556 *cp++ = '.';
6557 *cp = '\0';
6559 /* Exclude directories that the linker is known to search. */
6560 if (linker
6561 && IS_DIR_SEPARATOR (path[0])
6562 && ((cp - path == 6
6563 && strncmp (path + 1, "lib", 3) == 0)
6564 || (cp - path == 10
6565 && strncmp (path + 1, "usr", 3) == 0
6566 && IS_DIR_SEPARATOR (path[4])
6567 && strncmp (path + 5, "lib", 3) == 0)))
6568 return 0;
6570 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6573 /* Set up the various global variables to indicate that we're processing
6574 the input file named FILENAME. */
6576 void
6577 set_input (const char *filename)
6579 const char *p;
6581 input_filename = filename;
6582 input_filename_length = strlen (input_filename);
6583 input_basename = lbasename (input_filename);
6585 /* Find a suffix starting with the last period,
6586 and set basename_length to exclude that suffix. */
6587 basename_length = strlen (input_basename);
6588 suffixed_basename_length = basename_length;
6589 p = input_basename + basename_length;
6590 while (p != input_basename && *p != '.')
6591 --p;
6592 if (*p == '.' && p != input_basename)
6594 basename_length = p - input_basename;
6595 input_suffix = p + 1;
6597 else
6598 input_suffix = "";
6600 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6601 we will need to do a stat on the input_filename. The
6602 INPUT_STAT_SET signals that the stat is needed. */
6603 input_stat_set = 0;
6606 /* On fatal signals, delete all the temporary files. */
6608 static void
6609 fatal_error (int signum)
6611 signal (signum, SIG_DFL);
6612 delete_failure_queue ();
6613 delete_temp_files ();
6614 /* Get the same signal again, this time not handled,
6615 so its normal effect occurs. */
6616 kill (getpid (), signum);
6619 /* Compare the contents of the two files named CMPFILE[0] and
6620 CMPFILE[1]. Return zero if they're identical, nonzero
6621 otherwise. */
6623 static int
6624 compare_files (char *cmpfile[])
6626 int ret = 0;
6627 FILE *temp[2] = { NULL, NULL };
6628 int i;
6630 #if HAVE_MMAP_FILE
6632 size_t length[2];
6633 void *map[2] = { NULL, NULL };
6635 for (i = 0; i < 2; i++)
6637 struct stat st;
6639 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6641 error ("%s: could not determine length of compare-debug file %s",
6642 input_filename, cmpfile[i]);
6643 ret = 1;
6644 break;
6647 length[i] = st.st_size;
6650 if (!ret && length[0] != length[1])
6652 error ("%s: -fcompare-debug failure (length)", input_filename);
6653 ret = 1;
6656 if (!ret)
6657 for (i = 0; i < 2; i++)
6659 int fd = open (cmpfile[i], O_RDONLY);
6660 if (fd < 0)
6662 error ("%s: could not open compare-debug file %s",
6663 input_filename, cmpfile[i]);
6664 ret = 1;
6665 break;
6668 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6669 close (fd);
6671 if (map[i] == (void *) MAP_FAILED)
6673 ret = -1;
6674 break;
6678 if (!ret)
6680 if (memcmp (map[0], map[1], length[0]) != 0)
6682 error ("%s: -fcompare-debug failure", input_filename);
6683 ret = 1;
6687 for (i = 0; i < 2; i++)
6688 if (map[i])
6689 munmap ((caddr_t) map[i], length[i]);
6691 if (ret >= 0)
6692 return ret;
6694 ret = 0;
6696 #endif
6698 for (i = 0; i < 2; i++)
6700 temp[i] = fopen (cmpfile[i], "r");
6701 if (!temp[i])
6703 error ("%s: could not open compare-debug file %s",
6704 input_filename, cmpfile[i]);
6705 ret = 1;
6706 break;
6710 if (!ret && temp[0] && temp[1])
6711 for (;;)
6713 int c0, c1;
6714 c0 = fgetc (temp[0]);
6715 c1 = fgetc (temp[1]);
6717 if (c0 != c1)
6719 error ("%s: -fcompare-debug failure",
6720 input_filename);
6721 ret = 1;
6722 break;
6725 if (c0 == EOF)
6726 break;
6729 for (i = 1; i >= 0; i--)
6731 if (temp[i])
6732 fclose (temp[i]);
6735 return ret;
6738 extern int main (int, char **);
6741 main (int argc, char **argv)
6743 size_t i;
6744 int value;
6745 int linker_was_run = 0;
6746 int lang_n_infiles = 0;
6747 int num_linker_inputs = 0;
6748 char *explicit_link_files;
6749 char *specs_file;
6750 const char *p;
6751 struct user_specs *uptr;
6752 char **old_argv = argv;
6754 /* Initialize here, not in definition. The IRIX 6 O32 cc sometimes chokes
6755 on ?: in file-scope variable initializations. */
6756 asm_debug = ASM_DEBUG_SPEC;
6758 p = argv[0] + strlen (argv[0]);
6759 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6760 --p;
6761 programname = p;
6763 xmalloc_set_program_name (programname);
6765 expandargv (&argc, &argv);
6767 /* Determine if any expansions were made. */
6768 if (argv != old_argv)
6769 at_file_supplied = true;
6771 prune_options (&argc, &argv);
6773 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6774 /* Perform host dependent initialization when needed. */
6775 GCC_DRIVER_HOST_INITIALIZATION;
6776 #endif
6778 /* Unlock the stdio streams. */
6779 unlock_std_streams ();
6781 gcc_init_libintl ();
6783 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6784 signal (SIGINT, fatal_error);
6785 #ifdef SIGHUP
6786 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6787 signal (SIGHUP, fatal_error);
6788 #endif
6789 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6790 signal (SIGTERM, fatal_error);
6791 #ifdef SIGPIPE
6792 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6793 signal (SIGPIPE, fatal_error);
6794 #endif
6795 #ifdef SIGCHLD
6796 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6797 receive the signal. A different setting is inheritable */
6798 signal (SIGCHLD, SIG_DFL);
6799 #endif
6801 /* Allocate the argument vector. */
6802 alloc_args ();
6804 obstack_init (&obstack);
6806 /* Build multilib_select, et. al from the separate lines that make up each
6807 multilib selection. */
6809 const char *const *q = multilib_raw;
6810 int need_space;
6812 obstack_init (&multilib_obstack);
6813 while ((p = *q++) != (char *) 0)
6814 obstack_grow (&multilib_obstack, p, strlen (p));
6816 obstack_1grow (&multilib_obstack, 0);
6817 multilib_select = XOBFINISH (&multilib_obstack, const char *);
6819 q = multilib_matches_raw;
6820 while ((p = *q++) != (char *) 0)
6821 obstack_grow (&multilib_obstack, p, strlen (p));
6823 obstack_1grow (&multilib_obstack, 0);
6824 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6826 q = multilib_exclusions_raw;
6827 while ((p = *q++) != (char *) 0)
6828 obstack_grow (&multilib_obstack, p, strlen (p));
6830 obstack_1grow (&multilib_obstack, 0);
6831 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6833 need_space = FALSE;
6834 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6836 if (need_space)
6837 obstack_1grow (&multilib_obstack, ' ');
6838 obstack_grow (&multilib_obstack,
6839 multilib_defaults_raw[i],
6840 strlen (multilib_defaults_raw[i]));
6841 need_space = TRUE;
6844 obstack_1grow (&multilib_obstack, 0);
6845 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6848 #ifdef INIT_ENVIRONMENT
6849 /* Set up any other necessary machine specific environment variables. */
6850 xputenv (INIT_ENVIRONMENT);
6851 #endif
6853 /* Make a table of what switches there are (switches, n_switches).
6854 Make a table of specified input files (infiles, n_infiles).
6855 Decode switches that are handled locally. */
6857 process_command (argc, CONST_CAST2 (const char **, char **, argv));
6859 /* Initialize the vector of specs to just the default.
6860 This means one element containing 0s, as a terminator. */
6862 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
6863 memcpy (compilers, default_compilers, sizeof default_compilers);
6864 n_compilers = n_default_compilers;
6866 /* Read specs from a file if there is one. */
6868 machine_suffix = concat (spec_machine, dir_separator_str,
6869 spec_version, dir_separator_str, NULL);
6870 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6872 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
6873 /* Read the specs file unless it is a default one. */
6874 if (specs_file != 0 && strcmp (specs_file, "specs"))
6875 read_specs (specs_file, TRUE);
6876 else
6877 init_spec ();
6879 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6880 for any override of as, ld and libraries. */
6881 specs_file = (char *) alloca (strlen (standard_exec_prefix)
6882 + strlen (just_machine_suffix) + sizeof ("specs"));
6884 strcpy (specs_file, standard_exec_prefix);
6885 strcat (specs_file, just_machine_suffix);
6886 strcat (specs_file, "specs");
6887 if (access (specs_file, R_OK) == 0)
6888 read_specs (specs_file, TRUE);
6890 /* Process any configure-time defaults specified for the command line
6891 options, via OPTION_DEFAULT_SPECS. */
6892 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6893 do_option_spec (option_default_specs[i].name,
6894 option_default_specs[i].spec);
6896 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6897 of the command line. */
6899 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6900 do_self_spec (driver_self_specs[i]);
6902 if (compare_debug)
6904 enum save_temps save;
6906 if (!compare_debug_second)
6908 n_switches_debug_check[1] = n_switches;
6909 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
6910 n_switches + 1);
6912 do_self_spec ("%:compare-debug-self-opt()");
6913 n_switches_debug_check[0] = n_switches;
6914 switches_debug_check[0] = switches;
6916 n_switches = n_switches_debug_check[1];
6917 switches = switches_debug_check[1];
6920 /* Avoid crash when computing %j in this early. */
6921 save = save_temps_flag;
6922 save_temps_flag = SAVE_TEMPS_NONE;
6924 compare_debug = -compare_debug;
6925 do_self_spec ("%:compare-debug-self-opt()");
6927 save_temps_flag = save;
6929 if (!compare_debug_second)
6931 n_switches_debug_check[1] = n_switches;
6932 switches_debug_check[1] = switches;
6933 compare_debug = -compare_debug;
6934 n_switches = n_switches_debug_check[0];
6935 switches = switches_debug_check[0];
6939 /* If not cross-compiling, look for executables in the standard
6940 places. */
6941 if (*cross_compile == '0')
6943 if (*md_exec_prefix)
6945 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6946 PREFIX_PRIORITY_LAST, 0, 0);
6950 /* Process sysroot_suffix_spec. */
6951 if (*sysroot_suffix_spec != 0
6952 && do_spec_2 (sysroot_suffix_spec) == 0)
6954 if (argbuf_index > 1)
6955 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6956 else if (argbuf_index == 1)
6957 target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6960 #ifdef HAVE_LD_SYSROOT
6961 /* Pass the --sysroot option to the linker, if it supports that. If
6962 there is a sysroot_suffix_spec, it has already been processed by
6963 this point, so target_system_root really is the system root we
6964 should be using. */
6965 if (target_system_root)
6967 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6968 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6969 set_spec ("link", XOBFINISH (&obstack, const char *));
6971 #endif
6973 /* Process sysroot_hdrs_suffix_spec. */
6974 if (*sysroot_hdrs_suffix_spec != 0
6975 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6977 if (argbuf_index > 1)
6978 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6979 else if (argbuf_index == 1)
6980 target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6983 /* Look for startfiles in the standard places. */
6984 if (*startfile_prefix_spec != 0
6985 && do_spec_2 (startfile_prefix_spec) == 0
6986 && do_spec_1 (" ", 0, NULL) == 0)
6988 int ndx;
6989 for (ndx = 0; ndx < argbuf_index; ndx++)
6990 add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6991 PREFIX_PRIORITY_LAST, 0, 1);
6993 /* We should eventually get rid of all these and stick to
6994 startfile_prefix_spec exclusively. */
6995 else if (*cross_compile == '0' || target_system_root)
6997 if (*md_startfile_prefix)
6998 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6999 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7001 if (*md_startfile_prefix_1)
7002 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
7003 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
7005 /* If standard_startfile_prefix is relative, base it on
7006 standard_exec_prefix. This lets us move the installed tree
7007 as a unit. If GCC_EXEC_PREFIX is defined, base
7008 standard_startfile_prefix on that as well.
7010 If the prefix is relative, only search it for native compilers;
7011 otherwise we will search a directory containing host libraries. */
7012 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
7013 add_sysrooted_prefix (&startfile_prefixes,
7014 standard_startfile_prefix, "BINUTILS",
7015 PREFIX_PRIORITY_LAST, 0, 1);
7016 else if (*cross_compile == '0')
7018 add_prefix (&startfile_prefixes,
7019 concat (gcc_exec_prefix
7020 ? gcc_exec_prefix : standard_exec_prefix,
7021 machine_suffix,
7022 standard_startfile_prefix, NULL),
7023 NULL, PREFIX_PRIORITY_LAST, 0, 1);
7026 /* Sysrooted prefixes are relocated because target_system_root is
7027 also relocated by gcc_exec_prefix. */
7028 if (*standard_startfile_prefix_1)
7029 add_sysrooted_prefix (&startfile_prefixes,
7030 standard_startfile_prefix_1, "BINUTILS",
7031 PREFIX_PRIORITY_LAST, 0, 1);
7032 if (*standard_startfile_prefix_2)
7033 add_sysrooted_prefix (&startfile_prefixes,
7034 standard_startfile_prefix_2, "BINUTILS",
7035 PREFIX_PRIORITY_LAST, 0, 1);
7038 /* Process any user specified specs in the order given on the command
7039 line. */
7040 for (uptr = user_specs_head; uptr; uptr = uptr->next)
7042 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
7043 R_OK, true);
7044 read_specs (filename ? filename : uptr->filename, FALSE);
7047 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
7048 if (gcc_exec_prefix)
7049 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
7050 spec_version, dir_separator_str, NULL);
7052 /* Now we have the specs.
7053 Set the `valid' bits for switches that match anything in any spec. */
7055 validate_all_switches ();
7057 /* Now that we have the switches and the specs, set
7058 the subdirectory based on the options. */
7059 set_multilib_dir ();
7061 /* Set up to remember the pathname of gcc and any options
7062 needed for collect. We use argv[0] instead of programname because
7063 we need the complete pathname. */
7064 obstack_init (&collect_obstack);
7065 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
7066 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
7067 xputenv (XOBFINISH (&collect_obstack, char *));
7069 /* Set up to remember the pathname of the lto wrapper. */
7071 lto_wrapper_spec = find_a_file (&exec_prefixes, "lto-wrapper", X_OK, false);
7072 if (lto_wrapper_spec)
7074 obstack_init (&collect_obstack);
7075 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
7076 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
7077 obstack_grow (&collect_obstack, lto_wrapper_spec,
7078 strlen (lto_wrapper_spec) + 1);
7079 xputenv (XOBFINISH (&collect_obstack, char *));
7082 /* Warn about any switches that no pass was interested in. */
7084 for (i = 0; (int) i < n_switches; i++)
7085 if (! switches[i].validated)
7086 error ("unrecognized option '-%s'", switches[i].part1);
7088 /* Obey some of the options. */
7090 if (print_search_dirs)
7092 printf (_("install: %s%s\n"),
7093 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
7094 gcc_exec_prefix ? "" : machine_suffix);
7095 printf (_("programs: %s\n"),
7096 build_search_list (&exec_prefixes, "", false, false));
7097 printf (_("libraries: %s\n"),
7098 build_search_list (&startfile_prefixes, "", false, true));
7099 return (0);
7102 if (print_file_name)
7104 printf ("%s\n", find_file (print_file_name));
7105 return (0);
7108 if (print_prog_name)
7110 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
7111 printf ("%s\n", (newname ? newname : print_prog_name));
7112 return (0);
7115 if (print_multi_lib)
7117 print_multilib_info ();
7118 return (0);
7121 if (print_multi_directory)
7123 if (multilib_dir == NULL)
7124 printf (".\n");
7125 else
7126 printf ("%s\n", multilib_dir);
7127 return (0);
7130 if (print_sysroot)
7132 if (target_system_root)
7134 if (target_sysroot_suffix)
7135 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
7136 else
7137 printf ("%s\n", target_system_root);
7139 return (0);
7142 if (print_multi_os_directory)
7144 if (multilib_os_dir == NULL)
7145 printf (".\n");
7146 else
7147 printf ("%s\n", multilib_os_dir);
7148 return (0);
7151 if (print_sysroot_headers_suffix)
7153 if (*sysroot_hdrs_suffix_spec)
7155 printf("%s\n", (target_sysroot_hdrs_suffix
7156 ? target_sysroot_hdrs_suffix
7157 : ""));
7158 return (0);
7160 else
7161 /* The error status indicates that only one set of fixed
7162 headers should be built. */
7163 fatal ("not configured with sysroot headers suffix");
7166 if (print_help_list)
7168 display_help ();
7170 if (! verbose_flag)
7172 printf (_("\nFor bug reporting instructions, please see:\n"));
7173 printf ("%s.\n", bug_report_url);
7175 return (0);
7178 /* We do not exit here. Instead we have created a fake input file
7179 called 'help-dummy' which needs to be compiled, and we pass this
7180 on the various sub-processes, along with the --help switch.
7181 Ensure their output appears after ours. */
7182 fputc ('\n', stdout);
7183 fflush (stdout);
7186 if (print_version)
7188 printf (_("%s %s%s\n"), programname, pkgversion_string,
7189 version_string);
7190 printf ("Copyright %s 2010 Free Software Foundation, Inc.\n",
7191 _("(C)"));
7192 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
7193 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
7194 stdout);
7195 if (! verbose_flag)
7196 return 0;
7198 /* We do not exit here. We use the same mechanism of --help to print
7199 the version of the sub-processes. */
7200 fputc ('\n', stdout);
7201 fflush (stdout);
7204 if (verbose_flag)
7206 int n;
7207 const char *thrmod;
7209 notice ("Target: %s\n", spec_machine);
7210 notice ("Configured with: %s\n", configuration_arguments);
7212 #ifdef THREAD_MODEL_SPEC
7213 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7214 but there's no point in doing all this processing just to get
7215 thread_model back. */
7216 obstack_init (&obstack);
7217 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
7218 obstack_1grow (&obstack, '\0');
7219 thrmod = XOBFINISH (&obstack, const char *);
7220 #else
7221 thrmod = thread_model;
7222 #endif
7224 notice ("Thread model: %s\n", thrmod);
7226 /* compiler_version is truncated at the first space when initialized
7227 from version string, so truncate version_string at the first space
7228 before comparing. */
7229 for (n = 0; version_string[n]; n++)
7230 if (version_string[n] == ' ')
7231 break;
7233 if (! strncmp (version_string, compiler_version, n)
7234 && compiler_version[n] == 0)
7235 notice ("gcc version %s %s\n", version_string, pkgversion_string);
7236 else
7237 notice ("gcc driver version %s %sexecuting gcc version %s\n",
7238 version_string, pkgversion_string, compiler_version);
7240 if (n_infiles == 0)
7241 return (0);
7244 if (n_infiles == added_libraries)
7245 fatal ("no input files");
7247 /* Make a place to record the compiler output file names
7248 that correspond to the input files. */
7250 i = n_infiles;
7251 i += lang_specific_extra_outfiles;
7252 outfiles = XCNEWVEC (const char *, i);
7254 /* Record which files were specified explicitly as link input. */
7256 explicit_link_files = XCNEWVEC (char, n_infiles);
7258 if (combine_flag)
7259 combine_inputs = true;
7260 else
7261 combine_inputs = false;
7263 for (i = 0; (int) i < n_infiles; i++)
7265 const char *name = infiles[i].name;
7266 struct compiler *compiler = lookup_compiler (name,
7267 strlen (name),
7268 infiles[i].language);
7270 if (compiler && !(compiler->combinable))
7271 combine_inputs = false;
7273 if (lang_n_infiles > 0 && compiler != input_file_compiler
7274 && infiles[i].language && infiles[i].language[0] != '*')
7275 infiles[i].incompiler = compiler;
7276 else if (compiler)
7278 lang_n_infiles++;
7279 input_file_compiler = compiler;
7280 infiles[i].incompiler = compiler;
7282 else
7284 /* Since there is no compiler for this input file, assume it is a
7285 linker file. */
7286 explicit_link_files[i] = 1;
7287 infiles[i].incompiler = NULL;
7289 infiles[i].compiled = false;
7290 infiles[i].preprocessed = false;
7293 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
7294 fatal ("cannot specify -o with -c, -S or -E with multiple files");
7296 if (combine_flag && save_temps_flag)
7298 bool save_combine_inputs = combine_inputs;
7299 /* Must do a separate pre-processing pass for C & Objective-C files, to
7300 obtain individual .i files. */
7302 combine_inputs = false;
7303 for (i = 0; (int) i < n_infiles; i++)
7305 int this_file_error = 0;
7307 input_file_number = i;
7308 set_input (infiles[i].name);
7309 if (infiles[i].incompiler
7310 && (infiles[i].incompiler)->needs_preprocessing)
7311 input_file_compiler = infiles[i].incompiler;
7312 else
7313 continue;
7315 if (input_file_compiler)
7317 if (input_file_compiler->spec[0] == '#')
7319 error ("%s: %s compiler not installed on this system",
7320 input_filename, &input_file_compiler->spec[1]);
7321 this_file_error = 1;
7323 else
7325 value = do_spec (input_file_compiler->spec);
7326 infiles[i].preprocessed = true;
7327 if (!have_o_argbuf_index)
7328 fatal ("spec '%s' is invalid", input_file_compiler->spec);
7329 infiles[i].name = argbuf[have_o_argbuf_index];
7330 infiles[i].incompiler
7331 = lookup_compiler (infiles[i].name,
7332 strlen (infiles[i].name),
7333 infiles[i].language);
7335 if (value < 0)
7336 this_file_error = 1;
7340 if (this_file_error)
7342 delete_failure_queue ();
7343 error_count++;
7344 break;
7346 clear_failure_queue ();
7348 combine_inputs = save_combine_inputs;
7351 for (i = 0; (int) i < n_infiles; i++)
7353 int this_file_error = 0;
7355 /* Tell do_spec what to substitute for %i. */
7357 input_file_number = i;
7358 set_input (infiles[i].name);
7360 if (infiles[i].compiled)
7361 continue;
7363 /* Use the same thing in %o, unless cp->spec says otherwise. */
7365 outfiles[i] = input_filename;
7367 /* Figure out which compiler from the file's suffix. */
7369 if (! combine_inputs)
7370 input_file_compiler
7371 = lookup_compiler (infiles[i].name, input_filename_length,
7372 infiles[i].language);
7373 else
7374 input_file_compiler = infiles[i].incompiler;
7376 if (input_file_compiler)
7378 /* Ok, we found an applicable compiler. Run its spec. */
7380 if (input_file_compiler->spec[0] == '#')
7382 error ("%s: %s compiler not installed on this system",
7383 input_filename, &input_file_compiler->spec[1]);
7384 this_file_error = 1;
7386 else
7388 if (compare_debug)
7390 if (debug_check_temp_file[0])
7391 free (debug_check_temp_file[0]);
7392 debug_check_temp_file[0] = NULL;
7394 if (debug_check_temp_file[1])
7395 free (debug_check_temp_file[1]);
7396 debug_check_temp_file[1] = NULL;
7399 value = do_spec (input_file_compiler->spec);
7400 infiles[i].compiled = true;
7401 if (value < 0)
7402 this_file_error = 1;
7403 else if (compare_debug && debug_check_temp_file[0])
7405 if (verbose_flag)
7406 error ("Recompiling with -fcompare-debug");
7408 compare_debug = -compare_debug;
7409 n_switches = n_switches_debug_check[1];
7410 switches = switches_debug_check[1];
7412 value = do_spec (input_file_compiler->spec);
7414 compare_debug = -compare_debug;
7415 n_switches = n_switches_debug_check[0];
7416 switches = switches_debug_check[0];
7418 if (value < 0)
7420 error ("during -fcompare-debug recompilation");
7421 this_file_error = 1;
7424 gcc_assert (debug_check_temp_file[1]
7425 && strcmp (debug_check_temp_file[0],
7426 debug_check_temp_file[1]));
7428 if (verbose_flag)
7429 error ("Comparing final insns dumps");
7431 if (compare_files (debug_check_temp_file))
7432 this_file_error = 1;
7435 if (compare_debug)
7437 if (debug_check_temp_file[0])
7438 free (debug_check_temp_file[0]);
7439 debug_check_temp_file[0] = NULL;
7441 if (debug_check_temp_file[1])
7442 free (debug_check_temp_file[1]);
7443 debug_check_temp_file[1] = NULL;
7448 /* If this file's name does not contain a recognized suffix,
7449 record it as explicit linker input. */
7451 else
7452 explicit_link_files[i] = 1;
7454 /* Clear the delete-on-failure queue, deleting the files in it
7455 if this compilation failed. */
7457 if (this_file_error)
7459 delete_failure_queue ();
7460 error_count++;
7462 /* If this compilation succeeded, don't delete those files later. */
7463 clear_failure_queue ();
7466 /* Reset the input file name to the first compile/object file name, for use
7467 with %b in LINK_SPEC. We use the first input file that we can find
7468 a compiler to compile it instead of using infiles.language since for
7469 languages other than C we use aliases that we then lookup later. */
7470 if (n_infiles > 0)
7472 int i;
7474 for (i = 0; i < n_infiles ; i++)
7475 if (infiles[i].language && infiles[i].language[0] != '*')
7477 set_input (infiles[i].name);
7478 break;
7482 if (error_count == 0)
7484 /* Make sure INPUT_FILE_NUMBER points to first available open
7485 slot. */
7486 input_file_number = n_infiles;
7487 if (lang_specific_pre_link ())
7488 error_count++;
7491 /* Determine if there are any linker input files. */
7492 num_linker_inputs = 0;
7493 for (i = 0; (int) i < n_infiles; i++)
7494 if (explicit_link_files[i] || outfiles[i] != NULL)
7495 num_linker_inputs++;
7497 /* Run ld to link all the compiler output files. */
7499 if (num_linker_inputs > 0 && error_count == 0 && print_subprocess_help < 2)
7501 int tmp = execution_count;
7502 const char *fuse_linker_plugin = "fuse-linker-plugin";
7504 /* We'll use ld if we can't find collect2. */
7505 if (! strcmp (linker_name_spec, "collect2"))
7507 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7508 if (s == NULL)
7509 linker_name_spec = "ld";
7512 if (switch_matches (fuse_linker_plugin,
7513 fuse_linker_plugin + strlen (fuse_linker_plugin), 0))
7515 linker_plugin_file_spec = find_a_file (&exec_prefixes,
7516 "liblto_plugin.so", R_OK,
7517 false);
7518 if (!linker_plugin_file_spec)
7519 fatal ("-fuse-linker-plugin, but liblto_plugin.so not found");
7521 lto_libgcc_spec = find_a_file (&startfile_prefixes, "libgcc.a",
7522 R_OK, true);
7523 if (!lto_libgcc_spec)
7524 fatal ("could not find libgcc.a");
7526 lto_gcc_spec = argv[0];
7528 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7529 for collect. */
7530 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7531 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7533 if (print_subprocess_help == 1)
7535 printf (_("\nLinker options\n==============\n\n"));
7536 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7537 " to the linker.\n\n"));
7538 fflush (stdout);
7540 value = do_spec (link_command_spec);
7541 if (value < 0)
7542 error_count = 1;
7543 linker_was_run = (tmp != execution_count);
7546 /* If options said don't run linker,
7547 complain about input files to be given to the linker. */
7549 if (! linker_was_run && error_count == 0)
7550 for (i = 0; (int) i < n_infiles; i++)
7551 if (explicit_link_files[i]
7552 && !(infiles[i].language && infiles[i].language[0] == '*'))
7553 error ("%s: linker input file unused because linking not done",
7554 outfiles[i]);
7556 /* Delete some or all of the temporary files we made. */
7558 if (error_count)
7559 delete_failure_queue ();
7560 delete_temp_files ();
7562 if (print_help_list)
7564 printf (("\nFor bug reporting instructions, please see:\n"));
7565 printf ("%s\n", bug_report_url);
7568 return (signal_count != 0 ? 2
7569 : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
7570 : 0);
7573 /* Find the proper compilation spec for the file name NAME,
7574 whose length is LENGTH. LANGUAGE is the specified language,
7575 or 0 if this file is to be passed to the linker. */
7577 static struct compiler *
7578 lookup_compiler (const char *name, size_t length, const char *language)
7580 struct compiler *cp;
7582 /* If this was specified by the user to be a linker input, indicate that. */
7583 if (language != 0 && language[0] == '*')
7584 return 0;
7586 /* Otherwise, look for the language, if one is spec'd. */
7587 if (language != 0)
7589 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7590 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7591 return cp;
7593 error ("language %s not recognized", language);
7594 return 0;
7597 /* Look for a suffix. */
7598 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7600 if (/* The suffix `-' matches only the file name `-'. */
7601 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7602 || (strlen (cp->suffix) < length
7603 /* See if the suffix matches the end of NAME. */
7604 && !strcmp (cp->suffix,
7605 name + length - strlen (cp->suffix))
7607 break;
7610 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7611 /* Look again, but case-insensitively this time. */
7612 if (cp < compilers)
7613 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7615 if (/* The suffix `-' matches only the file name `-'. */
7616 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7617 || (strlen (cp->suffix) < length
7618 /* See if the suffix matches the end of NAME. */
7619 && ((!strcmp (cp->suffix,
7620 name + length - strlen (cp->suffix))
7621 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7622 && !strcasecmp (cp->suffix,
7623 name + length - strlen (cp->suffix)))
7625 break;
7627 #endif
7629 if (cp >= compilers)
7631 if (cp->spec[0] != '@')
7632 /* A non-alias entry: return it. */
7633 return cp;
7635 /* An alias entry maps a suffix to a language.
7636 Search for the language; pass 0 for NAME and LENGTH
7637 to avoid infinite recursion if language not found. */
7638 return lookup_compiler (NULL, 0, cp->spec + 1);
7640 return 0;
7643 static char *
7644 save_string (const char *s, int len)
7646 char *result = XNEWVEC (char, len + 1);
7648 memcpy (result, s, len);
7649 result[len] = 0;
7650 return result;
7653 void
7654 pfatal_with_name (const char *name)
7656 perror_with_name (name);
7657 delete_temp_files ();
7658 exit (1);
7661 static void
7662 perror_with_name (const char *name)
7664 error ("%s: %s", name, xstrerror (errno));
7667 /* Output an error message and exit. */
7669 void
7670 fancy_abort (const char *file, int line, const char *func)
7672 fatal_ice ("internal gcc abort in %s, at %s:%d", func, file, line);
7675 /* Output an error message and exit. */
7677 void
7678 fatal_ice (const char *cmsgid, ...)
7680 va_list ap;
7682 va_start (ap, cmsgid);
7684 fprintf (stderr, "%s: ", programname);
7685 vfprintf (stderr, _(cmsgid), ap);
7686 va_end (ap);
7687 fprintf (stderr, "\n");
7688 delete_temp_files ();
7689 exit (pass_exit_codes ? ICE_EXIT_CODE : 1);
7692 void
7693 fatal (const char *cmsgid, ...)
7695 va_list ap;
7697 va_start (ap, cmsgid);
7699 fprintf (stderr, "%s: ", programname);
7700 vfprintf (stderr, _(cmsgid), ap);
7701 va_end (ap);
7702 fprintf (stderr, "\n");
7703 delete_temp_files ();
7704 exit (1);
7707 /* The argument is actually c-format, not gcc-internal-format,
7708 but because functions with identical names are used through
7709 the rest of the compiler with gcc-internal-format, we just
7710 need to hope all users of these functions use the common
7711 subset between c-format and gcc-internal-format. */
7713 void
7714 error (const char *gmsgid, ...)
7716 va_list ap;
7718 va_start (ap, gmsgid);
7719 fprintf (stderr, "%s: ", programname);
7720 vfprintf (stderr, _(gmsgid), ap);
7721 va_end (ap);
7723 fprintf (stderr, "\n");
7726 static void
7727 notice (const char *cmsgid, ...)
7729 va_list ap;
7731 va_start (ap, cmsgid);
7732 vfprintf (stderr, _(cmsgid), ap);
7733 va_end (ap);
7736 static inline void
7737 validate_switches_from_spec (const char *spec)
7739 const char *p = spec;
7740 char c;
7741 while ((c = *p++))
7742 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7743 /* We have a switch spec. */
7744 p = validate_switches (p + 1);
7747 static void
7748 validate_all_switches (void)
7750 struct compiler *comp;
7751 struct spec_list *spec;
7753 for (comp = compilers; comp->spec; comp++)
7754 validate_switches_from_spec (comp->spec);
7756 /* Look through the linked list of specs read from the specs file. */
7757 for (spec = specs; spec; spec = spec->next)
7758 validate_switches_from_spec (*spec->ptr_spec);
7760 validate_switches_from_spec (link_command_spec);
7763 /* Look at the switch-name that comes after START
7764 and mark as valid all supplied switches that match it. */
7766 static const char *
7767 validate_switches (const char *start)
7769 const char *p = start;
7770 const char *atom;
7771 size_t len;
7772 int i;
7773 bool suffix = false;
7774 bool starred = false;
7776 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7778 next_member:
7779 SKIP_WHITE ();
7781 if (*p == '!')
7782 p++;
7784 SKIP_WHITE ();
7785 if (*p == '.' || *p == ',')
7786 suffix = true, p++;
7788 atom = p;
7789 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7790 || *p == ',' || *p == '.' || *p == '@')
7791 p++;
7792 len = p - atom;
7794 if (*p == '*')
7795 starred = true, p++;
7797 SKIP_WHITE ();
7799 if (!suffix)
7801 /* Mark all matching switches as valid. */
7802 for (i = 0; i < n_switches; i++)
7803 if (!strncmp (switches[i].part1, atom, len)
7804 && (starred || switches[i].part1[len] == 0))
7805 switches[i].validated = 1;
7808 if (*p) p++;
7809 if (*p && (p[-1] == '|' || p[-1] == '&'))
7810 goto next_member;
7812 if (*p && p[-1] == ':')
7814 while (*p && *p != ';' && *p != '}')
7816 if (*p == '%')
7818 p++;
7819 if (*p == '{' || *p == '<')
7820 p = validate_switches (p+1);
7821 else if (p[0] == 'W' && p[1] == '{')
7822 p = validate_switches (p+2);
7824 else
7825 p++;
7828 if (*p) p++;
7829 if (*p && p[-1] == ';')
7830 goto next_member;
7833 return p;
7834 #undef SKIP_WHITE
7837 struct mdswitchstr
7839 const char *str;
7840 int len;
7843 static struct mdswitchstr *mdswitches;
7844 static int n_mdswitches;
7846 /* Check whether a particular argument was used. The first time we
7847 canonicalize the switches to keep only the ones we care about. */
7849 static int
7850 used_arg (const char *p, int len)
7852 struct mswitchstr
7854 const char *str;
7855 const char *replace;
7856 int len;
7857 int rep_len;
7860 static struct mswitchstr *mswitches;
7861 static int n_mswitches;
7862 int i, j;
7864 if (!mswitches)
7866 struct mswitchstr *matches;
7867 const char *q;
7868 int cnt = 0;
7870 /* Break multilib_matches into the component strings of string
7871 and replacement string. */
7872 for (q = multilib_matches; *q != '\0'; q++)
7873 if (*q == ';')
7874 cnt++;
7876 matches
7877 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
7878 i = 0;
7879 q = multilib_matches;
7880 while (*q != '\0')
7882 matches[i].str = q;
7883 while (*q != ' ')
7885 if (*q == '\0')
7887 invalid_matches:
7888 fatal ("multilib spec '%s' is invalid", multilib_matches);
7890 q++;
7892 matches[i].len = q - matches[i].str;
7894 matches[i].replace = ++q;
7895 while (*q != ';' && *q != '\0')
7897 if (*q == ' ')
7898 goto invalid_matches;
7899 q++;
7901 matches[i].rep_len = q - matches[i].replace;
7902 i++;
7903 if (*q == ';')
7904 q++;
7907 /* Now build a list of the replacement string for switches that we care
7908 about. Make sure we allocate at least one entry. This prevents
7909 xmalloc from calling fatal, and prevents us from re-executing this
7910 block of code. */
7911 mswitches
7912 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7913 for (i = 0; i < n_switches; i++)
7914 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
7916 int xlen = strlen (switches[i].part1);
7917 for (j = 0; j < cnt; j++)
7918 if (xlen == matches[j].len
7919 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7921 mswitches[n_mswitches].str = matches[j].replace;
7922 mswitches[n_mswitches].len = matches[j].rep_len;
7923 mswitches[n_mswitches].replace = (char *) 0;
7924 mswitches[n_mswitches].rep_len = 0;
7925 n_mswitches++;
7926 break;
7930 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7931 on the command line nor any options mutually incompatible with
7932 them. */
7933 for (i = 0; i < n_mdswitches; i++)
7935 const char *r;
7937 for (q = multilib_options; *q != '\0'; q++)
7939 while (*q == ' ')
7940 q++;
7942 r = q;
7943 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7944 || strchr (" /", q[mdswitches[i].len]) == NULL)
7946 while (*q != ' ' && *q != '/' && *q != '\0')
7947 q++;
7948 if (*q != '/')
7949 break;
7950 q++;
7953 if (*q != ' ' && *q != '\0')
7955 while (*r != ' ' && *r != '\0')
7957 q = r;
7958 while (*q != ' ' && *q != '/' && *q != '\0')
7959 q++;
7961 if (used_arg (r, q - r))
7962 break;
7964 if (*q != '/')
7966 mswitches[n_mswitches].str = mdswitches[i].str;
7967 mswitches[n_mswitches].len = mdswitches[i].len;
7968 mswitches[n_mswitches].replace = (char *) 0;
7969 mswitches[n_mswitches].rep_len = 0;
7970 n_mswitches++;
7971 break;
7974 r = q + 1;
7976 break;
7982 for (i = 0; i < n_mswitches; i++)
7983 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7984 return 1;
7986 return 0;
7989 static int
7990 default_arg (const char *p, int len)
7992 int i;
7994 for (i = 0; i < n_mdswitches; i++)
7995 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7996 return 1;
7998 return 0;
8001 /* Work out the subdirectory to use based on the options. The format of
8002 multilib_select is a list of elements. Each element is a subdirectory
8003 name followed by a list of options followed by a semicolon. The format
8004 of multilib_exclusions is the same, but without the preceding
8005 directory. First gcc will check the exclusions, if none of the options
8006 beginning with an exclamation point are present, and all of the other
8007 options are present, then we will ignore this completely. Passing
8008 that, gcc will consider each multilib_select in turn using the same
8009 rules for matching the options. If a match is found, that subdirectory
8010 will be used. */
8012 static void
8013 set_multilib_dir (void)
8015 const char *p;
8016 unsigned int this_path_len;
8017 const char *this_path, *this_arg;
8018 const char *start, *end;
8019 int not_arg;
8020 int ok, ndfltok, first;
8022 n_mdswitches = 0;
8023 start = multilib_defaults;
8024 while (*start == ' ' || *start == '\t')
8025 start++;
8026 while (*start != '\0')
8028 n_mdswitches++;
8029 while (*start != ' ' && *start != '\t' && *start != '\0')
8030 start++;
8031 while (*start == ' ' || *start == '\t')
8032 start++;
8035 if (n_mdswitches)
8037 int i = 0;
8039 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
8040 for (start = multilib_defaults; *start != '\0'; start = end + 1)
8042 while (*start == ' ' || *start == '\t')
8043 start++;
8045 if (*start == '\0')
8046 break;
8048 for (end = start + 1;
8049 *end != ' ' && *end != '\t' && *end != '\0'; end++)
8052 obstack_grow (&multilib_obstack, start, end - start);
8053 obstack_1grow (&multilib_obstack, 0);
8054 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
8055 mdswitches[i++].len = end - start;
8057 if (*end == '\0')
8058 break;
8062 p = multilib_exclusions;
8063 while (*p != '\0')
8065 /* Ignore newlines. */
8066 if (*p == '\n')
8068 ++p;
8069 continue;
8072 /* Check the arguments. */
8073 ok = 1;
8074 while (*p != ';')
8076 if (*p == '\0')
8078 invalid_exclusions:
8079 fatal ("multilib exclusions '%s' is invalid",
8080 multilib_exclusions);
8083 if (! ok)
8085 ++p;
8086 continue;
8089 this_arg = p;
8090 while (*p != ' ' && *p != ';')
8092 if (*p == '\0')
8093 goto invalid_exclusions;
8094 ++p;
8097 if (*this_arg != '!')
8098 not_arg = 0;
8099 else
8101 not_arg = 1;
8102 ++this_arg;
8105 ok = used_arg (this_arg, p - this_arg);
8106 if (not_arg)
8107 ok = ! ok;
8109 if (*p == ' ')
8110 ++p;
8113 if (ok)
8114 return;
8116 ++p;
8119 first = 1;
8120 p = multilib_select;
8121 while (*p != '\0')
8123 /* Ignore newlines. */
8124 if (*p == '\n')
8126 ++p;
8127 continue;
8130 /* Get the initial path. */
8131 this_path = p;
8132 while (*p != ' ')
8134 if (*p == '\0')
8136 invalid_select:
8137 fatal ("multilib select '%s' is invalid",
8138 multilib_select);
8140 ++p;
8142 this_path_len = p - this_path;
8144 /* Check the arguments. */
8145 ok = 1;
8146 ndfltok = 1;
8147 ++p;
8148 while (*p != ';')
8150 if (*p == '\0')
8151 goto invalid_select;
8153 if (! ok)
8155 ++p;
8156 continue;
8159 this_arg = p;
8160 while (*p != ' ' && *p != ';')
8162 if (*p == '\0')
8163 goto invalid_select;
8164 ++p;
8167 if (*this_arg != '!')
8168 not_arg = 0;
8169 else
8171 not_arg = 1;
8172 ++this_arg;
8175 /* If this is a default argument, we can just ignore it.
8176 This is true even if this_arg begins with '!'. Beginning
8177 with '!' does not mean that this argument is necessarily
8178 inappropriate for this library: it merely means that
8179 there is a more specific library which uses this
8180 argument. If this argument is a default, we need not
8181 consider that more specific library. */
8182 ok = used_arg (this_arg, p - this_arg);
8183 if (not_arg)
8184 ok = ! ok;
8186 if (! ok)
8187 ndfltok = 0;
8189 if (default_arg (this_arg, p - this_arg))
8190 ok = 1;
8192 if (*p == ' ')
8193 ++p;
8196 if (ok && first)
8198 if (this_path_len != 1
8199 || this_path[0] != '.')
8201 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
8202 char *q;
8204 strncpy (new_multilib_dir, this_path, this_path_len);
8205 new_multilib_dir[this_path_len] = '\0';
8206 q = strchr (new_multilib_dir, ':');
8207 if (q != NULL)
8208 *q = '\0';
8209 multilib_dir = new_multilib_dir;
8211 first = 0;
8214 if (ndfltok)
8216 const char *q = this_path, *end = this_path + this_path_len;
8218 while (q < end && *q != ':')
8219 q++;
8220 if (q < end)
8222 char *new_multilib_os_dir = XNEWVEC (char, end - q);
8223 memcpy (new_multilib_os_dir, q + 1, end - q - 1);
8224 new_multilib_os_dir[end - q - 1] = '\0';
8225 multilib_os_dir = new_multilib_os_dir;
8226 break;
8230 ++p;
8233 if (multilib_dir == NULL && multilib_os_dir != NULL
8234 && strcmp (multilib_os_dir, ".") == 0)
8236 free (CONST_CAST (char *, multilib_os_dir));
8237 multilib_os_dir = NULL;
8239 else if (multilib_dir != NULL && multilib_os_dir == NULL)
8240 multilib_os_dir = multilib_dir;
8243 /* Print out the multiple library subdirectory selection
8244 information. This prints out a series of lines. Each line looks
8245 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
8246 required. Only the desired options are printed out, the negative
8247 matches. The options are print without a leading dash. There are
8248 no spaces to make it easy to use the information in the shell.
8249 Each subdirectory is printed only once. This assumes the ordering
8250 generated by the genmultilib script. Also, we leave out ones that match
8251 the exclusions. */
8253 static void
8254 print_multilib_info (void)
8256 const char *p = multilib_select;
8257 const char *last_path = 0, *this_path;
8258 int skip;
8259 unsigned int last_path_len = 0;
8261 while (*p != '\0')
8263 skip = 0;
8264 /* Ignore newlines. */
8265 if (*p == '\n')
8267 ++p;
8268 continue;
8271 /* Get the initial path. */
8272 this_path = p;
8273 while (*p != ' ')
8275 if (*p == '\0')
8277 invalid_select:
8278 fatal ("multilib select '%s' is invalid", multilib_select);
8281 ++p;
8284 /* When --disable-multilib was used but target defines
8285 MULTILIB_OSDIRNAMES, entries starting with .: are there just
8286 to find multilib_os_dir, so skip them from output. */
8287 if (this_path[0] == '.' && this_path[1] == ':')
8288 skip = 1;
8290 /* Check for matches with the multilib_exclusions. We don't bother
8291 with the '!' in either list. If any of the exclusion rules match
8292 all of its options with the select rule, we skip it. */
8294 const char *e = multilib_exclusions;
8295 const char *this_arg;
8297 while (*e != '\0')
8299 int m = 1;
8300 /* Ignore newlines. */
8301 if (*e == '\n')
8303 ++e;
8304 continue;
8307 /* Check the arguments. */
8308 while (*e != ';')
8310 const char *q;
8311 int mp = 0;
8313 if (*e == '\0')
8315 invalid_exclusion:
8316 fatal ("multilib exclusion '%s' is invalid",
8317 multilib_exclusions);
8320 if (! m)
8322 ++e;
8323 continue;
8326 this_arg = e;
8328 while (*e != ' ' && *e != ';')
8330 if (*e == '\0')
8331 goto invalid_exclusion;
8332 ++e;
8335 q = p + 1;
8336 while (*q != ';')
8338 const char *arg;
8339 int len = e - this_arg;
8341 if (*q == '\0')
8342 goto invalid_select;
8344 arg = q;
8346 while (*q != ' ' && *q != ';')
8348 if (*q == '\0')
8349 goto invalid_select;
8350 ++q;
8353 if (! strncmp (arg, this_arg,
8354 (len < q - arg) ? q - arg : len)
8355 || default_arg (this_arg, e - this_arg))
8357 mp = 1;
8358 break;
8361 if (*q == ' ')
8362 ++q;
8365 if (! mp)
8366 m = 0;
8368 if (*e == ' ')
8369 ++e;
8372 if (m)
8374 skip = 1;
8375 break;
8378 if (*e != '\0')
8379 ++e;
8383 if (! skip)
8385 /* If this is a duplicate, skip it. */
8386 skip = (last_path != 0
8387 && (unsigned int) (p - this_path) == last_path_len
8388 && ! strncmp (last_path, this_path, last_path_len));
8390 last_path = this_path;
8391 last_path_len = p - this_path;
8394 /* If this directory requires any default arguments, we can skip
8395 it. We will already have printed a directory identical to
8396 this one which does not require that default argument. */
8397 if (! skip)
8399 const char *q;
8401 q = p + 1;
8402 while (*q != ';')
8404 const char *arg;
8406 if (*q == '\0')
8407 goto invalid_select;
8409 if (*q == '!')
8410 arg = NULL;
8411 else
8412 arg = q;
8414 while (*q != ' ' && *q != ';')
8416 if (*q == '\0')
8417 goto invalid_select;
8418 ++q;
8421 if (arg != NULL
8422 && default_arg (arg, q - arg))
8424 skip = 1;
8425 break;
8428 if (*q == ' ')
8429 ++q;
8433 if (! skip)
8435 const char *p1;
8437 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
8438 putchar (*p1);
8439 putchar (';');
8442 ++p;
8443 while (*p != ';')
8445 int use_arg;
8447 if (*p == '\0')
8448 goto invalid_select;
8450 if (skip)
8452 ++p;
8453 continue;
8456 use_arg = *p != '!';
8458 if (use_arg)
8459 putchar ('@');
8461 while (*p != ' ' && *p != ';')
8463 if (*p == '\0')
8464 goto invalid_select;
8465 if (use_arg)
8466 putchar (*p);
8467 ++p;
8470 if (*p == ' ')
8471 ++p;
8474 if (! skip)
8476 /* If there are extra options, print them now. */
8477 if (multilib_extra && *multilib_extra)
8479 int print_at = TRUE;
8480 const char *q;
8482 for (q = multilib_extra; *q != '\0'; q++)
8484 if (*q == ' ')
8485 print_at = TRUE;
8486 else
8488 if (print_at)
8489 putchar ('@');
8490 putchar (*q);
8491 print_at = FALSE;
8496 putchar ('\n');
8499 ++p;
8503 /* getenv built-in spec function.
8505 Returns the value of the environment variable given by its first
8506 argument, concatenated with the second argument. If the
8507 environment variable is not defined, a fatal error is issued. */
8509 static const char *
8510 getenv_spec_function (int argc, const char **argv)
8512 char *value;
8513 char *result;
8514 char *ptr;
8515 size_t len;
8517 if (argc != 2)
8518 return NULL;
8520 value = getenv (argv[0]);
8521 if (!value)
8522 fatal ("environment variable \"%s\" not defined", argv[0]);
8524 /* We have to escape every character of the environment variable so
8525 they are not interpreted as active spec characters. A
8526 particularly painful case is when we are reading a variable
8527 holding a windows path complete with \ separators. */
8528 len = strlen (value) * 2 + strlen (argv[1]) + 1;
8529 result = XNEWVAR (char, len);
8530 for (ptr = result; *value; ptr += 2)
8532 ptr[0] = '\\';
8533 ptr[1] = *value++;
8536 strcpy (ptr, argv[1]);
8538 return result;
8541 /* if-exists built-in spec function.
8543 Checks to see if the file specified by the absolute pathname in
8544 ARGS exists. Returns that pathname if found.
8546 The usual use for this function is to check for a library file
8547 (whose name has been expanded with %s). */
8549 static const char *
8550 if_exists_spec_function (int argc, const char **argv)
8552 /* Must have only one argument. */
8553 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8554 return argv[0];
8556 return NULL;
8559 /* if-exists-else built-in spec function.
8561 This is like if-exists, but takes an additional argument which
8562 is returned if the first argument does not exist. */
8564 static const char *
8565 if_exists_else_spec_function (int argc, const char **argv)
8567 /* Must have exactly two arguments. */
8568 if (argc != 2)
8569 return NULL;
8571 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8572 return argv[0];
8574 return argv[1];
8577 /* replace-outfile built-in spec function.
8579 This looks for the first argument in the outfiles array's name and
8580 replaces it with the second argument. */
8582 static const char *
8583 replace_outfile_spec_function (int argc, const char **argv)
8585 int i;
8586 /* Must have exactly two arguments. */
8587 if (argc != 2)
8588 abort ();
8590 for (i = 0; i < n_infiles; i++)
8592 if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
8593 outfiles[i] = xstrdup (argv[1]);
8595 return NULL;
8598 /* Given two version numbers, compares the two numbers.
8599 A version number must match the regular expression
8600 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8602 static int
8603 compare_version_strings (const char *v1, const char *v2)
8605 int rresult;
8606 regex_t r;
8608 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8609 REG_EXTENDED | REG_NOSUB) != 0)
8610 abort ();
8611 rresult = regexec (&r, v1, 0, NULL, 0);
8612 if (rresult == REG_NOMATCH)
8613 fatal ("invalid version number `%s'", v1);
8614 else if (rresult != 0)
8615 abort ();
8616 rresult = regexec (&r, v2, 0, NULL, 0);
8617 if (rresult == REG_NOMATCH)
8618 fatal ("invalid version number `%s'", v2);
8619 else if (rresult != 0)
8620 abort ();
8622 return strverscmp (v1, v2);
8626 /* version_compare built-in spec function.
8628 This takes an argument of the following form:
8630 <comparison-op> <arg1> [<arg2>] <switch> <result>
8632 and produces "result" if the comparison evaluates to true,
8633 and nothing if it doesn't.
8635 The supported <comparison-op> values are:
8637 >= true if switch is a later (or same) version than arg1
8638 !> opposite of >=
8639 < true if switch is an earlier version than arg1
8640 !< opposite of <
8641 >< true if switch is arg1 or later, and earlier than arg2
8642 <> true if switch is earlier than arg1 or is arg2 or later
8644 If the switch is not present, the condition is false unless
8645 the first character of the <comparison-op> is '!'.
8647 For example,
8648 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8649 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8651 static const char *
8652 version_compare_spec_function (int argc, const char **argv)
8654 int comp1, comp2;
8655 size_t switch_len;
8656 const char *switch_value = NULL;
8657 int nargs = 1, i;
8658 bool result;
8660 if (argc < 3)
8661 fatal ("too few arguments to %%:version-compare");
8662 if (argv[0][0] == '\0')
8663 abort ();
8664 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8665 nargs = 2;
8666 if (argc != nargs + 3)
8667 fatal ("too many arguments to %%:version-compare");
8669 switch_len = strlen (argv[nargs + 1]);
8670 for (i = 0; i < n_switches; i++)
8671 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8672 && check_live_switch (i, switch_len))
8673 switch_value = switches[i].part1 + switch_len;
8675 if (switch_value == NULL)
8676 comp1 = comp2 = -1;
8677 else
8679 comp1 = compare_version_strings (switch_value, argv[1]);
8680 if (nargs == 2)
8681 comp2 = compare_version_strings (switch_value, argv[2]);
8682 else
8683 comp2 = -1; /* This value unused. */
8686 switch (argv[0][0] << 8 | argv[0][1])
8688 case '>' << 8 | '=':
8689 result = comp1 >= 0;
8690 break;
8691 case '!' << 8 | '<':
8692 result = comp1 >= 0 || switch_value == NULL;
8693 break;
8694 case '<' << 8:
8695 result = comp1 < 0;
8696 break;
8697 case '!' << 8 | '>':
8698 result = comp1 < 0 || switch_value == NULL;
8699 break;
8700 case '>' << 8 | '<':
8701 result = comp1 >= 0 && comp2 < 0;
8702 break;
8703 case '<' << 8 | '>':
8704 result = comp1 < 0 || comp2 >= 0;
8705 break;
8707 default:
8708 fatal ("unknown operator '%s' in %%:version-compare", argv[0]);
8710 if (! result)
8711 return NULL;
8713 return argv[nargs + 2];
8716 /* %:include builtin spec function. This differs from %include in that it
8717 can be nested inside a spec, and thus be conditionalized. It takes
8718 one argument, the filename, and looks for it in the startfile path.
8719 The result is always NULL, i.e. an empty expansion. */
8721 static const char *
8722 include_spec_function (int argc, const char **argv)
8724 char *file;
8726 if (argc != 1)
8727 abort ();
8729 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
8730 read_specs (file ? file : argv[0], FALSE);
8732 return NULL;
8735 /* %:find-file spec function. This function replace its argument by
8736 the file found thru find_file, that is the -print-file-name gcc
8737 program option. */
8738 static const char *
8739 find_file_spec_function (int argc, const char**argv)
8741 const char *file;
8743 if (argc != 1)
8744 abort ();
8746 file = find_file (argv[0]);
8747 return file;
8751 /* %:print-asm-header spec function. Print a banner to say that the
8752 following output is from the assembler. */
8754 static const char *
8755 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8756 const char **argv ATTRIBUTE_UNUSED)
8758 printf (_("Assembler options\n=================\n\n"));
8759 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8760 fflush (stdout);
8761 return NULL;
8764 /* Compute a timestamp to initialize flag_random_seed. */
8766 static unsigned
8767 get_local_tick (void)
8769 unsigned ret = 0;
8771 /* Get some more or less random data. */
8772 #ifdef HAVE_GETTIMEOFDAY
8774 struct timeval tv;
8776 gettimeofday (&tv, NULL);
8777 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8779 #else
8781 time_t now = time (NULL);
8783 if (now != (time_t)-1)
8784 ret = (unsigned) now;
8786 #endif
8788 return ret;
8791 /* %:compare-debug-dump-opt spec function. Save the last argument,
8792 expected to be the last -fdump-final-insns option, or generate a
8793 temporary. */
8795 static const char *
8796 compare_debug_dump_opt_spec_function (int arg,
8797 const char **argv ATTRIBUTE_UNUSED)
8799 const char *ret;
8800 char *name;
8801 int which;
8802 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
8804 if (arg != 0)
8805 fatal ("too many arguments to %%:compare-debug-dump-opt");
8807 do_spec_2 ("%{fdump-final-insns=*:%*}");
8808 do_spec_1 (" ", 0, NULL);
8810 if (argbuf_index > 0 && strcmp (argv[argbuf_index - 1], "."))
8812 if (!compare_debug)
8813 return NULL;
8815 name = xstrdup (argv[argbuf_index - 1]);
8816 ret = NULL;
8818 else
8820 const char *ext = NULL;
8822 if (argbuf_index > 0)
8824 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8825 ext = ".gkd";
8827 else if (!compare_debug)
8828 return NULL;
8829 else
8830 do_spec_2 ("%g.gkd");
8832 do_spec_1 (" ", 0, NULL);
8834 gcc_assert (argbuf_index > 0);
8836 name = concat (argbuf[argbuf_index - 1], ext, NULL);
8838 ret = concat ("-fdump-final-insns=", name, NULL);
8841 which = compare_debug < 0;
8842 debug_check_temp_file[which] = name;
8844 if (!which)
8846 unsigned HOST_WIDE_INT value = get_local_tick () ^ getpid ();
8848 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8851 if (*random_seed)
8852 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8853 ret, NULL);
8855 if (which)
8856 *random_seed = 0;
8858 return ret;
8861 static const char *debug_auxbase_opt;
8863 /* %:compare-debug-self-opt spec function. Expands to the options
8864 that are to be passed in the second compilation of
8865 compare-debug. */
8867 static const char *
8868 compare_debug_self_opt_spec_function (int arg,
8869 const char **argv ATTRIBUTE_UNUSED)
8871 if (arg != 0)
8872 fatal ("too many arguments to %%:compare-debug-self-opt");
8874 if (compare_debug >= 0)
8875 return NULL;
8877 do_spec_2 ("%{c|S:%{o*:%*}}");
8878 do_spec_1 (" ", 0, NULL);
8880 if (argbuf_index > 0)
8881 debug_auxbase_opt = concat ("-auxbase-strip ",
8882 argbuf[argbuf_index - 1],
8883 NULL);
8884 else
8885 debug_auxbase_opt = NULL;
8887 return concat ("\
8888 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8889 %<fdump-final-insns=* -w -S -o %j \
8890 %{!fcompare-debug-second:-fcompare-debug-second} \
8891 ", compare_debug_opt, NULL);
8894 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8895 options that are to be passed in the second compilation of
8896 compare-debug. It expects, as an argument, the basename of the
8897 current input file name, with the .gk suffix appended to it. */
8899 static const char *
8900 compare_debug_auxbase_opt_spec_function (int arg,
8901 const char **argv)
8903 char *name;
8904 int len;
8906 if (arg == 0)
8907 fatal ("too few arguments to %%:compare-debug-auxbase-opt");
8909 if (arg != 1)
8910 fatal ("too many arguments to %%:compare-debug-auxbase-opt");
8912 if (compare_debug >= 0)
8913 return NULL;
8915 len = strlen (argv[0]);
8916 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
8917 fatal ("argument to %%:compare-debug-auxbase-opt does not end in .gk");
8919 if (debug_auxbase_opt)
8920 return debug_auxbase_opt;
8922 #define OPT "-auxbase "
8924 len -= 3;
8925 name = (char*) xmalloc (sizeof (OPT) + len);
8926 memcpy (name, OPT, sizeof (OPT) - 1);
8927 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8928 name[sizeof (OPT) - 1 + len] = '\0';
8930 #undef OPT
8932 return name;