* Makefile.def (target_modules): Add libssp.
[official-gcc.git] / gcc / gcc.c
blob6ec8e5387e3c1d27b20b69c7f8ebde05f0ac885f
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 Free Software Foundation,
4 Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.
23 This paragraph is here to try to keep Sun CC from dying.
24 The number of chars here seems crucial!!!! */
26 /* This program is the user interface to the C compiler and possibly to
27 other compilers. It is used because compilation is a complicated procedure
28 which involves running several programs and passing temporary files between
29 them, forwarding the users switches to those programs selectively,
30 and deleting the temporary files at the end.
32 CC recognizes how to compile each input file by suffixes in the file names.
33 Once it knows which kind of compilation to perform, the procedure for
34 compilation is specified by a string called a "spec". */
36 /* A Short Introduction to Adding a Command-Line Option.
38 Before adding a command-line option, consider if it is really
39 necessary. Each additional command-line option adds complexity and
40 is difficult to remove in subsequent versions.
42 In the following, consider adding the command-line argument
43 `--bar'.
45 1. Each command-line option is specified in the specs file. The
46 notation is described below in the comment entitled "The Specs
47 Language". Read it.
49 2. In this file, add an entry to "option_map" equating the long
50 `--' argument version and any shorter, single letter version. Read
51 the comments in the declaration of "struct option_map" for an
52 explanation. Do not omit the first `-'.
54 3. Look in the "specs" file to determine which program or option
55 list should be given the argument, e.g., "cc1_options". Add the
56 appropriate syntax for the shorter option version to the
57 corresponding "const char *" entry in this file. Omit the first
58 `-' from the option. For example, use `-bar', rather than `--bar'.
60 4. If the argument takes an argument, e.g., `--baz argument1',
61 modify either DEFAULT_SWITCH_TAKES_ARG or
62 DEFAULT_WORD_SWITCH_TAKES_ARG in gcc.h. Omit the first `-'
63 from `--baz'.
65 5. Document the option in this file's display_help(). If the
66 option is passed to a subprogram, modify its corresponding
67 function, e.g., cppinit.c:print_help() or toplev.c:display_help(),
68 instead.
70 6. Compile and test. Make sure that your new specs file is being
71 read. For example, use a debugger to investigate the value of
72 "specs_file" in main(). */
74 #include "config.h"
75 #include "system.h"
76 #include "coretypes.h"
77 #include "multilib.h" /* before tm.h */
78 #include "tm.h"
79 #include <signal.h>
80 #if ! defined( SIGCHLD ) && defined( SIGCLD )
81 # define SIGCHLD SIGCLD
82 #endif
83 #include "obstack.h"
84 #include "intl.h"
85 #include "prefix.h"
86 #include "gcc.h"
87 #include "flags.h"
89 /* By default there is no special suffix for target executables. */
90 /* FIXME: when autoconf is fixed, remove the host check - dj */
91 #if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
92 #define HAVE_TARGET_EXECUTABLE_SUFFIX
93 #endif
95 /* By default there is no special suffix for host executables. */
96 #ifdef HOST_EXECUTABLE_SUFFIX
97 #define HAVE_HOST_EXECUTABLE_SUFFIX
98 #else
99 #define HOST_EXECUTABLE_SUFFIX ""
100 #endif
102 /* By default, the suffix for target object files is ".o". */
103 #ifdef TARGET_OBJECT_SUFFIX
104 #define HAVE_TARGET_OBJECT_SUFFIX
105 #else
106 #define TARGET_OBJECT_SUFFIX ".o"
107 #endif
109 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
111 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
112 #ifndef LIBRARY_PATH_ENV
113 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
114 #endif
116 #ifndef HAVE_KILL
117 #define kill(p,s) raise(s)
118 #endif
120 /* If a stage of compilation returns an exit status >= 1,
121 compilation of that file ceases. */
123 #define MIN_FATAL_STATUS 1
125 /* Flag set by cppspec.c to 1. */
126 int is_cpp_driver;
128 /* Flag saying to pass the greatest exit code returned by a sub-process
129 to the calling program. */
130 static int pass_exit_codes;
132 /* Definition of string containing the arguments given to configure. */
133 #include "configargs.h"
135 /* Flag saying to print the directories gcc will search through looking for
136 programs, libraries, etc. */
138 static int print_search_dirs;
140 /* Flag saying to print the full filename of this file
141 as found through our usual search mechanism. */
143 static const char *print_file_name = NULL;
145 /* As print_file_name, but search for executable file. */
147 static const char *print_prog_name = NULL;
149 /* Flag saying to print the relative path we'd use to
150 find libgcc.a given the current compiler flags. */
152 static int print_multi_directory;
154 /* Flag saying to print the relative path we'd use to
155 find OS libraries given the current compiler flags. */
157 static int print_multi_os_directory;
159 /* Flag saying to print the list of subdirectories and
160 compiler flags used to select them in a standard form. */
162 static int print_multi_lib;
164 /* Flag saying to print the command line options understood by gcc and its
165 sub-processes. */
167 static int print_help_list;
169 /* Flag indicating whether we should print the command and arguments */
171 static int verbose_flag;
173 /* Flag indicating whether we should ONLY print the command and
174 arguments (like verbose_flag) without executing the command.
175 Displayed arguments are quoted so that the generated command
176 line is suitable for execution. This is intended for use in
177 shell scripts to capture the driver-generated command line. */
178 static int verbose_only_flag;
180 /* Flag indicating to print target specific command line options. */
182 static int target_help_flag;
184 /* Flag indicating whether we should report subprocess execution times
185 (if this is supported by the system - see pexecute.c). */
187 static int report_times;
189 /* Nonzero means place this string before uses of /, so that include
190 and library files can be found in an alternate location. */
192 #ifdef TARGET_SYSTEM_ROOT
193 static const char *target_system_root = TARGET_SYSTEM_ROOT;
194 #else
195 static const char *target_system_root = 0;
196 #endif
198 /* Nonzero means pass the updated target_system_root to the compiler. */
200 static int target_system_root_changed;
202 /* Nonzero means append this string to target_system_root. */
204 static const char *target_sysroot_suffix = 0;
206 /* Nonzero means append this string to target_system_root for headers. */
208 static const char *target_sysroot_hdrs_suffix = 0;
210 /* Nonzero means write "temp" files in source directory
211 and use the source file's name in them, and don't delete them. */
213 static int save_temps_flag;
215 /* Nonzero means pass multiple source files to the compiler at one time. */
217 static int combine_flag = 0;
219 /* Nonzero means use pipes to communicate between subprocesses.
220 Overridden by either of the above two flags. */
222 static int use_pipes;
224 /* The compiler version. */
226 static const char *compiler_version;
228 /* The target version specified with -V */
230 static const char *const spec_version = DEFAULT_TARGET_VERSION;
232 /* The target machine specified with -b. */
234 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
236 /* Nonzero if cross-compiling.
237 When -b is used, the value comes from the `specs' file. */
239 #ifdef CROSS_COMPILE
240 static const char *cross_compile = "1";
241 #else
242 static const char *cross_compile = "0";
243 #endif
245 #ifdef MODIFY_TARGET_NAME
247 /* Information on how to alter the target name based on a command-line
248 switch. The only case we support now is simply appending or deleting a
249 string to or from the end of the first part of the configuration name. */
251 static const struct modify_target
253 const char *const sw;
254 const enum add_del {ADD, DELETE} add_del;
255 const char *const str;
257 modify_target[] = MODIFY_TARGET_NAME;
258 #endif
260 /* The number of errors that have occurred; the link phase will not be
261 run if this is nonzero. */
262 static int error_count = 0;
264 /* Greatest exit code of sub-processes that has been encountered up to
265 now. */
266 static int greatest_status = 1;
268 /* This is the obstack which we use to allocate many strings. */
270 static struct obstack obstack;
272 /* This is the obstack to build an environment variable to pass to
273 collect2 that describes all of the relevant switches of what to
274 pass the compiler in building the list of pointers to constructors
275 and destructors. */
277 static struct obstack collect_obstack;
279 /* Forward declaration for prototypes. */
280 struct path_prefix;
281 struct prefix_list;
283 static void init_spec (void);
284 static void store_arg (const char *, int, int);
285 static char *load_specs (const char *);
286 static void read_specs (const char *, int);
287 static void set_spec (const char *, const char *);
288 static struct compiler *lookup_compiler (const char *, size_t, const char *);
289 static char *build_search_list (struct path_prefix *, const char *, int);
290 static void putenv_from_prefixes (struct path_prefix *, const char *);
291 static int access_check (const char *, int);
292 static char *find_a_file (struct path_prefix *, const char *, int, int);
293 static void add_prefix (struct path_prefix *, const char *, const char *,
294 int, int, int);
295 static void add_sysrooted_prefix (struct path_prefix *, const char *,
296 const char *, int, int, int);
297 static void translate_options (int *, const char *const **);
298 static char *skip_whitespace (char *);
299 static void delete_if_ordinary (const char *);
300 static void delete_temp_files (void);
301 static void delete_failure_queue (void);
302 static void clear_failure_queue (void);
303 static int check_live_switch (int, int);
304 static const char *handle_braces (const char *);
305 static inline bool input_suffix_matches (const char *, const char *);
306 static inline bool switch_matches (const char *, const char *, int);
307 static inline void mark_matching_switches (const char *, const char *, int);
308 static inline void process_marked_switches (void);
309 static const char *process_brace_body (const char *, const char *, const char *, int, int);
310 static const struct spec_function *lookup_spec_function (const char *);
311 static const char *eval_spec_function (const char *, const char *);
312 static const char *handle_spec_function (const char *);
313 static char *save_string (const char *, int);
314 static void set_collect_gcc_options (void);
315 static void do_spec_path (struct prefix_list *, const char *, int, int, int, const char *, const char *);
316 static int do_spec_1 (const char *, int, const char *);
317 static int do_spec_2 (const char *);
318 static void do_option_spec (const char *, const char *);
319 static void do_self_spec (const char *);
320 static const char *find_file (const char *);
321 static int is_directory (const char *, const char *, int);
322 static const char *validate_switches (const char *);
323 static void validate_all_switches (void);
324 static inline void validate_switches_from_spec (const char *);
325 static void give_switch (int, int);
326 static int used_arg (const char *, int);
327 static int default_arg (const char *, int);
328 static void set_multilib_dir (void);
329 static void print_multilib_info (void);
330 static void perror_with_name (const char *);
331 static void notice (const char *, ...) ATTRIBUTE_PRINTF_1;
332 static void display_help (void);
333 static void add_preprocessor_option (const char *, int);
334 static void add_assembler_option (const char *, int);
335 static void add_linker_option (const char *, int);
336 static void process_command (int, const char **);
337 static int execute (void);
338 static void alloc_args (void);
339 static void clear_args (void);
340 static void fatal_error (int);
341 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
342 static void init_gcc_specs (struct obstack *, const char *, const char *,
343 const char *);
344 #endif
345 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
346 static const char *convert_filename (const char *, int, int);
347 #endif
349 static const char *if_exists_spec_function (int, const char **);
350 static const char *if_exists_else_spec_function (int, const char **);
351 static const char *replace_outfile_spec_function (int, const char **);
353 /* The Specs Language
355 Specs are strings containing lines, each of which (if not blank)
356 is made up of a program name, and arguments separated by spaces.
357 The program name must be exact and start from root, since no path
358 is searched and it is unreliable to depend on the current working directory.
359 Redirection of input or output is not supported; the subprograms must
360 accept filenames saying what files to read and write.
362 In addition, the specs can contain %-sequences to substitute variable text
363 or for conditional text. Here is a table of all defined %-sequences.
364 Note that spaces are not generated automatically around the results of
365 expanding these sequences; therefore, you can concatenate them together
366 or with constant text in a single argument.
368 %% substitute one % into the program name or argument.
369 %i substitute the name of the input file being processed.
370 %b substitute the basename of the input file being processed.
371 This is the substring up to (and not including) the last period
372 and not including the directory.
373 %B same as %b, but include the file suffix (text after the last period).
374 %gSUFFIX
375 substitute a file name that has suffix SUFFIX and is chosen
376 once per compilation, and mark the argument a la %d. To reduce
377 exposure to denial-of-service attacks, the file name is now
378 chosen in a way that is hard to predict even when previously
379 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
380 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
381 the regexp "[.A-Za-z]*%O"; "%O" is treated exactly as if it
382 had been pre-processed. Previously, %g was simply substituted
383 with a file name chosen once per compilation, without regard
384 to any appended suffix (which was therefore treated just like
385 ordinary text), making such attacks more likely to succeed.
386 %|SUFFIX
387 like %g, but if -pipe is in effect, expands simply to "-".
388 %mSUFFIX
389 like %g, but if -pipe is in effect, expands to nothing. (We have both
390 %| and %m to accommodate differences between system assemblers; see
391 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
392 %uSUFFIX
393 like %g, but generates a new temporary file name even if %uSUFFIX
394 was already seen.
395 %USUFFIX
396 substitutes the last file name generated with %uSUFFIX, generating a
397 new one if there is no such last file name. In the absence of any
398 %uSUFFIX, this is just like %gSUFFIX, except they don't share
399 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
400 would involve the generation of two distinct file names, one
401 for each `%g.s' and another for each `%U.s'. Previously, %U was
402 simply substituted with a file name chosen for the previous %u,
403 without regard to any appended suffix.
404 %jSUFFIX
405 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
406 writable, and if save-temps is off; otherwise, substitute the name
407 of a temporary file, just like %u. This temporary file is not
408 meant for communication between processes, but rather as a junk
409 disposal mechanism.
410 %.SUFFIX
411 substitutes .SUFFIX for the suffixes of a matched switch's args when
412 it is subsequently output with %*. SUFFIX is terminated by the next
413 space or %.
414 %d marks the argument containing or following the %d as a
415 temporary file name, so that that file will be deleted if CC exits
416 successfully. Unlike %g, this contributes no text to the argument.
417 %w marks the argument containing or following the %w as the
418 "output file" of this compilation. This puts the argument
419 into the sequence of arguments that %o will substitute later.
420 %V indicates that this compilation produces no "output file".
421 %W{...}
422 like %{...} but mark last argument supplied within
423 as a file to be deleted on failure.
424 %o substitutes the names of all the output files, with spaces
425 automatically placed around them. You should write spaces
426 around the %o as well or the results are undefined.
427 %o is for use in the specs for running the linker.
428 Input files whose names have no recognized suffix are not compiled
429 at all, but they are included among the output files, so they will
430 be linked.
431 %O substitutes the suffix for object files. Note that this is
432 handled specially when it immediately follows %g, %u, or %U
433 (with or without a suffix argument) because of the need for
434 those to form complete file names. The handling is such that
435 %O is treated exactly as if it had already been substituted,
436 except that %g, %u, and %U do not currently support additional
437 SUFFIX characters following %O as they would following, for
438 example, `.o'.
439 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
440 (made from TARGET_SYSTEM_ROOT), and -isystem (made from COMPILER_PATH
441 and -B options) as necessary.
442 %s current argument is the name of a library or startup file of some sort.
443 Search for that file in a standard list of directories
444 and substitute the full name found.
445 %eSTR Print STR as an error message. STR is terminated by a newline.
446 Use this when inconsistent options are detected.
447 %nSTR Print STR as a notice. STR is terminated by a newline.
448 %x{OPTION} Accumulate an option for %X.
449 %X Output the accumulated linker options specified by compilations.
450 %Y Output the accumulated assembler options specified by compilations.
451 %Z Output the accumulated preprocessor options specified by compilations.
452 %a process ASM_SPEC as a spec.
453 This allows config.h to specify part of the spec for running as.
454 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
455 used here. This can be used to run a post-processor after the
456 assembler has done its job.
457 %D Dump out a -L option for each directory in startfile_prefixes.
458 If multilib_dir is set, extra entries are generated with it affixed.
459 %l process LINK_SPEC as a spec.
460 %L process LIB_SPEC as a spec.
461 %G process LIBGCC_SPEC as a spec.
462 %R Output the concatenation of target_system_root and
463 target_sysroot_suffix.
464 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
465 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
466 %C process CPP_SPEC as a spec.
467 %1 process CC1_SPEC as a spec.
468 %2 process CC1PLUS_SPEC as a spec.
469 %* substitute the variable part of a matched option. (See below.)
470 Note that each comma in the substituted string is replaced by
471 a single space.
472 %<S remove all occurrences of -S from the command line.
473 Note - this command is position dependent. % commands in the
474 spec string before this one will see -S, % commands in the
475 spec string after this one will not.
476 %<S* remove all occurrences of all switches beginning with -S from the
477 command line.
478 %:function(args)
479 Call the named function FUNCTION, passing it ARGS. ARGS is
480 first processed as a nested spec string, then split into an
481 argument vector in the usual fashion. The function returns
482 a string which is processed as if it had appeared literally
483 as part of the current spec.
484 %{S} substitutes the -S switch, if that switch was given to CC.
485 If that switch was not specified, this substitutes nothing.
486 Here S is a metasyntactic variable.
487 %{S*} substitutes all the switches specified to CC whose names start
488 with -S. This is used for -o, -I, etc; switches that take
489 arguments. CC considers `-o foo' as being one switch whose
490 name starts with `o'. %{o*} would substitute this text,
491 including the space; thus, two arguments would be generated.
492 %{S*&T*} likewise, but preserve order of S and T options (the order
493 of S and T in the spec is not significant). Can be any number
494 of ampersand-separated variables; for each the wild card is
495 optional. Useful for CPP as %{D*&U*&A*}.
497 %{S:X} substitutes X, if the -S switch was given to CC.
498 %{!S:X} substitutes X, if the -S switch was NOT given to CC.
499 %{S*:X} substitutes X if one or more switches whose names start
500 with -S was given to CC. Normally X is substituted only
501 once, no matter how many such switches appeared. However,
502 if %* appears somewhere in X, then X will be substituted
503 once for each matching switch, with the %* replaced by the
504 part of that switch that matched the '*'.
505 %{.S:X} substitutes X, if processing a file with suffix S.
506 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
508 %{S|T:X} substitutes X if either -S or -T was given to CC. This may be
509 combined with !, ., and * as above binding stronger than the OR.
510 If %* appears in X, all of the alternatives must be starred, and
511 only the first matching alternative is substituted.
512 %{S:X; if S was given to CC, substitutes X;
513 T:Y; else if T was given to CC, substitutes Y;
514 :D} else substitutes D. There can be as many clauses as you need.
515 This may be combined with ., !, |, and * as above.
517 %(Spec) processes a specification defined in a specs file as *Spec:
518 %[Spec] as above, but put __ around -D arguments
520 The conditional text X in a %{S:X} or similar construct may contain
521 other nested % constructs or spaces, or even newlines. They are
522 processed as usual, as described above. Trailing white space in X is
523 ignored. White space may also appear anywhere on the left side of the
524 colon in these constructs, except between . or * and the corresponding
525 word.
527 The -O, -f, -m, and -W switches are handled specifically in these
528 constructs. If another value of -O or the negated form of a -f, -m, or
529 -W switch is found later in the command line, the earlier switch
530 value is ignored, except with {S*} where S is just one letter; this
531 passes all matching options.
533 The character | at the beginning of the predicate text is used to indicate
534 that a command should be piped to the following command, but only if -pipe
535 is specified.
537 Note that it is built into CC which switches take arguments and which
538 do not. You might think it would be useful to generalize this to
539 allow each compiler's spec to say which switches take arguments. But
540 this cannot be done in a consistent fashion. CC cannot even decide
541 which input files have been specified without knowing which switches
542 take arguments, and it must know which input files to compile in order
543 to tell which compilers to run.
545 CC also knows implicitly that arguments starting in `-l' are to be
546 treated as compiler output files, and passed to the linker in their
547 proper position among the other output files. */
549 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
551 /* config.h can define ASM_SPEC to provide extra args to the assembler
552 or extra switch-translations. */
553 #ifndef ASM_SPEC
554 #define ASM_SPEC ""
555 #endif
557 /* config.h can define ASM_FINAL_SPEC to run a post processor after
558 the assembler has run. */
559 #ifndef ASM_FINAL_SPEC
560 #define ASM_FINAL_SPEC ""
561 #endif
563 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
564 or extra switch-translations. */
565 #ifndef CPP_SPEC
566 #define CPP_SPEC ""
567 #endif
569 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
570 or extra switch-translations. */
571 #ifndef CC1_SPEC
572 #define CC1_SPEC ""
573 #endif
575 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
576 or extra switch-translations. */
577 #ifndef CC1PLUS_SPEC
578 #define CC1PLUS_SPEC ""
579 #endif
581 /* config.h can define LINK_SPEC to provide extra args to the linker
582 or extra switch-translations. */
583 #ifndef LINK_SPEC
584 #define LINK_SPEC ""
585 #endif
587 /* config.h can define LIB_SPEC to override the default libraries. */
588 #ifndef LIB_SPEC
589 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
590 #endif
592 /* mudflap specs */
593 #ifndef MFWRAP_SPEC
594 /* XXX: valid only for GNU ld */
595 /* XXX: should exactly match hooks provided by libmudflap.a */
596 #define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
597 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
598 --wrap=mmap --wrap=munmap --wrap=alloca\
599 } %{fmudflapth: --wrap=pthread_create --wrap=pthread_join --wrap=pthread_exit\
600 }} %{fmudflap|fmudflapth: --wrap=main}"
601 #endif
602 #ifndef MFLIB_SPEC
603 #define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
604 #endif
606 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
607 included. */
608 #ifndef LIBGCC_SPEC
609 #if defined(REAL_LIBGCC_SPEC)
610 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
611 #elif defined(LINK_LIBGCC_SPECIAL_1)
612 /* Have gcc do the search for libgcc.a. */
613 #define LIBGCC_SPEC "libgcc.a%s"
614 #else
615 #define LIBGCC_SPEC "-lgcc"
616 #endif
617 #endif
619 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
620 #ifndef STARTFILE_SPEC
621 #define STARTFILE_SPEC \
622 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
623 #endif
625 /* config.h can define SWITCHES_NEED_SPACES to control which options
626 require spaces between the option and the argument. */
627 #ifndef SWITCHES_NEED_SPACES
628 #define SWITCHES_NEED_SPACES ""
629 #endif
631 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
632 #ifndef ENDFILE_SPEC
633 #define ENDFILE_SPEC ""
634 #endif
636 #ifndef LINKER_NAME
637 #define LINKER_NAME "collect2"
638 #endif
640 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
641 to the assembler. */
642 #ifndef ASM_DEBUG_SPEC
643 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
644 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
645 # define ASM_DEBUG_SPEC \
646 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
647 ? "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}" \
648 : "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}")
649 # else
650 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
651 # define ASM_DEBUG_SPEC "%{g*:--gstabs}"
652 # endif
653 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
654 # define ASM_DEBUG_SPEC "%{g*:--gdwarf2}"
655 # endif
656 # endif
657 #endif
658 #ifndef ASM_DEBUG_SPEC
659 # define ASM_DEBUG_SPEC ""
660 #endif
662 /* Here is the spec for running the linker, after compiling all files. */
664 /* This is overridable by the target in case they need to specify the
665 -lgcc and -lc order specially, yet not require them to override all
666 of LINK_COMMAND_SPEC. */
667 #ifndef LINK_GCC_C_SEQUENCE_SPEC
668 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
669 #endif
671 #ifndef LINK_SSP_SPEC
672 #ifdef TARGET_LIBC_PROVIDES_SSP
673 #define LINK_SSP_SPEC "%{fstack-protector:}"
674 #else
675 #define LINK_SSP_SPEC "%{fstack-protector:-lssp_nonshared -lssp }"
676 #endif
677 #endif
679 #ifndef LINK_PIE_SPEC
680 #ifdef HAVE_LD_PIE
681 #define LINK_PIE_SPEC "%{pie:-pie} "
682 #else
683 #define LINK_PIE_SPEC "%{pie:} "
684 #endif
685 #endif
687 /* -u* was put back because both BSD and SysV seem to support it. */
688 /* %{static:} simply prevents an error message if the target machine
689 doesn't handle -static. */
690 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
691 scripts which exist in user specified directories, or in standard
692 directories. */
693 #ifndef LINK_COMMAND_SPEC
694 #define LINK_COMMAND_SPEC "\
695 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
696 %(linker) %l " LINK_PIE_SPEC "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
697 %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
698 %{static:} %{L*} %(mfwrap) %(link_libgcc) %o %(mflib)\
699 %{fprofile-arcs|fprofile-generate|coverage:-lgcov}\
700 %{!nostdlib:%{!nodefaultlibs:%(link_ssp)%(link_gcc_c_sequence)}}\
701 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
702 #endif
704 #ifndef LINK_LIBGCC_SPEC
705 /* Generate -L options for startfile prefix list. */
706 # define LINK_LIBGCC_SPEC "%D"
707 #endif
709 #ifndef STARTFILE_PREFIX_SPEC
710 # define STARTFILE_PREFIX_SPEC ""
711 #endif
713 #ifndef SYSROOT_SPEC
714 # define SYSROOT_SPEC "--sysroot=%R"
715 #endif
717 #ifndef SYSROOT_SUFFIX_SPEC
718 # define SYSROOT_SUFFIX_SPEC ""
719 #endif
721 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
722 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
723 #endif
725 static const char *asm_debug;
726 static const char *cpp_spec = CPP_SPEC;
727 static const char *cc1_spec = CC1_SPEC;
728 static const char *cc1plus_spec = CC1PLUS_SPEC;
729 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
730 static const char *link_ssp_spec = LINK_SSP_SPEC;
731 static const char *asm_spec = ASM_SPEC;
732 static const char *asm_final_spec = ASM_FINAL_SPEC;
733 static const char *link_spec = LINK_SPEC;
734 static const char *lib_spec = LIB_SPEC;
735 static const char *mfwrap_spec = MFWRAP_SPEC;
736 static const char *mflib_spec = MFLIB_SPEC;
737 static const char *libgcc_spec = LIBGCC_SPEC;
738 static const char *endfile_spec = ENDFILE_SPEC;
739 static const char *startfile_spec = STARTFILE_SPEC;
740 static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
741 static const char *linker_name_spec = LINKER_NAME;
742 static const char *link_command_spec = LINK_COMMAND_SPEC;
743 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
744 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
745 static const char *sysroot_spec = SYSROOT_SPEC;
746 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
747 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
749 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
750 There should be no need to override these in target dependent files,
751 but we need to copy them to the specs file so that newer versions
752 of the GCC driver can correctly drive older tool chains with the
753 appropriate -B options. */
755 /* When cpplib handles traditional preprocessing, get rid of this, and
756 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
757 that we default the front end language better. */
758 static const char *trad_capable_cpp =
759 "cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
761 /* We don't wrap .d files in %W{} since a missing .d file, and
762 therefore no dependency entry, confuses make into thinking a .o
763 file that happens to exist is up-to-date. */
764 static const char *cpp_unique_options =
765 "%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}}\
766 %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
767 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
768 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
769 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
770 %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}}\
771 %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i\
772 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
773 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
774 %{E|M|MM:%W{o*}}";
776 /* This contains cpp options which are common with cc1_options and are passed
777 only when preprocessing only to avoid duplication. We pass the cc1 spec
778 options to the preprocessor so that it the cc1 spec may manipulate
779 options used to set target flags. Those special target flags settings may
780 in turn cause preprocessor symbols to be defined specially. */
781 static const char *cpp_options =
782 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
783 %{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*}\
784 %{undef} %{save-temps:-fpch-preprocess}";
786 /* This contains cpp options which are not passed when the preprocessor
787 output will be used by another program. */
788 static const char *cpp_debug_options = "%{d*}";
790 /* NB: This is shared amongst all front-ends. */
791 static const char *cc1_options =
792 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
793 %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*}\
794 %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}}\
795 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
796 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
797 %{Qn:-fno-ident} %{--help:--help}\
798 %{--target-help:--target-help}\
799 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
800 %{fsyntax-only:-o %j} %{-param*}\
801 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
802 %{coverage:-fprofile-arcs -ftest-coverage}";
804 static const char *asm_options =
805 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
807 static const char *invoke_as =
808 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
809 "%{!S:-o %|.s |\n as %(asm_options) %|.s %A }";
810 #else
811 "%{!S:-o %|.s |\n as %(asm_options) %m.s %A }";
812 #endif
814 /* Some compilers have limits on line lengths, and the multilib_select
815 and/or multilib_matches strings can be very long, so we build them at
816 run time. */
817 static struct obstack multilib_obstack;
818 static const char *multilib_select;
819 static const char *multilib_matches;
820 static const char *multilib_defaults;
821 static const char *multilib_exclusions;
823 /* Check whether a particular argument is a default argument. */
825 #ifndef MULTILIB_DEFAULTS
826 #define MULTILIB_DEFAULTS { "" }
827 #endif
829 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
831 #ifndef DRIVER_SELF_SPECS
832 #define DRIVER_SELF_SPECS ""
833 #endif
835 static const char *const driver_self_specs[] = { DRIVER_SELF_SPECS };
837 #ifndef OPTION_DEFAULT_SPECS
838 #define OPTION_DEFAULT_SPECS { "", "" }
839 #endif
841 struct default_spec
843 const char *name;
844 const char *spec;
847 static const struct default_spec
848 option_default_specs[] = { OPTION_DEFAULT_SPECS };
850 struct user_specs
852 struct user_specs *next;
853 const char *filename;
856 static struct user_specs *user_specs_head, *user_specs_tail;
858 #ifndef SWITCH_TAKES_ARG
859 #define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
860 #endif
862 #ifndef WORD_SWITCH_TAKES_ARG
863 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
864 #endif
866 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
867 /* This defines which switches stop a full compilation. */
868 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
869 ((CHAR) == 'c' || (CHAR) == 'S')
871 #ifndef SWITCH_CURTAILS_COMPILATION
872 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
873 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
874 #endif
875 #endif
877 /* Record the mapping from file suffixes for compilation specs. */
879 struct compiler
881 const char *suffix; /* Use this compiler for input files
882 whose names end in this suffix. */
884 const char *spec; /* To use this compiler, run this spec. */
886 const char *cpp_spec; /* If non-NULL, substitute this spec
887 for `%C', rather than the usual
888 cpp_spec. */
889 const int combinable; /* If nonzero, compiler can deal with
890 multiple source files at once (IMA). */
891 const int needs_preprocessing; /* If nonzero, source files need to
892 be run through a preprocessor. */
895 /* Pointer to a vector of `struct compiler' that gives the spec for
896 compiling a file, based on its suffix.
897 A file that does not end in any of these suffixes will be passed
898 unchanged to the loader and nothing else will be done to it.
900 An entry containing two 0s is used to terminate the vector.
902 If multiple entries match a file, the last matching one is used. */
904 static struct compiler *compilers;
906 /* Number of entries in `compilers', not counting the null terminator. */
908 static int n_compilers;
910 /* The default list of file name suffixes and their compilation specs. */
912 static const struct compiler default_compilers[] =
914 /* Add lists of suffixes of known languages here. If those languages
915 were not present when we built the driver, we will hit these copies
916 and be given a more meaningful error than "file not used since
917 linking is not done". */
918 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
919 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
920 {".mii", "#Objective-C++", 0, 0, 0},
921 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
922 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
923 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
924 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
925 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
926 {".f", "#Fortran", 0, 0, 0}, {".for", "#Fortran", 0, 0, 0},
927 {".F", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
928 {".FPP", "#Fortran", 0, 0, 0},
929 {".f90", "#Fortran 95", 0, 0, 0}, {".f95", "#Fortran 95", 0, 0, 0},
930 {".fpp", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
931 {".FOR", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
932 {".r", "#Ratfor", 0, 0, 0},
933 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
934 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
935 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
936 /* Next come the entries for C. */
937 {".c", "@c", 0, 1, 1},
938 {"@c",
939 /* cc1 has an integrated ISO C preprocessor. We should invoke the
940 external preprocessor if -save-temps is given. */
941 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
942 %{!E:%{!M:%{!MM:\
943 %{traditional|ftraditional:\
944 %eGNU C no longer supports -traditional without -E}\
945 %{!combine:\
946 %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
947 %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\
948 cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \
949 %(cc1_options)}\
950 %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
951 cc1 %(cpp_unique_options) %(cc1_options)}}}\
952 %{!fsyntax-only:%(invoke_as)}} \
953 %{combine:\
954 %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
955 %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i}}\
956 %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
957 cc1 %(cpp_unique_options) %(cc1_options)}}\
958 %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
959 {"-",
960 "%{!E:%e-E or -x required when input is from standard input}\
961 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
962 {".h", "@c-header", 0, 0, 0},
963 {"@c-header",
964 /* cc1 has an integrated ISO C preprocessor. We should invoke the
965 external preprocessor if -save-temps is given. */
966 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
967 %{!E:%{!M:%{!MM:\
968 %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
969 %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\
970 cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \
971 %(cc1_options)\
972 -o %g.s %{!o*:--output-pch=%i.gch}\
973 %W{o*:--output-pch=%*}%V}\
974 %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
975 cc1 %(cpp_unique_options) %(cc1_options)\
976 -o %g.s %{!o*:--output-pch=%i.gch}\
977 %W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},
978 {".i", "@cpp-output", 0, 1, 0},
979 {"@cpp-output",
980 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
981 {".s", "@assembler", 0, 1, 0},
982 {"@assembler",
983 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
984 {".S", "@assembler-with-cpp", 0, 1, 0},
985 {"@assembler-with-cpp",
986 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
987 "%(trad_capable_cpp) -lang-asm %(cpp_options)\
988 %{E|M|MM:%(cpp_debug_options)}\
989 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
990 as %(asm_debug) %(asm_options) %|.s %A }}}}"
991 #else
992 "%(trad_capable_cpp) -lang-asm %(cpp_options)\
993 %{E|M|MM:%(cpp_debug_options)}\
994 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
995 as %(asm_debug) %(asm_options) %m.s %A }}}}"
996 #endif
997 , 0, 1, 0},
999 #include "specs.h"
1000 /* Mark end of table. */
1001 {0, 0, 0, 0, 0}
1004 /* Number of elements in default_compilers, not counting the terminator. */
1006 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1008 /* A vector of options to give to the linker.
1009 These options are accumulated by %x,
1010 and substituted into the linker command with %X. */
1011 static int n_linker_options;
1012 static char **linker_options;
1014 /* A vector of options to give to the assembler.
1015 These options are accumulated by -Wa,
1016 and substituted into the assembler command with %Y. */
1017 static int n_assembler_options;
1018 static char **assembler_options;
1020 /* A vector of options to give to the preprocessor.
1021 These options are accumulated by -Wp,
1022 and substituted into the preprocessor command with %Z. */
1023 static int n_preprocessor_options;
1024 static char **preprocessor_options;
1026 /* Define how to map long options into short ones. */
1028 /* This structure describes one mapping. */
1029 struct option_map
1031 /* The long option's name. */
1032 const char *const name;
1033 /* The equivalent short option. */
1034 const char *const equivalent;
1035 /* Argument info. A string of flag chars; NULL equals no options.
1036 a => argument required.
1037 o => argument optional.
1038 j => join argument to equivalent, making one word.
1039 * => require other text after NAME as an argument. */
1040 const char *const arg_info;
1043 /* This is the table of mappings. Mappings are tried sequentially
1044 for each option encountered; the first one that matches, wins. */
1046 static const struct option_map option_map[] =
1048 {"--all-warnings", "-Wall", 0},
1049 {"--ansi", "-ansi", 0},
1050 {"--assemble", "-S", 0},
1051 {"--assert", "-A", "a"},
1052 {"--classpath", "-fclasspath=", "aj"},
1053 {"--bootclasspath", "-fbootclasspath=", "aj"},
1054 {"--CLASSPATH", "-fclasspath=", "aj"},
1055 {"--combine", "-combine", 0},
1056 {"--comments", "-C", 0},
1057 {"--comments-in-macros", "-CC", 0},
1058 {"--compile", "-c", 0},
1059 {"--debug", "-g", "oj"},
1060 {"--define-macro", "-D", "aj"},
1061 {"--dependencies", "-M", 0},
1062 {"--dump", "-d", "a"},
1063 {"--dumpbase", "-dumpbase", "a"},
1064 {"--encoding", "-fencoding=", "aj"},
1065 {"--entry", "-e", 0},
1066 {"--extra-warnings", "-W", 0},
1067 {"--extdirs", "-fextdirs=", "aj"},
1068 {"--for-assembler", "-Wa", "a"},
1069 {"--for-linker", "-Xlinker", "a"},
1070 {"--force-link", "-u", "a"},
1071 {"--coverage", "-coverage", 0},
1072 {"--imacros", "-imacros", "a"},
1073 {"--include", "-include", "a"},
1074 {"--include-barrier", "-I-", 0},
1075 {"--include-directory", "-I", "aj"},
1076 {"--include-directory-after", "-idirafter", "a"},
1077 {"--include-prefix", "-iprefix", "a"},
1078 {"--include-with-prefix", "-iwithprefix", "a"},
1079 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
1080 {"--include-with-prefix-after", "-iwithprefix", "a"},
1081 {"--language", "-x", "a"},
1082 {"--library-directory", "-L", "a"},
1083 {"--machine", "-m", "aj"},
1084 {"--machine-", "-m", "*j"},
1085 {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1086 {"--no-line-commands", "-P", 0},
1087 {"--no-precompiled-includes", "-noprecomp", 0},
1088 {"--no-standard-includes", "-nostdinc", 0},
1089 {"--no-standard-libraries", "-nostdlib", 0},
1090 {"--no-warnings", "-w", 0},
1091 {"--optimize", "-O", "oj"},
1092 {"--output", "-o", "a"},
1093 {"--output-class-directory", "-foutput-class-dir=", "ja"},
1094 {"--param", "--param", "a"},
1095 {"--pass-exit-codes", "-pass-exit-codes", 0},
1096 {"--pedantic", "-pedantic", 0},
1097 {"--pedantic-errors", "-pedantic-errors", 0},
1098 {"--pie", "-pie", 0},
1099 {"--pipe", "-pipe", 0},
1100 {"--prefix", "-B", "a"},
1101 {"--preprocess", "-E", 0},
1102 {"--print-search-dirs", "-print-search-dirs", 0},
1103 {"--print-file-name", "-print-file-name=", "aj"},
1104 {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
1105 {"--print-missing-file-dependencies", "-MG", 0},
1106 {"--print-multi-lib", "-print-multi-lib", 0},
1107 {"--print-multi-directory", "-print-multi-directory", 0},
1108 {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1109 {"--print-prog-name", "-print-prog-name=", "aj"},
1110 {"--profile", "-p", 0},
1111 {"--profile-blocks", "-a", 0},
1112 {"--quiet", "-q", 0},
1113 {"--resource", "-fcompile-resource=", "aj"},
1114 {"--save-temps", "-save-temps", 0},
1115 {"--shared", "-shared", 0},
1116 {"--silent", "-q", 0},
1117 {"--specs", "-specs=", "aj"},
1118 {"--static", "-static", 0},
1119 {"--std", "-std=", "aj"},
1120 {"--symbolic", "-symbolic", 0},
1121 {"--time", "-time", 0},
1122 {"--trace-includes", "-H", 0},
1123 {"--traditional", "-traditional", 0},
1124 {"--traditional-cpp", "-traditional-cpp", 0},
1125 {"--trigraphs", "-trigraphs", 0},
1126 {"--undefine-macro", "-U", "aj"},
1127 {"--user-dependencies", "-MM", 0},
1128 {"--verbose", "-v", 0},
1129 {"--warn-", "-W", "*j"},
1130 {"--write-dependencies", "-MD", 0},
1131 {"--write-user-dependencies", "-MMD", 0},
1132 {"--", "-f", "*j"}
1136 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1137 static const struct {
1138 const char *const option_found;
1139 const char *const replacements;
1140 } target_option_translations[] =
1142 TARGET_OPTION_TRANSLATE_TABLE,
1143 { 0, 0 }
1145 #endif
1147 /* Translate the options described by *ARGCP and *ARGVP.
1148 Make a new vector and store it back in *ARGVP,
1149 and store its length in *ARGVC. */
1151 static void
1152 translate_options (int *argcp, const char *const **argvp)
1154 int i;
1155 int argc = *argcp;
1156 const char *const *argv = *argvp;
1157 int newvsize = (argc + 2) * 2 * sizeof (const char *);
1158 const char **newv = xmalloc (newvsize);
1159 int newindex = 0;
1161 i = 0;
1162 newv[newindex++] = argv[i++];
1164 while (i < argc)
1166 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1167 int tott_idx;
1169 for (tott_idx = 0;
1170 target_option_translations[tott_idx].option_found;
1171 tott_idx++)
1173 if (strcmp (target_option_translations[tott_idx].option_found,
1174 argv[i]) == 0)
1176 int spaces = 1;
1177 const char *sp;
1178 char *np;
1180 for (sp = target_option_translations[tott_idx].replacements;
1181 *sp; sp++)
1183 if (*sp == ' ')
1184 spaces ++;
1187 newvsize += spaces * sizeof (const char *);
1188 newv = xrealloc (newv, newvsize);
1190 sp = target_option_translations[tott_idx].replacements;
1191 np = xstrdup (sp);
1193 while (1)
1195 while (*np == ' ')
1196 np++;
1197 if (*np == 0)
1198 break;
1199 newv[newindex++] = np;
1200 while (*np != ' ' && *np)
1201 np++;
1202 if (*np == 0)
1203 break;
1204 *np++ = 0;
1207 i ++;
1208 break;
1211 if (target_option_translations[tott_idx].option_found)
1212 continue;
1213 #endif
1215 /* Translate -- options. */
1216 if (argv[i][0] == '-' && argv[i][1] == '-')
1218 size_t j;
1219 /* Find a mapping that applies to this option. */
1220 for (j = 0; j < ARRAY_SIZE (option_map); j++)
1222 size_t optlen = strlen (option_map[j].name);
1223 size_t arglen = strlen (argv[i]);
1224 size_t complen = arglen > optlen ? optlen : arglen;
1225 const char *arginfo = option_map[j].arg_info;
1227 if (arginfo == 0)
1228 arginfo = "";
1230 if (!strncmp (argv[i], option_map[j].name, complen))
1232 const char *arg = 0;
1234 if (arglen < optlen)
1236 size_t k;
1237 for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1238 if (strlen (option_map[k].name) >= arglen
1239 && !strncmp (argv[i], option_map[k].name, arglen))
1241 error ("ambiguous abbreviation %s", argv[i]);
1242 break;
1245 if (k != ARRAY_SIZE (option_map))
1246 break;
1249 if (arglen > optlen)
1251 /* If the option has an argument, accept that. */
1252 if (argv[i][optlen] == '=')
1253 arg = argv[i] + optlen + 1;
1255 /* If this mapping requires extra text at end of name,
1256 accept that as "argument". */
1257 else if (strchr (arginfo, '*') != 0)
1258 arg = argv[i] + optlen;
1260 /* Otherwise, extra text at end means mismatch.
1261 Try other mappings. */
1262 else
1263 continue;
1266 else if (strchr (arginfo, '*') != 0)
1268 error ("incomplete '%s' option", option_map[j].name);
1269 break;
1272 /* Handle arguments. */
1273 if (strchr (arginfo, 'a') != 0)
1275 if (arg == 0)
1277 if (i + 1 == argc)
1279 error ("missing argument to '%s' option",
1280 option_map[j].name);
1281 break;
1284 arg = argv[++i];
1287 else if (strchr (arginfo, '*') != 0)
1289 else if (strchr (arginfo, 'o') == 0)
1291 if (arg != 0)
1292 error ("extraneous argument to '%s' option",
1293 option_map[j].name);
1294 arg = 0;
1297 /* Store the translation as one argv elt or as two. */
1298 if (arg != 0 && strchr (arginfo, 'j') != 0)
1299 newv[newindex++] = concat (option_map[j].equivalent, arg,
1300 NULL);
1301 else if (arg != 0)
1303 newv[newindex++] = option_map[j].equivalent;
1304 newv[newindex++] = arg;
1306 else
1307 newv[newindex++] = option_map[j].equivalent;
1309 break;
1312 i++;
1315 /* Handle old-fashioned options--just copy them through,
1316 with their arguments. */
1317 else if (argv[i][0] == '-')
1319 const char *p = argv[i] + 1;
1320 int c = *p;
1321 int nskip = 1;
1323 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1324 nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1325 else if (WORD_SWITCH_TAKES_ARG (p))
1326 nskip += WORD_SWITCH_TAKES_ARG (p);
1327 else if ((c == 'B' || c == 'b' || c == 'x')
1328 && p[1] == 0)
1329 nskip += 1;
1330 else if (! strcmp (p, "Xlinker"))
1331 nskip += 1;
1332 else if (! strcmp (p, "Xpreprocessor"))
1333 nskip += 1;
1334 else if (! strcmp (p, "Xassembler"))
1335 nskip += 1;
1337 /* Watch out for an option at the end of the command line that
1338 is missing arguments, and avoid skipping past the end of the
1339 command line. */
1340 if (nskip + i > argc)
1341 nskip = argc - i;
1343 while (nskip > 0)
1345 newv[newindex++] = argv[i++];
1346 nskip--;
1349 else
1350 /* Ordinary operands, or +e options. */
1351 newv[newindex++] = argv[i++];
1354 newv[newindex] = 0;
1356 *argvp = newv;
1357 *argcp = newindex;
1360 static char *
1361 skip_whitespace (char *p)
1363 while (1)
1365 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1366 be considered whitespace. */
1367 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1368 return p + 1;
1369 else if (*p == '\n' || *p == ' ' || *p == '\t')
1370 p++;
1371 else if (*p == '#')
1373 while (*p != '\n')
1374 p++;
1375 p++;
1377 else
1378 break;
1381 return p;
1383 /* Structures to keep track of prefixes to try when looking for files. */
1385 struct prefix_list
1387 const char *prefix; /* String to prepend to the path. */
1388 struct prefix_list *next; /* Next in linked list. */
1389 int require_machine_suffix; /* Don't use without machine_suffix. */
1390 /* 2 means try both machine_suffix and just_machine_suffix. */
1391 int priority; /* Sort key - priority within list. */
1392 int os_multilib; /* 1 if OS multilib scheme should be used,
1393 0 for GCC multilib scheme. */
1396 struct path_prefix
1398 struct prefix_list *plist; /* List of prefixes to try */
1399 int max_len; /* Max length of a prefix in PLIST */
1400 const char *name; /* Name of this list (used in config stuff) */
1403 /* List of prefixes to try when looking for executables. */
1405 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1407 /* List of prefixes to try when looking for startup (crt0) files. */
1409 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1411 /* List of prefixes to try when looking for include files. */
1413 static struct path_prefix include_prefixes = { 0, 0, "include" };
1415 /* Suffix to attach to directories searched for commands.
1416 This looks like `MACHINE/VERSION/'. */
1418 static const char *machine_suffix = 0;
1420 /* Suffix to attach to directories searched for commands.
1421 This is just `MACHINE/'. */
1423 static const char *just_machine_suffix = 0;
1425 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1427 static const char *gcc_exec_prefix;
1429 /* Adjusted value of standard_libexec_prefix. */
1431 static const char *gcc_libexec_prefix;
1433 /* Default prefixes to attach to command names. */
1435 #ifndef STANDARD_STARTFILE_PREFIX_1
1436 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1437 #endif
1438 #ifndef STANDARD_STARTFILE_PREFIX_2
1439 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1440 #endif
1442 #ifdef CROSS_COMPILE /* Don't use these prefixes for a cross compiler. */
1443 #undef MD_EXEC_PREFIX
1444 #undef MD_STARTFILE_PREFIX
1445 #undef MD_STARTFILE_PREFIX_1
1446 #endif
1448 /* If no prefixes defined, use the null string, which will disable them. */
1449 #ifndef MD_EXEC_PREFIX
1450 #define MD_EXEC_PREFIX ""
1451 #endif
1452 #ifndef MD_STARTFILE_PREFIX
1453 #define MD_STARTFILE_PREFIX ""
1454 #endif
1455 #ifndef MD_STARTFILE_PREFIX_1
1456 #define MD_STARTFILE_PREFIX_1 ""
1457 #endif
1459 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1460 static const char *const standard_exec_prefix_1 = "/usr/libexec/gcc/";
1461 static const char *const standard_exec_prefix_2 = "/usr/lib/gcc/";
1462 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1464 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1465 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1466 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1467 static const char *const standard_startfile_prefix_1
1468 = STANDARD_STARTFILE_PREFIX_1;
1469 static const char *const standard_startfile_prefix_2
1470 = STANDARD_STARTFILE_PREFIX_2;
1472 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1473 static const char *tooldir_prefix;
1475 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1477 static const char *standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1479 /* Subdirectory to use for locating libraries. Set by
1480 set_multilib_dir based on the compilation options. */
1482 static const char *multilib_dir;
1484 /* Subdirectory to use for locating libraries in OS conventions. Set by
1485 set_multilib_dir based on the compilation options. */
1487 static const char *multilib_os_dir;
1489 /* Structure to keep track of the specs that have been defined so far.
1490 These are accessed using %(specname) or %[specname] in a compiler
1491 or link spec. */
1493 struct spec_list
1495 /* The following 2 fields must be first */
1496 /* to allow EXTRA_SPECS to be initialized */
1497 const char *name; /* name of the spec. */
1498 const char *ptr; /* available ptr if no static pointer */
1500 /* The following fields are not initialized */
1501 /* by EXTRA_SPECS */
1502 const char **ptr_spec; /* pointer to the spec itself. */
1503 struct spec_list *next; /* Next spec in linked list. */
1504 int name_len; /* length of the name */
1505 int alloc_p; /* whether string was allocated */
1508 #define INIT_STATIC_SPEC(NAME,PTR) \
1509 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1511 /* List of statically defined specs. */
1512 static struct spec_list static_specs[] =
1514 INIT_STATIC_SPEC ("asm", &asm_spec),
1515 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1516 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1517 INIT_STATIC_SPEC ("asm_options", &asm_options),
1518 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1519 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1520 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1521 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1522 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1523 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1524 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1525 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1526 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1527 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1528 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1529 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1530 INIT_STATIC_SPEC ("link", &link_spec),
1531 INIT_STATIC_SPEC ("lib", &lib_spec),
1532 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1533 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1534 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1535 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1536 INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
1537 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1538 INIT_STATIC_SPEC ("version", &compiler_version),
1539 INIT_STATIC_SPEC ("multilib", &multilib_select),
1540 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1541 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1542 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1543 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1544 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1545 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1546 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1547 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1548 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1549 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1550 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1551 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1552 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1553 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1556 #ifdef EXTRA_SPECS /* additional specs needed */
1557 /* Structure to keep track of just the first two args of a spec_list.
1558 That is all that the EXTRA_SPECS macro gives us. */
1559 struct spec_list_1
1561 const char *const name;
1562 const char *const ptr;
1565 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1566 static struct spec_list *extra_specs = (struct spec_list *) 0;
1567 #endif
1569 /* List of dynamically allocates specs that have been defined so far. */
1571 static struct spec_list *specs = (struct spec_list *) 0;
1573 /* List of static spec functions. */
1575 static const struct spec_function static_spec_functions[] =
1577 { "if-exists", if_exists_spec_function },
1578 { "if-exists-else", if_exists_else_spec_function },
1579 { "replace-outfile", replace_outfile_spec_function },
1580 { 0, 0 }
1583 static int processing_spec_function;
1585 /* Add appropriate libgcc specs to OBSTACK, taking into account
1586 various permutations of -shared-libgcc, -shared, and such. */
1588 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1590 #ifndef USE_LD_AS_NEEDED
1591 #define USE_LD_AS_NEEDED 0
1592 #endif
1594 static void
1595 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1596 const char *static_name, const char *eh_name)
1598 char *buf;
1600 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name,
1601 "}%{!static:%{!static-libgcc:",
1602 #if USE_LD_AS_NEEDED
1603 "%{!shared-libgcc:", static_name,
1604 " --as-needed ", shared_name, " --no-as-needed}"
1605 "%{shared-libgcc:", shared_name, "%{!shared: ", static_name,
1606 "}",
1607 #else
1608 "%{!shared:%{!shared-libgcc:", static_name, " ",
1609 eh_name, "}%{shared-libgcc:", shared_name, " ",
1610 static_name, "}}%{shared:",
1611 #ifdef LINK_EH_SPEC
1612 "%{shared-libgcc:", shared_name,
1613 "}%{!shared-libgcc:", static_name, "}",
1614 #else
1615 shared_name,
1616 #endif
1617 #endif
1618 "}}}", NULL);
1620 obstack_grow (obstack, buf, strlen (buf));
1621 free (buf);
1623 #endif /* ENABLE_SHARED_LIBGCC */
1625 /* Initialize the specs lookup routines. */
1627 static void
1628 init_spec (void)
1630 struct spec_list *next = (struct spec_list *) 0;
1631 struct spec_list *sl = (struct spec_list *) 0;
1632 int i;
1634 if (specs)
1635 return; /* Already initialized. */
1637 if (verbose_flag)
1638 notice ("Using built-in specs.\n");
1640 #ifdef EXTRA_SPECS
1641 extra_specs = xcalloc (sizeof (struct spec_list),
1642 ARRAY_SIZE (extra_specs_1));
1644 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1646 sl = &extra_specs[i];
1647 sl->name = extra_specs_1[i].name;
1648 sl->ptr = extra_specs_1[i].ptr;
1649 sl->next = next;
1650 sl->name_len = strlen (sl->name);
1651 sl->ptr_spec = &sl->ptr;
1652 next = sl;
1654 #endif
1656 /* Initialize here, not in definition. The IRIX 6 O32 cc sometimes chokes
1657 on ?: in file-scope variable initializations. */
1658 asm_debug = ASM_DEBUG_SPEC;
1660 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1662 sl = &static_specs[i];
1663 sl->next = next;
1664 next = sl;
1667 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1668 /* ??? If neither -shared-libgcc nor --static-libgcc was
1669 seen, then we should be making an educated guess. Some proposed
1670 heuristics for ELF include:
1672 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1673 program will be doing dynamic loading, which will likely
1674 need the shared libgcc.
1676 (2) If "-ldl", then it's also a fair bet that we're doing
1677 dynamic loading.
1679 (3) For each ET_DYN we're linking against (either through -lfoo
1680 or /some/path/foo.so), check to see whether it or one of
1681 its dependencies depends on a shared libgcc.
1683 (4) If "-shared"
1685 If the runtime is fixed to look for program headers instead
1686 of calling __register_frame_info at all, for each object,
1687 use the shared libgcc if any EH symbol referenced.
1689 If crtstuff is fixed to not invoke __register_frame_info
1690 automatically, for each object, use the shared libgcc if
1691 any non-empty unwind section found.
1693 Doing any of this probably requires invoking an external program to
1694 do the actual object file scanning. */
1696 const char *p = libgcc_spec;
1697 int in_sep = 1;
1699 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1700 when given the proper command line arguments. */
1701 while (*p)
1703 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1705 init_gcc_specs (&obstack,
1706 "-lgcc_s"
1707 #ifdef USE_LIBUNWIND_EXCEPTIONS
1708 " -lunwind"
1709 #endif
1711 "-lgcc",
1712 "-lgcc_eh"
1713 #ifdef USE_LIBUNWIND_EXCEPTIONS
1714 # ifdef HAVE_LD_STATIC_DYNAMIC
1715 " %{!static:-Bstatic} -lunwind %{!static:-Bdynamic}"
1716 # else
1717 " -lunwind"
1718 # endif
1719 #endif
1722 p += 5;
1723 in_sep = 0;
1725 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1727 /* Ug. We don't know shared library extensions. Hope that
1728 systems that use this form don't do shared libraries. */
1729 init_gcc_specs (&obstack,
1730 "-lgcc_s",
1731 "libgcc.a%s",
1732 "libgcc_eh.a%s"
1733 #ifdef USE_LIBUNWIND_EXCEPTIONS
1734 " -lunwind"
1735 #endif
1737 p += 10;
1738 in_sep = 0;
1740 else
1742 obstack_1grow (&obstack, *p);
1743 in_sep = (*p == ' ');
1744 p += 1;
1748 obstack_1grow (&obstack, '\0');
1749 libgcc_spec = XOBFINISH (&obstack, const char *);
1751 #endif
1752 #ifdef USE_AS_TRADITIONAL_FORMAT
1753 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1755 static const char tf[] = "--traditional-format ";
1756 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1757 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1758 asm_spec = XOBFINISH (&obstack, const char *);
1760 #endif
1761 #ifdef LINK_EH_SPEC
1762 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1763 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1764 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1765 link_spec = XOBFINISH (&obstack, const char *);
1766 #endif
1768 specs = sl;
1771 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1772 removed; If the spec starts with a + then SPEC is added to the end of the
1773 current spec. */
1775 static void
1776 set_spec (const char *name, const char *spec)
1778 struct spec_list *sl;
1779 const char *old_spec;
1780 int name_len = strlen (name);
1781 int i;
1783 /* If this is the first call, initialize the statically allocated specs. */
1784 if (!specs)
1786 struct spec_list *next = (struct spec_list *) 0;
1787 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1789 sl = &static_specs[i];
1790 sl->next = next;
1791 next = sl;
1793 specs = sl;
1796 /* See if the spec already exists. */
1797 for (sl = specs; sl; sl = sl->next)
1798 if (name_len == sl->name_len && !strcmp (sl->name, name))
1799 break;
1801 if (!sl)
1803 /* Not found - make it. */
1804 sl = xmalloc (sizeof (struct spec_list));
1805 sl->name = xstrdup (name);
1806 sl->name_len = name_len;
1807 sl->ptr_spec = &sl->ptr;
1808 sl->alloc_p = 0;
1809 *(sl->ptr_spec) = "";
1810 sl->next = specs;
1811 specs = sl;
1814 old_spec = *(sl->ptr_spec);
1815 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1816 ? concat (old_spec, spec + 1, NULL)
1817 : xstrdup (spec));
1819 #ifdef DEBUG_SPECS
1820 if (verbose_flag)
1821 notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1822 #endif
1824 /* Free the old spec. */
1825 if (old_spec && sl->alloc_p)
1826 free ((void *) old_spec);
1828 sl->alloc_p = 1;
1831 /* Accumulate a command (program name and args), and run it. */
1833 /* Vector of pointers to arguments in the current line of specifications. */
1835 static const char **argbuf;
1837 /* Number of elements allocated in argbuf. */
1839 static int argbuf_length;
1841 /* Number of elements in argbuf currently in use (containing args). */
1843 static int argbuf_index;
1845 /* Position in the argbuf array containing the name of the output file
1846 (the value associated with the "-o" flag). */
1848 static int have_o_argbuf_index = 0;
1850 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1851 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1852 it here. */
1854 static struct temp_name {
1855 const char *suffix; /* suffix associated with the code. */
1856 int length; /* strlen (suffix). */
1857 int unique; /* Indicates whether %g or %u/%U was used. */
1858 const char *filename; /* associated filename. */
1859 int filename_length; /* strlen (filename). */
1860 struct temp_name *next;
1861 } *temp_names;
1863 /* Number of commands executed so far. */
1865 static int execution_count;
1867 /* Number of commands that exited with a signal. */
1869 static int signal_count;
1871 /* Name with which this program was invoked. */
1873 static const char *programname;
1875 /* Allocate the argument vector. */
1877 static void
1878 alloc_args (void)
1880 argbuf_length = 10;
1881 argbuf = xmalloc (argbuf_length * sizeof (const char *));
1884 /* Clear out the vector of arguments (after a command is executed). */
1886 static void
1887 clear_args (void)
1889 argbuf_index = 0;
1892 /* Add one argument to the vector at the end.
1893 This is done when a space is seen or at the end of the line.
1894 If DELETE_ALWAYS is nonzero, the arg is a filename
1895 and the file should be deleted eventually.
1896 If DELETE_FAILURE is nonzero, the arg is a filename
1897 and the file should be deleted if this compilation fails. */
1899 static void
1900 store_arg (const char *arg, int delete_always, int delete_failure)
1902 if (argbuf_index + 1 == argbuf_length)
1903 argbuf = xrealloc (argbuf, (argbuf_length *= 2) * sizeof (const char *));
1905 argbuf[argbuf_index++] = arg;
1906 argbuf[argbuf_index] = 0;
1908 if (strcmp (arg, "-o") == 0)
1909 have_o_argbuf_index = argbuf_index;
1910 if (delete_always || delete_failure)
1911 record_temp_file (arg, delete_always, delete_failure);
1914 /* Load specs from a file name named FILENAME, replacing occurrences of
1915 various different types of line-endings, \r\n, \n\r and just \r, with
1916 a single \n. */
1918 static char *
1919 load_specs (const char *filename)
1921 int desc;
1922 int readlen;
1923 struct stat statbuf;
1924 char *buffer;
1925 char *buffer_p;
1926 char *specs;
1927 char *specs_p;
1929 if (verbose_flag)
1930 notice ("Reading specs from %s\n", filename);
1932 /* Open and stat the file. */
1933 desc = open (filename, O_RDONLY, 0);
1934 if (desc < 0)
1935 pfatal_with_name (filename);
1936 if (stat (filename, &statbuf) < 0)
1937 pfatal_with_name (filename);
1939 /* Read contents of file into BUFFER. */
1940 buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1941 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1942 if (readlen < 0)
1943 pfatal_with_name (filename);
1944 buffer[readlen] = 0;
1945 close (desc);
1947 specs = xmalloc (readlen + 1);
1948 specs_p = specs;
1949 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1951 int skip = 0;
1952 char c = *buffer_p;
1953 if (c == '\r')
1955 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
1956 skip = 1;
1957 else if (*(buffer_p + 1) == '\n') /* \r\n */
1958 skip = 1;
1959 else /* \r */
1960 c = '\n';
1962 if (! skip)
1963 *specs_p++ = c;
1965 *specs_p = '\0';
1967 free (buffer);
1968 return (specs);
1971 /* Read compilation specs from a file named FILENAME,
1972 replacing the default ones.
1974 A suffix which starts with `*' is a definition for
1975 one of the machine-specific sub-specs. The "suffix" should be
1976 *asm, *cc1, *cpp, *link, *startfile, etc.
1977 The corresponding spec is stored in asm_spec, etc.,
1978 rather than in the `compilers' vector.
1980 Anything invalid in the file is a fatal error. */
1982 static void
1983 read_specs (const char *filename, int main_p)
1985 char *buffer;
1986 char *p;
1988 buffer = load_specs (filename);
1990 /* Scan BUFFER for specs, putting them in the vector. */
1991 p = buffer;
1992 while (1)
1994 char *suffix;
1995 char *spec;
1996 char *in, *out, *p1, *p2, *p3;
1998 /* Advance P in BUFFER to the next nonblank nocomment line. */
1999 p = skip_whitespace (p);
2000 if (*p == 0)
2001 break;
2003 /* Is this a special command that starts with '%'? */
2004 /* Don't allow this for the main specs file, since it would
2005 encourage people to overwrite it. */
2006 if (*p == '%' && !main_p)
2008 p1 = p;
2009 while (*p && *p != '\n')
2010 p++;
2012 /* Skip '\n'. */
2013 p++;
2015 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2016 && (p1[sizeof "%include" - 1] == ' '
2017 || p1[sizeof "%include" - 1] == '\t'))
2019 char *new_filename;
2021 p1 += sizeof ("%include");
2022 while (*p1 == ' ' || *p1 == '\t')
2023 p1++;
2025 if (*p1++ != '<' || p[-2] != '>')
2026 fatal ("specs %%include syntax malformed after %ld characters",
2027 (long) (p1 - buffer + 1));
2029 p[-2] = '\0';
2030 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
2031 read_specs (new_filename ? new_filename : p1, FALSE);
2032 continue;
2034 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2035 && (p1[sizeof "%include_noerr" - 1] == ' '
2036 || p1[sizeof "%include_noerr" - 1] == '\t'))
2038 char *new_filename;
2040 p1 += sizeof "%include_noerr";
2041 while (*p1 == ' ' || *p1 == '\t')
2042 p1++;
2044 if (*p1++ != '<' || p[-2] != '>')
2045 fatal ("specs %%include syntax malformed after %ld characters",
2046 (long) (p1 - buffer + 1));
2048 p[-2] = '\0';
2049 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
2050 if (new_filename)
2051 read_specs (new_filename, FALSE);
2052 else if (verbose_flag)
2053 notice ("could not find specs file %s\n", p1);
2054 continue;
2056 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2057 && (p1[sizeof "%rename" - 1] == ' '
2058 || p1[sizeof "%rename" - 1] == '\t'))
2060 int name_len;
2061 struct spec_list *sl;
2062 struct spec_list *newsl;
2064 /* Get original name. */
2065 p1 += sizeof "%rename";
2066 while (*p1 == ' ' || *p1 == '\t')
2067 p1++;
2069 if (! ISALPHA ((unsigned char) *p1))
2070 fatal ("specs %%rename syntax malformed after %ld characters",
2071 (long) (p1 - buffer));
2073 p2 = p1;
2074 while (*p2 && !ISSPACE ((unsigned char) *p2))
2075 p2++;
2077 if (*p2 != ' ' && *p2 != '\t')
2078 fatal ("specs %%rename syntax malformed after %ld characters",
2079 (long) (p2 - buffer));
2081 name_len = p2 - p1;
2082 *p2++ = '\0';
2083 while (*p2 == ' ' || *p2 == '\t')
2084 p2++;
2086 if (! ISALPHA ((unsigned char) *p2))
2087 fatal ("specs %%rename syntax malformed after %ld characters",
2088 (long) (p2 - buffer));
2090 /* Get new spec name. */
2091 p3 = p2;
2092 while (*p3 && !ISSPACE ((unsigned char) *p3))
2093 p3++;
2095 if (p3 != p - 1)
2096 fatal ("specs %%rename syntax malformed after %ld characters",
2097 (long) (p3 - buffer));
2098 *p3 = '\0';
2100 for (sl = specs; sl; sl = sl->next)
2101 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2102 break;
2104 if (!sl)
2105 fatal ("specs %s spec was not found to be renamed", p1);
2107 if (strcmp (p1, p2) == 0)
2108 continue;
2110 for (newsl = specs; newsl; newsl = newsl->next)
2111 if (strcmp (newsl->name, p2) == 0)
2112 fatal ("%s: attempt to rename spec '%s' to already defined spec '%s'",
2113 filename, p1, p2);
2115 if (verbose_flag)
2117 notice ("rename spec %s to %s\n", p1, p2);
2118 #ifdef DEBUG_SPECS
2119 notice ("spec is '%s'\n\n", *(sl->ptr_spec));
2120 #endif
2123 set_spec (p2, *(sl->ptr_spec));
2124 if (sl->alloc_p)
2125 free ((void *) *(sl->ptr_spec));
2127 *(sl->ptr_spec) = "";
2128 sl->alloc_p = 0;
2129 continue;
2131 else
2132 fatal ("specs unknown %% command after %ld characters",
2133 (long) (p1 - buffer));
2136 /* Find the colon that should end the suffix. */
2137 p1 = p;
2138 while (*p1 && *p1 != ':' && *p1 != '\n')
2139 p1++;
2141 /* The colon shouldn't be missing. */
2142 if (*p1 != ':')
2143 fatal ("specs file malformed after %ld characters",
2144 (long) (p1 - buffer));
2146 /* Skip back over trailing whitespace. */
2147 p2 = p1;
2148 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2149 p2--;
2151 /* Copy the suffix to a string. */
2152 suffix = save_string (p, p2 - p);
2153 /* Find the next line. */
2154 p = skip_whitespace (p1 + 1);
2155 if (p[1] == 0)
2156 fatal ("specs file malformed after %ld characters",
2157 (long) (p - buffer));
2159 p1 = p;
2160 /* Find next blank line or end of string. */
2161 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2162 p1++;
2164 /* Specs end at the blank line and do not include the newline. */
2165 spec = save_string (p, p1 - p);
2166 p = p1;
2168 /* Delete backslash-newline sequences from the spec. */
2169 in = spec;
2170 out = spec;
2171 while (*in != 0)
2173 if (in[0] == '\\' && in[1] == '\n')
2174 in += 2;
2175 else if (in[0] == '#')
2176 while (*in && *in != '\n')
2177 in++;
2179 else
2180 *out++ = *in++;
2182 *out = 0;
2184 if (suffix[0] == '*')
2186 if (! strcmp (suffix, "*link_command"))
2187 link_command_spec = spec;
2188 else
2189 set_spec (suffix + 1, spec);
2191 else
2193 /* Add this pair to the vector. */
2194 compilers
2195 = xrealloc (compilers,
2196 (n_compilers + 2) * sizeof (struct compiler));
2198 compilers[n_compilers].suffix = suffix;
2199 compilers[n_compilers].spec = spec;
2200 n_compilers++;
2201 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2204 if (*suffix == 0)
2205 link_command_spec = spec;
2208 if (link_command_spec == 0)
2209 fatal ("spec file has no spec for linking");
2212 /* Record the names of temporary files we tell compilers to write,
2213 and delete them at the end of the run. */
2215 /* This is the common prefix we use to make temp file names.
2216 It is chosen once for each run of this program.
2217 It is substituted into a spec by %g or %j.
2218 Thus, all temp file names contain this prefix.
2219 In practice, all temp file names start with this prefix.
2221 This prefix comes from the envvar TMPDIR if it is defined;
2222 otherwise, from the P_tmpdir macro if that is defined;
2223 otherwise, in /usr/tmp or /tmp;
2224 or finally the current directory if all else fails. */
2226 static const char *temp_filename;
2228 /* Length of the prefix. */
2230 static int temp_filename_length;
2232 /* Define the list of temporary files to delete. */
2234 struct temp_file
2236 const char *name;
2237 struct temp_file *next;
2240 /* Queue of files to delete on success or failure of compilation. */
2241 static struct temp_file *always_delete_queue;
2242 /* Queue of files to delete on failure of compilation. */
2243 static struct temp_file *failure_delete_queue;
2245 /* Record FILENAME as a file to be deleted automatically.
2246 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2247 otherwise delete it in any case.
2248 FAIL_DELETE nonzero means delete it if a compilation step fails;
2249 otherwise delete it in any case. */
2251 void
2252 record_temp_file (const char *filename, int always_delete, int fail_delete)
2254 char *const name = xstrdup (filename);
2256 if (always_delete)
2258 struct temp_file *temp;
2259 for (temp = always_delete_queue; temp; temp = temp->next)
2260 if (! strcmp (name, temp->name))
2261 goto already1;
2263 temp = xmalloc (sizeof (struct temp_file));
2264 temp->next = always_delete_queue;
2265 temp->name = name;
2266 always_delete_queue = temp;
2268 already1:;
2271 if (fail_delete)
2273 struct temp_file *temp;
2274 for (temp = failure_delete_queue; temp; temp = temp->next)
2275 if (! strcmp (name, temp->name))
2276 goto already2;
2278 temp = xmalloc (sizeof (struct temp_file));
2279 temp->next = failure_delete_queue;
2280 temp->name = name;
2281 failure_delete_queue = temp;
2283 already2:;
2287 /* Delete all the temporary files whose names we previously recorded. */
2289 #ifndef DELETE_IF_ORDINARY
2290 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2291 do \
2293 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2294 if (unlink (NAME) < 0) \
2295 if (VERBOSE_FLAG) \
2296 perror_with_name (NAME); \
2297 } while (0)
2298 #endif
2300 static void
2301 delete_if_ordinary (const char *name)
2303 struct stat st;
2304 #ifdef DEBUG
2305 int i, c;
2307 printf ("Delete %s? (y or n) ", name);
2308 fflush (stdout);
2309 i = getchar ();
2310 if (i != '\n')
2311 while ((c = getchar ()) != '\n' && c != EOF)
2314 if (i == 'y' || i == 'Y')
2315 #endif /* DEBUG */
2316 DELETE_IF_ORDINARY (name, st, verbose_flag);
2319 static void
2320 delete_temp_files (void)
2322 struct temp_file *temp;
2324 for (temp = always_delete_queue; temp; temp = temp->next)
2325 delete_if_ordinary (temp->name);
2326 always_delete_queue = 0;
2329 /* Delete all the files to be deleted on error. */
2331 static void
2332 delete_failure_queue (void)
2334 struct temp_file *temp;
2336 for (temp = failure_delete_queue; temp; temp = temp->next)
2337 delete_if_ordinary (temp->name);
2340 static void
2341 clear_failure_queue (void)
2343 failure_delete_queue = 0;
2346 /* Build a list of search directories from PATHS.
2347 PREFIX is a string to prepend to the list.
2348 If CHECK_DIR_P is nonzero we ensure the directory exists.
2349 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2350 It is also used by the --print-search-dirs flag. */
2352 static char *
2353 build_search_list (struct path_prefix *paths, const char *prefix,
2354 int check_dir_p)
2356 int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
2357 int just_suffix_len
2358 = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
2359 int first_time = TRUE;
2360 struct prefix_list *pprefix;
2362 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2363 obstack_1grow (&collect_obstack, '=');
2365 for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
2367 int len = strlen (pprefix->prefix);
2369 if (machine_suffix
2370 && (! check_dir_p
2371 || is_directory (pprefix->prefix, machine_suffix, 0)))
2373 if (!first_time)
2374 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2376 first_time = FALSE;
2377 obstack_grow (&collect_obstack, pprefix->prefix, len);
2378 obstack_grow (&collect_obstack, machine_suffix, suffix_len);
2381 if (just_machine_suffix
2382 && pprefix->require_machine_suffix == 2
2383 && (! check_dir_p
2384 || is_directory (pprefix->prefix, just_machine_suffix, 0)))
2386 if (! first_time)
2387 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2389 first_time = FALSE;
2390 obstack_grow (&collect_obstack, pprefix->prefix, len);
2391 obstack_grow (&collect_obstack, just_machine_suffix,
2392 just_suffix_len);
2395 if (! pprefix->require_machine_suffix)
2397 if (! first_time)
2398 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2400 first_time = FALSE;
2401 obstack_grow (&collect_obstack, pprefix->prefix, len);
2405 obstack_1grow (&collect_obstack, '\0');
2406 return XOBFINISH (&collect_obstack, char *);
2409 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2410 for collect. */
2412 static void
2413 putenv_from_prefixes (struct path_prefix *paths, const char *env_var)
2415 putenv (build_search_list (paths, env_var, 1));
2418 /* Check whether NAME can be accessed in MODE. This is like access,
2419 except that it never considers directories to be executable. */
2421 static int
2422 access_check (const char *name, int mode)
2424 if (mode == X_OK)
2426 struct stat st;
2428 if (stat (name, &st) < 0
2429 || S_ISDIR (st.st_mode))
2430 return -1;
2433 return access (name, mode);
2436 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2437 access to check permissions.
2438 Return 0 if not found, otherwise return its name, allocated with malloc. */
2440 static char *
2441 find_a_file (struct path_prefix *pprefix, const char *name, int mode,
2442 int multilib)
2444 char *temp;
2445 const char *const file_suffix =
2446 ((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "");
2447 struct prefix_list *pl;
2448 int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
2449 const char *multilib_name, *multilib_os_name;
2451 #ifdef DEFAULT_ASSEMBLER
2452 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2453 return xstrdup (DEFAULT_ASSEMBLER);
2454 #endif
2456 #ifdef DEFAULT_LINKER
2457 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2458 return xstrdup (DEFAULT_LINKER);
2459 #endif
2461 if (machine_suffix)
2462 len += strlen (machine_suffix);
2464 multilib_name = name;
2465 multilib_os_name = name;
2466 if (multilib && multilib_os_dir)
2468 int len1 = multilib_dir ? strlen (multilib_dir) + 1 : 0;
2469 int len2 = strlen (multilib_os_dir) + 1;
2471 len += len1 > len2 ? len1 : len2;
2472 if (multilib_dir)
2473 multilib_name = ACONCAT ((multilib_dir, dir_separator_str, name,
2474 NULL));
2475 if (strcmp (multilib_os_dir, ".") != 0)
2476 multilib_os_name = ACONCAT ((multilib_os_dir, dir_separator_str, name,
2477 NULL));
2480 temp = xmalloc (len);
2482 /* Determine the filename to execute (special case for absolute paths). */
2484 if (IS_ABSOLUTE_PATH (name))
2486 if (access (name, mode) == 0)
2488 strcpy (temp, name);
2489 return temp;
2492 else
2493 for (pl = pprefix->plist; pl; pl = pl->next)
2495 const char *this_name
2496 = pl->os_multilib ? multilib_os_name : multilib_name;
2498 if (machine_suffix)
2500 /* Some systems have a suffix for executable files.
2501 So try appending that first. */
2502 if (file_suffix[0] != 0)
2504 strcpy (temp, pl->prefix);
2505 strcat (temp, machine_suffix);
2506 strcat (temp, multilib_name);
2507 strcat (temp, file_suffix);
2508 if (access_check (temp, mode) == 0)
2509 return temp;
2512 /* Now try just the multilib_name. */
2513 strcpy (temp, pl->prefix);
2514 strcat (temp, machine_suffix);
2515 strcat (temp, multilib_name);
2516 if (access_check (temp, mode) == 0)
2517 return temp;
2520 /* Certain prefixes are tried with just the machine type,
2521 not the version. This is used for finding as, ld, etc. */
2522 if (just_machine_suffix && pl->require_machine_suffix == 2)
2524 /* Some systems have a suffix for executable files.
2525 So try appending that first. */
2526 if (file_suffix[0] != 0)
2528 strcpy (temp, pl->prefix);
2529 strcat (temp, just_machine_suffix);
2530 strcat (temp, multilib_name);
2531 strcat (temp, file_suffix);
2532 if (access_check (temp, mode) == 0)
2533 return temp;
2536 strcpy (temp, pl->prefix);
2537 strcat (temp, just_machine_suffix);
2538 strcat (temp, multilib_name);
2539 if (access_check (temp, mode) == 0)
2540 return temp;
2543 /* Certain prefixes can't be used without the machine suffix
2544 when the machine or version is explicitly specified. */
2545 if (! pl->require_machine_suffix)
2547 /* Some systems have a suffix for executable files.
2548 So try appending that first. */
2549 if (file_suffix[0] != 0)
2551 strcpy (temp, pl->prefix);
2552 strcat (temp, this_name);
2553 strcat (temp, file_suffix);
2554 if (access_check (temp, mode) == 0)
2555 return temp;
2558 strcpy (temp, pl->prefix);
2559 strcat (temp, this_name);
2560 if (access_check (temp, mode) == 0)
2561 return temp;
2565 free (temp);
2566 return 0;
2569 /* Ranking of prefixes in the sort list. -B prefixes are put before
2570 all others. */
2572 enum path_prefix_priority
2574 PREFIX_PRIORITY_B_OPT,
2575 PREFIX_PRIORITY_LAST
2578 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2579 order according to PRIORITY. Within each PRIORITY, new entries are
2580 appended.
2582 If WARN is nonzero, we will warn if no file is found
2583 through this prefix. WARN should point to an int
2584 which will be set to 1 if this entry is used.
2586 COMPONENT is the value to be passed to update_path.
2588 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2589 the complete value of machine_suffix.
2590 2 means try both machine_suffix and just_machine_suffix. */
2592 static void
2593 add_prefix (struct path_prefix *pprefix, const char *prefix,
2594 const char *component, /* enum prefix_priority */ int priority,
2595 int require_machine_suffix, int os_multilib)
2597 struct prefix_list *pl, **prev;
2598 int len;
2600 for (prev = &pprefix->plist;
2601 (*prev) != NULL && (*prev)->priority <= priority;
2602 prev = &(*prev)->next)
2605 /* Keep track of the longest prefix. */
2607 prefix = update_path (prefix, component);
2608 len = strlen (prefix);
2609 if (len > pprefix->max_len)
2610 pprefix->max_len = len;
2612 pl = xmalloc (sizeof (struct prefix_list));
2613 pl->prefix = prefix;
2614 pl->require_machine_suffix = require_machine_suffix;
2615 pl->priority = priority;
2616 pl->os_multilib = os_multilib;
2618 /* Insert after PREV. */
2619 pl->next = (*prev);
2620 (*prev) = pl;
2623 /* Same as add_prefix, but prepending target_system_root to prefix. */
2624 static void
2625 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2626 const char *component,
2627 /* enum prefix_priority */ int priority,
2628 int require_machine_suffix, int os_multilib)
2630 if (!IS_ABSOLUTE_PATH (prefix))
2631 fatal ("system path '%s' is not absolute", prefix);
2633 if (target_system_root)
2635 if (target_sysroot_suffix)
2636 prefix = concat (target_sysroot_suffix, prefix, NULL);
2637 prefix = concat (target_system_root, prefix, NULL);
2639 /* We have to override this because GCC's notion of sysroot
2640 moves along with GCC. */
2641 component = "GCC";
2644 add_prefix (pprefix, prefix, component, priority,
2645 require_machine_suffix, os_multilib);
2648 /* Execute the command specified by the arguments on the current line of spec.
2649 When using pipes, this includes several piped-together commands
2650 with `|' between them.
2652 Return 0 if successful, -1 if failed. */
2654 static int
2655 execute (void)
2657 int i;
2658 int n_commands; /* # of command. */
2659 char *string;
2660 struct pex_obj *pex;
2661 struct command
2663 const char *prog; /* program name. */
2664 const char **argv; /* vector of args. */
2667 struct command *commands; /* each command buffer with above info. */
2669 gcc_assert (!processing_spec_function);
2671 /* Count # of piped commands. */
2672 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2673 if (strcmp (argbuf[i], "|") == 0)
2674 n_commands++;
2676 /* Get storage for each command. */
2677 commands = alloca (n_commands * sizeof (struct command));
2679 /* Split argbuf into its separate piped processes,
2680 and record info about each one.
2681 Also search for the programs that are to be run. */
2683 commands[0].prog = argbuf[0]; /* first command. */
2684 commands[0].argv = &argbuf[0];
2685 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, 0);
2687 if (string)
2688 commands[0].argv[0] = string;
2690 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2691 if (strcmp (argbuf[i], "|") == 0)
2692 { /* each command. */
2693 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2694 fatal ("-pipe not supported");
2695 #endif
2696 argbuf[i] = 0; /* termination of command args. */
2697 commands[n_commands].prog = argbuf[i + 1];
2698 commands[n_commands].argv = &argbuf[i + 1];
2699 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2700 X_OK, 0);
2701 if (string)
2702 commands[n_commands].argv[0] = string;
2703 n_commands++;
2706 argbuf[argbuf_index] = 0;
2708 /* If -v, print what we are about to do, and maybe query. */
2710 if (verbose_flag)
2712 /* For help listings, put a blank line between sub-processes. */
2713 if (print_help_list)
2714 fputc ('\n', stderr);
2716 /* Print each piped command as a separate line. */
2717 for (i = 0; i < n_commands; i++)
2719 const char *const *j;
2721 if (verbose_only_flag)
2723 for (j = commands[i].argv; *j; j++)
2725 const char *p;
2726 fprintf (stderr, " \"");
2727 for (p = *j; *p; ++p)
2729 if (*p == '"' || *p == '\\' || *p == '$')
2730 fputc ('\\', stderr);
2731 fputc (*p, stderr);
2733 fputc ('"', stderr);
2736 else
2737 for (j = commands[i].argv; *j; j++)
2738 fprintf (stderr, " %s", *j);
2740 /* Print a pipe symbol after all but the last command. */
2741 if (i + 1 != n_commands)
2742 fprintf (stderr, " |");
2743 fprintf (stderr, "\n");
2745 fflush (stderr);
2746 if (verbose_only_flag != 0)
2748 /* verbose_only_flag should act as if the spec was
2749 executed, so increment execution_count before
2750 returning. This prevents spurious warnings about
2751 unused linker input files, etc. */
2752 execution_count++;
2753 return 0;
2755 #ifdef DEBUG
2756 notice ("\nGo ahead? (y or n) ");
2757 fflush (stderr);
2758 i = getchar ();
2759 if (i != '\n')
2760 while (getchar () != '\n')
2763 if (i != 'y' && i != 'Y')
2764 return 0;
2765 #endif /* DEBUG */
2768 #ifdef ENABLE_VALGRIND_CHECKING
2769 /* Run the each command through valgrind. To simplify prepending the
2770 path to valgrind and the option "-q" (for quiet operation unless
2771 something triggers), we allocate a separate argv array. */
2773 for (i = 0; i < n_commands; i++)
2775 const char **argv;
2776 int argc;
2777 int j;
2779 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
2782 argv = alloca ((argc + 3) * sizeof (char *));
2784 argv[0] = VALGRIND_PATH;
2785 argv[1] = "-q";
2786 for (j = 2; j < argc + 2; j++)
2787 argv[j] = commands[i].argv[j - 2];
2788 argv[j] = NULL;
2790 commands[i].argv = argv;
2791 commands[i].prog = argv[0];
2793 #endif
2795 /* Run each piped subprocess. */
2797 pex = pex_init (PEX_USE_PIPES | (report_times ? PEX_RECORD_TIMES : 0),
2798 programname, temp_filename);
2799 if (pex == NULL)
2800 pfatal_with_name (_("pex_init failed"));
2802 for (i = 0; i < n_commands; i++)
2804 const char *errmsg;
2805 int err;
2806 const char *string = commands[i].argv[0];
2808 errmsg = pex_run (pex,
2809 ((i + 1 == n_commands ? PEX_LAST : 0)
2810 | (string == commands[i].prog ? PEX_SEARCH : 0)),
2811 string, (char * const *) commands[i].argv,
2812 NULL, NULL, &err);
2813 if (errmsg != NULL)
2815 if (err == 0)
2816 fatal (errmsg);
2817 else
2819 errno = err;
2820 pfatal_with_name (errmsg);
2824 if (string != commands[i].prog)
2825 free ((void *) string);
2828 execution_count++;
2830 /* Wait for all the subprocesses to finish. */
2833 int *statuses;
2834 struct pex_time *times = NULL;
2835 int ret_code = 0;
2837 statuses = alloca (n_commands * sizeof (int));
2838 if (!pex_get_status (pex, n_commands, statuses))
2839 pfatal_with_name (_("failed to get exit status"));
2841 if (report_times)
2843 times = alloca (n_commands * sizeof (struct pex_time));
2844 if (!pex_get_times (pex, n_commands, times))
2845 pfatal_with_name (_("failed to get process times"));
2848 pex_free (pex);
2850 for (i = 0; i < n_commands; ++i)
2852 int status = statuses[i];
2854 if (WIFSIGNALED (status))
2856 #ifdef SIGPIPE
2857 /* SIGPIPE is a special case. It happens in -pipe mode
2858 when the compiler dies before the preprocessor is done,
2859 or the assembler dies before the compiler is done.
2860 There's generally been an error already, and this is
2861 just fallout. So don't generate another error unless
2862 we would otherwise have succeeded. */
2863 if (WTERMSIG (status) == SIGPIPE
2864 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2866 else
2867 #endif
2868 fatal ("\
2869 Internal error: %s (program %s)\n\
2870 Please submit a full bug report.\n\
2871 See %s for instructions.",
2872 strsignal (WTERMSIG (status)), commands[i].prog,
2873 bug_report_url);
2874 signal_count++;
2875 ret_code = -1;
2877 else if (WIFEXITED (status)
2878 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2880 if (WEXITSTATUS (status) > greatest_status)
2881 greatest_status = WEXITSTATUS (status);
2882 ret_code = -1;
2885 if (report_times)
2887 struct pex_time *pt = &times[i];
2888 double ut, st;
2890 ut = ((double) pt->user_seconds
2891 + (double) pt->user_microseconds / 1.0e6);
2892 st = ((double) pt->system_seconds
2893 + (double) pt->system_microseconds / 1.0e6);
2895 if (ut + st != 0)
2896 notice ("# %s %.2f %.2f\n", commands[i].prog, ut, st);
2900 return ret_code;
2904 /* Find all the switches given to us
2905 and make a vector describing them.
2906 The elements of the vector are strings, one per switch given.
2907 If a switch uses following arguments, then the `part1' field
2908 is the switch itself and the `args' field
2909 is a null-terminated vector containing the following arguments.
2910 The `live_cond' field is:
2911 0 when initialized
2912 1 if the switch is true in a conditional spec,
2913 -1 if false (overridden by a later switch)
2914 -2 if this switch should be ignored (used in %<S)
2915 The `validated' field is nonzero if any spec has looked at this switch;
2916 if it remains zero at the end of the run, it must be meaningless. */
2918 #define SWITCH_OK 0
2919 #define SWITCH_FALSE -1
2920 #define SWITCH_IGNORE -2
2921 #define SWITCH_LIVE 1
2923 struct switchstr
2925 const char *part1;
2926 const char **args;
2927 int live_cond;
2928 unsigned char validated;
2929 unsigned char ordering;
2932 static struct switchstr *switches;
2934 static int n_switches;
2936 struct infile
2938 const char *name;
2939 const char *language;
2940 struct compiler *incompiler;
2941 bool compiled;
2942 bool preprocessed;
2945 /* Also a vector of input files specified. */
2947 static struct infile *infiles;
2949 int n_infiles;
2951 /* True if multiple input files are being compiled to a single
2952 assembly file. */
2954 static bool combine_inputs;
2956 /* This counts the number of libraries added by lang_specific_driver, so that
2957 we can tell if there were any user supplied any files or libraries. */
2959 static int added_libraries;
2961 /* And a vector of corresponding output files is made up later. */
2963 const char **outfiles;
2965 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2967 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
2968 is true if we should look for an executable suffix. DO_OBJ
2969 is true if we should look for an object suffix. */
2971 static const char *
2972 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
2973 int do_obj ATTRIBUTE_UNUSED)
2975 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2976 int i;
2977 #endif
2978 int len;
2980 if (name == NULL)
2981 return NULL;
2983 len = strlen (name);
2985 #ifdef HAVE_TARGET_OBJECT_SUFFIX
2986 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
2987 if (do_obj && len > 2
2988 && name[len - 2] == '.'
2989 && name[len - 1] == 'o')
2991 obstack_grow (&obstack, name, len - 2);
2992 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
2993 name = XOBFINISH (&obstack, const char *);
2995 #endif
2997 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2998 /* If there is no filetype, make it the executable suffix (which includes
2999 the "."). But don't get confused if we have just "-o". */
3000 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3001 return name;
3003 for (i = len - 1; i >= 0; i--)
3004 if (IS_DIR_SEPARATOR (name[i]))
3005 break;
3007 for (i++; i < len; i++)
3008 if (name[i] == '.')
3009 return name;
3011 obstack_grow (&obstack, name, len);
3012 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3013 strlen (TARGET_EXECUTABLE_SUFFIX));
3014 name = XOBFINISH (&obstack, const char *);
3015 #endif
3017 return name;
3019 #endif
3021 /* Display the command line switches accepted by gcc. */
3022 static void
3023 display_help (void)
3025 printf (_("Usage: %s [options] file...\n"), programname);
3026 fputs (_("Options:\n"), stdout);
3028 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3029 fputs (_(" --help Display this information\n"), stdout);
3030 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3031 if (! verbose_flag)
3032 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3033 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3034 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3035 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3036 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3037 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3038 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3039 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3040 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3041 fputs (_("\
3042 -print-multi-lib Display the mapping between command line options and\n\
3043 multiple library search directories\n"), stdout);
3044 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3045 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3046 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3047 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3048 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3049 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3050 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3051 fputs (_(" -combine Pass multiple source files to compiler at once\n"), stdout);
3052 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3053 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3054 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3055 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3056 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3057 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3058 fputs (_(" -b <machine> Run gcc for target <machine>, if installed\n"), stdout);
3059 fputs (_(" -V <version> Run gcc version number <version>, if installed\n"), stdout);
3060 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3061 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3062 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3063 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3064 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3065 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3066 fputs (_("\
3067 -x <language> Specify the language of the following input files\n\
3068 Permissible languages include: c c++ assembler none\n\
3069 'none' means revert to the default behavior of\n\
3070 guessing the language based on the file's extension\n\
3071 "), stdout);
3073 printf (_("\
3074 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3075 passed on to the various sub-processes invoked by %s. In order to pass\n\
3076 other options on to these processes the -W<letter> options must be used.\n\
3077 "), programname);
3079 /* The rest of the options are displayed by invocations of the various
3080 sub-processes. */
3083 static void
3084 add_preprocessor_option (const char *option, int len)
3086 n_preprocessor_options++;
3088 if (! preprocessor_options)
3089 preprocessor_options = xmalloc (n_preprocessor_options * sizeof (char *));
3090 else
3091 preprocessor_options = xrealloc (preprocessor_options,
3092 n_preprocessor_options * sizeof (char *));
3094 preprocessor_options [n_preprocessor_options - 1] =
3095 save_string (option, len);
3098 static void
3099 add_assembler_option (const char *option, int len)
3101 n_assembler_options++;
3103 if (! assembler_options)
3104 assembler_options = xmalloc (n_assembler_options * sizeof (char *));
3105 else
3106 assembler_options = xrealloc (assembler_options,
3107 n_assembler_options * sizeof (char *));
3109 assembler_options [n_assembler_options - 1] = save_string (option, len);
3112 static void
3113 add_linker_option (const char *option, int len)
3115 n_linker_options++;
3117 if (! linker_options)
3118 linker_options = xmalloc (n_linker_options * sizeof (char *));
3119 else
3120 linker_options = xrealloc (linker_options,
3121 n_linker_options * sizeof (char *));
3123 linker_options [n_linker_options - 1] = save_string (option, len);
3126 /* Create the vector `switches' and its contents.
3127 Store its length in `n_switches'. */
3129 static void
3130 process_command (int argc, const char **argv)
3132 int i;
3133 const char *temp;
3134 char *temp1;
3135 const char *spec_lang = 0;
3136 int last_language_n_infiles;
3137 int have_c = 0;
3138 int lang_n_infiles = 0;
3139 #ifdef MODIFY_TARGET_NAME
3140 int is_modify_target_name;
3141 int j;
3142 #endif
3144 GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3146 n_switches = 0;
3147 n_infiles = 0;
3148 added_libraries = 0;
3150 /* Figure compiler version from version string. */
3152 compiler_version = temp1 = xstrdup (version_string);
3154 for (; *temp1; ++temp1)
3156 if (*temp1 == ' ')
3158 *temp1 = '\0';
3159 break;
3163 /* If there is a -V or -b option (or both), process it now, before
3164 trying to interpret the rest of the command line. */
3165 if (argc > 1 && argv[1][0] == '-'
3166 && (argv[1][1] == 'V' || argv[1][1] == 'b'))
3168 const char *new_version = DEFAULT_TARGET_VERSION;
3169 const char *new_machine = DEFAULT_TARGET_MACHINE;
3170 const char *progname = argv[0];
3171 char **new_argv;
3172 char *new_argv0;
3173 int baselen;
3175 while (argc > 1 && argv[1][0] == '-'
3176 && (argv[1][1] == 'V' || argv[1][1] == 'b'))
3178 char opt = argv[1][1];
3179 const char *arg;
3180 if (argv[1][2] != '\0')
3182 arg = argv[1] + 2;
3183 argc -= 1;
3184 argv += 1;
3186 else if (argc > 2)
3188 arg = argv[2];
3189 argc -= 2;
3190 argv += 2;
3192 else
3193 fatal ("'-%c' option must have argument", opt);
3194 if (opt == 'V')
3195 new_version = arg;
3196 else
3197 new_machine = arg;
3200 for (baselen = strlen (progname); baselen > 0; baselen--)
3201 if (IS_DIR_SEPARATOR (progname[baselen-1]))
3202 break;
3203 new_argv0 = xmemdup (progname, baselen,
3204 baselen + concat_length (new_version, new_machine,
3205 "-gcc-", NULL) + 1);
3206 strcpy (new_argv0 + baselen, new_machine);
3207 strcat (new_argv0, "-gcc-");
3208 strcat (new_argv0, new_version);
3210 new_argv = xmemdup (argv, (argc + 1) * sizeof (argv[0]),
3211 (argc + 1) * sizeof (argv[0]));
3212 new_argv[0] = new_argv0;
3214 execvp (new_argv0, new_argv);
3215 fatal ("couldn't run '%s': %s", new_argv0, xstrerror (errno));
3218 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3219 see if we can create it from the pathname specified in argv[0]. */
3221 gcc_libexec_prefix = standard_libexec_prefix;
3222 #ifndef VMS
3223 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3224 if (!gcc_exec_prefix)
3226 gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
3227 standard_exec_prefix);
3228 gcc_libexec_prefix = make_relative_prefix (argv[0],
3229 standard_bindir_prefix,
3230 standard_libexec_prefix);
3231 if (gcc_exec_prefix)
3232 putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3234 else
3235 gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix,
3236 standard_exec_prefix,
3237 standard_libexec_prefix);
3238 #else
3239 #endif
3241 if (gcc_exec_prefix)
3243 int len = strlen (gcc_exec_prefix);
3245 if (len > (int) sizeof ("/lib/gcc/") - 1
3246 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3248 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3249 if (IS_DIR_SEPARATOR (*temp)
3250 && strncmp (temp + 1, "lib", 3) == 0
3251 && IS_DIR_SEPARATOR (temp[4])
3252 && strncmp (temp + 5, "gcc", 3) == 0)
3253 len -= sizeof ("/lib/gcc/") - 1;
3256 set_std_prefix (gcc_exec_prefix, len);
3257 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3258 PREFIX_PRIORITY_LAST, 0, 0);
3259 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3260 PREFIX_PRIORITY_LAST, 0, 0);
3263 /* COMPILER_PATH and LIBRARY_PATH have values
3264 that are lists of directory names with colons. */
3266 GET_ENVIRONMENT (temp, "COMPILER_PATH");
3267 if (temp)
3269 const char *startp, *endp;
3270 char *nstore = alloca (strlen (temp) + 3);
3272 startp = endp = temp;
3273 while (1)
3275 if (*endp == PATH_SEPARATOR || *endp == 0)
3277 strncpy (nstore, startp, endp - startp);
3278 if (endp == startp)
3279 strcpy (nstore, concat (".", dir_separator_str, NULL));
3280 else if (!IS_DIR_SEPARATOR (endp[-1]))
3282 nstore[endp - startp] = DIR_SEPARATOR;
3283 nstore[endp - startp + 1] = 0;
3285 else
3286 nstore[endp - startp] = 0;
3287 add_prefix (&exec_prefixes, nstore, 0,
3288 PREFIX_PRIORITY_LAST, 0, 0);
3289 add_prefix (&include_prefixes, nstore, 0,
3290 PREFIX_PRIORITY_LAST, 0, 0);
3291 if (*endp == 0)
3292 break;
3293 endp = startp = endp + 1;
3295 else
3296 endp++;
3300 GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
3301 if (temp && *cross_compile == '0')
3303 const char *startp, *endp;
3304 char *nstore = alloca (strlen (temp) + 3);
3306 startp = endp = temp;
3307 while (1)
3309 if (*endp == PATH_SEPARATOR || *endp == 0)
3311 strncpy (nstore, startp, endp - startp);
3312 if (endp == startp)
3313 strcpy (nstore, concat (".", dir_separator_str, NULL));
3314 else if (!IS_DIR_SEPARATOR (endp[-1]))
3316 nstore[endp - startp] = DIR_SEPARATOR;
3317 nstore[endp - startp + 1] = 0;
3319 else
3320 nstore[endp - startp] = 0;
3321 add_prefix (&startfile_prefixes, nstore, NULL,
3322 PREFIX_PRIORITY_LAST, 0, 1);
3323 if (*endp == 0)
3324 break;
3325 endp = startp = endp + 1;
3327 else
3328 endp++;
3332 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3333 GET_ENVIRONMENT (temp, "LPATH");
3334 if (temp && *cross_compile == '0')
3336 const char *startp, *endp;
3337 char *nstore = alloca (strlen (temp) + 3);
3339 startp = endp = temp;
3340 while (1)
3342 if (*endp == PATH_SEPARATOR || *endp == 0)
3344 strncpy (nstore, startp, endp - startp);
3345 if (endp == startp)
3346 strcpy (nstore, concat (".", dir_separator_str, NULL));
3347 else if (!IS_DIR_SEPARATOR (endp[-1]))
3349 nstore[endp - startp] = DIR_SEPARATOR;
3350 nstore[endp - startp + 1] = 0;
3352 else
3353 nstore[endp - startp] = 0;
3354 add_prefix (&startfile_prefixes, nstore, NULL,
3355 PREFIX_PRIORITY_LAST, 0, 1);
3356 if (*endp == 0)
3357 break;
3358 endp = startp = endp + 1;
3360 else
3361 endp++;
3365 /* Convert new-style -- options to old-style. */
3366 translate_options (&argc, (const char *const **) &argv);
3368 /* Do language-specific adjustment/addition of flags. */
3369 lang_specific_driver (&argc, (const char *const **) &argv, &added_libraries);
3371 /* Scan argv twice. Here, the first time, just count how many switches
3372 there will be in their vector, and how many input files in theirs.
3373 Here we also parse the switches that cc itself uses (e.g. -v). */
3375 for (i = 1; i < argc; i++)
3377 if (! strcmp (argv[i], "-dumpspecs"))
3379 struct spec_list *sl;
3380 init_spec ();
3381 for (sl = specs; sl; sl = sl->next)
3382 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3383 if (link_command_spec)
3384 printf ("*link_command:\n%s\n\n", link_command_spec);
3385 exit (0);
3387 else if (! strcmp (argv[i], "-dumpversion"))
3389 printf ("%s\n", spec_version);
3390 exit (0);
3392 else if (! strcmp (argv[i], "-dumpmachine"))
3394 printf ("%s\n", spec_machine);
3395 exit (0);
3397 else if (strcmp (argv[i], "-fversion") == 0)
3399 /* translate_options () has turned --version into -fversion. */
3400 printf (_("%s (GCC) %s\n"), programname, version_string);
3401 printf ("Copyright %s 2005 Free Software Foundation, Inc.\n",
3402 _("(C)"));
3403 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
3404 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
3405 stdout);
3406 exit (0);
3408 else if (strcmp (argv[i], "-fhelp") == 0)
3410 /* translate_options () has turned --help into -fhelp. */
3411 print_help_list = 1;
3413 /* We will be passing a dummy file on to the sub-processes. */
3414 n_infiles++;
3415 n_switches++;
3417 /* CPP driver cannot obtain switch from cc1_options. */
3418 if (is_cpp_driver)
3419 add_preprocessor_option ("--help", 6);
3420 add_assembler_option ("--help", 6);
3421 add_linker_option ("--help", 6);
3423 else if (strcmp (argv[i], "-ftarget-help") == 0)
3425 /* translate_options() has turned --target-help into -ftarget-help. */
3426 target_help_flag = 1;
3428 /* We will be passing a dummy file on to the sub-processes. */
3429 n_infiles++;
3430 n_switches++;
3432 /* CPP driver cannot obtain switch from cc1_options. */
3433 if (is_cpp_driver)
3434 add_preprocessor_option ("--target-help", 13);
3435 add_assembler_option ("--target-help", 13);
3436 add_linker_option ("--target-help", 13);
3438 else if (! strcmp (argv[i], "-pass-exit-codes"))
3440 pass_exit_codes = 1;
3441 n_switches++;
3443 else if (! strcmp (argv[i], "-print-search-dirs"))
3444 print_search_dirs = 1;
3445 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3446 print_file_name = "libgcc.a";
3447 else if (! strncmp (argv[i], "-print-file-name=", 17))
3448 print_file_name = argv[i] + 17;
3449 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3450 print_prog_name = argv[i] + 17;
3451 else if (! strcmp (argv[i], "-print-multi-lib"))
3452 print_multi_lib = 1;
3453 else if (! strcmp (argv[i], "-print-multi-directory"))
3454 print_multi_directory = 1;
3455 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3456 print_multi_os_directory = 1;
3457 else if (! strncmp (argv[i], "-Wa,", 4))
3459 int prev, j;
3460 /* Pass the rest of this option to the assembler. */
3462 /* Split the argument at commas. */
3463 prev = 4;
3464 for (j = 4; argv[i][j]; j++)
3465 if (argv[i][j] == ',')
3467 add_assembler_option (argv[i] + prev, j - prev);
3468 prev = j + 1;
3471 /* Record the part after the last comma. */
3472 add_assembler_option (argv[i] + prev, j - prev);
3474 else if (! strncmp (argv[i], "-Wp,", 4))
3476 int prev, j;
3477 /* Pass the rest of this option to the preprocessor. */
3479 /* Split the argument at commas. */
3480 prev = 4;
3481 for (j = 4; argv[i][j]; j++)
3482 if (argv[i][j] == ',')
3484 add_preprocessor_option (argv[i] + prev, j - prev);
3485 prev = j + 1;
3488 /* Record the part after the last comma. */
3489 add_preprocessor_option (argv[i] + prev, j - prev);
3491 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3492 /* The +e options to the C++ front-end. */
3493 n_switches++;
3494 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3496 int j;
3497 /* Split the argument at commas. */
3498 for (j = 3; argv[i][j]; j++)
3499 n_infiles += (argv[i][j] == ',');
3501 else if (strcmp (argv[i], "-Xlinker") == 0)
3503 if (i + 1 == argc)
3504 fatal ("argument to '-Xlinker' is missing");
3506 n_infiles++;
3507 i++;
3509 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3511 if (i + 1 == argc)
3512 fatal ("argument to '-Xpreprocessor' is missing");
3514 add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
3516 else if (strcmp (argv[i], "-Xassembler") == 0)
3518 if (i + 1 == argc)
3519 fatal ("argument to '-Xassembler' is missing");
3521 add_assembler_option (argv[i+1], strlen (argv[i+1]));
3523 else if (strcmp (argv[i], "-l") == 0)
3525 if (i + 1 == argc)
3526 fatal ("argument to '-l' is missing");
3528 n_infiles++;
3529 i++;
3531 else if (strncmp (argv[i], "-l", 2) == 0)
3532 n_infiles++;
3533 else if (strcmp (argv[i], "-save-temps") == 0)
3535 save_temps_flag = 1;
3536 n_switches++;
3538 else if (strcmp (argv[i], "-combine") == 0)
3540 combine_flag = 1;
3541 n_switches++;
3543 else if (strcmp (argv[i], "-specs") == 0)
3545 struct user_specs *user = xmalloc (sizeof (struct user_specs));
3546 if (++i >= argc)
3547 fatal ("argument to '-specs' is missing");
3549 user->next = (struct user_specs *) 0;
3550 user->filename = argv[i];
3551 if (user_specs_tail)
3552 user_specs_tail->next = user;
3553 else
3554 user_specs_head = user;
3555 user_specs_tail = user;
3557 else if (strncmp (argv[i], "-specs=", 7) == 0)
3559 struct user_specs *user = xmalloc (sizeof (struct user_specs));
3560 if (strlen (argv[i]) == 7)
3561 fatal ("argument to '-specs=' is missing");
3563 user->next = (struct user_specs *) 0;
3564 user->filename = argv[i] + 7;
3565 if (user_specs_tail)
3566 user_specs_tail->next = user;
3567 else
3568 user_specs_head = user;
3569 user_specs_tail = user;
3571 else if (strcmp (argv[i], "-time") == 0)
3572 report_times = 1;
3573 else if (strcmp (argv[i], "-pipe") == 0)
3575 /* -pipe has to go into the switches array as well as
3576 setting a flag. */
3577 use_pipes = 1;
3578 n_switches++;
3580 else if (strcmp (argv[i], "-###") == 0)
3582 /* This is similar to -v except that there is no execution
3583 of the commands and the echoed arguments are quoted. It
3584 is intended for use in shell scripts to capture the
3585 driver-generated command line. */
3586 verbose_only_flag++;
3587 verbose_flag++;
3589 else if (argv[i][0] == '-' && argv[i][1] != 0)
3591 const char *p = &argv[i][1];
3592 int c = *p;
3594 switch (c)
3596 case 'b':
3597 case 'V':
3598 fatal ("'-%c' must come at the start of the command line", c);
3599 break;
3601 case 'B':
3603 const char *value;
3604 int len;
3606 if (p[1] == 0 && i + 1 == argc)
3607 fatal ("argument to '-B' is missing");
3608 if (p[1] == 0)
3609 value = argv[++i];
3610 else
3611 value = p + 1;
3613 len = strlen (value);
3615 /* Catch the case where the user has forgotten to append a
3616 directory separator to the path. Note, they may be using
3617 -B to add an executable name prefix, eg "i386-elf-", in
3618 order to distinguish between multiple installations of
3619 GCC in the same directory. Hence we must check to see
3620 if appending a directory separator actually makes a
3621 valid directory name. */
3622 if (! IS_DIR_SEPARATOR (value [len - 1])
3623 && is_directory (value, "", 0))
3625 char *tmp = xmalloc (len + 2);
3626 strcpy (tmp, value);
3627 tmp[len] = DIR_SEPARATOR;
3628 tmp[++ len] = 0;
3629 value = tmp;
3632 /* As a kludge, if the arg is "[foo/]stageN/", just
3633 add "[foo/]include" to the include prefix. */
3634 if ((len == 7
3635 || (len > 7
3636 && (IS_DIR_SEPARATOR (value[len - 8]))))
3637 && strncmp (value + len - 7, "stage", 5) == 0
3638 && ISDIGIT (value[len - 2])
3639 && (IS_DIR_SEPARATOR (value[len - 1])))
3641 if (len == 7)
3642 add_prefix (&include_prefixes, "./", NULL,
3643 PREFIX_PRIORITY_B_OPT, 0, 0);
3644 else
3646 char *string = xmalloc (len - 6);
3647 memcpy (string, value, len - 7);
3648 string[len - 7] = 0;
3649 add_prefix (&include_prefixes, string, NULL,
3650 PREFIX_PRIORITY_B_OPT, 0, 0);
3654 add_prefix (&exec_prefixes, value, NULL,
3655 PREFIX_PRIORITY_B_OPT, 0, 0);
3656 add_prefix (&startfile_prefixes, value, NULL,
3657 PREFIX_PRIORITY_B_OPT, 0, 0);
3658 add_prefix (&include_prefixes, value, NULL,
3659 PREFIX_PRIORITY_B_OPT, 0, 0);
3660 n_switches++;
3662 break;
3664 case 'v': /* Print our subcommands and print versions. */
3665 n_switches++;
3666 /* If they do anything other than exactly `-v', don't set
3667 verbose_flag; rather, continue on to give the error. */
3668 if (p[1] != 0)
3669 break;
3670 verbose_flag++;
3671 break;
3673 case 'S':
3674 case 'c':
3675 if (p[1] == 0)
3677 have_c = 1;
3678 n_switches++;
3679 break;
3681 goto normal_switch;
3683 case 'o':
3684 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3685 if (! have_c)
3687 int skip;
3689 /* Forward scan, just in case -S or -c is specified
3690 after -o. */
3691 int j = i + 1;
3692 if (p[1] == 0)
3693 ++j;
3694 while (j < argc)
3696 if (argv[j][0] == '-')
3698 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3699 && argv[j][2] == 0)
3701 have_c = 1;
3702 break;
3704 else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
3705 j += skip - (argv[j][2] != 0);
3706 else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
3707 j += skip;
3709 j++;
3712 #endif
3713 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3714 if (p[1] == 0)
3715 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
3716 else
3717 argv[i] = convert_filename (argv[i], ! have_c, 0);
3718 #endif
3719 goto normal_switch;
3721 default:
3722 normal_switch:
3724 #ifdef MODIFY_TARGET_NAME
3725 is_modify_target_name = 0;
3727 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
3728 if (! strcmp (argv[i], modify_target[j].sw))
3730 char *new_name = xmalloc (strlen (modify_target[j].str)
3731 + strlen (spec_machine));
3732 const char *p, *r;
3733 char *q;
3734 int made_addition = 0;
3736 is_modify_target_name = 1;
3737 for (p = spec_machine, q = new_name; *p != 0; )
3739 if (modify_target[j].add_del == DELETE
3740 && (! strncmp (q, modify_target[j].str,
3741 strlen (modify_target[j].str))))
3742 p += strlen (modify_target[j].str);
3743 else if (modify_target[j].add_del == ADD
3744 && ! made_addition && *p == '-')
3746 for (r = modify_target[j].str; *r != 0; )
3747 *q++ = *r++;
3748 made_addition = 1;
3751 *q++ = *p++;
3754 spec_machine = new_name;
3757 if (is_modify_target_name)
3758 break;
3759 #endif
3761 n_switches++;
3763 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3764 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3765 else if (WORD_SWITCH_TAKES_ARG (p))
3766 i += WORD_SWITCH_TAKES_ARG (p);
3769 else
3771 n_infiles++;
3772 lang_n_infiles++;
3776 if (save_temps_flag && use_pipes)
3778 /* -save-temps overrides -pipe, so that temp files are produced */
3779 if (save_temps_flag)
3780 error ("warning: -pipe ignored because -save-temps specified");
3781 use_pipes = 0;
3784 /* Set up the search paths before we go looking for config files. */
3786 /* These come before the md prefixes so that we will find gcc's subcommands
3787 (such as cpp) rather than those of the host system. */
3788 /* Use 2 as fourth arg meaning try just the machine as a suffix,
3789 as well as trying the machine and the version. */
3790 #ifndef OS2
3791 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
3792 PREFIX_PRIORITY_LAST, 1, 0);
3793 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
3794 PREFIX_PRIORITY_LAST, 2, 0);
3795 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3796 PREFIX_PRIORITY_LAST, 2, 0);
3797 add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3798 PREFIX_PRIORITY_LAST, 2, 0);
3799 add_prefix (&exec_prefixes, standard_exec_prefix_2, "BINUTILS",
3800 PREFIX_PRIORITY_LAST, 2, 0);
3801 #endif
3803 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3804 PREFIX_PRIORITY_LAST, 1, 0);
3805 add_prefix (&startfile_prefixes, standard_exec_prefix_2, "BINUTILS",
3806 PREFIX_PRIORITY_LAST, 1, 0);
3808 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3809 dir_separator_str, NULL);
3811 /* If tooldir is relative, base it on exec_prefixes. A relative
3812 tooldir lets us move the installed tree as a unit.
3814 If GCC_EXEC_PREFIX is defined, then we want to add two relative
3815 directories, so that we can search both the user specified directory
3816 and the standard place. */
3818 if (!IS_ABSOLUTE_PATH (tooldir_prefix))
3820 if (gcc_exec_prefix)
3822 char *gcc_exec_tooldir_prefix
3823 = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3824 spec_version, dir_separator_str, tooldir_prefix, NULL);
3826 add_prefix (&exec_prefixes,
3827 concat (gcc_exec_tooldir_prefix, "bin",
3828 dir_separator_str, NULL),
3829 NULL, PREFIX_PRIORITY_LAST, 0, 0);
3830 add_prefix (&startfile_prefixes,
3831 concat (gcc_exec_tooldir_prefix, "lib",
3832 dir_separator_str, NULL),
3833 NULL, PREFIX_PRIORITY_LAST, 0, 1);
3836 tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3837 dir_separator_str, spec_version,
3838 dir_separator_str, tooldir_prefix, NULL);
3841 add_prefix (&exec_prefixes,
3842 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
3843 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
3844 add_prefix (&startfile_prefixes,
3845 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
3846 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
3848 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
3849 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
3850 then consider it to relocate with the rest of the GCC installation
3851 if GCC_EXEC_PREFIX is set.
3852 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
3853 if (target_system_root && gcc_exec_prefix)
3855 char *tmp_prefix = make_relative_prefix (argv[0],
3856 standard_bindir_prefix,
3857 target_system_root);
3858 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
3860 target_system_root = tmp_prefix;
3861 target_system_root_changed = 1;
3864 #endif
3866 /* More prefixes are enabled in main, after we read the specs file
3867 and determine whether this is cross-compilation or not. */
3869 /* Then create the space for the vectors and scan again. */
3871 switches = xmalloc ((n_switches + 1) * sizeof (struct switchstr));
3872 infiles = xmalloc ((n_infiles + 1) * sizeof (struct infile));
3873 n_switches = 0;
3874 n_infiles = 0;
3875 last_language_n_infiles = -1;
3877 /* This, time, copy the text of each switch and store a pointer
3878 to the copy in the vector of switches.
3879 Store all the infiles in their vector. */
3881 for (i = 1; i < argc; i++)
3883 /* Just skip the switches that were handled by the preceding loop. */
3884 #ifdef MODIFY_TARGET_NAME
3885 is_modify_target_name = 0;
3887 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
3888 if (! strcmp (argv[i], modify_target[j].sw))
3889 is_modify_target_name = 1;
3891 if (is_modify_target_name)
3893 else
3894 #endif
3895 if (! strncmp (argv[i], "-Wa,", 4))
3897 else if (! strncmp (argv[i], "-Wp,", 4))
3899 else if (! strcmp (argv[i], "-pass-exit-codes"))
3901 else if (! strcmp (argv[i], "-print-search-dirs"))
3903 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3905 else if (! strncmp (argv[i], "-print-file-name=", 17))
3907 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3909 else if (! strcmp (argv[i], "-print-multi-lib"))
3911 else if (! strcmp (argv[i], "-print-multi-directory"))
3913 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3915 else if (! strcmp (argv[i], "-ftarget-help"))
3917 else if (! strcmp (argv[i], "-fhelp"))
3919 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3921 /* Compensate for the +e options to the C++ front-end;
3922 they're there simply for cfront call-compatibility. We do
3923 some magic in default_compilers to pass them down properly.
3924 Note we deliberately start at the `+' here, to avoid passing
3925 -e0 or -e1 down into the linker. */
3926 switches[n_switches].part1 = &argv[i][0];
3927 switches[n_switches].args = 0;
3928 switches[n_switches].live_cond = SWITCH_OK;
3929 switches[n_switches].validated = 0;
3930 n_switches++;
3932 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3934 int prev, j;
3935 /* Split the argument at commas. */
3936 prev = 4;
3937 for (j = 4; argv[i][j]; j++)
3938 if (argv[i][j] == ',')
3940 infiles[n_infiles].language = "*";
3941 infiles[n_infiles++].name
3942 = save_string (argv[i] + prev, j - prev);
3943 prev = j + 1;
3945 /* Record the part after the last comma. */
3946 infiles[n_infiles].language = "*";
3947 infiles[n_infiles++].name = argv[i] + prev;
3949 else if (strcmp (argv[i], "-Xlinker") == 0)
3951 infiles[n_infiles].language = "*";
3952 infiles[n_infiles++].name = argv[++i];
3954 /* Xassembler and Xpreprocessor were already handled in the first argv
3955 scan, so all we need to do here is ignore them and their argument. */
3956 else if (strcmp (argv[i], "-Xassembler") == 0)
3957 i++;
3958 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3959 i++;
3960 else if (strcmp (argv[i], "-l") == 0)
3961 { /* POSIX allows separation of -l and the lib arg;
3962 canonicalize by concatenating -l with its arg */
3963 infiles[n_infiles].language = "*";
3964 infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
3966 else if (strncmp (argv[i], "-l", 2) == 0)
3968 infiles[n_infiles].language = "*";
3969 infiles[n_infiles++].name = argv[i];
3971 else if (strcmp (argv[i], "-specs") == 0)
3972 i++;
3973 else if (strncmp (argv[i], "-specs=", 7) == 0)
3975 else if (strcmp (argv[i], "-time") == 0)
3977 else if (strcmp (argv[i], "-###") == 0)
3979 else if (argv[i][0] == '-' && argv[i][1] != 0)
3981 const char *p = &argv[i][1];
3982 int c = *p;
3984 if (c == 'x')
3986 if (p[1] == 0 && i + 1 == argc)
3987 fatal ("argument to '-x' is missing");
3988 if (p[1] == 0)
3989 spec_lang = argv[++i];
3990 else
3991 spec_lang = p + 1;
3992 if (! strcmp (spec_lang, "none"))
3993 /* Suppress the warning if -xnone comes after the last input
3994 file, because alternate command interfaces like g++ might
3995 find it useful to place -xnone after each input file. */
3996 spec_lang = 0;
3997 else
3998 last_language_n_infiles = n_infiles;
3999 continue;
4001 switches[n_switches].part1 = p;
4002 /* Deal with option arguments in separate argv elements. */
4003 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4004 || WORD_SWITCH_TAKES_ARG (p))
4006 int j = 0;
4007 int n_args = WORD_SWITCH_TAKES_ARG (p);
4009 if (n_args == 0)
4011 /* Count only the option arguments in separate argv elements. */
4012 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4014 if (i + n_args >= argc)
4015 fatal ("argument to '-%s' is missing", p);
4016 switches[n_switches].args
4017 = xmalloc ((n_args + 1) * sizeof(const char *));
4018 while (j < n_args)
4019 switches[n_switches].args[j++] = argv[++i];
4020 /* Null-terminate the vector. */
4021 switches[n_switches].args[j] = 0;
4023 else if (strchr (switches_need_spaces, c))
4025 /* On some systems, ld cannot handle some options without
4026 a space. So split the option from its argument. */
4027 char *part1 = xmalloc (2);
4028 part1[0] = c;
4029 part1[1] = '\0';
4031 switches[n_switches].part1 = part1;
4032 switches[n_switches].args = xmalloc (2 * sizeof (const char *));
4033 switches[n_switches].args[0] = xstrdup (p+1);
4034 switches[n_switches].args[1] = 0;
4036 else
4037 switches[n_switches].args = 0;
4039 switches[n_switches].live_cond = SWITCH_OK;
4040 switches[n_switches].validated = 0;
4041 switches[n_switches].ordering = 0;
4042 /* These are always valid, since gcc.c itself understands them. */
4043 if (!strcmp (p, "save-temps")
4044 || !strcmp (p, "static-libgcc")
4045 || !strcmp (p, "shared-libgcc")
4046 || !strcmp (p, "pipe"))
4047 switches[n_switches].validated = 1;
4048 else
4050 char ch = switches[n_switches].part1[0];
4051 if (ch == 'B')
4052 switches[n_switches].validated = 1;
4054 n_switches++;
4056 else
4058 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4059 argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
4060 #endif
4062 if (strcmp (argv[i], "-") != 0 && access (argv[i], F_OK) < 0)
4064 perror_with_name (argv[i]);
4065 error_count++;
4067 else
4069 infiles[n_infiles].language = spec_lang;
4070 infiles[n_infiles++].name = argv[i];
4075 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4076 error ("warning: '-x %s' after last input file has no effect", spec_lang);
4078 /* Ensure we only invoke each subprocess once. */
4079 if (target_help_flag || print_help_list)
4081 n_infiles = 1;
4083 /* Create a dummy input file, so that we can pass --target-help on to
4084 the various sub-processes. */
4085 infiles[0].language = "c";
4086 infiles[0].name = "help-dummy";
4088 if (target_help_flag)
4090 switches[n_switches].part1 = "--target-help";
4091 switches[n_switches].args = 0;
4092 switches[n_switches].live_cond = SWITCH_OK;
4093 switches[n_switches].validated = 0;
4095 n_switches++;
4098 if (print_help_list)
4100 switches[n_switches].part1 = "--help";
4101 switches[n_switches].args = 0;
4102 switches[n_switches].live_cond = SWITCH_OK;
4103 switches[n_switches].validated = 0;
4105 n_switches++;
4109 switches[n_switches].part1 = 0;
4110 infiles[n_infiles].name = 0;
4113 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4114 and place that in the environment. */
4116 static void
4117 set_collect_gcc_options (void)
4119 int i;
4120 int first_time;
4122 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4123 the compiler. */
4124 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4125 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4127 first_time = TRUE;
4128 for (i = 0; (int) i < n_switches; i++)
4130 const char *const *args;
4131 const char *p, *q;
4132 if (!first_time)
4133 obstack_grow (&collect_obstack, " ", 1);
4135 first_time = FALSE;
4137 /* Ignore elided switches. */
4138 if (switches[i].live_cond == SWITCH_IGNORE)
4139 continue;
4141 obstack_grow (&collect_obstack, "'-", 2);
4142 q = switches[i].part1;
4143 while ((p = strchr (q, '\'')))
4145 obstack_grow (&collect_obstack, q, p - q);
4146 obstack_grow (&collect_obstack, "'\\''", 4);
4147 q = ++p;
4149 obstack_grow (&collect_obstack, q, strlen (q));
4150 obstack_grow (&collect_obstack, "'", 1);
4152 for (args = switches[i].args; args && *args; args++)
4154 obstack_grow (&collect_obstack, " '", 2);
4155 q = *args;
4156 while ((p = strchr (q, '\'')))
4158 obstack_grow (&collect_obstack, q, p - q);
4159 obstack_grow (&collect_obstack, "'\\''", 4);
4160 q = ++p;
4162 obstack_grow (&collect_obstack, q, strlen (q));
4163 obstack_grow (&collect_obstack, "'", 1);
4166 obstack_grow (&collect_obstack, "\0", 1);
4167 putenv (XOBFINISH (&collect_obstack, char *));
4170 /* Process a spec string, accumulating and running commands. */
4172 /* These variables describe the input file name.
4173 input_file_number is the index on outfiles of this file,
4174 so that the output file name can be stored for later use by %o.
4175 input_basename is the start of the part of the input file
4176 sans all directory names, and basename_length is the number
4177 of characters starting there excluding the suffix .c or whatever. */
4179 static const char *input_filename;
4180 static int input_file_number;
4181 size_t input_filename_length;
4182 static int basename_length;
4183 static int suffixed_basename_length;
4184 static const char *input_basename;
4185 static const char *input_suffix;
4186 #ifndef HOST_LACKS_INODE_NUMBERS
4187 static struct stat input_stat;
4188 #endif
4189 static int input_stat_set;
4191 /* The compiler used to process the current input file. */
4192 static struct compiler *input_file_compiler;
4194 /* These are variables used within do_spec and do_spec_1. */
4196 /* Nonzero if an arg has been started and not yet terminated
4197 (with space, tab or newline). */
4198 static int arg_going;
4200 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4201 is a temporary file name. */
4202 static int delete_this_arg;
4204 /* Nonzero means %w has been seen; the next arg to be terminated
4205 is the output file name of this compilation. */
4206 static int this_is_output_file;
4208 /* Nonzero means %s has been seen; the next arg to be terminated
4209 is the name of a library file and we should try the standard
4210 search dirs for it. */
4211 static int this_is_library_file;
4213 /* Nonzero means that the input of this command is coming from a pipe. */
4214 static int input_from_pipe;
4216 /* Nonnull means substitute this for any suffix when outputting a switches
4217 arguments. */
4218 static const char *suffix_subst;
4220 /* Process the spec SPEC and run the commands specified therein.
4221 Returns 0 if the spec is successfully processed; -1 if failed. */
4224 do_spec (const char *spec)
4226 int value;
4228 value = do_spec_2 (spec);
4230 /* Force out any unfinished command.
4231 If -pipe, this forces out the last command if it ended in `|'. */
4232 if (value == 0)
4234 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4235 argbuf_index--;
4237 set_collect_gcc_options ();
4239 if (argbuf_index > 0)
4240 value = execute ();
4243 return value;
4246 static int
4247 do_spec_2 (const char *spec)
4249 const char *string;
4250 int result;
4252 clear_args ();
4253 arg_going = 0;
4254 delete_this_arg = 0;
4255 this_is_output_file = 0;
4256 this_is_library_file = 0;
4257 input_from_pipe = 0;
4258 suffix_subst = NULL;
4260 result = do_spec_1 (spec, 0, NULL);
4262 /* End any pending argument. */
4263 if (arg_going)
4265 obstack_1grow (&obstack, 0);
4266 string = XOBFINISH (&obstack, const char *);
4267 if (this_is_library_file)
4268 string = find_file (string);
4269 store_arg (string, delete_this_arg, this_is_output_file);
4270 if (this_is_output_file)
4271 outfiles[input_file_number] = string;
4272 arg_going = 0;
4275 return result;
4279 /* Process the given spec string and add any new options to the end
4280 of the switches/n_switches array. */
4282 static void
4283 do_option_spec (const char *name, const char *spec)
4285 unsigned int i, value_count, value_len;
4286 const char *p, *q, *value;
4287 char *tmp_spec, *tmp_spec_p;
4289 if (configure_default_options[0].name == NULL)
4290 return;
4292 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4293 if (strcmp (configure_default_options[i].name, name) == 0)
4294 break;
4295 if (i == ARRAY_SIZE (configure_default_options))
4296 return;
4298 value = configure_default_options[i].value;
4299 value_len = strlen (value);
4301 /* Compute the size of the final spec. */
4302 value_count = 0;
4303 p = spec;
4304 while ((p = strstr (p, "%(VALUE)")) != NULL)
4306 p ++;
4307 value_count ++;
4310 /* Replace each %(VALUE) by the specified value. */
4311 tmp_spec = alloca (strlen (spec) + 1
4312 + value_count * (value_len - strlen ("%(VALUE)")));
4313 tmp_spec_p = tmp_spec;
4314 q = spec;
4315 while ((p = strstr (q, "%(VALUE)")) != NULL)
4317 memcpy (tmp_spec_p, q, p - q);
4318 tmp_spec_p = tmp_spec_p + (p - q);
4319 memcpy (tmp_spec_p, value, value_len);
4320 tmp_spec_p += value_len;
4321 q = p + strlen ("%(VALUE)");
4323 strcpy (tmp_spec_p, q);
4325 do_self_spec (tmp_spec);
4328 /* Process the given spec string and add any new options to the end
4329 of the switches/n_switches array. */
4331 static void
4332 do_self_spec (const char *spec)
4334 do_spec_2 (spec);
4335 do_spec_1 (" ", 0, NULL);
4337 if (argbuf_index > 0)
4339 int i, first;
4341 first = n_switches;
4342 n_switches += argbuf_index;
4343 switches = xrealloc (switches,
4344 sizeof (struct switchstr) * (n_switches + 1));
4346 switches[n_switches] = switches[first];
4347 for (i = 0; i < argbuf_index; i++)
4349 struct switchstr *sw;
4351 /* Each switch should start with '-'. */
4352 if (argbuf[i][0] != '-')
4353 fatal ("switch '%s' does not start with '-'", argbuf[i]);
4355 sw = &switches[i + first];
4356 sw->part1 = &argbuf[i][1];
4357 sw->args = 0;
4358 sw->live_cond = SWITCH_OK;
4359 sw->validated = 0;
4360 sw->ordering = 0;
4365 void
4366 do_spec_path (struct prefix_list *pl, const char *option,
4367 int omit_if_relative, int separate_options,
4368 int only_subdir,
4369 const char *dir_for_machine_suffix,
4370 const char *dir_for_no_suffix)
4372 static size_t bufsize = 0;
4373 static char *buffer;
4374 int idx;
4375 bool multilib_p = false;
4377 /* Used on systems which record the specified -L dirs
4378 and use them to search for dynamic linking. */
4379 /* Relative directories always come from -B,
4380 and it is better not to use them for searching
4381 at run time. In particular, stage1 loses. */
4382 if (omit_if_relative
4383 && !IS_ABSOLUTE_PATH (pl->prefix))
4384 return;
4386 /* Try subdirectory if there is one. */
4387 if (machine_suffix && dir_for_machine_suffix)
4389 if (strlen (pl->prefix) + strlen (machine_suffix)
4390 >= bufsize)
4391 bufsize = (strlen (pl->prefix)
4392 + strlen (machine_suffix)) * 2 + 1;
4393 buffer = xrealloc (buffer, bufsize);
4394 strcpy (buffer, pl->prefix);
4395 strcat (buffer, machine_suffix);
4396 if (is_directory (buffer, dir_for_machine_suffix, 1))
4398 multilib_p = true;
4399 do_spec_1 (option, separate_options, NULL);
4400 if (separate_options)
4401 do_spec_1 (" ", 0, NULL);
4402 do_spec_1 (buffer, 1, NULL);
4403 do_spec_1 (dir_for_machine_suffix, 1, NULL);
4404 /* Make this a separate argument. */
4405 do_spec_1 (" ", 0, NULL);
4408 if (!pl->require_machine_suffix && dir_for_no_suffix)
4410 if (is_directory (pl->prefix, dir_for_no_suffix, 1))
4412 multilib_p = true;
4413 do_spec_1 (option, separate_options, NULL);
4414 if (separate_options)
4415 do_spec_1 (" ", 0, NULL);
4416 do_spec_1 (pl->prefix, 1, NULL);
4417 do_spec_1 (dir_for_no_suffix, 1, NULL);
4418 /* Make this a separate argument. */
4419 do_spec_1 (" ", 0, NULL);
4423 if (only_subdir || multilib_p)
4424 return;
4426 if (machine_suffix)
4428 if (is_directory (pl->prefix, machine_suffix, 1))
4430 do_spec_1 (option, separate_options, NULL);
4431 if (separate_options)
4432 do_spec_1 (" ", 0, NULL);
4433 do_spec_1 (pl->prefix, 1, NULL);
4434 /* Remove slash from machine_suffix. */
4435 if (strlen (machine_suffix) >= bufsize)
4436 bufsize = strlen (machine_suffix) * 2 + 1;
4437 buffer = xrealloc (buffer, bufsize);
4438 strcpy (buffer, machine_suffix);
4439 idx = strlen (buffer);
4440 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4441 buffer[idx - 1] = 0;
4442 do_spec_1 (buffer, 1, NULL);
4443 /* Make this a separate argument. */
4444 do_spec_1 (" ", 0, NULL);
4447 if (!pl->require_machine_suffix)
4449 if (is_directory (pl->prefix, "", 1))
4451 do_spec_1 (option, separate_options, NULL);
4452 if (separate_options)
4453 do_spec_1 (" ", 0, NULL);
4454 /* Remove slash from pl->prefix. */
4455 if (strlen (pl->prefix) >= bufsize)
4456 bufsize = strlen (pl->prefix) * 2 + 1;
4457 buffer = xrealloc (buffer, bufsize);
4458 strcpy (buffer, pl->prefix);
4459 idx = strlen (buffer);
4460 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4461 buffer[idx - 1] = 0;
4462 do_spec_1 (buffer, 1, NULL);
4463 /* Make this a separate argument. */
4464 do_spec_1 (" ", 0, NULL);
4469 /* Process the sub-spec SPEC as a portion of a larger spec.
4470 This is like processing a whole spec except that we do
4471 not initialize at the beginning and we do not supply a
4472 newline by default at the end.
4473 INSWITCH nonzero means don't process %-sequences in SPEC;
4474 in this case, % is treated as an ordinary character.
4475 This is used while substituting switches.
4476 INSWITCH nonzero also causes SPC not to terminate an argument.
4478 Value is zero unless a line was finished
4479 and the command on that line reported an error. */
4481 static int
4482 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4484 const char *p = spec;
4485 int c;
4486 int i;
4487 const char *string;
4488 int value;
4490 while ((c = *p++))
4491 /* If substituting a switch, treat all chars like letters.
4492 Otherwise, NL, SPC, TAB and % are special. */
4493 switch (inswitch ? 'a' : c)
4495 case '\n':
4496 /* End of line: finish any pending argument,
4497 then run the pending command if one has been started. */
4498 if (arg_going)
4500 obstack_1grow (&obstack, 0);
4501 string = XOBFINISH (&obstack, const char *);
4502 if (this_is_library_file)
4503 string = find_file (string);
4504 store_arg (string, delete_this_arg, this_is_output_file);
4505 if (this_is_output_file)
4506 outfiles[input_file_number] = string;
4508 arg_going = 0;
4510 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4512 /* A `|' before the newline means use a pipe here,
4513 but only if -pipe was specified.
4514 Otherwise, execute now and don't pass the `|' as an arg. */
4515 if (use_pipes)
4517 input_from_pipe = 1;
4518 break;
4520 else
4521 argbuf_index--;
4524 set_collect_gcc_options ();
4526 if (argbuf_index > 0)
4528 value = execute ();
4529 if (value)
4530 return value;
4532 /* Reinitialize for a new command, and for a new argument. */
4533 clear_args ();
4534 arg_going = 0;
4535 delete_this_arg = 0;
4536 this_is_output_file = 0;
4537 this_is_library_file = 0;
4538 input_from_pipe = 0;
4539 break;
4541 case '|':
4542 /* End any pending argument. */
4543 if (arg_going)
4545 obstack_1grow (&obstack, 0);
4546 string = XOBFINISH (&obstack, const char *);
4547 if (this_is_library_file)
4548 string = find_file (string);
4549 store_arg (string, delete_this_arg, this_is_output_file);
4550 if (this_is_output_file)
4551 outfiles[input_file_number] = string;
4554 /* Use pipe */
4555 obstack_1grow (&obstack, c);
4556 arg_going = 1;
4557 break;
4559 case '\t':
4560 case ' ':
4561 /* Space or tab ends an argument if one is pending. */
4562 if (arg_going)
4564 obstack_1grow (&obstack, 0);
4565 string = XOBFINISH (&obstack, const char *);
4566 if (this_is_library_file)
4567 string = find_file (string);
4568 store_arg (string, delete_this_arg, this_is_output_file);
4569 if (this_is_output_file)
4570 outfiles[input_file_number] = string;
4572 /* Reinitialize for a new argument. */
4573 arg_going = 0;
4574 delete_this_arg = 0;
4575 this_is_output_file = 0;
4576 this_is_library_file = 0;
4577 break;
4579 case '%':
4580 switch (c = *p++)
4582 case 0:
4583 fatal ("spec '%s' invalid", spec);
4585 case 'b':
4586 obstack_grow (&obstack, input_basename, basename_length);
4587 arg_going = 1;
4588 break;
4590 case 'B':
4591 obstack_grow (&obstack, input_basename, suffixed_basename_length);
4592 arg_going = 1;
4593 break;
4595 case 'd':
4596 delete_this_arg = 2;
4597 break;
4599 /* Dump out the directories specified with LIBRARY_PATH,
4600 followed by the absolute directories
4601 that we search for startfiles. */
4602 case 'D':
4604 struct prefix_list *pl = startfile_prefixes.plist;
4606 for (; pl; pl = pl->next)
4608 const char *no_suffix_multilib_dir;
4610 no_suffix_multilib_dir = pl->os_multilib ? multilib_os_dir
4611 : multilib_dir;
4612 /* Do not separate options, include non-multilibbed variant. */
4613 do_spec_path (pl, "-L",
4614 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4616 #else
4618 #endif
4619 0, 0, multilib_dir, no_suffix_multilib_dir);
4622 break;
4624 case 'e':
4625 /* %efoo means report an error with `foo' as error message
4626 and don't execute any more commands for this file. */
4628 const char *q = p;
4629 char *buf;
4630 while (*p != 0 && *p != '\n')
4631 p++;
4632 buf = alloca (p - q + 1);
4633 strncpy (buf, q, p - q);
4634 buf[p - q] = 0;
4635 error ("%s", buf);
4636 return -1;
4638 break;
4639 case 'n':
4640 /* %nfoo means report a notice with `foo' on stderr. */
4642 const char *q = p;
4643 char *buf;
4644 while (*p != 0 && *p != '\n')
4645 p++;
4646 buf = alloca (p - q + 1);
4647 strncpy (buf, q, p - q);
4648 buf[p - q] = 0;
4649 notice ("%s\n", buf);
4650 if (*p)
4651 p++;
4653 break;
4655 case 'j':
4657 struct stat st;
4659 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4660 defined, and it is not a directory, and it is
4661 writable, use it. Otherwise, treat this like any
4662 other temporary file. */
4664 if ((!save_temps_flag)
4665 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4666 && (access (HOST_BIT_BUCKET, W_OK) == 0))
4668 obstack_grow (&obstack, HOST_BIT_BUCKET,
4669 strlen (HOST_BIT_BUCKET));
4670 delete_this_arg = 0;
4671 arg_going = 1;
4672 break;
4675 goto create_temp_file;
4676 case '|':
4677 if (use_pipes)
4679 obstack_1grow (&obstack, '-');
4680 delete_this_arg = 0;
4681 arg_going = 1;
4683 /* consume suffix */
4684 while (*p == '.' || ISALPHA ((unsigned char) *p))
4685 p++;
4686 if (p[0] == '%' && p[1] == 'O')
4687 p += 2;
4689 break;
4691 goto create_temp_file;
4692 case 'm':
4693 if (use_pipes)
4695 /* consume suffix */
4696 while (*p == '.' || ISALPHA ((unsigned char) *p))
4697 p++;
4698 if (p[0] == '%' && p[1] == 'O')
4699 p += 2;
4701 break;
4703 goto create_temp_file;
4704 case 'g':
4705 case 'u':
4706 case 'U':
4707 create_temp_file:
4709 struct temp_name *t;
4710 int suffix_length;
4711 const char *suffix = p;
4712 char *saved_suffix = NULL;
4714 while (*p == '.' || ISALPHA ((unsigned char) *p))
4715 p++;
4716 suffix_length = p - suffix;
4717 if (p[0] == '%' && p[1] == 'O')
4719 p += 2;
4720 /* We don't support extra suffix characters after %O. */
4721 if (*p == '.' || ISALPHA ((unsigned char) *p))
4722 fatal ("spec '%s' has invalid '%%0%c'", spec, *p);
4723 if (suffix_length == 0)
4724 suffix = TARGET_OBJECT_SUFFIX;
4725 else
4727 saved_suffix
4728 = xmalloc (suffix_length
4729 + strlen (TARGET_OBJECT_SUFFIX));
4730 strncpy (saved_suffix, suffix, suffix_length);
4731 strcpy (saved_suffix + suffix_length,
4732 TARGET_OBJECT_SUFFIX);
4734 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4737 /* If the input_filename has the same suffix specified
4738 for the %g, %u, or %U, and -save-temps is specified,
4739 we could end up using that file as an intermediate
4740 thus clobbering the user's source file (.e.g.,
4741 gcc -save-temps foo.s would clobber foo.s with the
4742 output of cpp0). So check for this condition and
4743 generate a temp file as the intermediate. */
4745 if (save_temps_flag)
4747 temp_filename_length = basename_length + suffix_length;
4748 temp_filename = alloca (temp_filename_length + 1);
4749 strncpy ((char *) temp_filename, input_basename, basename_length);
4750 strncpy ((char *) temp_filename + basename_length, suffix,
4751 suffix_length);
4752 *((char *) temp_filename + temp_filename_length) = '\0';
4753 if (strcmp (temp_filename, input_filename) != 0)
4755 #ifndef HOST_LACKS_INODE_NUMBERS
4756 struct stat st_temp;
4758 /* Note, set_input() resets input_stat_set to 0. */
4759 if (input_stat_set == 0)
4761 input_stat_set = stat (input_filename, &input_stat);
4762 if (input_stat_set >= 0)
4763 input_stat_set = 1;
4766 /* If we have the stat for the input_filename
4767 and we can do the stat for the temp_filename
4768 then the they could still refer to the same
4769 file if st_dev/st_ino's are the same. */
4770 if (input_stat_set != 1
4771 || stat (temp_filename, &st_temp) < 0
4772 || input_stat.st_dev != st_temp.st_dev
4773 || input_stat.st_ino != st_temp.st_ino)
4774 #else
4775 /* Just compare canonical pathnames. */
4776 char* input_realname = lrealpath (input_filename);
4777 char* temp_realname = lrealpath (temp_filename);
4778 bool files_differ = strcmp (input_realname, temp_realname);
4779 free (input_realname);
4780 free (temp_realname);
4781 if (files_differ)
4782 #endif
4784 temp_filename = save_string (temp_filename,
4785 temp_filename_length + 1);
4786 obstack_grow (&obstack, temp_filename,
4787 temp_filename_length);
4788 arg_going = 1;
4789 delete_this_arg = 0;
4790 break;
4795 /* See if we already have an association of %g/%u/%U and
4796 suffix. */
4797 for (t = temp_names; t; t = t->next)
4798 if (t->length == suffix_length
4799 && strncmp (t->suffix, suffix, suffix_length) == 0
4800 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
4801 break;
4803 /* Make a new association if needed. %u and %j
4804 require one. */
4805 if (t == 0 || c == 'u' || c == 'j')
4807 if (t == 0)
4809 t = xmalloc (sizeof (struct temp_name));
4810 t->next = temp_names;
4811 temp_names = t;
4813 t->length = suffix_length;
4814 if (saved_suffix)
4816 t->suffix = saved_suffix;
4817 saved_suffix = NULL;
4819 else
4820 t->suffix = save_string (suffix, suffix_length);
4821 t->unique = (c == 'u' || c == 'U' || c == 'j');
4822 temp_filename = make_temp_file (t->suffix);
4823 temp_filename_length = strlen (temp_filename);
4824 t->filename = temp_filename;
4825 t->filename_length = temp_filename_length;
4828 if (saved_suffix)
4829 free (saved_suffix);
4831 obstack_grow (&obstack, t->filename, t->filename_length);
4832 delete_this_arg = 1;
4834 arg_going = 1;
4835 break;
4837 case 'i':
4838 if (combine_inputs)
4840 for (i = 0; (int) i < n_infiles; i++)
4841 if ((!infiles[i].language) || (infiles[i].language[0] != '*'))
4842 if (infiles[i].incompiler == input_file_compiler)
4844 store_arg (infiles[i].name, 0, 0);
4845 infiles[i].compiled = true;
4848 else
4850 obstack_grow (&obstack, input_filename, input_filename_length);
4851 arg_going = 1;
4853 break;
4855 case 'I':
4857 struct prefix_list *pl = include_prefixes.plist;
4859 if (gcc_exec_prefix)
4861 do_spec_1 ("-iprefix", 1, NULL);
4862 /* Make this a separate argument. */
4863 do_spec_1 (" ", 0, NULL);
4864 do_spec_1 (gcc_exec_prefix, 1, NULL);
4865 do_spec_1 (" ", 0, NULL);
4868 if (target_system_root_changed ||
4869 (target_system_root && target_sysroot_hdrs_suffix))
4871 do_spec_1 ("-isysroot", 1, NULL);
4872 /* Make this a separate argument. */
4873 do_spec_1 (" ", 0, NULL);
4874 do_spec_1 (target_system_root, 1, NULL);
4875 if (target_sysroot_hdrs_suffix)
4876 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
4877 do_spec_1 (" ", 0, NULL);
4880 for (; pl; pl = pl->next)
4881 /* Separate options, don't include non-suffixed variant. */
4882 do_spec_path (pl, "-isystem", 0, 1, 1, "include", "include");
4884 break;
4886 case 'o':
4888 int max = n_infiles;
4889 max += lang_specific_extra_outfiles;
4891 for (i = 0; i < max; i++)
4892 if (outfiles[i])
4893 store_arg (outfiles[i], 0, 0);
4894 break;
4897 case 'O':
4898 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4899 arg_going = 1;
4900 break;
4902 case 's':
4903 this_is_library_file = 1;
4904 break;
4906 case 'V':
4907 outfiles[input_file_number] = NULL;
4908 break;
4910 case 'w':
4911 this_is_output_file = 1;
4912 break;
4914 case 'W':
4916 int cur_index = argbuf_index;
4917 /* Handle the {...} following the %W. */
4918 if (*p != '{')
4919 fatal ("spec '%s' has invalid '%%W%c", spec, *p);
4920 p = handle_braces (p + 1);
4921 if (p == 0)
4922 return -1;
4923 /* End any pending argument. */
4924 if (arg_going)
4926 obstack_1grow (&obstack, 0);
4927 string = XOBFINISH (&obstack, const char *);
4928 if (this_is_library_file)
4929 string = find_file (string);
4930 store_arg (string, delete_this_arg, this_is_output_file);
4931 if (this_is_output_file)
4932 outfiles[input_file_number] = string;
4933 arg_going = 0;
4935 /* If any args were output, mark the last one for deletion
4936 on failure. */
4937 if (argbuf_index != cur_index)
4938 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4939 break;
4942 /* %x{OPTION} records OPTION for %X to output. */
4943 case 'x':
4945 const char *p1 = p;
4946 char *string;
4948 /* Skip past the option value and make a copy. */
4949 if (*p != '{')
4950 fatal ("spec '%s' has invalid '%%x%c'", spec, *p);
4951 while (*p++ != '}')
4953 string = save_string (p1 + 1, p - p1 - 2);
4955 /* See if we already recorded this option. */
4956 for (i = 0; i < n_linker_options; i++)
4957 if (! strcmp (string, linker_options[i]))
4959 free (string);
4960 return 0;
4963 /* This option is new; add it. */
4964 add_linker_option (string, strlen (string));
4966 break;
4968 /* Dump out the options accumulated previously using %x. */
4969 case 'X':
4970 for (i = 0; i < n_linker_options; i++)
4972 do_spec_1 (linker_options[i], 1, NULL);
4973 /* Make each accumulated option a separate argument. */
4974 do_spec_1 (" ", 0, NULL);
4976 break;
4978 /* Dump out the options accumulated previously using -Wa,. */
4979 case 'Y':
4980 for (i = 0; i < n_assembler_options; i++)
4982 do_spec_1 (assembler_options[i], 1, NULL);
4983 /* Make each accumulated option a separate argument. */
4984 do_spec_1 (" ", 0, NULL);
4986 break;
4988 /* Dump out the options accumulated previously using -Wp,. */
4989 case 'Z':
4990 for (i = 0; i < n_preprocessor_options; i++)
4992 do_spec_1 (preprocessor_options[i], 1, NULL);
4993 /* Make each accumulated option a separate argument. */
4994 do_spec_1 (" ", 0, NULL);
4996 break;
4998 /* Here are digits and numbers that just process
4999 a certain constant string as a spec. */
5001 case '1':
5002 value = do_spec_1 (cc1_spec, 0, NULL);
5003 if (value != 0)
5004 return value;
5005 break;
5007 case '2':
5008 value = do_spec_1 (cc1plus_spec, 0, NULL);
5009 if (value != 0)
5010 return value;
5011 break;
5013 case 'a':
5014 value = do_spec_1 (asm_spec, 0, NULL);
5015 if (value != 0)
5016 return value;
5017 break;
5019 case 'A':
5020 value = do_spec_1 (asm_final_spec, 0, NULL);
5021 if (value != 0)
5022 return value;
5023 break;
5025 case 'C':
5027 const char *const spec
5028 = (input_file_compiler->cpp_spec
5029 ? input_file_compiler->cpp_spec
5030 : cpp_spec);
5031 value = do_spec_1 (spec, 0, NULL);
5032 if (value != 0)
5033 return value;
5035 break;
5037 case 'E':
5038 value = do_spec_1 (endfile_spec, 0, NULL);
5039 if (value != 0)
5040 return value;
5041 break;
5043 case 'l':
5044 value = do_spec_1 (link_spec, 0, NULL);
5045 if (value != 0)
5046 return value;
5047 break;
5049 case 'L':
5050 value = do_spec_1 (lib_spec, 0, NULL);
5051 if (value != 0)
5052 return value;
5053 break;
5055 case 'G':
5056 value = do_spec_1 (libgcc_spec, 0, NULL);
5057 if (value != 0)
5058 return value;
5059 break;
5061 case 'R':
5062 /* We assume there is a directory
5063 separator at the end of this string. */
5064 if (target_system_root)
5066 obstack_grow (&obstack, target_system_root,
5067 strlen (target_system_root));
5068 if (target_sysroot_suffix)
5069 obstack_grow (&obstack, target_sysroot_suffix,
5070 strlen (target_sysroot_suffix));
5072 break;
5074 case 'S':
5075 value = do_spec_1 (startfile_spec, 0, NULL);
5076 if (value != 0)
5077 return value;
5078 break;
5080 /* Here we define characters other than letters and digits. */
5082 case '{':
5083 p = handle_braces (p);
5084 if (p == 0)
5085 return -1;
5086 break;
5088 case ':':
5089 p = handle_spec_function (p);
5090 if (p == 0)
5091 return -1;
5092 break;
5094 case '%':
5095 obstack_1grow (&obstack, '%');
5096 break;
5098 case '.':
5100 unsigned len = 0;
5102 while (p[len] && p[len] != ' ' && p[len] != '%')
5103 len++;
5104 suffix_subst = save_string (p - 1, len + 1);
5105 p += len;
5107 break;
5109 /* Henceforth ignore the option(s) matching the pattern
5110 after the %<. */
5111 case '<':
5113 unsigned len = 0;
5114 int have_wildcard = 0;
5115 int i;
5117 while (p[len] && p[len] != ' ' && p[len] != '\t')
5118 len++;
5120 if (p[len-1] == '*')
5121 have_wildcard = 1;
5123 for (i = 0; i < n_switches; i++)
5124 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5125 && (have_wildcard || switches[i].part1[len] == '\0'))
5127 switches[i].live_cond = SWITCH_IGNORE;
5128 switches[i].validated = 1;
5131 p += len;
5133 break;
5135 case '*':
5136 if (soft_matched_part)
5138 do_spec_1 (soft_matched_part, 1, NULL);
5139 do_spec_1 (" ", 0, NULL);
5141 else
5142 /* Catch the case where a spec string contains something like
5143 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5144 hand side of the :. */
5145 error ("spec failure: '%%*' has not been initialized by pattern match");
5146 break;
5148 /* Process a string found as the value of a spec given by name.
5149 This feature allows individual machine descriptions
5150 to add and use their own specs.
5151 %[...] modifies -D options the way %P does;
5152 %(...) uses the spec unmodified. */
5153 case '[':
5154 error ("warning: use of obsolete %%[ operator in specs");
5155 case '(':
5157 const char *name = p;
5158 struct spec_list *sl;
5159 int len;
5161 /* The string after the S/P is the name of a spec that is to be
5162 processed. */
5163 while (*p && *p != ')' && *p != ']')
5164 p++;
5166 /* See if it's in the list. */
5167 for (len = p - name, sl = specs; sl; sl = sl->next)
5168 if (sl->name_len == len && !strncmp (sl->name, name, len))
5170 name = *(sl->ptr_spec);
5171 #ifdef DEBUG_SPECS
5172 notice ("Processing spec %c%s%c, which is '%s'\n",
5173 c, sl->name, (c == '(') ? ')' : ']', name);
5174 #endif
5175 break;
5178 if (sl)
5180 if (c == '(')
5182 value = do_spec_1 (name, 0, NULL);
5183 if (value != 0)
5184 return value;
5186 else
5188 char *x = alloca (strlen (name) * 2 + 1);
5189 char *buf = x;
5190 const char *y = name;
5191 int flag = 0;
5193 /* Copy all of NAME into BUF, but put __ after
5194 every -D and at the end of each arg. */
5195 while (1)
5197 if (! strncmp (y, "-D", 2))
5199 *x++ = '-';
5200 *x++ = 'D';
5201 *x++ = '_';
5202 *x++ = '_';
5203 y += 2;
5204 flag = 1;
5205 continue;
5207 else if (flag
5208 && (*y == ' ' || *y == '\t' || *y == '='
5209 || *y == '}' || *y == 0))
5211 *x++ = '_';
5212 *x++ = '_';
5213 flag = 0;
5215 if (*y == 0)
5216 break;
5217 else
5218 *x++ = *y++;
5220 *x = 0;
5222 value = do_spec_1 (buf, 0, NULL);
5223 if (value != 0)
5224 return value;
5228 /* Discard the closing paren or bracket. */
5229 if (*p)
5230 p++;
5232 break;
5234 default:
5235 error ("spec failure: unrecognized spec option '%c'", c);
5236 break;
5238 break;
5240 case '\\':
5241 /* Backslash: treat next character as ordinary. */
5242 c = *p++;
5244 /* Fall through. */
5245 default:
5246 /* Ordinary character: put it into the current argument. */
5247 obstack_1grow (&obstack, c);
5248 arg_going = 1;
5251 /* End of string. If we are processing a spec function, we need to
5252 end any pending argument. */
5253 if (processing_spec_function && arg_going)
5255 obstack_1grow (&obstack, 0);
5256 string = XOBFINISH (&obstack, const char *);
5257 if (this_is_library_file)
5258 string = find_file (string);
5259 store_arg (string, delete_this_arg, this_is_output_file);
5260 if (this_is_output_file)
5261 outfiles[input_file_number] = string;
5262 arg_going = 0;
5265 return 0;
5268 /* Look up a spec function. */
5270 static const struct spec_function *
5271 lookup_spec_function (const char *name)
5273 static const struct spec_function * const spec_function_tables[] =
5275 static_spec_functions,
5276 lang_specific_spec_functions,
5278 const struct spec_function *sf;
5279 unsigned int i;
5281 for (i = 0; i < ARRAY_SIZE (spec_function_tables); i++)
5283 for (sf = spec_function_tables[i]; sf->name != NULL; sf++)
5284 if (strcmp (sf->name, name) == 0)
5285 return sf;
5288 return NULL;
5291 /* Evaluate a spec function. */
5293 static const char *
5294 eval_spec_function (const char *func, const char *args)
5296 const struct spec_function *sf;
5297 const char *funcval;
5299 /* Saved spec processing context. */
5300 int save_argbuf_index;
5301 int save_argbuf_length;
5302 const char **save_argbuf;
5304 int save_arg_going;
5305 int save_delete_this_arg;
5306 int save_this_is_output_file;
5307 int save_this_is_library_file;
5308 int save_input_from_pipe;
5309 const char *save_suffix_subst;
5312 sf = lookup_spec_function (func);
5313 if (sf == NULL)
5314 fatal ("unknown spec function '%s'", func);
5316 /* Push the spec processing context. */
5317 save_argbuf_index = argbuf_index;
5318 save_argbuf_length = argbuf_length;
5319 save_argbuf = argbuf;
5321 save_arg_going = arg_going;
5322 save_delete_this_arg = delete_this_arg;
5323 save_this_is_output_file = this_is_output_file;
5324 save_this_is_library_file = this_is_library_file;
5325 save_input_from_pipe = input_from_pipe;
5326 save_suffix_subst = suffix_subst;
5328 /* Create a new spec processing context, and build the function
5329 arguments. */
5331 alloc_args ();
5332 if (do_spec_2 (args) < 0)
5333 fatal ("error in args to spec function '%s'", func);
5335 /* argbuf_index is an index for the next argument to be inserted, and
5336 so contains the count of the args already inserted. */
5338 funcval = (*sf->func) (argbuf_index, argbuf);
5340 /* Pop the spec processing context. */
5341 argbuf_index = save_argbuf_index;
5342 argbuf_length = save_argbuf_length;
5343 free (argbuf);
5344 argbuf = save_argbuf;
5346 arg_going = save_arg_going;
5347 delete_this_arg = save_delete_this_arg;
5348 this_is_output_file = save_this_is_output_file;
5349 this_is_library_file = save_this_is_library_file;
5350 input_from_pipe = save_input_from_pipe;
5351 suffix_subst = save_suffix_subst;
5353 return funcval;
5356 /* Handle a spec function call of the form:
5358 %:function(args)
5360 ARGS is processed as a spec in a separate context and split into an
5361 argument vector in the normal fashion. The function returns a string
5362 containing a spec which we then process in the caller's context, or
5363 NULL if no processing is required. */
5365 static const char *
5366 handle_spec_function (const char *p)
5368 char *func, *args;
5369 const char *endp, *funcval;
5370 int count;
5372 processing_spec_function++;
5374 /* Get the function name. */
5375 for (endp = p; *endp != '\0'; endp++)
5377 if (*endp == '(') /* ) */
5378 break;
5379 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5380 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5381 fatal ("malformed spec function name");
5383 if (*endp != '(') /* ) */
5384 fatal ("no arguments for spec function");
5385 func = save_string (p, endp - p);
5386 p = ++endp;
5388 /* Get the arguments. */
5389 for (count = 0; *endp != '\0'; endp++)
5391 /* ( */
5392 if (*endp == ')')
5394 if (count == 0)
5395 break;
5396 count--;
5398 else if (*endp == '(') /* ) */
5399 count++;
5401 /* ( */
5402 if (*endp != ')')
5403 fatal ("malformed spec function arguments");
5404 args = save_string (p, endp - p);
5405 p = ++endp;
5407 /* p now points to just past the end of the spec function expression. */
5409 funcval = eval_spec_function (func, args);
5410 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5411 p = NULL;
5413 free (func);
5414 free (args);
5416 processing_spec_function--;
5418 return p;
5421 /* Inline subroutine of handle_braces. Returns true if the current
5422 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5423 static inline bool
5424 input_suffix_matches (const char *atom, const char *end_atom)
5426 /* We special case the semantics of {.s:...} and {.S:...} and their
5427 negative variants. Instead of testing the input filename suffix,
5428 we test whether the input source file is an assembler file or an
5429 assembler-with-cpp file respectively. This allows us to correctly
5430 handle the -x command line option. */
5432 if (atom + 1 == end_atom
5433 && input_file_compiler
5434 && input_file_compiler->suffix)
5436 if (*atom == 's')
5437 return !strcmp (input_file_compiler->suffix, "@assembler");
5438 if (*atom == 'S')
5439 return !strcmp (input_file_compiler->suffix, "@assembler-with-cpp");
5442 return (input_suffix
5443 && !strncmp (input_suffix, atom, end_atom - atom)
5444 && input_suffix[end_atom - atom] == '\0');
5447 /* Inline subroutine of handle_braces. Returns true if a switch
5448 matching the atom bracketed by ATOM and END_ATOM appeared on the
5449 command line. */
5450 static inline bool
5451 switch_matches (const char *atom, const char *end_atom, int starred)
5453 int i;
5454 int len = end_atom - atom;
5455 int plen = starred ? len : -1;
5457 for (i = 0; i < n_switches; i++)
5458 if (!strncmp (switches[i].part1, atom, len)
5459 && (starred || switches[i].part1[len] == '\0')
5460 && check_live_switch (i, plen))
5461 return true;
5463 return false;
5466 /* Inline subroutine of handle_braces. Mark all of the switches which
5467 match ATOM (extends to END_ATOM; STARRED indicates whether there
5468 was a star after the atom) for later processing. */
5469 static inline void
5470 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5472 int i;
5473 int len = end_atom - atom;
5474 int plen = starred ? len : -1;
5476 for (i = 0; i < n_switches; i++)
5477 if (!strncmp (switches[i].part1, atom, len)
5478 && (starred || switches[i].part1[len] == '\0')
5479 && check_live_switch (i, plen))
5480 switches[i].ordering = 1;
5483 /* Inline subroutine of handle_braces. Process all the currently
5484 marked switches through give_switch, and clear the marks. */
5485 static inline void
5486 process_marked_switches (void)
5488 int i;
5490 for (i = 0; i < n_switches; i++)
5491 if (switches[i].ordering == 1)
5493 switches[i].ordering = 0;
5494 give_switch (i, 0);
5498 /* Handle a %{ ... } construct. P points just inside the leading {.
5499 Returns a pointer one past the end of the brace block, or 0
5500 if we call do_spec_1 and that returns -1. */
5502 static const char *
5503 handle_braces (const char *p)
5505 const char *atom, *end_atom;
5506 const char *d_atom = NULL, *d_end_atom = NULL;
5507 const char *orig = p;
5509 bool a_is_suffix;
5510 bool a_is_starred;
5511 bool a_is_negated;
5512 bool a_matched;
5514 bool a_must_be_last = false;
5515 bool ordered_set = false;
5516 bool disjunct_set = false;
5517 bool disj_matched = false;
5518 bool disj_starred = true;
5519 bool n_way_choice = false;
5520 bool n_way_matched = false;
5522 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
5526 if (a_must_be_last)
5527 goto invalid;
5529 /* Scan one "atom" (S in the description above of %{}, possibly
5530 with !, ., or * modifiers). */
5531 a_matched = a_is_suffix = a_is_starred = a_is_negated = false;
5533 SKIP_WHITE();
5534 if (*p == '!')
5535 p++, a_is_negated = true;
5537 SKIP_WHITE();
5538 if (*p == '.')
5539 p++, a_is_suffix = true;
5541 atom = p;
5542 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
5543 || *p == ',' || *p == '.' || *p == '@')
5544 p++;
5545 end_atom = p;
5547 if (*p == '*')
5548 p++, a_is_starred = 1;
5550 SKIP_WHITE();
5551 switch (*p)
5553 case '&': case '}':
5554 /* Substitute the switch(es) indicated by the current atom. */
5555 ordered_set = true;
5556 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
5557 || atom == end_atom)
5558 goto invalid;
5560 mark_matching_switches (atom, end_atom, a_is_starred);
5562 if (*p == '}')
5563 process_marked_switches ();
5564 break;
5566 case '|': case ':':
5567 /* Substitute some text if the current atom appears as a switch
5568 or suffix. */
5569 disjunct_set = true;
5570 if (ordered_set)
5571 goto invalid;
5573 if (atom == end_atom)
5575 if (!n_way_choice || disj_matched || *p == '|'
5576 || a_is_negated || a_is_suffix || a_is_starred)
5577 goto invalid;
5579 /* An empty term may appear as the last choice of an
5580 N-way choice set; it means "otherwise". */
5581 a_must_be_last = true;
5582 disj_matched = !n_way_matched;
5583 disj_starred = false;
5585 else
5587 if (a_is_suffix && a_is_starred)
5588 goto invalid;
5590 if (!a_is_starred)
5591 disj_starred = false;
5593 /* Don't bother testing this atom if we already have a
5594 match. */
5595 if (!disj_matched && !n_way_matched)
5597 if (a_is_suffix)
5598 a_matched = input_suffix_matches (atom, end_atom);
5599 else
5600 a_matched = switch_matches (atom, end_atom, a_is_starred);
5602 if (a_matched != a_is_negated)
5604 disj_matched = true;
5605 d_atom = atom;
5606 d_end_atom = end_atom;
5611 if (*p == ':')
5613 /* Found the body, that is, the text to substitute if the
5614 current disjunction matches. */
5615 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
5616 disj_matched && !n_way_matched);
5617 if (p == 0)
5618 return 0;
5620 /* If we have an N-way choice, reset state for the next
5621 disjunction. */
5622 if (*p == ';')
5624 n_way_choice = true;
5625 n_way_matched |= disj_matched;
5626 disj_matched = false;
5627 disj_starred = true;
5628 d_atom = d_end_atom = NULL;
5631 break;
5633 default:
5634 goto invalid;
5637 while (*p++ != '}');
5639 return p;
5641 invalid:
5642 fatal ("braced spec '%s' is invalid at '%c'", orig, *p);
5644 #undef SKIP_WHITE
5647 /* Subroutine of handle_braces. Scan and process a brace substitution body
5648 (X in the description of %{} syntax). P points one past the colon;
5649 ATOM and END_ATOM bracket the first atom which was found to be true
5650 (present) in the current disjunction; STARRED indicates whether all
5651 the atoms in the current disjunction were starred (for syntax validation);
5652 MATCHED indicates whether the disjunction matched or not, and therefore
5653 whether or not the body is to be processed through do_spec_1 or just
5654 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
5655 returns -1. */
5657 static const char *
5658 process_brace_body (const char *p, const char *atom, const char *end_atom,
5659 int starred, int matched)
5661 const char *body, *end_body;
5662 unsigned int nesting_level;
5663 bool have_subst = false;
5665 /* Locate the closing } or ;, honoring nested braces.
5666 Trim trailing whitespace. */
5667 body = p;
5668 nesting_level = 1;
5669 for (;;)
5671 if (*p == '{')
5672 nesting_level++;
5673 else if (*p == '}')
5675 if (!--nesting_level)
5676 break;
5678 else if (*p == ';' && nesting_level == 1)
5679 break;
5680 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
5681 have_subst = true;
5682 else if (*p == '\0')
5683 goto invalid;
5684 p++;
5687 end_body = p;
5688 while (end_body[-1] == ' ' || end_body[-1] == '\t')
5689 end_body--;
5691 if (have_subst && !starred)
5692 goto invalid;
5694 if (matched)
5696 /* Copy the substitution body to permanent storage and execute it.
5697 If have_subst is false, this is a simple matter of running the
5698 body through do_spec_1... */
5699 char *string = save_string (body, end_body - body);
5700 if (!have_subst)
5702 if (do_spec_1 (string, 0, NULL) < 0)
5703 return 0;
5705 else
5707 /* ... but if have_subst is true, we have to process the
5708 body once for each matching switch, with %* set to the
5709 variant part of the switch. */
5710 unsigned int hard_match_len = end_atom - atom;
5711 int i;
5713 for (i = 0; i < n_switches; i++)
5714 if (!strncmp (switches[i].part1, atom, hard_match_len)
5715 && check_live_switch (i, hard_match_len))
5717 if (do_spec_1 (string, 0,
5718 &switches[i].part1[hard_match_len]) < 0)
5719 return 0;
5720 /* Pass any arguments this switch has. */
5721 give_switch (i, 1);
5722 suffix_subst = NULL;
5727 return p;
5729 invalid:
5730 fatal ("braced spec body '%s' is invalid", body);
5733 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5734 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
5735 spec, or -1 if either exact match or %* is used.
5737 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
5738 whose value does not begin with "no-" is obsoleted by the same value
5739 with the "no-", similarly for a switch with the "no-" prefix. */
5741 static int
5742 check_live_switch (int switchnum, int prefix_length)
5744 const char *name = switches[switchnum].part1;
5745 int i;
5747 /* In the common case of {<at-most-one-letter>*}, a negating
5748 switch would always match, so ignore that case. We will just
5749 send the conflicting switches to the compiler phase. */
5750 if (prefix_length >= 0 && prefix_length <= 1)
5751 return 1;
5753 /* If we already processed this switch and determined if it was
5754 live or not, return our past determination. */
5755 if (switches[switchnum].live_cond != 0)
5756 return switches[switchnum].live_cond > 0;
5758 /* Now search for duplicate in a manner that depends on the name. */
5759 switch (*name)
5761 case 'O':
5762 for (i = switchnum + 1; i < n_switches; i++)
5763 if (switches[i].part1[0] == 'O')
5765 switches[switchnum].validated = 1;
5766 switches[switchnum].live_cond = SWITCH_FALSE;
5767 return 0;
5769 break;
5771 case 'W': case 'f': case 'm':
5772 if (! strncmp (name + 1, "no-", 3))
5774 /* We have Xno-YYY, search for XYYY. */
5775 for (i = switchnum + 1; i < n_switches; i++)
5776 if (switches[i].part1[0] == name[0]
5777 && ! strcmp (&switches[i].part1[1], &name[4]))
5779 switches[switchnum].validated = 1;
5780 switches[switchnum].live_cond = SWITCH_FALSE;
5781 return 0;
5784 else
5786 /* We have XYYY, search for Xno-YYY. */
5787 for (i = switchnum + 1; i < n_switches; i++)
5788 if (switches[i].part1[0] == name[0]
5789 && switches[i].part1[1] == 'n'
5790 && switches[i].part1[2] == 'o'
5791 && switches[i].part1[3] == '-'
5792 && !strcmp (&switches[i].part1[4], &name[1]))
5794 switches[switchnum].validated = 1;
5795 switches[switchnum].live_cond = SWITCH_FALSE;
5796 return 0;
5799 break;
5802 /* Otherwise the switch is live. */
5803 switches[switchnum].live_cond = SWITCH_LIVE;
5804 return 1;
5807 /* Pass a switch to the current accumulating command
5808 in the same form that we received it.
5809 SWITCHNUM identifies the switch; it is an index into
5810 the vector of switches gcc received, which is `switches'.
5811 This cannot fail since it never finishes a command line.
5813 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
5815 static void
5816 give_switch (int switchnum, int omit_first_word)
5818 if (switches[switchnum].live_cond == SWITCH_IGNORE)
5819 return;
5821 if (!omit_first_word)
5823 do_spec_1 ("-", 0, NULL);
5824 do_spec_1 (switches[switchnum].part1, 1, NULL);
5827 if (switches[switchnum].args != 0)
5829 const char **p;
5830 for (p = switches[switchnum].args; *p; p++)
5832 const char *arg = *p;
5834 do_spec_1 (" ", 0, NULL);
5835 if (suffix_subst)
5837 unsigned length = strlen (arg);
5838 int dot = 0;
5840 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
5841 if (arg[length] == '.')
5843 ((char *)arg)[length] = 0;
5844 dot = 1;
5845 break;
5847 do_spec_1 (arg, 1, NULL);
5848 if (dot)
5849 ((char *)arg)[length] = '.';
5850 do_spec_1 (suffix_subst, 1, NULL);
5852 else
5853 do_spec_1 (arg, 1, NULL);
5857 do_spec_1 (" ", 0, NULL);
5858 switches[switchnum].validated = 1;
5861 /* Search for a file named NAME trying various prefixes including the
5862 user's -B prefix and some standard ones.
5863 Return the absolute file name found. If nothing is found, return NAME. */
5865 static const char *
5866 find_file (const char *name)
5868 char *newname;
5870 /* Try multilib_dir if it is defined. */
5871 if (multilib_os_dir != NULL)
5873 newname = find_a_file (&startfile_prefixes, name, R_OK, 1);
5875 /* If we don't find it in the multi library dir, then fall
5876 through and look for it in the normal places. */
5877 if (newname != NULL)
5878 return newname;
5881 newname = find_a_file (&startfile_prefixes, name, R_OK, 0);
5882 return newname ? newname : name;
5885 /* Determine whether a directory exists. If LINKER, return 0 for
5886 certain fixed names not needed by the linker. If not LINKER, it is
5887 only important to return 0 if the host machine has a small ARG_MAX
5888 limit. */
5890 static int
5891 is_directory (const char *path1, const char *path2, int linker)
5893 int len1 = strlen (path1);
5894 int len2 = strlen (path2);
5895 char *path = alloca (3 + len1 + len2);
5896 char *cp;
5897 struct stat st;
5899 #ifndef SMALL_ARG_MAX
5900 if (! linker)
5901 return 1;
5902 #endif
5904 /* Construct the path from the two parts. Ensure the string ends with "/.".
5905 The resulting path will be a directory even if the given path is a
5906 symbolic link. */
5907 memcpy (path, path1, len1);
5908 memcpy (path + len1, path2, len2);
5909 cp = path + len1 + len2;
5910 if (!IS_DIR_SEPARATOR (cp[-1]))
5911 *cp++ = DIR_SEPARATOR;
5912 *cp++ = '.';
5913 *cp = '\0';
5915 /* Exclude directories that the linker is known to search. */
5916 if (linker
5917 && ((cp - path == 6
5918 && strcmp (path, concat (dir_separator_str, "lib",
5919 dir_separator_str, ".", NULL)) == 0)
5920 || (cp - path == 10
5921 && strcmp (path, concat (dir_separator_str, "usr",
5922 dir_separator_str, "lib",
5923 dir_separator_str, ".", NULL)) == 0)))
5924 return 0;
5926 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5929 /* Set up the various global variables to indicate that we're processing
5930 the input file named FILENAME. */
5932 void
5933 set_input (const char *filename)
5935 const char *p;
5937 input_filename = filename;
5938 input_filename_length = strlen (input_filename);
5940 input_basename = input_filename;
5941 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5942 /* Skip drive name so 'x:foo' is handled properly. */
5943 if (input_basename[1] == ':')
5944 input_basename += 2;
5945 #endif
5946 for (p = input_basename; *p; p++)
5947 if (IS_DIR_SEPARATOR (*p))
5948 input_basename = p + 1;
5950 /* Find a suffix starting with the last period,
5951 and set basename_length to exclude that suffix. */
5952 basename_length = strlen (input_basename);
5953 suffixed_basename_length = basename_length;
5954 p = input_basename + basename_length;
5955 while (p != input_basename && *p != '.')
5956 --p;
5957 if (*p == '.' && p != input_basename)
5959 basename_length = p - input_basename;
5960 input_suffix = p + 1;
5962 else
5963 input_suffix = "";
5965 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
5966 we will need to do a stat on the input_filename. The
5967 INPUT_STAT_SET signals that the stat is needed. */
5968 input_stat_set = 0;
5971 /* On fatal signals, delete all the temporary files. */
5973 static void
5974 fatal_error (int signum)
5976 signal (signum, SIG_DFL);
5977 delete_failure_queue ();
5978 delete_temp_files ();
5979 /* Get the same signal again, this time not handled,
5980 so its normal effect occurs. */
5981 kill (getpid (), signum);
5984 extern int main (int, const char **);
5987 main (int argc, const char **argv)
5989 size_t i;
5990 int value;
5991 int linker_was_run = 0;
5992 int lang_n_infiles = 0;
5993 int num_linker_inputs = 0;
5994 char *explicit_link_files;
5995 char *specs_file;
5996 const char *p;
5997 struct user_specs *uptr;
5999 p = argv[0] + strlen (argv[0]);
6000 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6001 --p;
6002 programname = p;
6004 xmalloc_set_program_name (programname);
6006 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6007 /* Perform host dependent initialization when needed. */
6008 GCC_DRIVER_HOST_INITIALIZATION;
6009 #endif
6011 /* Unlock the stdio streams. */
6012 unlock_std_streams ();
6014 gcc_init_libintl ();
6016 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6017 signal (SIGINT, fatal_error);
6018 #ifdef SIGHUP
6019 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6020 signal (SIGHUP, fatal_error);
6021 #endif
6022 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6023 signal (SIGTERM, fatal_error);
6024 #ifdef SIGPIPE
6025 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6026 signal (SIGPIPE, fatal_error);
6027 #endif
6028 #ifdef SIGCHLD
6029 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6030 receive the signal. A different setting is inheritable */
6031 signal (SIGCHLD, SIG_DFL);
6032 #endif
6034 /* Allocate the argument vector. */
6035 alloc_args ();
6037 obstack_init (&obstack);
6039 /* Build multilib_select, et. al from the separate lines that make up each
6040 multilib selection. */
6042 const char *const *q = multilib_raw;
6043 int need_space;
6045 obstack_init (&multilib_obstack);
6046 while ((p = *q++) != (char *) 0)
6047 obstack_grow (&multilib_obstack, p, strlen (p));
6049 obstack_1grow (&multilib_obstack, 0);
6050 multilib_select = XOBFINISH (&multilib_obstack, const char *);
6052 q = multilib_matches_raw;
6053 while ((p = *q++) != (char *) 0)
6054 obstack_grow (&multilib_obstack, p, strlen (p));
6056 obstack_1grow (&multilib_obstack, 0);
6057 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6059 q = multilib_exclusions_raw;
6060 while ((p = *q++) != (char *) 0)
6061 obstack_grow (&multilib_obstack, p, strlen (p));
6063 obstack_1grow (&multilib_obstack, 0);
6064 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6066 need_space = FALSE;
6067 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6069 if (need_space)
6070 obstack_1grow (&multilib_obstack, ' ');
6071 obstack_grow (&multilib_obstack,
6072 multilib_defaults_raw[i],
6073 strlen (multilib_defaults_raw[i]));
6074 need_space = TRUE;
6077 obstack_1grow (&multilib_obstack, 0);
6078 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6081 /* Set up to remember the pathname of gcc and any options
6082 needed for collect. We use argv[0] instead of programname because
6083 we need the complete pathname. */
6084 obstack_init (&collect_obstack);
6085 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6086 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6087 putenv (XOBFINISH (&collect_obstack, char *));
6089 #ifdef INIT_ENVIRONMENT
6090 /* Set up any other necessary machine specific environment variables. */
6091 putenv (INIT_ENVIRONMENT);
6092 #endif
6094 /* Make a table of what switches there are (switches, n_switches).
6095 Make a table of specified input files (infiles, n_infiles).
6096 Decode switches that are handled locally. */
6098 process_command (argc, argv);
6100 /* Initialize the vector of specs to just the default.
6101 This means one element containing 0s, as a terminator. */
6103 compilers = xmalloc (sizeof default_compilers);
6104 memcpy (compilers, default_compilers, sizeof default_compilers);
6105 n_compilers = n_default_compilers;
6107 /* Read specs from a file if there is one. */
6109 machine_suffix = concat (spec_machine, dir_separator_str,
6110 spec_version, dir_separator_str, NULL);
6111 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6113 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, 0);
6114 /* Read the specs file unless it is a default one. */
6115 if (specs_file != 0 && strcmp (specs_file, "specs"))
6116 read_specs (specs_file, TRUE);
6117 else
6118 init_spec ();
6120 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6121 for any override of as, ld and libraries. */
6122 specs_file = alloca (strlen (standard_exec_prefix)
6123 + strlen (just_machine_suffix) + sizeof ("specs"));
6125 strcpy (specs_file, standard_exec_prefix);
6126 strcat (specs_file, just_machine_suffix);
6127 strcat (specs_file, "specs");
6128 if (access (specs_file, R_OK) == 0)
6129 read_specs (specs_file, TRUE);
6131 /* Process any configure-time defaults specified for the command line
6132 options, via OPTION_DEFAULT_SPECS. */
6133 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6134 do_option_spec (option_default_specs[i].name,
6135 option_default_specs[i].spec);
6137 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6138 of the command line. */
6140 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6141 do_self_spec (driver_self_specs[i]);
6143 /* If not cross-compiling, look for executables in the standard
6144 places. */
6145 if (*cross_compile == '0')
6147 if (*md_exec_prefix)
6149 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6150 PREFIX_PRIORITY_LAST, 0, 0);
6154 /* Process sysroot_suffix_spec. */
6155 if (*sysroot_suffix_spec != 0
6156 && do_spec_2 (sysroot_suffix_spec) == 0)
6158 if (argbuf_index > 1)
6159 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC.");
6160 else if (argbuf_index == 1)
6161 target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6164 #ifdef HAVE_LD_SYSROOT
6165 /* Pass the --sysroot option to the linker, if it supports that. If
6166 there is a sysroot_suffix_spec, it has already been processed by
6167 this point, so target_system_root really is the system root we
6168 should be using. */
6169 if (target_system_root)
6171 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6172 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6173 set_spec ("link", XOBFINISH (&obstack, const char *));
6175 #endif
6177 /* Process sysroot_hdrs_suffix_spec. */
6178 if (*sysroot_hdrs_suffix_spec != 0
6179 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6181 if (argbuf_index > 1)
6182 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC.");
6183 else if (argbuf_index == 1)
6184 target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6187 /* Look for startfiles in the standard places. */
6188 if (*startfile_prefix_spec != 0
6189 && do_spec_2 (startfile_prefix_spec) == 0
6190 && do_spec_1 (" ", 0, NULL) == 0)
6192 int ndx;
6193 for (ndx = 0; ndx < argbuf_index; ndx++)
6194 add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6195 PREFIX_PRIORITY_LAST, 0, 1);
6197 /* We should eventually get rid of all these and stick to
6198 startfile_prefix_spec exclusively. */
6199 else if (*cross_compile == '0' || target_system_root)
6201 if (*md_startfile_prefix)
6202 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6203 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6205 if (*md_startfile_prefix_1)
6206 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6207 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6209 /* If standard_startfile_prefix is relative, base it on
6210 standard_exec_prefix. This lets us move the installed tree
6211 as a unit. If GCC_EXEC_PREFIX is defined, base
6212 standard_startfile_prefix on that as well.
6214 If the prefix is relative, only search it for native compilers;
6215 otherwise we will search a directory containing host libraries. */
6216 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6217 add_sysrooted_prefix (&startfile_prefixes,
6218 standard_startfile_prefix, "BINUTILS",
6219 PREFIX_PRIORITY_LAST, 0, 1);
6220 else if (*cross_compile == '0')
6222 if (gcc_exec_prefix)
6223 add_prefix (&startfile_prefixes,
6224 concat (gcc_exec_prefix, machine_suffix,
6225 standard_startfile_prefix, NULL),
6226 NULL, PREFIX_PRIORITY_LAST, 0, 1);
6227 add_prefix (&startfile_prefixes,
6228 concat (standard_exec_prefix,
6229 machine_suffix,
6230 standard_startfile_prefix, NULL),
6231 NULL, PREFIX_PRIORITY_LAST, 0, 1);
6234 if (*standard_startfile_prefix_1)
6235 add_sysrooted_prefix (&startfile_prefixes,
6236 standard_startfile_prefix_1, "BINUTILS",
6237 PREFIX_PRIORITY_LAST, 0, 1);
6238 if (*standard_startfile_prefix_2)
6239 add_sysrooted_prefix (&startfile_prefixes,
6240 standard_startfile_prefix_2, "BINUTILS",
6241 PREFIX_PRIORITY_LAST, 0, 1);
6244 /* Process any user specified specs in the order given on the command
6245 line. */
6246 for (uptr = user_specs_head; uptr; uptr = uptr->next)
6248 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6249 R_OK, 0);
6250 read_specs (filename ? filename : uptr->filename, FALSE);
6253 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
6254 if (gcc_exec_prefix)
6255 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6256 spec_version, dir_separator_str, NULL);
6258 /* Now we have the specs.
6259 Set the `valid' bits for switches that match anything in any spec. */
6261 validate_all_switches ();
6263 /* Now that we have the switches and the specs, set
6264 the subdirectory based on the options. */
6265 set_multilib_dir ();
6267 /* Warn about any switches that no pass was interested in. */
6269 for (i = 0; (int) i < n_switches; i++)
6270 if (! switches[i].validated)
6271 error ("unrecognized option '-%s'", switches[i].part1);
6273 /* Obey some of the options. */
6275 if (print_search_dirs)
6277 printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
6278 printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
6279 printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
6280 return (0);
6283 if (print_file_name)
6285 printf ("%s\n", find_file (print_file_name));
6286 return (0);
6289 if (print_prog_name)
6291 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6292 printf ("%s\n", (newname ? newname : print_prog_name));
6293 return (0);
6296 if (print_multi_lib)
6298 print_multilib_info ();
6299 return (0);
6302 if (print_multi_directory)
6304 if (multilib_dir == NULL)
6305 printf (".\n");
6306 else
6307 printf ("%s\n", multilib_dir);
6308 return (0);
6311 if (print_multi_os_directory)
6313 if (multilib_os_dir == NULL)
6314 printf (".\n");
6315 else
6316 printf ("%s\n", multilib_os_dir);
6317 return (0);
6320 if (target_help_flag)
6322 /* Print if any target specific options. */
6324 /* We do not exit here. Instead we have created a fake input file
6325 called 'target-dummy' which needs to be compiled, and we pass this
6326 on to the various sub-processes, along with the --target-help
6327 switch. */
6330 if (print_help_list)
6332 display_help ();
6334 if (! verbose_flag)
6336 printf (_("\nFor bug reporting instructions, please see:\n"));
6337 printf ("%s.\n", bug_report_url);
6339 return (0);
6342 /* We do not exit here. Instead we have created a fake input file
6343 called 'help-dummy' which needs to be compiled, and we pass this
6344 on the various sub-processes, along with the --help switch. */
6347 if (verbose_flag)
6349 int n;
6350 const char *thrmod;
6352 notice ("Target: %s\n", spec_machine);
6353 notice ("Configured with: %s\n", configuration_arguments);
6355 #ifdef THREAD_MODEL_SPEC
6356 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6357 but there's no point in doing all this processing just to get
6358 thread_model back. */
6359 obstack_init (&obstack);
6360 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6361 obstack_1grow (&obstack, '\0');
6362 thrmod = XOBFINISH (&obstack, const char *);
6363 #else
6364 thrmod = thread_model;
6365 #endif
6367 notice ("Thread model: %s\n", thrmod);
6369 /* compiler_version is truncated at the first space when initialized
6370 from version string, so truncate version_string at the first space
6371 before comparing. */
6372 for (n = 0; version_string[n]; n++)
6373 if (version_string[n] == ' ')
6374 break;
6376 if (! strncmp (version_string, compiler_version, n)
6377 && compiler_version[n] == 0)
6378 notice ("gcc version %s\n", version_string);
6379 else
6380 notice ("gcc driver version %s executing gcc version %s\n",
6381 version_string, compiler_version);
6383 if (n_infiles == 0)
6384 return (0);
6387 if (n_infiles == added_libraries)
6388 fatal ("no input files");
6390 /* Make a place to record the compiler output file names
6391 that correspond to the input files. */
6393 i = n_infiles;
6394 i += lang_specific_extra_outfiles;
6395 outfiles = xcalloc (i, sizeof (char *));
6397 /* Record which files were specified explicitly as link input. */
6399 explicit_link_files = xcalloc (1, n_infiles);
6401 if (combine_flag)
6402 combine_inputs = true;
6403 else
6404 combine_inputs = false;
6406 for (i = 0; (int) i < n_infiles; i++)
6408 const char *name = infiles[i].name;
6409 struct compiler *compiler = lookup_compiler (name,
6410 strlen (name),
6411 infiles[i].language);
6413 if (compiler && !(compiler->combinable))
6414 combine_inputs = false;
6416 if (lang_n_infiles > 0 && compiler != input_file_compiler
6417 && infiles[i].language && infiles[i].language[0] != '*')
6418 infiles[i].incompiler = compiler;
6419 else if (compiler)
6421 lang_n_infiles++;
6422 input_file_compiler = compiler;
6423 infiles[i].incompiler = compiler;
6425 else
6427 /* Since there is no compiler for this input file, assume it is a
6428 linker file. */
6429 explicit_link_files[i] = 1;
6430 infiles[i].incompiler = NULL;
6432 infiles[i].compiled = false;
6433 infiles[i].preprocessed = false;
6436 if (combine_flag && save_temps_flag)
6438 bool save_combine_inputs = combine_inputs;
6439 /* Must do a separate pre-processing pass for C & Objective-C files, to
6440 obtain individual .i files. */
6442 combine_inputs = false;
6443 for (i = 0; (int) i < n_infiles; i++)
6445 int this_file_error = 0;
6447 input_file_number = i;
6448 set_input (infiles[i].name);
6449 if (infiles[i].incompiler
6450 && (infiles[i].incompiler)->needs_preprocessing)
6451 input_file_compiler = infiles[i].incompiler;
6452 else
6453 continue;
6455 if (input_file_compiler)
6457 if (input_file_compiler->spec[0] == '#')
6459 error ("%s: %s compiler not installed on this system",
6460 input_filename, &input_file_compiler->spec[1]);
6461 this_file_error = 1;
6463 else
6465 value = do_spec (input_file_compiler->spec);
6466 infiles[i].preprocessed = true;
6467 if (!have_o_argbuf_index)
6468 fatal ("spec '%s' is invalid", input_file_compiler->spec);
6469 infiles[i].name = argbuf[have_o_argbuf_index];
6470 infiles[i].incompiler
6471 = lookup_compiler (infiles[i].name,
6472 strlen (infiles[i].name),
6473 infiles[i].language);
6475 if (value < 0)
6476 this_file_error = 1;
6480 if (this_file_error)
6482 delete_failure_queue ();
6483 error_count++;
6484 break;
6486 clear_failure_queue ();
6488 combine_inputs = save_combine_inputs;
6491 for (i = 0; (int) i < n_infiles; i++)
6493 int this_file_error = 0;
6495 /* Tell do_spec what to substitute for %i. */
6497 input_file_number = i;
6498 set_input (infiles[i].name);
6500 if (infiles[i].compiled)
6501 continue;
6503 /* Use the same thing in %o, unless cp->spec says otherwise. */
6505 outfiles[i] = input_filename;
6507 /* Figure out which compiler from the file's suffix. */
6509 if (! combine_inputs)
6510 input_file_compiler
6511 = lookup_compiler (infiles[i].name, input_filename_length,
6512 infiles[i].language);
6513 else
6514 input_file_compiler = infiles[i].incompiler;
6516 if (input_file_compiler)
6518 /* Ok, we found an applicable compiler. Run its spec. */
6520 if (input_file_compiler->spec[0] == '#')
6522 error ("%s: %s compiler not installed on this system",
6523 input_filename, &input_file_compiler->spec[1]);
6524 this_file_error = 1;
6526 else
6528 value = do_spec (input_file_compiler->spec);
6529 infiles[i].compiled = true;
6530 if (value < 0)
6531 this_file_error = 1;
6535 /* If this file's name does not contain a recognized suffix,
6536 record it as explicit linker input. */
6538 else
6539 explicit_link_files[i] = 1;
6541 /* Clear the delete-on-failure queue, deleting the files in it
6542 if this compilation failed. */
6544 if (this_file_error)
6546 delete_failure_queue ();
6547 error_count++;
6549 /* If this compilation succeeded, don't delete those files later. */
6550 clear_failure_queue ();
6553 /* Reset the output file name to the first input file name, for use
6554 with %b in LINK_SPEC on a target that prefers not to emit a.out
6555 by default. */
6556 if (n_infiles > 0)
6557 set_input (infiles[0].name);
6559 if (error_count == 0)
6561 /* Make sure INPUT_FILE_NUMBER points to first available open
6562 slot. */
6563 input_file_number = n_infiles;
6564 if (lang_specific_pre_link ())
6565 error_count++;
6568 /* Determine if there are any linker input files. */
6569 num_linker_inputs = 0;
6570 for (i = 0; (int) i < n_infiles; i++)
6571 if (explicit_link_files[i] || outfiles[i] != NULL)
6572 num_linker_inputs++;
6574 /* Run ld to link all the compiler output files. */
6576 if (num_linker_inputs > 0 && error_count == 0)
6578 int tmp = execution_count;
6580 /* We'll use ld if we can't find collect2. */
6581 if (! strcmp (linker_name_spec, "collect2"))
6583 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, 0);
6584 if (s == NULL)
6585 linker_name_spec = "ld";
6587 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
6588 for collect. */
6589 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
6590 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
6592 value = do_spec (link_command_spec);
6593 if (value < 0)
6594 error_count = 1;
6595 linker_was_run = (tmp != execution_count);
6598 /* If options said don't run linker,
6599 complain about input files to be given to the linker. */
6601 if (! linker_was_run && error_count == 0)
6602 for (i = 0; (int) i < n_infiles; i++)
6603 if (explicit_link_files[i])
6604 error ("%s: linker input file unused because linking not done",
6605 outfiles[i]);
6607 /* Delete some or all of the temporary files we made. */
6609 if (error_count)
6610 delete_failure_queue ();
6611 delete_temp_files ();
6613 if (print_help_list)
6615 printf (("\nFor bug reporting instructions, please see:\n"));
6616 printf ("%s\n", bug_report_url);
6619 return (signal_count != 0 ? 2
6620 : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
6621 : 0);
6624 /* Find the proper compilation spec for the file name NAME,
6625 whose length is LENGTH. LANGUAGE is the specified language,
6626 or 0 if this file is to be passed to the linker. */
6628 static struct compiler *
6629 lookup_compiler (const char *name, size_t length, const char *language)
6631 struct compiler *cp;
6633 /* If this was specified by the user to be a linker input, indicate that. */
6634 if (language != 0 && language[0] == '*')
6635 return 0;
6637 /* Otherwise, look for the language, if one is spec'd. */
6638 if (language != 0)
6640 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6641 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
6642 return cp;
6644 error ("language %s not recognized", language);
6645 return 0;
6648 /* Look for a suffix. */
6649 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6651 if (/* The suffix `-' matches only the file name `-'. */
6652 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6653 || (strlen (cp->suffix) < length
6654 /* See if the suffix matches the end of NAME. */
6655 && !strcmp (cp->suffix,
6656 name + length - strlen (cp->suffix))
6658 break;
6661 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6662 /* Look again, but case-insensitively this time. */
6663 if (cp < compilers)
6664 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6666 if (/* The suffix `-' matches only the file name `-'. */
6667 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6668 || (strlen (cp->suffix) < length
6669 /* See if the suffix matches the end of NAME. */
6670 && ((!strcmp (cp->suffix,
6671 name + length - strlen (cp->suffix))
6672 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
6673 && !strcasecmp (cp->suffix,
6674 name + length - strlen (cp->suffix)))
6676 break;
6678 #endif
6680 if (cp >= compilers)
6682 if (cp->spec[0] != '@')
6683 /* A non-alias entry: return it. */
6684 return cp;
6686 /* An alias entry maps a suffix to a language.
6687 Search for the language; pass 0 for NAME and LENGTH
6688 to avoid infinite recursion if language not found. */
6689 return lookup_compiler (NULL, 0, cp->spec + 1);
6691 return 0;
6694 static char *
6695 save_string (const char *s, int len)
6697 char *result = xmalloc (len + 1);
6699 memcpy (result, s, len);
6700 result[len] = 0;
6701 return result;
6704 void
6705 pfatal_with_name (const char *name)
6707 perror_with_name (name);
6708 delete_temp_files ();
6709 exit (1);
6712 static void
6713 perror_with_name (const char *name)
6715 error ("%s: %s", name, xstrerror (errno));
6718 /* Output an error message and exit. */
6720 void
6721 fancy_abort (const char *file, int line, const char *func)
6723 fatal ("internal gcc abort in %s, at %s:%d", func, file, line);
6726 /* Output an error message and exit. */
6728 void
6729 fatal (const char *cmsgid, ...)
6731 va_list ap;
6733 va_start (ap, cmsgid);
6735 fprintf (stderr, "%s: ", programname);
6736 vfprintf (stderr, _(cmsgid), ap);
6737 va_end (ap);
6738 fprintf (stderr, "\n");
6739 delete_temp_files ();
6740 exit (1);
6743 /* The argument is actually c-format, not gcc-internal-format,
6744 but because functions with identical names are used through
6745 the rest of the compiler with gcc-internal-format, we just
6746 need to hope all users of these functions use the common
6747 subset between c-format and gcc-internal-format. */
6749 void
6750 error (const char *gmsgid, ...)
6752 va_list ap;
6754 va_start (ap, gmsgid);
6755 fprintf (stderr, "%s: ", programname);
6756 vfprintf (stderr, _(gmsgid), ap);
6757 va_end (ap);
6759 fprintf (stderr, "\n");
6762 static void
6763 notice (const char *cmsgid, ...)
6765 va_list ap;
6767 va_start (ap, cmsgid);
6768 vfprintf (stderr, _(cmsgid), ap);
6769 va_end (ap);
6772 static inline void
6773 validate_switches_from_spec (const char *spec)
6775 const char *p = spec;
6776 char c;
6777 while ((c = *p++))
6778 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
6779 /* We have a switch spec. */
6780 p = validate_switches (p + 1);
6783 static void
6784 validate_all_switches (void)
6786 struct compiler *comp;
6787 struct spec_list *spec;
6789 for (comp = compilers; comp->spec; comp++)
6790 validate_switches_from_spec (comp->spec);
6792 /* Look through the linked list of specs read from the specs file. */
6793 for (spec = specs; spec; spec = spec->next)
6794 validate_switches_from_spec (*spec->ptr_spec);
6796 validate_switches_from_spec (link_command_spec);
6799 /* Look at the switch-name that comes after START
6800 and mark as valid all supplied switches that match it. */
6802 static const char *
6803 validate_switches (const char *start)
6805 const char *p = start;
6806 const char *atom;
6807 size_t len;
6808 int i;
6809 bool suffix = false;
6810 bool starred = false;
6812 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6814 next_member:
6815 SKIP_WHITE ();
6817 if (*p == '!')
6818 p++;
6820 SKIP_WHITE ();
6821 if (*p == '.')
6822 suffix = true, p++;
6824 atom = p;
6825 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
6826 || *p == ',' || *p == '.' || *p == '@')
6827 p++;
6828 len = p - atom;
6830 if (*p == '*')
6831 starred = true, p++;
6833 SKIP_WHITE ();
6835 if (!suffix)
6837 /* Mark all matching switches as valid. */
6838 for (i = 0; i < n_switches; i++)
6839 if (!strncmp (switches[i].part1, atom, len)
6840 && (starred || switches[i].part1[len] == 0))
6841 switches[i].validated = 1;
6844 if (*p) p++;
6845 if (*p && (p[-1] == '|' || p[-1] == '&'))
6846 goto next_member;
6848 if (*p && p[-1] == ':')
6850 while (*p && *p != ';' && *p != '}')
6852 if (*p == '%')
6854 p++;
6855 if (*p == '{' || *p == '<')
6856 p = validate_switches (p+1);
6857 else if (p[0] == 'W' && p[1] == '{')
6858 p = validate_switches (p+2);
6860 else
6861 p++;
6864 if (*p) p++;
6865 if (*p && p[-1] == ';')
6866 goto next_member;
6869 return p;
6870 #undef SKIP_WHITE
6873 struct mdswitchstr
6875 const char *str;
6876 int len;
6879 static struct mdswitchstr *mdswitches;
6880 static int n_mdswitches;
6882 /* Check whether a particular argument was used. The first time we
6883 canonicalize the switches to keep only the ones we care about. */
6885 static int
6886 used_arg (const char *p, int len)
6888 struct mswitchstr
6890 const char *str;
6891 const char *replace;
6892 int len;
6893 int rep_len;
6896 static struct mswitchstr *mswitches;
6897 static int n_mswitches;
6898 int i, j;
6900 if (!mswitches)
6902 struct mswitchstr *matches;
6903 const char *q;
6904 int cnt = 0;
6906 /* Break multilib_matches into the component strings of string
6907 and replacement string. */
6908 for (q = multilib_matches; *q != '\0'; q++)
6909 if (*q == ';')
6910 cnt++;
6912 matches = alloca ((sizeof (struct mswitchstr)) * cnt);
6913 i = 0;
6914 q = multilib_matches;
6915 while (*q != '\0')
6917 matches[i].str = q;
6918 while (*q != ' ')
6920 if (*q == '\0')
6922 invalid_matches:
6923 fatal ("multilib spec '%s' is invalid", multilib_matches);
6925 q++;
6927 matches[i].len = q - matches[i].str;
6929 matches[i].replace = ++q;
6930 while (*q != ';' && *q != '\0')
6932 if (*q == ' ')
6933 goto invalid_matches;
6934 q++;
6936 matches[i].rep_len = q - matches[i].replace;
6937 i++;
6938 if (*q == ';')
6939 q++;
6942 /* Now build a list of the replacement string for switches that we care
6943 about. Make sure we allocate at least one entry. This prevents
6944 xmalloc from calling fatal, and prevents us from re-executing this
6945 block of code. */
6946 mswitches
6947 = xmalloc (sizeof (struct mswitchstr)
6948 * (n_mdswitches + (n_switches ? n_switches : 1)));
6949 for (i = 0; i < n_switches; i++)
6950 if (switches[i].live_cond != SWITCH_IGNORE)
6952 int xlen = strlen (switches[i].part1);
6953 for (j = 0; j < cnt; j++)
6954 if (xlen == matches[j].len
6955 && ! strncmp (switches[i].part1, matches[j].str, xlen))
6957 mswitches[n_mswitches].str = matches[j].replace;
6958 mswitches[n_mswitches].len = matches[j].rep_len;
6959 mswitches[n_mswitches].replace = (char *) 0;
6960 mswitches[n_mswitches].rep_len = 0;
6961 n_mswitches++;
6962 break;
6966 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
6967 on the command line nor any options mutually incompatible with
6968 them. */
6969 for (i = 0; i < n_mdswitches; i++)
6971 const char *r;
6973 for (q = multilib_options; *q != '\0'; q++)
6975 while (*q == ' ')
6976 q++;
6978 r = q;
6979 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
6980 || strchr (" /", q[mdswitches[i].len]) == NULL)
6982 while (*q != ' ' && *q != '/' && *q != '\0')
6983 q++;
6984 if (*q != '/')
6985 break;
6986 q++;
6989 if (*q != ' ' && *q != '\0')
6991 while (*r != ' ' && *r != '\0')
6993 q = r;
6994 while (*q != ' ' && *q != '/' && *q != '\0')
6995 q++;
6997 if (used_arg (r, q - r))
6998 break;
7000 if (*q != '/')
7002 mswitches[n_mswitches].str = mdswitches[i].str;
7003 mswitches[n_mswitches].len = mdswitches[i].len;
7004 mswitches[n_mswitches].replace = (char *) 0;
7005 mswitches[n_mswitches].rep_len = 0;
7006 n_mswitches++;
7007 break;
7010 r = q + 1;
7012 break;
7018 for (i = 0; i < n_mswitches; i++)
7019 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7020 return 1;
7022 return 0;
7025 static int
7026 default_arg (const char *p, int len)
7028 int i;
7030 for (i = 0; i < n_mdswitches; i++)
7031 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7032 return 1;
7034 return 0;
7037 /* Work out the subdirectory to use based on the options. The format of
7038 multilib_select is a list of elements. Each element is a subdirectory
7039 name followed by a list of options followed by a semicolon. The format
7040 of multilib_exclusions is the same, but without the preceding
7041 directory. First gcc will check the exclusions, if none of the options
7042 beginning with an exclamation point are present, and all of the other
7043 options are present, then we will ignore this completely. Passing
7044 that, gcc will consider each multilib_select in turn using the same
7045 rules for matching the options. If a match is found, that subdirectory
7046 will be used. */
7048 static void
7049 set_multilib_dir (void)
7051 const char *p;
7052 unsigned int this_path_len;
7053 const char *this_path, *this_arg;
7054 const char *start, *end;
7055 int not_arg;
7056 int ok, ndfltok, first;
7058 n_mdswitches = 0;
7059 start = multilib_defaults;
7060 while (*start == ' ' || *start == '\t')
7061 start++;
7062 while (*start != '\0')
7064 n_mdswitches++;
7065 while (*start != ' ' && *start != '\t' && *start != '\0')
7066 start++;
7067 while (*start == ' ' || *start == '\t')
7068 start++;
7071 if (n_mdswitches)
7073 int i = 0;
7075 mdswitches = xmalloc (sizeof (struct mdswitchstr) * n_mdswitches);
7076 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7078 while (*start == ' ' || *start == '\t')
7079 start++;
7081 if (*start == '\0')
7082 break;
7084 for (end = start + 1;
7085 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7088 obstack_grow (&multilib_obstack, start, end - start);
7089 obstack_1grow (&multilib_obstack, 0);
7090 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
7091 mdswitches[i++].len = end - start;
7093 if (*end == '\0')
7094 break;
7098 p = multilib_exclusions;
7099 while (*p != '\0')
7101 /* Ignore newlines. */
7102 if (*p == '\n')
7104 ++p;
7105 continue;
7108 /* Check the arguments. */
7109 ok = 1;
7110 while (*p != ';')
7112 if (*p == '\0')
7114 invalid_exclusions:
7115 fatal ("multilib exclusions '%s' is invalid",
7116 multilib_exclusions);
7119 if (! ok)
7121 ++p;
7122 continue;
7125 this_arg = p;
7126 while (*p != ' ' && *p != ';')
7128 if (*p == '\0')
7129 goto invalid_exclusions;
7130 ++p;
7133 if (*this_arg != '!')
7134 not_arg = 0;
7135 else
7137 not_arg = 1;
7138 ++this_arg;
7141 ok = used_arg (this_arg, p - this_arg);
7142 if (not_arg)
7143 ok = ! ok;
7145 if (*p == ' ')
7146 ++p;
7149 if (ok)
7150 return;
7152 ++p;
7155 first = 1;
7156 p = multilib_select;
7157 while (*p != '\0')
7159 /* Ignore newlines. */
7160 if (*p == '\n')
7162 ++p;
7163 continue;
7166 /* Get the initial path. */
7167 this_path = p;
7168 while (*p != ' ')
7170 if (*p == '\0')
7172 invalid_select:
7173 fatal ("multilib select '%s' is invalid",
7174 multilib_select);
7176 ++p;
7178 this_path_len = p - this_path;
7180 /* Check the arguments. */
7181 ok = 1;
7182 ndfltok = 1;
7183 ++p;
7184 while (*p != ';')
7186 if (*p == '\0')
7187 goto invalid_select;
7189 if (! ok)
7191 ++p;
7192 continue;
7195 this_arg = p;
7196 while (*p != ' ' && *p != ';')
7198 if (*p == '\0')
7199 goto invalid_select;
7200 ++p;
7203 if (*this_arg != '!')
7204 not_arg = 0;
7205 else
7207 not_arg = 1;
7208 ++this_arg;
7211 /* If this is a default argument, we can just ignore it.
7212 This is true even if this_arg begins with '!'. Beginning
7213 with '!' does not mean that this argument is necessarily
7214 inappropriate for this library: it merely means that
7215 there is a more specific library which uses this
7216 argument. If this argument is a default, we need not
7217 consider that more specific library. */
7218 ok = used_arg (this_arg, p - this_arg);
7219 if (not_arg)
7220 ok = ! ok;
7222 if (! ok)
7223 ndfltok = 0;
7225 if (default_arg (this_arg, p - this_arg))
7226 ok = 1;
7228 if (*p == ' ')
7229 ++p;
7232 if (ok && first)
7234 if (this_path_len != 1
7235 || this_path[0] != '.')
7237 char *new_multilib_dir = xmalloc (this_path_len + 1);
7238 char *q;
7240 strncpy (new_multilib_dir, this_path, this_path_len);
7241 new_multilib_dir[this_path_len] = '\0';
7242 q = strchr (new_multilib_dir, ':');
7243 if (q != NULL)
7244 *q = '\0';
7245 multilib_dir = new_multilib_dir;
7247 first = 0;
7250 if (ndfltok)
7252 const char *q = this_path, *end = this_path + this_path_len;
7254 while (q < end && *q != ':')
7255 q++;
7256 if (q < end)
7258 char *new_multilib_os_dir = xmalloc (end - q);
7259 memcpy (new_multilib_os_dir, q + 1, end - q - 1);
7260 new_multilib_os_dir[end - q - 1] = '\0';
7261 multilib_os_dir = new_multilib_os_dir;
7262 break;
7266 ++p;
7269 if (multilib_dir == NULL && multilib_os_dir != NULL
7270 && strcmp (multilib_os_dir, ".") == 0)
7272 free ((char *) multilib_os_dir);
7273 multilib_os_dir = NULL;
7275 else if (multilib_dir != NULL && multilib_os_dir == NULL)
7276 multilib_os_dir = multilib_dir;
7279 /* Print out the multiple library subdirectory selection
7280 information. This prints out a series of lines. Each line looks
7281 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
7282 required. Only the desired options are printed out, the negative
7283 matches. The options are print without a leading dash. There are
7284 no spaces to make it easy to use the information in the shell.
7285 Each subdirectory is printed only once. This assumes the ordering
7286 generated by the genmultilib script. Also, we leave out ones that match
7287 the exclusions. */
7289 static void
7290 print_multilib_info (void)
7292 const char *p = multilib_select;
7293 const char *last_path = 0, *this_path;
7294 int skip;
7295 unsigned int last_path_len = 0;
7297 while (*p != '\0')
7299 skip = 0;
7300 /* Ignore newlines. */
7301 if (*p == '\n')
7303 ++p;
7304 continue;
7307 /* Get the initial path. */
7308 this_path = p;
7309 while (*p != ' ')
7311 if (*p == '\0')
7313 invalid_select:
7314 fatal ("multilib select '%s' is invalid", multilib_select);
7317 ++p;
7320 /* When --disable-multilib was used but target defines
7321 MULTILIB_OSDIRNAMES, entries starting with .: are there just
7322 to find multilib_os_dir, so skip them from output. */
7323 if (this_path[0] == '.' && this_path[1] == ':')
7324 skip = 1;
7326 /* Check for matches with the multilib_exclusions. We don't bother
7327 with the '!' in either list. If any of the exclusion rules match
7328 all of its options with the select rule, we skip it. */
7330 const char *e = multilib_exclusions;
7331 const char *this_arg;
7333 while (*e != '\0')
7335 int m = 1;
7336 /* Ignore newlines. */
7337 if (*e == '\n')
7339 ++e;
7340 continue;
7343 /* Check the arguments. */
7344 while (*e != ';')
7346 const char *q;
7347 int mp = 0;
7349 if (*e == '\0')
7351 invalid_exclusion:
7352 fatal ("multilib exclusion '%s' is invalid",
7353 multilib_exclusions);
7356 if (! m)
7358 ++e;
7359 continue;
7362 this_arg = e;
7364 while (*e != ' ' && *e != ';')
7366 if (*e == '\0')
7367 goto invalid_exclusion;
7368 ++e;
7371 q = p + 1;
7372 while (*q != ';')
7374 const char *arg;
7375 int len = e - this_arg;
7377 if (*q == '\0')
7378 goto invalid_select;
7380 arg = q;
7382 while (*q != ' ' && *q != ';')
7384 if (*q == '\0')
7385 goto invalid_select;
7386 ++q;
7389 if (! strncmp (arg, this_arg,
7390 (len < q - arg) ? q - arg : len)
7391 || default_arg (this_arg, e - this_arg))
7393 mp = 1;
7394 break;
7397 if (*q == ' ')
7398 ++q;
7401 if (! mp)
7402 m = 0;
7404 if (*e == ' ')
7405 ++e;
7408 if (m)
7410 skip = 1;
7411 break;
7414 if (*e != '\0')
7415 ++e;
7419 if (! skip)
7421 /* If this is a duplicate, skip it. */
7422 skip = (last_path != 0
7423 && (unsigned int) (p - this_path) == last_path_len
7424 && ! strncmp (last_path, this_path, last_path_len));
7426 last_path = this_path;
7427 last_path_len = p - this_path;
7430 /* If this directory requires any default arguments, we can skip
7431 it. We will already have printed a directory identical to
7432 this one which does not require that default argument. */
7433 if (! skip)
7435 const char *q;
7437 q = p + 1;
7438 while (*q != ';')
7440 const char *arg;
7442 if (*q == '\0')
7443 goto invalid_select;
7445 if (*q == '!')
7446 arg = NULL;
7447 else
7448 arg = q;
7450 while (*q != ' ' && *q != ';')
7452 if (*q == '\0')
7453 goto invalid_select;
7454 ++q;
7457 if (arg != NULL
7458 && default_arg (arg, q - arg))
7460 skip = 1;
7461 break;
7464 if (*q == ' ')
7465 ++q;
7469 if (! skip)
7471 const char *p1;
7473 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
7474 putchar (*p1);
7475 putchar (';');
7478 ++p;
7479 while (*p != ';')
7481 int use_arg;
7483 if (*p == '\0')
7484 goto invalid_select;
7486 if (skip)
7488 ++p;
7489 continue;
7492 use_arg = *p != '!';
7494 if (use_arg)
7495 putchar ('@');
7497 while (*p != ' ' && *p != ';')
7499 if (*p == '\0')
7500 goto invalid_select;
7501 if (use_arg)
7502 putchar (*p);
7503 ++p;
7506 if (*p == ' ')
7507 ++p;
7510 if (! skip)
7512 /* If there are extra options, print them now. */
7513 if (multilib_extra && *multilib_extra)
7515 int print_at = TRUE;
7516 const char *q;
7518 for (q = multilib_extra; *q != '\0'; q++)
7520 if (*q == ' ')
7521 print_at = TRUE;
7522 else
7524 if (print_at)
7525 putchar ('@');
7526 putchar (*q);
7527 print_at = FALSE;
7532 putchar ('\n');
7535 ++p;
7539 /* if-exists built-in spec function.
7541 Checks to see if the file specified by the absolute pathname in
7542 ARGS exists. Returns that pathname if found.
7544 The usual use for this function is to check for a library file
7545 (whose name has been expanded with %s). */
7547 static const char *
7548 if_exists_spec_function (int argc, const char **argv)
7550 /* Must have only one argument. */
7551 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7552 return argv[0];
7554 return NULL;
7557 /* if-exists-else built-in spec function.
7559 This is like if-exists, but takes an additional argument which
7560 is returned if the first argument does not exist. */
7562 static const char *
7563 if_exists_else_spec_function (int argc, const char **argv)
7565 /* Must have exactly two arguments. */
7566 if (argc != 2)
7567 return NULL;
7569 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7570 return argv[0];
7572 return argv[1];
7575 /* replace-outfile built-in spec function.
7576 This looks for the first argument in the outfiles array's name and replaces it
7577 with the second argument. */
7579 static const char *
7580 replace_outfile_spec_function (int argc, const char **argv)
7582 int i;
7583 /* Must have exactly two arguments. */
7584 if (argc != 2)
7585 abort ();
7587 for (i = 0; i < n_infiles; i++)
7589 if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
7590 outfiles[i] = xstrdup (argv[1]);
7592 return NULL;