* gimplify.c (gimplify_modify_expr_rhs): Don't return GS_OK for
[official-gcc/constexpr.git] / gcc / gcc.c
bloba25077e24f76536b4c78858b1b829aa84472c3eb
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 %{static|static-libgcc:-plugin-opt=-pass-through=%(lto_libgcc)} \
786 %{static:-plugin-opt=-pass-through=-lc} \
787 %{O*:-plugin-opt=-O%*} \
788 %{w:-plugin-opt=-w} \
789 %{f*:-plugin-opt=-f%*} \
790 %{m*:-plugin-opt=-m%*} \
791 %{v:-plugin-opt=-v} \
793 %{flto} %{fwhopr} %l " LINK_PIE_SPEC \
794 "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
795 %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
796 %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
797 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
798 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov}\
799 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
800 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
801 #endif
803 #ifndef LINK_LIBGCC_SPEC
804 /* Generate -L options for startfile prefix list. */
805 # define LINK_LIBGCC_SPEC "%D"
806 #endif
808 #ifndef STARTFILE_PREFIX_SPEC
809 # define STARTFILE_PREFIX_SPEC ""
810 #endif
812 #ifndef SYSROOT_SPEC
813 # define SYSROOT_SPEC "--sysroot=%R"
814 #endif
816 #ifndef SYSROOT_SUFFIX_SPEC
817 # define SYSROOT_SUFFIX_SPEC ""
818 #endif
820 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
821 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
822 #endif
824 static const char *asm_debug;
825 static const char *cpp_spec = CPP_SPEC;
826 static const char *cc1_spec = CC1_SPEC;
827 static const char *cc1plus_spec = CC1PLUS_SPEC;
828 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
829 static const char *link_ssp_spec = LINK_SSP_SPEC;
830 static const char *asm_spec = ASM_SPEC;
831 static const char *asm_final_spec = ASM_FINAL_SPEC;
832 static const char *link_spec = LINK_SPEC;
833 static const char *lib_spec = LIB_SPEC;
834 static const char *mfwrap_spec = MFWRAP_SPEC;
835 static const char *mflib_spec = MFLIB_SPEC;
836 static const char *link_gomp_spec = "";
837 static const char *libgcc_spec = LIBGCC_SPEC;
838 static const char *endfile_spec = ENDFILE_SPEC;
839 static const char *startfile_spec = STARTFILE_SPEC;
840 static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
841 static const char *linker_name_spec = LINKER_NAME;
842 static const char *linker_plugin_file_spec = "";
843 static const char *lto_wrapper_spec = "";
844 static const char *lto_gcc_spec = "";
845 static const char *lto_libgcc_spec = "";
846 static const char *link_command_spec = LINK_COMMAND_SPEC;
847 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
848 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
849 static const char *sysroot_spec = SYSROOT_SPEC;
850 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
851 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
853 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
854 There should be no need to override these in target dependent files,
855 but we need to copy them to the specs file so that newer versions
856 of the GCC driver can correctly drive older tool chains with the
857 appropriate -B options. */
859 /* When cpplib handles traditional preprocessing, get rid of this, and
860 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
861 that we default the front end language better. */
862 static const char *trad_capable_cpp =
863 "cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
865 /* We don't wrap .d files in %W{} since a missing .d file, and
866 therefore no dependency entry, confuses make into thinking a .o
867 file that happens to exist is up-to-date. */
868 static const char *cpp_unique_options =
869 "%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}}\
870 %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
871 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
872 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
873 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
874 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
875 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
876 %{!iplugindir*:%{fplugin*:-iplugindir=%:find-file(plugin)}}\
877 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
878 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
879 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
880 %{E|M|MM:%W{o*}}";
882 /* This contains cpp options which are common with cc1_options and are passed
883 only when preprocessing only to avoid duplication. We pass the cc1 spec
884 options to the preprocessor so that it the cc1 spec may manipulate
885 options used to set target flags. Those special target flags settings may
886 in turn cause preprocessor symbols to be defined specially. */
887 static const char *cpp_options =
888 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
889 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
890 %{undef} %{save-temps*:-fpch-preprocess}";
892 /* This contains cpp options which are not passed when the preprocessor
893 output will be used by another program. */
894 static const char *cpp_debug_options = "%{d*}";
896 /* NB: This is shared amongst all front-ends, except for Ada. */
897 static const char *cc1_options =
898 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
899 %{!iplugindir*:%{fplugin*:-iplugindir=%:find-file(plugin)}}\
900 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{a*}\
901 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
902 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
903 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
904 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
905 %{Qn:-fno-ident} %{--help:--help}\
906 %{--target-help:--target-help}\
907 %{--help=*:--help=%(VALUE)}\
908 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
909 %{fsyntax-only:-o %j} %{-param*}\
910 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
911 %{coverage:-fprofile-arcs -ftest-coverage}";
913 static const char *asm_options =
914 "%{--target-help:%:print-asm-header()} "
915 #if HAVE_GNU_AS
916 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
917 to the assembler equivalents. */
918 "%{v} %{w:-W} %{I*} "
919 #endif
920 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
922 static const char *invoke_as =
923 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
924 "%{!fwpa:\
925 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
926 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
928 #else
929 "%{!fwpa:\
930 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
931 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
933 #endif
935 /* Some compilers have limits on line lengths, and the multilib_select
936 and/or multilib_matches strings can be very long, so we build them at
937 run time. */
938 static struct obstack multilib_obstack;
939 static const char *multilib_select;
940 static const char *multilib_matches;
941 static const char *multilib_defaults;
942 static const char *multilib_exclusions;
944 /* Check whether a particular argument is a default argument. */
946 #ifndef MULTILIB_DEFAULTS
947 #define MULTILIB_DEFAULTS { "" }
948 #endif
950 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
952 #ifndef DRIVER_SELF_SPECS
953 #define DRIVER_SELF_SPECS ""
954 #endif
956 /* Adding -fopenmp should imply pthreads. This is particularly important
957 for targets that use different start files and suchlike. */
958 #ifndef GOMP_SELF_SPECS
959 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
960 #endif
962 static const char *const driver_self_specs[] = {
963 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
964 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS
967 #ifndef OPTION_DEFAULT_SPECS
968 #define OPTION_DEFAULT_SPECS { "", "" }
969 #endif
971 struct default_spec
973 const char *name;
974 const char *spec;
977 static const struct default_spec
978 option_default_specs[] = { OPTION_DEFAULT_SPECS };
980 struct user_specs
982 struct user_specs *next;
983 const char *filename;
986 static struct user_specs *user_specs_head, *user_specs_tail;
988 #ifndef SWITCH_TAKES_ARG
989 #define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
990 #endif
992 #ifndef WORD_SWITCH_TAKES_ARG
993 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
994 #endif
996 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
997 /* This defines which switches stop a full compilation. */
998 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
999 ((CHAR) == 'c' || (CHAR) == 'S' || (CHAR) == 'E')
1001 #ifndef SWITCH_CURTAILS_COMPILATION
1002 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
1003 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
1004 #endif
1005 #endif
1007 /* Record the mapping from file suffixes for compilation specs. */
1009 struct compiler
1011 const char *suffix; /* Use this compiler for input files
1012 whose names end in this suffix. */
1014 const char *spec; /* To use this compiler, run this spec. */
1016 const char *cpp_spec; /* If non-NULL, substitute this spec
1017 for `%C', rather than the usual
1018 cpp_spec. */
1019 const int combinable; /* If nonzero, compiler can deal with
1020 multiple source files at once (IMA). */
1021 const int needs_preprocessing; /* If nonzero, source files need to
1022 be run through a preprocessor. */
1025 /* Pointer to a vector of `struct compiler' that gives the spec for
1026 compiling a file, based on its suffix.
1027 A file that does not end in any of these suffixes will be passed
1028 unchanged to the loader and nothing else will be done to it.
1030 An entry containing two 0s is used to terminate the vector.
1032 If multiple entries match a file, the last matching one is used. */
1034 static struct compiler *compilers;
1036 /* Number of entries in `compilers', not counting the null terminator. */
1038 static int n_compilers;
1040 /* The default list of file name suffixes and their compilation specs. */
1042 static const struct compiler default_compilers[] =
1044 /* Add lists of suffixes of known languages here. If those languages
1045 were not present when we built the driver, we will hit these copies
1046 and be given a more meaningful error than "file not used since
1047 linking is not done". */
1048 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1049 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1050 {".mii", "#Objective-C++", 0, 0, 0},
1051 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1052 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1053 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1054 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1055 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1056 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1057 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1058 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1059 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1060 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1061 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1062 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1063 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1064 {".r", "#Ratfor", 0, 0, 0},
1065 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1066 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1067 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
1068 /* Next come the entries for C. */
1069 {".c", "@c", 0, 1, 1},
1070 {"@c",
1071 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1072 external preprocessor if -save-temps is given. */
1073 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1074 %{!E:%{!M:%{!MM:\
1075 %{traditional|ftraditional:\
1076 %eGNU C no longer supports -traditional without -E}\
1077 %{!combine:\
1078 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1079 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1080 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1081 %(cc1_options)}\
1082 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1083 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1084 %{!fsyntax-only:%(invoke_as)}} \
1085 %{combine:\
1086 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1087 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i}}\
1088 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1089 cc1 %(cpp_unique_options) %(cc1_options)}}\
1090 %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
1091 {"-",
1092 "%{!E:%e-E or -x required when input is from standard input}\
1093 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1094 {".h", "@c-header", 0, 0, 0},
1095 {"@c-header",
1096 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1097 external preprocessor if -save-temps is given. */
1098 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1099 %{!E:%{!M:%{!MM:\
1100 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1101 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1102 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1103 %(cc1_options)\
1104 -o %g.s %{!o*:--output-pch=%i.gch}\
1105 %W{o*:--output-pch=%*}%V}\
1106 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1107 cc1 %(cpp_unique_options) %(cc1_options)\
1108 -o %g.s %{!o*:--output-pch=%i.gch}\
1109 %W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},
1110 {".i", "@cpp-output", 0, 1, 0},
1111 {"@cpp-output",
1112 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
1113 {".s", "@assembler", 0, 1, 0},
1114 {"@assembler",
1115 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
1116 {".sx", "@assembler-with-cpp", 0, 1, 0},
1117 {".S", "@assembler-with-cpp", 0, 1, 0},
1118 {"@assembler-with-cpp",
1119 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1120 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1121 %{E|M|MM:%(cpp_debug_options)}\
1122 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1123 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1124 #else
1125 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1126 %{E|M|MM:%(cpp_debug_options)}\
1127 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1128 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1129 #endif
1130 , 0, 1, 0},
1132 #include "specs.h"
1133 /* Mark end of table. */
1134 {0, 0, 0, 0, 0}
1137 /* Number of elements in default_compilers, not counting the terminator. */
1139 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1141 /* A vector of options to give to the linker.
1142 These options are accumulated by %x,
1143 and substituted into the linker command with %X. */
1144 static int n_linker_options;
1145 static char **linker_options;
1147 /* A vector of options to give to the assembler.
1148 These options are accumulated by -Wa,
1149 and substituted into the assembler command with %Y. */
1150 static int n_assembler_options;
1151 static char **assembler_options;
1153 /* A vector of options to give to the preprocessor.
1154 These options are accumulated by -Wp,
1155 and substituted into the preprocessor command with %Z. */
1156 static int n_preprocessor_options;
1157 static char **preprocessor_options;
1159 /* Define how to map long options into short ones. */
1161 /* This structure describes one mapping. */
1162 struct option_map
1164 /* The long option's name. */
1165 const char *const name;
1166 /* The equivalent short option. */
1167 const char *const equivalent;
1168 /* Argument info. A string of flag chars; NULL equals no options.
1169 a => argument required.
1170 o => argument optional.
1171 j => join argument to equivalent, making one word.
1172 * => require other text after NAME as an argument. */
1173 const char *const arg_info;
1176 /* This is the table of mappings. Mappings are tried sequentially
1177 for each option encountered; the first one that matches, wins. */
1179 static const struct option_map option_map[] =
1181 {"--all-warnings", "-Wall", 0},
1182 {"--ansi", "-ansi", 0},
1183 {"--assemble", "-S", 0},
1184 {"--assert", "-A", "a"},
1185 {"--classpath", "-fclasspath=", "aj"},
1186 {"--bootclasspath", "-fbootclasspath=", "aj"},
1187 {"--CLASSPATH", "-fclasspath=", "aj"},
1188 {"--combine", "-combine", 0},
1189 {"--comments", "-C", 0},
1190 {"--comments-in-macros", "-CC", 0},
1191 {"--compile", "-c", 0},
1192 {"--debug", "-g", "oj"},
1193 {"--define-macro", "-D", "aj"},
1194 {"--dependencies", "-M", 0},
1195 {"--dump", "-d", "a"},
1196 {"--dumpbase", "-dumpbase", "a"},
1197 {"--dumpdir", "-dumpdir", "a"},
1198 {"--encoding", "-fencoding=", "aj"},
1199 {"--entry", "-e", 0},
1200 {"--extra-warnings", "-W", 0},
1201 {"--extdirs", "-fextdirs=", "aj"},
1202 {"--for-assembler", "-Wa", "a"},
1203 {"--for-linker", "-Xlinker", "a"},
1204 {"--force-link", "-u", "a"},
1205 {"--coverage", "-coverage", 0},
1206 {"--imacros", "-imacros", "a"},
1207 {"--include", "-include", "a"},
1208 {"--include-barrier", "-I-", 0},
1209 {"--include-directory", "-I", "aj"},
1210 {"--include-directory-after", "-idirafter", "a"},
1211 {"--include-prefix", "-iprefix", "a"},
1212 {"--include-with-prefix", "-iwithprefix", "a"},
1213 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
1214 {"--include-with-prefix-after", "-iwithprefix", "a"},
1215 {"--language", "-x", "a"},
1216 {"--library-directory", "-L", "a"},
1217 {"--machine", "-m", "aj"},
1218 {"--machine-", "-m", "*j"},
1219 {"--no-canonical-prefixes", "-no-canonical-prefixes", 0},
1220 {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1221 {"--no-line-commands", "-P", 0},
1222 {"--no-precompiled-includes", "-noprecomp", 0},
1223 {"--no-standard-includes", "-nostdinc", 0},
1224 {"--no-standard-libraries", "-nostdlib", 0},
1225 {"--no-warnings", "-w", 0},
1226 {"--optimize", "-O", "oj"},
1227 {"--output", "-o", "a"},
1228 {"--output-class-directory", "-foutput-class-dir=", "ja"},
1229 {"--param", "--param", "a"},
1230 {"--pass-exit-codes", "-pass-exit-codes", 0},
1231 {"--pedantic", "-pedantic", 0},
1232 {"--pedantic-errors", "-pedantic-errors", 0},
1233 {"--pie", "-pie", 0},
1234 {"--pipe", "-pipe", 0},
1235 {"--prefix", "-B", "a"},
1236 {"--preprocess", "-E", 0},
1237 {"--print-search-dirs", "-print-search-dirs", 0},
1238 {"--print-file-name", "-print-file-name=", "aj"},
1239 {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
1240 {"--print-missing-file-dependencies", "-MG", 0},
1241 {"--print-multi-lib", "-print-multi-lib", 0},
1242 {"--print-multi-directory", "-print-multi-directory", 0},
1243 {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1244 {"--print-prog-name", "-print-prog-name=", "aj"},
1245 {"--print-sysroot", "-print-sysroot", 0},
1246 {"--print-sysroot-headers-suffix", "-print-sysroot-headers-suffix", 0},
1247 {"--profile", "-p", 0},
1248 {"--profile-blocks", "-a", 0},
1249 {"--quiet", "-q", 0},
1250 {"--resource", "-fcompile-resource=", "aj"},
1251 {"--save-temps", "-save-temps", 0},
1252 {"--shared", "-shared", 0},
1253 {"--silent", "-q", 0},
1254 {"--specs", "-specs=", "aj"},
1255 {"--static", "-static", 0},
1256 {"--std", "-std=", "aj"},
1257 {"--symbolic", "-symbolic", 0},
1258 {"--sysroot", "--sysroot=", "aj"},
1259 {"--time", "-time", 0},
1260 {"--trace-includes", "-H", 0},
1261 {"--traditional", "-traditional", 0},
1262 {"--traditional-cpp", "-traditional-cpp", 0},
1263 {"--trigraphs", "-trigraphs", 0},
1264 {"--undefine-macro", "-U", "aj"},
1265 {"--user-dependencies", "-MM", 0},
1266 {"--verbose", "-v", 0},
1267 {"--warn-", "-W", "*j"},
1268 {"--write-dependencies", "-MD", 0},
1269 {"--write-user-dependencies", "-MMD", 0},
1270 {"--", "-f", "*j"}
1274 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1275 static const struct {
1276 const char *const option_found;
1277 const char *const replacements;
1278 } target_option_translations[] =
1280 TARGET_OPTION_TRANSLATE_TABLE,
1281 { 0, 0 }
1283 #endif
1285 /* Translate the options described by *ARGCP and *ARGVP.
1286 Make a new vector and store it back in *ARGVP,
1287 and store its length in *ARGCP. */
1289 static void
1290 translate_options (int *argcp, const char *const **argvp)
1292 int i;
1293 int argc = *argcp;
1294 const char *const *argv = *argvp;
1295 int newvsize = (argc + 2) * 2 * sizeof (const char *);
1296 const char **newv = XNEWVAR (const char *, newvsize);
1297 int newindex = 0;
1299 i = 0;
1300 newv[newindex++] = argv[i++];
1302 while (i < argc)
1304 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1305 int tott_idx;
1307 for (tott_idx = 0;
1308 target_option_translations[tott_idx].option_found;
1309 tott_idx++)
1311 if (strcmp (target_option_translations[tott_idx].option_found,
1312 argv[i]) == 0)
1314 int spaces = 1;
1315 const char *sp;
1316 char *np;
1318 for (sp = target_option_translations[tott_idx].replacements;
1319 *sp; sp++)
1321 if (*sp == ' ')
1322 spaces ++;
1325 newvsize += spaces * sizeof (const char *);
1326 newv = XRESIZEVAR (const char *, newv, newvsize);
1328 sp = target_option_translations[tott_idx].replacements;
1329 np = xstrdup (sp);
1331 while (1)
1333 while (*np == ' ')
1334 np++;
1335 if (*np == 0)
1336 break;
1337 newv[newindex++] = np;
1338 while (*np != ' ' && *np)
1339 np++;
1340 if (*np == 0)
1341 break;
1342 *np++ = 0;
1345 i ++;
1346 break;
1349 if (target_option_translations[tott_idx].option_found)
1350 continue;
1351 #endif
1353 /* Translate -- options. */
1354 if (argv[i][0] == '-' && argv[i][1] == '-')
1356 size_t j;
1357 /* Find a mapping that applies to this option. */
1358 for (j = 0; j < ARRAY_SIZE (option_map); j++)
1360 size_t optlen = strlen (option_map[j].name);
1361 size_t arglen = strlen (argv[i]);
1362 size_t complen = arglen > optlen ? optlen : arglen;
1363 const char *arginfo = option_map[j].arg_info;
1365 if (arginfo == 0)
1366 arginfo = "";
1368 if (!strncmp (argv[i], option_map[j].name, complen))
1370 const char *arg = 0;
1372 if (arglen < optlen)
1374 size_t k;
1375 for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1376 if (strlen (option_map[k].name) >= arglen
1377 && !strncmp (argv[i], option_map[k].name, arglen))
1379 error ("ambiguous abbreviation %s", argv[i]);
1380 break;
1383 if (k != ARRAY_SIZE (option_map))
1384 break;
1387 if (arglen > optlen)
1389 /* If the option has an argument, accept that. */
1390 if (argv[i][optlen] == '=')
1391 arg = argv[i] + optlen + 1;
1393 /* If this mapping requires extra text at end of name,
1394 accept that as "argument". */
1395 else if (strchr (arginfo, '*') != 0)
1396 arg = argv[i] + optlen;
1398 /* Otherwise, extra text at end means mismatch.
1399 Try other mappings. */
1400 else
1401 continue;
1404 else if (strchr (arginfo, '*') != 0)
1406 error ("incomplete '%s' option", option_map[j].name);
1407 break;
1410 /* Handle arguments. */
1411 if (strchr (arginfo, 'a') != 0)
1413 if (arg == 0)
1415 if (i + 1 == argc)
1417 error ("missing argument to '%s' option",
1418 option_map[j].name);
1419 break;
1422 arg = argv[++i];
1425 else if (strchr (arginfo, '*') != 0)
1427 else if (strchr (arginfo, 'o') == 0)
1429 if (arg != 0)
1430 error ("extraneous argument to '%s' option",
1431 option_map[j].name);
1432 arg = 0;
1435 /* Store the translation as one argv elt or as two. */
1436 if (arg != 0 && strchr (arginfo, 'j') != 0)
1437 newv[newindex++] = concat (option_map[j].equivalent, arg,
1438 NULL);
1439 else if (arg != 0)
1441 newv[newindex++] = option_map[j].equivalent;
1442 newv[newindex++] = arg;
1444 else
1445 newv[newindex++] = option_map[j].equivalent;
1447 break;
1450 i++;
1453 /* Handle old-fashioned options--just copy them through,
1454 with their arguments. */
1455 else if (argv[i][0] == '-')
1457 const char *p = argv[i] + 1;
1458 int c = *p;
1459 int nskip = 1;
1461 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1462 nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1463 else if (WORD_SWITCH_TAKES_ARG (p))
1464 nskip += WORD_SWITCH_TAKES_ARG (p);
1465 else if ((c == 'B' || c == 'b' || c == 'x')
1466 && p[1] == 0)
1467 nskip += 1;
1468 else if (! strcmp (p, "Xlinker"))
1469 nskip += 1;
1470 else if (! strcmp (p, "Xpreprocessor"))
1471 nskip += 1;
1472 else if (! strcmp (p, "Xassembler"))
1473 nskip += 1;
1475 /* Watch out for an option at the end of the command line that
1476 is missing arguments, and avoid skipping past the end of the
1477 command line. */
1478 if (nskip + i > argc)
1479 nskip = argc - i;
1481 while (nskip > 0)
1483 newv[newindex++] = argv[i++];
1484 nskip--;
1487 else
1488 /* Ordinary operands, or +e options. */
1489 newv[newindex++] = argv[i++];
1492 newv[newindex] = 0;
1494 *argvp = newv;
1495 *argcp = newindex;
1498 static char *
1499 skip_whitespace (char *p)
1501 while (1)
1503 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1504 be considered whitespace. */
1505 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1506 return p + 1;
1507 else if (*p == '\n' || *p == ' ' || *p == '\t')
1508 p++;
1509 else if (*p == '#')
1511 while (*p != '\n')
1512 p++;
1513 p++;
1515 else
1516 break;
1519 return p;
1521 /* Structures to keep track of prefixes to try when looking for files. */
1523 struct prefix_list
1525 const char *prefix; /* String to prepend to the path. */
1526 struct prefix_list *next; /* Next in linked list. */
1527 int require_machine_suffix; /* Don't use without machine_suffix. */
1528 /* 2 means try both machine_suffix and just_machine_suffix. */
1529 int priority; /* Sort key - priority within list. */
1530 int os_multilib; /* 1 if OS multilib scheme should be used,
1531 0 for GCC multilib scheme. */
1534 struct path_prefix
1536 struct prefix_list *plist; /* List of prefixes to try */
1537 int max_len; /* Max length of a prefix in PLIST */
1538 const char *name; /* Name of this list (used in config stuff) */
1541 /* List of prefixes to try when looking for executables. */
1543 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1545 /* List of prefixes to try when looking for startup (crt0) files. */
1547 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1549 /* List of prefixes to try when looking for include files. */
1551 static struct path_prefix include_prefixes = { 0, 0, "include" };
1553 /* Suffix to attach to directories searched for commands.
1554 This looks like `MACHINE/VERSION/'. */
1556 static const char *machine_suffix = 0;
1558 /* Suffix to attach to directories searched for commands.
1559 This is just `MACHINE/'. */
1561 static const char *just_machine_suffix = 0;
1563 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1565 static const char *gcc_exec_prefix;
1567 /* Adjusted value of standard_libexec_prefix. */
1569 static const char *gcc_libexec_prefix;
1571 /* Default prefixes to attach to command names. */
1573 #ifndef STANDARD_STARTFILE_PREFIX_1
1574 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1575 #endif
1576 #ifndef STANDARD_STARTFILE_PREFIX_2
1577 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1578 #endif
1580 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1581 #undef MD_EXEC_PREFIX
1582 #undef MD_STARTFILE_PREFIX
1583 #undef MD_STARTFILE_PREFIX_1
1584 #endif
1586 /* If no prefixes defined, use the null string, which will disable them. */
1587 #ifndef MD_EXEC_PREFIX
1588 #define MD_EXEC_PREFIX ""
1589 #endif
1590 #ifndef MD_STARTFILE_PREFIX
1591 #define MD_STARTFILE_PREFIX ""
1592 #endif
1593 #ifndef MD_STARTFILE_PREFIX_1
1594 #define MD_STARTFILE_PREFIX_1 ""
1595 #endif
1597 /* These directories are locations set at configure-time based on the
1598 --prefix option provided to configure. Their initializers are
1599 defined in Makefile.in. These paths are not *directly* used when
1600 gcc_exec_prefix is set because, in that case, we know where the
1601 compiler has been installed, and use paths relative to that
1602 location instead. */
1603 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1604 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1605 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1606 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1608 /* For native compilers, these are well-known paths containing
1609 components that may be provided by the system. For cross
1610 compilers, these paths are not used. */
1611 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1612 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1613 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1614 static const char *const standard_startfile_prefix_1
1615 = STANDARD_STARTFILE_PREFIX_1;
1616 static const char *const standard_startfile_prefix_2
1617 = STANDARD_STARTFILE_PREFIX_2;
1619 /* A relative path to be used in finding the location of tools
1620 relative to the driver. */
1621 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1623 /* Subdirectory to use for locating libraries. Set by
1624 set_multilib_dir based on the compilation options. */
1626 static const char *multilib_dir;
1628 /* Subdirectory to use for locating libraries in OS conventions. Set by
1629 set_multilib_dir based on the compilation options. */
1631 static const char *multilib_os_dir;
1633 /* Structure to keep track of the specs that have been defined so far.
1634 These are accessed using %(specname) or %[specname] in a compiler
1635 or link spec. */
1637 struct spec_list
1639 /* The following 2 fields must be first */
1640 /* to allow EXTRA_SPECS to be initialized */
1641 const char *name; /* name of the spec. */
1642 const char *ptr; /* available ptr if no static pointer */
1644 /* The following fields are not initialized */
1645 /* by EXTRA_SPECS */
1646 const char **ptr_spec; /* pointer to the spec itself. */
1647 struct spec_list *next; /* Next spec in linked list. */
1648 int name_len; /* length of the name */
1649 int alloc_p; /* whether string was allocated */
1652 #define INIT_STATIC_SPEC(NAME,PTR) \
1653 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1655 /* List of statically defined specs. */
1656 static struct spec_list static_specs[] =
1658 INIT_STATIC_SPEC ("asm", &asm_spec),
1659 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1660 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1661 INIT_STATIC_SPEC ("asm_options", &asm_options),
1662 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1663 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1664 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1665 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1666 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1667 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1668 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1669 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1670 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1671 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1672 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1673 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1674 INIT_STATIC_SPEC ("link", &link_spec),
1675 INIT_STATIC_SPEC ("lib", &lib_spec),
1676 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1677 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1678 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1679 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1680 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1681 INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
1682 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1683 INIT_STATIC_SPEC ("version", &compiler_version),
1684 INIT_STATIC_SPEC ("multilib", &multilib_select),
1685 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1686 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1687 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1688 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1689 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1690 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1691 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1692 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1693 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1694 INIT_STATIC_SPEC ("lto_libgcc", &lto_libgcc_spec),
1695 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1696 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1697 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1698 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1699 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1700 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1701 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1702 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1705 #ifdef EXTRA_SPECS /* additional specs needed */
1706 /* Structure to keep track of just the first two args of a spec_list.
1707 That is all that the EXTRA_SPECS macro gives us. */
1708 struct spec_list_1
1710 const char *const name;
1711 const char *const ptr;
1714 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1715 static struct spec_list *extra_specs = (struct spec_list *) 0;
1716 #endif
1718 /* List of dynamically allocates specs that have been defined so far. */
1720 static struct spec_list *specs = (struct spec_list *) 0;
1722 /* List of static spec functions. */
1724 static const struct spec_function static_spec_functions[] =
1726 { "getenv", getenv_spec_function },
1727 { "if-exists", if_exists_spec_function },
1728 { "if-exists-else", if_exists_else_spec_function },
1729 { "replace-outfile", replace_outfile_spec_function },
1730 { "version-compare", version_compare_spec_function },
1731 { "include", include_spec_function },
1732 { "find-file", find_file_spec_function },
1733 { "print-asm-header", print_asm_header_spec_function },
1734 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1735 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1736 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1737 #ifdef EXTRA_SPEC_FUNCTIONS
1738 EXTRA_SPEC_FUNCTIONS
1739 #endif
1740 { 0, 0 }
1743 static int processing_spec_function;
1745 /* Add appropriate libgcc specs to OBSTACK, taking into account
1746 various permutations of -shared-libgcc, -shared, and such. */
1748 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1750 #ifndef USE_LD_AS_NEEDED
1751 #define USE_LD_AS_NEEDED 0
1752 #endif
1754 static void
1755 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1756 const char *static_name, const char *eh_name)
1758 char *buf;
1760 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1761 "%{!static:%{!static-libgcc:"
1762 #if USE_LD_AS_NEEDED
1763 "%{!shared-libgcc:",
1764 static_name, " --as-needed ", shared_name, " --no-as-needed"
1766 "%{shared-libgcc:",
1767 shared_name, "%{!shared: ", static_name, "}"
1769 #else
1770 "%{!shared:"
1771 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1772 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1774 #ifdef LINK_EH_SPEC
1775 "%{shared:"
1776 "%{shared-libgcc:", shared_name, "}"
1777 "%{!shared-libgcc:", static_name, "}"
1779 #else
1780 "%{shared:", shared_name, "}"
1781 #endif
1782 #endif
1783 "}}", NULL);
1785 obstack_grow (obstack, buf, strlen (buf));
1786 free (buf);
1788 #endif /* ENABLE_SHARED_LIBGCC */
1790 /* Initialize the specs lookup routines. */
1792 static void
1793 init_spec (void)
1795 struct spec_list *next = (struct spec_list *) 0;
1796 struct spec_list *sl = (struct spec_list *) 0;
1797 int i;
1799 if (specs)
1800 return; /* Already initialized. */
1802 if (verbose_flag)
1803 notice ("Using built-in specs.\n");
1805 #ifdef EXTRA_SPECS
1806 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1808 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1810 sl = &extra_specs[i];
1811 sl->name = extra_specs_1[i].name;
1812 sl->ptr = extra_specs_1[i].ptr;
1813 sl->next = next;
1814 sl->name_len = strlen (sl->name);
1815 sl->ptr_spec = &sl->ptr;
1816 next = sl;
1818 #endif
1820 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1822 sl = &static_specs[i];
1823 sl->next = next;
1824 next = sl;
1827 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1828 /* ??? If neither -shared-libgcc nor --static-libgcc was
1829 seen, then we should be making an educated guess. Some proposed
1830 heuristics for ELF include:
1832 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1833 program will be doing dynamic loading, which will likely
1834 need the shared libgcc.
1836 (2) If "-ldl", then it's also a fair bet that we're doing
1837 dynamic loading.
1839 (3) For each ET_DYN we're linking against (either through -lfoo
1840 or /some/path/foo.so), check to see whether it or one of
1841 its dependencies depends on a shared libgcc.
1843 (4) If "-shared"
1845 If the runtime is fixed to look for program headers instead
1846 of calling __register_frame_info at all, for each object,
1847 use the shared libgcc if any EH symbol referenced.
1849 If crtstuff is fixed to not invoke __register_frame_info
1850 automatically, for each object, use the shared libgcc if
1851 any non-empty unwind section found.
1853 Doing any of this probably requires invoking an external program to
1854 do the actual object file scanning. */
1856 const char *p = libgcc_spec;
1857 int in_sep = 1;
1859 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1860 when given the proper command line arguments. */
1861 while (*p)
1863 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1865 init_gcc_specs (&obstack,
1866 "-lgcc_s"
1867 #ifdef USE_LIBUNWIND_EXCEPTIONS
1868 " -lunwind"
1869 #endif
1871 "-lgcc",
1872 "-lgcc_eh"
1873 #ifdef USE_LIBUNWIND_EXCEPTIONS
1874 # ifdef HAVE_LD_STATIC_DYNAMIC
1875 " %{!static:-Bstatic} -lunwind %{!static:-Bdynamic}"
1876 # else
1877 " -lunwind"
1878 # endif
1879 #endif
1882 p += 5;
1883 in_sep = 0;
1885 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1887 /* Ug. We don't know shared library extensions. Hope that
1888 systems that use this form don't do shared libraries. */
1889 init_gcc_specs (&obstack,
1890 "-lgcc_s",
1891 "libgcc.a%s",
1892 "libgcc_eh.a%s"
1893 #ifdef USE_LIBUNWIND_EXCEPTIONS
1894 " -lunwind"
1895 #endif
1897 p += 10;
1898 in_sep = 0;
1900 else
1902 obstack_1grow (&obstack, *p);
1903 in_sep = (*p == ' ');
1904 p += 1;
1908 obstack_1grow (&obstack, '\0');
1909 libgcc_spec = XOBFINISH (&obstack, const char *);
1911 #endif
1912 #ifdef USE_AS_TRADITIONAL_FORMAT
1913 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1915 static const char tf[] = "--traditional-format ";
1916 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1917 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1918 asm_spec = XOBFINISH (&obstack, const char *);
1920 #endif
1922 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC
1923 # ifdef LINK_BUILDID_SPEC
1924 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1925 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
1926 # endif
1927 # ifdef LINK_EH_SPEC
1928 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1929 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1930 # endif
1931 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1932 link_spec = XOBFINISH (&obstack, const char *);
1933 #endif
1935 specs = sl;
1938 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1939 removed; If the spec starts with a + then SPEC is added to the end of the
1940 current spec. */
1942 static void
1943 set_spec (const char *name, const char *spec)
1945 struct spec_list *sl;
1946 const char *old_spec;
1947 int name_len = strlen (name);
1948 int i;
1950 /* If this is the first call, initialize the statically allocated specs. */
1951 if (!specs)
1953 struct spec_list *next = (struct spec_list *) 0;
1954 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1956 sl = &static_specs[i];
1957 sl->next = next;
1958 next = sl;
1960 specs = sl;
1963 /* See if the spec already exists. */
1964 for (sl = specs; sl; sl = sl->next)
1965 if (name_len == sl->name_len && !strcmp (sl->name, name))
1966 break;
1968 if (!sl)
1970 /* Not found - make it. */
1971 sl = XNEW (struct spec_list);
1972 sl->name = xstrdup (name);
1973 sl->name_len = name_len;
1974 sl->ptr_spec = &sl->ptr;
1975 sl->alloc_p = 0;
1976 *(sl->ptr_spec) = "";
1977 sl->next = specs;
1978 specs = sl;
1981 old_spec = *(sl->ptr_spec);
1982 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1983 ? concat (old_spec, spec + 1, NULL)
1984 : xstrdup (spec));
1986 #ifdef DEBUG_SPECS
1987 if (verbose_flag)
1988 notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1989 #endif
1991 /* Free the old spec. */
1992 if (old_spec && sl->alloc_p)
1993 free (CONST_CAST(char *, old_spec));
1995 sl->alloc_p = 1;
1998 /* Accumulate a command (program name and args), and run it. */
2000 /* Vector of pointers to arguments in the current line of specifications. */
2002 static const char **argbuf;
2004 /* Number of elements allocated in argbuf. */
2006 static int argbuf_length;
2008 /* Number of elements in argbuf currently in use (containing args). */
2010 static int argbuf_index;
2012 /* Position in the argbuf array containing the name of the output file
2013 (the value associated with the "-o" flag). */
2015 static int have_o_argbuf_index = 0;
2017 /* Were the options -c, -S or -E passed. */
2018 static int have_c = 0;
2020 /* Was the option -o passed. */
2021 static int have_o = 0;
2023 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
2024 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
2025 it here. */
2027 static struct temp_name {
2028 const char *suffix; /* suffix associated with the code. */
2029 int length; /* strlen (suffix). */
2030 int unique; /* Indicates whether %g or %u/%U was used. */
2031 const char *filename; /* associated filename. */
2032 int filename_length; /* strlen (filename). */
2033 struct temp_name *next;
2034 } *temp_names;
2036 /* Number of commands executed so far. */
2038 static int execution_count;
2040 /* Number of commands that exited with a signal. */
2042 static int signal_count;
2044 /* Name with which this program was invoked. */
2046 static const char *programname;
2048 /* Allocate the argument vector. */
2050 static void
2051 alloc_args (void)
2053 argbuf_length = 10;
2054 argbuf = XNEWVEC (const char *, argbuf_length);
2057 /* Clear out the vector of arguments (after a command is executed). */
2059 static void
2060 clear_args (void)
2062 argbuf_index = 0;
2065 /* Add one argument to the vector at the end.
2066 This is done when a space is seen or at the end of the line.
2067 If DELETE_ALWAYS is nonzero, the arg is a filename
2068 and the file should be deleted eventually.
2069 If DELETE_FAILURE is nonzero, the arg is a filename
2070 and the file should be deleted if this compilation fails. */
2072 static void
2073 store_arg (const char *arg, int delete_always, int delete_failure)
2075 if (argbuf_index + 1 == argbuf_length)
2076 argbuf = XRESIZEVEC (const char *, argbuf, (argbuf_length *= 2));
2078 argbuf[argbuf_index++] = arg;
2079 argbuf[argbuf_index] = 0;
2081 if (strcmp (arg, "-o") == 0)
2082 have_o_argbuf_index = argbuf_index;
2083 if (delete_always || delete_failure)
2084 record_temp_file (arg, delete_always, delete_failure);
2087 /* Load specs from a file name named FILENAME, replacing occurrences of
2088 various different types of line-endings, \r\n, \n\r and just \r, with
2089 a single \n. */
2091 static char *
2092 load_specs (const char *filename)
2094 int desc;
2095 int readlen;
2096 struct stat statbuf;
2097 char *buffer;
2098 char *buffer_p;
2099 char *specs;
2100 char *specs_p;
2102 if (verbose_flag)
2103 notice ("Reading specs from %s\n", filename);
2105 /* Open and stat the file. */
2106 desc = open (filename, O_RDONLY, 0);
2107 if (desc < 0)
2108 pfatal_with_name (filename);
2109 if (stat (filename, &statbuf) < 0)
2110 pfatal_with_name (filename);
2112 /* Read contents of file into BUFFER. */
2113 buffer = XNEWVEC (char, statbuf.st_size + 1);
2114 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2115 if (readlen < 0)
2116 pfatal_with_name (filename);
2117 buffer[readlen] = 0;
2118 close (desc);
2120 specs = XNEWVEC (char, readlen + 1);
2121 specs_p = specs;
2122 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2124 int skip = 0;
2125 char c = *buffer_p;
2126 if (c == '\r')
2128 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2129 skip = 1;
2130 else if (*(buffer_p + 1) == '\n') /* \r\n */
2131 skip = 1;
2132 else /* \r */
2133 c = '\n';
2135 if (! skip)
2136 *specs_p++ = c;
2138 *specs_p = '\0';
2140 free (buffer);
2141 return (specs);
2144 /* Read compilation specs from a file named FILENAME,
2145 replacing the default ones.
2147 A suffix which starts with `*' is a definition for
2148 one of the machine-specific sub-specs. The "suffix" should be
2149 *asm, *cc1, *cpp, *link, *startfile, etc.
2150 The corresponding spec is stored in asm_spec, etc.,
2151 rather than in the `compilers' vector.
2153 Anything invalid in the file is a fatal error. */
2155 static void
2156 read_specs (const char *filename, int main_p)
2158 char *buffer;
2159 char *p;
2161 buffer = load_specs (filename);
2163 /* Scan BUFFER for specs, putting them in the vector. */
2164 p = buffer;
2165 while (1)
2167 char *suffix;
2168 char *spec;
2169 char *in, *out, *p1, *p2, *p3;
2171 /* Advance P in BUFFER to the next nonblank nocomment line. */
2172 p = skip_whitespace (p);
2173 if (*p == 0)
2174 break;
2176 /* Is this a special command that starts with '%'? */
2177 /* Don't allow this for the main specs file, since it would
2178 encourage people to overwrite it. */
2179 if (*p == '%' && !main_p)
2181 p1 = p;
2182 while (*p && *p != '\n')
2183 p++;
2185 /* Skip '\n'. */
2186 p++;
2188 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2189 && (p1[sizeof "%include" - 1] == ' '
2190 || p1[sizeof "%include" - 1] == '\t'))
2192 char *new_filename;
2194 p1 += sizeof ("%include");
2195 while (*p1 == ' ' || *p1 == '\t')
2196 p1++;
2198 if (*p1++ != '<' || p[-2] != '>')
2199 fatal ("specs %%include syntax malformed after %ld characters",
2200 (long) (p1 - buffer + 1));
2202 p[-2] = '\0';
2203 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2204 read_specs (new_filename ? new_filename : p1, FALSE);
2205 continue;
2207 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2208 && (p1[sizeof "%include_noerr" - 1] == ' '
2209 || p1[sizeof "%include_noerr" - 1] == '\t'))
2211 char *new_filename;
2213 p1 += sizeof "%include_noerr";
2214 while (*p1 == ' ' || *p1 == '\t')
2215 p1++;
2217 if (*p1++ != '<' || p[-2] != '>')
2218 fatal ("specs %%include syntax malformed after %ld characters",
2219 (long) (p1 - buffer + 1));
2221 p[-2] = '\0';
2222 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2223 if (new_filename)
2224 read_specs (new_filename, FALSE);
2225 else if (verbose_flag)
2226 notice ("could not find specs file %s\n", p1);
2227 continue;
2229 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2230 && (p1[sizeof "%rename" - 1] == ' '
2231 || p1[sizeof "%rename" - 1] == '\t'))
2233 int name_len;
2234 struct spec_list *sl;
2235 struct spec_list *newsl;
2237 /* Get original name. */
2238 p1 += sizeof "%rename";
2239 while (*p1 == ' ' || *p1 == '\t')
2240 p1++;
2242 if (! ISALPHA ((unsigned char) *p1))
2243 fatal ("specs %%rename syntax malformed after %ld characters",
2244 (long) (p1 - buffer));
2246 p2 = p1;
2247 while (*p2 && !ISSPACE ((unsigned char) *p2))
2248 p2++;
2250 if (*p2 != ' ' && *p2 != '\t')
2251 fatal ("specs %%rename syntax malformed after %ld characters",
2252 (long) (p2 - buffer));
2254 name_len = p2 - p1;
2255 *p2++ = '\0';
2256 while (*p2 == ' ' || *p2 == '\t')
2257 p2++;
2259 if (! ISALPHA ((unsigned char) *p2))
2260 fatal ("specs %%rename syntax malformed after %ld characters",
2261 (long) (p2 - buffer));
2263 /* Get new spec name. */
2264 p3 = p2;
2265 while (*p3 && !ISSPACE ((unsigned char) *p3))
2266 p3++;
2268 if (p3 != p - 1)
2269 fatal ("specs %%rename syntax malformed after %ld characters",
2270 (long) (p3 - buffer));
2271 *p3 = '\0';
2273 for (sl = specs; sl; sl = sl->next)
2274 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2275 break;
2277 if (!sl)
2278 fatal ("specs %s spec was not found to be renamed", p1);
2280 if (strcmp (p1, p2) == 0)
2281 continue;
2283 for (newsl = specs; newsl; newsl = newsl->next)
2284 if (strcmp (newsl->name, p2) == 0)
2285 fatal ("%s: attempt to rename spec '%s' to already defined spec '%s'",
2286 filename, p1, p2);
2288 if (verbose_flag)
2290 notice ("rename spec %s to %s\n", p1, p2);
2291 #ifdef DEBUG_SPECS
2292 notice ("spec is '%s'\n\n", *(sl->ptr_spec));
2293 #endif
2296 set_spec (p2, *(sl->ptr_spec));
2297 if (sl->alloc_p)
2298 free (CONST_CAST (char *, *(sl->ptr_spec)));
2300 *(sl->ptr_spec) = "";
2301 sl->alloc_p = 0;
2302 continue;
2304 else
2305 fatal ("specs unknown %% command after %ld characters",
2306 (long) (p1 - buffer));
2309 /* Find the colon that should end the suffix. */
2310 p1 = p;
2311 while (*p1 && *p1 != ':' && *p1 != '\n')
2312 p1++;
2314 /* The colon shouldn't be missing. */
2315 if (*p1 != ':')
2316 fatal ("specs file malformed after %ld characters",
2317 (long) (p1 - buffer));
2319 /* Skip back over trailing whitespace. */
2320 p2 = p1;
2321 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2322 p2--;
2324 /* Copy the suffix to a string. */
2325 suffix = save_string (p, p2 - p);
2326 /* Find the next line. */
2327 p = skip_whitespace (p1 + 1);
2328 if (p[1] == 0)
2329 fatal ("specs file malformed after %ld characters",
2330 (long) (p - buffer));
2332 p1 = p;
2333 /* Find next blank line or end of string. */
2334 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2335 p1++;
2337 /* Specs end at the blank line and do not include the newline. */
2338 spec = save_string (p, p1 - p);
2339 p = p1;
2341 /* Delete backslash-newline sequences from the spec. */
2342 in = spec;
2343 out = spec;
2344 while (*in != 0)
2346 if (in[0] == '\\' && in[1] == '\n')
2347 in += 2;
2348 else if (in[0] == '#')
2349 while (*in && *in != '\n')
2350 in++;
2352 else
2353 *out++ = *in++;
2355 *out = 0;
2357 if (suffix[0] == '*')
2359 if (! strcmp (suffix, "*link_command"))
2360 link_command_spec = spec;
2361 else
2362 set_spec (suffix + 1, spec);
2364 else
2366 /* Add this pair to the vector. */
2367 compilers
2368 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2370 compilers[n_compilers].suffix = suffix;
2371 compilers[n_compilers].spec = spec;
2372 n_compilers++;
2373 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2376 if (*suffix == 0)
2377 link_command_spec = spec;
2380 if (link_command_spec == 0)
2381 fatal ("spec file has no spec for linking");
2384 /* Record the names of temporary files we tell compilers to write,
2385 and delete them at the end of the run. */
2387 /* This is the common prefix we use to make temp file names.
2388 It is chosen once for each run of this program.
2389 It is substituted into a spec by %g or %j.
2390 Thus, all temp file names contain this prefix.
2391 In practice, all temp file names start with this prefix.
2393 This prefix comes from the envvar TMPDIR if it is defined;
2394 otherwise, from the P_tmpdir macro if that is defined;
2395 otherwise, in /usr/tmp or /tmp;
2396 or finally the current directory if all else fails. */
2398 static const char *temp_filename;
2400 /* Length of the prefix. */
2402 static int temp_filename_length;
2404 /* Define the list of temporary files to delete. */
2406 struct temp_file
2408 const char *name;
2409 struct temp_file *next;
2412 /* Queue of files to delete on success or failure of compilation. */
2413 static struct temp_file *always_delete_queue;
2414 /* Queue of files to delete on failure of compilation. */
2415 static struct temp_file *failure_delete_queue;
2417 /* Record FILENAME as a file to be deleted automatically.
2418 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2419 otherwise delete it in any case.
2420 FAIL_DELETE nonzero means delete it if a compilation step fails;
2421 otherwise delete it in any case. */
2423 void
2424 record_temp_file (const char *filename, int always_delete, int fail_delete)
2426 char *const name = xstrdup (filename);
2428 if (always_delete)
2430 struct temp_file *temp;
2431 for (temp = always_delete_queue; temp; temp = temp->next)
2432 if (! strcmp (name, temp->name))
2433 goto already1;
2435 temp = XNEW (struct temp_file);
2436 temp->next = always_delete_queue;
2437 temp->name = name;
2438 always_delete_queue = temp;
2440 already1:;
2443 if (fail_delete)
2445 struct temp_file *temp;
2446 for (temp = failure_delete_queue; temp; temp = temp->next)
2447 if (! strcmp (name, temp->name))
2448 goto already2;
2450 temp = XNEW (struct temp_file);
2451 temp->next = failure_delete_queue;
2452 temp->name = name;
2453 failure_delete_queue = temp;
2455 already2:;
2459 /* Delete all the temporary files whose names we previously recorded. */
2461 #ifndef DELETE_IF_ORDINARY
2462 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2463 do \
2465 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2466 if (unlink (NAME) < 0) \
2467 if (VERBOSE_FLAG) \
2468 perror_with_name (NAME); \
2469 } while (0)
2470 #endif
2472 static void
2473 delete_if_ordinary (const char *name)
2475 struct stat st;
2476 #ifdef DEBUG
2477 int i, c;
2479 printf ("Delete %s? (y or n) ", name);
2480 fflush (stdout);
2481 i = getchar ();
2482 if (i != '\n')
2483 while ((c = getchar ()) != '\n' && c != EOF)
2486 if (i == 'y' || i == 'Y')
2487 #endif /* DEBUG */
2488 DELETE_IF_ORDINARY (name, st, verbose_flag);
2491 static void
2492 delete_temp_files (void)
2494 struct temp_file *temp;
2496 for (temp = always_delete_queue; temp; temp = temp->next)
2497 delete_if_ordinary (temp->name);
2498 always_delete_queue = 0;
2501 /* Delete all the files to be deleted on error. */
2503 static void
2504 delete_failure_queue (void)
2506 struct temp_file *temp;
2508 for (temp = failure_delete_queue; temp; temp = temp->next)
2509 delete_if_ordinary (temp->name);
2512 static void
2513 clear_failure_queue (void)
2515 failure_delete_queue = 0;
2518 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2519 returns non-NULL.
2520 If DO_MULTI is true iterate over the paths twice, first with multilib
2521 suffix then without, otherwise iterate over the paths once without
2522 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2523 to avoid visiting the same path twice, but we could do better. For
2524 instance, /usr/lib/../lib is considered different from /usr/lib.
2525 At least EXTRA_SPACE chars past the end of the path passed to
2526 CALLBACK are available for use by the callback.
2527 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2529 Returns the value returned by CALLBACK. */
2531 static void *
2532 for_each_path (const struct path_prefix *paths,
2533 bool do_multi,
2534 size_t extra_space,
2535 void *(*callback) (char *, void *),
2536 void *callback_info)
2538 struct prefix_list *pl;
2539 const char *multi_dir = NULL;
2540 const char *multi_os_dir = NULL;
2541 const char *multi_suffix;
2542 const char *just_multi_suffix;
2543 char *path = NULL;
2544 void *ret = NULL;
2545 bool skip_multi_dir = false;
2546 bool skip_multi_os_dir = false;
2548 multi_suffix = machine_suffix;
2549 just_multi_suffix = just_machine_suffix;
2550 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2552 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2553 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2554 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2556 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2557 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2559 while (1)
2561 size_t multi_dir_len = 0;
2562 size_t multi_os_dir_len = 0;
2563 size_t suffix_len;
2564 size_t just_suffix_len;
2565 size_t len;
2567 if (multi_dir)
2568 multi_dir_len = strlen (multi_dir);
2569 if (multi_os_dir)
2570 multi_os_dir_len = strlen (multi_os_dir);
2571 suffix_len = strlen (multi_suffix);
2572 just_suffix_len = strlen (just_multi_suffix);
2574 if (path == NULL)
2576 len = paths->max_len + extra_space + 1;
2577 if (suffix_len > multi_os_dir_len)
2578 len += suffix_len;
2579 else
2580 len += multi_os_dir_len;
2581 path = XNEWVEC (char, len);
2584 for (pl = paths->plist; pl != 0; pl = pl->next)
2586 len = strlen (pl->prefix);
2587 memcpy (path, pl->prefix, len);
2589 /* Look first in MACHINE/VERSION subdirectory. */
2590 if (!skip_multi_dir)
2592 memcpy (path + len, multi_suffix, suffix_len + 1);
2593 ret = callback (path, callback_info);
2594 if (ret)
2595 break;
2598 /* Some paths are tried with just the machine (ie. target)
2599 subdir. This is used for finding as, ld, etc. */
2600 if (!skip_multi_dir
2601 && pl->require_machine_suffix == 2)
2603 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2604 ret = callback (path, callback_info);
2605 if (ret)
2606 break;
2609 /* Now try the base path. */
2610 if (!pl->require_machine_suffix
2611 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2613 const char *this_multi;
2614 size_t this_multi_len;
2616 if (pl->os_multilib)
2618 this_multi = multi_os_dir;
2619 this_multi_len = multi_os_dir_len;
2621 else
2623 this_multi = multi_dir;
2624 this_multi_len = multi_dir_len;
2627 if (this_multi_len)
2628 memcpy (path + len, this_multi, this_multi_len + 1);
2629 else
2630 path[len] = '\0';
2632 ret = callback (path, callback_info);
2633 if (ret)
2634 break;
2637 if (pl)
2638 break;
2640 if (multi_dir == NULL && multi_os_dir == NULL)
2641 break;
2643 /* Run through the paths again, this time without multilibs.
2644 Don't repeat any we have already seen. */
2645 if (multi_dir)
2647 free (CONST_CAST (char *, multi_dir));
2648 multi_dir = NULL;
2649 free (CONST_CAST (char *, multi_suffix));
2650 multi_suffix = machine_suffix;
2651 free (CONST_CAST (char *, just_multi_suffix));
2652 just_multi_suffix = just_machine_suffix;
2654 else
2655 skip_multi_dir = true;
2656 if (multi_os_dir)
2658 free (CONST_CAST (char *, multi_os_dir));
2659 multi_os_dir = NULL;
2661 else
2662 skip_multi_os_dir = true;
2665 if (multi_dir)
2667 free (CONST_CAST (char *, multi_dir));
2668 free (CONST_CAST (char *, multi_suffix));
2669 free (CONST_CAST (char *, just_multi_suffix));
2671 if (multi_os_dir)
2672 free (CONST_CAST (char *, multi_os_dir));
2673 if (ret != path)
2674 free (path);
2675 return ret;
2678 /* Callback for build_search_list. Adds path to obstack being built. */
2680 struct add_to_obstack_info {
2681 struct obstack *ob;
2682 bool check_dir;
2683 bool first_time;
2686 static void *
2687 add_to_obstack (char *path, void *data)
2689 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2691 if (info->check_dir && !is_directory (path, false))
2692 return NULL;
2694 if (!info->first_time)
2695 obstack_1grow (info->ob, PATH_SEPARATOR);
2697 obstack_grow (info->ob, path, strlen (path));
2699 info->first_time = false;
2700 return NULL;
2703 /* Add or change the value of an environment variable, outputting the
2704 change to standard error if in verbose mode. */
2705 static void
2706 xputenv (const char *string)
2708 if (verbose_flag)
2709 notice ("%s\n", string);
2710 putenv (CONST_CAST (char *, string));
2713 /* Build a list of search directories from PATHS.
2714 PREFIX is a string to prepend to the list.
2715 If CHECK_DIR_P is true we ensure the directory exists.
2716 If DO_MULTI is true, multilib paths are output first, then
2717 non-multilib paths.
2718 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2719 It is also used by the --print-search-dirs flag. */
2721 static char *
2722 build_search_list (const struct path_prefix *paths, const char *prefix,
2723 bool check_dir, bool do_multi)
2725 struct add_to_obstack_info info;
2727 info.ob = &collect_obstack;
2728 info.check_dir = check_dir;
2729 info.first_time = true;
2731 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2732 obstack_1grow (&collect_obstack, '=');
2734 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2736 obstack_1grow (&collect_obstack, '\0');
2737 return XOBFINISH (&collect_obstack, char *);
2740 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2741 for collect. */
2743 static void
2744 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2745 bool do_multi)
2747 xputenv (build_search_list (paths, env_var, true, do_multi));
2750 /* Check whether NAME can be accessed in MODE. This is like access,
2751 except that it never considers directories to be executable. */
2753 static int
2754 access_check (const char *name, int mode)
2756 if (mode == X_OK)
2758 struct stat st;
2760 if (stat (name, &st) < 0
2761 || S_ISDIR (st.st_mode))
2762 return -1;
2765 return access (name, mode);
2768 /* Callback for find_a_file. Appends the file name to the directory
2769 path. If the resulting file exists in the right mode, return the
2770 full pathname to the file. */
2772 struct file_at_path_info {
2773 const char *name;
2774 const char *suffix;
2775 int name_len;
2776 int suffix_len;
2777 int mode;
2780 static void *
2781 file_at_path (char *path, void *data)
2783 struct file_at_path_info *info = (struct file_at_path_info *) data;
2784 size_t len = strlen (path);
2786 memcpy (path + len, info->name, info->name_len);
2787 len += info->name_len;
2789 /* Some systems have a suffix for executable files.
2790 So try appending that first. */
2791 if (info->suffix_len)
2793 memcpy (path + len, info->suffix, info->suffix_len + 1);
2794 if (access_check (path, info->mode) == 0)
2795 return path;
2798 path[len] = '\0';
2799 if (access_check (path, info->mode) == 0)
2800 return path;
2802 return NULL;
2805 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2806 access to check permissions. If DO_MULTI is true, search multilib
2807 paths then non-multilib paths, otherwise do not search multilib paths.
2808 Return 0 if not found, otherwise return its name, allocated with malloc. */
2810 static char *
2811 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2812 bool do_multi)
2814 struct file_at_path_info info;
2816 #ifdef DEFAULT_ASSEMBLER
2817 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2818 return xstrdup (DEFAULT_ASSEMBLER);
2819 #endif
2821 #ifdef DEFAULT_LINKER
2822 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2823 return xstrdup (DEFAULT_LINKER);
2824 #endif
2826 /* Determine the filename to execute (special case for absolute paths). */
2828 if (IS_ABSOLUTE_PATH (name))
2830 if (access (name, mode) == 0)
2831 return xstrdup (name);
2833 return NULL;
2836 info.name = name;
2837 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2838 info.name_len = strlen (info.name);
2839 info.suffix_len = strlen (info.suffix);
2840 info.mode = mode;
2842 return (char*) for_each_path (pprefix, do_multi,
2843 info.name_len + info.suffix_len,
2844 file_at_path, &info);
2847 /* Ranking of prefixes in the sort list. -B prefixes are put before
2848 all others. */
2850 enum path_prefix_priority
2852 PREFIX_PRIORITY_B_OPT,
2853 PREFIX_PRIORITY_LAST
2856 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2857 order according to PRIORITY. Within each PRIORITY, new entries are
2858 appended.
2860 If WARN is nonzero, we will warn if no file is found
2861 through this prefix. WARN should point to an int
2862 which will be set to 1 if this entry is used.
2864 COMPONENT is the value to be passed to update_path.
2866 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2867 the complete value of machine_suffix.
2868 2 means try both machine_suffix and just_machine_suffix. */
2870 static void
2871 add_prefix (struct path_prefix *pprefix, const char *prefix,
2872 const char *component, /* enum prefix_priority */ int priority,
2873 int require_machine_suffix, int os_multilib)
2875 struct prefix_list *pl, **prev;
2876 int len;
2878 for (prev = &pprefix->plist;
2879 (*prev) != NULL && (*prev)->priority <= priority;
2880 prev = &(*prev)->next)
2883 /* Keep track of the longest prefix. */
2885 prefix = update_path (prefix, component);
2886 len = strlen (prefix);
2887 if (len > pprefix->max_len)
2888 pprefix->max_len = len;
2890 pl = XNEW (struct prefix_list);
2891 pl->prefix = prefix;
2892 pl->require_machine_suffix = require_machine_suffix;
2893 pl->priority = priority;
2894 pl->os_multilib = os_multilib;
2896 /* Insert after PREV. */
2897 pl->next = (*prev);
2898 (*prev) = pl;
2901 /* Same as add_prefix, but prepending target_system_root to prefix. */
2902 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2903 static void
2904 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2905 const char *component,
2906 /* enum prefix_priority */ int priority,
2907 int require_machine_suffix, int os_multilib)
2909 if (!IS_ABSOLUTE_PATH (prefix))
2910 fatal ("system path '%s' is not absolute", prefix);
2912 if (target_system_root)
2914 if (target_sysroot_suffix)
2915 prefix = concat (target_sysroot_suffix, prefix, NULL);
2916 prefix = concat (target_system_root, prefix, NULL);
2918 /* We have to override this because GCC's notion of sysroot
2919 moves along with GCC. */
2920 component = "GCC";
2923 add_prefix (pprefix, prefix, component, priority,
2924 require_machine_suffix, os_multilib);
2927 /* Execute the command specified by the arguments on the current line of spec.
2928 When using pipes, this includes several piped-together commands
2929 with `|' between them.
2931 Return 0 if successful, -1 if failed. */
2933 static int
2934 execute (void)
2936 int i;
2937 int n_commands; /* # of command. */
2938 char *string;
2939 struct pex_obj *pex;
2940 struct command
2942 const char *prog; /* program name. */
2943 const char **argv; /* vector of args. */
2946 struct command *commands; /* each command buffer with above info. */
2948 gcc_assert (!processing_spec_function);
2950 if (wrapper_string)
2952 string = find_a_file (&exec_prefixes, argbuf[0], X_OK, false);
2953 argbuf[0] = (string) ? string : argbuf[0];
2954 insert_wrapper (wrapper_string);
2957 /* Count # of piped commands. */
2958 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2959 if (strcmp (argbuf[i], "|") == 0)
2960 n_commands++;
2962 /* Get storage for each command. */
2963 commands = (struct command *) alloca (n_commands * sizeof (struct command));
2965 /* Split argbuf into its separate piped processes,
2966 and record info about each one.
2967 Also search for the programs that are to be run. */
2969 commands[0].prog = argbuf[0]; /* first command. */
2970 commands[0].argv = &argbuf[0];
2972 if (!wrapper_string)
2974 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2975 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2978 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2979 if (strcmp (argbuf[i], "|") == 0)
2980 { /* each command. */
2981 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2982 fatal ("-pipe not supported");
2983 #endif
2984 argbuf[i] = 0; /* termination of command args. */
2985 commands[n_commands].prog = argbuf[i + 1];
2986 commands[n_commands].argv = &argbuf[i + 1];
2987 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2988 X_OK, false);
2989 if (string)
2990 commands[n_commands].argv[0] = string;
2991 n_commands++;
2994 argbuf[argbuf_index] = 0;
2996 /* If -v, print what we are about to do, and maybe query. */
2998 if (verbose_flag)
3000 /* For help listings, put a blank line between sub-processes. */
3001 if (print_help_list)
3002 fputc ('\n', stderr);
3004 /* Print each piped command as a separate line. */
3005 for (i = 0; i < n_commands; i++)
3007 const char *const *j;
3009 if (verbose_only_flag)
3011 for (j = commands[i].argv; *j; j++)
3013 const char *p;
3014 fprintf (stderr, " \"");
3015 for (p = *j; *p; ++p)
3017 if (*p == '"' || *p == '\\' || *p == '$')
3018 fputc ('\\', stderr);
3019 fputc (*p, stderr);
3021 fputc ('"', stderr);
3024 else
3025 for (j = commands[i].argv; *j; j++)
3026 fprintf (stderr, " %s", *j);
3028 /* Print a pipe symbol after all but the last command. */
3029 if (i + 1 != n_commands)
3030 fprintf (stderr, " |");
3031 fprintf (stderr, "\n");
3033 fflush (stderr);
3034 if (verbose_only_flag != 0)
3036 /* verbose_only_flag should act as if the spec was
3037 executed, so increment execution_count before
3038 returning. This prevents spurious warnings about
3039 unused linker input files, etc. */
3040 execution_count++;
3041 return 0;
3043 #ifdef DEBUG
3044 notice ("\nGo ahead? (y or n) ");
3045 fflush (stderr);
3046 i = getchar ();
3047 if (i != '\n')
3048 while (getchar () != '\n')
3051 if (i != 'y' && i != 'Y')
3052 return 0;
3053 #endif /* DEBUG */
3056 #ifdef ENABLE_VALGRIND_CHECKING
3057 /* Run the each command through valgrind. To simplify prepending the
3058 path to valgrind and the option "-q" (for quiet operation unless
3059 something triggers), we allocate a separate argv array. */
3061 for (i = 0; i < n_commands; i++)
3063 const char **argv;
3064 int argc;
3065 int j;
3067 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3070 argv = XALLOCAVEC (const char *, argc + 3);
3072 argv[0] = VALGRIND_PATH;
3073 argv[1] = "-q";
3074 for (j = 2; j < argc + 2; j++)
3075 argv[j] = commands[i].argv[j - 2];
3076 argv[j] = NULL;
3078 commands[i].argv = argv;
3079 commands[i].prog = argv[0];
3081 #endif
3083 /* Run each piped subprocess. */
3085 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3086 ? PEX_RECORD_TIMES : 0),
3087 programname, temp_filename);
3088 if (pex == NULL)
3089 pfatal_with_name (_("pex_init failed"));
3091 for (i = 0; i < n_commands; i++)
3093 const char *errmsg;
3094 int err;
3095 const char *string = commands[i].argv[0];
3097 errmsg = pex_run (pex,
3098 ((i + 1 == n_commands ? PEX_LAST : 0)
3099 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3100 string, CONST_CAST (char **, commands[i].argv),
3101 NULL, NULL, &err);
3102 if (errmsg != NULL)
3104 if (err == 0)
3105 fatal (errmsg);
3106 else
3108 errno = err;
3109 pfatal_with_name (errmsg);
3113 if (string != commands[i].prog)
3114 free (CONST_CAST (char *, string));
3117 execution_count++;
3119 /* Wait for all the subprocesses to finish. */
3122 int *statuses;
3123 struct pex_time *times = NULL;
3124 int ret_code = 0;
3126 statuses = (int *) alloca (n_commands * sizeof (int));
3127 if (!pex_get_status (pex, n_commands, statuses))
3128 pfatal_with_name (_("failed to get exit status"));
3130 if (report_times || report_times_to_file)
3132 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
3133 if (!pex_get_times (pex, n_commands, times))
3134 pfatal_with_name (_("failed to get process times"));
3137 pex_free (pex);
3139 for (i = 0; i < n_commands; ++i)
3141 int status = statuses[i];
3143 if (WIFSIGNALED (status))
3145 #ifdef SIGPIPE
3146 /* SIGPIPE is a special case. It happens in -pipe mode
3147 when the compiler dies before the preprocessor is done,
3148 or the assembler dies before the compiler is done.
3149 There's generally been an error already, and this is
3150 just fallout. So don't generate another error unless
3151 we would otherwise have succeeded. */
3152 if (WTERMSIG (status) == SIGPIPE
3153 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
3155 signal_count++;
3156 ret_code = -1;
3158 else
3159 #endif
3160 fatal_ice ("\
3161 Internal error: %s (program %s)\n\
3162 Please submit a full bug report.\n\
3163 See %s for instructions.",
3164 strsignal (WTERMSIG (status)), commands[i].prog,
3165 bug_report_url);
3167 else if (WIFEXITED (status)
3168 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3170 if (WEXITSTATUS (status) > greatest_status)
3171 greatest_status = WEXITSTATUS (status);
3172 ret_code = -1;
3175 if (report_times || report_times_to_file)
3177 struct pex_time *pt = &times[i];
3178 double ut, st;
3180 ut = ((double) pt->user_seconds
3181 + (double) pt->user_microseconds / 1.0e6);
3182 st = ((double) pt->system_seconds
3183 + (double) pt->system_microseconds / 1.0e6);
3185 if (ut + st != 0)
3187 if (report_times)
3188 notice ("# %s %.2f %.2f\n", commands[i].prog, ut, st);
3190 if (report_times_to_file)
3192 int c = 0;
3193 const char *const *j;
3195 fprintf (report_times_to_file, "%g %g", ut, st);
3197 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3199 const char *p;
3200 for (p = *j; *p; ++p)
3201 if (*p == '"' || *p == '\\' || *p == '$'
3202 || ISSPACE (*p))
3203 break;
3205 if (*p)
3207 fprintf (report_times_to_file, " \"");
3208 for (p = *j; *p; ++p)
3210 if (*p == '"' || *p == '\\' || *p == '$')
3211 fputc ('\\', report_times_to_file);
3212 fputc (*p, report_times_to_file);
3214 fputc ('"', report_times_to_file);
3216 else
3217 fprintf (report_times_to_file, " %s", *j);
3220 fputc ('\n', report_times_to_file);
3226 return ret_code;
3230 /* Find all the switches given to us
3231 and make a vector describing them.
3232 The elements of the vector are strings, one per switch given.
3233 If a switch uses following arguments, then the `part1' field
3234 is the switch itself and the `args' field
3235 is a null-terminated vector containing the following arguments.
3236 Bits in the `live_cond' field are:
3237 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3238 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3239 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3240 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
3241 in all do_spec calls afterwards. Used for %<S from self specs.
3242 The `validated' field is nonzero if any spec has looked at this switch;
3243 if it remains zero at the end of the run, it must be meaningless. */
3245 #define SWITCH_LIVE 0x1
3246 #define SWITCH_FALSE 0x2
3247 #define SWITCH_IGNORE 0x4
3248 #define SWITCH_IGNORE_PERMANENTLY 0x8
3250 struct switchstr
3252 const char *part1;
3253 const char **args;
3254 unsigned int live_cond;
3255 unsigned char validated;
3256 unsigned char ordering;
3259 static struct switchstr *switches;
3261 static int n_switches;
3263 /* Set to zero if -fcompare-debug is disabled, positive if it's
3264 enabled and we're running the first compilation, negative if it's
3265 enabled and we're running the second compilation. For most of the
3266 time, it's in the range -1..1, but it can be temporarily set to 2
3267 or 3 to indicate that the -fcompare-debug flags didn't come from
3268 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3269 variable, until a synthesized -fcompare-debug flag is added to the
3270 command line. */
3271 int compare_debug;
3273 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3274 int compare_debug_second;
3276 /* Set to the flags that should be passed to the second compilation in
3277 a -fcompare-debug compilation. */
3278 const char *compare_debug_opt;
3280 static struct switchstr *switches_debug_check[2];
3282 static int n_switches_debug_check[2];
3284 static char *debug_check_temp_file[2];
3286 /* Language is one of three things:
3288 1) The name of a real programming language.
3289 2) NULL, indicating that no one has figured out
3290 what it is yet.
3291 3) '*', indicating that the file should be passed
3292 to the linker. */
3293 struct infile
3295 const char *name;
3296 const char *language;
3297 struct compiler *incompiler;
3298 bool compiled;
3299 bool preprocessed;
3302 /* Also a vector of input files specified. */
3304 static struct infile *infiles;
3306 int n_infiles;
3308 /* True if multiple input files are being compiled to a single
3309 assembly file. */
3311 static bool combine_inputs;
3313 /* This counts the number of libraries added by lang_specific_driver, so that
3314 we can tell if there were any user supplied any files or libraries. */
3316 static int added_libraries;
3318 /* And a vector of corresponding output files is made up later. */
3320 const char **outfiles;
3322 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3324 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3325 is true if we should look for an executable suffix. DO_OBJ
3326 is true if we should look for an object suffix. */
3328 static const char *
3329 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3330 int do_obj ATTRIBUTE_UNUSED)
3332 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3333 int i;
3334 #endif
3335 int len;
3337 if (name == NULL)
3338 return NULL;
3340 len = strlen (name);
3342 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3343 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3344 if (do_obj && len > 2
3345 && name[len - 2] == '.'
3346 && name[len - 1] == 'o')
3348 obstack_grow (&obstack, name, len - 2);
3349 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3350 name = XOBFINISH (&obstack, const char *);
3352 #endif
3354 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3355 /* If there is no filetype, make it the executable suffix (which includes
3356 the "."). But don't get confused if we have just "-o". */
3357 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3358 return name;
3360 for (i = len - 1; i >= 0; i--)
3361 if (IS_DIR_SEPARATOR (name[i]))
3362 break;
3364 for (i++; i < len; i++)
3365 if (name[i] == '.')
3366 return name;
3368 obstack_grow (&obstack, name, len);
3369 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3370 strlen (TARGET_EXECUTABLE_SUFFIX));
3371 name = XOBFINISH (&obstack, const char *);
3372 #endif
3374 return name;
3376 #endif
3378 /* Display the command line switches accepted by gcc. */
3379 static void
3380 display_help (void)
3382 printf (_("Usage: %s [options] file...\n"), programname);
3383 fputs (_("Options:\n"), stdout);
3385 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3386 fputs (_(" --help Display this information\n"), stdout);
3387 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3388 fputs (_(" --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3389 fputs (_(" Display specific types of command line options\n"), stdout);
3390 if (! verbose_flag)
3391 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3392 fputs (_(" --version Display compiler version information\n"), stdout);
3393 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3394 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3395 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3396 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3397 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3398 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3399 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3400 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3401 fputs (_("\
3402 -print-multi-lib Display the mapping between command line options and\n\
3403 multiple library search directories\n"), stdout);
3404 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3405 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
3406 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3407 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3408 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3409 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3410 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3411 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3412 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3413 fputs (_(" -combine Pass multiple source files to compiler at once\n"), stdout);
3414 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3415 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
3416 fputs (_("\
3417 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3418 prefixes to other gcc components\n"), stdout);
3419 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3420 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3421 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3422 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3423 fputs (_("\
3424 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3425 and libraries\n"), stdout);
3426 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3427 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3428 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3429 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3430 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3431 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3432 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3433 fputs (_("\
3434 -x <language> Specify the language of the following input files\n\
3435 Permissible languages include: c c++ assembler none\n\
3436 'none' means revert to the default behavior of\n\
3437 guessing the language based on the file's extension\n\
3438 "), stdout);
3440 printf (_("\
3441 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3442 passed on to the various sub-processes invoked by %s. In order to pass\n\
3443 other options on to these processes the -W<letter> options must be used.\n\
3444 "), programname);
3446 /* The rest of the options are displayed by invocations of the various
3447 sub-processes. */
3450 static void
3451 add_preprocessor_option (const char *option, int len)
3453 n_preprocessor_options++;
3455 if (! preprocessor_options)
3456 preprocessor_options = XNEWVEC (char *, n_preprocessor_options);
3457 else
3458 preprocessor_options = XRESIZEVEC (char *, preprocessor_options,
3459 n_preprocessor_options);
3461 preprocessor_options [n_preprocessor_options - 1] =
3462 save_string (option, len);
3465 static void
3466 add_assembler_option (const char *option, int len)
3468 n_assembler_options++;
3470 if (! assembler_options)
3471 assembler_options = XNEWVEC (char *, n_assembler_options);
3472 else
3473 assembler_options = XRESIZEVEC (char *, assembler_options,
3474 n_assembler_options);
3476 assembler_options [n_assembler_options - 1] = save_string (option, len);
3479 static void
3480 add_linker_option (const char *option, int len)
3482 n_linker_options++;
3484 if (! linker_options)
3485 linker_options = XNEWVEC (char *, n_linker_options);
3486 else
3487 linker_options = XRESIZEVEC (char *, linker_options, n_linker_options);
3489 linker_options [n_linker_options - 1] = save_string (option, len);
3492 /* Create the vector `switches' and its contents.
3493 Store its length in `n_switches'. */
3495 static void
3496 process_command (int argc, const char **argv)
3498 int i;
3499 const char *temp;
3500 char *temp1;
3501 const char *spec_lang = 0;
3502 int last_language_n_infiles;
3503 int lang_n_infiles = 0;
3504 #ifdef MODIFY_TARGET_NAME
3505 int is_modify_target_name;
3506 unsigned int j;
3507 #endif
3508 const char *tooldir_prefix;
3509 char *(*get_relative_prefix) (const char *, const char *,
3510 const char *) = NULL;
3512 GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3514 n_switches = 0;
3515 n_infiles = 0;
3516 added_libraries = 0;
3518 /* Figure compiler version from version string. */
3520 compiler_version = temp1 = xstrdup (version_string);
3522 for (; *temp1; ++temp1)
3524 if (*temp1 == ' ')
3526 *temp1 = '\0';
3527 break;
3531 /* Convert new-style -- options to old-style. */
3532 translate_options (&argc,
3533 CONST_CAST2 (const char *const **, const char ***,
3534 &argv));
3536 /* Handle any -no-canonical-prefixes flag early, to assign the function
3537 that builds relative prefixes. This function creates default search
3538 paths that are needed later in normal option handling. */
3540 for (i = 1; i < argc; i++)
3542 if (! strcmp (argv[i], "-no-canonical-prefixes"))
3544 get_relative_prefix = make_relative_prefix_ignore_links;
3545 break;
3548 if (! get_relative_prefix)
3549 get_relative_prefix = make_relative_prefix;
3551 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3552 see if we can create it from the pathname specified in argv[0]. */
3554 gcc_libexec_prefix = standard_libexec_prefix;
3555 #ifndef VMS
3556 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3557 if (!gcc_exec_prefix)
3559 gcc_exec_prefix = get_relative_prefix (argv[0],
3560 standard_bindir_prefix,
3561 standard_exec_prefix);
3562 gcc_libexec_prefix = get_relative_prefix (argv[0],
3563 standard_bindir_prefix,
3564 standard_libexec_prefix);
3565 if (gcc_exec_prefix)
3566 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3568 else
3570 /* make_relative_prefix requires a program name, but
3571 GCC_EXEC_PREFIX is typically a directory name with a trailing
3572 / (which is ignored by make_relative_prefix), so append a
3573 program name. */
3574 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
3575 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3576 standard_exec_prefix,
3577 standard_libexec_prefix);
3579 /* The path is unrelocated, so fallback to the original setting. */
3580 if (!gcc_libexec_prefix)
3581 gcc_libexec_prefix = standard_libexec_prefix;
3583 free (tmp_prefix);
3585 #else
3586 #endif
3587 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3588 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
3589 or an automatically created GCC_EXEC_PREFIX from argv[0]. */
3591 /* Do language-specific adjustment/addition of flags. */
3592 lang_specific_driver (&argc,
3593 CONST_CAST2 (const char *const **, const char ***,
3594 &argv),
3595 &added_libraries);
3597 if (gcc_exec_prefix)
3599 int len = strlen (gcc_exec_prefix);
3601 if (len > (int) sizeof ("/lib/gcc/") - 1
3602 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3604 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3605 if (IS_DIR_SEPARATOR (*temp)
3606 && strncmp (temp + 1, "lib", 3) == 0
3607 && IS_DIR_SEPARATOR (temp[4])
3608 && strncmp (temp + 5, "gcc", 3) == 0)
3609 len -= sizeof ("/lib/gcc/") - 1;
3612 set_std_prefix (gcc_exec_prefix, len);
3613 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3614 PREFIX_PRIORITY_LAST, 0, 0);
3615 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3616 PREFIX_PRIORITY_LAST, 0, 0);
3619 /* COMPILER_PATH and LIBRARY_PATH have values
3620 that are lists of directory names with colons. */
3622 GET_ENVIRONMENT (temp, "COMPILER_PATH");
3623 if (temp)
3625 const char *startp, *endp;
3626 char *nstore = (char *) alloca (strlen (temp) + 3);
3628 startp = endp = temp;
3629 while (1)
3631 if (*endp == PATH_SEPARATOR || *endp == 0)
3633 strncpy (nstore, startp, endp - startp);
3634 if (endp == startp)
3635 strcpy (nstore, concat (".", dir_separator_str, NULL));
3636 else if (!IS_DIR_SEPARATOR (endp[-1]))
3638 nstore[endp - startp] = DIR_SEPARATOR;
3639 nstore[endp - startp + 1] = 0;
3641 else
3642 nstore[endp - startp] = 0;
3643 add_prefix (&exec_prefixes, nstore, 0,
3644 PREFIX_PRIORITY_LAST, 0, 0);
3645 add_prefix (&include_prefixes, nstore, 0,
3646 PREFIX_PRIORITY_LAST, 0, 0);
3647 if (*endp == 0)
3648 break;
3649 endp = startp = endp + 1;
3651 else
3652 endp++;
3656 GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
3657 if (temp && *cross_compile == '0')
3659 const char *startp, *endp;
3660 char *nstore = (char *) alloca (strlen (temp) + 3);
3662 startp = endp = temp;
3663 while (1)
3665 if (*endp == PATH_SEPARATOR || *endp == 0)
3667 strncpy (nstore, startp, endp - startp);
3668 if (endp == startp)
3669 strcpy (nstore, concat (".", dir_separator_str, NULL));
3670 else if (!IS_DIR_SEPARATOR (endp[-1]))
3672 nstore[endp - startp] = DIR_SEPARATOR;
3673 nstore[endp - startp + 1] = 0;
3675 else
3676 nstore[endp - startp] = 0;
3677 add_prefix (&startfile_prefixes, nstore, NULL,
3678 PREFIX_PRIORITY_LAST, 0, 1);
3679 if (*endp == 0)
3680 break;
3681 endp = startp = endp + 1;
3683 else
3684 endp++;
3688 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3689 GET_ENVIRONMENT (temp, "LPATH");
3690 if (temp && *cross_compile == '0')
3692 const char *startp, *endp;
3693 char *nstore = (char *) alloca (strlen (temp) + 3);
3695 startp = endp = temp;
3696 while (1)
3698 if (*endp == PATH_SEPARATOR || *endp == 0)
3700 strncpy (nstore, startp, endp - startp);
3701 if (endp == startp)
3702 strcpy (nstore, concat (".", dir_separator_str, NULL));
3703 else if (!IS_DIR_SEPARATOR (endp[-1]))
3705 nstore[endp - startp] = DIR_SEPARATOR;
3706 nstore[endp - startp + 1] = 0;
3708 else
3709 nstore[endp - startp] = 0;
3710 add_prefix (&startfile_prefixes, nstore, NULL,
3711 PREFIX_PRIORITY_LAST, 0, 1);
3712 if (*endp == 0)
3713 break;
3714 endp = startp = endp + 1;
3716 else
3717 endp++;
3721 /* Scan argv twice. Here, the first time, just count how many switches
3722 there will be in their vector, and how many input files in theirs.
3723 Here we also parse the switches that cc itself uses (e.g. -v). */
3725 for (i = 1; i < argc; i++)
3727 if (! strcmp (argv[i], "-dumpspecs"))
3729 struct spec_list *sl;
3730 init_spec ();
3731 for (sl = specs; sl; sl = sl->next)
3732 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3733 if (link_command_spec)
3734 printf ("*link_command:\n%s\n\n", link_command_spec);
3735 exit (0);
3737 else if (! strcmp (argv[i], "-dumpversion"))
3739 printf ("%s\n", spec_version);
3740 exit (0);
3742 else if (! strcmp (argv[i], "-dumpmachine"))
3744 printf ("%s\n", spec_machine);
3745 exit (0);
3747 else if (strcmp (argv[i], "-fversion") == 0)
3749 /* translate_options () has turned --version into -fversion. */
3750 print_version = 1;
3752 /* We will be passing a dummy file on to the sub-processes. */
3753 n_infiles++;
3754 n_switches++;
3756 /* CPP driver cannot obtain switch from cc1_options. */
3757 if (is_cpp_driver)
3758 add_preprocessor_option ("--version", strlen ("--version"));
3759 add_assembler_option ("--version", strlen ("--version"));
3760 add_linker_option ("--version", strlen ("--version"));
3762 else if (strcmp (argv[i], "-fhelp") == 0)
3764 /* translate_options () has turned --help into -fhelp. */
3765 print_help_list = 1;
3767 /* We will be passing a dummy file on to the sub-processes. */
3768 n_infiles++;
3769 n_switches++;
3771 /* CPP driver cannot obtain switch from cc1_options. */
3772 if (is_cpp_driver)
3773 add_preprocessor_option ("--help", 6);
3774 add_assembler_option ("--help", 6);
3775 add_linker_option ("--help", 6);
3777 else if (strncmp (argv[i], "-fhelp=", 7) == 0)
3779 /* translate_options () has turned --help into -fhelp. */
3780 print_subprocess_help = 2;
3782 /* We will be passing a dummy file on to the sub-processes. */
3783 n_infiles++;
3784 n_switches++;
3786 else if (strcmp (argv[i], "-ftarget-help") == 0)
3788 /* translate_options() has turned --target-help into -ftarget-help. */
3789 print_subprocess_help = 1;
3791 /* We will be passing a dummy file on to the sub-processes. */
3792 n_infiles++;
3793 n_switches++;
3795 /* CPP driver cannot obtain switch from cc1_options. */
3796 if (is_cpp_driver)
3797 add_preprocessor_option ("--target-help", 13);
3798 add_assembler_option ("--target-help", 13);
3799 add_linker_option ("--target-help", 13);
3801 else if (! strcmp (argv[i], "-pass-exit-codes"))
3803 pass_exit_codes = 1;
3804 n_switches++;
3806 else if (! strcmp (argv[i], "-print-search-dirs"))
3807 print_search_dirs = 1;
3808 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3809 print_file_name = "libgcc.a";
3810 else if (! strncmp (argv[i], "-print-file-name=", 17))
3811 print_file_name = argv[i] + 17;
3812 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3813 print_prog_name = argv[i] + 17;
3814 else if (! strcmp (argv[i], "-print-multi-lib"))
3815 print_multi_lib = 1;
3816 else if (! strcmp (argv[i], "-print-multi-directory"))
3817 print_multi_directory = 1;
3818 else if (! strcmp (argv[i], "-print-sysroot"))
3819 print_sysroot = 1;
3820 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3821 print_multi_os_directory = 1;
3822 else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
3823 print_sysroot_headers_suffix = 1;
3824 else if (! strcmp (argv[i], "-fcompare-debug-second"))
3826 compare_debug_second = 1;
3827 n_switches++;
3829 else if (! strcmp (argv[i], "-fno-compare-debug"))
3831 argv[i] = "-fcompare-debug=";
3832 goto compare_debug_with_arg;
3834 else if (! strcmp (argv[i], "-fcompare-debug"))
3836 argv[i] = "-fcompare-debug=-gtoggle";
3837 goto compare_debug_with_arg;
3839 #define OPT "-fcompare-debug="
3840 else if (! strncmp (argv[i], OPT, sizeof (OPT) - 1))
3842 const char *opt;
3843 compare_debug_with_arg:
3844 opt = argv[i] + sizeof (OPT) - 1;
3845 #undef OPT
3846 if (*opt)
3847 compare_debug = 1;
3848 else
3849 compare_debug = -1;
3850 if (compare_debug < 0)
3851 compare_debug_opt = NULL;
3852 else
3853 compare_debug_opt = opt;
3854 n_switches++;
3856 else if (! strncmp (argv[i], "-Wa,", 4))
3858 int prev, j;
3859 /* Pass the rest of this option to the assembler. */
3861 /* Split the argument at commas. */
3862 prev = 4;
3863 for (j = 4; argv[i][j]; j++)
3864 if (argv[i][j] == ',')
3866 add_assembler_option (argv[i] + prev, j - prev);
3867 prev = j + 1;
3870 /* Record the part after the last comma. */
3871 add_assembler_option (argv[i] + prev, j - prev);
3873 else if (! strncmp (argv[i], "-Wp,", 4))
3875 int prev, j;
3876 /* Pass the rest of this option to the preprocessor. */
3878 /* Split the argument at commas. */
3879 prev = 4;
3880 for (j = 4; argv[i][j]; j++)
3881 if (argv[i][j] == ',')
3883 add_preprocessor_option (argv[i] + prev, j - prev);
3884 prev = j + 1;
3887 /* Record the part after the last comma. */
3888 add_preprocessor_option (argv[i] + prev, j - prev);
3890 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3891 /* The +e options to the C++ front-end. */
3892 n_switches++;
3893 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3895 int j;
3896 /* Split the argument at commas. */
3897 for (j = 3; argv[i][j]; j++)
3898 n_infiles += (argv[i][j] == ',');
3900 else if (strcmp (argv[i], "-Xlinker") == 0)
3902 if (i + 1 == argc)
3903 fatal ("argument to '-Xlinker' is missing");
3905 n_infiles++;
3906 i++;
3908 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3910 if (i + 1 == argc)
3911 fatal ("argument to '-Xpreprocessor' is missing");
3913 add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
3915 else if (strcmp (argv[i], "-Xassembler") == 0)
3917 if (i + 1 == argc)
3918 fatal ("argument to '-Xassembler' is missing");
3920 add_assembler_option (argv[i+1], strlen (argv[i+1]));
3922 else if (strcmp (argv[i], "-l") == 0)
3924 if (i + 1 == argc)
3925 fatal ("argument to '-l' is missing");
3927 n_infiles++;
3928 i++;
3930 else if (strncmp (argv[i], "-l", 2) == 0)
3931 n_infiles++;
3932 else if (strcmp (argv[i], "-save-temps") == 0)
3934 save_temps_flag = SAVE_TEMPS_CWD;
3935 n_switches++;
3937 else if (strncmp (argv[i], "-save-temps=", 12) == 0)
3939 n_switches++;
3940 if (strcmp (argv[i]+12, "cwd") == 0)
3941 save_temps_flag = SAVE_TEMPS_CWD;
3942 else if (strcmp (argv[i]+12, "obj") == 0
3943 || strcmp (argv[i]+12, "object") == 0)
3944 save_temps_flag = SAVE_TEMPS_OBJ;
3945 else
3946 fatal ("'%s' is an unknown -save-temps option", argv[i]);
3948 else if (strcmp (argv[i], "-no-canonical-prefixes") == 0)
3949 /* Already handled as a special case, so ignored here. */
3951 else if (strcmp (argv[i], "-combine") == 0)
3953 combine_flag = 1;
3954 n_switches++;
3956 else if (strcmp (argv[i], "-specs") == 0)
3958 struct user_specs *user = XNEW (struct user_specs);
3959 if (++i >= argc)
3960 fatal ("argument to '-specs' is missing");
3962 user->next = (struct user_specs *) 0;
3963 user->filename = argv[i];
3964 if (user_specs_tail)
3965 user_specs_tail->next = user;
3966 else
3967 user_specs_head = user;
3968 user_specs_tail = user;
3970 else if (strncmp (argv[i], "-specs=", 7) == 0)
3972 struct user_specs *user = XNEW (struct user_specs);
3973 if (strlen (argv[i]) == 7)
3974 fatal ("argument to '-specs=' is missing");
3976 user->next = (struct user_specs *) 0;
3977 user->filename = argv[i] + 7;
3978 if (user_specs_tail)
3979 user_specs_tail->next = user;
3980 else
3981 user_specs_head = user;
3982 user_specs_tail = user;
3984 else if (strcmp (argv[i], "-time") == 0)
3985 report_times = 1;
3986 else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
3988 if (report_times_to_file)
3989 fclose (report_times_to_file);
3990 report_times_to_file = fopen (argv[i] + sizeof ("-time=") - 1, "a");
3992 else if (strcmp (argv[i], "-pipe") == 0)
3994 /* -pipe has to go into the switches array as well as
3995 setting a flag. */
3996 use_pipes = 1;
3997 n_switches++;
3999 else if (strcmp (argv[i], "-wrapper") == 0)
4001 if (++i >= argc)
4002 fatal ("argument to '-wrapper' is missing");
4004 wrapper_string = argv[i];
4005 n_switches++;
4006 n_switches++;
4008 else if (strcmp (argv[i], "-###") == 0)
4010 /* This is similar to -v except that there is no execution
4011 of the commands and the echoed arguments are quoted. It
4012 is intended for use in shell scripts to capture the
4013 driver-generated command line. */
4014 verbose_only_flag++;
4015 verbose_flag++;
4017 else if (argv[i][0] == '-' && argv[i][1] != 0)
4019 const char *p = &argv[i][1];
4020 int c = *p;
4022 switch (c)
4024 case 'B':
4026 const char *value;
4027 int len;
4029 if (p[1] == 0 && i + 1 == argc)
4030 fatal ("argument to '-B' is missing");
4031 if (p[1] == 0)
4032 value = argv[++i];
4033 else
4034 value = p + 1;
4036 len = strlen (value);
4038 /* Catch the case where the user has forgotten to append a
4039 directory separator to the path. Note, they may be using
4040 -B to add an executable name prefix, eg "i386-elf-", in
4041 order to distinguish between multiple installations of
4042 GCC in the same directory. Hence we must check to see
4043 if appending a directory separator actually makes a
4044 valid directory name. */
4045 if (! IS_DIR_SEPARATOR (value [len - 1])
4046 && is_directory (value, false))
4048 char *tmp = XNEWVEC (char, len + 2);
4049 strcpy (tmp, value);
4050 tmp[len] = DIR_SEPARATOR;
4051 tmp[++ len] = 0;
4052 value = tmp;
4055 add_prefix (&exec_prefixes, value, NULL,
4056 PREFIX_PRIORITY_B_OPT, 0, 0);
4057 add_prefix (&startfile_prefixes, value, NULL,
4058 PREFIX_PRIORITY_B_OPT, 0, 0);
4059 add_prefix (&include_prefixes, value, NULL,
4060 PREFIX_PRIORITY_B_OPT, 0, 0);
4061 n_switches++;
4063 break;
4065 case 'v': /* Print our subcommands and print versions. */
4066 n_switches++;
4067 /* If they do anything other than exactly `-v', don't set
4068 verbose_flag; rather, continue on to give the error. */
4069 if (p[1] != 0)
4070 break;
4071 verbose_flag++;
4072 break;
4074 case 'S':
4075 case 'c':
4076 case 'E':
4077 if (p[1] == 0)
4079 have_c = 1;
4080 n_switches++;
4081 break;
4083 goto normal_switch;
4085 case 'o':
4086 have_o = 1;
4087 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
4088 if (! have_c)
4090 int skip;
4092 /* Forward scan, just in case -S, -E or -c is specified
4093 after -o. */
4094 int j = i + 1;
4095 if (p[1] == 0)
4096 ++j;
4097 while (j < argc)
4099 if (argv[j][0] == '-')
4101 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
4102 && argv[j][2] == 0)
4104 have_c = 1;
4105 break;
4107 else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
4108 j += skip - (argv[j][2] != 0);
4109 else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
4110 j += skip;
4112 j++;
4115 #endif
4116 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4117 if (p[1] == 0)
4118 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
4119 else
4120 argv[i] = convert_filename (argv[i], ! have_c, 0);
4121 #endif
4122 /* Save the output name in case -save-temps=obj was used. */
4123 if ((p[1] == 0) && argv[i + 1])
4124 save_temps_prefix = xstrdup(argv[i + 1]);
4125 else
4126 save_temps_prefix = xstrdup(argv[i] + 1);
4127 goto normal_switch;
4129 default:
4130 normal_switch:
4132 #ifdef MODIFY_TARGET_NAME
4133 is_modify_target_name = 0;
4135 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
4136 if (! strcmp (argv[i], modify_target[j].sw))
4138 char *new_name = XNEWVEC (char, strlen (modify_target[j].str)
4139 + strlen (spec_machine));
4140 const char *p, *r;
4141 char *q;
4142 int made_addition = 0;
4144 is_modify_target_name = 1;
4145 for (p = spec_machine, q = new_name; *p != 0; )
4147 if (modify_target[j].add_del == DELETE
4148 && (! strncmp (q, modify_target[j].str,
4149 strlen (modify_target[j].str))))
4150 p += strlen (modify_target[j].str);
4151 else if (modify_target[j].add_del == ADD
4152 && ! made_addition && *p == '-')
4154 for (r = modify_target[j].str; *r != 0; )
4155 *q++ = *r++;
4156 made_addition = 1;
4159 *q++ = *p++;
4162 spec_machine = new_name;
4165 if (is_modify_target_name)
4166 break;
4167 #endif
4169 n_switches++;
4171 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
4172 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
4173 else if (WORD_SWITCH_TAKES_ARG (p))
4174 i += WORD_SWITCH_TAKES_ARG (p);
4177 else
4179 n_infiles++;
4180 lang_n_infiles++;
4184 /* If -save-temps=obj and -o name, create the prefix to use for %b.
4185 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
4186 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4188 save_temps_length = strlen (save_temps_prefix);
4189 temp = strrchr (lbasename (save_temps_prefix), '.');
4190 if (temp)
4192 save_temps_length -= strlen (temp);
4193 save_temps_prefix[save_temps_length] = '\0';
4197 else if (save_temps_prefix != NULL)
4199 free (save_temps_prefix);
4200 save_temps_prefix = NULL;
4203 if (save_temps_flag && use_pipes)
4205 /* -save-temps overrides -pipe, so that temp files are produced */
4206 if (save_temps_flag)
4207 error ("warning: -pipe ignored because -save-temps specified");
4208 use_pipes = 0;
4211 if (!compare_debug)
4213 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
4215 if (gcd && gcd[0] == '-')
4217 compare_debug = 2;
4218 compare_debug_opt = gcd;
4219 n_switches++;
4221 else if (gcd && *gcd && strcmp (gcd, "0"))
4223 compare_debug = 3;
4224 compare_debug_opt = "-gtoggle";
4225 n_switches++;
4228 else if (compare_debug < 0)
4230 compare_debug = 0;
4231 gcc_assert (!compare_debug_opt);
4234 /* Set up the search paths. We add directories that we expect to
4235 contain GNU Toolchain components before directories specified by
4236 the machine description so that we will find GNU components (like
4237 the GNU assembler) before those of the host system. */
4239 /* If we don't know where the toolchain has been installed, use the
4240 configured-in locations. */
4241 if (!gcc_exec_prefix)
4243 #ifndef OS2
4244 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4245 PREFIX_PRIORITY_LAST, 1, 0);
4246 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4247 PREFIX_PRIORITY_LAST, 2, 0);
4248 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4249 PREFIX_PRIORITY_LAST, 2, 0);
4250 #endif
4251 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4252 PREFIX_PRIORITY_LAST, 1, 0);
4255 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4256 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
4257 dir_separator_str, NULL);
4259 /* Look for tools relative to the location from which the driver is
4260 running, or, if that is not available, the configured prefix. */
4261 tooldir_prefix
4262 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4263 spec_machine, dir_separator_str,
4264 spec_version, dir_separator_str, tooldir_prefix, NULL);
4266 add_prefix (&exec_prefixes,
4267 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4268 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4269 add_prefix (&startfile_prefixes,
4270 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4271 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4273 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4274 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4275 then consider it to relocate with the rest of the GCC installation
4276 if GCC_EXEC_PREFIX is set.
4277 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4278 if (target_system_root && gcc_exec_prefix)
4280 char *tmp_prefix = get_relative_prefix (argv[0],
4281 standard_bindir_prefix,
4282 target_system_root);
4283 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4285 target_system_root = tmp_prefix;
4286 target_system_root_changed = 1;
4289 #endif
4291 /* More prefixes are enabled in main, after we read the specs file
4292 and determine whether this is cross-compilation or not. */
4294 /* Then create the space for the vectors and scan again. */
4296 switches = XNEWVEC (struct switchstr, n_switches + 1);
4297 infiles = XNEWVEC (struct infile, n_infiles + 1);
4298 n_switches = 0;
4299 n_infiles = 0;
4300 last_language_n_infiles = -1;
4302 /* This, time, copy the text of each switch and store a pointer
4303 to the copy in the vector of switches.
4304 Store all the infiles in their vector. */
4306 for (i = 1; i < argc; i++)
4308 /* Just skip the switches that were handled by the preceding loop. */
4309 #ifdef MODIFY_TARGET_NAME
4310 is_modify_target_name = 0;
4312 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
4313 if (! strcmp (argv[i], modify_target[j].sw))
4314 is_modify_target_name = 1;
4316 if (is_modify_target_name)
4318 else
4319 #endif
4320 if (! strncmp (argv[i], "-Wa,", 4))
4322 else if (! strncmp (argv[i], "-Wp,", 4))
4324 else if (! strcmp (argv[i], "-no-canonical-prefixes"))
4326 else if (! strcmp (argv[i], "-pass-exit-codes"))
4328 else if (! strcmp (argv[i], "-print-search-dirs"))
4330 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
4332 else if (! strncmp (argv[i], "-print-file-name=", 17))
4334 else if (! strncmp (argv[i], "-print-prog-name=", 17))
4336 else if (! strcmp (argv[i], "-print-multi-lib"))
4338 else if (! strcmp (argv[i], "-print-multi-directory"))
4340 else if (! strcmp (argv[i], "-print-sysroot"))
4342 else if (! strcmp (argv[i], "-print-multi-os-directory"))
4344 else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
4346 else if (! strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")))
4348 target_system_root = argv[i] + strlen ("--sysroot=");
4349 target_system_root_changed = 1;
4351 else if (argv[i][0] == '+' && argv[i][1] == 'e')
4353 /* Compensate for the +e options to the C++ front-end;
4354 they're there simply for cfront call-compatibility. We do
4355 some magic in default_compilers to pass them down properly.
4356 Note we deliberately start at the `+' here, to avoid passing
4357 -e0 or -e1 down into the linker. */
4358 switches[n_switches].part1 = &argv[i][0];
4359 switches[n_switches].args = 0;
4360 switches[n_switches].live_cond = 0;
4361 switches[n_switches].validated = 0;
4362 n_switches++;
4364 else if (strncmp (argv[i], "-Wl,", 4) == 0)
4366 int prev, j;
4367 /* Split the argument at commas. */
4368 prev = 4;
4369 for (j = 4; argv[i][j]; j++)
4370 if (argv[i][j] == ',')
4372 infiles[n_infiles].language = "*";
4373 infiles[n_infiles++].name
4374 = save_string (argv[i] + prev, j - prev);
4375 prev = j + 1;
4377 /* Record the part after the last comma. */
4378 infiles[n_infiles].language = "*";
4379 infiles[n_infiles++].name = argv[i] + prev;
4381 else if (strcmp (argv[i], "-Xlinker") == 0)
4383 infiles[n_infiles].language = "*";
4384 infiles[n_infiles++].name = argv[++i];
4386 /* Xassembler and Xpreprocessor were already handled in the first argv
4387 scan, so all we need to do here is ignore them and their argument. */
4388 else if (strcmp (argv[i], "-Xassembler") == 0)
4389 i++;
4390 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
4391 i++;
4392 else if (strcmp (argv[i], "-l") == 0)
4393 { /* POSIX allows separation of -l and the lib arg;
4394 canonicalize by concatenating -l with its arg */
4395 infiles[n_infiles].language = "*";
4396 infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
4398 else if (strncmp (argv[i], "-l", 2) == 0)
4400 infiles[n_infiles].language = "*";
4401 infiles[n_infiles++].name = argv[i];
4403 else if (strcmp (argv[i], "-wrapper") == 0)
4404 i++;
4405 else if (strcmp (argv[i], "-specs") == 0)
4406 i++;
4407 else if (strncmp (argv[i], "-specs=", 7) == 0)
4409 else if (strcmp (argv[i], "-time") == 0)
4411 else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
4413 else if (strcmp (argv[i], "-###") == 0)
4415 else if (argv[i][0] == '-' && argv[i][1] != 0)
4417 const char *p = &argv[i][1];
4418 int c = *p;
4420 if (c == 'x')
4422 if (p[1] == 0 && i + 1 == argc)
4423 fatal ("argument to '-x' is missing");
4424 if (p[1] == 0)
4425 spec_lang = argv[++i];
4426 else
4427 spec_lang = p + 1;
4428 if (! strcmp (spec_lang, "none"))
4429 /* Suppress the warning if -xnone comes after the last input
4430 file, because alternate command interfaces like g++ might
4431 find it useful to place -xnone after each input file. */
4432 spec_lang = 0;
4433 else
4434 last_language_n_infiles = n_infiles;
4435 continue;
4437 switches[n_switches].part1 = p;
4438 /* Deal with option arguments in separate argv elements. */
4439 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4440 || WORD_SWITCH_TAKES_ARG (p))
4442 int j = 0;
4443 int n_args = WORD_SWITCH_TAKES_ARG (p);
4445 if (n_args == 0)
4447 /* Count only the option arguments in separate argv elements. */
4448 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4450 if (i + n_args >= argc)
4451 fatal ("argument to '-%s' is missing", p);
4452 switches[n_switches].args
4453 = XNEWVEC (const char *, n_args + 1);
4454 while (j < n_args)
4455 switches[n_switches].args[j++] = argv[++i];
4456 /* Null-terminate the vector. */
4457 switches[n_switches].args[j] = 0;
4459 else if (strchr (switches_need_spaces, c))
4461 /* On some systems, ld cannot handle some options without
4462 a space. So split the option from its argument. */
4463 char *part1 = XNEWVEC (char, 2);
4464 part1[0] = c;
4465 part1[1] = '\0';
4467 switches[n_switches].part1 = part1;
4468 switches[n_switches].args = XNEWVEC (const char *, 2);
4469 switches[n_switches].args[0] = xstrdup (p+1);
4470 switches[n_switches].args[1] = 0;
4472 else
4473 switches[n_switches].args = 0;
4475 switches[n_switches].live_cond = 0;
4476 switches[n_switches].validated = 0;
4477 switches[n_switches].ordering = 0;
4478 /* These are always valid, since gcc.c itself understands the
4479 first four, gfortranspec.c understands -static-libgfortran
4480 and g++spec.c understands -static-libstdc++ */
4481 if (!strcmp (p, "save-temps")
4482 || !strcmp (p, "static-libgcc")
4483 || !strcmp (p, "shared-libgcc")
4484 || !strcmp (p, "pipe")
4485 || !strcmp (p, "static-libgfortran")
4486 || !strcmp (p, "static-libstdc++"))
4487 switches[n_switches].validated = 1;
4488 else
4490 char ch = switches[n_switches].part1[0];
4491 if (ch == 'B')
4492 switches[n_switches].validated = 1;
4494 n_switches++;
4496 else
4498 const char *p = strrchr (argv[i], '@');
4499 char *fname;
4500 long offset;
4501 int consumed;
4502 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4503 argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
4504 #endif
4505 /* For LTO static archive support we handle input file
4506 specifications that are composed of a filename and
4507 an offset like FNAME@OFFSET. */
4508 if (p
4509 && p != argv[i]
4510 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4511 && strlen (p) == (unsigned int)consumed)
4513 fname = (char *)xmalloc (p - argv[i] + 1);
4514 memcpy (fname, argv[i], p - argv[i]);
4515 fname[p - argv[i]] = '\0';
4516 /* Only accept non-stdin and existing FNAME parts, otherwise
4517 try with the full name. */
4518 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4520 free (fname);
4521 fname = xstrdup (argv[i]);
4524 else
4525 fname = xstrdup (argv[i]);
4527 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4529 perror_with_name (fname);
4530 error_count++;
4532 else
4534 infiles[n_infiles].language = spec_lang;
4535 infiles[n_infiles++].name = argv[i];
4538 free (fname);
4542 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4543 error ("warning: '-x %s' after last input file has no effect", spec_lang);
4545 if (compare_debug == 2 || compare_debug == 3)
4547 switches[n_switches].part1 = concat ("fcompare-debug=",
4548 compare_debug_opt,
4549 NULL);
4550 switches[n_switches].args = 0;
4551 switches[n_switches].live_cond = 0;
4552 switches[n_switches].validated = 0;
4553 switches[n_switches].ordering = 0;
4554 n_switches++;
4555 compare_debug = 1;
4558 /* Ensure we only invoke each subprocess once. */
4559 if (print_subprocess_help || print_help_list || print_version)
4561 n_infiles = 1;
4563 /* Create a dummy input file, so that we can pass
4564 the help option on to the various sub-processes. */
4565 infiles[0].language = "c";
4566 infiles[0].name = "help-dummy";
4569 switches[n_switches].part1 = 0;
4570 infiles[n_infiles].name = 0;
4573 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4574 and place that in the environment. */
4576 static void
4577 set_collect_gcc_options (void)
4579 int i;
4580 int first_time;
4582 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4583 the compiler. */
4584 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4585 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4587 first_time = TRUE;
4588 for (i = 0; (int) i < n_switches; i++)
4590 const char *const *args;
4591 const char *p, *q;
4592 if (!first_time)
4593 obstack_grow (&collect_obstack, " ", 1);
4595 first_time = FALSE;
4597 /* Ignore elided switches. */
4598 if ((switches[i].live_cond & SWITCH_IGNORE) != 0)
4599 continue;
4601 obstack_grow (&collect_obstack, "'-", 2);
4602 q = switches[i].part1;
4603 while ((p = strchr (q, '\'')))
4605 obstack_grow (&collect_obstack, q, p - q);
4606 obstack_grow (&collect_obstack, "'\\''", 4);
4607 q = ++p;
4609 obstack_grow (&collect_obstack, q, strlen (q));
4610 obstack_grow (&collect_obstack, "'", 1);
4612 for (args = switches[i].args; args && *args; args++)
4614 obstack_grow (&collect_obstack, " '", 2);
4615 q = *args;
4616 while ((p = strchr (q, '\'')))
4618 obstack_grow (&collect_obstack, q, p - q);
4619 obstack_grow (&collect_obstack, "'\\''", 4);
4620 q = ++p;
4622 obstack_grow (&collect_obstack, q, strlen (q));
4623 obstack_grow (&collect_obstack, "'", 1);
4626 obstack_grow (&collect_obstack, "\0", 1);
4627 xputenv (XOBFINISH (&collect_obstack, char *));
4630 /* Process a spec string, accumulating and running commands. */
4632 /* These variables describe the input file name.
4633 input_file_number is the index on outfiles of this file,
4634 so that the output file name can be stored for later use by %o.
4635 input_basename is the start of the part of the input file
4636 sans all directory names, and basename_length is the number
4637 of characters starting there excluding the suffix .c or whatever. */
4639 static const char *input_filename;
4640 static int input_file_number;
4641 size_t input_filename_length;
4642 static int basename_length;
4643 static int suffixed_basename_length;
4644 static const char *input_basename;
4645 static const char *input_suffix;
4646 #ifndef HOST_LACKS_INODE_NUMBERS
4647 static struct stat input_stat;
4648 #endif
4649 static int input_stat_set;
4651 /* The compiler used to process the current input file. */
4652 static struct compiler *input_file_compiler;
4654 /* These are variables used within do_spec and do_spec_1. */
4656 /* Nonzero if an arg has been started and not yet terminated
4657 (with space, tab or newline). */
4658 static int arg_going;
4660 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4661 is a temporary file name. */
4662 static int delete_this_arg;
4664 /* Nonzero means %w has been seen; the next arg to be terminated
4665 is the output file name of this compilation. */
4666 static int this_is_output_file;
4668 /* Nonzero means %s has been seen; the next arg to be terminated
4669 is the name of a library file and we should try the standard
4670 search dirs for it. */
4671 static int this_is_library_file;
4673 /* Nonzero means %T has been seen; the next arg to be terminated
4674 is the name of a linker script and we should try all of the
4675 standard search dirs for it. If it is found insert a --script
4676 command line switch and then substitute the full path in place,
4677 otherwise generate an error message. */
4678 static int this_is_linker_script;
4680 /* Nonzero means that the input of this command is coming from a pipe. */
4681 static int input_from_pipe;
4683 /* Nonnull means substitute this for any suffix when outputting a switches
4684 arguments. */
4685 static const char *suffix_subst;
4687 /* If there is an argument being accumulated, terminate it and store it. */
4689 static void
4690 end_going_arg (void)
4692 if (arg_going)
4694 const char *string;
4696 obstack_1grow (&obstack, 0);
4697 string = XOBFINISH (&obstack, const char *);
4698 if (this_is_library_file)
4699 string = find_file (string);
4700 if (this_is_linker_script)
4702 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4704 if (full_script_path == NULL)
4706 error (_("unable to locate default linker script '%s' in the library search paths"), string);
4707 /* Script was not found on search path. */
4708 return;
4710 store_arg ("--script", false, false);
4711 string = full_script_path;
4713 store_arg (string, delete_this_arg, this_is_output_file);
4714 if (this_is_output_file)
4715 outfiles[input_file_number] = string;
4716 arg_going = 0;
4721 /* Parse the WRAPPER string which is a comma separated list of the command line
4722 and insert them into the beginning of argbuf. */
4724 static void
4725 insert_wrapper (const char *wrapper)
4727 int n = 0;
4728 int i;
4729 char *buf = xstrdup (wrapper);
4730 char *p = buf;
4734 n++;
4735 while (*p == ',')
4736 p++;
4738 while ((p = strchr (p, ',')) != NULL);
4740 if (argbuf_index + n >= argbuf_length)
4742 argbuf_length = argbuf_length * 2;
4743 while (argbuf_length < argbuf_index + n)
4744 argbuf_length *= 2;
4745 argbuf = XRESIZEVEC (const char *, argbuf, argbuf_length);
4747 for (i = argbuf_index - 1; i >= 0; i--)
4748 argbuf[i + n] = argbuf[i];
4750 i = 0;
4751 p = buf;
4754 while (*p == ',')
4756 *p = 0;
4757 p++;
4759 argbuf[i++] = p;
4761 while ((p = strchr (p, ',')) != NULL);
4762 gcc_assert (i == n);
4763 argbuf_index += n;
4766 /* Process the spec SPEC and run the commands specified therein.
4767 Returns 0 if the spec is successfully processed; -1 if failed. */
4770 do_spec (const char *spec)
4772 int value;
4774 value = do_spec_2 (spec);
4776 /* Force out any unfinished command.
4777 If -pipe, this forces out the last command if it ended in `|'. */
4778 if (value == 0)
4780 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4781 argbuf_index--;
4783 set_collect_gcc_options ();
4785 if (argbuf_index > 0)
4786 value = execute ();
4789 return value;
4792 static int
4793 do_spec_2 (const char *spec)
4795 int result;
4797 clear_args ();
4798 arg_going = 0;
4799 delete_this_arg = 0;
4800 this_is_output_file = 0;
4801 this_is_library_file = 0;
4802 this_is_linker_script = 0;
4803 input_from_pipe = 0;
4804 suffix_subst = NULL;
4806 result = do_spec_1 (spec, 0, NULL);
4808 end_going_arg ();
4810 return result;
4814 /* Process the given spec string and add any new options to the end
4815 of the switches/n_switches array. */
4817 static void
4818 do_option_spec (const char *name, const char *spec)
4820 unsigned int i, value_count, value_len;
4821 const char *p, *q, *value;
4822 char *tmp_spec, *tmp_spec_p;
4824 if (configure_default_options[0].name == NULL)
4825 return;
4827 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4828 if (strcmp (configure_default_options[i].name, name) == 0)
4829 break;
4830 if (i == ARRAY_SIZE (configure_default_options))
4831 return;
4833 value = configure_default_options[i].value;
4834 value_len = strlen (value);
4836 /* Compute the size of the final spec. */
4837 value_count = 0;
4838 p = spec;
4839 while ((p = strstr (p, "%(VALUE)")) != NULL)
4841 p ++;
4842 value_count ++;
4845 /* Replace each %(VALUE) by the specified value. */
4846 tmp_spec = (char *) alloca (strlen (spec) + 1
4847 + value_count * (value_len - strlen ("%(VALUE)")));
4848 tmp_spec_p = tmp_spec;
4849 q = spec;
4850 while ((p = strstr (q, "%(VALUE)")) != NULL)
4852 memcpy (tmp_spec_p, q, p - q);
4853 tmp_spec_p = tmp_spec_p + (p - q);
4854 memcpy (tmp_spec_p, value, value_len);
4855 tmp_spec_p += value_len;
4856 q = p + strlen ("%(VALUE)");
4858 strcpy (tmp_spec_p, q);
4860 do_self_spec (tmp_spec);
4863 /* Process the given spec string and add any new options to the end
4864 of the switches/n_switches array. */
4866 static void
4867 do_self_spec (const char *spec)
4869 int i;
4871 do_spec_2 (spec);
4872 do_spec_1 (" ", 0, NULL);
4874 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4875 do_self_specs adds the replacements to switches array, so it shouldn't
4876 be processed afterwards. */
4877 for (i = 0; i < n_switches; i++)
4878 if ((switches[i].live_cond & SWITCH_IGNORE))
4879 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4881 if (argbuf_index > 0)
4883 switches = XRESIZEVEC (struct switchstr, switches,
4884 n_switches + argbuf_index + 1);
4886 for (i = 0; i < argbuf_index; i++)
4888 struct switchstr *sw;
4889 const char *p = argbuf[i];
4890 int c = *p;
4892 /* Each switch should start with '-'. */
4893 if (c != '-')
4894 fatal ("switch '%s' does not start with '-'", argbuf[i]);
4896 p++;
4897 c = *p;
4899 sw = &switches[n_switches++];
4900 sw->part1 = p;
4901 sw->live_cond = 0;
4902 sw->validated = 0;
4903 sw->ordering = 0;
4905 /* Deal with option arguments in separate argv elements. */
4906 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4907 || WORD_SWITCH_TAKES_ARG (p))
4909 int j = 0;
4910 int n_args = WORD_SWITCH_TAKES_ARG (p);
4912 if (n_args == 0)
4914 /* Count only the option arguments in separate argv elements. */
4915 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4917 if (i + n_args >= argbuf_index)
4918 fatal ("argument to '-%s' is missing", p);
4919 sw->args
4920 = XNEWVEC (const char *, n_args + 1);
4921 while (j < n_args)
4922 sw->args[j++] = argbuf[++i];
4923 /* Null-terminate the vector. */
4924 sw->args[j] = 0;
4926 else if (strchr (switches_need_spaces, c))
4928 /* On some systems, ld cannot handle some options without
4929 a space. So split the option from its argument. */
4930 char *part1 = XNEWVEC (char, 2);
4931 part1[0] = c;
4932 part1[1] = '\0';
4934 sw->part1 = part1;
4935 sw->args = XNEWVEC (const char *, 2);
4936 sw->args[0] = xstrdup (p+1);
4937 sw->args[1] = 0;
4939 else
4940 sw->args = 0;
4943 switches[n_switches].part1 = 0;
4947 /* Callback for processing %D and %I specs. */
4949 struct spec_path_info {
4950 const char *option;
4951 const char *append;
4952 size_t append_len;
4953 bool omit_relative;
4954 bool separate_options;
4957 static void *
4958 spec_path (char *path, void *data)
4960 struct spec_path_info *info = (struct spec_path_info *) data;
4961 size_t len = 0;
4962 char save = 0;
4964 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4965 return NULL;
4967 if (info->append_len != 0)
4969 len = strlen (path);
4970 memcpy (path + len, info->append, info->append_len + 1);
4973 if (!is_directory (path, true))
4974 return NULL;
4976 do_spec_1 (info->option, 1, NULL);
4977 if (info->separate_options)
4978 do_spec_1 (" ", 0, NULL);
4980 if (info->append_len == 0)
4982 len = strlen (path);
4983 save = path[len - 1];
4984 if (IS_DIR_SEPARATOR (path[len - 1]))
4985 path[len - 1] = '\0';
4988 do_spec_1 (path, 1, NULL);
4989 do_spec_1 (" ", 0, NULL);
4991 /* Must not damage the original path. */
4992 if (info->append_len == 0)
4993 path[len - 1] = save;
4995 return NULL;
4998 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4999 argument list. */
5001 static void
5002 create_at_file (char **argv)
5004 char *temp_file = make_temp_file ("");
5005 char *at_argument = concat ("@", temp_file, NULL);
5006 FILE *f = fopen (temp_file, "w");
5007 int status;
5009 if (f == NULL)
5010 fatal ("could not open temporary response file %s",
5011 temp_file);
5013 status = writeargv (argv, f);
5015 if (status)
5016 fatal ("could not write to temporary response file %s",
5017 temp_file);
5019 status = fclose (f);
5021 if (EOF == status)
5022 fatal ("could not close temporary response file %s",
5023 temp_file);
5025 store_arg (at_argument, 0, 0);
5027 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
5030 /* True if we should compile INFILE. */
5032 static bool
5033 compile_input_file_p (struct infile *infile)
5035 if ((!infile->language) || (infile->language[0] != '*'))
5036 if (infile->incompiler == input_file_compiler)
5037 return true;
5038 return false;
5041 /* Process the sub-spec SPEC as a portion of a larger spec.
5042 This is like processing a whole spec except that we do
5043 not initialize at the beginning and we do not supply a
5044 newline by default at the end.
5045 INSWITCH nonzero means don't process %-sequences in SPEC;
5046 in this case, % is treated as an ordinary character.
5047 This is used while substituting switches.
5048 INSWITCH nonzero also causes SPC not to terminate an argument.
5050 Value is zero unless a line was finished
5051 and the command on that line reported an error. */
5053 static int
5054 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
5056 const char *p = spec;
5057 int c;
5058 int i;
5059 int value;
5061 while ((c = *p++))
5062 /* If substituting a switch, treat all chars like letters.
5063 Otherwise, NL, SPC, TAB and % are special. */
5064 switch (inswitch ? 'a' : c)
5066 case '\n':
5067 end_going_arg ();
5069 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
5071 /* A `|' before the newline means use a pipe here,
5072 but only if -pipe was specified.
5073 Otherwise, execute now and don't pass the `|' as an arg. */
5074 if (use_pipes)
5076 input_from_pipe = 1;
5077 break;
5079 else
5080 argbuf_index--;
5083 set_collect_gcc_options ();
5085 if (argbuf_index > 0)
5087 value = execute ();
5088 if (value)
5089 return value;
5091 /* Reinitialize for a new command, and for a new argument. */
5092 clear_args ();
5093 arg_going = 0;
5094 delete_this_arg = 0;
5095 this_is_output_file = 0;
5096 this_is_library_file = 0;
5097 this_is_linker_script = 0;
5098 input_from_pipe = 0;
5099 break;
5101 case '|':
5102 end_going_arg ();
5104 /* Use pipe */
5105 obstack_1grow (&obstack, c);
5106 arg_going = 1;
5107 break;
5109 case '\t':
5110 case ' ':
5111 end_going_arg ();
5113 /* Reinitialize for a new argument. */
5114 delete_this_arg = 0;
5115 this_is_output_file = 0;
5116 this_is_library_file = 0;
5117 this_is_linker_script = 0;
5118 break;
5120 case '%':
5121 switch (c = *p++)
5123 case 0:
5124 fatal ("spec '%s' invalid", spec);
5126 case 'b':
5127 if (save_temps_length)
5128 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5129 else
5130 obstack_grow (&obstack, input_basename, basename_length);
5131 if (compare_debug < 0)
5132 obstack_grow (&obstack, ".gk", 3);
5133 arg_going = 1;
5134 break;
5136 case 'B':
5137 if (save_temps_length)
5138 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5139 else
5140 obstack_grow (&obstack, input_basename, suffixed_basename_length);
5141 if (compare_debug < 0)
5142 obstack_grow (&obstack, ".gk", 3);
5143 arg_going = 1;
5144 break;
5146 case 'd':
5147 delete_this_arg = 2;
5148 break;
5150 /* Dump out the directories specified with LIBRARY_PATH,
5151 followed by the absolute directories
5152 that we search for startfiles. */
5153 case 'D':
5155 struct spec_path_info info;
5157 info.option = "-L";
5158 info.append_len = 0;
5159 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
5160 /* Used on systems which record the specified -L dirs
5161 and use them to search for dynamic linking.
5162 Relative directories always come from -B,
5163 and it is better not to use them for searching
5164 at run time. In particular, stage1 loses. */
5165 info.omit_relative = true;
5166 #else
5167 info.omit_relative = false;
5168 #endif
5169 info.separate_options = false;
5171 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5173 break;
5175 case 'e':
5176 /* %efoo means report an error with `foo' as error message
5177 and don't execute any more commands for this file. */
5179 const char *q = p;
5180 char *buf;
5181 while (*p != 0 && *p != '\n')
5182 p++;
5183 buf = (char *) alloca (p - q + 1);
5184 strncpy (buf, q, p - q);
5185 buf[p - q] = 0;
5186 error ("%s", _(buf));
5187 return -1;
5189 break;
5190 case 'n':
5191 /* %nfoo means report a notice with `foo' on stderr. */
5193 const char *q = p;
5194 char *buf;
5195 while (*p != 0 && *p != '\n')
5196 p++;
5197 buf = (char *) alloca (p - q + 1);
5198 strncpy (buf, q, p - q);
5199 buf[p - q] = 0;
5200 notice ("%s\n", _(buf));
5201 if (*p)
5202 p++;
5204 break;
5206 case 'j':
5208 struct stat st;
5210 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
5211 defined, and it is not a directory, and it is
5212 writable, use it. Otherwise, treat this like any
5213 other temporary file. */
5215 if ((!save_temps_flag)
5216 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
5217 && (access (HOST_BIT_BUCKET, W_OK) == 0))
5219 obstack_grow (&obstack, HOST_BIT_BUCKET,
5220 strlen (HOST_BIT_BUCKET));
5221 delete_this_arg = 0;
5222 arg_going = 1;
5223 break;
5226 goto create_temp_file;
5227 case '|':
5228 if (use_pipes)
5230 obstack_1grow (&obstack, '-');
5231 delete_this_arg = 0;
5232 arg_going = 1;
5234 /* consume suffix */
5235 while (*p == '.' || ISALNUM ((unsigned char) *p))
5236 p++;
5237 if (p[0] == '%' && p[1] == 'O')
5238 p += 2;
5240 break;
5242 goto create_temp_file;
5243 case 'm':
5244 if (use_pipes)
5246 /* consume suffix */
5247 while (*p == '.' || ISALNUM ((unsigned char) *p))
5248 p++;
5249 if (p[0] == '%' && p[1] == 'O')
5250 p += 2;
5252 break;
5254 goto create_temp_file;
5255 case 'g':
5256 case 'u':
5257 case 'U':
5258 create_temp_file:
5260 struct temp_name *t;
5261 int suffix_length;
5262 const char *suffix = p;
5263 char *saved_suffix = NULL;
5265 while (*p == '.' || ISALNUM ((unsigned char) *p))
5266 p++;
5267 suffix_length = p - suffix;
5268 if (p[0] == '%' && p[1] == 'O')
5270 p += 2;
5271 /* We don't support extra suffix characters after %O. */
5272 if (*p == '.' || ISALNUM ((unsigned char) *p))
5273 fatal ("spec '%s' has invalid '%%0%c'", spec, *p);
5274 if (suffix_length == 0)
5275 suffix = TARGET_OBJECT_SUFFIX;
5276 else
5278 saved_suffix
5279 = XNEWVEC (char, suffix_length
5280 + strlen (TARGET_OBJECT_SUFFIX));
5281 strncpy (saved_suffix, suffix, suffix_length);
5282 strcpy (saved_suffix + suffix_length,
5283 TARGET_OBJECT_SUFFIX);
5285 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5288 if (compare_debug < 0)
5290 suffix = concat (".gk", suffix, NULL);
5291 suffix_length += 3;
5294 /* If -save-temps=obj and -o were specified, use that for the
5295 temp file. */
5296 if (save_temps_length)
5298 char *tmp;
5299 temp_filename_length
5300 = save_temps_length + suffix_length + 1;
5301 tmp = (char *) alloca (temp_filename_length);
5302 memcpy (tmp, save_temps_prefix, save_temps_length);
5303 memcpy (tmp + save_temps_length, suffix, suffix_length);
5304 tmp[save_temps_length + suffix_length] = '\0';
5305 temp_filename = save_string (tmp,
5306 temp_filename_length + 1);
5307 obstack_grow (&obstack, temp_filename,
5308 temp_filename_length);
5309 arg_going = 1;
5310 delete_this_arg = 0;
5311 break;
5314 /* If the input_filename has the same suffix specified
5315 for the %g, %u, or %U, and -save-temps is specified,
5316 we could end up using that file as an intermediate
5317 thus clobbering the user's source file (.e.g.,
5318 gcc -save-temps foo.s would clobber foo.s with the
5319 output of cpp0). So check for this condition and
5320 generate a temp file as the intermediate. */
5322 if (save_temps_flag)
5324 char *tmp;
5325 temp_filename_length = basename_length + suffix_length + 1;
5326 tmp = (char *) alloca (temp_filename_length);
5327 memcpy (tmp, input_basename, basename_length);
5328 memcpy (tmp + basename_length, suffix, suffix_length);
5329 tmp[basename_length + suffix_length] = '\0';
5330 temp_filename = tmp;
5332 if (strcmp (temp_filename, input_filename) != 0)
5334 #ifndef HOST_LACKS_INODE_NUMBERS
5335 struct stat st_temp;
5337 /* Note, set_input() resets input_stat_set to 0. */
5338 if (input_stat_set == 0)
5340 input_stat_set = stat (input_filename, &input_stat);
5341 if (input_stat_set >= 0)
5342 input_stat_set = 1;
5345 /* If we have the stat for the input_filename
5346 and we can do the stat for the temp_filename
5347 then the they could still refer to the same
5348 file if st_dev/st_ino's are the same. */
5349 if (input_stat_set != 1
5350 || stat (temp_filename, &st_temp) < 0
5351 || input_stat.st_dev != st_temp.st_dev
5352 || input_stat.st_ino != st_temp.st_ino)
5353 #else
5354 /* Just compare canonical pathnames. */
5355 char* input_realname = lrealpath (input_filename);
5356 char* temp_realname = lrealpath (temp_filename);
5357 bool files_differ = strcmp (input_realname, temp_realname);
5358 free (input_realname);
5359 free (temp_realname);
5360 if (files_differ)
5361 #endif
5363 temp_filename = save_string (temp_filename,
5364 temp_filename_length + 1);
5365 obstack_grow (&obstack, temp_filename,
5366 temp_filename_length);
5367 arg_going = 1;
5368 delete_this_arg = 0;
5369 break;
5374 /* See if we already have an association of %g/%u/%U and
5375 suffix. */
5376 for (t = temp_names; t; t = t->next)
5377 if (t->length == suffix_length
5378 && strncmp (t->suffix, suffix, suffix_length) == 0
5379 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5380 break;
5382 /* Make a new association if needed. %u and %j
5383 require one. */
5384 if (t == 0 || c == 'u' || c == 'j')
5386 if (t == 0)
5388 t = XNEW (struct temp_name);
5389 t->next = temp_names;
5390 temp_names = t;
5392 t->length = suffix_length;
5393 if (saved_suffix)
5395 t->suffix = saved_suffix;
5396 saved_suffix = NULL;
5398 else
5399 t->suffix = save_string (suffix, suffix_length);
5400 t->unique = (c == 'u' || c == 'U' || c == 'j');
5401 temp_filename = make_temp_file (t->suffix);
5402 temp_filename_length = strlen (temp_filename);
5403 t->filename = temp_filename;
5404 t->filename_length = temp_filename_length;
5407 if (saved_suffix)
5408 free (saved_suffix);
5410 obstack_grow (&obstack, t->filename, t->filename_length);
5411 delete_this_arg = 1;
5413 arg_going = 1;
5414 break;
5416 case 'i':
5417 if (combine_inputs)
5419 if (at_file_supplied)
5421 /* We are going to expand `%i' to `@FILE', where FILE
5422 is a newly-created temporary filename. The filenames
5423 that would usually be expanded in place of %o will be
5424 written to the temporary file. */
5425 char **argv;
5426 int n_files = 0;
5427 int j;
5429 for (i = 0; i < n_infiles; i++)
5430 if (compile_input_file_p (&infiles[i]))
5431 n_files++;
5433 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5435 /* Copy the strings over. */
5436 for (i = 0, j = 0; i < n_infiles; i++)
5437 if (compile_input_file_p (&infiles[i]))
5439 argv[j] = CONST_CAST (char *, infiles[i].name);
5440 infiles[i].compiled = true;
5441 j++;
5443 argv[j] = NULL;
5445 create_at_file (argv);
5447 else
5448 for (i = 0; (int) i < n_infiles; i++)
5449 if (compile_input_file_p (&infiles[i]))
5451 store_arg (infiles[i].name, 0, 0);
5452 infiles[i].compiled = true;
5455 else
5457 obstack_grow (&obstack, input_filename, input_filename_length);
5458 arg_going = 1;
5460 break;
5462 case 'I':
5464 struct spec_path_info info;
5466 if (multilib_dir)
5468 do_spec_1 ("-imultilib", 1, NULL);
5469 /* Make this a separate argument. */
5470 do_spec_1 (" ", 0, NULL);
5471 do_spec_1 (multilib_dir, 1, NULL);
5472 do_spec_1 (" ", 0, NULL);
5475 if (gcc_exec_prefix)
5477 do_spec_1 ("-iprefix", 1, NULL);
5478 /* Make this a separate argument. */
5479 do_spec_1 (" ", 0, NULL);
5480 do_spec_1 (gcc_exec_prefix, 1, NULL);
5481 do_spec_1 (" ", 0, NULL);
5484 if (target_system_root_changed ||
5485 (target_system_root && target_sysroot_hdrs_suffix))
5487 do_spec_1 ("-isysroot", 1, NULL);
5488 /* Make this a separate argument. */
5489 do_spec_1 (" ", 0, NULL);
5490 do_spec_1 (target_system_root, 1, NULL);
5491 if (target_sysroot_hdrs_suffix)
5492 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5493 do_spec_1 (" ", 0, NULL);
5496 info.option = "-isystem";
5497 info.append = "include";
5498 info.append_len = strlen (info.append);
5499 info.omit_relative = false;
5500 info.separate_options = true;
5502 for_each_path (&include_prefixes, false, info.append_len,
5503 spec_path, &info);
5505 info.append = "include-fixed";
5506 if (*sysroot_hdrs_suffix_spec)
5507 info.append = concat (info.append, dir_separator_str,
5508 multilib_dir, NULL);
5509 info.append_len = strlen (info.append);
5510 for_each_path (&include_prefixes, false, info.append_len,
5511 spec_path, &info);
5513 break;
5515 case 'o':
5517 int max = n_infiles;
5518 max += lang_specific_extra_outfiles;
5520 if (HAVE_GNU_LD && at_file_supplied)
5522 /* We are going to expand `%o' to `@FILE', where FILE
5523 is a newly-created temporary filename. The filenames
5524 that would usually be expanded in place of %o will be
5525 written to the temporary file. */
5527 char **argv;
5528 int n_files, j;
5530 /* Convert OUTFILES into a form suitable for writeargv. */
5532 /* Determine how many are non-NULL. */
5533 for (n_files = 0, i = 0; i < max; i++)
5534 n_files += outfiles[i] != NULL;
5536 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5538 /* Copy the strings over. */
5539 for (i = 0, j = 0; i < max; i++)
5540 if (outfiles[i])
5542 argv[j] = CONST_CAST (char *, outfiles[i]);
5543 j++;
5545 argv[j] = NULL;
5547 create_at_file (argv);
5549 else
5550 for (i = 0; i < max; i++)
5551 if (outfiles[i])
5552 store_arg (outfiles[i], 0, 0);
5553 break;
5556 case 'O':
5557 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5558 arg_going = 1;
5559 break;
5561 case 's':
5562 this_is_library_file = 1;
5563 break;
5565 case 'T':
5566 this_is_linker_script = 1;
5567 break;
5569 case 'V':
5570 outfiles[input_file_number] = NULL;
5571 break;
5573 case 'w':
5574 this_is_output_file = 1;
5575 break;
5577 case 'W':
5579 int cur_index = argbuf_index;
5580 /* Handle the {...} following the %W. */
5581 if (*p != '{')
5582 fatal ("spec '%s' has invalid '%%W%c", spec, *p);
5583 p = handle_braces (p + 1);
5584 if (p == 0)
5585 return -1;
5586 end_going_arg ();
5587 /* If any args were output, mark the last one for deletion
5588 on failure. */
5589 if (argbuf_index != cur_index)
5590 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
5591 break;
5594 /* %x{OPTION} records OPTION for %X to output. */
5595 case 'x':
5597 const char *p1 = p;
5598 char *string;
5600 /* Skip past the option value and make a copy. */
5601 if (*p != '{')
5602 fatal ("spec '%s' has invalid '%%x%c'", spec, *p);
5603 while (*p++ != '}')
5605 string = save_string (p1 + 1, p - p1 - 2);
5607 /* See if we already recorded this option. */
5608 for (i = 0; i < n_linker_options; i++)
5609 if (! strcmp (string, linker_options[i]))
5611 free (string);
5612 return 0;
5615 /* This option is new; add it. */
5616 add_linker_option (string, strlen (string));
5618 break;
5620 /* Dump out the options accumulated previously using %x. */
5621 case 'X':
5622 for (i = 0; i < n_linker_options; i++)
5624 do_spec_1 (linker_options[i], 1, NULL);
5625 /* Make each accumulated option a separate argument. */
5626 do_spec_1 (" ", 0, NULL);
5628 break;
5630 /* Dump out the options accumulated previously using -Wa,. */
5631 case 'Y':
5632 for (i = 0; i < n_assembler_options; i++)
5634 do_spec_1 (assembler_options[i], 1, NULL);
5635 /* Make each accumulated option a separate argument. */
5636 do_spec_1 (" ", 0, NULL);
5638 break;
5640 /* Dump out the options accumulated previously using -Wp,. */
5641 case 'Z':
5642 for (i = 0; i < n_preprocessor_options; i++)
5644 do_spec_1 (preprocessor_options[i], 1, NULL);
5645 /* Make each accumulated option a separate argument. */
5646 do_spec_1 (" ", 0, NULL);
5648 break;
5650 /* Here are digits and numbers that just process
5651 a certain constant string as a spec. */
5653 case '1':
5654 value = do_spec_1 (cc1_spec, 0, NULL);
5655 if (value != 0)
5656 return value;
5657 break;
5659 case '2':
5660 value = do_spec_1 (cc1plus_spec, 0, NULL);
5661 if (value != 0)
5662 return value;
5663 break;
5665 case 'a':
5666 value = do_spec_1 (asm_spec, 0, NULL);
5667 if (value != 0)
5668 return value;
5669 break;
5671 case 'A':
5672 value = do_spec_1 (asm_final_spec, 0, NULL);
5673 if (value != 0)
5674 return value;
5675 break;
5677 case 'C':
5679 const char *const spec
5680 = (input_file_compiler->cpp_spec
5681 ? input_file_compiler->cpp_spec
5682 : cpp_spec);
5683 value = do_spec_1 (spec, 0, NULL);
5684 if (value != 0)
5685 return value;
5687 break;
5689 case 'E':
5690 value = do_spec_1 (endfile_spec, 0, NULL);
5691 if (value != 0)
5692 return value;
5693 break;
5695 case 'l':
5696 value = do_spec_1 (link_spec, 0, NULL);
5697 if (value != 0)
5698 return value;
5699 break;
5701 case 'L':
5702 value = do_spec_1 (lib_spec, 0, NULL);
5703 if (value != 0)
5704 return value;
5705 break;
5707 case 'G':
5708 value = do_spec_1 (libgcc_spec, 0, NULL);
5709 if (value != 0)
5710 return value;
5711 break;
5713 case 'R':
5714 /* We assume there is a directory
5715 separator at the end of this string. */
5716 if (target_system_root)
5718 obstack_grow (&obstack, target_system_root,
5719 strlen (target_system_root));
5720 if (target_sysroot_suffix)
5721 obstack_grow (&obstack, target_sysroot_suffix,
5722 strlen (target_sysroot_suffix));
5724 break;
5726 case 'S':
5727 value = do_spec_1 (startfile_spec, 0, NULL);
5728 if (value != 0)
5729 return value;
5730 break;
5732 /* Here we define characters other than letters and digits. */
5734 case '{':
5735 p = handle_braces (p);
5736 if (p == 0)
5737 return -1;
5738 break;
5740 case ':':
5741 p = handle_spec_function (p);
5742 if (p == 0)
5743 return -1;
5744 break;
5746 case '%':
5747 obstack_1grow (&obstack, '%');
5748 break;
5750 case '.':
5752 unsigned len = 0;
5754 while (p[len] && p[len] != ' ' && p[len] != '%')
5755 len++;
5756 suffix_subst = save_string (p - 1, len + 1);
5757 p += len;
5759 break;
5761 /* Henceforth ignore the option(s) matching the pattern
5762 after the %<. */
5763 case '<':
5765 unsigned len = 0;
5766 int have_wildcard = 0;
5767 int i;
5769 while (p[len] && p[len] != ' ' && p[len] != '\t')
5770 len++;
5772 if (p[len-1] == '*')
5773 have_wildcard = 1;
5775 for (i = 0; i < n_switches; i++)
5776 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5777 && (have_wildcard || switches[i].part1[len] == '\0'))
5779 switches[i].live_cond |= SWITCH_IGNORE;
5780 switches[i].validated = 1;
5783 p += len;
5785 break;
5787 case '*':
5788 if (soft_matched_part)
5790 do_spec_1 (soft_matched_part, 1, NULL);
5791 do_spec_1 (" ", 0, NULL);
5793 else
5794 /* Catch the case where a spec string contains something like
5795 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5796 hand side of the :. */
5797 error ("spec failure: '%%*' has not been initialized by pattern match");
5798 break;
5800 /* Process a string found as the value of a spec given by name.
5801 This feature allows individual machine descriptions
5802 to add and use their own specs.
5803 %[...] modifies -D options the way %P does;
5804 %(...) uses the spec unmodified. */
5805 case '[':
5806 error ("warning: use of obsolete %%[ operator in specs");
5807 case '(':
5809 const char *name = p;
5810 struct spec_list *sl;
5811 int len;
5813 /* The string after the S/P is the name of a spec that is to be
5814 processed. */
5815 while (*p && *p != ')' && *p != ']')
5816 p++;
5818 /* See if it's in the list. */
5819 for (len = p - name, sl = specs; sl; sl = sl->next)
5820 if (sl->name_len == len && !strncmp (sl->name, name, len))
5822 name = *(sl->ptr_spec);
5823 #ifdef DEBUG_SPECS
5824 notice ("Processing spec %c%s%c, which is '%s'\n",
5825 c, sl->name, (c == '(') ? ')' : ']', name);
5826 #endif
5827 break;
5830 if (sl)
5832 if (c == '(')
5834 value = do_spec_1 (name, 0, NULL);
5835 if (value != 0)
5836 return value;
5838 else
5840 char *x = (char *) alloca (strlen (name) * 2 + 1);
5841 char *buf = x;
5842 const char *y = name;
5843 int flag = 0;
5845 /* Copy all of NAME into BUF, but put __ after
5846 every -D and at the end of each arg. */
5847 while (1)
5849 if (! strncmp (y, "-D", 2))
5851 *x++ = '-';
5852 *x++ = 'D';
5853 *x++ = '_';
5854 *x++ = '_';
5855 y += 2;
5856 flag = 1;
5857 continue;
5859 else if (flag
5860 && (*y == ' ' || *y == '\t' || *y == '='
5861 || *y == '}' || *y == 0))
5863 *x++ = '_';
5864 *x++ = '_';
5865 flag = 0;
5867 if (*y == 0)
5868 break;
5869 else
5870 *x++ = *y++;
5872 *x = 0;
5874 value = do_spec_1 (buf, 0, NULL);
5875 if (value != 0)
5876 return value;
5880 /* Discard the closing paren or bracket. */
5881 if (*p)
5882 p++;
5884 break;
5886 default:
5887 error ("spec failure: unrecognized spec option '%c'", c);
5888 break;
5890 break;
5892 case '\\':
5893 /* Backslash: treat next character as ordinary. */
5894 c = *p++;
5896 /* Fall through. */
5897 default:
5898 /* Ordinary character: put it into the current argument. */
5899 obstack_1grow (&obstack, c);
5900 arg_going = 1;
5903 /* End of string. If we are processing a spec function, we need to
5904 end any pending argument. */
5905 if (processing_spec_function)
5906 end_going_arg ();
5908 return 0;
5911 /* Look up a spec function. */
5913 static const struct spec_function *
5914 lookup_spec_function (const char *name)
5916 const struct spec_function *sf;
5918 for (sf = static_spec_functions; sf->name != NULL; sf++)
5919 if (strcmp (sf->name, name) == 0)
5920 return sf;
5922 return NULL;
5925 /* Evaluate a spec function. */
5927 static const char *
5928 eval_spec_function (const char *func, const char *args)
5930 const struct spec_function *sf;
5931 const char *funcval;
5933 /* Saved spec processing context. */
5934 int save_argbuf_index;
5935 int save_argbuf_length;
5936 const char **save_argbuf;
5938 int save_arg_going;
5939 int save_delete_this_arg;
5940 int save_this_is_output_file;
5941 int save_this_is_library_file;
5942 int save_input_from_pipe;
5943 int save_this_is_linker_script;
5944 const char *save_suffix_subst;
5947 sf = lookup_spec_function (func);
5948 if (sf == NULL)
5949 fatal ("unknown spec function '%s'", func);
5951 /* Push the spec processing context. */
5952 save_argbuf_index = argbuf_index;
5953 save_argbuf_length = argbuf_length;
5954 save_argbuf = argbuf;
5956 save_arg_going = arg_going;
5957 save_delete_this_arg = delete_this_arg;
5958 save_this_is_output_file = this_is_output_file;
5959 save_this_is_library_file = this_is_library_file;
5960 save_this_is_linker_script = this_is_linker_script;
5961 save_input_from_pipe = input_from_pipe;
5962 save_suffix_subst = suffix_subst;
5964 /* Create a new spec processing context, and build the function
5965 arguments. */
5967 alloc_args ();
5968 if (do_spec_2 (args) < 0)
5969 fatal ("error in args to spec function '%s'", func);
5971 /* argbuf_index is an index for the next argument to be inserted, and
5972 so contains the count of the args already inserted. */
5974 funcval = (*sf->func) (argbuf_index, argbuf);
5976 /* Pop the spec processing context. */
5977 argbuf_index = save_argbuf_index;
5978 argbuf_length = save_argbuf_length;
5979 free (argbuf);
5980 argbuf = save_argbuf;
5982 arg_going = save_arg_going;
5983 delete_this_arg = save_delete_this_arg;
5984 this_is_output_file = save_this_is_output_file;
5985 this_is_library_file = save_this_is_library_file;
5986 this_is_linker_script = save_this_is_linker_script;
5987 input_from_pipe = save_input_from_pipe;
5988 suffix_subst = save_suffix_subst;
5990 return funcval;
5993 /* Handle a spec function call of the form:
5995 %:function(args)
5997 ARGS is processed as a spec in a separate context and split into an
5998 argument vector in the normal fashion. The function returns a string
5999 containing a spec which we then process in the caller's context, or
6000 NULL if no processing is required. */
6002 static const char *
6003 handle_spec_function (const char *p)
6005 char *func, *args;
6006 const char *endp, *funcval;
6007 int count;
6009 processing_spec_function++;
6011 /* Get the function name. */
6012 for (endp = p; *endp != '\0'; endp++)
6014 if (*endp == '(') /* ) */
6015 break;
6016 /* Only allow [A-Za-z0-9], -, and _ in function names. */
6017 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
6018 fatal ("malformed spec function name");
6020 if (*endp != '(') /* ) */
6021 fatal ("no arguments for spec function");
6022 func = save_string (p, endp - p);
6023 p = ++endp;
6025 /* Get the arguments. */
6026 for (count = 0; *endp != '\0'; endp++)
6028 /* ( */
6029 if (*endp == ')')
6031 if (count == 0)
6032 break;
6033 count--;
6035 else if (*endp == '(') /* ) */
6036 count++;
6038 /* ( */
6039 if (*endp != ')')
6040 fatal ("malformed spec function arguments");
6041 args = save_string (p, endp - p);
6042 p = ++endp;
6044 /* p now points to just past the end of the spec function expression. */
6046 funcval = eval_spec_function (func, args);
6047 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
6048 p = NULL;
6050 free (func);
6051 free (args);
6053 processing_spec_function--;
6055 return p;
6058 /* Inline subroutine of handle_braces. Returns true if the current
6059 input suffix matches the atom bracketed by ATOM and END_ATOM. */
6060 static inline bool
6061 input_suffix_matches (const char *atom, const char *end_atom)
6063 return (input_suffix
6064 && !strncmp (input_suffix, atom, end_atom - atom)
6065 && input_suffix[end_atom - atom] == '\0');
6068 /* Subroutine of handle_braces. Returns true if the current
6069 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
6070 static bool
6071 input_spec_matches (const char *atom, const char *end_atom)
6073 return (input_file_compiler
6074 && input_file_compiler->suffix
6075 && input_file_compiler->suffix[0] != '\0'
6076 && !strncmp (input_file_compiler->suffix + 1, atom,
6077 end_atom - atom)
6078 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
6081 /* Subroutine of handle_braces. Returns true if a switch
6082 matching the atom bracketed by ATOM and END_ATOM appeared on the
6083 command line. */
6084 static bool
6085 switch_matches (const char *atom, const char *end_atom, int starred)
6087 int i;
6088 int len = end_atom - atom;
6089 int plen = starred ? len : -1;
6091 for (i = 0; i < n_switches; i++)
6092 if (!strncmp (switches[i].part1, atom, len)
6093 && (starred || switches[i].part1[len] == '\0')
6094 && check_live_switch (i, plen))
6095 return true;
6097 return false;
6100 /* Inline subroutine of handle_braces. Mark all of the switches which
6101 match ATOM (extends to END_ATOM; STARRED indicates whether there
6102 was a star after the atom) for later processing. */
6103 static inline void
6104 mark_matching_switches (const char *atom, const char *end_atom, int starred)
6106 int i;
6107 int len = end_atom - atom;
6108 int plen = starred ? len : -1;
6110 for (i = 0; i < n_switches; i++)
6111 if (!strncmp (switches[i].part1, atom, len)
6112 && (starred || switches[i].part1[len] == '\0')
6113 && check_live_switch (i, plen))
6114 switches[i].ordering = 1;
6117 /* Inline subroutine of handle_braces. Process all the currently
6118 marked switches through give_switch, and clear the marks. */
6119 static inline void
6120 process_marked_switches (void)
6122 int i;
6124 for (i = 0; i < n_switches; i++)
6125 if (switches[i].ordering == 1)
6127 switches[i].ordering = 0;
6128 give_switch (i, 0);
6132 /* Handle a %{ ... } construct. P points just inside the leading {.
6133 Returns a pointer one past the end of the brace block, or 0
6134 if we call do_spec_1 and that returns -1. */
6136 static const char *
6137 handle_braces (const char *p)
6139 const char *atom, *end_atom;
6140 const char *d_atom = NULL, *d_end_atom = NULL;
6141 const char *orig = p;
6143 bool a_is_suffix;
6144 bool a_is_spectype;
6145 bool a_is_starred;
6146 bool a_is_negated;
6147 bool a_matched;
6149 bool a_must_be_last = false;
6150 bool ordered_set = false;
6151 bool disjunct_set = false;
6152 bool disj_matched = false;
6153 bool disj_starred = true;
6154 bool n_way_choice = false;
6155 bool n_way_matched = false;
6157 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6161 if (a_must_be_last)
6162 goto invalid;
6164 /* Scan one "atom" (S in the description above of %{}, possibly
6165 with '!', '.', '@', ',', or '*' modifiers). */
6166 a_matched = false;
6167 a_is_suffix = false;
6168 a_is_starred = false;
6169 a_is_negated = false;
6170 a_is_spectype = false;
6172 SKIP_WHITE();
6173 if (*p == '!')
6174 p++, a_is_negated = true;
6176 SKIP_WHITE();
6177 if (*p == '.')
6178 p++, a_is_suffix = true;
6179 else if (*p == ',')
6180 p++, a_is_spectype = true;
6182 atom = p;
6183 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
6184 || *p == ',' || *p == '.' || *p == '@')
6185 p++;
6186 end_atom = p;
6188 if (*p == '*')
6189 p++, a_is_starred = 1;
6191 SKIP_WHITE();
6192 switch (*p)
6194 case '&': case '}':
6195 /* Substitute the switch(es) indicated by the current atom. */
6196 ordered_set = true;
6197 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
6198 || a_is_spectype || atom == end_atom)
6199 goto invalid;
6201 mark_matching_switches (atom, end_atom, a_is_starred);
6203 if (*p == '}')
6204 process_marked_switches ();
6205 break;
6207 case '|': case ':':
6208 /* Substitute some text if the current atom appears as a switch
6209 or suffix. */
6210 disjunct_set = true;
6211 if (ordered_set)
6212 goto invalid;
6214 if (atom == end_atom)
6216 if (!n_way_choice || disj_matched || *p == '|'
6217 || a_is_negated || a_is_suffix || a_is_spectype
6218 || a_is_starred)
6219 goto invalid;
6221 /* An empty term may appear as the last choice of an
6222 N-way choice set; it means "otherwise". */
6223 a_must_be_last = true;
6224 disj_matched = !n_way_matched;
6225 disj_starred = false;
6227 else
6229 if ((a_is_suffix || a_is_spectype) && a_is_starred)
6230 goto invalid;
6232 if (!a_is_starred)
6233 disj_starred = false;
6235 /* Don't bother testing this atom if we already have a
6236 match. */
6237 if (!disj_matched && !n_way_matched)
6239 if (a_is_suffix)
6240 a_matched = input_suffix_matches (atom, end_atom);
6241 else if (a_is_spectype)
6242 a_matched = input_spec_matches (atom, end_atom);
6243 else
6244 a_matched = switch_matches (atom, end_atom, a_is_starred);
6246 if (a_matched != a_is_negated)
6248 disj_matched = true;
6249 d_atom = atom;
6250 d_end_atom = end_atom;
6255 if (*p == ':')
6257 /* Found the body, that is, the text to substitute if the
6258 current disjunction matches. */
6259 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
6260 disj_matched && !n_way_matched);
6261 if (p == 0)
6262 return 0;
6264 /* If we have an N-way choice, reset state for the next
6265 disjunction. */
6266 if (*p == ';')
6268 n_way_choice = true;
6269 n_way_matched |= disj_matched;
6270 disj_matched = false;
6271 disj_starred = true;
6272 d_atom = d_end_atom = NULL;
6275 break;
6277 default:
6278 goto invalid;
6281 while (*p++ != '}');
6283 return p;
6285 invalid:
6286 fatal ("braced spec '%s' is invalid at '%c'", orig, *p);
6288 #undef SKIP_WHITE
6291 /* Subroutine of handle_braces. Scan and process a brace substitution body
6292 (X in the description of %{} syntax). P points one past the colon;
6293 ATOM and END_ATOM bracket the first atom which was found to be true
6294 (present) in the current disjunction; STARRED indicates whether all
6295 the atoms in the current disjunction were starred (for syntax validation);
6296 MATCHED indicates whether the disjunction matched or not, and therefore
6297 whether or not the body is to be processed through do_spec_1 or just
6298 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
6299 returns -1. */
6301 static const char *
6302 process_brace_body (const char *p, const char *atom, const char *end_atom,
6303 int starred, int matched)
6305 const char *body, *end_body;
6306 unsigned int nesting_level;
6307 bool have_subst = false;
6309 /* Locate the closing } or ;, honoring nested braces.
6310 Trim trailing whitespace. */
6311 body = p;
6312 nesting_level = 1;
6313 for (;;)
6315 if (*p == '{')
6316 nesting_level++;
6317 else if (*p == '}')
6319 if (!--nesting_level)
6320 break;
6322 else if (*p == ';' && nesting_level == 1)
6323 break;
6324 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
6325 have_subst = true;
6326 else if (*p == '\0')
6327 goto invalid;
6328 p++;
6331 end_body = p;
6332 while (end_body[-1] == ' ' || end_body[-1] == '\t')
6333 end_body--;
6335 if (have_subst && !starred)
6336 goto invalid;
6338 if (matched)
6340 /* Copy the substitution body to permanent storage and execute it.
6341 If have_subst is false, this is a simple matter of running the
6342 body through do_spec_1... */
6343 char *string = save_string (body, end_body - body);
6344 if (!have_subst)
6346 if (do_spec_1 (string, 0, NULL) < 0)
6347 return 0;
6349 else
6351 /* ... but if have_subst is true, we have to process the
6352 body once for each matching switch, with %* set to the
6353 variant part of the switch. */
6354 unsigned int hard_match_len = end_atom - atom;
6355 int i;
6357 for (i = 0; i < n_switches; i++)
6358 if (!strncmp (switches[i].part1, atom, hard_match_len)
6359 && check_live_switch (i, hard_match_len))
6361 if (do_spec_1 (string, 0,
6362 &switches[i].part1[hard_match_len]) < 0)
6363 return 0;
6364 /* Pass any arguments this switch has. */
6365 give_switch (i, 1);
6366 suffix_subst = NULL;
6371 return p;
6373 invalid:
6374 fatal ("braced spec body '%s' is invalid", body);
6377 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6378 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
6379 spec, or -1 if either exact match or %* is used.
6381 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
6382 whose value does not begin with "no-" is obsoleted by the same value
6383 with the "no-", similarly for a switch with the "no-" prefix. */
6385 static int
6386 check_live_switch (int switchnum, int prefix_length)
6388 const char *name = switches[switchnum].part1;
6389 int i;
6391 /* If we already processed this switch and determined if it was
6392 live or not, return our past determination. */
6393 if (switches[switchnum].live_cond != 0)
6394 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6395 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
6396 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6397 == 0);
6399 /* In the common case of {<at-most-one-letter>*}, a negating
6400 switch would always match, so ignore that case. We will just
6401 send the conflicting switches to the compiler phase. */
6402 if (prefix_length >= 0 && prefix_length <= 1)
6403 return 1;
6405 /* Now search for duplicate in a manner that depends on the name. */
6406 switch (*name)
6408 case 'O':
6409 for (i = switchnum + 1; i < n_switches; i++)
6410 if (switches[i].part1[0] == 'O')
6412 switches[switchnum].validated = 1;
6413 switches[switchnum].live_cond = SWITCH_FALSE;
6414 return 0;
6416 break;
6418 case 'W': case 'f': case 'm':
6419 if (! strncmp (name + 1, "no-", 3))
6421 /* We have Xno-YYY, search for XYYY. */
6422 for (i = switchnum + 1; i < n_switches; i++)
6423 if (switches[i].part1[0] == name[0]
6424 && ! strcmp (&switches[i].part1[1], &name[4]))
6426 switches[switchnum].validated = 1;
6427 switches[switchnum].live_cond = SWITCH_FALSE;
6428 return 0;
6431 else
6433 /* We have XYYY, search for Xno-YYY. */
6434 for (i = switchnum + 1; i < n_switches; i++)
6435 if (switches[i].part1[0] == name[0]
6436 && switches[i].part1[1] == 'n'
6437 && switches[i].part1[2] == 'o'
6438 && switches[i].part1[3] == '-'
6439 && !strcmp (&switches[i].part1[4], &name[1]))
6441 switches[switchnum].validated = 1;
6442 switches[switchnum].live_cond = SWITCH_FALSE;
6443 return 0;
6446 break;
6449 /* Otherwise the switch is live. */
6450 switches[switchnum].live_cond |= SWITCH_LIVE;
6451 return 1;
6454 /* Pass a switch to the current accumulating command
6455 in the same form that we received it.
6456 SWITCHNUM identifies the switch; it is an index into
6457 the vector of switches gcc received, which is `switches'.
6458 This cannot fail since it never finishes a command line.
6460 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6462 static void
6463 give_switch (int switchnum, int omit_first_word)
6465 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6466 return;
6468 if (!omit_first_word)
6470 do_spec_1 ("-", 0, NULL);
6471 do_spec_1 (switches[switchnum].part1, 1, NULL);
6474 if (switches[switchnum].args != 0)
6476 const char **p;
6477 for (p = switches[switchnum].args; *p; p++)
6479 const char *arg = *p;
6481 do_spec_1 (" ", 0, NULL);
6482 if (suffix_subst)
6484 unsigned length = strlen (arg);
6485 int dot = 0;
6487 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6488 if (arg[length] == '.')
6490 (CONST_CAST(char *, arg))[length] = 0;
6491 dot = 1;
6492 break;
6494 do_spec_1 (arg, 1, NULL);
6495 if (dot)
6496 (CONST_CAST(char *, arg))[length] = '.';
6497 do_spec_1 (suffix_subst, 1, NULL);
6499 else
6500 do_spec_1 (arg, 1, NULL);
6504 do_spec_1 (" ", 0, NULL);
6505 switches[switchnum].validated = 1;
6508 /* Search for a file named NAME trying various prefixes including the
6509 user's -B prefix and some standard ones.
6510 Return the absolute file name found. If nothing is found, return NAME. */
6512 static const char *
6513 find_file (const char *name)
6515 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6516 return newname ? newname : name;
6519 /* Determine whether a directory exists. If LINKER, return 0 for
6520 certain fixed names not needed by the linker. */
6522 static int
6523 is_directory (const char *path1, bool linker)
6525 int len1;
6526 char *path;
6527 char *cp;
6528 struct stat st;
6530 /* Ensure the string ends with "/.". The resulting path will be a
6531 directory even if the given path is a symbolic link. */
6532 len1 = strlen (path1);
6533 path = (char *) alloca (3 + len1);
6534 memcpy (path, path1, len1);
6535 cp = path + len1;
6536 if (!IS_DIR_SEPARATOR (cp[-1]))
6537 *cp++ = DIR_SEPARATOR;
6538 *cp++ = '.';
6539 *cp = '\0';
6541 /* Exclude directories that the linker is known to search. */
6542 if (linker
6543 && IS_DIR_SEPARATOR (path[0])
6544 && ((cp - path == 6
6545 && strncmp (path + 1, "lib", 3) == 0)
6546 || (cp - path == 10
6547 && strncmp (path + 1, "usr", 3) == 0
6548 && IS_DIR_SEPARATOR (path[4])
6549 && strncmp (path + 5, "lib", 3) == 0)))
6550 return 0;
6552 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6555 /* Set up the various global variables to indicate that we're processing
6556 the input file named FILENAME. */
6558 void
6559 set_input (const char *filename)
6561 const char *p;
6563 input_filename = filename;
6564 input_filename_length = strlen (input_filename);
6565 input_basename = lbasename (input_filename);
6567 /* Find a suffix starting with the last period,
6568 and set basename_length to exclude that suffix. */
6569 basename_length = strlen (input_basename);
6570 suffixed_basename_length = basename_length;
6571 p = input_basename + basename_length;
6572 while (p != input_basename && *p != '.')
6573 --p;
6574 if (*p == '.' && p != input_basename)
6576 basename_length = p - input_basename;
6577 input_suffix = p + 1;
6579 else
6580 input_suffix = "";
6582 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6583 we will need to do a stat on the input_filename. The
6584 INPUT_STAT_SET signals that the stat is needed. */
6585 input_stat_set = 0;
6588 /* On fatal signals, delete all the temporary files. */
6590 static void
6591 fatal_error (int signum)
6593 signal (signum, SIG_DFL);
6594 delete_failure_queue ();
6595 delete_temp_files ();
6596 /* Get the same signal again, this time not handled,
6597 so its normal effect occurs. */
6598 kill (getpid (), signum);
6601 /* Compare the contents of the two files named CMPFILE[0] and
6602 CMPFILE[1]. Return zero if they're identical, nonzero
6603 otherwise. */
6605 static int
6606 compare_files (char *cmpfile[])
6608 int ret = 0;
6609 FILE *temp[2] = { NULL, NULL };
6610 int i;
6612 #if HAVE_MMAP_FILE
6614 size_t length[2];
6615 void *map[2] = { NULL, NULL };
6617 for (i = 0; i < 2; i++)
6619 struct stat st;
6621 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6623 error ("%s: could not determine length of compare-debug file %s",
6624 input_filename, cmpfile[i]);
6625 ret = 1;
6626 break;
6629 length[i] = st.st_size;
6632 if (!ret && length[0] != length[1])
6634 error ("%s: -fcompare-debug failure (length)", input_filename);
6635 ret = 1;
6638 if (!ret)
6639 for (i = 0; i < 2; i++)
6641 int fd = open (cmpfile[i], O_RDONLY);
6642 if (fd < 0)
6644 error ("%s: could not open compare-debug file %s",
6645 input_filename, cmpfile[i]);
6646 ret = 1;
6647 break;
6650 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6651 close (fd);
6653 if (map[i] == (void *) MAP_FAILED)
6655 ret = -1;
6656 break;
6660 if (!ret)
6662 if (memcmp (map[0], map[1], length[0]) != 0)
6664 error ("%s: -fcompare-debug failure", input_filename);
6665 ret = 1;
6669 for (i = 0; i < 2; i++)
6670 if (map[i])
6671 munmap ((caddr_t) map[i], length[i]);
6673 if (ret >= 0)
6674 return ret;
6676 ret = 0;
6678 #endif
6680 for (i = 0; i < 2; i++)
6682 temp[i] = fopen (cmpfile[i], "r");
6683 if (!temp[i])
6685 error ("%s: could not open compare-debug file %s",
6686 input_filename, cmpfile[i]);
6687 ret = 1;
6688 break;
6692 if (!ret && temp[0] && temp[1])
6693 for (;;)
6695 int c0, c1;
6696 c0 = fgetc (temp[0]);
6697 c1 = fgetc (temp[1]);
6699 if (c0 != c1)
6701 error ("%s: -fcompare-debug failure",
6702 input_filename);
6703 ret = 1;
6704 break;
6707 if (c0 == EOF)
6708 break;
6711 for (i = 1; i >= 0; i--)
6713 if (temp[i])
6714 fclose (temp[i]);
6717 return ret;
6720 extern int main (int, char **);
6723 main (int argc, char **argv)
6725 size_t i;
6726 int value;
6727 int linker_was_run = 0;
6728 int lang_n_infiles = 0;
6729 int num_linker_inputs = 0;
6730 char *explicit_link_files;
6731 char *specs_file;
6732 const char *p;
6733 struct user_specs *uptr;
6734 char **old_argv = argv;
6736 /* Initialize here, not in definition. The IRIX 6 O32 cc sometimes chokes
6737 on ?: in file-scope variable initializations. */
6738 asm_debug = ASM_DEBUG_SPEC;
6740 p = argv[0] + strlen (argv[0]);
6741 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6742 --p;
6743 programname = p;
6745 xmalloc_set_program_name (programname);
6747 expandargv (&argc, &argv);
6749 /* Determine if any expansions were made. */
6750 if (argv != old_argv)
6751 at_file_supplied = true;
6753 prune_options (&argc, &argv);
6755 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6756 /* Perform host dependent initialization when needed. */
6757 GCC_DRIVER_HOST_INITIALIZATION;
6758 #endif
6760 /* Unlock the stdio streams. */
6761 unlock_std_streams ();
6763 gcc_init_libintl ();
6765 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6766 signal (SIGINT, fatal_error);
6767 #ifdef SIGHUP
6768 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6769 signal (SIGHUP, fatal_error);
6770 #endif
6771 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6772 signal (SIGTERM, fatal_error);
6773 #ifdef SIGPIPE
6774 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6775 signal (SIGPIPE, fatal_error);
6776 #endif
6777 #ifdef SIGCHLD
6778 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6779 receive the signal. A different setting is inheritable */
6780 signal (SIGCHLD, SIG_DFL);
6781 #endif
6783 /* Allocate the argument vector. */
6784 alloc_args ();
6786 obstack_init (&obstack);
6788 /* Build multilib_select, et. al from the separate lines that make up each
6789 multilib selection. */
6791 const char *const *q = multilib_raw;
6792 int need_space;
6794 obstack_init (&multilib_obstack);
6795 while ((p = *q++) != (char *) 0)
6796 obstack_grow (&multilib_obstack, p, strlen (p));
6798 obstack_1grow (&multilib_obstack, 0);
6799 multilib_select = XOBFINISH (&multilib_obstack, const char *);
6801 q = multilib_matches_raw;
6802 while ((p = *q++) != (char *) 0)
6803 obstack_grow (&multilib_obstack, p, strlen (p));
6805 obstack_1grow (&multilib_obstack, 0);
6806 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6808 q = multilib_exclusions_raw;
6809 while ((p = *q++) != (char *) 0)
6810 obstack_grow (&multilib_obstack, p, strlen (p));
6812 obstack_1grow (&multilib_obstack, 0);
6813 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6815 need_space = FALSE;
6816 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6818 if (need_space)
6819 obstack_1grow (&multilib_obstack, ' ');
6820 obstack_grow (&multilib_obstack,
6821 multilib_defaults_raw[i],
6822 strlen (multilib_defaults_raw[i]));
6823 need_space = TRUE;
6826 obstack_1grow (&multilib_obstack, 0);
6827 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6830 #ifdef INIT_ENVIRONMENT
6831 /* Set up any other necessary machine specific environment variables. */
6832 xputenv (INIT_ENVIRONMENT);
6833 #endif
6835 /* Make a table of what switches there are (switches, n_switches).
6836 Make a table of specified input files (infiles, n_infiles).
6837 Decode switches that are handled locally. */
6839 process_command (argc, CONST_CAST2 (const char **, char **, argv));
6841 /* Initialize the vector of specs to just the default.
6842 This means one element containing 0s, as a terminator. */
6844 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
6845 memcpy (compilers, default_compilers, sizeof default_compilers);
6846 n_compilers = n_default_compilers;
6848 /* Read specs from a file if there is one. */
6850 machine_suffix = concat (spec_machine, dir_separator_str,
6851 spec_version, dir_separator_str, NULL);
6852 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6854 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
6855 /* Read the specs file unless it is a default one. */
6856 if (specs_file != 0 && strcmp (specs_file, "specs"))
6857 read_specs (specs_file, TRUE);
6858 else
6859 init_spec ();
6861 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6862 for any override of as, ld and libraries. */
6863 specs_file = (char *) alloca (strlen (standard_exec_prefix)
6864 + strlen (just_machine_suffix) + sizeof ("specs"));
6866 strcpy (specs_file, standard_exec_prefix);
6867 strcat (specs_file, just_machine_suffix);
6868 strcat (specs_file, "specs");
6869 if (access (specs_file, R_OK) == 0)
6870 read_specs (specs_file, TRUE);
6872 /* Process any configure-time defaults specified for the command line
6873 options, via OPTION_DEFAULT_SPECS. */
6874 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6875 do_option_spec (option_default_specs[i].name,
6876 option_default_specs[i].spec);
6878 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6879 of the command line. */
6881 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6882 do_self_spec (driver_self_specs[i]);
6884 if (compare_debug)
6886 enum save_temps save;
6888 if (!compare_debug_second)
6890 n_switches_debug_check[1] = n_switches;
6891 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
6892 n_switches + 1);
6894 do_self_spec ("%:compare-debug-self-opt()");
6895 n_switches_debug_check[0] = n_switches;
6896 switches_debug_check[0] = switches;
6898 n_switches = n_switches_debug_check[1];
6899 switches = switches_debug_check[1];
6902 /* Avoid crash when computing %j in this early. */
6903 save = save_temps_flag;
6904 save_temps_flag = SAVE_TEMPS_NONE;
6906 compare_debug = -compare_debug;
6907 do_self_spec ("%:compare-debug-self-opt()");
6909 save_temps_flag = save;
6911 if (!compare_debug_second)
6913 n_switches_debug_check[1] = n_switches;
6914 switches_debug_check[1] = switches;
6915 compare_debug = -compare_debug;
6916 n_switches = n_switches_debug_check[0];
6917 switches = switches_debug_check[0];
6921 /* If not cross-compiling, look for executables in the standard
6922 places. */
6923 if (*cross_compile == '0')
6925 if (*md_exec_prefix)
6927 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6928 PREFIX_PRIORITY_LAST, 0, 0);
6932 /* Process sysroot_suffix_spec. */
6933 if (*sysroot_suffix_spec != 0
6934 && do_spec_2 (sysroot_suffix_spec) == 0)
6936 if (argbuf_index > 1)
6937 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6938 else if (argbuf_index == 1)
6939 target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6942 #ifdef HAVE_LD_SYSROOT
6943 /* Pass the --sysroot option to the linker, if it supports that. If
6944 there is a sysroot_suffix_spec, it has already been processed by
6945 this point, so target_system_root really is the system root we
6946 should be using. */
6947 if (target_system_root)
6949 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6950 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6951 set_spec ("link", XOBFINISH (&obstack, const char *));
6953 #endif
6955 /* Process sysroot_hdrs_suffix_spec. */
6956 if (*sysroot_hdrs_suffix_spec != 0
6957 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6959 if (argbuf_index > 1)
6960 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6961 else if (argbuf_index == 1)
6962 target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6965 /* Look for startfiles in the standard places. */
6966 if (*startfile_prefix_spec != 0
6967 && do_spec_2 (startfile_prefix_spec) == 0
6968 && do_spec_1 (" ", 0, NULL) == 0)
6970 int ndx;
6971 for (ndx = 0; ndx < argbuf_index; ndx++)
6972 add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6973 PREFIX_PRIORITY_LAST, 0, 1);
6975 /* We should eventually get rid of all these and stick to
6976 startfile_prefix_spec exclusively. */
6977 else if (*cross_compile == '0' || target_system_root)
6979 if (*md_startfile_prefix)
6980 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6981 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6983 if (*md_startfile_prefix_1)
6984 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6985 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6987 /* If standard_startfile_prefix is relative, base it on
6988 standard_exec_prefix. This lets us move the installed tree
6989 as a unit. If GCC_EXEC_PREFIX is defined, base
6990 standard_startfile_prefix on that as well.
6992 If the prefix is relative, only search it for native compilers;
6993 otherwise we will search a directory containing host libraries. */
6994 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6995 add_sysrooted_prefix (&startfile_prefixes,
6996 standard_startfile_prefix, "BINUTILS",
6997 PREFIX_PRIORITY_LAST, 0, 1);
6998 else if (*cross_compile == '0')
7000 add_prefix (&startfile_prefixes,
7001 concat (gcc_exec_prefix
7002 ? gcc_exec_prefix : standard_exec_prefix,
7003 machine_suffix,
7004 standard_startfile_prefix, NULL),
7005 NULL, PREFIX_PRIORITY_LAST, 0, 1);
7008 /* Sysrooted prefixes are relocated because target_system_root is
7009 also relocated by gcc_exec_prefix. */
7010 if (*standard_startfile_prefix_1)
7011 add_sysrooted_prefix (&startfile_prefixes,
7012 standard_startfile_prefix_1, "BINUTILS",
7013 PREFIX_PRIORITY_LAST, 0, 1);
7014 if (*standard_startfile_prefix_2)
7015 add_sysrooted_prefix (&startfile_prefixes,
7016 standard_startfile_prefix_2, "BINUTILS",
7017 PREFIX_PRIORITY_LAST, 0, 1);
7020 /* Process any user specified specs in the order given on the command
7021 line. */
7022 for (uptr = user_specs_head; uptr; uptr = uptr->next)
7024 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
7025 R_OK, true);
7026 read_specs (filename ? filename : uptr->filename, FALSE);
7029 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
7030 if (gcc_exec_prefix)
7031 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
7032 spec_version, dir_separator_str, NULL);
7034 /* Now we have the specs.
7035 Set the `valid' bits for switches that match anything in any spec. */
7037 validate_all_switches ();
7039 /* Now that we have the switches and the specs, set
7040 the subdirectory based on the options. */
7041 set_multilib_dir ();
7043 /* Set up to remember the pathname of gcc and any options
7044 needed for collect. We use argv[0] instead of programname because
7045 we need the complete pathname. */
7046 obstack_init (&collect_obstack);
7047 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
7048 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
7049 xputenv (XOBFINISH (&collect_obstack, char *));
7051 /* Set up to remember the pathname of the lto wrapper. */
7053 lto_wrapper_spec = find_a_file (&exec_prefixes, "lto-wrapper", X_OK, false);
7054 if (lto_wrapper_spec)
7056 obstack_init (&collect_obstack);
7057 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
7058 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
7059 obstack_grow (&collect_obstack, lto_wrapper_spec,
7060 strlen (lto_wrapper_spec) + 1);
7061 xputenv (XOBFINISH (&collect_obstack, char *));
7064 /* Warn about any switches that no pass was interested in. */
7066 for (i = 0; (int) i < n_switches; i++)
7067 if (! switches[i].validated)
7068 error ("unrecognized option '-%s'", switches[i].part1);
7070 /* Obey some of the options. */
7072 if (print_search_dirs)
7074 printf (_("install: %s%s\n"),
7075 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
7076 gcc_exec_prefix ? "" : machine_suffix);
7077 printf (_("programs: %s\n"),
7078 build_search_list (&exec_prefixes, "", false, false));
7079 printf (_("libraries: %s\n"),
7080 build_search_list (&startfile_prefixes, "", false, true));
7081 return (0);
7084 if (print_file_name)
7086 printf ("%s\n", find_file (print_file_name));
7087 return (0);
7090 if (print_prog_name)
7092 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
7093 printf ("%s\n", (newname ? newname : print_prog_name));
7094 return (0);
7097 if (print_multi_lib)
7099 print_multilib_info ();
7100 return (0);
7103 if (print_multi_directory)
7105 if (multilib_dir == NULL)
7106 printf (".\n");
7107 else
7108 printf ("%s\n", multilib_dir);
7109 return (0);
7112 if (print_sysroot)
7114 if (target_system_root)
7116 if (target_sysroot_suffix)
7117 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
7118 else
7119 printf ("%s\n", target_system_root);
7121 return (0);
7124 if (print_multi_os_directory)
7126 if (multilib_os_dir == NULL)
7127 printf (".\n");
7128 else
7129 printf ("%s\n", multilib_os_dir);
7130 return (0);
7133 if (print_sysroot_headers_suffix)
7135 if (*sysroot_hdrs_suffix_spec)
7137 printf("%s\n", (target_sysroot_hdrs_suffix
7138 ? target_sysroot_hdrs_suffix
7139 : ""));
7140 return (0);
7142 else
7143 /* The error status indicates that only one set of fixed
7144 headers should be built. */
7145 fatal ("not configured with sysroot headers suffix");
7148 if (print_help_list)
7150 display_help ();
7152 if (! verbose_flag)
7154 printf (_("\nFor bug reporting instructions, please see:\n"));
7155 printf ("%s.\n", bug_report_url);
7157 return (0);
7160 /* We do not exit here. Instead we have created a fake input file
7161 called 'help-dummy' which needs to be compiled, and we pass this
7162 on the various sub-processes, along with the --help switch.
7163 Ensure their output appears after ours. */
7164 fputc ('\n', stdout);
7165 fflush (stdout);
7168 if (print_version)
7170 printf (_("%s %s%s\n"), programname, pkgversion_string,
7171 version_string);
7172 printf ("Copyright %s 2010 Free Software Foundation, Inc.\n",
7173 _("(C)"));
7174 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
7175 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
7176 stdout);
7177 if (! verbose_flag)
7178 return 0;
7180 /* We do not exit here. We use the same mechanism of --help to print
7181 the version of the sub-processes. */
7182 fputc ('\n', stdout);
7183 fflush (stdout);
7186 if (verbose_flag)
7188 int n;
7189 const char *thrmod;
7191 notice ("Target: %s\n", spec_machine);
7192 notice ("Configured with: %s\n", configuration_arguments);
7194 #ifdef THREAD_MODEL_SPEC
7195 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7196 but there's no point in doing all this processing just to get
7197 thread_model back. */
7198 obstack_init (&obstack);
7199 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
7200 obstack_1grow (&obstack, '\0');
7201 thrmod = XOBFINISH (&obstack, const char *);
7202 #else
7203 thrmod = thread_model;
7204 #endif
7206 notice ("Thread model: %s\n", thrmod);
7208 /* compiler_version is truncated at the first space when initialized
7209 from version string, so truncate version_string at the first space
7210 before comparing. */
7211 for (n = 0; version_string[n]; n++)
7212 if (version_string[n] == ' ')
7213 break;
7215 if (! strncmp (version_string, compiler_version, n)
7216 && compiler_version[n] == 0)
7217 notice ("gcc version %s %s\n", version_string, pkgversion_string);
7218 else
7219 notice ("gcc driver version %s %sexecuting gcc version %s\n",
7220 version_string, pkgversion_string, compiler_version);
7222 if (n_infiles == 0)
7223 return (0);
7226 if (n_infiles == added_libraries)
7227 fatal ("no input files");
7229 /* Make a place to record the compiler output file names
7230 that correspond to the input files. */
7232 i = n_infiles;
7233 i += lang_specific_extra_outfiles;
7234 outfiles = XCNEWVEC (const char *, i);
7236 /* Record which files were specified explicitly as link input. */
7238 explicit_link_files = XCNEWVEC (char, n_infiles);
7240 if (combine_flag)
7241 combine_inputs = true;
7242 else
7243 combine_inputs = false;
7245 for (i = 0; (int) i < n_infiles; i++)
7247 const char *name = infiles[i].name;
7248 struct compiler *compiler = lookup_compiler (name,
7249 strlen (name),
7250 infiles[i].language);
7252 if (compiler && !(compiler->combinable))
7253 combine_inputs = false;
7255 if (lang_n_infiles > 0 && compiler != input_file_compiler
7256 && infiles[i].language && infiles[i].language[0] != '*')
7257 infiles[i].incompiler = compiler;
7258 else if (compiler)
7260 lang_n_infiles++;
7261 input_file_compiler = compiler;
7262 infiles[i].incompiler = compiler;
7264 else
7266 /* Since there is no compiler for this input file, assume it is a
7267 linker file. */
7268 explicit_link_files[i] = 1;
7269 infiles[i].incompiler = NULL;
7271 infiles[i].compiled = false;
7272 infiles[i].preprocessed = false;
7275 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
7276 fatal ("cannot specify -o with -c, -S or -E with multiple files");
7278 if (combine_flag && save_temps_flag)
7280 bool save_combine_inputs = combine_inputs;
7281 /* Must do a separate pre-processing pass for C & Objective-C files, to
7282 obtain individual .i files. */
7284 combine_inputs = false;
7285 for (i = 0; (int) i < n_infiles; i++)
7287 int this_file_error = 0;
7289 input_file_number = i;
7290 set_input (infiles[i].name);
7291 if (infiles[i].incompiler
7292 && (infiles[i].incompiler)->needs_preprocessing)
7293 input_file_compiler = infiles[i].incompiler;
7294 else
7295 continue;
7297 if (input_file_compiler)
7299 if (input_file_compiler->spec[0] == '#')
7301 error ("%s: %s compiler not installed on this system",
7302 input_filename, &input_file_compiler->spec[1]);
7303 this_file_error = 1;
7305 else
7307 value = do_spec (input_file_compiler->spec);
7308 infiles[i].preprocessed = true;
7309 if (!have_o_argbuf_index)
7310 fatal ("spec '%s' is invalid", input_file_compiler->spec);
7311 infiles[i].name = argbuf[have_o_argbuf_index];
7312 infiles[i].incompiler
7313 = lookup_compiler (infiles[i].name,
7314 strlen (infiles[i].name),
7315 infiles[i].language);
7317 if (value < 0)
7318 this_file_error = 1;
7322 if (this_file_error)
7324 delete_failure_queue ();
7325 error_count++;
7326 break;
7328 clear_failure_queue ();
7330 combine_inputs = save_combine_inputs;
7333 for (i = 0; (int) i < n_infiles; i++)
7335 int this_file_error = 0;
7337 /* Tell do_spec what to substitute for %i. */
7339 input_file_number = i;
7340 set_input (infiles[i].name);
7342 if (infiles[i].compiled)
7343 continue;
7345 /* Use the same thing in %o, unless cp->spec says otherwise. */
7347 outfiles[i] = input_filename;
7349 /* Figure out which compiler from the file's suffix. */
7351 if (! combine_inputs)
7352 input_file_compiler
7353 = lookup_compiler (infiles[i].name, input_filename_length,
7354 infiles[i].language);
7355 else
7356 input_file_compiler = infiles[i].incompiler;
7358 if (input_file_compiler)
7360 /* Ok, we found an applicable compiler. Run its spec. */
7362 if (input_file_compiler->spec[0] == '#')
7364 error ("%s: %s compiler not installed on this system",
7365 input_filename, &input_file_compiler->spec[1]);
7366 this_file_error = 1;
7368 else
7370 if (compare_debug)
7372 if (debug_check_temp_file[0])
7373 free (debug_check_temp_file[0]);
7374 debug_check_temp_file[0] = NULL;
7376 if (debug_check_temp_file[1])
7377 free (debug_check_temp_file[1]);
7378 debug_check_temp_file[1] = NULL;
7381 value = do_spec (input_file_compiler->spec);
7382 infiles[i].compiled = true;
7383 if (value < 0)
7384 this_file_error = 1;
7385 else if (compare_debug && debug_check_temp_file[0])
7387 if (verbose_flag)
7388 error ("Recompiling with -fcompare-debug");
7390 compare_debug = -compare_debug;
7391 n_switches = n_switches_debug_check[1];
7392 switches = switches_debug_check[1];
7394 value = do_spec (input_file_compiler->spec);
7396 compare_debug = -compare_debug;
7397 n_switches = n_switches_debug_check[0];
7398 switches = switches_debug_check[0];
7400 if (value < 0)
7402 error ("during -fcompare-debug recompilation");
7403 this_file_error = 1;
7406 gcc_assert (debug_check_temp_file[1]
7407 && strcmp (debug_check_temp_file[0],
7408 debug_check_temp_file[1]));
7410 if (verbose_flag)
7411 error ("Comparing final insns dumps");
7413 if (compare_files (debug_check_temp_file))
7414 this_file_error = 1;
7417 if (compare_debug)
7419 if (debug_check_temp_file[0])
7420 free (debug_check_temp_file[0]);
7421 debug_check_temp_file[0] = NULL;
7423 if (debug_check_temp_file[1])
7424 free (debug_check_temp_file[1]);
7425 debug_check_temp_file[1] = NULL;
7430 /* If this file's name does not contain a recognized suffix,
7431 record it as explicit linker input. */
7433 else
7434 explicit_link_files[i] = 1;
7436 /* Clear the delete-on-failure queue, deleting the files in it
7437 if this compilation failed. */
7439 if (this_file_error)
7441 delete_failure_queue ();
7442 error_count++;
7444 /* If this compilation succeeded, don't delete those files later. */
7445 clear_failure_queue ();
7448 /* Reset the input file name to the first compile/object file name, for use
7449 with %b in LINK_SPEC. We use the first input file that we can find
7450 a compiler to compile it instead of using infiles.language since for
7451 languages other than C we use aliases that we then lookup later. */
7452 if (n_infiles > 0)
7454 int i;
7456 for (i = 0; i < n_infiles ; i++)
7457 if (infiles[i].language && infiles[i].language[0] != '*')
7459 set_input (infiles[i].name);
7460 break;
7464 if (error_count == 0)
7466 /* Make sure INPUT_FILE_NUMBER points to first available open
7467 slot. */
7468 input_file_number = n_infiles;
7469 if (lang_specific_pre_link ())
7470 error_count++;
7473 /* Determine if there are any linker input files. */
7474 num_linker_inputs = 0;
7475 for (i = 0; (int) i < n_infiles; i++)
7476 if (explicit_link_files[i] || outfiles[i] != NULL)
7477 num_linker_inputs++;
7479 /* Run ld to link all the compiler output files. */
7481 if (num_linker_inputs > 0 && error_count == 0 && print_subprocess_help < 2)
7483 int tmp = execution_count;
7484 const char *fuse_linker_plugin = "fuse-linker-plugin";
7486 /* We'll use ld if we can't find collect2. */
7487 if (! strcmp (linker_name_spec, "collect2"))
7489 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7490 if (s == NULL)
7491 linker_name_spec = "ld";
7494 if (switch_matches (fuse_linker_plugin,
7495 fuse_linker_plugin + strlen (fuse_linker_plugin), 0))
7497 linker_plugin_file_spec = find_a_file (&exec_prefixes,
7498 "liblto_plugin.so", R_OK,
7499 false);
7500 if (!linker_plugin_file_spec)
7501 fatal ("-fuse-linker-plugin, but liblto_plugin.so not found");
7503 lto_libgcc_spec = find_a_file (&startfile_prefixes, "libgcc.a",
7504 R_OK, true);
7505 if (!lto_libgcc_spec)
7506 fatal ("could not find libgcc.a");
7508 lto_gcc_spec = argv[0];
7510 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7511 for collect. */
7512 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7513 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7515 if (print_subprocess_help == 1)
7517 printf (_("\nLinker options\n==============\n\n"));
7518 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7519 " to the linker.\n\n"));
7520 fflush (stdout);
7522 value = do_spec (link_command_spec);
7523 if (value < 0)
7524 error_count = 1;
7525 linker_was_run = (tmp != execution_count);
7528 /* If options said don't run linker,
7529 complain about input files to be given to the linker. */
7531 if (! linker_was_run && error_count == 0)
7532 for (i = 0; (int) i < n_infiles; i++)
7533 if (explicit_link_files[i]
7534 && !(infiles[i].language && infiles[i].language[0] == '*'))
7535 error ("%s: linker input file unused because linking not done",
7536 outfiles[i]);
7538 /* Delete some or all of the temporary files we made. */
7540 if (error_count)
7541 delete_failure_queue ();
7542 delete_temp_files ();
7544 if (print_help_list)
7546 printf (("\nFor bug reporting instructions, please see:\n"));
7547 printf ("%s\n", bug_report_url);
7550 return (signal_count != 0 ? 2
7551 : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
7552 : 0);
7555 /* Find the proper compilation spec for the file name NAME,
7556 whose length is LENGTH. LANGUAGE is the specified language,
7557 or 0 if this file is to be passed to the linker. */
7559 static struct compiler *
7560 lookup_compiler (const char *name, size_t length, const char *language)
7562 struct compiler *cp;
7564 /* If this was specified by the user to be a linker input, indicate that. */
7565 if (language != 0 && language[0] == '*')
7566 return 0;
7568 /* Otherwise, look for the language, if one is spec'd. */
7569 if (language != 0)
7571 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7572 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7573 return cp;
7575 error ("language %s not recognized", language);
7576 return 0;
7579 /* Look for a suffix. */
7580 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7582 if (/* The suffix `-' matches only the file name `-'. */
7583 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7584 || (strlen (cp->suffix) < length
7585 /* See if the suffix matches the end of NAME. */
7586 && !strcmp (cp->suffix,
7587 name + length - strlen (cp->suffix))
7589 break;
7592 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7593 /* Look again, but case-insensitively this time. */
7594 if (cp < compilers)
7595 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7597 if (/* The suffix `-' matches only the file name `-'. */
7598 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7599 || (strlen (cp->suffix) < length
7600 /* See if the suffix matches the end of NAME. */
7601 && ((!strcmp (cp->suffix,
7602 name + length - strlen (cp->suffix))
7603 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7604 && !strcasecmp (cp->suffix,
7605 name + length - strlen (cp->suffix)))
7607 break;
7609 #endif
7611 if (cp >= compilers)
7613 if (cp->spec[0] != '@')
7614 /* A non-alias entry: return it. */
7615 return cp;
7617 /* An alias entry maps a suffix to a language.
7618 Search for the language; pass 0 for NAME and LENGTH
7619 to avoid infinite recursion if language not found. */
7620 return lookup_compiler (NULL, 0, cp->spec + 1);
7622 return 0;
7625 static char *
7626 save_string (const char *s, int len)
7628 char *result = XNEWVEC (char, len + 1);
7630 memcpy (result, s, len);
7631 result[len] = 0;
7632 return result;
7635 void
7636 pfatal_with_name (const char *name)
7638 perror_with_name (name);
7639 delete_temp_files ();
7640 exit (1);
7643 static void
7644 perror_with_name (const char *name)
7646 error ("%s: %s", name, xstrerror (errno));
7649 /* Output an error message and exit. */
7651 void
7652 fancy_abort (const char *file, int line, const char *func)
7654 fatal_ice ("internal gcc abort in %s, at %s:%d", func, file, line);
7657 /* Output an error message and exit. */
7659 void
7660 fatal_ice (const char *cmsgid, ...)
7662 va_list ap;
7664 va_start (ap, cmsgid);
7666 fprintf (stderr, "%s: ", programname);
7667 vfprintf (stderr, _(cmsgid), ap);
7668 va_end (ap);
7669 fprintf (stderr, "\n");
7670 delete_temp_files ();
7671 exit (pass_exit_codes ? ICE_EXIT_CODE : 1);
7674 void
7675 fatal (const char *cmsgid, ...)
7677 va_list ap;
7679 va_start (ap, cmsgid);
7681 fprintf (stderr, "%s: ", programname);
7682 vfprintf (stderr, _(cmsgid), ap);
7683 va_end (ap);
7684 fprintf (stderr, "\n");
7685 delete_temp_files ();
7686 exit (1);
7689 /* The argument is actually c-format, not gcc-internal-format,
7690 but because functions with identical names are used through
7691 the rest of the compiler with gcc-internal-format, we just
7692 need to hope all users of these functions use the common
7693 subset between c-format and gcc-internal-format. */
7695 void
7696 error (const char *gmsgid, ...)
7698 va_list ap;
7700 va_start (ap, gmsgid);
7701 fprintf (stderr, "%s: ", programname);
7702 vfprintf (stderr, _(gmsgid), ap);
7703 va_end (ap);
7705 fprintf (stderr, "\n");
7708 static void
7709 notice (const char *cmsgid, ...)
7711 va_list ap;
7713 va_start (ap, cmsgid);
7714 vfprintf (stderr, _(cmsgid), ap);
7715 va_end (ap);
7718 static inline void
7719 validate_switches_from_spec (const char *spec)
7721 const char *p = spec;
7722 char c;
7723 while ((c = *p++))
7724 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7725 /* We have a switch spec. */
7726 p = validate_switches (p + 1);
7729 static void
7730 validate_all_switches (void)
7732 struct compiler *comp;
7733 struct spec_list *spec;
7735 for (comp = compilers; comp->spec; comp++)
7736 validate_switches_from_spec (comp->spec);
7738 /* Look through the linked list of specs read from the specs file. */
7739 for (spec = specs; spec; spec = spec->next)
7740 validate_switches_from_spec (*spec->ptr_spec);
7742 validate_switches_from_spec (link_command_spec);
7745 /* Look at the switch-name that comes after START
7746 and mark as valid all supplied switches that match it. */
7748 static const char *
7749 validate_switches (const char *start)
7751 const char *p = start;
7752 const char *atom;
7753 size_t len;
7754 int i;
7755 bool suffix = false;
7756 bool starred = false;
7758 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7760 next_member:
7761 SKIP_WHITE ();
7763 if (*p == '!')
7764 p++;
7766 SKIP_WHITE ();
7767 if (*p == '.' || *p == ',')
7768 suffix = true, p++;
7770 atom = p;
7771 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7772 || *p == ',' || *p == '.' || *p == '@')
7773 p++;
7774 len = p - atom;
7776 if (*p == '*')
7777 starred = true, p++;
7779 SKIP_WHITE ();
7781 if (!suffix)
7783 /* Mark all matching switches as valid. */
7784 for (i = 0; i < n_switches; i++)
7785 if (!strncmp (switches[i].part1, atom, len)
7786 && (starred || switches[i].part1[len] == 0))
7787 switches[i].validated = 1;
7790 if (*p) p++;
7791 if (*p && (p[-1] == '|' || p[-1] == '&'))
7792 goto next_member;
7794 if (*p && p[-1] == ':')
7796 while (*p && *p != ';' && *p != '}')
7798 if (*p == '%')
7800 p++;
7801 if (*p == '{' || *p == '<')
7802 p = validate_switches (p+1);
7803 else if (p[0] == 'W' && p[1] == '{')
7804 p = validate_switches (p+2);
7806 else
7807 p++;
7810 if (*p) p++;
7811 if (*p && p[-1] == ';')
7812 goto next_member;
7815 return p;
7816 #undef SKIP_WHITE
7819 struct mdswitchstr
7821 const char *str;
7822 int len;
7825 static struct mdswitchstr *mdswitches;
7826 static int n_mdswitches;
7828 /* Check whether a particular argument was used. The first time we
7829 canonicalize the switches to keep only the ones we care about. */
7831 static int
7832 used_arg (const char *p, int len)
7834 struct mswitchstr
7836 const char *str;
7837 const char *replace;
7838 int len;
7839 int rep_len;
7842 static struct mswitchstr *mswitches;
7843 static int n_mswitches;
7844 int i, j;
7846 if (!mswitches)
7848 struct mswitchstr *matches;
7849 const char *q;
7850 int cnt = 0;
7852 /* Break multilib_matches into the component strings of string
7853 and replacement string. */
7854 for (q = multilib_matches; *q != '\0'; q++)
7855 if (*q == ';')
7856 cnt++;
7858 matches
7859 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
7860 i = 0;
7861 q = multilib_matches;
7862 while (*q != '\0')
7864 matches[i].str = q;
7865 while (*q != ' ')
7867 if (*q == '\0')
7869 invalid_matches:
7870 fatal ("multilib spec '%s' is invalid", multilib_matches);
7872 q++;
7874 matches[i].len = q - matches[i].str;
7876 matches[i].replace = ++q;
7877 while (*q != ';' && *q != '\0')
7879 if (*q == ' ')
7880 goto invalid_matches;
7881 q++;
7883 matches[i].rep_len = q - matches[i].replace;
7884 i++;
7885 if (*q == ';')
7886 q++;
7889 /* Now build a list of the replacement string for switches that we care
7890 about. Make sure we allocate at least one entry. This prevents
7891 xmalloc from calling fatal, and prevents us from re-executing this
7892 block of code. */
7893 mswitches
7894 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7895 for (i = 0; i < n_switches; i++)
7896 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
7898 int xlen = strlen (switches[i].part1);
7899 for (j = 0; j < cnt; j++)
7900 if (xlen == matches[j].len
7901 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7903 mswitches[n_mswitches].str = matches[j].replace;
7904 mswitches[n_mswitches].len = matches[j].rep_len;
7905 mswitches[n_mswitches].replace = (char *) 0;
7906 mswitches[n_mswitches].rep_len = 0;
7907 n_mswitches++;
7908 break;
7912 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7913 on the command line nor any options mutually incompatible with
7914 them. */
7915 for (i = 0; i < n_mdswitches; i++)
7917 const char *r;
7919 for (q = multilib_options; *q != '\0'; q++)
7921 while (*q == ' ')
7922 q++;
7924 r = q;
7925 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7926 || strchr (" /", q[mdswitches[i].len]) == NULL)
7928 while (*q != ' ' && *q != '/' && *q != '\0')
7929 q++;
7930 if (*q != '/')
7931 break;
7932 q++;
7935 if (*q != ' ' && *q != '\0')
7937 while (*r != ' ' && *r != '\0')
7939 q = r;
7940 while (*q != ' ' && *q != '/' && *q != '\0')
7941 q++;
7943 if (used_arg (r, q - r))
7944 break;
7946 if (*q != '/')
7948 mswitches[n_mswitches].str = mdswitches[i].str;
7949 mswitches[n_mswitches].len = mdswitches[i].len;
7950 mswitches[n_mswitches].replace = (char *) 0;
7951 mswitches[n_mswitches].rep_len = 0;
7952 n_mswitches++;
7953 break;
7956 r = q + 1;
7958 break;
7964 for (i = 0; i < n_mswitches; i++)
7965 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7966 return 1;
7968 return 0;
7971 static int
7972 default_arg (const char *p, int len)
7974 int i;
7976 for (i = 0; i < n_mdswitches; i++)
7977 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7978 return 1;
7980 return 0;
7983 /* Work out the subdirectory to use based on the options. The format of
7984 multilib_select is a list of elements. Each element is a subdirectory
7985 name followed by a list of options followed by a semicolon. The format
7986 of multilib_exclusions is the same, but without the preceding
7987 directory. First gcc will check the exclusions, if none of the options
7988 beginning with an exclamation point are present, and all of the other
7989 options are present, then we will ignore this completely. Passing
7990 that, gcc will consider each multilib_select in turn using the same
7991 rules for matching the options. If a match is found, that subdirectory
7992 will be used. */
7994 static void
7995 set_multilib_dir (void)
7997 const char *p;
7998 unsigned int this_path_len;
7999 const char *this_path, *this_arg;
8000 const char *start, *end;
8001 int not_arg;
8002 int ok, ndfltok, first;
8004 n_mdswitches = 0;
8005 start = multilib_defaults;
8006 while (*start == ' ' || *start == '\t')
8007 start++;
8008 while (*start != '\0')
8010 n_mdswitches++;
8011 while (*start != ' ' && *start != '\t' && *start != '\0')
8012 start++;
8013 while (*start == ' ' || *start == '\t')
8014 start++;
8017 if (n_mdswitches)
8019 int i = 0;
8021 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
8022 for (start = multilib_defaults; *start != '\0'; start = end + 1)
8024 while (*start == ' ' || *start == '\t')
8025 start++;
8027 if (*start == '\0')
8028 break;
8030 for (end = start + 1;
8031 *end != ' ' && *end != '\t' && *end != '\0'; end++)
8034 obstack_grow (&multilib_obstack, start, end - start);
8035 obstack_1grow (&multilib_obstack, 0);
8036 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
8037 mdswitches[i++].len = end - start;
8039 if (*end == '\0')
8040 break;
8044 p = multilib_exclusions;
8045 while (*p != '\0')
8047 /* Ignore newlines. */
8048 if (*p == '\n')
8050 ++p;
8051 continue;
8054 /* Check the arguments. */
8055 ok = 1;
8056 while (*p != ';')
8058 if (*p == '\0')
8060 invalid_exclusions:
8061 fatal ("multilib exclusions '%s' is invalid",
8062 multilib_exclusions);
8065 if (! ok)
8067 ++p;
8068 continue;
8071 this_arg = p;
8072 while (*p != ' ' && *p != ';')
8074 if (*p == '\0')
8075 goto invalid_exclusions;
8076 ++p;
8079 if (*this_arg != '!')
8080 not_arg = 0;
8081 else
8083 not_arg = 1;
8084 ++this_arg;
8087 ok = used_arg (this_arg, p - this_arg);
8088 if (not_arg)
8089 ok = ! ok;
8091 if (*p == ' ')
8092 ++p;
8095 if (ok)
8096 return;
8098 ++p;
8101 first = 1;
8102 p = multilib_select;
8103 while (*p != '\0')
8105 /* Ignore newlines. */
8106 if (*p == '\n')
8108 ++p;
8109 continue;
8112 /* Get the initial path. */
8113 this_path = p;
8114 while (*p != ' ')
8116 if (*p == '\0')
8118 invalid_select:
8119 fatal ("multilib select '%s' is invalid",
8120 multilib_select);
8122 ++p;
8124 this_path_len = p - this_path;
8126 /* Check the arguments. */
8127 ok = 1;
8128 ndfltok = 1;
8129 ++p;
8130 while (*p != ';')
8132 if (*p == '\0')
8133 goto invalid_select;
8135 if (! ok)
8137 ++p;
8138 continue;
8141 this_arg = p;
8142 while (*p != ' ' && *p != ';')
8144 if (*p == '\0')
8145 goto invalid_select;
8146 ++p;
8149 if (*this_arg != '!')
8150 not_arg = 0;
8151 else
8153 not_arg = 1;
8154 ++this_arg;
8157 /* If this is a default argument, we can just ignore it.
8158 This is true even if this_arg begins with '!'. Beginning
8159 with '!' does not mean that this argument is necessarily
8160 inappropriate for this library: it merely means that
8161 there is a more specific library which uses this
8162 argument. If this argument is a default, we need not
8163 consider that more specific library. */
8164 ok = used_arg (this_arg, p - this_arg);
8165 if (not_arg)
8166 ok = ! ok;
8168 if (! ok)
8169 ndfltok = 0;
8171 if (default_arg (this_arg, p - this_arg))
8172 ok = 1;
8174 if (*p == ' ')
8175 ++p;
8178 if (ok && first)
8180 if (this_path_len != 1
8181 || this_path[0] != '.')
8183 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
8184 char *q;
8186 strncpy (new_multilib_dir, this_path, this_path_len);
8187 new_multilib_dir[this_path_len] = '\0';
8188 q = strchr (new_multilib_dir, ':');
8189 if (q != NULL)
8190 *q = '\0';
8191 multilib_dir = new_multilib_dir;
8193 first = 0;
8196 if (ndfltok)
8198 const char *q = this_path, *end = this_path + this_path_len;
8200 while (q < end && *q != ':')
8201 q++;
8202 if (q < end)
8204 char *new_multilib_os_dir = XNEWVEC (char, end - q);
8205 memcpy (new_multilib_os_dir, q + 1, end - q - 1);
8206 new_multilib_os_dir[end - q - 1] = '\0';
8207 multilib_os_dir = new_multilib_os_dir;
8208 break;
8212 ++p;
8215 if (multilib_dir == NULL && multilib_os_dir != NULL
8216 && strcmp (multilib_os_dir, ".") == 0)
8218 free (CONST_CAST (char *, multilib_os_dir));
8219 multilib_os_dir = NULL;
8221 else if (multilib_dir != NULL && multilib_os_dir == NULL)
8222 multilib_os_dir = multilib_dir;
8225 /* Print out the multiple library subdirectory selection
8226 information. This prints out a series of lines. Each line looks
8227 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
8228 required. Only the desired options are printed out, the negative
8229 matches. The options are print without a leading dash. There are
8230 no spaces to make it easy to use the information in the shell.
8231 Each subdirectory is printed only once. This assumes the ordering
8232 generated by the genmultilib script. Also, we leave out ones that match
8233 the exclusions. */
8235 static void
8236 print_multilib_info (void)
8238 const char *p = multilib_select;
8239 const char *last_path = 0, *this_path;
8240 int skip;
8241 unsigned int last_path_len = 0;
8243 while (*p != '\0')
8245 skip = 0;
8246 /* Ignore newlines. */
8247 if (*p == '\n')
8249 ++p;
8250 continue;
8253 /* Get the initial path. */
8254 this_path = p;
8255 while (*p != ' ')
8257 if (*p == '\0')
8259 invalid_select:
8260 fatal ("multilib select '%s' is invalid", multilib_select);
8263 ++p;
8266 /* When --disable-multilib was used but target defines
8267 MULTILIB_OSDIRNAMES, entries starting with .: are there just
8268 to find multilib_os_dir, so skip them from output. */
8269 if (this_path[0] == '.' && this_path[1] == ':')
8270 skip = 1;
8272 /* Check for matches with the multilib_exclusions. We don't bother
8273 with the '!' in either list. If any of the exclusion rules match
8274 all of its options with the select rule, we skip it. */
8276 const char *e = multilib_exclusions;
8277 const char *this_arg;
8279 while (*e != '\0')
8281 int m = 1;
8282 /* Ignore newlines. */
8283 if (*e == '\n')
8285 ++e;
8286 continue;
8289 /* Check the arguments. */
8290 while (*e != ';')
8292 const char *q;
8293 int mp = 0;
8295 if (*e == '\0')
8297 invalid_exclusion:
8298 fatal ("multilib exclusion '%s' is invalid",
8299 multilib_exclusions);
8302 if (! m)
8304 ++e;
8305 continue;
8308 this_arg = e;
8310 while (*e != ' ' && *e != ';')
8312 if (*e == '\0')
8313 goto invalid_exclusion;
8314 ++e;
8317 q = p + 1;
8318 while (*q != ';')
8320 const char *arg;
8321 int len = e - this_arg;
8323 if (*q == '\0')
8324 goto invalid_select;
8326 arg = q;
8328 while (*q != ' ' && *q != ';')
8330 if (*q == '\0')
8331 goto invalid_select;
8332 ++q;
8335 if (! strncmp (arg, this_arg,
8336 (len < q - arg) ? q - arg : len)
8337 || default_arg (this_arg, e - this_arg))
8339 mp = 1;
8340 break;
8343 if (*q == ' ')
8344 ++q;
8347 if (! mp)
8348 m = 0;
8350 if (*e == ' ')
8351 ++e;
8354 if (m)
8356 skip = 1;
8357 break;
8360 if (*e != '\0')
8361 ++e;
8365 if (! skip)
8367 /* If this is a duplicate, skip it. */
8368 skip = (last_path != 0
8369 && (unsigned int) (p - this_path) == last_path_len
8370 && ! strncmp (last_path, this_path, last_path_len));
8372 last_path = this_path;
8373 last_path_len = p - this_path;
8376 /* If this directory requires any default arguments, we can skip
8377 it. We will already have printed a directory identical to
8378 this one which does not require that default argument. */
8379 if (! skip)
8381 const char *q;
8383 q = p + 1;
8384 while (*q != ';')
8386 const char *arg;
8388 if (*q == '\0')
8389 goto invalid_select;
8391 if (*q == '!')
8392 arg = NULL;
8393 else
8394 arg = q;
8396 while (*q != ' ' && *q != ';')
8398 if (*q == '\0')
8399 goto invalid_select;
8400 ++q;
8403 if (arg != NULL
8404 && default_arg (arg, q - arg))
8406 skip = 1;
8407 break;
8410 if (*q == ' ')
8411 ++q;
8415 if (! skip)
8417 const char *p1;
8419 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
8420 putchar (*p1);
8421 putchar (';');
8424 ++p;
8425 while (*p != ';')
8427 int use_arg;
8429 if (*p == '\0')
8430 goto invalid_select;
8432 if (skip)
8434 ++p;
8435 continue;
8438 use_arg = *p != '!';
8440 if (use_arg)
8441 putchar ('@');
8443 while (*p != ' ' && *p != ';')
8445 if (*p == '\0')
8446 goto invalid_select;
8447 if (use_arg)
8448 putchar (*p);
8449 ++p;
8452 if (*p == ' ')
8453 ++p;
8456 if (! skip)
8458 /* If there are extra options, print them now. */
8459 if (multilib_extra && *multilib_extra)
8461 int print_at = TRUE;
8462 const char *q;
8464 for (q = multilib_extra; *q != '\0'; q++)
8466 if (*q == ' ')
8467 print_at = TRUE;
8468 else
8470 if (print_at)
8471 putchar ('@');
8472 putchar (*q);
8473 print_at = FALSE;
8478 putchar ('\n');
8481 ++p;
8485 /* getenv built-in spec function.
8487 Returns the value of the environment variable given by its first
8488 argument, concatenated with the second argument. If the
8489 environment variable is not defined, a fatal error is issued. */
8491 static const char *
8492 getenv_spec_function (int argc, const char **argv)
8494 char *value;
8495 char *result;
8496 char *ptr;
8497 size_t len;
8499 if (argc != 2)
8500 return NULL;
8502 value = getenv (argv[0]);
8503 if (!value)
8504 fatal ("environment variable \"%s\" not defined", argv[0]);
8506 /* We have to escape every character of the environment variable so
8507 they are not interpreted as active spec characters. A
8508 particularly painful case is when we are reading a variable
8509 holding a windows path complete with \ separators. */
8510 len = strlen (value) * 2 + strlen (argv[1]) + 1;
8511 result = XNEWVAR (char, len);
8512 for (ptr = result; *value; ptr += 2)
8514 ptr[0] = '\\';
8515 ptr[1] = *value++;
8518 strcpy (ptr, argv[1]);
8520 return result;
8523 /* if-exists built-in spec function.
8525 Checks to see if the file specified by the absolute pathname in
8526 ARGS exists. Returns that pathname if found.
8528 The usual use for this function is to check for a library file
8529 (whose name has been expanded with %s). */
8531 static const char *
8532 if_exists_spec_function (int argc, const char **argv)
8534 /* Must have only one argument. */
8535 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8536 return argv[0];
8538 return NULL;
8541 /* if-exists-else built-in spec function.
8543 This is like if-exists, but takes an additional argument which
8544 is returned if the first argument does not exist. */
8546 static const char *
8547 if_exists_else_spec_function (int argc, const char **argv)
8549 /* Must have exactly two arguments. */
8550 if (argc != 2)
8551 return NULL;
8553 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8554 return argv[0];
8556 return argv[1];
8559 /* replace-outfile built-in spec function.
8561 This looks for the first argument in the outfiles array's name and
8562 replaces it with the second argument. */
8564 static const char *
8565 replace_outfile_spec_function (int argc, const char **argv)
8567 int i;
8568 /* Must have exactly two arguments. */
8569 if (argc != 2)
8570 abort ();
8572 for (i = 0; i < n_infiles; i++)
8574 if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
8575 outfiles[i] = xstrdup (argv[1]);
8577 return NULL;
8580 /* Given two version numbers, compares the two numbers.
8581 A version number must match the regular expression
8582 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8584 static int
8585 compare_version_strings (const char *v1, const char *v2)
8587 int rresult;
8588 regex_t r;
8590 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8591 REG_EXTENDED | REG_NOSUB) != 0)
8592 abort ();
8593 rresult = regexec (&r, v1, 0, NULL, 0);
8594 if (rresult == REG_NOMATCH)
8595 fatal ("invalid version number `%s'", v1);
8596 else if (rresult != 0)
8597 abort ();
8598 rresult = regexec (&r, v2, 0, NULL, 0);
8599 if (rresult == REG_NOMATCH)
8600 fatal ("invalid version number `%s'", v2);
8601 else if (rresult != 0)
8602 abort ();
8604 return strverscmp (v1, v2);
8608 /* version_compare built-in spec function.
8610 This takes an argument of the following form:
8612 <comparison-op> <arg1> [<arg2>] <switch> <result>
8614 and produces "result" if the comparison evaluates to true,
8615 and nothing if it doesn't.
8617 The supported <comparison-op> values are:
8619 >= true if switch is a later (or same) version than arg1
8620 !> opposite of >=
8621 < true if switch is an earlier version than arg1
8622 !< opposite of <
8623 >< true if switch is arg1 or later, and earlier than arg2
8624 <> true if switch is earlier than arg1 or is arg2 or later
8626 If the switch is not present, the condition is false unless
8627 the first character of the <comparison-op> is '!'.
8629 For example,
8630 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8631 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8633 static const char *
8634 version_compare_spec_function (int argc, const char **argv)
8636 int comp1, comp2;
8637 size_t switch_len;
8638 const char *switch_value = NULL;
8639 int nargs = 1, i;
8640 bool result;
8642 if (argc < 3)
8643 fatal ("too few arguments to %%:version-compare");
8644 if (argv[0][0] == '\0')
8645 abort ();
8646 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8647 nargs = 2;
8648 if (argc != nargs + 3)
8649 fatal ("too many arguments to %%:version-compare");
8651 switch_len = strlen (argv[nargs + 1]);
8652 for (i = 0; i < n_switches; i++)
8653 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8654 && check_live_switch (i, switch_len))
8655 switch_value = switches[i].part1 + switch_len;
8657 if (switch_value == NULL)
8658 comp1 = comp2 = -1;
8659 else
8661 comp1 = compare_version_strings (switch_value, argv[1]);
8662 if (nargs == 2)
8663 comp2 = compare_version_strings (switch_value, argv[2]);
8664 else
8665 comp2 = -1; /* This value unused. */
8668 switch (argv[0][0] << 8 | argv[0][1])
8670 case '>' << 8 | '=':
8671 result = comp1 >= 0;
8672 break;
8673 case '!' << 8 | '<':
8674 result = comp1 >= 0 || switch_value == NULL;
8675 break;
8676 case '<' << 8:
8677 result = comp1 < 0;
8678 break;
8679 case '!' << 8 | '>':
8680 result = comp1 < 0 || switch_value == NULL;
8681 break;
8682 case '>' << 8 | '<':
8683 result = comp1 >= 0 && comp2 < 0;
8684 break;
8685 case '<' << 8 | '>':
8686 result = comp1 < 0 || comp2 >= 0;
8687 break;
8689 default:
8690 fatal ("unknown operator '%s' in %%:version-compare", argv[0]);
8692 if (! result)
8693 return NULL;
8695 return argv[nargs + 2];
8698 /* %:include builtin spec function. This differs from %include in that it
8699 can be nested inside a spec, and thus be conditionalized. It takes
8700 one argument, the filename, and looks for it in the startfile path.
8701 The result is always NULL, i.e. an empty expansion. */
8703 static const char *
8704 include_spec_function (int argc, const char **argv)
8706 char *file;
8708 if (argc != 1)
8709 abort ();
8711 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
8712 read_specs (file ? file : argv[0], FALSE);
8714 return NULL;
8717 /* %:find-file spec function. This function replace its argument by
8718 the file found thru find_file, that is the -print-file-name gcc
8719 program option. */
8720 static const char *
8721 find_file_spec_function (int argc, const char**argv)
8723 const char *file;
8725 if (argc != 1)
8726 abort ();
8728 file = find_file (argv[0]);
8729 return file;
8733 /* %:print-asm-header spec function. Print a banner to say that the
8734 following output is from the assembler. */
8736 static const char *
8737 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8738 const char **argv ATTRIBUTE_UNUSED)
8740 printf (_("Assembler options\n=================\n\n"));
8741 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8742 fflush (stdout);
8743 return NULL;
8746 /* Compute a timestamp to initialize flag_random_seed. */
8748 static unsigned
8749 get_local_tick (void)
8751 unsigned ret = 0;
8753 /* Get some more or less random data. */
8754 #ifdef HAVE_GETTIMEOFDAY
8756 struct timeval tv;
8758 gettimeofday (&tv, NULL);
8759 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8761 #else
8763 time_t now = time (NULL);
8765 if (now != (time_t)-1)
8766 ret = (unsigned) now;
8768 #endif
8770 return ret;
8773 /* %:compare-debug-dump-opt spec function. Save the last argument,
8774 expected to be the last -fdump-final-insns option, or generate a
8775 temporary. */
8777 static const char *
8778 compare_debug_dump_opt_spec_function (int arg,
8779 const char **argv ATTRIBUTE_UNUSED)
8781 const char *ret;
8782 char *name;
8783 int which;
8784 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
8786 if (arg != 0)
8787 fatal ("too many arguments to %%:compare-debug-dump-opt");
8789 do_spec_2 ("%{fdump-final-insns=*:%*}");
8790 do_spec_1 (" ", 0, NULL);
8792 if (argbuf_index > 0 && strcmp (argv[argbuf_index - 1], "."))
8794 if (!compare_debug)
8795 return NULL;
8797 name = xstrdup (argv[argbuf_index - 1]);
8798 ret = NULL;
8800 else
8802 const char *ext = NULL;
8804 if (argbuf_index > 0)
8806 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8807 ext = ".gkd";
8809 else if (!compare_debug)
8810 return NULL;
8811 else
8812 do_spec_2 ("%g.gkd");
8814 do_spec_1 (" ", 0, NULL);
8816 gcc_assert (argbuf_index > 0);
8818 name = concat (argbuf[argbuf_index - 1], ext, NULL);
8820 ret = concat ("-fdump-final-insns=", name, NULL);
8823 which = compare_debug < 0;
8824 debug_check_temp_file[which] = name;
8826 if (!which)
8828 unsigned HOST_WIDE_INT value = get_local_tick () ^ getpid ();
8830 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8833 if (*random_seed)
8834 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8835 ret, NULL);
8837 if (which)
8838 *random_seed = 0;
8840 return ret;
8843 static const char *debug_auxbase_opt;
8845 /* %:compare-debug-self-opt spec function. Expands to the options
8846 that are to be passed in the second compilation of
8847 compare-debug. */
8849 static const char *
8850 compare_debug_self_opt_spec_function (int arg,
8851 const char **argv ATTRIBUTE_UNUSED)
8853 if (arg != 0)
8854 fatal ("too many arguments to %%:compare-debug-self-opt");
8856 if (compare_debug >= 0)
8857 return NULL;
8859 do_spec_2 ("%{c|S:%{o*:%*}}");
8860 do_spec_1 (" ", 0, NULL);
8862 if (argbuf_index > 0)
8863 debug_auxbase_opt = concat ("-auxbase-strip ",
8864 argbuf[argbuf_index - 1],
8865 NULL);
8866 else
8867 debug_auxbase_opt = NULL;
8869 return concat ("\
8870 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8871 %<fdump-final-insns=* -w -S -o %j \
8872 %{!fcompare-debug-second:-fcompare-debug-second} \
8873 ", compare_debug_opt, NULL);
8876 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8877 options that are to be passed in the second compilation of
8878 compare-debug. It expects, as an argument, the basename of the
8879 current input file name, with the .gk suffix appended to it. */
8881 static const char *
8882 compare_debug_auxbase_opt_spec_function (int arg,
8883 const char **argv)
8885 char *name;
8886 int len;
8888 if (arg == 0)
8889 fatal ("too few arguments to %%:compare-debug-auxbase-opt");
8891 if (arg != 1)
8892 fatal ("too many arguments to %%:compare-debug-auxbase-opt");
8894 if (compare_debug >= 0)
8895 return NULL;
8897 len = strlen (argv[0]);
8898 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
8899 fatal ("argument to %%:compare-debug-auxbase-opt does not end in .gk");
8901 if (debug_auxbase_opt)
8902 return debug_auxbase_opt;
8904 #define OPT "-auxbase "
8906 len -= 3;
8907 name = (char*) xmalloc (sizeof (OPT) + len);
8908 memcpy (name, OPT, sizeof (OPT) - 1);
8909 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8910 name[sizeof (OPT) - 1 + len] = '\0';
8912 #undef OPT
8914 return name;