2010-07-29 Tobias Burnus <burnus@net-b.de>
[official-gcc.git] / gcc / gcc.c
blob62b3378f44982e202aa3abce945f0aff5ee05b0e
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 "diagnostic.h"
86 #include "flags.h"
87 #include "opts.h"
89 #ifdef HAVE_MMAP_FILE
90 # include <sys/mman.h>
91 # ifdef HAVE_MINCORE
92 /* This is on Solaris. */
93 # include <sys/types.h>
94 # endif
95 #endif
97 #ifndef MAP_FAILED
98 # define MAP_FAILED ((void *)-1)
99 #endif
101 /* By default there is no special suffix for target executables. */
102 /* FIXME: when autoconf is fixed, remove the host check - dj */
103 #if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
104 #define HAVE_TARGET_EXECUTABLE_SUFFIX
105 #endif
107 /* By default there is no special suffix for host executables. */
108 #ifdef HOST_EXECUTABLE_SUFFIX
109 #define HAVE_HOST_EXECUTABLE_SUFFIX
110 #else
111 #define HOST_EXECUTABLE_SUFFIX ""
112 #endif
114 /* By default, the suffix for target object files is ".o". */
115 #ifdef TARGET_OBJECT_SUFFIX
116 #define HAVE_TARGET_OBJECT_SUFFIX
117 #else
118 #define TARGET_OBJECT_SUFFIX ".o"
119 #endif
121 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
123 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
124 #ifndef LIBRARY_PATH_ENV
125 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
126 #endif
128 #ifndef HAVE_KILL
129 #define kill(p,s) raise(s)
130 #endif
132 /* If a stage of compilation returns an exit status >= 1,
133 compilation of that file ceases. */
135 #define MIN_FATAL_STATUS 1
137 /* Flag set by cppspec.c to 1. */
138 int is_cpp_driver;
140 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
141 static bool at_file_supplied;
143 /* Flag saying to pass the greatest exit code returned by a sub-process
144 to the calling program. */
145 static int pass_exit_codes;
147 /* Definition of string containing the arguments given to configure. */
148 #include "configargs.h"
150 /* Flag saying to print the directories gcc will search through looking for
151 programs, libraries, etc. */
153 static int print_search_dirs;
155 /* Flag saying to print the full filename of this file
156 as found through our usual search mechanism. */
158 static const char *print_file_name = NULL;
160 /* As print_file_name, but search for executable file. */
162 static const char *print_prog_name = NULL;
164 /* Flag saying to print the relative path we'd use to
165 find libgcc.a given the current compiler flags. */
167 static int print_multi_directory;
169 static int print_sysroot;
171 /* Flag saying to print the relative path we'd use to
172 find OS libraries given the current compiler flags. */
174 static int print_multi_os_directory;
176 /* Flag saying to print the list of subdirectories and
177 compiler flags used to select them in a standard form. */
179 static int print_multi_lib;
181 /* Flag saying to print the command line options understood by gcc and its
182 sub-processes. */
184 static int print_help_list;
186 /* Flag saying to print the version of gcc and its sub-processes. */
188 static int print_version;
190 /* Flag saying to print the sysroot suffix used for searching for
191 headers. */
193 static int print_sysroot_headers_suffix;
195 /* Flag indicating whether we should print the command and arguments */
197 static int verbose_flag;
199 /* Flag indicating whether we should ONLY print the command and
200 arguments (like verbose_flag) without executing the command.
201 Displayed arguments are quoted so that the generated command
202 line is suitable for execution. This is intended for use in
203 shell scripts to capture the driver-generated command line. */
204 static int verbose_only_flag;
206 /* Flag indicating how to print command line options of sub-processes. */
208 static int print_subprocess_help;
210 /* Flag indicating whether we should report subprocess execution times
211 (if this is supported by the system - see pexecute.c). */
213 static int report_times;
215 /* Whether we should report subprocess execution times to a file. */
217 FILE *report_times_to_file = NULL;
219 /* Nonzero means place this string before uses of /, so that include
220 and library files can be found in an alternate location. */
222 #ifdef TARGET_SYSTEM_ROOT
223 static const char *target_system_root = TARGET_SYSTEM_ROOT;
224 #else
225 static const char *target_system_root = 0;
226 #endif
228 /* Nonzero means pass the updated target_system_root to the compiler. */
230 static int target_system_root_changed;
232 /* Nonzero means append this string to target_system_root. */
234 static const char *target_sysroot_suffix = 0;
236 /* Nonzero means append this string to target_system_root for headers. */
238 static const char *target_sysroot_hdrs_suffix = 0;
240 /* Nonzero means write "temp" files in source directory
241 and use the source file's name in them, and don't delete them. */
243 static enum save_temps {
244 SAVE_TEMPS_NONE, /* no -save-temps */
245 SAVE_TEMPS_CWD, /* -save-temps in current directory */
246 SAVE_TEMPS_OBJ /* -save-temps in object directory */
247 } save_temps_flag;
249 /* Output file to use to get the object directory for -save-temps=obj */
250 static char *save_temps_prefix = 0;
251 static size_t save_temps_length = 0;
253 /* Nonzero means pass multiple source files to the compiler at one time. */
255 static int combine_flag = 0;
257 /* Nonzero means use pipes to communicate between subprocesses.
258 Overridden by either of the above two flags. */
260 static int use_pipes;
262 /* The compiler version. */
264 static const char *compiler_version;
266 /* The target version. */
268 static const char *const spec_version = DEFAULT_TARGET_VERSION;
270 /* The target machine. */
272 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
274 /* Nonzero if cross-compiling.
275 When -b is used, the value comes from the `specs' file. */
277 #ifdef CROSS_DIRECTORY_STRUCTURE
278 static const char *cross_compile = "1";
279 #else
280 static const char *cross_compile = "0";
281 #endif
283 /* Greatest exit code of sub-processes that has been encountered up to
284 now. */
285 static int greatest_status = 1;
287 /* This is the obstack which we use to allocate many strings. */
289 static struct obstack obstack;
291 /* This is the obstack to build an environment variable to pass to
292 collect2 that describes all of the relevant switches of what to
293 pass the compiler in building the list of pointers to constructors
294 and destructors. */
296 static struct obstack collect_obstack;
298 /* This is a list of a wrapper program and its arguments.
299 e.g. wrapper_string of "strace,-c"
300 will cause all programs to run as
301 strace -c program arguments
302 instead of just
303 program arguments */
304 static const char *wrapper_string;
306 /* Forward declaration for prototypes. */
307 struct path_prefix;
308 struct prefix_list;
310 static void init_spec (void);
311 static void store_arg (const char *, int, int);
312 static void insert_wrapper (const char *);
313 static char *load_specs (const char *);
314 static void read_specs (const char *, int);
315 static void set_spec (const char *, const char *);
316 static struct compiler *lookup_compiler (const char *, size_t, const char *);
317 static char *build_search_list (const struct path_prefix *, const char *,
318 bool, bool);
319 static void xputenv (const char *);
320 static void putenv_from_prefixes (const struct path_prefix *, const char *,
321 bool);
322 static int access_check (const char *, int);
323 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
324 static void add_prefix (struct path_prefix *, const char *, const char *,
325 int, int, int);
326 static void add_sysrooted_prefix (struct path_prefix *, const char *,
327 const char *, int, int, int);
328 static void translate_options (int *, const char *const **);
329 static char *skip_whitespace (char *);
330 static void delete_if_ordinary (const char *);
331 static void delete_temp_files (void);
332 static void delete_failure_queue (void);
333 static void clear_failure_queue (void);
334 static int check_live_switch (int, int);
335 static const char *handle_braces (const char *);
336 static inline bool input_suffix_matches (const char *, const char *);
337 static inline bool switch_matches (const char *, const char *, int);
338 static inline void mark_matching_switches (const char *, const char *, int);
339 static inline void process_marked_switches (void);
340 static const char *process_brace_body (const char *, const char *, const char *, int, int);
341 static const struct spec_function *lookup_spec_function (const char *);
342 static const char *eval_spec_function (const char *, const char *);
343 static const char *handle_spec_function (const char *);
344 static char *save_string (const char *, int);
345 static void set_collect_gcc_options (void);
346 static int do_spec_1 (const char *, int, const char *);
347 static int do_spec_2 (const char *);
348 static void do_option_spec (const char *, const char *);
349 static void do_self_spec (const char *);
350 static const char *find_file (const char *);
351 static int is_directory (const char *, bool);
352 static const char *validate_switches (const char *);
353 static void validate_all_switches (void);
354 static inline void validate_switches_from_spec (const char *);
355 static void give_switch (int, int);
356 static int used_arg (const char *, int);
357 static int default_arg (const char *, int);
358 static void set_multilib_dir (void);
359 static void print_multilib_info (void);
360 static void perror_with_name (const char *);
361 static void display_help (void);
362 static void add_preprocessor_option (const char *, int);
363 static void add_assembler_option (const char *, int);
364 static void add_linker_option (const char *, int);
365 static void process_command (int, const char **);
366 static int execute (void);
367 static void alloc_args (void);
368 static void clear_args (void);
369 static void fatal_signal (int);
370 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
371 static void init_gcc_specs (struct obstack *, const char *, const char *,
372 const char *);
373 #endif
374 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
375 static const char *convert_filename (const char *, int, int);
376 #endif
378 static const char *getenv_spec_function (int, const char **);
379 static const char *if_exists_spec_function (int, const char **);
380 static const char *if_exists_else_spec_function (int, const char **);
381 static const char *replace_outfile_spec_function (int, const char **);
382 static const char *version_compare_spec_function (int, const char **);
383 static const char *include_spec_function (int, const char **);
384 static const char *find_file_spec_function (int, const char **);
385 static const char *find_plugindir_spec_function (int, const char **);
386 static const char *print_asm_header_spec_function (int, const char **);
387 static const char *compare_debug_dump_opt_spec_function (int, const char **);
388 static const char *compare_debug_self_opt_spec_function (int, const char **);
389 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
391 /* The Specs Language
393 Specs are strings containing lines, each of which (if not blank)
394 is made up of a program name, and arguments separated by spaces.
395 The program name must be exact and start from root, since no path
396 is searched and it is unreliable to depend on the current working directory.
397 Redirection of input or output is not supported; the subprograms must
398 accept filenames saying what files to read and write.
400 In addition, the specs can contain %-sequences to substitute variable text
401 or for conditional text. Here is a table of all defined %-sequences.
402 Note that spaces are not generated automatically around the results of
403 expanding these sequences; therefore, you can concatenate them together
404 or with constant text in a single argument.
406 %% substitute one % into the program name or argument.
407 %i substitute the name of the input file being processed.
408 %b substitute the basename of the input file being processed.
409 This is the substring up to (and not including) the last period
410 and not including the directory unless -save-temps was specified
411 to put temporaries in a different location.
412 %B same as %b, but include the file suffix (text after the last period).
413 %gSUFFIX
414 substitute a file name that has suffix SUFFIX and is chosen
415 once per compilation, and mark the argument a la %d. To reduce
416 exposure to denial-of-service attacks, the file name is now
417 chosen in a way that is hard to predict even when previously
418 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
419 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
420 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
421 had been pre-processed. Previously, %g was simply substituted
422 with a file name chosen once per compilation, without regard
423 to any appended suffix (which was therefore treated just like
424 ordinary text), making such attacks more likely to succeed.
425 %|SUFFIX
426 like %g, but if -pipe is in effect, expands simply to "-".
427 %mSUFFIX
428 like %g, but if -pipe is in effect, expands to nothing. (We have both
429 %| and %m to accommodate differences between system assemblers; see
430 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
431 %uSUFFIX
432 like %g, but generates a new temporary file name even if %uSUFFIX
433 was already seen.
434 %USUFFIX
435 substitutes the last file name generated with %uSUFFIX, generating a
436 new one if there is no such last file name. In the absence of any
437 %uSUFFIX, this is just like %gSUFFIX, except they don't share
438 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
439 would involve the generation of two distinct file names, one
440 for each `%g.s' and another for each `%U.s'. Previously, %U was
441 simply substituted with a file name chosen for the previous %u,
442 without regard to any appended suffix.
443 %jSUFFIX
444 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
445 writable, and if save-temps is off; otherwise, substitute the name
446 of a temporary file, just like %u. This temporary file is not
447 meant for communication between processes, but rather as a junk
448 disposal mechanism.
449 %.SUFFIX
450 substitutes .SUFFIX for the suffixes of a matched switch's args when
451 it is subsequently output with %*. SUFFIX is terminated by the next
452 space or %.
453 %d marks the argument containing or following the %d as a
454 temporary file name, so that that file will be deleted if GCC exits
455 successfully. Unlike %g, this contributes no text to the argument.
456 %w marks the argument containing or following the %w as the
457 "output file" of this compilation. This puts the argument
458 into the sequence of arguments that %o will substitute later.
459 %V indicates that this compilation produces no "output file".
460 %W{...}
461 like %{...} but mark last argument supplied within
462 as a file to be deleted on failure.
463 %o substitutes the names of all the output files, with spaces
464 automatically placed around them. You should write spaces
465 around the %o as well or the results are undefined.
466 %o is for use in the specs for running the linker.
467 Input files whose names have no recognized suffix are not compiled
468 at all, but they are included among the output files, so they will
469 be linked.
470 %O substitutes the suffix for object files. Note that this is
471 handled specially when it immediately follows %g, %u, or %U
472 (with or without a suffix argument) because of the need for
473 those to form complete file names. The handling is such that
474 %O is treated exactly as if it had already been substituted,
475 except that %g, %u, and %U do not currently support additional
476 SUFFIX characters following %O as they would following, for
477 example, `.o'.
478 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
479 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
480 and -B options) and -imultilib as necessary.
481 %s current argument is the name of a library or startup file of some sort.
482 Search for that file in a standard list of directories
483 and substitute the full name found.
484 %eSTR Print STR as an error message. STR is terminated by a newline.
485 Use this when inconsistent options are detected.
486 %nSTR Print STR as a notice. STR is terminated by a newline.
487 %x{OPTION} Accumulate an option for %X.
488 %X Output the accumulated linker options specified by compilations.
489 %Y Output the accumulated assembler options specified by compilations.
490 %Z Output the accumulated preprocessor options specified by compilations.
491 %a process ASM_SPEC as a spec.
492 This allows config.h to specify part of the spec for running as.
493 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
494 used here. This can be used to run a post-processor after the
495 assembler has done its job.
496 %D Dump out a -L option for each directory in startfile_prefixes.
497 If multilib_dir is set, extra entries are generated with it affixed.
498 %l process LINK_SPEC as a spec.
499 %L process LIB_SPEC as a spec.
500 %G process LIBGCC_SPEC as a spec.
501 %R Output the concatenation of target_system_root and
502 target_sysroot_suffix.
503 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
504 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
505 %C process CPP_SPEC as a spec.
506 %1 process CC1_SPEC as a spec.
507 %2 process CC1PLUS_SPEC as a spec.
508 %* substitute the variable part of a matched option. (See below.)
509 Note that each comma in the substituted string is replaced by
510 a single space.
511 %<S remove all occurrences of -S from the command line.
512 Note - this command is position dependent. % commands in the
513 spec string before this one will see -S, % commands in the
514 spec string after this one will not.
515 %<S* remove all occurrences of all switches beginning with -S from the
516 command line.
517 %:function(args)
518 Call the named function FUNCTION, passing it ARGS. ARGS is
519 first processed as a nested spec string, then split into an
520 argument vector in the usual fashion. The function returns
521 a string which is processed as if it had appeared literally
522 as part of the current spec.
523 %{S} substitutes the -S switch, if that switch was given to GCC.
524 If that switch was not specified, this substitutes nothing.
525 Here S is a metasyntactic variable.
526 %{S*} substitutes all the switches specified to GCC whose names start
527 with -S. This is used for -o, -I, etc; switches that take
528 arguments. GCC considers `-o foo' as being one switch whose
529 name starts with `o'. %{o*} would substitute this text,
530 including the space; thus, two arguments would be generated.
531 %{S*&T*} likewise, but preserve order of S and T options (the order
532 of S and T in the spec is not significant). Can be any number
533 of ampersand-separated variables; for each the wild card is
534 optional. Useful for CPP as %{D*&U*&A*}.
536 %{S:X} substitutes X, if the -S switch was given to GCC.
537 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
538 %{S*:X} substitutes X if one or more switches whose names start
539 with -S was given to GCC. Normally X is substituted only
540 once, no matter how many such switches appeared. However,
541 if %* appears somewhere in X, then X will be substituted
542 once for each matching switch, with the %* replaced by the
543 part of that switch that matched the '*'.
544 %{.S:X} substitutes X, if processing a file with suffix S.
545 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
546 %{,S:X} substitutes X, if processing a file which will use spec S.
547 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
549 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
550 combined with '!', '.', ',', and '*' as above binding stronger
551 than the OR.
552 If %* appears in X, all of the alternatives must be starred, and
553 only the first matching alternative is substituted.
554 %{S:X; if S was given to GCC, substitutes X;
555 T:Y; else if T was given to GCC, substitutes Y;
556 :D} else substitutes D. There can be as many clauses as you need.
557 This may be combined with '.', '!', ',', '|', and '*' as above.
559 %(Spec) processes a specification defined in a specs file as *Spec:
560 %[Spec] as above, but put __ around -D arguments
562 The conditional text X in a %{S:X} or similar construct may contain
563 other nested % constructs or spaces, or even newlines. They are
564 processed as usual, as described above. Trailing white space in X is
565 ignored. White space may also appear anywhere on the left side of the
566 colon in these constructs, except between . or * and the corresponding
567 word.
569 The -O, -f, -m, and -W switches are handled specifically in these
570 constructs. If another value of -O or the negated form of a -f, -m, or
571 -W switch is found later in the command line, the earlier switch
572 value is ignored, except with {S*} where S is just one letter; this
573 passes all matching options.
575 The character | at the beginning of the predicate text is used to indicate
576 that a command should be piped to the following command, but only if -pipe
577 is specified.
579 Note that it is built into GCC which switches take arguments and which
580 do not. You might think it would be useful to generalize this to
581 allow each compiler's spec to say which switches take arguments. But
582 this cannot be done in a consistent fashion. GCC cannot even decide
583 which input files have been specified without knowing which switches
584 take arguments, and it must know which input files to compile in order
585 to tell which compilers to run.
587 GCC also knows implicitly that arguments starting in `-l' are to be
588 treated as compiler output files, and passed to the linker in their
589 proper position among the other output files. */
591 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
593 /* config.h can define ASM_SPEC to provide extra args to the assembler
594 or extra switch-translations. */
595 #ifndef ASM_SPEC
596 #define ASM_SPEC ""
597 #endif
599 /* config.h can define ASM_FINAL_SPEC to run a post processor after
600 the assembler has run. */
601 #ifndef ASM_FINAL_SPEC
602 #define ASM_FINAL_SPEC ""
603 #endif
605 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
606 or extra switch-translations. */
607 #ifndef CPP_SPEC
608 #define CPP_SPEC ""
609 #endif
611 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
612 or extra switch-translations. */
613 #ifndef CC1_SPEC
614 #define CC1_SPEC ""
615 #endif
617 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
618 or extra switch-translations. */
619 #ifndef CC1PLUS_SPEC
620 #define CC1PLUS_SPEC ""
621 #endif
623 /* config.h can define LINK_SPEC to provide extra args to the linker
624 or extra switch-translations. */
625 #ifndef LINK_SPEC
626 #define LINK_SPEC ""
627 #endif
629 /* config.h can define LIB_SPEC to override the default libraries. */
630 #ifndef LIB_SPEC
631 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
632 #endif
634 /* mudflap specs */
635 #ifndef MFWRAP_SPEC
636 /* XXX: valid only for GNU ld */
637 /* XXX: should exactly match hooks provided by libmudflap.a */
638 #define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
639 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
640 --wrap=mmap --wrap=munmap --wrap=alloca\
641 } %{fmudflapth: --wrap=pthread_create\
642 }} %{fmudflap|fmudflapth: --wrap=main}"
643 #endif
644 #ifndef MFLIB_SPEC
645 #define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
646 #endif
648 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
649 included. */
650 #ifndef LIBGCC_SPEC
651 #if defined(REAL_LIBGCC_SPEC)
652 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
653 #elif defined(LINK_LIBGCC_SPECIAL_1)
654 /* Have gcc do the search for libgcc.a. */
655 #define LIBGCC_SPEC "libgcc.a%s"
656 #else
657 #define LIBGCC_SPEC "-lgcc"
658 #endif
659 #endif
661 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
662 #ifndef STARTFILE_SPEC
663 #define STARTFILE_SPEC \
664 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
665 #endif
667 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
668 #ifndef ENDFILE_SPEC
669 #define ENDFILE_SPEC ""
670 #endif
672 #ifndef LINKER_NAME
673 #define LINKER_NAME "collect2"
674 #endif
676 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
677 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
678 #else
679 #define ASM_MAP ""
680 #endif
682 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
683 to the assembler. */
684 #ifndef ASM_DEBUG_SPEC
685 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
686 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
687 # define ASM_DEBUG_SPEC \
688 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
689 ? "%{!g0:%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}}" ASM_MAP \
690 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
691 # else
692 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
693 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
694 # endif
695 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
696 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
697 # endif
698 # endif
699 #endif
700 #ifndef ASM_DEBUG_SPEC
701 # define ASM_DEBUG_SPEC ""
702 #endif
704 /* Here is the spec for running the linker, after compiling all files. */
706 /* This is overridable by the target in case they need to specify the
707 -lgcc and -lc order specially, yet not require them to override all
708 of LINK_COMMAND_SPEC. */
709 #ifndef LINK_GCC_C_SEQUENCE_SPEC
710 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
711 #endif
713 #ifndef LINK_SSP_SPEC
714 #ifdef TARGET_LIBC_PROVIDES_SSP
715 #define LINK_SSP_SPEC "%{fstack-protector:}"
716 #else
717 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
718 #endif
719 #endif
721 #ifndef LINK_PIE_SPEC
722 #ifdef HAVE_LD_PIE
723 #define LINK_PIE_SPEC "%{pie:-pie} "
724 #else
725 #define LINK_PIE_SPEC "%{pie:} "
726 #endif
727 #endif
729 #ifndef LINK_BUILDID_SPEC
730 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
731 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
732 # endif
733 #endif
736 /* -u* was put back because both BSD and SysV seem to support it. */
737 /* %{static:} simply prevents an error message if the target machine
738 doesn't handle -static. */
739 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
740 scripts which exist in user specified directories, or in standard
741 directories. */
742 /* We pass any -flto and -fwhopr flags on to the linker, which is expected
743 to understand them. In practice, this means it had better be collect2. */
744 #ifndef LINK_COMMAND_SPEC
745 #define LINK_COMMAND_SPEC "\
746 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
747 %(linker) \
748 %{fuse-linker-plugin: \
749 -plugin %(linker_plugin_file) \
750 -plugin-opt=%(lto_wrapper) \
751 -plugin-opt=-fresolution=%u.res \
752 %{static|static-libgcc:-plugin-opt=-pass-through=%(lto_libgcc)} \
753 %{static:-plugin-opt=-pass-through=-lc} \
755 %{flto:%<fcompare-debug*} %{fwhopr*:%<fcompare-debug*} \
756 %{flto} %{fwhopr*} %l " LINK_PIE_SPEC \
757 "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
758 %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
759 %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
760 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
761 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov}\
762 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
763 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
764 #endif
766 #ifndef LINK_LIBGCC_SPEC
767 /* Generate -L options for startfile prefix list. */
768 # define LINK_LIBGCC_SPEC "%D"
769 #endif
771 #ifndef STARTFILE_PREFIX_SPEC
772 # define STARTFILE_PREFIX_SPEC ""
773 #endif
775 #ifndef SYSROOT_SPEC
776 # define SYSROOT_SPEC "--sysroot=%R"
777 #endif
779 #ifndef SYSROOT_SUFFIX_SPEC
780 # define SYSROOT_SUFFIX_SPEC ""
781 #endif
783 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
784 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
785 #endif
787 static const char *asm_debug;
788 static const char *cpp_spec = CPP_SPEC;
789 static const char *cc1_spec = CC1_SPEC;
790 static const char *cc1plus_spec = CC1PLUS_SPEC;
791 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
792 static const char *link_ssp_spec = LINK_SSP_SPEC;
793 static const char *asm_spec = ASM_SPEC;
794 static const char *asm_final_spec = ASM_FINAL_SPEC;
795 static const char *link_spec = LINK_SPEC;
796 static const char *lib_spec = LIB_SPEC;
797 static const char *mfwrap_spec = MFWRAP_SPEC;
798 static const char *mflib_spec = MFLIB_SPEC;
799 static const char *link_gomp_spec = "";
800 static const char *libgcc_spec = LIBGCC_SPEC;
801 static const char *endfile_spec = ENDFILE_SPEC;
802 static const char *startfile_spec = STARTFILE_SPEC;
803 static const char *linker_name_spec = LINKER_NAME;
804 static const char *linker_plugin_file_spec = "";
805 static const char *lto_wrapper_spec = "";
806 static const char *lto_gcc_spec = "";
807 static const char *lto_libgcc_spec = "";
808 static const char *link_command_spec = LINK_COMMAND_SPEC;
809 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
810 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
811 static const char *sysroot_spec = SYSROOT_SPEC;
812 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
813 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
815 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
816 There should be no need to override these in target dependent files,
817 but we need to copy them to the specs file so that newer versions
818 of the GCC driver can correctly drive older tool chains with the
819 appropriate -B options. */
821 /* When cpplib handles traditional preprocessing, get rid of this, and
822 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
823 that we default the front end language better. */
824 static const char *trad_capable_cpp =
825 "cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
827 /* We don't wrap .d files in %W{} since a missing .d file, and
828 therefore no dependency entry, confuses make into thinking a .o
829 file that happens to exist is up-to-date. */
830 static const char *cpp_unique_options =
831 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
832 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
833 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
834 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
835 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
836 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
837 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
838 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
839 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
840 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
841 %{E|M|MM:%W{o*}}";
843 /* This contains cpp options which are common with cc1_options and are passed
844 only when preprocessing only to avoid duplication. We pass the cc1 spec
845 options to the preprocessor so that it the cc1 spec may manipulate
846 options used to set target flags. Those special target flags settings may
847 in turn cause preprocessor symbols to be defined specially. */
848 static const char *cpp_options =
849 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
850 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
851 %{undef} %{save-temps*:-fpch-preprocess}";
853 /* This contains cpp options which are not passed when the preprocessor
854 output will be used by another program. */
855 static const char *cpp_debug_options = "%{d*}";
857 /* NB: This is shared amongst all front-ends, except for Ada. */
858 static const char *cc1_options =
859 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
860 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
861 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{a*}\
862 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
863 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
864 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
865 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
866 %{Qn:-fno-ident} %{--help:--help}\
867 %{--target-help:--target-help}\
868 %{--help=*:--help=%(VALUE)}\
869 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
870 %{fsyntax-only:-o %j} %{-param*}\
871 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
872 %{coverage:-fprofile-arcs -ftest-coverage}";
874 static const char *asm_options =
875 "%{--target-help:%:print-asm-header()} "
876 #if HAVE_GNU_AS
877 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
878 to the assembler equivalents. */
879 "%{v} %{w:-W} %{I*} "
880 #endif
881 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
883 static const char *invoke_as =
884 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
885 "%{!fwpa:\
886 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
887 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
889 #else
890 "%{!fwpa:\
891 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
892 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
894 #endif
896 /* Some compilers have limits on line lengths, and the multilib_select
897 and/or multilib_matches strings can be very long, so we build them at
898 run time. */
899 static struct obstack multilib_obstack;
900 static const char *multilib_select;
901 static const char *multilib_matches;
902 static const char *multilib_defaults;
903 static const char *multilib_exclusions;
905 /* Check whether a particular argument is a default argument. */
907 #ifndef MULTILIB_DEFAULTS
908 #define MULTILIB_DEFAULTS { "" }
909 #endif
911 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
913 #ifndef DRIVER_SELF_SPECS
914 #define DRIVER_SELF_SPECS ""
915 #endif
917 /* Adding -fopenmp should imply pthreads. This is particularly important
918 for targets that use different start files and suchlike. */
919 #ifndef GOMP_SELF_SPECS
920 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
921 #endif
923 static const char *const driver_self_specs[] = {
924 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
925 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS
928 #ifndef OPTION_DEFAULT_SPECS
929 #define OPTION_DEFAULT_SPECS { "", "" }
930 #endif
932 struct default_spec
934 const char *name;
935 const char *spec;
938 static const struct default_spec
939 option_default_specs[] = { OPTION_DEFAULT_SPECS };
941 struct user_specs
943 struct user_specs *next;
944 const char *filename;
947 static struct user_specs *user_specs_head, *user_specs_tail;
950 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
951 /* This defines which switches stop a full compilation. */
952 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
953 ((CHAR) == 'c' || (CHAR) == 'S' || (CHAR) == 'E')
955 #ifndef SWITCH_CURTAILS_COMPILATION
956 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
957 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
958 #endif
959 #endif
961 /* Record the mapping from file suffixes for compilation specs. */
963 struct compiler
965 const char *suffix; /* Use this compiler for input files
966 whose names end in this suffix. */
968 const char *spec; /* To use this compiler, run this spec. */
970 const char *cpp_spec; /* If non-NULL, substitute this spec
971 for `%C', rather than the usual
972 cpp_spec. */
973 const int combinable; /* If nonzero, compiler can deal with
974 multiple source files at once (IMA). */
975 const int needs_preprocessing; /* If nonzero, source files need to
976 be run through a preprocessor. */
979 /* Pointer to a vector of `struct compiler' that gives the spec for
980 compiling a file, based on its suffix.
981 A file that does not end in any of these suffixes will be passed
982 unchanged to the loader and nothing else will be done to it.
984 An entry containing two 0s is used to terminate the vector.
986 If multiple entries match a file, the last matching one is used. */
988 static struct compiler *compilers;
990 /* Number of entries in `compilers', not counting the null terminator. */
992 static int n_compilers;
994 /* The default list of file name suffixes and their compilation specs. */
996 static const struct compiler default_compilers[] =
998 /* Add lists of suffixes of known languages here. If those languages
999 were not present when we built the driver, we will hit these copies
1000 and be given a more meaningful error than "file not used since
1001 linking is not done". */
1002 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1003 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1004 {".mii", "#Objective-C++", 0, 0, 0},
1005 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1006 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1007 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1008 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1009 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1010 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1011 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1012 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1013 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1014 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1015 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1016 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1017 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1018 {".r", "#Ratfor", 0, 0, 0},
1019 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1020 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1021 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
1022 /* Next come the entries for C. */
1023 {".c", "@c", 0, 1, 1},
1024 {"@c",
1025 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1026 external preprocessor if -save-temps is given. */
1027 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1028 %{!E:%{!M:%{!MM:\
1029 %{traditional|ftraditional:\
1030 %eGNU C no longer supports -traditional without -E}\
1031 %{!combine:\
1032 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1033 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1034 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1035 %(cc1_options)}\
1036 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1037 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1038 %{!fsyntax-only:%(invoke_as)}} \
1039 %{combine:\
1040 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1041 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i}}\
1042 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1043 cc1 %(cpp_unique_options) %(cc1_options)}}\
1044 %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
1045 {"-",
1046 "%{!E:%e-E or -x required when input is from standard input}\
1047 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1048 {".h", "@c-header", 0, 0, 0},
1049 {"@c-header",
1050 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1051 external preprocessor if -save-temps is given. */
1052 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1053 %{!E:%{!M:%{!MM:\
1054 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1055 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1056 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1057 %(cc1_options)\
1058 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1059 %W{o*:--output-pch=%*}}%V}\
1060 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1061 cc1 %(cpp_unique_options) %(cc1_options)\
1062 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1063 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
1064 {".i", "@cpp-output", 0, 1, 0},
1065 {"@cpp-output",
1066 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
1067 {".s", "@assembler", 0, 1, 0},
1068 {"@assembler",
1069 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
1070 {".sx", "@assembler-with-cpp", 0, 1, 0},
1071 {".S", "@assembler-with-cpp", 0, 1, 0},
1072 {"@assembler-with-cpp",
1073 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1074 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1075 %{E|M|MM:%(cpp_debug_options)}\
1076 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1077 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1078 #else
1079 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1080 %{E|M|MM:%(cpp_debug_options)}\
1081 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1082 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1083 #endif
1084 , 0, 1, 0},
1086 #include "specs.h"
1087 /* Mark end of table. */
1088 {0, 0, 0, 0, 0}
1091 /* Number of elements in default_compilers, not counting the terminator. */
1093 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1095 /* A vector of options to give to the linker.
1096 These options are accumulated by %x,
1097 and substituted into the linker command with %X. */
1098 static int n_linker_options;
1099 static char **linker_options;
1101 /* A vector of options to give to the assembler.
1102 These options are accumulated by -Wa,
1103 and substituted into the assembler command with %Y. */
1104 static int n_assembler_options;
1105 static char **assembler_options;
1107 /* A vector of options to give to the preprocessor.
1108 These options are accumulated by -Wp,
1109 and substituted into the preprocessor command with %Z. */
1110 static int n_preprocessor_options;
1111 static char **preprocessor_options;
1113 /* Define how to map long options into short ones. */
1115 /* This structure describes one mapping. */
1116 struct option_map
1118 /* The long option's name. */
1119 const char *const name;
1120 /* The equivalent short option. */
1121 const char *const equivalent;
1122 /* Argument info. A string of flag chars; NULL equals no options.
1123 a => argument required.
1124 o => argument optional.
1125 j => join argument to equivalent, making one word.
1126 * => require other text after NAME as an argument. */
1127 const char *const arg_info;
1130 /* This is the table of mappings. Mappings are tried sequentially
1131 for each option encountered; the first one that matches, wins. */
1133 static const struct option_map option_map[] =
1135 {"--all-warnings", "-Wall", 0},
1136 {"--ansi", "-ansi", 0},
1137 {"--assemble", "-S", 0},
1138 {"--assert", "-A", "a"},
1139 {"--classpath", "-fclasspath=", "aj"},
1140 {"--bootclasspath", "-fbootclasspath=", "aj"},
1141 {"--CLASSPATH", "-fclasspath=", "aj"},
1142 {"--combine", "-combine", 0},
1143 {"--comments", "-C", 0},
1144 {"--comments-in-macros", "-CC", 0},
1145 {"--compile", "-c", 0},
1146 {"--debug", "-g", "oj"},
1147 {"--define-macro", "-D", "aj"},
1148 {"--dependencies", "-M", 0},
1149 {"--dump", "-d", "a"},
1150 {"--dumpbase", "-dumpbase", "a"},
1151 {"--dumpdir", "-dumpdir", "a"},
1152 {"--encoding", "-fencoding=", "aj"},
1153 {"--entry", "-e", 0},
1154 {"--extra-warnings", "-W", 0},
1155 {"--extdirs", "-fextdirs=", "aj"},
1156 {"--for-assembler", "-Wa", "a"},
1157 {"--for-linker", "-Xlinker", "a"},
1158 {"--force-link", "-u", "a"},
1159 {"--coverage", "-coverage", 0},
1160 {"--imacros", "-imacros", "a"},
1161 {"--include", "-include", "a"},
1162 {"--include-barrier", "-I-", 0},
1163 {"--include-directory", "-I", "aj"},
1164 {"--include-directory-after", "-idirafter", "a"},
1165 {"--include-prefix", "-iprefix", "a"},
1166 {"--include-with-prefix", "-iwithprefix", "a"},
1167 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
1168 {"--include-with-prefix-after", "-iwithprefix", "a"},
1169 {"--language", "-x", "a"},
1170 {"--library-directory", "-L", "a"},
1171 {"--machine", "-m", "aj"},
1172 {"--machine-", "-m", "*j"},
1173 {"--no-canonical-prefixes", "-no-canonical-prefixes", 0},
1174 {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1175 {"--no-line-commands", "-P", 0},
1176 {"--no-precompiled-includes", "-noprecomp", 0},
1177 {"--no-standard-includes", "-nostdinc", 0},
1178 {"--no-standard-libraries", "-nostdlib", 0},
1179 {"--no-warnings", "-w", 0},
1180 {"--optimize", "-O", "oj"},
1181 {"--output", "-o", "a"},
1182 {"--output-class-directory", "-foutput-class-dir=", "ja"},
1183 {"--param", "--param", "a"},
1184 {"--pass-exit-codes", "-pass-exit-codes", 0},
1185 {"--pedantic", "-pedantic", 0},
1186 {"--pedantic-errors", "-pedantic-errors", 0},
1187 {"--pie", "-pie", 0},
1188 {"--pipe", "-pipe", 0},
1189 {"--prefix", "-B", "a"},
1190 {"--preprocess", "-E", 0},
1191 {"--print-search-dirs", "-print-search-dirs", 0},
1192 {"--print-file-name", "-print-file-name=", "aj"},
1193 {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
1194 {"--print-missing-file-dependencies", "-MG", 0},
1195 {"--print-multi-lib", "-print-multi-lib", 0},
1196 {"--print-multi-directory", "-print-multi-directory", 0},
1197 {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1198 {"--print-prog-name", "-print-prog-name=", "aj"},
1199 {"--print-sysroot", "-print-sysroot", 0},
1200 {"--print-sysroot-headers-suffix", "-print-sysroot-headers-suffix", 0},
1201 {"--profile", "-p", 0},
1202 {"--profile-blocks", "-a", 0},
1203 {"--quiet", "-q", 0},
1204 {"--resource", "-fcompile-resource=", "aj"},
1205 {"--save-temps", "-save-temps", 0},
1206 {"--shared", "-shared", 0},
1207 {"--silent", "-q", 0},
1208 {"--specs", "-specs=", "aj"},
1209 {"--static", "-static", 0},
1210 {"--std", "-std=", "aj"},
1211 {"--symbolic", "-symbolic", 0},
1212 {"--sysroot", "--sysroot=", "aj"},
1213 {"--time", "-time", 0},
1214 {"--trace-includes", "-H", 0},
1215 {"--traditional", "-traditional", 0},
1216 {"--traditional-cpp", "-traditional-cpp", 0},
1217 {"--trigraphs", "-trigraphs", 0},
1218 {"--undefine-macro", "-U", "aj"},
1219 {"--user-dependencies", "-MM", 0},
1220 {"--verbose", "-v", 0},
1221 {"--warn-", "-W", "*j"},
1222 {"--write-dependencies", "-MD", 0},
1223 {"--write-user-dependencies", "-MMD", 0},
1224 {"--", "-f", "*j"}
1228 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1229 static const struct {
1230 const char *const option_found;
1231 const char *const replacements;
1232 } target_option_translations[] =
1234 TARGET_OPTION_TRANSLATE_TABLE,
1235 { 0, 0 }
1237 #endif
1239 /* Translate the options described by *ARGCP and *ARGVP.
1240 Make a new vector and store it back in *ARGVP,
1241 and store its length in *ARGCP. */
1243 static void
1244 translate_options (int *argcp, const char *const **argvp)
1246 int i;
1247 int argc = *argcp;
1248 const char *const *argv = *argvp;
1249 int newvsize = (argc + 2) * 2 * sizeof (const char *);
1250 const char **newv = XNEWVAR (const char *, newvsize);
1251 int newindex = 0;
1253 i = 0;
1254 newv[newindex++] = argv[i++];
1256 while (i < argc)
1258 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1259 int tott_idx;
1261 for (tott_idx = 0;
1262 target_option_translations[tott_idx].option_found;
1263 tott_idx++)
1265 if (strcmp (target_option_translations[tott_idx].option_found,
1266 argv[i]) == 0)
1268 int spaces = 1;
1269 const char *sp;
1270 char *np;
1272 for (sp = target_option_translations[tott_idx].replacements;
1273 *sp; sp++)
1275 if (*sp == ' ')
1276 spaces ++;
1279 newvsize += spaces * sizeof (const char *);
1280 newv = XRESIZEVAR (const char *, newv, newvsize);
1282 sp = target_option_translations[tott_idx].replacements;
1283 np = xstrdup (sp);
1285 while (1)
1287 while (*np == ' ')
1288 np++;
1289 if (*np == 0)
1290 break;
1291 newv[newindex++] = np;
1292 while (*np != ' ' && *np)
1293 np++;
1294 if (*np == 0)
1295 break;
1296 *np++ = 0;
1299 i ++;
1300 break;
1303 if (target_option_translations[tott_idx].option_found)
1304 continue;
1305 #endif
1307 /* Translate -- options. */
1308 if (argv[i][0] == '-' && argv[i][1] == '-')
1310 size_t j;
1311 /* Find a mapping that applies to this option. */
1312 for (j = 0; j < ARRAY_SIZE (option_map); j++)
1314 size_t optlen = strlen (option_map[j].name);
1315 size_t arglen = strlen (argv[i]);
1316 size_t complen = arglen > optlen ? optlen : arglen;
1317 const char *arginfo = option_map[j].arg_info;
1319 if (arginfo == 0)
1320 arginfo = "";
1322 if (!strncmp (argv[i], option_map[j].name, complen))
1324 const char *arg = 0;
1326 if (arglen < optlen)
1328 size_t k;
1329 for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1330 if (strlen (option_map[k].name) >= arglen
1331 && !strncmp (argv[i], option_map[k].name, arglen))
1333 error ("ambiguous abbreviation %s", argv[i]);
1334 break;
1337 if (k != ARRAY_SIZE (option_map))
1338 break;
1341 if (arglen > optlen)
1343 /* If the option has an argument, accept that. */
1344 if (argv[i][optlen] == '=')
1345 arg = argv[i] + optlen + 1;
1347 /* If this mapping requires extra text at end of name,
1348 accept that as "argument". */
1349 else if (strchr (arginfo, '*') != 0)
1350 arg = argv[i] + optlen;
1352 /* Otherwise, extra text at end means mismatch.
1353 Try other mappings. */
1354 else
1355 continue;
1358 else if (strchr (arginfo, '*') != 0)
1360 error ("incomplete %qs option", option_map[j].name);
1361 break;
1364 /* Handle arguments. */
1365 if (strchr (arginfo, 'a') != 0)
1367 if (arg == 0)
1369 if (i + 1 == argc)
1371 error ("missing argument to %qs option",
1372 option_map[j].name);
1373 break;
1376 arg = argv[++i];
1379 else if (strchr (arginfo, '*') != 0)
1381 else if (strchr (arginfo, 'o') == 0)
1383 if (arg != 0)
1384 error ("extraneous argument to %qs option",
1385 option_map[j].name);
1386 arg = 0;
1389 /* Store the translation as one argv elt or as two. */
1390 if (arg != 0 && strchr (arginfo, 'j') != 0)
1391 newv[newindex++] = concat (option_map[j].equivalent, arg,
1392 NULL);
1393 else if (arg != 0)
1395 newv[newindex++] = option_map[j].equivalent;
1396 newv[newindex++] = arg;
1398 else
1399 newv[newindex++] = option_map[j].equivalent;
1401 break;
1404 i++;
1407 /* Handle old-fashioned options--just copy them through,
1408 with their arguments. */
1409 else if (argv[i][0] == '-')
1411 const char *p = argv[i] + 1;
1412 int c = *p;
1413 int nskip = 1;
1415 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1416 nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1417 else if (WORD_SWITCH_TAKES_ARG (p))
1418 nskip += WORD_SWITCH_TAKES_ARG (p);
1419 else if ((c == 'B' || c == 'b' || c == 'x')
1420 && p[1] == 0)
1421 nskip += 1;
1422 else if (! strcmp (p, "Xlinker"))
1423 nskip += 1;
1424 else if (! strcmp (p, "Xpreprocessor"))
1425 nskip += 1;
1426 else if (! strcmp (p, "Xassembler"))
1427 nskip += 1;
1429 /* Watch out for an option at the end of the command line that
1430 is missing arguments, and avoid skipping past the end of the
1431 command line. */
1432 if (nskip + i > argc)
1433 nskip = argc - i;
1435 while (nskip > 0)
1437 newv[newindex++] = argv[i++];
1438 nskip--;
1441 else
1442 /* Ordinary operands. */
1443 newv[newindex++] = argv[i++];
1446 newv[newindex] = 0;
1448 *argvp = newv;
1449 *argcp = newindex;
1452 static char *
1453 skip_whitespace (char *p)
1455 while (1)
1457 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1458 be considered whitespace. */
1459 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1460 return p + 1;
1461 else if (*p == '\n' || *p == ' ' || *p == '\t')
1462 p++;
1463 else if (*p == '#')
1465 while (*p != '\n')
1466 p++;
1467 p++;
1469 else
1470 break;
1473 return p;
1475 /* Structures to keep track of prefixes to try when looking for files. */
1477 struct prefix_list
1479 const char *prefix; /* String to prepend to the path. */
1480 struct prefix_list *next; /* Next in linked list. */
1481 int require_machine_suffix; /* Don't use without machine_suffix. */
1482 /* 2 means try both machine_suffix and just_machine_suffix. */
1483 int priority; /* Sort key - priority within list. */
1484 int os_multilib; /* 1 if OS multilib scheme should be used,
1485 0 for GCC multilib scheme. */
1488 struct path_prefix
1490 struct prefix_list *plist; /* List of prefixes to try */
1491 int max_len; /* Max length of a prefix in PLIST */
1492 const char *name; /* Name of this list (used in config stuff) */
1495 /* List of prefixes to try when looking for executables. */
1497 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1499 /* List of prefixes to try when looking for startup (crt0) files. */
1501 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1503 /* List of prefixes to try when looking for include files. */
1505 static struct path_prefix include_prefixes = { 0, 0, "include" };
1507 /* Suffix to attach to directories searched for commands.
1508 This looks like `MACHINE/VERSION/'. */
1510 static const char *machine_suffix = 0;
1512 /* Suffix to attach to directories searched for commands.
1513 This is just `MACHINE/'. */
1515 static const char *just_machine_suffix = 0;
1517 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1519 static const char *gcc_exec_prefix;
1521 /* Adjusted value of standard_libexec_prefix. */
1523 static const char *gcc_libexec_prefix;
1525 /* Default prefixes to attach to command names. */
1527 #ifndef STANDARD_STARTFILE_PREFIX_1
1528 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1529 #endif
1530 #ifndef STANDARD_STARTFILE_PREFIX_2
1531 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1532 #endif
1534 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1535 #undef MD_EXEC_PREFIX
1536 #undef MD_STARTFILE_PREFIX
1537 #undef MD_STARTFILE_PREFIX_1
1538 #endif
1540 /* If no prefixes defined, use the null string, which will disable them. */
1541 #ifndef MD_EXEC_PREFIX
1542 #define MD_EXEC_PREFIX ""
1543 #endif
1544 #ifndef MD_STARTFILE_PREFIX
1545 #define MD_STARTFILE_PREFIX ""
1546 #endif
1547 #ifndef MD_STARTFILE_PREFIX_1
1548 #define MD_STARTFILE_PREFIX_1 ""
1549 #endif
1551 /* These directories are locations set at configure-time based on the
1552 --prefix option provided to configure. Their initializers are
1553 defined in Makefile.in. These paths are not *directly* used when
1554 gcc_exec_prefix is set because, in that case, we know where the
1555 compiler has been installed, and use paths relative to that
1556 location instead. */
1557 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1558 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1559 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1560 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1562 /* For native compilers, these are well-known paths containing
1563 components that may be provided by the system. For cross
1564 compilers, these paths are not used. */
1565 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1566 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1567 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1568 static const char *const standard_startfile_prefix_1
1569 = STANDARD_STARTFILE_PREFIX_1;
1570 static const char *const standard_startfile_prefix_2
1571 = STANDARD_STARTFILE_PREFIX_2;
1573 /* A relative path to be used in finding the location of tools
1574 relative to the driver. */
1575 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1577 /* Subdirectory to use for locating libraries. Set by
1578 set_multilib_dir based on the compilation options. */
1580 static const char *multilib_dir;
1582 /* Subdirectory to use for locating libraries in OS conventions. Set by
1583 set_multilib_dir based on the compilation options. */
1585 static const char *multilib_os_dir;
1587 /* Structure to keep track of the specs that have been defined so far.
1588 These are accessed using %(specname) or %[specname] in a compiler
1589 or link spec. */
1591 struct spec_list
1593 /* The following 2 fields must be first */
1594 /* to allow EXTRA_SPECS to be initialized */
1595 const char *name; /* name of the spec. */
1596 const char *ptr; /* available ptr if no static pointer */
1598 /* The following fields are not initialized */
1599 /* by EXTRA_SPECS */
1600 const char **ptr_spec; /* pointer to the spec itself. */
1601 struct spec_list *next; /* Next spec in linked list. */
1602 int name_len; /* length of the name */
1603 int alloc_p; /* whether string was allocated */
1606 #define INIT_STATIC_SPEC(NAME,PTR) \
1607 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1609 /* List of statically defined specs. */
1610 static struct spec_list static_specs[] =
1612 INIT_STATIC_SPEC ("asm", &asm_spec),
1613 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1614 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1615 INIT_STATIC_SPEC ("asm_options", &asm_options),
1616 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1617 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1618 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1619 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1620 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1621 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1622 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1623 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1624 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1625 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1626 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1627 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1628 INIT_STATIC_SPEC ("link", &link_spec),
1629 INIT_STATIC_SPEC ("lib", &lib_spec),
1630 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1631 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1632 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1633 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1634 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1635 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1636 INIT_STATIC_SPEC ("version", &compiler_version),
1637 INIT_STATIC_SPEC ("multilib", &multilib_select),
1638 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1639 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1640 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1641 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1642 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1643 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1644 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1645 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1646 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1647 INIT_STATIC_SPEC ("lto_libgcc", &lto_libgcc_spec),
1648 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1649 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1650 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1651 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1652 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1653 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1654 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1655 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1658 #ifdef EXTRA_SPECS /* additional specs needed */
1659 /* Structure to keep track of just the first two args of a spec_list.
1660 That is all that the EXTRA_SPECS macro gives us. */
1661 struct spec_list_1
1663 const char *const name;
1664 const char *const ptr;
1667 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1668 static struct spec_list *extra_specs = (struct spec_list *) 0;
1669 #endif
1671 /* List of dynamically allocates specs that have been defined so far. */
1673 static struct spec_list *specs = (struct spec_list *) 0;
1675 /* List of static spec functions. */
1677 static const struct spec_function static_spec_functions[] =
1679 { "getenv", getenv_spec_function },
1680 { "if-exists", if_exists_spec_function },
1681 { "if-exists-else", if_exists_else_spec_function },
1682 { "replace-outfile", replace_outfile_spec_function },
1683 { "version-compare", version_compare_spec_function },
1684 { "include", include_spec_function },
1685 { "find-file", find_file_spec_function },
1686 { "find-plugindir", find_plugindir_spec_function },
1687 { "print-asm-header", print_asm_header_spec_function },
1688 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1689 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1690 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1691 #ifdef EXTRA_SPEC_FUNCTIONS
1692 EXTRA_SPEC_FUNCTIONS
1693 #endif
1694 { 0, 0 }
1697 static int processing_spec_function;
1699 /* Add appropriate libgcc specs to OBSTACK, taking into account
1700 various permutations of -shared-libgcc, -shared, and such. */
1702 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1704 #ifndef USE_LD_AS_NEEDED
1705 #define USE_LD_AS_NEEDED 0
1706 #endif
1708 static void
1709 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1710 const char *static_name, const char *eh_name)
1712 char *buf;
1714 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1715 "%{!static:%{!static-libgcc:"
1716 #if USE_LD_AS_NEEDED
1717 "%{!shared-libgcc:",
1718 static_name, " --as-needed ", shared_name, " --no-as-needed"
1720 "%{shared-libgcc:",
1721 shared_name, "%{!shared: ", static_name, "}"
1723 #else
1724 "%{!shared:"
1725 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1726 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1728 #ifdef LINK_EH_SPEC
1729 "%{shared:"
1730 "%{shared-libgcc:", shared_name, "}"
1731 "%{!shared-libgcc:", static_name, "}"
1733 #else
1734 "%{shared:", shared_name, "}"
1735 #endif
1736 #endif
1737 "}}", NULL);
1739 obstack_grow (obstack, buf, strlen (buf));
1740 free (buf);
1742 #endif /* ENABLE_SHARED_LIBGCC */
1744 /* Initialize the specs lookup routines. */
1746 static void
1747 init_spec (void)
1749 struct spec_list *next = (struct spec_list *) 0;
1750 struct spec_list *sl = (struct spec_list *) 0;
1751 int i;
1753 if (specs)
1754 return; /* Already initialized. */
1756 if (verbose_flag)
1757 fnotice (stderr, "Using built-in specs.\n");
1759 #ifdef EXTRA_SPECS
1760 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1762 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1764 sl = &extra_specs[i];
1765 sl->name = extra_specs_1[i].name;
1766 sl->ptr = extra_specs_1[i].ptr;
1767 sl->next = next;
1768 sl->name_len = strlen (sl->name);
1769 sl->ptr_spec = &sl->ptr;
1770 next = sl;
1772 #endif
1774 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1776 sl = &static_specs[i];
1777 sl->next = next;
1778 next = sl;
1781 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1782 /* ??? If neither -shared-libgcc nor --static-libgcc was
1783 seen, then we should be making an educated guess. Some proposed
1784 heuristics for ELF include:
1786 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1787 program will be doing dynamic loading, which will likely
1788 need the shared libgcc.
1790 (2) If "-ldl", then it's also a fair bet that we're doing
1791 dynamic loading.
1793 (3) For each ET_DYN we're linking against (either through -lfoo
1794 or /some/path/foo.so), check to see whether it or one of
1795 its dependencies depends on a shared libgcc.
1797 (4) If "-shared"
1799 If the runtime is fixed to look for program headers instead
1800 of calling __register_frame_info at all, for each object,
1801 use the shared libgcc if any EH symbol referenced.
1803 If crtstuff is fixed to not invoke __register_frame_info
1804 automatically, for each object, use the shared libgcc if
1805 any non-empty unwind section found.
1807 Doing any of this probably requires invoking an external program to
1808 do the actual object file scanning. */
1810 const char *p = libgcc_spec;
1811 int in_sep = 1;
1813 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1814 when given the proper command line arguments. */
1815 while (*p)
1817 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1819 init_gcc_specs (&obstack,
1820 "-lgcc_s"
1821 #ifdef USE_LIBUNWIND_EXCEPTIONS
1822 " -lunwind"
1823 #endif
1825 "-lgcc",
1826 "-lgcc_eh"
1827 #ifdef USE_LIBUNWIND_EXCEPTIONS
1828 # ifdef HAVE_LD_STATIC_DYNAMIC
1829 " %{!static:-Bstatic} -lunwind %{!static:-Bdynamic}"
1830 # else
1831 " -lunwind"
1832 # endif
1833 #endif
1836 p += 5;
1837 in_sep = 0;
1839 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1841 /* Ug. We don't know shared library extensions. Hope that
1842 systems that use this form don't do shared libraries. */
1843 init_gcc_specs (&obstack,
1844 "-lgcc_s",
1845 "libgcc.a%s",
1846 "libgcc_eh.a%s"
1847 #ifdef USE_LIBUNWIND_EXCEPTIONS
1848 " -lunwind"
1849 #endif
1851 p += 10;
1852 in_sep = 0;
1854 else
1856 obstack_1grow (&obstack, *p);
1857 in_sep = (*p == ' ');
1858 p += 1;
1862 obstack_1grow (&obstack, '\0');
1863 libgcc_spec = XOBFINISH (&obstack, const char *);
1865 #endif
1866 #ifdef USE_AS_TRADITIONAL_FORMAT
1867 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1869 static const char tf[] = "--traditional-format ";
1870 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1871 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1872 asm_spec = XOBFINISH (&obstack, const char *);
1874 #endif
1876 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC
1877 # ifdef LINK_BUILDID_SPEC
1878 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1879 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
1880 # endif
1881 # ifdef LINK_EH_SPEC
1882 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1883 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1884 # endif
1885 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1886 link_spec = XOBFINISH (&obstack, const char *);
1887 #endif
1889 specs = sl;
1892 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1893 removed; If the spec starts with a + then SPEC is added to the end of the
1894 current spec. */
1896 static void
1897 set_spec (const char *name, const char *spec)
1899 struct spec_list *sl;
1900 const char *old_spec;
1901 int name_len = strlen (name);
1902 int i;
1904 /* If this is the first call, initialize the statically allocated specs. */
1905 if (!specs)
1907 struct spec_list *next = (struct spec_list *) 0;
1908 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1910 sl = &static_specs[i];
1911 sl->next = next;
1912 next = sl;
1914 specs = sl;
1917 /* See if the spec already exists. */
1918 for (sl = specs; sl; sl = sl->next)
1919 if (name_len == sl->name_len && !strcmp (sl->name, name))
1920 break;
1922 if (!sl)
1924 /* Not found - make it. */
1925 sl = XNEW (struct spec_list);
1926 sl->name = xstrdup (name);
1927 sl->name_len = name_len;
1928 sl->ptr_spec = &sl->ptr;
1929 sl->alloc_p = 0;
1930 *(sl->ptr_spec) = "";
1931 sl->next = specs;
1932 specs = sl;
1935 old_spec = *(sl->ptr_spec);
1936 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1937 ? concat (old_spec, spec + 1, NULL)
1938 : xstrdup (spec));
1940 #ifdef DEBUG_SPECS
1941 if (verbose_flag)
1942 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1943 #endif
1945 /* Free the old spec. */
1946 if (old_spec && sl->alloc_p)
1947 free (CONST_CAST(char *, old_spec));
1949 sl->alloc_p = 1;
1952 /* Accumulate a command (program name and args), and run it. */
1954 /* Vector of pointers to arguments in the current line of specifications. */
1956 static const char **argbuf;
1958 /* Number of elements allocated in argbuf. */
1960 static int argbuf_length;
1962 /* Number of elements in argbuf currently in use (containing args). */
1964 static int argbuf_index;
1966 /* Position in the argbuf array containing the name of the output file
1967 (the value associated with the "-o" flag). */
1969 static int have_o_argbuf_index = 0;
1971 /* Were the options -c, -S or -E passed. */
1972 static int have_c = 0;
1974 /* Was the option -o passed. */
1975 static int have_o = 0;
1977 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1978 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1979 it here. */
1981 static struct temp_name {
1982 const char *suffix; /* suffix associated with the code. */
1983 int length; /* strlen (suffix). */
1984 int unique; /* Indicates whether %g or %u/%U was used. */
1985 const char *filename; /* associated filename. */
1986 int filename_length; /* strlen (filename). */
1987 struct temp_name *next;
1988 } *temp_names;
1990 /* Number of commands executed so far. */
1992 static int execution_count;
1994 /* Number of commands that exited with a signal. */
1996 static int signal_count;
1998 /* Allocate the argument vector. */
2000 static void
2001 alloc_args (void)
2003 argbuf_length = 10;
2004 argbuf = XNEWVEC (const char *, argbuf_length);
2007 /* Clear out the vector of arguments (after a command is executed). */
2009 static void
2010 clear_args (void)
2012 argbuf_index = 0;
2015 /* Add one argument to the vector at the end.
2016 This is done when a space is seen or at the end of the line.
2017 If DELETE_ALWAYS is nonzero, the arg is a filename
2018 and the file should be deleted eventually.
2019 If DELETE_FAILURE is nonzero, the arg is a filename
2020 and the file should be deleted if this compilation fails. */
2022 static void
2023 store_arg (const char *arg, int delete_always, int delete_failure)
2025 if (argbuf_index + 1 == argbuf_length)
2026 argbuf = XRESIZEVEC (const char *, argbuf, (argbuf_length *= 2));
2028 argbuf[argbuf_index++] = arg;
2029 argbuf[argbuf_index] = 0;
2031 if (strcmp (arg, "-o") == 0)
2032 have_o_argbuf_index = argbuf_index;
2033 if (delete_always || delete_failure)
2035 const char *p;
2036 /* If the temporary file we should delete is specified as
2037 part of a joined argument extract the filename. */
2038 if (arg[0] == '-'
2039 && (p = strrchr (arg, '=')))
2040 arg = p + 1;
2041 record_temp_file (arg, delete_always, delete_failure);
2045 /* Load specs from a file name named FILENAME, replacing occurrences of
2046 various different types of line-endings, \r\n, \n\r and just \r, with
2047 a single \n. */
2049 static char *
2050 load_specs (const char *filename)
2052 int desc;
2053 int readlen;
2054 struct stat statbuf;
2055 char *buffer;
2056 char *buffer_p;
2057 char *specs;
2058 char *specs_p;
2060 if (verbose_flag)
2061 fnotice (stderr, "Reading specs from %s\n", filename);
2063 /* Open and stat the file. */
2064 desc = open (filename, O_RDONLY, 0);
2065 if (desc < 0)
2066 pfatal_with_name (filename);
2067 if (stat (filename, &statbuf) < 0)
2068 pfatal_with_name (filename);
2070 /* Read contents of file into BUFFER. */
2071 buffer = XNEWVEC (char, statbuf.st_size + 1);
2072 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2073 if (readlen < 0)
2074 pfatal_with_name (filename);
2075 buffer[readlen] = 0;
2076 close (desc);
2078 specs = XNEWVEC (char, readlen + 1);
2079 specs_p = specs;
2080 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2082 int skip = 0;
2083 char c = *buffer_p;
2084 if (c == '\r')
2086 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2087 skip = 1;
2088 else if (*(buffer_p + 1) == '\n') /* \r\n */
2089 skip = 1;
2090 else /* \r */
2091 c = '\n';
2093 if (! skip)
2094 *specs_p++ = c;
2096 *specs_p = '\0';
2098 free (buffer);
2099 return (specs);
2102 /* Read compilation specs from a file named FILENAME,
2103 replacing the default ones.
2105 A suffix which starts with `*' is a definition for
2106 one of the machine-specific sub-specs. The "suffix" should be
2107 *asm, *cc1, *cpp, *link, *startfile, etc.
2108 The corresponding spec is stored in asm_spec, etc.,
2109 rather than in the `compilers' vector.
2111 Anything invalid in the file is a fatal error. */
2113 static void
2114 read_specs (const char *filename, int main_p)
2116 char *buffer;
2117 char *p;
2119 buffer = load_specs (filename);
2121 /* Scan BUFFER for specs, putting them in the vector. */
2122 p = buffer;
2123 while (1)
2125 char *suffix;
2126 char *spec;
2127 char *in, *out, *p1, *p2, *p3;
2129 /* Advance P in BUFFER to the next nonblank nocomment line. */
2130 p = skip_whitespace (p);
2131 if (*p == 0)
2132 break;
2134 /* Is this a special command that starts with '%'? */
2135 /* Don't allow this for the main specs file, since it would
2136 encourage people to overwrite it. */
2137 if (*p == '%' && !main_p)
2139 p1 = p;
2140 while (*p && *p != '\n')
2141 p++;
2143 /* Skip '\n'. */
2144 p++;
2146 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2147 && (p1[sizeof "%include" - 1] == ' '
2148 || p1[sizeof "%include" - 1] == '\t'))
2150 char *new_filename;
2152 p1 += sizeof ("%include");
2153 while (*p1 == ' ' || *p1 == '\t')
2154 p1++;
2156 if (*p1++ != '<' || p[-2] != '>')
2157 fatal_error ("specs %%include syntax malformed after "
2158 "%ld characters",
2159 (long) (p1 - buffer + 1));
2161 p[-2] = '\0';
2162 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2163 read_specs (new_filename ? new_filename : p1, FALSE);
2164 continue;
2166 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2167 && (p1[sizeof "%include_noerr" - 1] == ' '
2168 || p1[sizeof "%include_noerr" - 1] == '\t'))
2170 char *new_filename;
2172 p1 += sizeof "%include_noerr";
2173 while (*p1 == ' ' || *p1 == '\t')
2174 p1++;
2176 if (*p1++ != '<' || p[-2] != '>')
2177 fatal_error ("specs %%include syntax malformed after "
2178 "%ld characters",
2179 (long) (p1 - buffer + 1));
2181 p[-2] = '\0';
2182 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2183 if (new_filename)
2184 read_specs (new_filename, FALSE);
2185 else if (verbose_flag)
2186 fnotice (stderr, "could not find specs file %s\n", p1);
2187 continue;
2189 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2190 && (p1[sizeof "%rename" - 1] == ' '
2191 || p1[sizeof "%rename" - 1] == '\t'))
2193 int name_len;
2194 struct spec_list *sl;
2195 struct spec_list *newsl;
2197 /* Get original name. */
2198 p1 += sizeof "%rename";
2199 while (*p1 == ' ' || *p1 == '\t')
2200 p1++;
2202 if (! ISALPHA ((unsigned char) *p1))
2203 fatal_error ("specs %%rename syntax malformed after "
2204 "%ld characters",
2205 (long) (p1 - buffer));
2207 p2 = p1;
2208 while (*p2 && !ISSPACE ((unsigned char) *p2))
2209 p2++;
2211 if (*p2 != ' ' && *p2 != '\t')
2212 fatal_error ("specs %%rename syntax malformed after "
2213 "%ld characters",
2214 (long) (p2 - buffer));
2216 name_len = p2 - p1;
2217 *p2++ = '\0';
2218 while (*p2 == ' ' || *p2 == '\t')
2219 p2++;
2221 if (! ISALPHA ((unsigned char) *p2))
2222 fatal_error ("specs %%rename syntax malformed after "
2223 "%ld characters",
2224 (long) (p2 - buffer));
2226 /* Get new spec name. */
2227 p3 = p2;
2228 while (*p3 && !ISSPACE ((unsigned char) *p3))
2229 p3++;
2231 if (p3 != p - 1)
2232 fatal_error ("specs %%rename syntax malformed after "
2233 "%ld characters",
2234 (long) (p3 - buffer));
2235 *p3 = '\0';
2237 for (sl = specs; sl; sl = sl->next)
2238 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2239 break;
2241 if (!sl)
2242 fatal_error ("specs %s spec was not found to be renamed", p1);
2244 if (strcmp (p1, p2) == 0)
2245 continue;
2247 for (newsl = specs; newsl; newsl = newsl->next)
2248 if (strcmp (newsl->name, p2) == 0)
2249 fatal_error ("%s: attempt to rename spec %qs to "
2250 "already defined spec %qs",
2251 filename, p1, p2);
2253 if (verbose_flag)
2255 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
2256 #ifdef DEBUG_SPECS
2257 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2258 #endif
2261 set_spec (p2, *(sl->ptr_spec));
2262 if (sl->alloc_p)
2263 free (CONST_CAST (char *, *(sl->ptr_spec)));
2265 *(sl->ptr_spec) = "";
2266 sl->alloc_p = 0;
2267 continue;
2269 else
2270 fatal_error ("specs unknown %% command after %ld characters",
2271 (long) (p1 - buffer));
2274 /* Find the colon that should end the suffix. */
2275 p1 = p;
2276 while (*p1 && *p1 != ':' && *p1 != '\n')
2277 p1++;
2279 /* The colon shouldn't be missing. */
2280 if (*p1 != ':')
2281 fatal_error ("specs file malformed after %ld characters",
2282 (long) (p1 - buffer));
2284 /* Skip back over trailing whitespace. */
2285 p2 = p1;
2286 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2287 p2--;
2289 /* Copy the suffix to a string. */
2290 suffix = save_string (p, p2 - p);
2291 /* Find the next line. */
2292 p = skip_whitespace (p1 + 1);
2293 if (p[1] == 0)
2294 fatal_error ("specs file malformed after %ld characters",
2295 (long) (p - buffer));
2297 p1 = p;
2298 /* Find next blank line or end of string. */
2299 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2300 p1++;
2302 /* Specs end at the blank line and do not include the newline. */
2303 spec = save_string (p, p1 - p);
2304 p = p1;
2306 /* Delete backslash-newline sequences from the spec. */
2307 in = spec;
2308 out = spec;
2309 while (*in != 0)
2311 if (in[0] == '\\' && in[1] == '\n')
2312 in += 2;
2313 else if (in[0] == '#')
2314 while (*in && *in != '\n')
2315 in++;
2317 else
2318 *out++ = *in++;
2320 *out = 0;
2322 if (suffix[0] == '*')
2324 if (! strcmp (suffix, "*link_command"))
2325 link_command_spec = spec;
2326 else
2327 set_spec (suffix + 1, spec);
2329 else
2331 /* Add this pair to the vector. */
2332 compilers
2333 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2335 compilers[n_compilers].suffix = suffix;
2336 compilers[n_compilers].spec = spec;
2337 n_compilers++;
2338 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2341 if (*suffix == 0)
2342 link_command_spec = spec;
2345 if (link_command_spec == 0)
2346 fatal_error ("spec file has no spec for linking");
2349 /* Record the names of temporary files we tell compilers to write,
2350 and delete them at the end of the run. */
2352 /* This is the common prefix we use to make temp file names.
2353 It is chosen once for each run of this program.
2354 It is substituted into a spec by %g or %j.
2355 Thus, all temp file names contain this prefix.
2356 In practice, all temp file names start with this prefix.
2358 This prefix comes from the envvar TMPDIR if it is defined;
2359 otherwise, from the P_tmpdir macro if that is defined;
2360 otherwise, in /usr/tmp or /tmp;
2361 or finally the current directory if all else fails. */
2363 static const char *temp_filename;
2365 /* Length of the prefix. */
2367 static int temp_filename_length;
2369 /* Define the list of temporary files to delete. */
2371 struct temp_file
2373 const char *name;
2374 struct temp_file *next;
2377 /* Queue of files to delete on success or failure of compilation. */
2378 static struct temp_file *always_delete_queue;
2379 /* Queue of files to delete on failure of compilation. */
2380 static struct temp_file *failure_delete_queue;
2382 /* Record FILENAME as a file to be deleted automatically.
2383 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2384 otherwise delete it in any case.
2385 FAIL_DELETE nonzero means delete it if a compilation step fails;
2386 otherwise delete it in any case. */
2388 void
2389 record_temp_file (const char *filename, int always_delete, int fail_delete)
2391 char *const name = xstrdup (filename);
2393 if (always_delete)
2395 struct temp_file *temp;
2396 for (temp = always_delete_queue; temp; temp = temp->next)
2397 if (! strcmp (name, temp->name))
2398 goto already1;
2400 temp = XNEW (struct temp_file);
2401 temp->next = always_delete_queue;
2402 temp->name = name;
2403 always_delete_queue = temp;
2405 already1:;
2408 if (fail_delete)
2410 struct temp_file *temp;
2411 for (temp = failure_delete_queue; temp; temp = temp->next)
2412 if (! strcmp (name, temp->name))
2413 goto already2;
2415 temp = XNEW (struct temp_file);
2416 temp->next = failure_delete_queue;
2417 temp->name = name;
2418 failure_delete_queue = temp;
2420 already2:;
2424 /* Delete all the temporary files whose names we previously recorded. */
2426 #ifndef DELETE_IF_ORDINARY
2427 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2428 do \
2430 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2431 if (unlink (NAME) < 0) \
2432 if (VERBOSE_FLAG) \
2433 perror_with_name (NAME); \
2434 } while (0)
2435 #endif
2437 static void
2438 delete_if_ordinary (const char *name)
2440 struct stat st;
2441 #ifdef DEBUG
2442 int i, c;
2444 printf ("Delete %s? (y or n) ", name);
2445 fflush (stdout);
2446 i = getchar ();
2447 if (i != '\n')
2448 while ((c = getchar ()) != '\n' && c != EOF)
2451 if (i == 'y' || i == 'Y')
2452 #endif /* DEBUG */
2453 DELETE_IF_ORDINARY (name, st, verbose_flag);
2456 static void
2457 delete_temp_files (void)
2459 struct temp_file *temp;
2461 for (temp = always_delete_queue; temp; temp = temp->next)
2462 delete_if_ordinary (temp->name);
2463 always_delete_queue = 0;
2466 /* Delete all the files to be deleted on error. */
2468 static void
2469 delete_failure_queue (void)
2471 struct temp_file *temp;
2473 for (temp = failure_delete_queue; temp; temp = temp->next)
2474 delete_if_ordinary (temp->name);
2477 static void
2478 clear_failure_queue (void)
2480 failure_delete_queue = 0;
2483 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2484 returns non-NULL.
2485 If DO_MULTI is true iterate over the paths twice, first with multilib
2486 suffix then without, otherwise iterate over the paths once without
2487 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2488 to avoid visiting the same path twice, but we could do better. For
2489 instance, /usr/lib/../lib is considered different from /usr/lib.
2490 At least EXTRA_SPACE chars past the end of the path passed to
2491 CALLBACK are available for use by the callback.
2492 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2494 Returns the value returned by CALLBACK. */
2496 static void *
2497 for_each_path (const struct path_prefix *paths,
2498 bool do_multi,
2499 size_t extra_space,
2500 void *(*callback) (char *, void *),
2501 void *callback_info)
2503 struct prefix_list *pl;
2504 const char *multi_dir = NULL;
2505 const char *multi_os_dir = NULL;
2506 const char *multi_suffix;
2507 const char *just_multi_suffix;
2508 char *path = NULL;
2509 void *ret = NULL;
2510 bool skip_multi_dir = false;
2511 bool skip_multi_os_dir = false;
2513 multi_suffix = machine_suffix;
2514 just_multi_suffix = just_machine_suffix;
2515 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2517 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2518 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2519 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2521 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2522 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2524 while (1)
2526 size_t multi_dir_len = 0;
2527 size_t multi_os_dir_len = 0;
2528 size_t suffix_len;
2529 size_t just_suffix_len;
2530 size_t len;
2532 if (multi_dir)
2533 multi_dir_len = strlen (multi_dir);
2534 if (multi_os_dir)
2535 multi_os_dir_len = strlen (multi_os_dir);
2536 suffix_len = strlen (multi_suffix);
2537 just_suffix_len = strlen (just_multi_suffix);
2539 if (path == NULL)
2541 len = paths->max_len + extra_space + 1;
2542 if (suffix_len > multi_os_dir_len)
2543 len += suffix_len;
2544 else
2545 len += multi_os_dir_len;
2546 path = XNEWVEC (char, len);
2549 for (pl = paths->plist; pl != 0; pl = pl->next)
2551 len = strlen (pl->prefix);
2552 memcpy (path, pl->prefix, len);
2554 /* Look first in MACHINE/VERSION subdirectory. */
2555 if (!skip_multi_dir)
2557 memcpy (path + len, multi_suffix, suffix_len + 1);
2558 ret = callback (path, callback_info);
2559 if (ret)
2560 break;
2563 /* Some paths are tried with just the machine (ie. target)
2564 subdir. This is used for finding as, ld, etc. */
2565 if (!skip_multi_dir
2566 && pl->require_machine_suffix == 2)
2568 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2569 ret = callback (path, callback_info);
2570 if (ret)
2571 break;
2574 /* Now try the base path. */
2575 if (!pl->require_machine_suffix
2576 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2578 const char *this_multi;
2579 size_t this_multi_len;
2581 if (pl->os_multilib)
2583 this_multi = multi_os_dir;
2584 this_multi_len = multi_os_dir_len;
2586 else
2588 this_multi = multi_dir;
2589 this_multi_len = multi_dir_len;
2592 if (this_multi_len)
2593 memcpy (path + len, this_multi, this_multi_len + 1);
2594 else
2595 path[len] = '\0';
2597 ret = callback (path, callback_info);
2598 if (ret)
2599 break;
2602 if (pl)
2603 break;
2605 if (multi_dir == NULL && multi_os_dir == NULL)
2606 break;
2608 /* Run through the paths again, this time without multilibs.
2609 Don't repeat any we have already seen. */
2610 if (multi_dir)
2612 free (CONST_CAST (char *, multi_dir));
2613 multi_dir = NULL;
2614 free (CONST_CAST (char *, multi_suffix));
2615 multi_suffix = machine_suffix;
2616 free (CONST_CAST (char *, just_multi_suffix));
2617 just_multi_suffix = just_machine_suffix;
2619 else
2620 skip_multi_dir = true;
2621 if (multi_os_dir)
2623 free (CONST_CAST (char *, multi_os_dir));
2624 multi_os_dir = NULL;
2626 else
2627 skip_multi_os_dir = true;
2630 if (multi_dir)
2632 free (CONST_CAST (char *, multi_dir));
2633 free (CONST_CAST (char *, multi_suffix));
2634 free (CONST_CAST (char *, just_multi_suffix));
2636 if (multi_os_dir)
2637 free (CONST_CAST (char *, multi_os_dir));
2638 if (ret != path)
2639 free (path);
2640 return ret;
2643 /* Callback for build_search_list. Adds path to obstack being built. */
2645 struct add_to_obstack_info {
2646 struct obstack *ob;
2647 bool check_dir;
2648 bool first_time;
2651 static void *
2652 add_to_obstack (char *path, void *data)
2654 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2656 if (info->check_dir && !is_directory (path, false))
2657 return NULL;
2659 if (!info->first_time)
2660 obstack_1grow (info->ob, PATH_SEPARATOR);
2662 obstack_grow (info->ob, path, strlen (path));
2664 info->first_time = false;
2665 return NULL;
2668 /* Add or change the value of an environment variable, outputting the
2669 change to standard error if in verbose mode. */
2670 static void
2671 xputenv (const char *string)
2673 if (verbose_flag)
2674 fnotice (stderr, "%s\n", string);
2675 putenv (CONST_CAST (char *, string));
2678 /* Build a list of search directories from PATHS.
2679 PREFIX is a string to prepend to the list.
2680 If CHECK_DIR_P is true we ensure the directory exists.
2681 If DO_MULTI is true, multilib paths are output first, then
2682 non-multilib paths.
2683 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2684 It is also used by the --print-search-dirs flag. */
2686 static char *
2687 build_search_list (const struct path_prefix *paths, const char *prefix,
2688 bool check_dir, bool do_multi)
2690 struct add_to_obstack_info info;
2692 info.ob = &collect_obstack;
2693 info.check_dir = check_dir;
2694 info.first_time = true;
2696 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2697 obstack_1grow (&collect_obstack, '=');
2699 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2701 obstack_1grow (&collect_obstack, '\0');
2702 return XOBFINISH (&collect_obstack, char *);
2705 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2706 for collect. */
2708 static void
2709 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2710 bool do_multi)
2712 xputenv (build_search_list (paths, env_var, true, do_multi));
2715 /* Check whether NAME can be accessed in MODE. This is like access,
2716 except that it never considers directories to be executable. */
2718 static int
2719 access_check (const char *name, int mode)
2721 if (mode == X_OK)
2723 struct stat st;
2725 if (stat (name, &st) < 0
2726 || S_ISDIR (st.st_mode))
2727 return -1;
2730 return access (name, mode);
2733 /* Callback for find_a_file. Appends the file name to the directory
2734 path. If the resulting file exists in the right mode, return the
2735 full pathname to the file. */
2737 struct file_at_path_info {
2738 const char *name;
2739 const char *suffix;
2740 int name_len;
2741 int suffix_len;
2742 int mode;
2745 static void *
2746 file_at_path (char *path, void *data)
2748 struct file_at_path_info *info = (struct file_at_path_info *) data;
2749 size_t len = strlen (path);
2751 memcpy (path + len, info->name, info->name_len);
2752 len += info->name_len;
2754 /* Some systems have a suffix for executable files.
2755 So try appending that first. */
2756 if (info->suffix_len)
2758 memcpy (path + len, info->suffix, info->suffix_len + 1);
2759 if (access_check (path, info->mode) == 0)
2760 return path;
2763 path[len] = '\0';
2764 if (access_check (path, info->mode) == 0)
2765 return path;
2767 return NULL;
2770 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2771 access to check permissions. If DO_MULTI is true, search multilib
2772 paths then non-multilib paths, otherwise do not search multilib paths.
2773 Return 0 if not found, otherwise return its name, allocated with malloc. */
2775 static char *
2776 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2777 bool do_multi)
2779 struct file_at_path_info info;
2781 #ifdef DEFAULT_ASSEMBLER
2782 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2783 return xstrdup (DEFAULT_ASSEMBLER);
2784 #endif
2786 #ifdef DEFAULT_LINKER
2787 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2788 return xstrdup (DEFAULT_LINKER);
2789 #endif
2791 /* Determine the filename to execute (special case for absolute paths). */
2793 if (IS_ABSOLUTE_PATH (name))
2795 if (access (name, mode) == 0)
2796 return xstrdup (name);
2798 return NULL;
2801 info.name = name;
2802 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2803 info.name_len = strlen (info.name);
2804 info.suffix_len = strlen (info.suffix);
2805 info.mode = mode;
2807 return (char*) for_each_path (pprefix, do_multi,
2808 info.name_len + info.suffix_len,
2809 file_at_path, &info);
2812 /* Ranking of prefixes in the sort list. -B prefixes are put before
2813 all others. */
2815 enum path_prefix_priority
2817 PREFIX_PRIORITY_B_OPT,
2818 PREFIX_PRIORITY_LAST
2821 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2822 order according to PRIORITY. Within each PRIORITY, new entries are
2823 appended.
2825 If WARN is nonzero, we will warn if no file is found
2826 through this prefix. WARN should point to an int
2827 which will be set to 1 if this entry is used.
2829 COMPONENT is the value to be passed to update_path.
2831 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2832 the complete value of machine_suffix.
2833 2 means try both machine_suffix and just_machine_suffix. */
2835 static void
2836 add_prefix (struct path_prefix *pprefix, const char *prefix,
2837 const char *component, /* enum prefix_priority */ int priority,
2838 int require_machine_suffix, int os_multilib)
2840 struct prefix_list *pl, **prev;
2841 int len;
2843 for (prev = &pprefix->plist;
2844 (*prev) != NULL && (*prev)->priority <= priority;
2845 prev = &(*prev)->next)
2848 /* Keep track of the longest prefix. */
2850 prefix = update_path (prefix, component);
2851 len = strlen (prefix);
2852 if (len > pprefix->max_len)
2853 pprefix->max_len = len;
2855 pl = XNEW (struct prefix_list);
2856 pl->prefix = prefix;
2857 pl->require_machine_suffix = require_machine_suffix;
2858 pl->priority = priority;
2859 pl->os_multilib = os_multilib;
2861 /* Insert after PREV. */
2862 pl->next = (*prev);
2863 (*prev) = pl;
2866 /* Same as add_prefix, but prepending target_system_root to prefix. */
2867 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2868 static void
2869 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2870 const char *component,
2871 /* enum prefix_priority */ int priority,
2872 int require_machine_suffix, int os_multilib)
2874 if (!IS_ABSOLUTE_PATH (prefix))
2875 fatal_error ("system path %qs is not absolute", prefix);
2877 if (target_system_root)
2879 if (target_sysroot_suffix)
2880 prefix = concat (target_sysroot_suffix, prefix, NULL);
2881 prefix = concat (target_system_root, prefix, NULL);
2883 /* We have to override this because GCC's notion of sysroot
2884 moves along with GCC. */
2885 component = "GCC";
2888 add_prefix (pprefix, prefix, component, priority,
2889 require_machine_suffix, os_multilib);
2892 /* Execute the command specified by the arguments on the current line of spec.
2893 When using pipes, this includes several piped-together commands
2894 with `|' between them.
2896 Return 0 if successful, -1 if failed. */
2898 static int
2899 execute (void)
2901 int i;
2902 int n_commands; /* # of command. */
2903 char *string;
2904 struct pex_obj *pex;
2905 struct command
2907 const char *prog; /* program name. */
2908 const char **argv; /* vector of args. */
2911 struct command *commands; /* each command buffer with above info. */
2913 gcc_assert (!processing_spec_function);
2915 if (wrapper_string)
2917 string = find_a_file (&exec_prefixes, argbuf[0], X_OK, false);
2918 argbuf[0] = (string) ? string : argbuf[0];
2919 insert_wrapper (wrapper_string);
2922 /* Count # of piped commands. */
2923 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2924 if (strcmp (argbuf[i], "|") == 0)
2925 n_commands++;
2927 /* Get storage for each command. */
2928 commands = (struct command *) alloca (n_commands * sizeof (struct command));
2930 /* Split argbuf into its separate piped processes,
2931 and record info about each one.
2932 Also search for the programs that are to be run. */
2934 commands[0].prog = argbuf[0]; /* first command. */
2935 commands[0].argv = &argbuf[0];
2937 if (!wrapper_string)
2939 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2940 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2943 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2944 if (strcmp (argbuf[i], "|") == 0)
2945 { /* each command. */
2946 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2947 fatal_error ("-pipe not supported");
2948 #endif
2949 argbuf[i] = 0; /* termination of command args. */
2950 commands[n_commands].prog = argbuf[i + 1];
2951 commands[n_commands].argv = &argbuf[i + 1];
2952 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2953 X_OK, false);
2954 if (string)
2955 commands[n_commands].argv[0] = string;
2956 n_commands++;
2959 argbuf[argbuf_index] = 0;
2961 /* If -v, print what we are about to do, and maybe query. */
2963 if (verbose_flag)
2965 /* For help listings, put a blank line between sub-processes. */
2966 if (print_help_list)
2967 fputc ('\n', stderr);
2969 /* Print each piped command as a separate line. */
2970 for (i = 0; i < n_commands; i++)
2972 const char *const *j;
2974 if (verbose_only_flag)
2976 for (j = commands[i].argv; *j; j++)
2978 const char *p;
2979 for (p = *j; *p; ++p)
2980 if (!ISALNUM ((unsigned char) *p)
2981 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
2982 break;
2983 if (*p || !*j)
2985 fprintf (stderr, " \"");
2986 for (p = *j; *p; ++p)
2988 if (*p == '"' || *p == '\\' || *p == '$')
2989 fputc ('\\', stderr);
2990 fputc (*p, stderr);
2992 fputc ('"', stderr);
2994 else
2995 fprintf (stderr, " %s", *j);
2998 else
2999 for (j = commands[i].argv; *j; j++)
3000 fprintf (stderr, " %s", *j);
3002 /* Print a pipe symbol after all but the last command. */
3003 if (i + 1 != n_commands)
3004 fprintf (stderr, " |");
3005 fprintf (stderr, "\n");
3007 fflush (stderr);
3008 if (verbose_only_flag != 0)
3010 /* verbose_only_flag should act as if the spec was
3011 executed, so increment execution_count before
3012 returning. This prevents spurious warnings about
3013 unused linker input files, etc. */
3014 execution_count++;
3015 return 0;
3017 #ifdef DEBUG
3018 fnotice (stderr, "\nGo ahead? (y or n) ");
3019 fflush (stderr);
3020 i = getchar ();
3021 if (i != '\n')
3022 while (getchar () != '\n')
3025 if (i != 'y' && i != 'Y')
3026 return 0;
3027 #endif /* DEBUG */
3030 #ifdef ENABLE_VALGRIND_CHECKING
3031 /* Run the each command through valgrind. To simplify prepending the
3032 path to valgrind and the option "-q" (for quiet operation unless
3033 something triggers), we allocate a separate argv array. */
3035 for (i = 0; i < n_commands; i++)
3037 const char **argv;
3038 int argc;
3039 int j;
3041 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3044 argv = XALLOCAVEC (const char *, argc + 3);
3046 argv[0] = VALGRIND_PATH;
3047 argv[1] = "-q";
3048 for (j = 2; j < argc + 2; j++)
3049 argv[j] = commands[i].argv[j - 2];
3050 argv[j] = NULL;
3052 commands[i].argv = argv;
3053 commands[i].prog = argv[0];
3055 #endif
3057 /* Run each piped subprocess. */
3059 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3060 ? PEX_RECORD_TIMES : 0),
3061 progname, temp_filename);
3062 if (pex == NULL)
3063 fatal_error ("pex_init failed: %m");
3065 for (i = 0; i < n_commands; i++)
3067 const char *errmsg;
3068 int err;
3069 const char *string = commands[i].argv[0];
3071 errmsg = pex_run (pex,
3072 ((i + 1 == n_commands ? PEX_LAST : 0)
3073 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3074 string, CONST_CAST (char **, commands[i].argv),
3075 NULL, NULL, &err);
3076 if (errmsg != NULL)
3078 if (err == 0)
3079 fatal_error (errmsg);
3080 else
3082 errno = err;
3083 pfatal_with_name (errmsg);
3087 if (string != commands[i].prog)
3088 free (CONST_CAST (char *, string));
3091 execution_count++;
3093 /* Wait for all the subprocesses to finish. */
3096 int *statuses;
3097 struct pex_time *times = NULL;
3098 int ret_code = 0;
3100 statuses = (int *) alloca (n_commands * sizeof (int));
3101 if (!pex_get_status (pex, n_commands, statuses))
3102 fatal_error ("failed to get exit status: %m");
3104 if (report_times || report_times_to_file)
3106 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
3107 if (!pex_get_times (pex, n_commands, times))
3108 fatal_error ("failed to get process times: %m");
3111 pex_free (pex);
3113 for (i = 0; i < n_commands; ++i)
3115 int status = statuses[i];
3117 if (WIFSIGNALED (status))
3119 #ifdef SIGPIPE
3120 /* SIGPIPE is a special case. It happens in -pipe mode
3121 when the compiler dies before the preprocessor is done,
3122 or the assembler dies before the compiler is done.
3123 There's generally been an error already, and this is
3124 just fallout. So don't generate another error unless
3125 we would otherwise have succeeded. */
3126 if (WTERMSIG (status) == SIGPIPE
3127 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
3129 signal_count++;
3130 ret_code = -1;
3132 else
3133 #endif
3134 internal_error ("%s (program %s)",
3135 strsignal (WTERMSIG (status)), commands[i].prog);
3137 else if (WIFEXITED (status)
3138 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3140 if (WEXITSTATUS (status) > greatest_status)
3141 greatest_status = WEXITSTATUS (status);
3142 ret_code = -1;
3145 if (report_times || report_times_to_file)
3147 struct pex_time *pt = &times[i];
3148 double ut, st;
3150 ut = ((double) pt->user_seconds
3151 + (double) pt->user_microseconds / 1.0e6);
3152 st = ((double) pt->system_seconds
3153 + (double) pt->system_microseconds / 1.0e6);
3155 if (ut + st != 0)
3157 if (report_times)
3158 fnotice (stderr, "# %s %.2f %.2f\n",
3159 commands[i].prog, ut, st);
3161 if (report_times_to_file)
3163 int c = 0;
3164 const char *const *j;
3166 fprintf (report_times_to_file, "%g %g", ut, st);
3168 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3170 const char *p;
3171 for (p = *j; *p; ++p)
3172 if (*p == '"' || *p == '\\' || *p == '$'
3173 || ISSPACE (*p))
3174 break;
3176 if (*p)
3178 fprintf (report_times_to_file, " \"");
3179 for (p = *j; *p; ++p)
3181 if (*p == '"' || *p == '\\' || *p == '$')
3182 fputc ('\\', report_times_to_file);
3183 fputc (*p, report_times_to_file);
3185 fputc ('"', report_times_to_file);
3187 else
3188 fprintf (report_times_to_file, " %s", *j);
3191 fputc ('\n', report_times_to_file);
3197 return ret_code;
3201 /* Find all the switches given to us
3202 and make a vector describing them.
3203 The elements of the vector are strings, one per switch given.
3204 If a switch uses following arguments, then the `part1' field
3205 is the switch itself and the `args' field
3206 is a null-terminated vector containing the following arguments.
3207 Bits in the `live_cond' field are:
3208 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3209 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3210 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3211 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
3212 in all do_spec calls afterwards. Used for %<S from self specs.
3213 The `validated' field is nonzero if any spec has looked at this switch;
3214 if it remains zero at the end of the run, it must be meaningless. */
3216 #define SWITCH_LIVE 0x1
3217 #define SWITCH_FALSE 0x2
3218 #define SWITCH_IGNORE 0x4
3219 #define SWITCH_IGNORE_PERMANENTLY 0x8
3221 struct switchstr
3223 const char *part1;
3224 const char **args;
3225 unsigned int live_cond;
3226 unsigned char validated;
3227 unsigned char ordering;
3230 static struct switchstr *switches;
3232 static int n_switches;
3234 static int n_switches_alloc;
3236 /* Set to zero if -fcompare-debug is disabled, positive if it's
3237 enabled and we're running the first compilation, negative if it's
3238 enabled and we're running the second compilation. For most of the
3239 time, it's in the range -1..1, but it can be temporarily set to 2
3240 or 3 to indicate that the -fcompare-debug flags didn't come from
3241 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3242 variable, until a synthesized -fcompare-debug flag is added to the
3243 command line. */
3244 int compare_debug;
3246 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3247 int compare_debug_second;
3249 /* Set to the flags that should be passed to the second compilation in
3250 a -fcompare-debug compilation. */
3251 const char *compare_debug_opt;
3253 static struct switchstr *switches_debug_check[2];
3255 static int n_switches_debug_check[2];
3257 static char *debug_check_temp_file[2];
3259 /* Language is one of three things:
3261 1) The name of a real programming language.
3262 2) NULL, indicating that no one has figured out
3263 what it is yet.
3264 3) '*', indicating that the file should be passed
3265 to the linker. */
3266 struct infile
3268 const char *name;
3269 const char *language;
3270 struct compiler *incompiler;
3271 bool compiled;
3272 bool preprocessed;
3275 /* Also a vector of input files specified. */
3277 static struct infile *infiles;
3279 int n_infiles;
3281 static int n_infiles_alloc;
3283 /* True if multiple input files are being compiled to a single
3284 assembly file. */
3286 static bool combine_inputs;
3288 /* This counts the number of libraries added by lang_specific_driver, so that
3289 we can tell if there were any user supplied any files or libraries. */
3291 static int added_libraries;
3293 /* And a vector of corresponding output files is made up later. */
3295 const char **outfiles;
3297 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3299 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3300 is true if we should look for an executable suffix. DO_OBJ
3301 is true if we should look for an object suffix. */
3303 static const char *
3304 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3305 int do_obj ATTRIBUTE_UNUSED)
3307 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3308 int i;
3309 #endif
3310 int len;
3312 if (name == NULL)
3313 return NULL;
3315 len = strlen (name);
3317 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3318 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3319 if (do_obj && len > 2
3320 && name[len - 2] == '.'
3321 && name[len - 1] == 'o')
3323 obstack_grow (&obstack, name, len - 2);
3324 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3325 name = XOBFINISH (&obstack, const char *);
3327 #endif
3329 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3330 /* If there is no filetype, make it the executable suffix (which includes
3331 the "."). But don't get confused if we have just "-o". */
3332 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3333 return name;
3335 for (i = len - 1; i >= 0; i--)
3336 if (IS_DIR_SEPARATOR (name[i]))
3337 break;
3339 for (i++; i < len; i++)
3340 if (name[i] == '.')
3341 return name;
3343 obstack_grow (&obstack, name, len);
3344 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3345 strlen (TARGET_EXECUTABLE_SUFFIX));
3346 name = XOBFINISH (&obstack, const char *);
3347 #endif
3349 return name;
3351 #endif
3353 /* Display the command line switches accepted by gcc. */
3354 static void
3355 display_help (void)
3357 printf (_("Usage: %s [options] file...\n"), progname);
3358 fputs (_("Options:\n"), stdout);
3360 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3361 fputs (_(" --help Display this information\n"), stdout);
3362 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3363 fputs (_(" --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3364 fputs (_(" Display specific types of command line options\n"), stdout);
3365 if (! verbose_flag)
3366 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3367 fputs (_(" --version Display compiler version information\n"), stdout);
3368 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3369 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3370 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3371 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3372 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3373 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3374 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3375 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3376 fputs (_("\
3377 -print-multi-lib Display the mapping between command line options and\n\
3378 multiple library search directories\n"), stdout);
3379 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3380 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
3381 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3382 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3383 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3384 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3385 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3386 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3387 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3388 fputs (_(" -combine Pass multiple source files to compiler at once\n"), stdout);
3389 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3390 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
3391 fputs (_("\
3392 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3393 prefixes to other gcc components\n"), stdout);
3394 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3395 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3396 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3397 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3398 fputs (_("\
3399 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3400 and libraries\n"), stdout);
3401 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3402 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3403 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3404 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3405 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3406 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3407 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3408 fputs (_("\
3409 -x <language> Specify the language of the following input files\n\
3410 Permissible languages include: c c++ assembler none\n\
3411 'none' means revert to the default behavior of\n\
3412 guessing the language based on the file's extension\n\
3413 "), stdout);
3415 printf (_("\
3416 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3417 passed on to the various sub-processes invoked by %s. In order to pass\n\
3418 other options on to these processes the -W<letter> options must be used.\n\
3419 "), progname);
3421 /* The rest of the options are displayed by invocations of the various
3422 sub-processes. */
3425 static void
3426 add_preprocessor_option (const char *option, int len)
3428 n_preprocessor_options++;
3430 if (! preprocessor_options)
3431 preprocessor_options = XNEWVEC (char *, n_preprocessor_options);
3432 else
3433 preprocessor_options = XRESIZEVEC (char *, preprocessor_options,
3434 n_preprocessor_options);
3436 preprocessor_options [n_preprocessor_options - 1] =
3437 save_string (option, len);
3440 static void
3441 add_assembler_option (const char *option, int len)
3443 n_assembler_options++;
3445 if (! assembler_options)
3446 assembler_options = XNEWVEC (char *, n_assembler_options);
3447 else
3448 assembler_options = XRESIZEVEC (char *, assembler_options,
3449 n_assembler_options);
3451 assembler_options [n_assembler_options - 1] = save_string (option, len);
3454 static void
3455 add_linker_option (const char *option, int len)
3457 n_linker_options++;
3459 if (! linker_options)
3460 linker_options = XNEWVEC (char *, n_linker_options);
3461 else
3462 linker_options = XRESIZEVEC (char *, linker_options, n_linker_options);
3464 linker_options [n_linker_options - 1] = save_string (option, len);
3467 /* Allocate space for an input file in infiles. */
3469 static void
3470 alloc_infile (void)
3472 if (n_infiles_alloc == 0)
3474 n_infiles_alloc = 16;
3475 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3477 else if (n_infiles_alloc == n_infiles)
3479 n_infiles_alloc *= 2;
3480 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3484 /* Store an input file with the given NAME and LANGUAGE in
3485 infiles. */
3487 static void
3488 add_infile (const char *name, const char *language)
3490 alloc_infile ();
3491 infiles[n_infiles].name = name;
3492 infiles[n_infiles++].language = language;
3495 /* Allocate space for a switch in switches. */
3497 static void
3498 alloc_switch (void)
3500 if (n_switches_alloc == 0)
3502 n_switches_alloc = 16;
3503 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3505 else if (n_switches_alloc == n_switches)
3507 n_switches_alloc *= 2;
3508 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3512 /* Create the vector `switches' and its contents.
3513 Store its length in `n_switches'. */
3515 static void
3516 process_command (int argc, const char **argv)
3518 int i;
3519 const char *temp;
3520 char *temp1;
3521 const char *spec_lang = 0;
3522 int last_language_n_infiles;
3523 const char *tooldir_prefix;
3524 char *(*get_relative_prefix) (const char *, const char *,
3525 const char *) = NULL;
3527 GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3529 n_switches = 0;
3530 n_infiles = 0;
3531 added_libraries = 0;
3533 /* Figure compiler version from version string. */
3535 compiler_version = temp1 = xstrdup (version_string);
3537 for (; *temp1; ++temp1)
3539 if (*temp1 == ' ')
3541 *temp1 = '\0';
3542 break;
3546 /* Convert new-style -- options to old-style. */
3547 translate_options (&argc,
3548 CONST_CAST2 (const char *const **, const char ***,
3549 &argv));
3551 /* Handle any -no-canonical-prefixes flag early, to assign the function
3552 that builds relative prefixes. This function creates default search
3553 paths that are needed later in normal option handling. */
3555 for (i = 1; i < argc; i++)
3557 if (! strcmp (argv[i], "-no-canonical-prefixes"))
3559 get_relative_prefix = make_relative_prefix_ignore_links;
3560 break;
3563 if (! get_relative_prefix)
3564 get_relative_prefix = make_relative_prefix;
3566 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3567 see if we can create it from the pathname specified in argv[0]. */
3569 gcc_libexec_prefix = standard_libexec_prefix;
3570 #ifndef VMS
3571 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3572 if (!gcc_exec_prefix)
3574 gcc_exec_prefix = get_relative_prefix (argv[0],
3575 standard_bindir_prefix,
3576 standard_exec_prefix);
3577 gcc_libexec_prefix = get_relative_prefix (argv[0],
3578 standard_bindir_prefix,
3579 standard_libexec_prefix);
3580 if (gcc_exec_prefix)
3581 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3583 else
3585 /* make_relative_prefix requires a program name, but
3586 GCC_EXEC_PREFIX is typically a directory name with a trailing
3587 / (which is ignored by make_relative_prefix), so append a
3588 program name. */
3589 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
3590 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3591 standard_exec_prefix,
3592 standard_libexec_prefix);
3594 /* The path is unrelocated, so fallback to the original setting. */
3595 if (!gcc_libexec_prefix)
3596 gcc_libexec_prefix = standard_libexec_prefix;
3598 free (tmp_prefix);
3600 #else
3601 #endif
3602 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3603 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
3604 or an automatically created GCC_EXEC_PREFIX from argv[0]. */
3606 /* Do language-specific adjustment/addition of flags. */
3607 lang_specific_driver (&argc,
3608 CONST_CAST2 (const char *const **, const char ***,
3609 &argv),
3610 &added_libraries);
3612 if (gcc_exec_prefix)
3614 int len = strlen (gcc_exec_prefix);
3616 if (len > (int) sizeof ("/lib/gcc/") - 1
3617 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3619 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3620 if (IS_DIR_SEPARATOR (*temp)
3621 && strncmp (temp + 1, "lib", 3) == 0
3622 && IS_DIR_SEPARATOR (temp[4])
3623 && strncmp (temp + 5, "gcc", 3) == 0)
3624 len -= sizeof ("/lib/gcc/") - 1;
3627 set_std_prefix (gcc_exec_prefix, len);
3628 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3629 PREFIX_PRIORITY_LAST, 0, 0);
3630 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3631 PREFIX_PRIORITY_LAST, 0, 0);
3634 /* COMPILER_PATH and LIBRARY_PATH have values
3635 that are lists of directory names with colons. */
3637 GET_ENVIRONMENT (temp, "COMPILER_PATH");
3638 if (temp)
3640 const char *startp, *endp;
3641 char *nstore = (char *) alloca (strlen (temp) + 3);
3643 startp = endp = temp;
3644 while (1)
3646 if (*endp == PATH_SEPARATOR || *endp == 0)
3648 strncpy (nstore, startp, endp - startp);
3649 if (endp == startp)
3650 strcpy (nstore, concat (".", dir_separator_str, NULL));
3651 else if (!IS_DIR_SEPARATOR (endp[-1]))
3653 nstore[endp - startp] = DIR_SEPARATOR;
3654 nstore[endp - startp + 1] = 0;
3656 else
3657 nstore[endp - startp] = 0;
3658 add_prefix (&exec_prefixes, nstore, 0,
3659 PREFIX_PRIORITY_LAST, 0, 0);
3660 add_prefix (&include_prefixes, nstore, 0,
3661 PREFIX_PRIORITY_LAST, 0, 0);
3662 if (*endp == 0)
3663 break;
3664 endp = startp = endp + 1;
3666 else
3667 endp++;
3671 GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
3672 if (temp && *cross_compile == '0')
3674 const char *startp, *endp;
3675 char *nstore = (char *) alloca (strlen (temp) + 3);
3677 startp = endp = temp;
3678 while (1)
3680 if (*endp == PATH_SEPARATOR || *endp == 0)
3682 strncpy (nstore, startp, endp - startp);
3683 if (endp == startp)
3684 strcpy (nstore, concat (".", dir_separator_str, NULL));
3685 else if (!IS_DIR_SEPARATOR (endp[-1]))
3687 nstore[endp - startp] = DIR_SEPARATOR;
3688 nstore[endp - startp + 1] = 0;
3690 else
3691 nstore[endp - startp] = 0;
3692 add_prefix (&startfile_prefixes, nstore, NULL,
3693 PREFIX_PRIORITY_LAST, 0, 1);
3694 if (*endp == 0)
3695 break;
3696 endp = startp = endp + 1;
3698 else
3699 endp++;
3703 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3704 GET_ENVIRONMENT (temp, "LPATH");
3705 if (temp && *cross_compile == '0')
3707 const char *startp, *endp;
3708 char *nstore = (char *) alloca (strlen (temp) + 3);
3710 startp = endp = temp;
3711 while (1)
3713 if (*endp == PATH_SEPARATOR || *endp == 0)
3715 strncpy (nstore, startp, endp - startp);
3716 if (endp == startp)
3717 strcpy (nstore, concat (".", dir_separator_str, NULL));
3718 else if (!IS_DIR_SEPARATOR (endp[-1]))
3720 nstore[endp - startp] = DIR_SEPARATOR;
3721 nstore[endp - startp + 1] = 0;
3723 else
3724 nstore[endp - startp] = 0;
3725 add_prefix (&startfile_prefixes, nstore, NULL,
3726 PREFIX_PRIORITY_LAST, 0, 1);
3727 if (*endp == 0)
3728 break;
3729 endp = startp = endp + 1;
3731 else
3732 endp++;
3736 /* Process the options and store input files and switches in their
3737 vectors. */
3739 last_language_n_infiles = -1;
3741 for (i = 1; i < argc; i++)
3743 const char *p = NULL;
3744 int c = 0;
3746 if (argv[i][0] == '-' && argv[i][1] != 0)
3748 p = &argv[i][1];
3749 c = *p;
3752 if (! strcmp (argv[i], "-dumpspecs"))
3754 struct spec_list *sl;
3755 init_spec ();
3756 for (sl = specs; sl; sl = sl->next)
3757 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3758 if (link_command_spec)
3759 printf ("*link_command:\n%s\n\n", link_command_spec);
3760 exit (0);
3762 else if (! strcmp (argv[i], "-dumpversion"))
3764 printf ("%s\n", spec_version);
3765 exit (0);
3767 else if (! strcmp (argv[i], "-dumpmachine"))
3769 printf ("%s\n", spec_machine);
3770 exit (0);
3772 else if (strcmp (argv[i], "-fversion") == 0)
3774 /* translate_options () has turned --version into -fversion. */
3775 print_version = 1;
3777 /* CPP driver cannot obtain switch from cc1_options. */
3778 if (is_cpp_driver)
3779 add_preprocessor_option ("--version", strlen ("--version"));
3780 add_assembler_option ("--version", strlen ("--version"));
3781 add_linker_option ("--version", strlen ("--version"));
3783 goto normal_switch;
3785 else if (strcmp (argv[i], "-fhelp") == 0)
3787 /* translate_options () has turned --help into -fhelp. */
3788 print_help_list = 1;
3790 /* CPP driver cannot obtain switch from cc1_options. */
3791 if (is_cpp_driver)
3792 add_preprocessor_option ("--help", 6);
3793 add_assembler_option ("--help", 6);
3794 add_linker_option ("--help", 6);
3796 goto normal_switch;
3798 else if (strncmp (argv[i], "-fhelp=", 7) == 0)
3800 /* translate_options () has turned --help into -fhelp. */
3801 print_subprocess_help = 2;
3803 goto normal_switch;
3805 else if (strcmp (argv[i], "-ftarget-help") == 0)
3807 /* translate_options() has turned --target-help into -ftarget-help. */
3808 print_subprocess_help = 1;
3810 /* CPP driver cannot obtain switch from cc1_options. */
3811 if (is_cpp_driver)
3812 add_preprocessor_option ("--target-help", 13);
3813 add_assembler_option ("--target-help", 13);
3814 add_linker_option ("--target-help", 13);
3816 goto normal_switch;
3818 else if (! strcmp (argv[i], "-pass-exit-codes"))
3820 pass_exit_codes = 1;
3822 else if (! strcmp (argv[i], "-print-search-dirs"))
3823 print_search_dirs = 1;
3824 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3825 print_file_name = "libgcc.a";
3826 else if (! strncmp (argv[i], "-print-file-name=", 17))
3827 print_file_name = argv[i] + 17;
3828 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3829 print_prog_name = argv[i] + 17;
3830 else if (! strcmp (argv[i], "-print-multi-lib"))
3831 print_multi_lib = 1;
3832 else if (! strcmp (argv[i], "-print-multi-directory"))
3833 print_multi_directory = 1;
3834 else if (! strcmp (argv[i], "-print-sysroot"))
3835 print_sysroot = 1;
3836 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3837 print_multi_os_directory = 1;
3838 else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
3839 print_sysroot_headers_suffix = 1;
3840 else if (! strcmp (argv[i], "-fcompare-debug-second"))
3842 compare_debug_second = 1;
3843 goto normal_switch;
3845 else if (! strcmp (argv[i], "-fno-compare-debug"))
3847 argv[i] = "-fcompare-debug=";
3848 p = &argv[i][1];
3849 goto compare_debug_with_arg;
3851 else if (! strcmp (argv[i], "-fcompare-debug"))
3853 argv[i] = "-fcompare-debug=-gtoggle";
3854 p = &argv[i][1];
3855 goto compare_debug_with_arg;
3857 #define OPT "-fcompare-debug="
3858 else if (! strncmp (argv[i], OPT, sizeof (OPT) - 1))
3860 const char *opt;
3861 compare_debug_with_arg:
3862 opt = argv[i] + sizeof (OPT) - 1;
3863 #undef OPT
3864 if (*opt)
3865 compare_debug = 1;
3866 else
3867 compare_debug = -1;
3868 if (compare_debug < 0)
3869 compare_debug_opt = NULL;
3870 else
3871 compare_debug_opt = opt;
3872 goto normal_switch;
3874 else if (! strncmp (argv[i], "-Wa,", 4))
3876 int prev, j;
3877 /* Pass the rest of this option to the assembler. */
3879 /* Split the argument at commas. */
3880 prev = 4;
3881 for (j = 4; argv[i][j]; j++)
3882 if (argv[i][j] == ',')
3884 add_assembler_option (argv[i] + prev, j - prev);
3885 prev = j + 1;
3888 /* Record the part after the last comma. */
3889 add_assembler_option (argv[i] + prev, j - prev);
3891 else if (! strncmp (argv[i], "-Wp,", 4))
3893 int prev, j;
3894 /* Pass the rest of this option to the preprocessor. */
3896 /* Split the argument at commas. */
3897 prev = 4;
3898 for (j = 4; argv[i][j]; j++)
3899 if (argv[i][j] == ',')
3901 add_preprocessor_option (argv[i] + prev, j - prev);
3902 prev = j + 1;
3905 /* Record the part after the last comma. */
3906 add_preprocessor_option (argv[i] + prev, j - prev);
3908 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3910 int prev, j;
3911 /* Split the argument at commas. */
3912 prev = 4;
3913 for (j = 4; argv[i][j]; j++)
3914 if (argv[i][j] == ',')
3916 add_infile (save_string (argv[i] + prev, j - prev), "*");
3917 prev = j + 1;
3919 /* Record the part after the last comma. */
3920 add_infile (argv[i] + prev, "*");
3922 else if (strcmp (argv[i], "-Xlinker") == 0)
3924 if (i + 1 == argc)
3925 fatal_error ("argument to %<-Xlinker%> is missing");
3927 add_infile (argv[i+1], "*");
3928 i++;
3930 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3932 if (i + 1 == argc)
3933 fatal_error ("argument to %<-Xpreprocessor%> is missing");
3935 add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
3936 i++;
3938 else if (strcmp (argv[i], "-Xassembler") == 0)
3940 if (i + 1 == argc)
3941 fatal_error ("argument to %<-Xassembler%> is missing");
3943 add_assembler_option (argv[i+1], strlen (argv[i+1]));
3944 i++;
3946 else if (strcmp (argv[i], "-l") == 0)
3948 if (i + 1 == argc)
3949 fatal_error ("argument to %<-l%> is missing");
3951 /* POSIX allows separation of -l and the lib arg;
3952 canonicalize by concatenating -l with its arg */
3953 add_infile (concat ("-l", argv[i + 1], NULL), "*");
3954 i++;
3956 else if (strncmp (argv[i], "-l", 2) == 0)
3958 add_infile (argv[i], "*");
3960 else if (strcmp (argv[i], "-save-temps") == 0)
3962 save_temps_flag = SAVE_TEMPS_CWD;
3963 goto normal_switch;
3965 else if (strncmp (argv[i], "-save-temps=", 12) == 0)
3967 if (strcmp (argv[i]+12, "cwd") == 0)
3968 save_temps_flag = SAVE_TEMPS_CWD;
3969 else if (strcmp (argv[i]+12, "obj") == 0
3970 || strcmp (argv[i]+12, "object") == 0)
3971 save_temps_flag = SAVE_TEMPS_OBJ;
3972 else
3973 fatal_error ("%qs is an unknown -save-temps option", argv[i]);
3974 goto normal_switch;
3976 else if (strcmp (argv[i], "-no-canonical-prefixes") == 0)
3977 /* Already handled as a special case, so ignored here. */
3979 else if (strcmp (argv[i], "-combine") == 0)
3981 combine_flag = 1;
3982 goto normal_switch;
3984 else if (strcmp (argv[i], "-specs") == 0)
3986 struct user_specs *user = XNEW (struct user_specs);
3987 if (++i >= argc)
3988 fatal_error ("argument to %<-specs%> is missing");
3990 user->next = (struct user_specs *) 0;
3991 user->filename = argv[i];
3992 if (user_specs_tail)
3993 user_specs_tail->next = user;
3994 else
3995 user_specs_head = user;
3996 user_specs_tail = user;
3998 else if (strncmp (argv[i], "-specs=", 7) == 0)
4000 struct user_specs *user = XNEW (struct user_specs);
4001 if (strlen (argv[i]) == 7)
4002 fatal_error ("argument to %<-specs=%> is missing");
4004 user->next = (struct user_specs *) 0;
4005 user->filename = argv[i] + 7;
4006 if (user_specs_tail)
4007 user_specs_tail->next = user;
4008 else
4009 user_specs_head = user;
4010 user_specs_tail = user;
4012 else if (! strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")))
4014 target_system_root = argv[i] + strlen ("--sysroot=");
4015 target_system_root_changed = 1;
4017 else if (strcmp (argv[i], "-time") == 0)
4018 report_times = 1;
4019 else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
4021 if (report_times_to_file)
4022 fclose (report_times_to_file);
4023 report_times_to_file = fopen (argv[i] + sizeof ("-time=") - 1, "a");
4025 else if (strcmp (argv[i], "-pipe") == 0)
4027 /* -pipe has to go into the switches array as well as
4028 setting a flag. */
4029 use_pipes = 1;
4030 goto normal_switch;
4032 else if (strcmp (argv[i], "-wrapper") == 0)
4034 if (++i >= argc)
4035 fatal_error ("argument to %<-wrapper%> is missing");
4037 wrapper_string = argv[i];
4039 else if (strcmp (argv[i], "-###") == 0)
4041 /* This is similar to -v except that there is no execution
4042 of the commands and the echoed arguments are quoted. It
4043 is intended for use in shell scripts to capture the
4044 driver-generated command line. */
4045 verbose_only_flag++;
4046 verbose_flag++;
4048 else if (argv[i][0] == '-' && argv[i][1] != 0)
4050 switch (c)
4052 case 'B':
4054 const char *value;
4055 int len;
4057 if (p[1] == 0 && i + 1 == argc)
4058 fatal_error ("argument to %<-B%> is missing");
4059 if (p[1] == 0)
4060 value = argv[i + 1];
4061 else
4062 value = p + 1;
4064 len = strlen (value);
4066 /* Catch the case where the user has forgotten to append a
4067 directory separator to the path. Note, they may be using
4068 -B to add an executable name prefix, eg "i386-elf-", in
4069 order to distinguish between multiple installations of
4070 GCC in the same directory. Hence we must check to see
4071 if appending a directory separator actually makes a
4072 valid directory name. */
4073 if (! IS_DIR_SEPARATOR (value [len - 1])
4074 && is_directory (value, false))
4076 char *tmp = XNEWVEC (char, len + 2);
4077 strcpy (tmp, value);
4078 tmp[len] = DIR_SEPARATOR;
4079 tmp[++ len] = 0;
4080 value = tmp;
4083 add_prefix (&exec_prefixes, value, NULL,
4084 PREFIX_PRIORITY_B_OPT, 0, 0);
4085 add_prefix (&startfile_prefixes, value, NULL,
4086 PREFIX_PRIORITY_B_OPT, 0, 0);
4087 add_prefix (&include_prefixes, value, NULL,
4088 PREFIX_PRIORITY_B_OPT, 0, 0);
4090 goto normal_switch;
4092 case 'v': /* Print our subcommands and print versions. */
4093 /* If they do anything other than exactly `-v', don't set
4094 verbose_flag; rather, continue on to give the error. */
4095 if (p[1] != 0)
4096 break;
4097 verbose_flag++;
4098 goto normal_switch;
4100 case 'x':
4101 if (p[1] == 0 && i + 1 == argc)
4102 fatal_error ("argument to %<-x%> is missing");
4103 if (p[1] == 0)
4104 spec_lang = argv[++i];
4105 else
4106 spec_lang = p + 1;
4107 if (! strcmp (spec_lang, "none"))
4108 /* Suppress the warning if -xnone comes after the last input
4109 file, because alternate command interfaces like g++ might
4110 find it useful to place -xnone after each input file. */
4111 spec_lang = 0;
4112 else
4113 last_language_n_infiles = n_infiles;
4114 break;
4116 case 'S':
4117 case 'c':
4118 case 'E':
4119 if (p[1] == 0)
4120 have_c = 1;
4121 goto normal_switch;
4123 case 'o':
4124 have_o = 1;
4125 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
4126 if (! have_c)
4128 int skip;
4130 /* Forward scan, just in case -S, -E or -c is specified
4131 after -o. */
4132 int j = i + 1;
4133 if (p[1] == 0)
4134 ++j;
4135 while (j < argc)
4137 if (argv[j][0] == '-')
4139 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
4140 && argv[j][2] == 0)
4142 have_c = 1;
4143 break;
4145 else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
4146 j += skip - (argv[j][2] != 0);
4147 else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
4148 j += skip;
4150 j++;
4153 #endif
4154 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4155 if (p[1] == 0)
4156 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
4157 else
4159 argv[i] = convert_filename (argv[i], ! have_c, 0);
4160 p = &argv[i][1];
4162 #endif
4163 /* Save the output name in case -save-temps=obj was used. */
4164 if ((p[1] == 0) && argv[i + 1])
4165 save_temps_prefix = xstrdup(argv[i + 1]);
4166 else
4167 save_temps_prefix = xstrdup(argv[i] + 1);
4168 goto normal_switch;
4170 default:
4171 normal_switch:
4173 alloc_switch ();
4174 switches[n_switches].part1 = p;
4175 /* Deal with option arguments in separate argv elements. */
4176 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4177 || WORD_SWITCH_TAKES_ARG (p))
4179 int j = 0;
4180 int n_args = WORD_SWITCH_TAKES_ARG (p);
4182 if (n_args == 0)
4184 /* Count only the option arguments in separate
4185 argv elements. */
4186 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4188 if (i + n_args >= argc)
4189 fatal_error ("argument to %<-%s%> is missing", p);
4190 switches[n_switches].args
4191 = XNEWVEC (const char *, n_args + 1);
4192 while (j < n_args)
4193 switches[n_switches].args[j++] = argv[++i];
4194 /* Null-terminate the vector. */
4195 switches[n_switches].args[j] = 0;
4197 else if (c == 'o')
4199 /* On some systems, ld cannot handle "-o" without
4200 a space. So split the option from its argument. */
4201 char *part1 = XNEWVEC (char, 2);
4202 part1[0] = c;
4203 part1[1] = '\0';
4205 switches[n_switches].part1 = part1;
4206 switches[n_switches].args = XNEWVEC (const char *, 2);
4207 switches[n_switches].args[0] = xstrdup (p+1);
4208 switches[n_switches].args[1] = 0;
4210 else
4211 switches[n_switches].args = 0;
4213 switches[n_switches].live_cond = 0;
4214 switches[n_switches].validated = 0;
4215 switches[n_switches].ordering = 0;
4216 /* These are always valid, since gcc.c itself understands the
4217 first four, gfortranspec.c understands -static-libgfortran
4218 and g++spec.c understands -static-libstdc++ */
4219 if (!strcmp (p, "save-temps")
4220 || !strcmp (p, "static-libgcc")
4221 || !strcmp (p, "shared-libgcc")
4222 || !strcmp (p, "pipe")
4223 || !strcmp (p, "static-libgfortran")
4224 || !strcmp (p, "static-libstdc++"))
4225 switches[n_switches].validated = 1;
4226 else
4228 char ch = switches[n_switches].part1[0];
4229 if (ch == 'B')
4230 switches[n_switches].validated = 1;
4232 n_switches++;
4235 else
4237 const char *p = strrchr (argv[i], '@');
4238 char *fname;
4239 long offset;
4240 int consumed;
4241 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4242 argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
4243 #endif
4244 /* For LTO static archive support we handle input file
4245 specifications that are composed of a filename and
4246 an offset like FNAME@OFFSET. */
4247 if (p
4248 && p != argv[i]
4249 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4250 && strlen (p) == (unsigned int)consumed)
4252 fname = (char *)xmalloc (p - argv[i] + 1);
4253 memcpy (fname, argv[i], p - argv[i]);
4254 fname[p - argv[i]] = '\0';
4255 /* Only accept non-stdin and existing FNAME parts, otherwise
4256 try with the full name. */
4257 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4259 free (fname);
4260 fname = xstrdup (argv[i]);
4263 else
4264 fname = xstrdup (argv[i]);
4266 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4267 perror_with_name (fname);
4268 else
4269 add_infile (argv[i], spec_lang);
4271 free (fname);
4275 /* If -save-temps=obj and -o name, create the prefix to use for %b.
4276 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
4277 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4279 save_temps_length = strlen (save_temps_prefix);
4280 temp = strrchr (lbasename (save_temps_prefix), '.');
4281 if (temp)
4283 save_temps_length -= strlen (temp);
4284 save_temps_prefix[save_temps_length] = '\0';
4288 else if (save_temps_prefix != NULL)
4290 free (save_temps_prefix);
4291 save_temps_prefix = NULL;
4294 if (save_temps_flag && use_pipes)
4296 /* -save-temps overrides -pipe, so that temp files are produced */
4297 if (save_temps_flag)
4298 warning (0, "-pipe ignored because -save-temps specified");
4299 use_pipes = 0;
4302 if (!compare_debug)
4304 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
4306 if (gcd && gcd[0] == '-')
4308 compare_debug = 2;
4309 compare_debug_opt = gcd;
4311 else if (gcd && *gcd && strcmp (gcd, "0"))
4313 compare_debug = 3;
4314 compare_debug_opt = "-gtoggle";
4317 else if (compare_debug < 0)
4319 compare_debug = 0;
4320 gcc_assert (!compare_debug_opt);
4323 /* Set up the search paths. We add directories that we expect to
4324 contain GNU Toolchain components before directories specified by
4325 the machine description so that we will find GNU components (like
4326 the GNU assembler) before those of the host system. */
4328 /* If we don't know where the toolchain has been installed, use the
4329 configured-in locations. */
4330 if (!gcc_exec_prefix)
4332 #ifndef OS2
4333 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4334 PREFIX_PRIORITY_LAST, 1, 0);
4335 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4336 PREFIX_PRIORITY_LAST, 2, 0);
4337 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4338 PREFIX_PRIORITY_LAST, 2, 0);
4339 #endif
4340 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4341 PREFIX_PRIORITY_LAST, 1, 0);
4344 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4345 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
4346 dir_separator_str, NULL);
4348 /* Look for tools relative to the location from which the driver is
4349 running, or, if that is not available, the configured prefix. */
4350 tooldir_prefix
4351 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4352 spec_machine, dir_separator_str,
4353 spec_version, dir_separator_str, tooldir_prefix, NULL);
4355 add_prefix (&exec_prefixes,
4356 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4357 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4358 add_prefix (&startfile_prefixes,
4359 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4360 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4362 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4363 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4364 then consider it to relocate with the rest of the GCC installation
4365 if GCC_EXEC_PREFIX is set.
4366 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4367 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4369 char *tmp_prefix = get_relative_prefix (argv[0],
4370 standard_bindir_prefix,
4371 target_system_root);
4372 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4374 target_system_root = tmp_prefix;
4375 target_system_root_changed = 1;
4378 #endif
4380 /* More prefixes are enabled in main, after we read the specs file
4381 and determine whether this is cross-compilation or not. */
4383 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4384 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4386 if (compare_debug == 2 || compare_debug == 3)
4388 alloc_switch ();
4389 switches[n_switches].part1 = concat ("fcompare-debug=",
4390 compare_debug_opt,
4391 NULL);
4392 switches[n_switches].args = 0;
4393 switches[n_switches].live_cond = 0;
4394 switches[n_switches].validated = 0;
4395 switches[n_switches].ordering = 0;
4396 n_switches++;
4397 compare_debug = 1;
4400 /* Ensure we only invoke each subprocess once. */
4401 if (print_subprocess_help || print_help_list || print_version)
4403 n_infiles = 0;
4405 /* Create a dummy input file, so that we can pass
4406 the help option on to the various sub-processes. */
4407 add_infile ("help-dummy", "c");
4410 alloc_switch ();
4411 switches[n_switches].part1 = 0;
4412 alloc_infile ();
4413 infiles[n_infiles].name = 0;
4416 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4417 and place that in the environment. */
4419 static void
4420 set_collect_gcc_options (void)
4422 int i;
4423 int first_time;
4425 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4426 the compiler. */
4427 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4428 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4430 first_time = TRUE;
4431 for (i = 0; (int) i < n_switches; i++)
4433 const char *const *args;
4434 const char *p, *q;
4435 if (!first_time)
4436 obstack_grow (&collect_obstack, " ", 1);
4438 first_time = FALSE;
4440 /* Ignore elided switches. */
4441 if ((switches[i].live_cond & SWITCH_IGNORE) != 0)
4442 continue;
4444 obstack_grow (&collect_obstack, "'-", 2);
4445 q = switches[i].part1;
4446 while ((p = strchr (q, '\'')))
4448 obstack_grow (&collect_obstack, q, p - q);
4449 obstack_grow (&collect_obstack, "'\\''", 4);
4450 q = ++p;
4452 obstack_grow (&collect_obstack, q, strlen (q));
4453 obstack_grow (&collect_obstack, "'", 1);
4455 for (args = switches[i].args; args && *args; args++)
4457 obstack_grow (&collect_obstack, " '", 2);
4458 q = *args;
4459 while ((p = strchr (q, '\'')))
4461 obstack_grow (&collect_obstack, q, p - q);
4462 obstack_grow (&collect_obstack, "'\\''", 4);
4463 q = ++p;
4465 obstack_grow (&collect_obstack, q, strlen (q));
4466 obstack_grow (&collect_obstack, "'", 1);
4469 obstack_grow (&collect_obstack, "\0", 1);
4470 xputenv (XOBFINISH (&collect_obstack, char *));
4473 /* Process a spec string, accumulating and running commands. */
4475 /* These variables describe the input file name.
4476 input_file_number is the index on outfiles of this file,
4477 so that the output file name can be stored for later use by %o.
4478 input_basename is the start of the part of the input file
4479 sans all directory names, and basename_length is the number
4480 of characters starting there excluding the suffix .c or whatever. */
4482 static const char *gcc_input_filename;
4483 static int input_file_number;
4484 size_t input_filename_length;
4485 static int basename_length;
4486 static int suffixed_basename_length;
4487 static const char *input_basename;
4488 static const char *input_suffix;
4489 #ifndef HOST_LACKS_INODE_NUMBERS
4490 static struct stat input_stat;
4491 #endif
4492 static int input_stat_set;
4494 /* The compiler used to process the current input file. */
4495 static struct compiler *input_file_compiler;
4497 /* These are variables used within do_spec and do_spec_1. */
4499 /* Nonzero if an arg has been started and not yet terminated
4500 (with space, tab or newline). */
4501 static int arg_going;
4503 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4504 is a temporary file name. */
4505 static int delete_this_arg;
4507 /* Nonzero means %w has been seen; the next arg to be terminated
4508 is the output file name of this compilation. */
4509 static int this_is_output_file;
4511 /* Nonzero means %s has been seen; the next arg to be terminated
4512 is the name of a library file and we should try the standard
4513 search dirs for it. */
4514 static int this_is_library_file;
4516 /* Nonzero means %T has been seen; the next arg to be terminated
4517 is the name of a linker script and we should try all of the
4518 standard search dirs for it. If it is found insert a --script
4519 command line switch and then substitute the full path in place,
4520 otherwise generate an error message. */
4521 static int this_is_linker_script;
4523 /* Nonzero means that the input of this command is coming from a pipe. */
4524 static int input_from_pipe;
4526 /* Nonnull means substitute this for any suffix when outputting a switches
4527 arguments. */
4528 static const char *suffix_subst;
4530 /* If there is an argument being accumulated, terminate it and store it. */
4532 static void
4533 end_going_arg (void)
4535 if (arg_going)
4537 const char *string;
4539 obstack_1grow (&obstack, 0);
4540 string = XOBFINISH (&obstack, const char *);
4541 if (this_is_library_file)
4542 string = find_file (string);
4543 if (this_is_linker_script)
4545 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4547 if (full_script_path == NULL)
4549 error ("unable to locate default linker script %qs in the library search paths", string);
4550 /* Script was not found on search path. */
4551 return;
4553 store_arg ("--script", false, false);
4554 string = full_script_path;
4556 store_arg (string, delete_this_arg, this_is_output_file);
4557 if (this_is_output_file)
4558 outfiles[input_file_number] = string;
4559 arg_going = 0;
4564 /* Parse the WRAPPER string which is a comma separated list of the command line
4565 and insert them into the beginning of argbuf. */
4567 static void
4568 insert_wrapper (const char *wrapper)
4570 int n = 0;
4571 int i;
4572 char *buf = xstrdup (wrapper);
4573 char *p = buf;
4577 n++;
4578 while (*p == ',')
4579 p++;
4581 while ((p = strchr (p, ',')) != NULL);
4583 if (argbuf_index + n >= argbuf_length)
4585 argbuf_length = argbuf_length * 2;
4586 while (argbuf_length < argbuf_index + n)
4587 argbuf_length *= 2;
4588 argbuf = XRESIZEVEC (const char *, argbuf, argbuf_length);
4590 for (i = argbuf_index - 1; i >= 0; i--)
4591 argbuf[i + n] = argbuf[i];
4593 i = 0;
4594 p = buf;
4597 while (*p == ',')
4599 *p = 0;
4600 p++;
4602 argbuf[i++] = p;
4604 while ((p = strchr (p, ',')) != NULL);
4605 gcc_assert (i == n);
4606 argbuf_index += n;
4609 /* Process the spec SPEC and run the commands specified therein.
4610 Returns 0 if the spec is successfully processed; -1 if failed. */
4613 do_spec (const char *spec)
4615 int value;
4617 value = do_spec_2 (spec);
4619 /* Force out any unfinished command.
4620 If -pipe, this forces out the last command if it ended in `|'. */
4621 if (value == 0)
4623 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4624 argbuf_index--;
4626 set_collect_gcc_options ();
4628 if (argbuf_index > 0)
4629 value = execute ();
4632 return value;
4635 static int
4636 do_spec_2 (const char *spec)
4638 int result;
4640 clear_args ();
4641 arg_going = 0;
4642 delete_this_arg = 0;
4643 this_is_output_file = 0;
4644 this_is_library_file = 0;
4645 this_is_linker_script = 0;
4646 input_from_pipe = 0;
4647 suffix_subst = NULL;
4649 result = do_spec_1 (spec, 0, NULL);
4651 end_going_arg ();
4653 return result;
4657 /* Process the given spec string and add any new options to the end
4658 of the switches/n_switches array. */
4660 static void
4661 do_option_spec (const char *name, const char *spec)
4663 unsigned int i, value_count, value_len;
4664 const char *p, *q, *value;
4665 char *tmp_spec, *tmp_spec_p;
4667 if (configure_default_options[0].name == NULL)
4668 return;
4670 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4671 if (strcmp (configure_default_options[i].name, name) == 0)
4672 break;
4673 if (i == ARRAY_SIZE (configure_default_options))
4674 return;
4676 value = configure_default_options[i].value;
4677 value_len = strlen (value);
4679 /* Compute the size of the final spec. */
4680 value_count = 0;
4681 p = spec;
4682 while ((p = strstr (p, "%(VALUE)")) != NULL)
4684 p ++;
4685 value_count ++;
4688 /* Replace each %(VALUE) by the specified value. */
4689 tmp_spec = (char *) alloca (strlen (spec) + 1
4690 + value_count * (value_len - strlen ("%(VALUE)")));
4691 tmp_spec_p = tmp_spec;
4692 q = spec;
4693 while ((p = strstr (q, "%(VALUE)")) != NULL)
4695 memcpy (tmp_spec_p, q, p - q);
4696 tmp_spec_p = tmp_spec_p + (p - q);
4697 memcpy (tmp_spec_p, value, value_len);
4698 tmp_spec_p += value_len;
4699 q = p + strlen ("%(VALUE)");
4701 strcpy (tmp_spec_p, q);
4703 do_self_spec (tmp_spec);
4706 /* Process the given spec string and add any new options to the end
4707 of the switches/n_switches array. */
4709 static void
4710 do_self_spec (const char *spec)
4712 int i;
4714 do_spec_2 (spec);
4715 do_spec_1 (" ", 0, NULL);
4717 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4718 do_self_specs adds the replacements to switches array, so it shouldn't
4719 be processed afterwards. */
4720 for (i = 0; i < n_switches; i++)
4721 if ((switches[i].live_cond & SWITCH_IGNORE))
4722 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4724 if (argbuf_index > 0)
4726 switches = XRESIZEVEC (struct switchstr, switches,
4727 n_switches + argbuf_index + 1);
4729 for (i = 0; i < argbuf_index; i++)
4731 struct switchstr *sw;
4732 const char *p = argbuf[i];
4733 int c = *p;
4735 /* Each switch should start with '-'. */
4736 if (c != '-')
4737 fatal_error ("switch %qs does not start with %<-%>", argbuf[i]);
4739 p++;
4740 c = *p;
4742 sw = &switches[n_switches++];
4743 sw->part1 = p;
4744 sw->live_cond = 0;
4745 sw->validated = 0;
4746 sw->ordering = 0;
4748 /* Deal with option arguments in separate argv elements. */
4749 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4750 || WORD_SWITCH_TAKES_ARG (p))
4752 int j = 0;
4753 int n_args = WORD_SWITCH_TAKES_ARG (p);
4755 if (n_args == 0)
4757 /* Count only the option arguments in separate argv elements. */
4758 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4760 if (i + n_args >= argbuf_index)
4761 fatal_error ("argument to %<-%s%> is missing", p);
4762 sw->args
4763 = XNEWVEC (const char *, n_args + 1);
4764 while (j < n_args)
4765 sw->args[j++] = argbuf[++i];
4766 /* Null-terminate the vector. */
4767 sw->args[j] = 0;
4769 else if (c == 'o')
4771 /* On some systems, ld cannot handle "-o" without
4772 a space. So split the option from its argument. */
4773 char *part1 = XNEWVEC (char, 2);
4774 part1[0] = c;
4775 part1[1] = '\0';
4777 sw->part1 = part1;
4778 sw->args = XNEWVEC (const char *, 2);
4779 sw->args[0] = xstrdup (p+1);
4780 sw->args[1] = 0;
4782 else
4783 sw->args = 0;
4786 switches[n_switches].part1 = 0;
4790 /* Callback for processing %D and %I specs. */
4792 struct spec_path_info {
4793 const char *option;
4794 const char *append;
4795 size_t append_len;
4796 bool omit_relative;
4797 bool separate_options;
4800 static void *
4801 spec_path (char *path, void *data)
4803 struct spec_path_info *info = (struct spec_path_info *) data;
4804 size_t len = 0;
4805 char save = 0;
4807 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4808 return NULL;
4810 if (info->append_len != 0)
4812 len = strlen (path);
4813 memcpy (path + len, info->append, info->append_len + 1);
4816 if (!is_directory (path, true))
4817 return NULL;
4819 do_spec_1 (info->option, 1, NULL);
4820 if (info->separate_options)
4821 do_spec_1 (" ", 0, NULL);
4823 if (info->append_len == 0)
4825 len = strlen (path);
4826 save = path[len - 1];
4827 if (IS_DIR_SEPARATOR (path[len - 1]))
4828 path[len - 1] = '\0';
4831 do_spec_1 (path, 1, NULL);
4832 do_spec_1 (" ", 0, NULL);
4834 /* Must not damage the original path. */
4835 if (info->append_len == 0)
4836 path[len - 1] = save;
4838 return NULL;
4841 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4842 argument list. */
4844 static void
4845 create_at_file (char **argv)
4847 char *temp_file = make_temp_file ("");
4848 char *at_argument = concat ("@", temp_file, NULL);
4849 FILE *f = fopen (temp_file, "w");
4850 int status;
4852 if (f == NULL)
4853 fatal_error ("could not open temporary response file %s",
4854 temp_file);
4856 status = writeargv (argv, f);
4858 if (status)
4859 fatal_error ("could not write to temporary response file %s",
4860 temp_file);
4862 status = fclose (f);
4864 if (EOF == status)
4865 fatal_error ("could not close temporary response file %s",
4866 temp_file);
4868 store_arg (at_argument, 0, 0);
4870 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
4873 /* True if we should compile INFILE. */
4875 static bool
4876 compile_input_file_p (struct infile *infile)
4878 if ((!infile->language) || (infile->language[0] != '*'))
4879 if (infile->incompiler == input_file_compiler)
4880 return true;
4881 return false;
4884 /* Process the sub-spec SPEC as a portion of a larger spec.
4885 This is like processing a whole spec except that we do
4886 not initialize at the beginning and we do not supply a
4887 newline by default at the end.
4888 INSWITCH nonzero means don't process %-sequences in SPEC;
4889 in this case, % is treated as an ordinary character.
4890 This is used while substituting switches.
4891 INSWITCH nonzero also causes SPC not to terminate an argument.
4893 Value is zero unless a line was finished
4894 and the command on that line reported an error. */
4896 static int
4897 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4899 const char *p = spec;
4900 int c;
4901 int i;
4902 int value;
4904 while ((c = *p++))
4905 /* If substituting a switch, treat all chars like letters.
4906 Otherwise, NL, SPC, TAB and % are special. */
4907 switch (inswitch ? 'a' : c)
4909 case '\n':
4910 end_going_arg ();
4912 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4914 /* A `|' before the newline means use a pipe here,
4915 but only if -pipe was specified.
4916 Otherwise, execute now and don't pass the `|' as an arg. */
4917 if (use_pipes)
4919 input_from_pipe = 1;
4920 break;
4922 else
4923 argbuf_index--;
4926 set_collect_gcc_options ();
4928 if (argbuf_index > 0)
4930 value = execute ();
4931 if (value)
4932 return value;
4934 /* Reinitialize for a new command, and for a new argument. */
4935 clear_args ();
4936 arg_going = 0;
4937 delete_this_arg = 0;
4938 this_is_output_file = 0;
4939 this_is_library_file = 0;
4940 this_is_linker_script = 0;
4941 input_from_pipe = 0;
4942 break;
4944 case '|':
4945 end_going_arg ();
4947 /* Use pipe */
4948 obstack_1grow (&obstack, c);
4949 arg_going = 1;
4950 break;
4952 case '\t':
4953 case ' ':
4954 end_going_arg ();
4956 /* Reinitialize for a new argument. */
4957 delete_this_arg = 0;
4958 this_is_output_file = 0;
4959 this_is_library_file = 0;
4960 this_is_linker_script = 0;
4961 break;
4963 case '%':
4964 switch (c = *p++)
4966 case 0:
4967 fatal_error ("spec %qs invalid", spec);
4969 case 'b':
4970 if (save_temps_length)
4971 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4972 else
4973 obstack_grow (&obstack, input_basename, basename_length);
4974 if (compare_debug < 0)
4975 obstack_grow (&obstack, ".gk", 3);
4976 arg_going = 1;
4977 break;
4979 case 'B':
4980 if (save_temps_length)
4981 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4982 else
4983 obstack_grow (&obstack, input_basename, suffixed_basename_length);
4984 if (compare_debug < 0)
4985 obstack_grow (&obstack, ".gk", 3);
4986 arg_going = 1;
4987 break;
4989 case 'd':
4990 delete_this_arg = 2;
4991 break;
4993 /* Dump out the directories specified with LIBRARY_PATH,
4994 followed by the absolute directories
4995 that we search for startfiles. */
4996 case 'D':
4998 struct spec_path_info info;
5000 info.option = "-L";
5001 info.append_len = 0;
5002 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
5003 /* Used on systems which record the specified -L dirs
5004 and use them to search for dynamic linking.
5005 Relative directories always come from -B,
5006 and it is better not to use them for searching
5007 at run time. In particular, stage1 loses. */
5008 info.omit_relative = true;
5009 #else
5010 info.omit_relative = false;
5011 #endif
5012 info.separate_options = false;
5014 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5016 break;
5018 case 'e':
5019 /* %efoo means report an error with `foo' as error message
5020 and don't execute any more commands for this file. */
5022 const char *q = p;
5023 char *buf;
5024 while (*p != 0 && *p != '\n')
5025 p++;
5026 buf = (char *) alloca (p - q + 1);
5027 strncpy (buf, q, p - q);
5028 buf[p - q] = 0;
5029 error ("%s", _(buf));
5030 return -1;
5032 break;
5033 case 'n':
5034 /* %nfoo means report a notice with `foo' on stderr. */
5036 const char *q = p;
5037 char *buf;
5038 while (*p != 0 && *p != '\n')
5039 p++;
5040 buf = (char *) alloca (p - q + 1);
5041 strncpy (buf, q, p - q);
5042 buf[p - q] = 0;
5043 inform (0, "%s", _(buf));
5044 if (*p)
5045 p++;
5047 break;
5049 case 'j':
5051 struct stat st;
5053 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
5054 defined, and it is not a directory, and it is
5055 writable, use it. Otherwise, treat this like any
5056 other temporary file. */
5058 if ((!save_temps_flag)
5059 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
5060 && (access (HOST_BIT_BUCKET, W_OK) == 0))
5062 obstack_grow (&obstack, HOST_BIT_BUCKET,
5063 strlen (HOST_BIT_BUCKET));
5064 delete_this_arg = 0;
5065 arg_going = 1;
5066 break;
5069 goto create_temp_file;
5070 case '|':
5071 if (use_pipes)
5073 obstack_1grow (&obstack, '-');
5074 delete_this_arg = 0;
5075 arg_going = 1;
5077 /* consume suffix */
5078 while (*p == '.' || ISALNUM ((unsigned char) *p))
5079 p++;
5080 if (p[0] == '%' && p[1] == 'O')
5081 p += 2;
5083 break;
5085 goto create_temp_file;
5086 case 'm':
5087 if (use_pipes)
5089 /* consume suffix */
5090 while (*p == '.' || ISALNUM ((unsigned char) *p))
5091 p++;
5092 if (p[0] == '%' && p[1] == 'O')
5093 p += 2;
5095 break;
5097 goto create_temp_file;
5098 case 'g':
5099 case 'u':
5100 case 'U':
5101 create_temp_file:
5103 struct temp_name *t;
5104 int suffix_length;
5105 const char *suffix = p;
5106 char *saved_suffix = NULL;
5108 while (*p == '.' || ISALNUM ((unsigned char) *p))
5109 p++;
5110 suffix_length = p - suffix;
5111 if (p[0] == '%' && p[1] == 'O')
5113 p += 2;
5114 /* We don't support extra suffix characters after %O. */
5115 if (*p == '.' || ISALNUM ((unsigned char) *p))
5116 fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
5117 if (suffix_length == 0)
5118 suffix = TARGET_OBJECT_SUFFIX;
5119 else
5121 saved_suffix
5122 = XNEWVEC (char, suffix_length
5123 + strlen (TARGET_OBJECT_SUFFIX));
5124 strncpy (saved_suffix, suffix, suffix_length);
5125 strcpy (saved_suffix + suffix_length,
5126 TARGET_OBJECT_SUFFIX);
5128 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5131 if (compare_debug < 0)
5133 suffix = concat (".gk", suffix, NULL);
5134 suffix_length += 3;
5137 /* If -save-temps=obj and -o were specified, use that for the
5138 temp file. */
5139 if (save_temps_length)
5141 char *tmp;
5142 temp_filename_length
5143 = save_temps_length + suffix_length + 1;
5144 tmp = (char *) alloca (temp_filename_length);
5145 memcpy (tmp, save_temps_prefix, save_temps_length);
5146 memcpy (tmp + save_temps_length, suffix, suffix_length);
5147 tmp[save_temps_length + suffix_length] = '\0';
5148 temp_filename = save_string (tmp,
5149 temp_filename_length + 1);
5150 obstack_grow (&obstack, temp_filename,
5151 temp_filename_length);
5152 arg_going = 1;
5153 delete_this_arg = 0;
5154 break;
5157 /* If the gcc_input_filename has the same suffix specified
5158 for the %g, %u, or %U, and -save-temps is specified,
5159 we could end up using that file as an intermediate
5160 thus clobbering the user's source file (.e.g.,
5161 gcc -save-temps foo.s would clobber foo.s with the
5162 output of cpp0). So check for this condition and
5163 generate a temp file as the intermediate. */
5165 if (save_temps_flag)
5167 char *tmp;
5168 temp_filename_length = basename_length + suffix_length + 1;
5169 tmp = (char *) alloca (temp_filename_length);
5170 memcpy (tmp, input_basename, basename_length);
5171 memcpy (tmp + basename_length, suffix, suffix_length);
5172 tmp[basename_length + suffix_length] = '\0';
5173 temp_filename = tmp;
5175 if (strcmp (temp_filename, gcc_input_filename) != 0)
5177 #ifndef HOST_LACKS_INODE_NUMBERS
5178 struct stat st_temp;
5180 /* Note, set_input() resets input_stat_set to 0. */
5181 if (input_stat_set == 0)
5183 input_stat_set = stat (gcc_input_filename,
5184 &input_stat);
5185 if (input_stat_set >= 0)
5186 input_stat_set = 1;
5189 /* If we have the stat for the gcc_input_filename
5190 and we can do the stat for the temp_filename
5191 then the they could still refer to the same
5192 file if st_dev/st_ino's are the same. */
5193 if (input_stat_set != 1
5194 || stat (temp_filename, &st_temp) < 0
5195 || input_stat.st_dev != st_temp.st_dev
5196 || input_stat.st_ino != st_temp.st_ino)
5197 #else
5198 /* Just compare canonical pathnames. */
5199 char* input_realname = lrealpath (gcc_input_filename);
5200 char* temp_realname = lrealpath (temp_filename);
5201 bool files_differ = strcmp (input_realname, temp_realname);
5202 free (input_realname);
5203 free (temp_realname);
5204 if (files_differ)
5205 #endif
5207 temp_filename = save_string (temp_filename,
5208 temp_filename_length + 1);
5209 obstack_grow (&obstack, temp_filename,
5210 temp_filename_length);
5211 arg_going = 1;
5212 delete_this_arg = 0;
5213 break;
5218 /* See if we already have an association of %g/%u/%U and
5219 suffix. */
5220 for (t = temp_names; t; t = t->next)
5221 if (t->length == suffix_length
5222 && strncmp (t->suffix, suffix, suffix_length) == 0
5223 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5224 break;
5226 /* Make a new association if needed. %u and %j
5227 require one. */
5228 if (t == 0 || c == 'u' || c == 'j')
5230 if (t == 0)
5232 t = XNEW (struct temp_name);
5233 t->next = temp_names;
5234 temp_names = t;
5236 t->length = suffix_length;
5237 if (saved_suffix)
5239 t->suffix = saved_suffix;
5240 saved_suffix = NULL;
5242 else
5243 t->suffix = save_string (suffix, suffix_length);
5244 t->unique = (c == 'u' || c == 'U' || c == 'j');
5245 temp_filename = make_temp_file (t->suffix);
5246 temp_filename_length = strlen (temp_filename);
5247 t->filename = temp_filename;
5248 t->filename_length = temp_filename_length;
5251 if (saved_suffix)
5252 free (saved_suffix);
5254 obstack_grow (&obstack, t->filename, t->filename_length);
5255 delete_this_arg = 1;
5257 arg_going = 1;
5258 break;
5260 case 'i':
5261 if (combine_inputs)
5263 if (at_file_supplied)
5265 /* We are going to expand `%i' to `@FILE', where FILE
5266 is a newly-created temporary filename. The filenames
5267 that would usually be expanded in place of %o will be
5268 written to the temporary file. */
5269 char **argv;
5270 int n_files = 0;
5271 int j;
5273 for (i = 0; i < n_infiles; i++)
5274 if (compile_input_file_p (&infiles[i]))
5275 n_files++;
5277 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5279 /* Copy the strings over. */
5280 for (i = 0, j = 0; i < n_infiles; i++)
5281 if (compile_input_file_p (&infiles[i]))
5283 argv[j] = CONST_CAST (char *, infiles[i].name);
5284 infiles[i].compiled = true;
5285 j++;
5287 argv[j] = NULL;
5289 create_at_file (argv);
5291 else
5292 for (i = 0; (int) i < n_infiles; i++)
5293 if (compile_input_file_p (&infiles[i]))
5295 store_arg (infiles[i].name, 0, 0);
5296 infiles[i].compiled = true;
5299 else
5301 obstack_grow (&obstack, gcc_input_filename,
5302 input_filename_length);
5303 arg_going = 1;
5305 break;
5307 case 'I':
5309 struct spec_path_info info;
5311 if (multilib_dir)
5313 do_spec_1 ("-imultilib", 1, NULL);
5314 /* Make this a separate argument. */
5315 do_spec_1 (" ", 0, NULL);
5316 do_spec_1 (multilib_dir, 1, NULL);
5317 do_spec_1 (" ", 0, NULL);
5320 if (gcc_exec_prefix)
5322 do_spec_1 ("-iprefix", 1, NULL);
5323 /* Make this a separate argument. */
5324 do_spec_1 (" ", 0, NULL);
5325 do_spec_1 (gcc_exec_prefix, 1, NULL);
5326 do_spec_1 (" ", 0, NULL);
5329 if (target_system_root_changed ||
5330 (target_system_root && target_sysroot_hdrs_suffix))
5332 do_spec_1 ("-isysroot", 1, NULL);
5333 /* Make this a separate argument. */
5334 do_spec_1 (" ", 0, NULL);
5335 do_spec_1 (target_system_root, 1, NULL);
5336 if (target_sysroot_hdrs_suffix)
5337 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5338 do_spec_1 (" ", 0, NULL);
5341 info.option = "-isystem";
5342 info.append = "include";
5343 info.append_len = strlen (info.append);
5344 info.omit_relative = false;
5345 info.separate_options = true;
5347 for_each_path (&include_prefixes, false, info.append_len,
5348 spec_path, &info);
5350 info.append = "include-fixed";
5351 if (*sysroot_hdrs_suffix_spec)
5352 info.append = concat (info.append, dir_separator_str,
5353 multilib_dir, NULL);
5354 info.append_len = strlen (info.append);
5355 for_each_path (&include_prefixes, false, info.append_len,
5356 spec_path, &info);
5358 break;
5360 case 'o':
5362 int max = n_infiles;
5363 max += lang_specific_extra_outfiles;
5365 if (HAVE_GNU_LD && at_file_supplied)
5367 /* We are going to expand `%o' to `@FILE', where FILE
5368 is a newly-created temporary filename. The filenames
5369 that would usually be expanded in place of %o will be
5370 written to the temporary file. */
5372 char **argv;
5373 int n_files, j;
5375 /* Convert OUTFILES into a form suitable for writeargv. */
5377 /* Determine how many are non-NULL. */
5378 for (n_files = 0, i = 0; i < max; i++)
5379 n_files += outfiles[i] != NULL;
5381 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5383 /* Copy the strings over. */
5384 for (i = 0, j = 0; i < max; i++)
5385 if (outfiles[i])
5387 argv[j] = CONST_CAST (char *, outfiles[i]);
5388 j++;
5390 argv[j] = NULL;
5392 create_at_file (argv);
5394 else
5395 for (i = 0; i < max; i++)
5396 if (outfiles[i])
5397 store_arg (outfiles[i], 0, 0);
5398 break;
5401 case 'O':
5402 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5403 arg_going = 1;
5404 break;
5406 case 's':
5407 this_is_library_file = 1;
5408 break;
5410 case 'T':
5411 this_is_linker_script = 1;
5412 break;
5414 case 'V':
5415 outfiles[input_file_number] = NULL;
5416 break;
5418 case 'w':
5419 this_is_output_file = 1;
5420 break;
5422 case 'W':
5424 int cur_index = argbuf_index;
5425 /* Handle the {...} following the %W. */
5426 if (*p != '{')
5427 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
5428 p = handle_braces (p + 1);
5429 if (p == 0)
5430 return -1;
5431 end_going_arg ();
5432 /* If any args were output, mark the last one for deletion
5433 on failure. */
5434 if (argbuf_index != cur_index)
5435 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
5436 break;
5439 /* %x{OPTION} records OPTION for %X to output. */
5440 case 'x':
5442 const char *p1 = p;
5443 char *string;
5445 /* Skip past the option value and make a copy. */
5446 if (*p != '{')
5447 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
5448 while (*p++ != '}')
5450 string = save_string (p1 + 1, p - p1 - 2);
5452 /* See if we already recorded this option. */
5453 for (i = 0; i < n_linker_options; i++)
5454 if (! strcmp (string, linker_options[i]))
5456 free (string);
5457 return 0;
5460 /* This option is new; add it. */
5461 add_linker_option (string, strlen (string));
5463 break;
5465 /* Dump out the options accumulated previously using %x. */
5466 case 'X':
5467 for (i = 0; i < n_linker_options; i++)
5469 do_spec_1 (linker_options[i], 1, NULL);
5470 /* Make each accumulated option a separate argument. */
5471 do_spec_1 (" ", 0, NULL);
5473 break;
5475 /* Dump out the options accumulated previously using -Wa,. */
5476 case 'Y':
5477 for (i = 0; i < n_assembler_options; i++)
5479 do_spec_1 (assembler_options[i], 1, NULL);
5480 /* Make each accumulated option a separate argument. */
5481 do_spec_1 (" ", 0, NULL);
5483 break;
5485 /* Dump out the options accumulated previously using -Wp,. */
5486 case 'Z':
5487 for (i = 0; i < n_preprocessor_options; i++)
5489 do_spec_1 (preprocessor_options[i], 1, NULL);
5490 /* Make each accumulated option a separate argument. */
5491 do_spec_1 (" ", 0, NULL);
5493 break;
5495 /* Here are digits and numbers that just process
5496 a certain constant string as a spec. */
5498 case '1':
5499 value = do_spec_1 (cc1_spec, 0, NULL);
5500 if (value != 0)
5501 return value;
5502 break;
5504 case '2':
5505 value = do_spec_1 (cc1plus_spec, 0, NULL);
5506 if (value != 0)
5507 return value;
5508 break;
5510 case 'a':
5511 value = do_spec_1 (asm_spec, 0, NULL);
5512 if (value != 0)
5513 return value;
5514 break;
5516 case 'A':
5517 value = do_spec_1 (asm_final_spec, 0, NULL);
5518 if (value != 0)
5519 return value;
5520 break;
5522 case 'C':
5524 const char *const spec
5525 = (input_file_compiler->cpp_spec
5526 ? input_file_compiler->cpp_spec
5527 : cpp_spec);
5528 value = do_spec_1 (spec, 0, NULL);
5529 if (value != 0)
5530 return value;
5532 break;
5534 case 'E':
5535 value = do_spec_1 (endfile_spec, 0, NULL);
5536 if (value != 0)
5537 return value;
5538 break;
5540 case 'l':
5541 value = do_spec_1 (link_spec, 0, NULL);
5542 if (value != 0)
5543 return value;
5544 break;
5546 case 'L':
5547 value = do_spec_1 (lib_spec, 0, NULL);
5548 if (value != 0)
5549 return value;
5550 break;
5552 case 'G':
5553 value = do_spec_1 (libgcc_spec, 0, NULL);
5554 if (value != 0)
5555 return value;
5556 break;
5558 case 'R':
5559 /* We assume there is a directory
5560 separator at the end of this string. */
5561 if (target_system_root)
5563 obstack_grow (&obstack, target_system_root,
5564 strlen (target_system_root));
5565 if (target_sysroot_suffix)
5566 obstack_grow (&obstack, target_sysroot_suffix,
5567 strlen (target_sysroot_suffix));
5569 break;
5571 case 'S':
5572 value = do_spec_1 (startfile_spec, 0, NULL);
5573 if (value != 0)
5574 return value;
5575 break;
5577 /* Here we define characters other than letters and digits. */
5579 case '{':
5580 p = handle_braces (p);
5581 if (p == 0)
5582 return -1;
5583 break;
5585 case ':':
5586 p = handle_spec_function (p);
5587 if (p == 0)
5588 return -1;
5589 break;
5591 case '%':
5592 obstack_1grow (&obstack, '%');
5593 break;
5595 case '.':
5597 unsigned len = 0;
5599 while (p[len] && p[len] != ' ' && p[len] != '%')
5600 len++;
5601 suffix_subst = save_string (p - 1, len + 1);
5602 p += len;
5604 break;
5606 /* Henceforth ignore the option(s) matching the pattern
5607 after the %<. */
5608 case '<':
5610 unsigned len = 0;
5611 int have_wildcard = 0;
5612 int i;
5614 while (p[len] && p[len] != ' ' && p[len] != '\t')
5615 len++;
5617 if (p[len-1] == '*')
5618 have_wildcard = 1;
5620 for (i = 0; i < n_switches; i++)
5621 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5622 && (have_wildcard || switches[i].part1[len] == '\0'))
5624 switches[i].live_cond |= SWITCH_IGNORE;
5625 switches[i].validated = 1;
5628 p += len;
5630 break;
5632 case '*':
5633 if (soft_matched_part)
5635 do_spec_1 (soft_matched_part, 1, NULL);
5636 do_spec_1 (" ", 0, NULL);
5638 else
5639 /* Catch the case where a spec string contains something like
5640 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5641 hand side of the :. */
5642 error ("spec failure: %<%%*%> has not been initialized by pattern match");
5643 break;
5645 /* Process a string found as the value of a spec given by name.
5646 This feature allows individual machine descriptions
5647 to add and use their own specs.
5648 %[...] modifies -D options the way %P does;
5649 %(...) uses the spec unmodified. */
5650 case '[':
5651 warning (0, "use of obsolete %%[ operator in specs");
5652 case '(':
5654 const char *name = p;
5655 struct spec_list *sl;
5656 int len;
5658 /* The string after the S/P is the name of a spec that is to be
5659 processed. */
5660 while (*p && *p != ')' && *p != ']')
5661 p++;
5663 /* See if it's in the list. */
5664 for (len = p - name, sl = specs; sl; sl = sl->next)
5665 if (sl->name_len == len && !strncmp (sl->name, name, len))
5667 name = *(sl->ptr_spec);
5668 #ifdef DEBUG_SPECS
5669 fnotice (stderr, "Processing spec %c%s%c, which is '%s'\n",
5670 c, sl->name, (c == '(') ? ')' : ']', name);
5671 #endif
5672 break;
5675 if (sl)
5677 if (c == '(')
5679 value = do_spec_1 (name, 0, NULL);
5680 if (value != 0)
5681 return value;
5683 else
5685 char *x = (char *) alloca (strlen (name) * 2 + 1);
5686 char *buf = x;
5687 const char *y = name;
5688 int flag = 0;
5690 /* Copy all of NAME into BUF, but put __ after
5691 every -D and at the end of each arg. */
5692 while (1)
5694 if (! strncmp (y, "-D", 2))
5696 *x++ = '-';
5697 *x++ = 'D';
5698 *x++ = '_';
5699 *x++ = '_';
5700 y += 2;
5701 flag = 1;
5702 continue;
5704 else if (flag
5705 && (*y == ' ' || *y == '\t' || *y == '='
5706 || *y == '}' || *y == 0))
5708 *x++ = '_';
5709 *x++ = '_';
5710 flag = 0;
5712 if (*y == 0)
5713 break;
5714 else
5715 *x++ = *y++;
5717 *x = 0;
5719 value = do_spec_1 (buf, 0, NULL);
5720 if (value != 0)
5721 return value;
5725 /* Discard the closing paren or bracket. */
5726 if (*p)
5727 p++;
5729 break;
5731 default:
5732 error ("spec failure: unrecognized spec option %qc", c);
5733 break;
5735 break;
5737 case '\\':
5738 /* Backslash: treat next character as ordinary. */
5739 c = *p++;
5741 /* Fall through. */
5742 default:
5743 /* Ordinary character: put it into the current argument. */
5744 obstack_1grow (&obstack, c);
5745 arg_going = 1;
5748 /* End of string. If we are processing a spec function, we need to
5749 end any pending argument. */
5750 if (processing_spec_function)
5751 end_going_arg ();
5753 return 0;
5756 /* Look up a spec function. */
5758 static const struct spec_function *
5759 lookup_spec_function (const char *name)
5761 const struct spec_function *sf;
5763 for (sf = static_spec_functions; sf->name != NULL; sf++)
5764 if (strcmp (sf->name, name) == 0)
5765 return sf;
5767 return NULL;
5770 /* Evaluate a spec function. */
5772 static const char *
5773 eval_spec_function (const char *func, const char *args)
5775 const struct spec_function *sf;
5776 const char *funcval;
5778 /* Saved spec processing context. */
5779 int save_argbuf_index;
5780 int save_argbuf_length;
5781 const char **save_argbuf;
5783 int save_arg_going;
5784 int save_delete_this_arg;
5785 int save_this_is_output_file;
5786 int save_this_is_library_file;
5787 int save_input_from_pipe;
5788 int save_this_is_linker_script;
5789 const char *save_suffix_subst;
5792 sf = lookup_spec_function (func);
5793 if (sf == NULL)
5794 fatal_error ("unknown spec function %qs", func);
5796 /* Push the spec processing context. */
5797 save_argbuf_index = argbuf_index;
5798 save_argbuf_length = argbuf_length;
5799 save_argbuf = argbuf;
5801 save_arg_going = arg_going;
5802 save_delete_this_arg = delete_this_arg;
5803 save_this_is_output_file = this_is_output_file;
5804 save_this_is_library_file = this_is_library_file;
5805 save_this_is_linker_script = this_is_linker_script;
5806 save_input_from_pipe = input_from_pipe;
5807 save_suffix_subst = suffix_subst;
5809 /* Create a new spec processing context, and build the function
5810 arguments. */
5812 alloc_args ();
5813 if (do_spec_2 (args) < 0)
5814 fatal_error ("error in args to spec function %qs", func);
5816 /* argbuf_index is an index for the next argument to be inserted, and
5817 so contains the count of the args already inserted. */
5819 funcval = (*sf->func) (argbuf_index, argbuf);
5821 /* Pop the spec processing context. */
5822 argbuf_index = save_argbuf_index;
5823 argbuf_length = save_argbuf_length;
5824 free (argbuf);
5825 argbuf = save_argbuf;
5827 arg_going = save_arg_going;
5828 delete_this_arg = save_delete_this_arg;
5829 this_is_output_file = save_this_is_output_file;
5830 this_is_library_file = save_this_is_library_file;
5831 this_is_linker_script = save_this_is_linker_script;
5832 input_from_pipe = save_input_from_pipe;
5833 suffix_subst = save_suffix_subst;
5835 return funcval;
5838 /* Handle a spec function call of the form:
5840 %:function(args)
5842 ARGS is processed as a spec in a separate context and split into an
5843 argument vector in the normal fashion. The function returns a string
5844 containing a spec which we then process in the caller's context, or
5845 NULL if no processing is required. */
5847 static const char *
5848 handle_spec_function (const char *p)
5850 char *func, *args;
5851 const char *endp, *funcval;
5852 int count;
5854 processing_spec_function++;
5856 /* Get the function name. */
5857 for (endp = p; *endp != '\0'; endp++)
5859 if (*endp == '(') /* ) */
5860 break;
5861 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5862 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5863 fatal_error ("malformed spec function name");
5865 if (*endp != '(') /* ) */
5866 fatal_error ("no arguments for spec function");
5867 func = save_string (p, endp - p);
5868 p = ++endp;
5870 /* Get the arguments. */
5871 for (count = 0; *endp != '\0'; endp++)
5873 /* ( */
5874 if (*endp == ')')
5876 if (count == 0)
5877 break;
5878 count--;
5880 else if (*endp == '(') /* ) */
5881 count++;
5883 /* ( */
5884 if (*endp != ')')
5885 fatal_error ("malformed spec function arguments");
5886 args = save_string (p, endp - p);
5887 p = ++endp;
5889 /* p now points to just past the end of the spec function expression. */
5891 funcval = eval_spec_function (func, args);
5892 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5893 p = NULL;
5895 free (func);
5896 free (args);
5898 processing_spec_function--;
5900 return p;
5903 /* Inline subroutine of handle_braces. Returns true if the current
5904 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5905 static inline bool
5906 input_suffix_matches (const char *atom, const char *end_atom)
5908 return (input_suffix
5909 && !strncmp (input_suffix, atom, end_atom - atom)
5910 && input_suffix[end_atom - atom] == '\0');
5913 /* Subroutine of handle_braces. Returns true if the current
5914 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
5915 static bool
5916 input_spec_matches (const char *atom, const char *end_atom)
5918 return (input_file_compiler
5919 && input_file_compiler->suffix
5920 && input_file_compiler->suffix[0] != '\0'
5921 && !strncmp (input_file_compiler->suffix + 1, atom,
5922 end_atom - atom)
5923 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
5926 /* Subroutine of handle_braces. Returns true if a switch
5927 matching the atom bracketed by ATOM and END_ATOM appeared on the
5928 command line. */
5929 static bool
5930 switch_matches (const char *atom, const char *end_atom, int starred)
5932 int i;
5933 int len = end_atom - atom;
5934 int plen = starred ? len : -1;
5936 for (i = 0; i < n_switches; i++)
5937 if (!strncmp (switches[i].part1, atom, len)
5938 && (starred || switches[i].part1[len] == '\0')
5939 && check_live_switch (i, plen))
5940 return true;
5942 return false;
5945 /* Inline subroutine of handle_braces. Mark all of the switches which
5946 match ATOM (extends to END_ATOM; STARRED indicates whether there
5947 was a star after the atom) for later processing. */
5948 static inline void
5949 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5951 int i;
5952 int len = end_atom - atom;
5953 int plen = starred ? len : -1;
5955 for (i = 0; i < n_switches; i++)
5956 if (!strncmp (switches[i].part1, atom, len)
5957 && (starred || switches[i].part1[len] == '\0')
5958 && check_live_switch (i, plen))
5959 switches[i].ordering = 1;
5962 /* Inline subroutine of handle_braces. Process all the currently
5963 marked switches through give_switch, and clear the marks. */
5964 static inline void
5965 process_marked_switches (void)
5967 int i;
5969 for (i = 0; i < n_switches; i++)
5970 if (switches[i].ordering == 1)
5972 switches[i].ordering = 0;
5973 give_switch (i, 0);
5977 /* Handle a %{ ... } construct. P points just inside the leading {.
5978 Returns a pointer one past the end of the brace block, or 0
5979 if we call do_spec_1 and that returns -1. */
5981 static const char *
5982 handle_braces (const char *p)
5984 const char *atom, *end_atom;
5985 const char *d_atom = NULL, *d_end_atom = NULL;
5986 const char *orig = p;
5988 bool a_is_suffix;
5989 bool a_is_spectype;
5990 bool a_is_starred;
5991 bool a_is_negated;
5992 bool a_matched;
5994 bool a_must_be_last = false;
5995 bool ordered_set = false;
5996 bool disjunct_set = false;
5997 bool disj_matched = false;
5998 bool disj_starred = true;
5999 bool n_way_choice = false;
6000 bool n_way_matched = false;
6002 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6006 if (a_must_be_last)
6007 goto invalid;
6009 /* Scan one "atom" (S in the description above of %{}, possibly
6010 with '!', '.', '@', ',', or '*' modifiers). */
6011 a_matched = false;
6012 a_is_suffix = false;
6013 a_is_starred = false;
6014 a_is_negated = false;
6015 a_is_spectype = false;
6017 SKIP_WHITE();
6018 if (*p == '!')
6019 p++, a_is_negated = true;
6021 SKIP_WHITE();
6022 if (*p == '.')
6023 p++, a_is_suffix = true;
6024 else if (*p == ',')
6025 p++, a_is_spectype = true;
6027 atom = p;
6028 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
6029 || *p == ',' || *p == '.' || *p == '@')
6030 p++;
6031 end_atom = p;
6033 if (*p == '*')
6034 p++, a_is_starred = 1;
6036 SKIP_WHITE();
6037 switch (*p)
6039 case '&': case '}':
6040 /* Substitute the switch(es) indicated by the current atom. */
6041 ordered_set = true;
6042 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
6043 || a_is_spectype || atom == end_atom)
6044 goto invalid;
6046 mark_matching_switches (atom, end_atom, a_is_starred);
6048 if (*p == '}')
6049 process_marked_switches ();
6050 break;
6052 case '|': case ':':
6053 /* Substitute some text if the current atom appears as a switch
6054 or suffix. */
6055 disjunct_set = true;
6056 if (ordered_set)
6057 goto invalid;
6059 if (atom == end_atom)
6061 if (!n_way_choice || disj_matched || *p == '|'
6062 || a_is_negated || a_is_suffix || a_is_spectype
6063 || a_is_starred)
6064 goto invalid;
6066 /* An empty term may appear as the last choice of an
6067 N-way choice set; it means "otherwise". */
6068 a_must_be_last = true;
6069 disj_matched = !n_way_matched;
6070 disj_starred = false;
6072 else
6074 if ((a_is_suffix || a_is_spectype) && a_is_starred)
6075 goto invalid;
6077 if (!a_is_starred)
6078 disj_starred = false;
6080 /* Don't bother testing this atom if we already have a
6081 match. */
6082 if (!disj_matched && !n_way_matched)
6084 if (a_is_suffix)
6085 a_matched = input_suffix_matches (atom, end_atom);
6086 else if (a_is_spectype)
6087 a_matched = input_spec_matches (atom, end_atom);
6088 else
6089 a_matched = switch_matches (atom, end_atom, a_is_starred);
6091 if (a_matched != a_is_negated)
6093 disj_matched = true;
6094 d_atom = atom;
6095 d_end_atom = end_atom;
6100 if (*p == ':')
6102 /* Found the body, that is, the text to substitute if the
6103 current disjunction matches. */
6104 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
6105 disj_matched && !n_way_matched);
6106 if (p == 0)
6107 return 0;
6109 /* If we have an N-way choice, reset state for the next
6110 disjunction. */
6111 if (*p == ';')
6113 n_way_choice = true;
6114 n_way_matched |= disj_matched;
6115 disj_matched = false;
6116 disj_starred = true;
6117 d_atom = d_end_atom = NULL;
6120 break;
6122 default:
6123 goto invalid;
6126 while (*p++ != '}');
6128 return p;
6130 invalid:
6131 fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
6133 #undef SKIP_WHITE
6136 /* Subroutine of handle_braces. Scan and process a brace substitution body
6137 (X in the description of %{} syntax). P points one past the colon;
6138 ATOM and END_ATOM bracket the first atom which was found to be true
6139 (present) in the current disjunction; STARRED indicates whether all
6140 the atoms in the current disjunction were starred (for syntax validation);
6141 MATCHED indicates whether the disjunction matched or not, and therefore
6142 whether or not the body is to be processed through do_spec_1 or just
6143 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
6144 returns -1. */
6146 static const char *
6147 process_brace_body (const char *p, const char *atom, const char *end_atom,
6148 int starred, int matched)
6150 const char *body, *end_body;
6151 unsigned int nesting_level;
6152 bool have_subst = false;
6154 /* Locate the closing } or ;, honoring nested braces.
6155 Trim trailing whitespace. */
6156 body = p;
6157 nesting_level = 1;
6158 for (;;)
6160 if (*p == '{')
6161 nesting_level++;
6162 else if (*p == '}')
6164 if (!--nesting_level)
6165 break;
6167 else if (*p == ';' && nesting_level == 1)
6168 break;
6169 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
6170 have_subst = true;
6171 else if (*p == '\0')
6172 goto invalid;
6173 p++;
6176 end_body = p;
6177 while (end_body[-1] == ' ' || end_body[-1] == '\t')
6178 end_body--;
6180 if (have_subst && !starred)
6181 goto invalid;
6183 if (matched)
6185 /* Copy the substitution body to permanent storage and execute it.
6186 If have_subst is false, this is a simple matter of running the
6187 body through do_spec_1... */
6188 char *string = save_string (body, end_body - body);
6189 if (!have_subst)
6191 if (do_spec_1 (string, 0, NULL) < 0)
6192 return 0;
6194 else
6196 /* ... but if have_subst is true, we have to process the
6197 body once for each matching switch, with %* set to the
6198 variant part of the switch. */
6199 unsigned int hard_match_len = end_atom - atom;
6200 int i;
6202 for (i = 0; i < n_switches; i++)
6203 if (!strncmp (switches[i].part1, atom, hard_match_len)
6204 && check_live_switch (i, hard_match_len))
6206 if (do_spec_1 (string, 0,
6207 &switches[i].part1[hard_match_len]) < 0)
6208 return 0;
6209 /* Pass any arguments this switch has. */
6210 give_switch (i, 1);
6211 suffix_subst = NULL;
6216 return p;
6218 invalid:
6219 fatal_error ("braced spec body %qs is invalid", body);
6222 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6223 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
6224 spec, or -1 if either exact match or %* is used.
6226 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
6227 whose value does not begin with "no-" is obsoleted by the same value
6228 with the "no-", similarly for a switch with the "no-" prefix. */
6230 static int
6231 check_live_switch (int switchnum, int prefix_length)
6233 const char *name = switches[switchnum].part1;
6234 int i;
6236 /* If we already processed this switch and determined if it was
6237 live or not, return our past determination. */
6238 if (switches[switchnum].live_cond != 0)
6239 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6240 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
6241 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6242 == 0);
6244 /* In the common case of {<at-most-one-letter>*}, a negating
6245 switch would always match, so ignore that case. We will just
6246 send the conflicting switches to the compiler phase. */
6247 if (prefix_length >= 0 && prefix_length <= 1)
6248 return 1;
6250 /* Now search for duplicate in a manner that depends on the name. */
6251 switch (*name)
6253 case 'O':
6254 for (i = switchnum + 1; i < n_switches; i++)
6255 if (switches[i].part1[0] == 'O')
6257 switches[switchnum].validated = 1;
6258 switches[switchnum].live_cond = SWITCH_FALSE;
6259 return 0;
6261 break;
6263 case 'W': case 'f': case 'm':
6264 if (! strncmp (name + 1, "no-", 3))
6266 /* We have Xno-YYY, search for XYYY. */
6267 for (i = switchnum + 1; i < n_switches; i++)
6268 if (switches[i].part1[0] == name[0]
6269 && ! strcmp (&switches[i].part1[1], &name[4]))
6271 switches[switchnum].validated = 1;
6272 switches[switchnum].live_cond = SWITCH_FALSE;
6273 return 0;
6276 else
6278 /* We have XYYY, search for Xno-YYY. */
6279 for (i = switchnum + 1; i < n_switches; i++)
6280 if (switches[i].part1[0] == name[0]
6281 && switches[i].part1[1] == 'n'
6282 && switches[i].part1[2] == 'o'
6283 && switches[i].part1[3] == '-'
6284 && !strcmp (&switches[i].part1[4], &name[1]))
6286 switches[switchnum].validated = 1;
6287 switches[switchnum].live_cond = SWITCH_FALSE;
6288 return 0;
6291 break;
6294 /* Otherwise the switch is live. */
6295 switches[switchnum].live_cond |= SWITCH_LIVE;
6296 return 1;
6299 /* Pass a switch to the current accumulating command
6300 in the same form that we received it.
6301 SWITCHNUM identifies the switch; it is an index into
6302 the vector of switches gcc received, which is `switches'.
6303 This cannot fail since it never finishes a command line.
6305 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6307 static void
6308 give_switch (int switchnum, int omit_first_word)
6310 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6311 return;
6313 if (!omit_first_word)
6315 do_spec_1 ("-", 0, NULL);
6316 do_spec_1 (switches[switchnum].part1, 1, NULL);
6319 if (switches[switchnum].args != 0)
6321 const char **p;
6322 for (p = switches[switchnum].args; *p; p++)
6324 const char *arg = *p;
6326 do_spec_1 (" ", 0, NULL);
6327 if (suffix_subst)
6329 unsigned length = strlen (arg);
6330 int dot = 0;
6332 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6333 if (arg[length] == '.')
6335 (CONST_CAST(char *, arg))[length] = 0;
6336 dot = 1;
6337 break;
6339 do_spec_1 (arg, 1, NULL);
6340 if (dot)
6341 (CONST_CAST(char *, arg))[length] = '.';
6342 do_spec_1 (suffix_subst, 1, NULL);
6344 else
6345 do_spec_1 (arg, 1, NULL);
6349 do_spec_1 (" ", 0, NULL);
6350 switches[switchnum].validated = 1;
6353 /* Search for a file named NAME trying various prefixes including the
6354 user's -B prefix and some standard ones.
6355 Return the absolute file name found. If nothing is found, return NAME. */
6357 static const char *
6358 find_file (const char *name)
6360 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6361 return newname ? newname : name;
6364 /* Determine whether a directory exists. If LINKER, return 0 for
6365 certain fixed names not needed by the linker. */
6367 static int
6368 is_directory (const char *path1, bool linker)
6370 int len1;
6371 char *path;
6372 char *cp;
6373 struct stat st;
6375 /* Ensure the string ends with "/.". The resulting path will be a
6376 directory even if the given path is a symbolic link. */
6377 len1 = strlen (path1);
6378 path = (char *) alloca (3 + len1);
6379 memcpy (path, path1, len1);
6380 cp = path + len1;
6381 if (!IS_DIR_SEPARATOR (cp[-1]))
6382 *cp++ = DIR_SEPARATOR;
6383 *cp++ = '.';
6384 *cp = '\0';
6386 /* Exclude directories that the linker is known to search. */
6387 if (linker
6388 && IS_DIR_SEPARATOR (path[0])
6389 && ((cp - path == 6
6390 && strncmp (path + 1, "lib", 3) == 0)
6391 || (cp - path == 10
6392 && strncmp (path + 1, "usr", 3) == 0
6393 && IS_DIR_SEPARATOR (path[4])
6394 && strncmp (path + 5, "lib", 3) == 0)))
6395 return 0;
6397 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6400 /* Set up the various global variables to indicate that we're processing
6401 the input file named FILENAME. */
6403 void
6404 set_input (const char *filename)
6406 const char *p;
6408 gcc_input_filename = filename;
6409 input_filename_length = strlen (gcc_input_filename);
6410 input_basename = lbasename (gcc_input_filename);
6412 /* Find a suffix starting with the last period,
6413 and set basename_length to exclude that suffix. */
6414 basename_length = strlen (input_basename);
6415 suffixed_basename_length = basename_length;
6416 p = input_basename + basename_length;
6417 while (p != input_basename && *p != '.')
6418 --p;
6419 if (*p == '.' && p != input_basename)
6421 basename_length = p - input_basename;
6422 input_suffix = p + 1;
6424 else
6425 input_suffix = "";
6427 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6428 we will need to do a stat on the gcc_input_filename. The
6429 INPUT_STAT_SET signals that the stat is needed. */
6430 input_stat_set = 0;
6433 /* On fatal signals, delete all the temporary files. */
6435 static void
6436 fatal_signal (int signum)
6438 signal (signum, SIG_DFL);
6439 delete_failure_queue ();
6440 delete_temp_files ();
6441 /* Get the same signal again, this time not handled,
6442 so its normal effect occurs. */
6443 kill (getpid (), signum);
6446 /* Compare the contents of the two files named CMPFILE[0] and
6447 CMPFILE[1]. Return zero if they're identical, nonzero
6448 otherwise. */
6450 static int
6451 compare_files (char *cmpfile[])
6453 int ret = 0;
6454 FILE *temp[2] = { NULL, NULL };
6455 int i;
6457 #if HAVE_MMAP_FILE
6459 size_t length[2];
6460 void *map[2] = { NULL, NULL };
6462 for (i = 0; i < 2; i++)
6464 struct stat st;
6466 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6468 error ("%s: could not determine length of compare-debug file %s",
6469 gcc_input_filename, cmpfile[i]);
6470 ret = 1;
6471 break;
6474 length[i] = st.st_size;
6477 if (!ret && length[0] != length[1])
6479 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
6480 ret = 1;
6483 if (!ret)
6484 for (i = 0; i < 2; i++)
6486 int fd = open (cmpfile[i], O_RDONLY);
6487 if (fd < 0)
6489 error ("%s: could not open compare-debug file %s",
6490 gcc_input_filename, cmpfile[i]);
6491 ret = 1;
6492 break;
6495 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6496 close (fd);
6498 if (map[i] == (void *) MAP_FAILED)
6500 ret = -1;
6501 break;
6505 if (!ret)
6507 if (memcmp (map[0], map[1], length[0]) != 0)
6509 error ("%s: -fcompare-debug failure", gcc_input_filename);
6510 ret = 1;
6514 for (i = 0; i < 2; i++)
6515 if (map[i])
6516 munmap ((caddr_t) map[i], length[i]);
6518 if (ret >= 0)
6519 return ret;
6521 ret = 0;
6523 #endif
6525 for (i = 0; i < 2; i++)
6527 temp[i] = fopen (cmpfile[i], "r");
6528 if (!temp[i])
6530 error ("%s: could not open compare-debug file %s",
6531 gcc_input_filename, cmpfile[i]);
6532 ret = 1;
6533 break;
6537 if (!ret && temp[0] && temp[1])
6538 for (;;)
6540 int c0, c1;
6541 c0 = fgetc (temp[0]);
6542 c1 = fgetc (temp[1]);
6544 if (c0 != c1)
6546 error ("%s: -fcompare-debug failure",
6547 gcc_input_filename);
6548 ret = 1;
6549 break;
6552 if (c0 == EOF)
6553 break;
6556 for (i = 1; i >= 0; i--)
6558 if (temp[i])
6559 fclose (temp[i]);
6562 return ret;
6565 extern int main (int, char **);
6568 main (int argc, char **argv)
6570 size_t i;
6571 int value;
6572 int linker_was_run = 0;
6573 int lang_n_infiles = 0;
6574 int num_linker_inputs = 0;
6575 char *explicit_link_files;
6576 char *specs_file;
6577 const char *p;
6578 struct user_specs *uptr;
6579 char **old_argv = argv;
6581 /* Initialize here, not in definition. The IRIX 6 O32 cc sometimes chokes
6582 on ?: in file-scope variable initializations. */
6583 asm_debug = ASM_DEBUG_SPEC;
6585 p = argv[0] + strlen (argv[0]);
6586 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6587 --p;
6588 progname = p;
6590 xmalloc_set_program_name (progname);
6592 expandargv (&argc, &argv);
6594 /* Determine if any expansions were made. */
6595 if (argv != old_argv)
6596 at_file_supplied = true;
6598 prune_options (&argc, &argv);
6600 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6601 /* Perform host dependent initialization when needed. */
6602 GCC_DRIVER_HOST_INITIALIZATION;
6603 #endif
6605 /* Unlock the stdio streams. */
6606 unlock_std_streams ();
6608 gcc_init_libintl ();
6610 diagnostic_initialize (global_dc, 0);
6611 if (atexit (delete_temp_files) != 0)
6612 fatal_error ("atexit failed");
6614 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6615 signal (SIGINT, fatal_signal);
6616 #ifdef SIGHUP
6617 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6618 signal (SIGHUP, fatal_signal);
6619 #endif
6620 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6621 signal (SIGTERM, fatal_signal);
6622 #ifdef SIGPIPE
6623 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6624 signal (SIGPIPE, fatal_signal);
6625 #endif
6626 #ifdef SIGCHLD
6627 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6628 receive the signal. A different setting is inheritable */
6629 signal (SIGCHLD, SIG_DFL);
6630 #endif
6632 /* Allocate the argument vector. */
6633 alloc_args ();
6635 obstack_init (&obstack);
6637 /* Build multilib_select, et. al from the separate lines that make up each
6638 multilib selection. */
6640 const char *const *q = multilib_raw;
6641 int need_space;
6643 obstack_init (&multilib_obstack);
6644 while ((p = *q++) != (char *) 0)
6645 obstack_grow (&multilib_obstack, p, strlen (p));
6647 obstack_1grow (&multilib_obstack, 0);
6648 multilib_select = XOBFINISH (&multilib_obstack, const char *);
6650 q = multilib_matches_raw;
6651 while ((p = *q++) != (char *) 0)
6652 obstack_grow (&multilib_obstack, p, strlen (p));
6654 obstack_1grow (&multilib_obstack, 0);
6655 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6657 q = multilib_exclusions_raw;
6658 while ((p = *q++) != (char *) 0)
6659 obstack_grow (&multilib_obstack, p, strlen (p));
6661 obstack_1grow (&multilib_obstack, 0);
6662 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6664 need_space = FALSE;
6665 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6667 if (need_space)
6668 obstack_1grow (&multilib_obstack, ' ');
6669 obstack_grow (&multilib_obstack,
6670 multilib_defaults_raw[i],
6671 strlen (multilib_defaults_raw[i]));
6672 need_space = TRUE;
6675 obstack_1grow (&multilib_obstack, 0);
6676 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6679 #ifdef INIT_ENVIRONMENT
6680 /* Set up any other necessary machine specific environment variables. */
6681 xputenv (INIT_ENVIRONMENT);
6682 #endif
6684 /* Make a table of what switches there are (switches, n_switches).
6685 Make a table of specified input files (infiles, n_infiles).
6686 Decode switches that are handled locally. */
6688 process_command (argc, CONST_CAST2 (const char **, char **, argv));
6690 /* Initialize the vector of specs to just the default.
6691 This means one element containing 0s, as a terminator. */
6693 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
6694 memcpy (compilers, default_compilers, sizeof default_compilers);
6695 n_compilers = n_default_compilers;
6697 /* Read specs from a file if there is one. */
6699 machine_suffix = concat (spec_machine, dir_separator_str,
6700 spec_version, dir_separator_str, NULL);
6701 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6703 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
6704 /* Read the specs file unless it is a default one. */
6705 if (specs_file != 0 && strcmp (specs_file, "specs"))
6706 read_specs (specs_file, TRUE);
6707 else
6708 init_spec ();
6710 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6711 for any override of as, ld and libraries. */
6712 specs_file = (char *) alloca (strlen (standard_exec_prefix)
6713 + strlen (just_machine_suffix) + sizeof ("specs"));
6715 strcpy (specs_file, standard_exec_prefix);
6716 strcat (specs_file, just_machine_suffix);
6717 strcat (specs_file, "specs");
6718 if (access (specs_file, R_OK) == 0)
6719 read_specs (specs_file, TRUE);
6721 /* Process any configure-time defaults specified for the command line
6722 options, via OPTION_DEFAULT_SPECS. */
6723 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6724 do_option_spec (option_default_specs[i].name,
6725 option_default_specs[i].spec);
6727 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6728 of the command line. */
6730 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6731 do_self_spec (driver_self_specs[i]);
6733 if (compare_debug)
6735 enum save_temps save;
6737 if (!compare_debug_second)
6739 n_switches_debug_check[1] = n_switches;
6740 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
6741 n_switches + 1);
6743 do_self_spec ("%:compare-debug-self-opt()");
6744 n_switches_debug_check[0] = n_switches;
6745 switches_debug_check[0] = switches;
6747 n_switches = n_switches_debug_check[1];
6748 switches = switches_debug_check[1];
6751 /* Avoid crash when computing %j in this early. */
6752 save = save_temps_flag;
6753 save_temps_flag = SAVE_TEMPS_NONE;
6755 compare_debug = -compare_debug;
6756 do_self_spec ("%:compare-debug-self-opt()");
6758 save_temps_flag = save;
6760 if (!compare_debug_second)
6762 n_switches_debug_check[1] = n_switches;
6763 switches_debug_check[1] = switches;
6764 compare_debug = -compare_debug;
6765 n_switches = n_switches_debug_check[0];
6766 switches = switches_debug_check[0];
6770 /* If not cross-compiling, look for executables in the standard
6771 places. */
6772 if (*cross_compile == '0')
6774 if (*md_exec_prefix)
6776 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6777 PREFIX_PRIORITY_LAST, 0, 0);
6781 /* Process sysroot_suffix_spec. */
6782 if (*sysroot_suffix_spec != 0
6783 && do_spec_2 (sysroot_suffix_spec) == 0)
6785 if (argbuf_index > 1)
6786 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6787 else if (argbuf_index == 1)
6788 target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6791 #ifdef HAVE_LD_SYSROOT
6792 /* Pass the --sysroot option to the linker, if it supports that. If
6793 there is a sysroot_suffix_spec, it has already been processed by
6794 this point, so target_system_root really is the system root we
6795 should be using. */
6796 if (target_system_root)
6798 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6799 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6800 set_spec ("link", XOBFINISH (&obstack, const char *));
6802 #endif
6804 /* Process sysroot_hdrs_suffix_spec. */
6805 if (*sysroot_hdrs_suffix_spec != 0
6806 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6808 if (argbuf_index > 1)
6809 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6810 else if (argbuf_index == 1)
6811 target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6814 /* Look for startfiles in the standard places. */
6815 if (*startfile_prefix_spec != 0
6816 && do_spec_2 (startfile_prefix_spec) == 0
6817 && do_spec_1 (" ", 0, NULL) == 0)
6819 int ndx;
6820 for (ndx = 0; ndx < argbuf_index; ndx++)
6821 add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6822 PREFIX_PRIORITY_LAST, 0, 1);
6824 /* We should eventually get rid of all these and stick to
6825 startfile_prefix_spec exclusively. */
6826 else if (*cross_compile == '0' || target_system_root)
6828 if (*md_startfile_prefix)
6829 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6830 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6832 if (*md_startfile_prefix_1)
6833 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6834 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6836 /* If standard_startfile_prefix is relative, base it on
6837 standard_exec_prefix. This lets us move the installed tree
6838 as a unit. If GCC_EXEC_PREFIX is defined, base
6839 standard_startfile_prefix on that as well.
6841 If the prefix is relative, only search it for native compilers;
6842 otherwise we will search a directory containing host libraries. */
6843 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6844 add_sysrooted_prefix (&startfile_prefixes,
6845 standard_startfile_prefix, "BINUTILS",
6846 PREFIX_PRIORITY_LAST, 0, 1);
6847 else if (*cross_compile == '0')
6849 add_prefix (&startfile_prefixes,
6850 concat (gcc_exec_prefix
6851 ? gcc_exec_prefix : standard_exec_prefix,
6852 machine_suffix,
6853 standard_startfile_prefix, NULL),
6854 NULL, PREFIX_PRIORITY_LAST, 0, 1);
6857 /* Sysrooted prefixes are relocated because target_system_root is
6858 also relocated by gcc_exec_prefix. */
6859 if (*standard_startfile_prefix_1)
6860 add_sysrooted_prefix (&startfile_prefixes,
6861 standard_startfile_prefix_1, "BINUTILS",
6862 PREFIX_PRIORITY_LAST, 0, 1);
6863 if (*standard_startfile_prefix_2)
6864 add_sysrooted_prefix (&startfile_prefixes,
6865 standard_startfile_prefix_2, "BINUTILS",
6866 PREFIX_PRIORITY_LAST, 0, 1);
6869 /* Process any user specified specs in the order given on the command
6870 line. */
6871 for (uptr = user_specs_head; uptr; uptr = uptr->next)
6873 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6874 R_OK, true);
6875 read_specs (filename ? filename : uptr->filename, FALSE);
6878 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
6879 if (gcc_exec_prefix)
6880 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6881 spec_version, dir_separator_str, NULL);
6883 /* Now we have the specs.
6884 Set the `valid' bits for switches that match anything in any spec. */
6886 validate_all_switches ();
6888 /* Now that we have the switches and the specs, set
6889 the subdirectory based on the options. */
6890 set_multilib_dir ();
6892 /* Set up to remember the pathname of gcc and any options
6893 needed for collect. We use argv[0] instead of progname because
6894 we need the complete pathname. */
6895 obstack_init (&collect_obstack);
6896 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6897 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6898 xputenv (XOBFINISH (&collect_obstack, char *));
6900 /* Set up to remember the pathname of the lto wrapper. */
6902 lto_wrapper_spec = find_a_file (&exec_prefixes, "lto-wrapper", X_OK, false);
6903 if (lto_wrapper_spec)
6905 obstack_init (&collect_obstack);
6906 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
6907 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
6908 obstack_grow (&collect_obstack, lto_wrapper_spec,
6909 strlen (lto_wrapper_spec) + 1);
6910 xputenv (XOBFINISH (&collect_obstack, char *));
6913 /* Warn about any switches that no pass was interested in. */
6915 for (i = 0; (int) i < n_switches; i++)
6916 if (! switches[i].validated)
6917 error ("unrecognized option %<-%s%>", switches[i].part1);
6919 /* Obey some of the options. */
6921 if (print_search_dirs)
6923 printf (_("install: %s%s\n"),
6924 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
6925 gcc_exec_prefix ? "" : machine_suffix);
6926 printf (_("programs: %s\n"),
6927 build_search_list (&exec_prefixes, "", false, false));
6928 printf (_("libraries: %s\n"),
6929 build_search_list (&startfile_prefixes, "", false, true));
6930 return (0);
6933 if (print_file_name)
6935 printf ("%s\n", find_file (print_file_name));
6936 return (0);
6939 if (print_prog_name)
6941 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6942 printf ("%s\n", (newname ? newname : print_prog_name));
6943 return (0);
6946 if (print_multi_lib)
6948 print_multilib_info ();
6949 return (0);
6952 if (print_multi_directory)
6954 if (multilib_dir == NULL)
6955 printf (".\n");
6956 else
6957 printf ("%s\n", multilib_dir);
6958 return (0);
6961 if (print_sysroot)
6963 if (target_system_root)
6965 if (target_sysroot_suffix)
6966 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
6967 else
6968 printf ("%s\n", target_system_root);
6970 return (0);
6973 if (print_multi_os_directory)
6975 if (multilib_os_dir == NULL)
6976 printf (".\n");
6977 else
6978 printf ("%s\n", multilib_os_dir);
6979 return (0);
6982 if (print_sysroot_headers_suffix)
6984 if (*sysroot_hdrs_suffix_spec)
6986 printf("%s\n", (target_sysroot_hdrs_suffix
6987 ? target_sysroot_hdrs_suffix
6988 : ""));
6989 return (0);
6991 else
6992 /* The error status indicates that only one set of fixed
6993 headers should be built. */
6994 fatal_error ("not configured with sysroot headers suffix");
6997 if (print_help_list)
6999 display_help ();
7001 if (! verbose_flag)
7003 printf (_("\nFor bug reporting instructions, please see:\n"));
7004 printf ("%s.\n", bug_report_url);
7006 return (0);
7009 /* We do not exit here. Instead we have created a fake input file
7010 called 'help-dummy' which needs to be compiled, and we pass this
7011 on the various sub-processes, along with the --help switch.
7012 Ensure their output appears after ours. */
7013 fputc ('\n', stdout);
7014 fflush (stdout);
7017 if (print_version)
7019 printf (_("%s %s%s\n"), progname, pkgversion_string,
7020 version_string);
7021 printf ("Copyright %s 2010 Free Software Foundation, Inc.\n",
7022 _("(C)"));
7023 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
7024 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
7025 stdout);
7026 if (! verbose_flag)
7027 return 0;
7029 /* We do not exit here. We use the same mechanism of --help to print
7030 the version of the sub-processes. */
7031 fputc ('\n', stdout);
7032 fflush (stdout);
7035 if (verbose_flag)
7037 int n;
7038 const char *thrmod;
7040 fnotice (stderr, "Target: %s\n", spec_machine);
7041 fnotice (stderr, "Configured with: %s\n", configuration_arguments);
7043 #ifdef THREAD_MODEL_SPEC
7044 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7045 but there's no point in doing all this processing just to get
7046 thread_model back. */
7047 obstack_init (&obstack);
7048 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
7049 obstack_1grow (&obstack, '\0');
7050 thrmod = XOBFINISH (&obstack, const char *);
7051 #else
7052 thrmod = thread_model;
7053 #endif
7055 fnotice (stderr, "Thread model: %s\n", thrmod);
7057 /* compiler_version is truncated at the first space when initialized
7058 from version string, so truncate version_string at the first space
7059 before comparing. */
7060 for (n = 0; version_string[n]; n++)
7061 if (version_string[n] == ' ')
7062 break;
7064 if (! strncmp (version_string, compiler_version, n)
7065 && compiler_version[n] == 0)
7066 fnotice (stderr, "gcc version %s %s\n", version_string,
7067 pkgversion_string);
7068 else
7069 fnotice (stderr, "gcc driver version %s %sexecuting gcc version %s\n",
7070 version_string, pkgversion_string, compiler_version);
7072 if (n_infiles == 0)
7073 return (0);
7076 if (n_infiles == added_libraries)
7077 fatal_error ("no input files");
7079 /* Make a place to record the compiler output file names
7080 that correspond to the input files. */
7082 i = n_infiles;
7083 i += lang_specific_extra_outfiles;
7084 outfiles = XCNEWVEC (const char *, i);
7086 /* Record which files were specified explicitly as link input. */
7088 explicit_link_files = XCNEWVEC (char, n_infiles);
7090 if (combine_flag)
7091 combine_inputs = true;
7092 else
7093 combine_inputs = false;
7095 for (i = 0; (int) i < n_infiles; i++)
7097 const char *name = infiles[i].name;
7098 struct compiler *compiler = lookup_compiler (name,
7099 strlen (name),
7100 infiles[i].language);
7102 if (compiler && !(compiler->combinable))
7103 combine_inputs = false;
7105 if (lang_n_infiles > 0 && compiler != input_file_compiler
7106 && infiles[i].language && infiles[i].language[0] != '*')
7107 infiles[i].incompiler = compiler;
7108 else if (compiler)
7110 lang_n_infiles++;
7111 input_file_compiler = compiler;
7112 infiles[i].incompiler = compiler;
7114 else
7116 /* Since there is no compiler for this input file, assume it is a
7117 linker file. */
7118 explicit_link_files[i] = 1;
7119 infiles[i].incompiler = NULL;
7121 infiles[i].compiled = false;
7122 infiles[i].preprocessed = false;
7125 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
7126 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
7128 if (combine_flag && save_temps_flag)
7130 bool save_combine_inputs = combine_inputs;
7131 /* Must do a separate pre-processing pass for C & Objective-C files, to
7132 obtain individual .i files. */
7134 combine_inputs = false;
7135 for (i = 0; (int) i < n_infiles; i++)
7137 int this_file_error = 0;
7139 input_file_number = i;
7140 set_input (infiles[i].name);
7141 if (infiles[i].incompiler
7142 && (infiles[i].incompiler)->needs_preprocessing)
7143 input_file_compiler = infiles[i].incompiler;
7144 else
7145 continue;
7147 if (input_file_compiler)
7149 if (input_file_compiler->spec[0] == '#')
7151 error ("%s: %s compiler not installed on this system",
7152 gcc_input_filename, &input_file_compiler->spec[1]);
7153 this_file_error = 1;
7155 else
7157 value = do_spec (input_file_compiler->spec);
7158 infiles[i].preprocessed = true;
7159 if (!have_o_argbuf_index)
7160 fatal_error ("spec %qs is invalid",
7161 input_file_compiler->spec);
7162 infiles[i].name = argbuf[have_o_argbuf_index];
7163 infiles[i].incompiler
7164 = lookup_compiler (infiles[i].name,
7165 strlen (infiles[i].name),
7166 infiles[i].language);
7168 if (value < 0)
7169 this_file_error = 1;
7173 if (this_file_error)
7175 delete_failure_queue ();
7176 errorcount++;
7177 break;
7179 clear_failure_queue ();
7181 combine_inputs = save_combine_inputs;
7184 for (i = 0; (int) i < n_infiles; i++)
7186 int this_file_error = 0;
7188 /* Tell do_spec what to substitute for %i. */
7190 input_file_number = i;
7191 set_input (infiles[i].name);
7193 if (infiles[i].compiled)
7194 continue;
7196 /* Use the same thing in %o, unless cp->spec says otherwise. */
7198 outfiles[i] = gcc_input_filename;
7200 /* Figure out which compiler from the file's suffix. */
7202 if (! combine_inputs)
7203 input_file_compiler
7204 = lookup_compiler (infiles[i].name, input_filename_length,
7205 infiles[i].language);
7206 else
7207 input_file_compiler = infiles[i].incompiler;
7209 if (input_file_compiler)
7211 /* Ok, we found an applicable compiler. Run its spec. */
7213 if (input_file_compiler->spec[0] == '#')
7215 error ("%s: %s compiler not installed on this system",
7216 gcc_input_filename, &input_file_compiler->spec[1]);
7217 this_file_error = 1;
7219 else
7221 if (compare_debug)
7223 if (debug_check_temp_file[0])
7224 free (debug_check_temp_file[0]);
7225 debug_check_temp_file[0] = NULL;
7227 if (debug_check_temp_file[1])
7228 free (debug_check_temp_file[1]);
7229 debug_check_temp_file[1] = NULL;
7232 value = do_spec (input_file_compiler->spec);
7233 infiles[i].compiled = true;
7234 if (value < 0)
7235 this_file_error = 1;
7236 else if (compare_debug && debug_check_temp_file[0])
7238 if (verbose_flag)
7239 inform (0, "recompiling with -fcompare-debug");
7241 compare_debug = -compare_debug;
7242 n_switches = n_switches_debug_check[1];
7243 switches = switches_debug_check[1];
7245 value = do_spec (input_file_compiler->spec);
7247 compare_debug = -compare_debug;
7248 n_switches = n_switches_debug_check[0];
7249 switches = switches_debug_check[0];
7251 if (value < 0)
7253 error ("during -fcompare-debug recompilation");
7254 this_file_error = 1;
7257 gcc_assert (debug_check_temp_file[1]
7258 && strcmp (debug_check_temp_file[0],
7259 debug_check_temp_file[1]));
7261 if (verbose_flag)
7262 inform (0, "comparing final insns dumps");
7264 if (compare_files (debug_check_temp_file))
7265 this_file_error = 1;
7268 if (compare_debug)
7270 if (debug_check_temp_file[0])
7271 free (debug_check_temp_file[0]);
7272 debug_check_temp_file[0] = NULL;
7274 if (debug_check_temp_file[1])
7275 free (debug_check_temp_file[1]);
7276 debug_check_temp_file[1] = NULL;
7281 /* If this file's name does not contain a recognized suffix,
7282 record it as explicit linker input. */
7284 else
7285 explicit_link_files[i] = 1;
7287 /* Clear the delete-on-failure queue, deleting the files in it
7288 if this compilation failed. */
7290 if (this_file_error)
7292 delete_failure_queue ();
7293 errorcount++;
7295 /* If this compilation succeeded, don't delete those files later. */
7296 clear_failure_queue ();
7299 /* Reset the input file name to the first compile/object file name, for use
7300 with %b in LINK_SPEC. We use the first input file that we can find
7301 a compiler to compile it instead of using infiles.language since for
7302 languages other than C we use aliases that we then lookup later. */
7303 if (n_infiles > 0)
7305 int i;
7307 for (i = 0; i < n_infiles ; i++)
7308 if (infiles[i].language && infiles[i].language[0] != '*')
7310 set_input (infiles[i].name);
7311 break;
7315 if (!seen_error ())
7317 /* Make sure INPUT_FILE_NUMBER points to first available open
7318 slot. */
7319 input_file_number = n_infiles;
7320 if (lang_specific_pre_link ())
7321 errorcount++;
7324 /* Determine if there are any linker input files. */
7325 num_linker_inputs = 0;
7326 for (i = 0; (int) i < n_infiles; i++)
7327 if (explicit_link_files[i] || outfiles[i] != NULL)
7328 num_linker_inputs++;
7330 /* Run ld to link all the compiler output files. */
7332 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
7334 int tmp = execution_count;
7335 const char *fuse_linker_plugin = "fuse-linker-plugin";
7337 /* We'll use ld if we can't find collect2. */
7338 if (! strcmp (linker_name_spec, "collect2"))
7340 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7341 if (s == NULL)
7342 linker_name_spec = "ld";
7345 if (switch_matches (fuse_linker_plugin,
7346 fuse_linker_plugin + strlen (fuse_linker_plugin), 0))
7348 linker_plugin_file_spec = find_a_file (&exec_prefixes,
7349 "liblto_plugin.so", R_OK,
7350 false);
7351 if (!linker_plugin_file_spec)
7352 fatal_error ("-fuse-linker-plugin, but liblto_plugin.so not found");
7354 lto_libgcc_spec = find_a_file (&startfile_prefixes, "libgcc.a",
7355 R_OK, true);
7356 if (!lto_libgcc_spec)
7357 fatal_error ("could not find libgcc.a");
7359 lto_gcc_spec = argv[0];
7361 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7362 for collect. */
7363 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7364 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7366 if (print_subprocess_help == 1)
7368 printf (_("\nLinker options\n==============\n\n"));
7369 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7370 " to the linker.\n\n"));
7371 fflush (stdout);
7373 value = do_spec (link_command_spec);
7374 if (value < 0)
7375 errorcount = 1;
7376 linker_was_run = (tmp != execution_count);
7379 /* If options said don't run linker,
7380 complain about input files to be given to the linker. */
7382 if (! linker_was_run && !seen_error ())
7383 for (i = 0; (int) i < n_infiles; i++)
7384 if (explicit_link_files[i]
7385 && !(infiles[i].language && infiles[i].language[0] == '*'))
7386 warning (0, "%s: linker input file unused because linking not done",
7387 outfiles[i]);
7389 /* Delete some or all of the temporary files we made. */
7391 if (seen_error ())
7392 delete_failure_queue ();
7393 delete_temp_files ();
7395 if (print_help_list)
7397 printf (("\nFor bug reporting instructions, please see:\n"));
7398 printf ("%s\n", bug_report_url);
7401 return (signal_count != 0 ? 2
7402 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
7403 : 0);
7406 /* Find the proper compilation spec for the file name NAME,
7407 whose length is LENGTH. LANGUAGE is the specified language,
7408 or 0 if this file is to be passed to the linker. */
7410 static struct compiler *
7411 lookup_compiler (const char *name, size_t length, const char *language)
7413 struct compiler *cp;
7415 /* If this was specified by the user to be a linker input, indicate that. */
7416 if (language != 0 && language[0] == '*')
7417 return 0;
7419 /* Otherwise, look for the language, if one is spec'd. */
7420 if (language != 0)
7422 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7423 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7424 return cp;
7426 error ("language %s not recognized", language);
7427 return 0;
7430 /* Look for a suffix. */
7431 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7433 if (/* The suffix `-' matches only the file name `-'. */
7434 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7435 || (strlen (cp->suffix) < length
7436 /* See if the suffix matches the end of NAME. */
7437 && !strcmp (cp->suffix,
7438 name + length - strlen (cp->suffix))
7440 break;
7443 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7444 /* Look again, but case-insensitively this time. */
7445 if (cp < compilers)
7446 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7448 if (/* The suffix `-' matches only the file name `-'. */
7449 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7450 || (strlen (cp->suffix) < length
7451 /* See if the suffix matches the end of NAME. */
7452 && ((!strcmp (cp->suffix,
7453 name + length - strlen (cp->suffix))
7454 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7455 && !strcasecmp (cp->suffix,
7456 name + length - strlen (cp->suffix)))
7458 break;
7460 #endif
7462 if (cp >= compilers)
7464 if (cp->spec[0] != '@')
7465 /* A non-alias entry: return it. */
7466 return cp;
7468 /* An alias entry maps a suffix to a language.
7469 Search for the language; pass 0 for NAME and LENGTH
7470 to avoid infinite recursion if language not found. */
7471 return lookup_compiler (NULL, 0, cp->spec + 1);
7473 return 0;
7476 static char *
7477 save_string (const char *s, int len)
7479 char *result = XNEWVEC (char, len + 1);
7481 memcpy (result, s, len);
7482 result[len] = 0;
7483 return result;
7486 void
7487 pfatal_with_name (const char *name)
7489 perror_with_name (name);
7490 delete_temp_files ();
7491 exit (1);
7494 static void
7495 perror_with_name (const char *name)
7497 error ("%s: %m", name);
7500 static inline void
7501 validate_switches_from_spec (const char *spec)
7503 const char *p = spec;
7504 char c;
7505 while ((c = *p++))
7506 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7507 /* We have a switch spec. */
7508 p = validate_switches (p + 1);
7511 static void
7512 validate_all_switches (void)
7514 struct compiler *comp;
7515 struct spec_list *spec;
7517 for (comp = compilers; comp->spec; comp++)
7518 validate_switches_from_spec (comp->spec);
7520 /* Look through the linked list of specs read from the specs file. */
7521 for (spec = specs; spec; spec = spec->next)
7522 validate_switches_from_spec (*spec->ptr_spec);
7524 validate_switches_from_spec (link_command_spec);
7527 /* Look at the switch-name that comes after START
7528 and mark as valid all supplied switches that match it. */
7530 static const char *
7531 validate_switches (const char *start)
7533 const char *p = start;
7534 const char *atom;
7535 size_t len;
7536 int i;
7537 bool suffix = false;
7538 bool starred = false;
7540 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7542 next_member:
7543 SKIP_WHITE ();
7545 if (*p == '!')
7546 p++;
7548 SKIP_WHITE ();
7549 if (*p == '.' || *p == ',')
7550 suffix = true, p++;
7552 atom = p;
7553 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7554 || *p == ',' || *p == '.' || *p == '@')
7555 p++;
7556 len = p - atom;
7558 if (*p == '*')
7559 starred = true, p++;
7561 SKIP_WHITE ();
7563 if (!suffix)
7565 /* Mark all matching switches as valid. */
7566 for (i = 0; i < n_switches; i++)
7567 if (!strncmp (switches[i].part1, atom, len)
7568 && (starred || switches[i].part1[len] == 0))
7569 switches[i].validated = 1;
7572 if (*p) p++;
7573 if (*p && (p[-1] == '|' || p[-1] == '&'))
7574 goto next_member;
7576 if (*p && p[-1] == ':')
7578 while (*p && *p != ';' && *p != '}')
7580 if (*p == '%')
7582 p++;
7583 if (*p == '{' || *p == '<')
7584 p = validate_switches (p+1);
7585 else if (p[0] == 'W' && p[1] == '{')
7586 p = validate_switches (p+2);
7588 else
7589 p++;
7592 if (*p) p++;
7593 if (*p && p[-1] == ';')
7594 goto next_member;
7597 return p;
7598 #undef SKIP_WHITE
7601 struct mdswitchstr
7603 const char *str;
7604 int len;
7607 static struct mdswitchstr *mdswitches;
7608 static int n_mdswitches;
7610 /* Check whether a particular argument was used. The first time we
7611 canonicalize the switches to keep only the ones we care about. */
7613 static int
7614 used_arg (const char *p, int len)
7616 struct mswitchstr
7618 const char *str;
7619 const char *replace;
7620 int len;
7621 int rep_len;
7624 static struct mswitchstr *mswitches;
7625 static int n_mswitches;
7626 int i, j;
7628 if (!mswitches)
7630 struct mswitchstr *matches;
7631 const char *q;
7632 int cnt = 0;
7634 /* Break multilib_matches into the component strings of string
7635 and replacement string. */
7636 for (q = multilib_matches; *q != '\0'; q++)
7637 if (*q == ';')
7638 cnt++;
7640 matches
7641 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
7642 i = 0;
7643 q = multilib_matches;
7644 while (*q != '\0')
7646 matches[i].str = q;
7647 while (*q != ' ')
7649 if (*q == '\0')
7651 invalid_matches:
7652 fatal_error ("multilib spec %qs is invalid",
7653 multilib_matches);
7655 q++;
7657 matches[i].len = q - matches[i].str;
7659 matches[i].replace = ++q;
7660 while (*q != ';' && *q != '\0')
7662 if (*q == ' ')
7663 goto invalid_matches;
7664 q++;
7666 matches[i].rep_len = q - matches[i].replace;
7667 i++;
7668 if (*q == ';')
7669 q++;
7672 /* Now build a list of the replacement string for switches that we care
7673 about. Make sure we allocate at least one entry. This prevents
7674 xmalloc from calling fatal, and prevents us from re-executing this
7675 block of code. */
7676 mswitches
7677 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7678 for (i = 0; i < n_switches; i++)
7679 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
7681 int xlen = strlen (switches[i].part1);
7682 for (j = 0; j < cnt; j++)
7683 if (xlen == matches[j].len
7684 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7686 mswitches[n_mswitches].str = matches[j].replace;
7687 mswitches[n_mswitches].len = matches[j].rep_len;
7688 mswitches[n_mswitches].replace = (char *) 0;
7689 mswitches[n_mswitches].rep_len = 0;
7690 n_mswitches++;
7691 break;
7695 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7696 on the command line nor any options mutually incompatible with
7697 them. */
7698 for (i = 0; i < n_mdswitches; i++)
7700 const char *r;
7702 for (q = multilib_options; *q != '\0'; q++)
7704 while (*q == ' ')
7705 q++;
7707 r = q;
7708 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7709 || strchr (" /", q[mdswitches[i].len]) == NULL)
7711 while (*q != ' ' && *q != '/' && *q != '\0')
7712 q++;
7713 if (*q != '/')
7714 break;
7715 q++;
7718 if (*q != ' ' && *q != '\0')
7720 while (*r != ' ' && *r != '\0')
7722 q = r;
7723 while (*q != ' ' && *q != '/' && *q != '\0')
7724 q++;
7726 if (used_arg (r, q - r))
7727 break;
7729 if (*q != '/')
7731 mswitches[n_mswitches].str = mdswitches[i].str;
7732 mswitches[n_mswitches].len = mdswitches[i].len;
7733 mswitches[n_mswitches].replace = (char *) 0;
7734 mswitches[n_mswitches].rep_len = 0;
7735 n_mswitches++;
7736 break;
7739 r = q + 1;
7741 break;
7747 for (i = 0; i < n_mswitches; i++)
7748 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7749 return 1;
7751 return 0;
7754 static int
7755 default_arg (const char *p, int len)
7757 int i;
7759 for (i = 0; i < n_mdswitches; i++)
7760 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7761 return 1;
7763 return 0;
7766 /* Work out the subdirectory to use based on the options. The format of
7767 multilib_select is a list of elements. Each element is a subdirectory
7768 name followed by a list of options followed by a semicolon. The format
7769 of multilib_exclusions is the same, but without the preceding
7770 directory. First gcc will check the exclusions, if none of the options
7771 beginning with an exclamation point are present, and all of the other
7772 options are present, then we will ignore this completely. Passing
7773 that, gcc will consider each multilib_select in turn using the same
7774 rules for matching the options. If a match is found, that subdirectory
7775 will be used. */
7777 static void
7778 set_multilib_dir (void)
7780 const char *p;
7781 unsigned int this_path_len;
7782 const char *this_path, *this_arg;
7783 const char *start, *end;
7784 int not_arg;
7785 int ok, ndfltok, first;
7787 n_mdswitches = 0;
7788 start = multilib_defaults;
7789 while (*start == ' ' || *start == '\t')
7790 start++;
7791 while (*start != '\0')
7793 n_mdswitches++;
7794 while (*start != ' ' && *start != '\t' && *start != '\0')
7795 start++;
7796 while (*start == ' ' || *start == '\t')
7797 start++;
7800 if (n_mdswitches)
7802 int i = 0;
7804 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
7805 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7807 while (*start == ' ' || *start == '\t')
7808 start++;
7810 if (*start == '\0')
7811 break;
7813 for (end = start + 1;
7814 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7817 obstack_grow (&multilib_obstack, start, end - start);
7818 obstack_1grow (&multilib_obstack, 0);
7819 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
7820 mdswitches[i++].len = end - start;
7822 if (*end == '\0')
7823 break;
7827 p = multilib_exclusions;
7828 while (*p != '\0')
7830 /* Ignore newlines. */
7831 if (*p == '\n')
7833 ++p;
7834 continue;
7837 /* Check the arguments. */
7838 ok = 1;
7839 while (*p != ';')
7841 if (*p == '\0')
7843 invalid_exclusions:
7844 fatal_error ("multilib exclusions %qs is invalid",
7845 multilib_exclusions);
7848 if (! ok)
7850 ++p;
7851 continue;
7854 this_arg = p;
7855 while (*p != ' ' && *p != ';')
7857 if (*p == '\0')
7858 goto invalid_exclusions;
7859 ++p;
7862 if (*this_arg != '!')
7863 not_arg = 0;
7864 else
7866 not_arg = 1;
7867 ++this_arg;
7870 ok = used_arg (this_arg, p - this_arg);
7871 if (not_arg)
7872 ok = ! ok;
7874 if (*p == ' ')
7875 ++p;
7878 if (ok)
7879 return;
7881 ++p;
7884 first = 1;
7885 p = multilib_select;
7886 while (*p != '\0')
7888 /* Ignore newlines. */
7889 if (*p == '\n')
7891 ++p;
7892 continue;
7895 /* Get the initial path. */
7896 this_path = p;
7897 while (*p != ' ')
7899 if (*p == '\0')
7901 invalid_select:
7902 fatal_error ("multilib select %qs is invalid",
7903 multilib_select);
7905 ++p;
7907 this_path_len = p - this_path;
7909 /* Check the arguments. */
7910 ok = 1;
7911 ndfltok = 1;
7912 ++p;
7913 while (*p != ';')
7915 if (*p == '\0')
7916 goto invalid_select;
7918 if (! ok)
7920 ++p;
7921 continue;
7924 this_arg = p;
7925 while (*p != ' ' && *p != ';')
7927 if (*p == '\0')
7928 goto invalid_select;
7929 ++p;
7932 if (*this_arg != '!')
7933 not_arg = 0;
7934 else
7936 not_arg = 1;
7937 ++this_arg;
7940 /* If this is a default argument, we can just ignore it.
7941 This is true even if this_arg begins with '!'. Beginning
7942 with '!' does not mean that this argument is necessarily
7943 inappropriate for this library: it merely means that
7944 there is a more specific library which uses this
7945 argument. If this argument is a default, we need not
7946 consider that more specific library. */
7947 ok = used_arg (this_arg, p - this_arg);
7948 if (not_arg)
7949 ok = ! ok;
7951 if (! ok)
7952 ndfltok = 0;
7954 if (default_arg (this_arg, p - this_arg))
7955 ok = 1;
7957 if (*p == ' ')
7958 ++p;
7961 if (ok && first)
7963 if (this_path_len != 1
7964 || this_path[0] != '.')
7966 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
7967 char *q;
7969 strncpy (new_multilib_dir, this_path, this_path_len);
7970 new_multilib_dir[this_path_len] = '\0';
7971 q = strchr (new_multilib_dir, ':');
7972 if (q != NULL)
7973 *q = '\0';
7974 multilib_dir = new_multilib_dir;
7976 first = 0;
7979 if (ndfltok)
7981 const char *q = this_path, *end = this_path + this_path_len;
7983 while (q < end && *q != ':')
7984 q++;
7985 if (q < end)
7987 char *new_multilib_os_dir = XNEWVEC (char, end - q);
7988 memcpy (new_multilib_os_dir, q + 1, end - q - 1);
7989 new_multilib_os_dir[end - q - 1] = '\0';
7990 multilib_os_dir = new_multilib_os_dir;
7991 break;
7995 ++p;
7998 if (multilib_dir == NULL && multilib_os_dir != NULL
7999 && strcmp (multilib_os_dir, ".") == 0)
8001 free (CONST_CAST (char *, multilib_os_dir));
8002 multilib_os_dir = NULL;
8004 else if (multilib_dir != NULL && multilib_os_dir == NULL)
8005 multilib_os_dir = multilib_dir;
8008 /* Print out the multiple library subdirectory selection
8009 information. This prints out a series of lines. Each line looks
8010 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
8011 required. Only the desired options are printed out, the negative
8012 matches. The options are print without a leading dash. There are
8013 no spaces to make it easy to use the information in the shell.
8014 Each subdirectory is printed only once. This assumes the ordering
8015 generated by the genmultilib script. Also, we leave out ones that match
8016 the exclusions. */
8018 static void
8019 print_multilib_info (void)
8021 const char *p = multilib_select;
8022 const char *last_path = 0, *this_path;
8023 int skip;
8024 unsigned int last_path_len = 0;
8026 while (*p != '\0')
8028 skip = 0;
8029 /* Ignore newlines. */
8030 if (*p == '\n')
8032 ++p;
8033 continue;
8036 /* Get the initial path. */
8037 this_path = p;
8038 while (*p != ' ')
8040 if (*p == '\0')
8042 invalid_select:
8043 fatal_error ("multilib select %qs is invalid", multilib_select);
8046 ++p;
8049 /* When --disable-multilib was used but target defines
8050 MULTILIB_OSDIRNAMES, entries starting with .: are there just
8051 to find multilib_os_dir, so skip them from output. */
8052 if (this_path[0] == '.' && this_path[1] == ':')
8053 skip = 1;
8055 /* Check for matches with the multilib_exclusions. We don't bother
8056 with the '!' in either list. If any of the exclusion rules match
8057 all of its options with the select rule, we skip it. */
8059 const char *e = multilib_exclusions;
8060 const char *this_arg;
8062 while (*e != '\0')
8064 int m = 1;
8065 /* Ignore newlines. */
8066 if (*e == '\n')
8068 ++e;
8069 continue;
8072 /* Check the arguments. */
8073 while (*e != ';')
8075 const char *q;
8076 int mp = 0;
8078 if (*e == '\0')
8080 invalid_exclusion:
8081 fatal_error ("multilib exclusion %qs is invalid",
8082 multilib_exclusions);
8085 if (! m)
8087 ++e;
8088 continue;
8091 this_arg = e;
8093 while (*e != ' ' && *e != ';')
8095 if (*e == '\0')
8096 goto invalid_exclusion;
8097 ++e;
8100 q = p + 1;
8101 while (*q != ';')
8103 const char *arg;
8104 int len = e - this_arg;
8106 if (*q == '\0')
8107 goto invalid_select;
8109 arg = q;
8111 while (*q != ' ' && *q != ';')
8113 if (*q == '\0')
8114 goto invalid_select;
8115 ++q;
8118 if (! strncmp (arg, this_arg,
8119 (len < q - arg) ? q - arg : len)
8120 || default_arg (this_arg, e - this_arg))
8122 mp = 1;
8123 break;
8126 if (*q == ' ')
8127 ++q;
8130 if (! mp)
8131 m = 0;
8133 if (*e == ' ')
8134 ++e;
8137 if (m)
8139 skip = 1;
8140 break;
8143 if (*e != '\0')
8144 ++e;
8148 if (! skip)
8150 /* If this is a duplicate, skip it. */
8151 skip = (last_path != 0
8152 && (unsigned int) (p - this_path) == last_path_len
8153 && ! strncmp (last_path, this_path, last_path_len));
8155 last_path = this_path;
8156 last_path_len = p - this_path;
8159 /* If this directory requires any default arguments, we can skip
8160 it. We will already have printed a directory identical to
8161 this one which does not require that default argument. */
8162 if (! skip)
8164 const char *q;
8166 q = p + 1;
8167 while (*q != ';')
8169 const char *arg;
8171 if (*q == '\0')
8172 goto invalid_select;
8174 if (*q == '!')
8175 arg = NULL;
8176 else
8177 arg = q;
8179 while (*q != ' ' && *q != ';')
8181 if (*q == '\0')
8182 goto invalid_select;
8183 ++q;
8186 if (arg != NULL
8187 && default_arg (arg, q - arg))
8189 skip = 1;
8190 break;
8193 if (*q == ' ')
8194 ++q;
8198 if (! skip)
8200 const char *p1;
8202 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
8203 putchar (*p1);
8204 putchar (';');
8207 ++p;
8208 while (*p != ';')
8210 int use_arg;
8212 if (*p == '\0')
8213 goto invalid_select;
8215 if (skip)
8217 ++p;
8218 continue;
8221 use_arg = *p != '!';
8223 if (use_arg)
8224 putchar ('@');
8226 while (*p != ' ' && *p != ';')
8228 if (*p == '\0')
8229 goto invalid_select;
8230 if (use_arg)
8231 putchar (*p);
8232 ++p;
8235 if (*p == ' ')
8236 ++p;
8239 if (! skip)
8241 /* If there are extra options, print them now. */
8242 if (multilib_extra && *multilib_extra)
8244 int print_at = TRUE;
8245 const char *q;
8247 for (q = multilib_extra; *q != '\0'; q++)
8249 if (*q == ' ')
8250 print_at = TRUE;
8251 else
8253 if (print_at)
8254 putchar ('@');
8255 putchar (*q);
8256 print_at = FALSE;
8261 putchar ('\n');
8264 ++p;
8268 /* getenv built-in spec function.
8270 Returns the value of the environment variable given by its first
8271 argument, concatenated with the second argument. If the
8272 environment variable is not defined, a fatal error is issued. */
8274 static const char *
8275 getenv_spec_function (int argc, const char **argv)
8277 char *value;
8278 char *result;
8279 char *ptr;
8280 size_t len;
8282 if (argc != 2)
8283 return NULL;
8285 value = getenv (argv[0]);
8286 if (!value)
8287 fatal_error ("environment variable %qs not defined", argv[0]);
8289 /* We have to escape every character of the environment variable so
8290 they are not interpreted as active spec characters. A
8291 particularly painful case is when we are reading a variable
8292 holding a windows path complete with \ separators. */
8293 len = strlen (value) * 2 + strlen (argv[1]) + 1;
8294 result = XNEWVAR (char, len);
8295 for (ptr = result; *value; ptr += 2)
8297 ptr[0] = '\\';
8298 ptr[1] = *value++;
8301 strcpy (ptr, argv[1]);
8303 return result;
8306 /* if-exists built-in spec function.
8308 Checks to see if the file specified by the absolute pathname in
8309 ARGS exists. Returns that pathname if found.
8311 The usual use for this function is to check for a library file
8312 (whose name has been expanded with %s). */
8314 static const char *
8315 if_exists_spec_function (int argc, const char **argv)
8317 /* Must have only one argument. */
8318 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8319 return argv[0];
8321 return NULL;
8324 /* if-exists-else built-in spec function.
8326 This is like if-exists, but takes an additional argument which
8327 is returned if the first argument does not exist. */
8329 static const char *
8330 if_exists_else_spec_function (int argc, const char **argv)
8332 /* Must have exactly two arguments. */
8333 if (argc != 2)
8334 return NULL;
8336 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8337 return argv[0];
8339 return argv[1];
8342 /* replace-outfile built-in spec function.
8344 This looks for the first argument in the outfiles array's name and
8345 replaces it with the second argument. */
8347 static const char *
8348 replace_outfile_spec_function (int argc, const char **argv)
8350 int i;
8351 /* Must have exactly two arguments. */
8352 if (argc != 2)
8353 abort ();
8355 for (i = 0; i < n_infiles; i++)
8357 if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
8358 outfiles[i] = xstrdup (argv[1]);
8360 return NULL;
8363 /* Given two version numbers, compares the two numbers.
8364 A version number must match the regular expression
8365 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8367 static int
8368 compare_version_strings (const char *v1, const char *v2)
8370 int rresult;
8371 regex_t r;
8373 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8374 REG_EXTENDED | REG_NOSUB) != 0)
8375 abort ();
8376 rresult = regexec (&r, v1, 0, NULL, 0);
8377 if (rresult == REG_NOMATCH)
8378 fatal_error ("invalid version number %qs", v1);
8379 else if (rresult != 0)
8380 abort ();
8381 rresult = regexec (&r, v2, 0, NULL, 0);
8382 if (rresult == REG_NOMATCH)
8383 fatal_error ("invalid version number %qs", v2);
8384 else if (rresult != 0)
8385 abort ();
8387 return strverscmp (v1, v2);
8391 /* version_compare built-in spec function.
8393 This takes an argument of the following form:
8395 <comparison-op> <arg1> [<arg2>] <switch> <result>
8397 and produces "result" if the comparison evaluates to true,
8398 and nothing if it doesn't.
8400 The supported <comparison-op> values are:
8402 >= true if switch is a later (or same) version than arg1
8403 !> opposite of >=
8404 < true if switch is an earlier version than arg1
8405 !< opposite of <
8406 >< true if switch is arg1 or later, and earlier than arg2
8407 <> true if switch is earlier than arg1 or is arg2 or later
8409 If the switch is not present, the condition is false unless
8410 the first character of the <comparison-op> is '!'.
8412 For example,
8413 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8414 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8416 static const char *
8417 version_compare_spec_function (int argc, const char **argv)
8419 int comp1, comp2;
8420 size_t switch_len;
8421 const char *switch_value = NULL;
8422 int nargs = 1, i;
8423 bool result;
8425 if (argc < 3)
8426 fatal_error ("too few arguments to %%:version-compare");
8427 if (argv[0][0] == '\0')
8428 abort ();
8429 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8430 nargs = 2;
8431 if (argc != nargs + 3)
8432 fatal_error ("too many arguments to %%:version-compare");
8434 switch_len = strlen (argv[nargs + 1]);
8435 for (i = 0; i < n_switches; i++)
8436 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8437 && check_live_switch (i, switch_len))
8438 switch_value = switches[i].part1 + switch_len;
8440 if (switch_value == NULL)
8441 comp1 = comp2 = -1;
8442 else
8444 comp1 = compare_version_strings (switch_value, argv[1]);
8445 if (nargs == 2)
8446 comp2 = compare_version_strings (switch_value, argv[2]);
8447 else
8448 comp2 = -1; /* This value unused. */
8451 switch (argv[0][0] << 8 | argv[0][1])
8453 case '>' << 8 | '=':
8454 result = comp1 >= 0;
8455 break;
8456 case '!' << 8 | '<':
8457 result = comp1 >= 0 || switch_value == NULL;
8458 break;
8459 case '<' << 8:
8460 result = comp1 < 0;
8461 break;
8462 case '!' << 8 | '>':
8463 result = comp1 < 0 || switch_value == NULL;
8464 break;
8465 case '>' << 8 | '<':
8466 result = comp1 >= 0 && comp2 < 0;
8467 break;
8468 case '<' << 8 | '>':
8469 result = comp1 < 0 || comp2 >= 0;
8470 break;
8472 default:
8473 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
8475 if (! result)
8476 return NULL;
8478 return argv[nargs + 2];
8481 /* %:include builtin spec function. This differs from %include in that it
8482 can be nested inside a spec, and thus be conditionalized. It takes
8483 one argument, the filename, and looks for it in the startfile path.
8484 The result is always NULL, i.e. an empty expansion. */
8486 static const char *
8487 include_spec_function (int argc, const char **argv)
8489 char *file;
8491 if (argc != 1)
8492 abort ();
8494 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
8495 read_specs (file ? file : argv[0], FALSE);
8497 return NULL;
8500 /* %:find-file spec function. This function replaces its argument by
8501 the file found thru find_file, that is the -print-file-name gcc
8502 program option. */
8503 static const char *
8504 find_file_spec_function (int argc, const char **argv)
8506 const char *file;
8508 if (argc != 1)
8509 abort ();
8511 file = find_file (argv[0]);
8512 return file;
8516 /* %:find-plugindir spec function. This function replaces its argument
8517 by the -iplugindir=<dir> option. `dir' is found thru find_file, that
8518 is the -print-file-name gcc program option. */
8519 static const char *
8520 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
8522 const char *option;
8524 if (argc != 0)
8525 abort ();
8527 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
8528 return option;
8532 /* %:print-asm-header spec function. Print a banner to say that the
8533 following output is from the assembler. */
8535 static const char *
8536 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8537 const char **argv ATTRIBUTE_UNUSED)
8539 printf (_("Assembler options\n=================\n\n"));
8540 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8541 fflush (stdout);
8542 return NULL;
8545 /* Compute a timestamp to initialize flag_random_seed. */
8547 static unsigned
8548 get_local_tick (void)
8550 unsigned ret = 0;
8552 /* Get some more or less random data. */
8553 #ifdef HAVE_GETTIMEOFDAY
8555 struct timeval tv;
8557 gettimeofday (&tv, NULL);
8558 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8560 #else
8562 time_t now = time (NULL);
8564 if (now != (time_t)-1)
8565 ret = (unsigned) now;
8567 #endif
8569 return ret;
8572 /* %:compare-debug-dump-opt spec function. Save the last argument,
8573 expected to be the last -fdump-final-insns option, or generate a
8574 temporary. */
8576 static const char *
8577 compare_debug_dump_opt_spec_function (int arg,
8578 const char **argv ATTRIBUTE_UNUSED)
8580 const char *ret;
8581 char *name;
8582 int which;
8583 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
8585 if (arg != 0)
8586 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
8588 do_spec_2 ("%{fdump-final-insns=*:%*}");
8589 do_spec_1 (" ", 0, NULL);
8591 if (argbuf_index > 0 && strcmp (argv[argbuf_index - 1], "."))
8593 if (!compare_debug)
8594 return NULL;
8596 name = xstrdup (argv[argbuf_index - 1]);
8597 ret = NULL;
8599 else
8601 const char *ext = NULL;
8603 if (argbuf_index > 0)
8605 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8606 ext = ".gkd";
8608 else if (!compare_debug)
8609 return NULL;
8610 else
8611 do_spec_2 ("%g.gkd");
8613 do_spec_1 (" ", 0, NULL);
8615 gcc_assert (argbuf_index > 0);
8617 name = concat (argbuf[argbuf_index - 1], ext, NULL);
8619 ret = concat ("-fdump-final-insns=", name, NULL);
8622 which = compare_debug < 0;
8623 debug_check_temp_file[which] = name;
8625 if (!which)
8627 unsigned HOST_WIDE_INT value = get_local_tick () ^ getpid ();
8629 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8632 if (*random_seed)
8633 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8634 ret, NULL);
8636 if (which)
8637 *random_seed = 0;
8639 return ret;
8642 static const char *debug_auxbase_opt;
8644 /* %:compare-debug-self-opt spec function. Expands to the options
8645 that are to be passed in the second compilation of
8646 compare-debug. */
8648 static const char *
8649 compare_debug_self_opt_spec_function (int arg,
8650 const char **argv ATTRIBUTE_UNUSED)
8652 if (arg != 0)
8653 fatal_error ("too many arguments to %%:compare-debug-self-opt");
8655 if (compare_debug >= 0)
8656 return NULL;
8658 do_spec_2 ("%{c|S:%{o*:%*}}");
8659 do_spec_1 (" ", 0, NULL);
8661 if (argbuf_index > 0)
8662 debug_auxbase_opt = concat ("-auxbase-strip ",
8663 argbuf[argbuf_index - 1],
8664 NULL);
8665 else
8666 debug_auxbase_opt = NULL;
8668 return concat ("\
8669 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8670 %<fdump-final-insns=* -w -S -o %j \
8671 %{!fcompare-debug-second:-fcompare-debug-second} \
8672 ", compare_debug_opt, NULL);
8675 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8676 options that are to be passed in the second compilation of
8677 compare-debug. It expects, as an argument, the basename of the
8678 current input file name, with the .gk suffix appended to it. */
8680 static const char *
8681 compare_debug_auxbase_opt_spec_function (int arg,
8682 const char **argv)
8684 char *name;
8685 int len;
8687 if (arg == 0)
8688 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
8690 if (arg != 1)
8691 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
8693 if (compare_debug >= 0)
8694 return NULL;
8696 len = strlen (argv[0]);
8697 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
8698 fatal_error ("argument to %%:compare-debug-auxbase-opt "
8699 "does not end in .gk");
8701 if (debug_auxbase_opt)
8702 return debug_auxbase_opt;
8704 #define OPT "-auxbase "
8706 len -= 3;
8707 name = (char*) xmalloc (sizeof (OPT) + len);
8708 memcpy (name, OPT, sizeof (OPT) - 1);
8709 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8710 name[sizeof (OPT) - 1 + len] = '\0';
8712 #undef OPT
8714 return name;