* call.c (z_candidate::template_decl): Rename from template.
[official-gcc.git] / gcc / gcc.c
blob74d043fea74061cf9e0e386eb05f4a2c7f6e98a1
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 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.
22 This paragraph is here to try to keep Sun CC from dying.
23 The number of chars here seems crucial!!!! */
25 /* This program is the user interface to the C compiler and possibly to
26 other compilers. It is used because compilation is a complicated procedure
27 which involves running several programs and passing temporary files between
28 them, forwarding the users switches to those programs selectively,
29 and deleting the temporary files at the end.
31 CC recognizes how to compile each input file by suffixes in the file names.
32 Once it knows which kind of compilation to perform, the procedure for
33 compilation is specified by a string called a "spec". */
35 /* A Short Introduction to Adding a Command-Line Option.
37 Before adding a command-line option, consider if it is really
38 necessary. Each additional command-line option adds complexity and
39 is difficult to remove in subsequent versions.
41 In the following, consider adding the command-line argument
42 `--bar'.
44 1. Each command-line option is specified in the specs file. The
45 notation is described below in the comment entitled "The Specs
46 Language". Read it.
48 2. In this file, add an entry to "option_map" equating the long
49 `--' argument version and any shorter, single letter version. Read
50 the comments in the declaration of "struct option_map" for an
51 explanation. Do not omit the first `-'.
53 3. Look in the "specs" file to determine which program or option
54 list should be given the argument, e.g., "cc1_options". Add the
55 appropriate syntax for the shorter option version to the
56 corresponding "const char *" entry in this file. Omit the first
57 `-' from the option. For example, use `-bar', rather than `--bar'.
59 4. If the argument takes an argument, e.g., `--baz argument1',
60 modify either DEFAULT_SWITCH_TAKES_ARG or
61 DEFAULT_WORD_SWITCH_TAKES_ARG in this file. Omit the first `-'
62 from `--baz'.
64 5. Document the option in this file's display_help(). If the
65 option is passed to a subprogram, modify its corresponding
66 function, e.g., cppinit.c:print_help() or toplev.c:display_help(),
67 instead.
69 6. Compile and test. Make sure that your new specs file is being
70 read. For example, use a debugger to investigate the value of
71 "specs_file" in main(). */
73 #include "config.h"
74 #include "system.h"
75 #include "coretypes.h"
76 #include "multilib.h" /* before tm.h */
77 #include "tm.h"
78 #include <signal.h>
79 #if ! defined( SIGCHLD ) && defined( SIGCLD )
80 # define SIGCHLD SIGCLD
81 #endif
82 #include "obstack.h"
83 #include "intl.h"
84 #include "prefix.h"
85 #include "gcc.h"
86 #include "flags.h"
88 #ifdef HAVE_SYS_RESOURCE_H
89 #include <sys/resource.h>
90 #endif
91 #if defined (HAVE_DECL_GETRUSAGE) && !HAVE_DECL_GETRUSAGE
92 extern int getrusage (int, struct rusage *);
93 #endif
95 /* By default there is no special suffix for target executables. */
96 /* FIXME: when autoconf is fixed, remove the host check - dj */
97 #if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
98 #define HAVE_TARGET_EXECUTABLE_SUFFIX
99 #endif
101 /* By default there is no special suffix for host executables. */
102 #ifdef HOST_EXECUTABLE_SUFFIX
103 #define HAVE_HOST_EXECUTABLE_SUFFIX
104 #else
105 #define HOST_EXECUTABLE_SUFFIX ""
106 #endif
108 /* By default, the suffix for target object files is ".o". */
109 #ifdef TARGET_OBJECT_SUFFIX
110 #define HAVE_TARGET_OBJECT_SUFFIX
111 #else
112 #define TARGET_OBJECT_SUFFIX ".o"
113 #endif
115 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
117 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
118 #ifndef LIBRARY_PATH_ENV
119 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
120 #endif
122 #ifndef HAVE_KILL
123 #define kill(p,s) raise(s)
124 #endif
126 /* If a stage of compilation returns an exit status >= 1,
127 compilation of that file ceases. */
129 #define MIN_FATAL_STATUS 1
131 /* Flag set by cppspec.c to 1. */
132 int is_cpp_driver;
134 /* Flag saying to pass the greatest exit code returned by a sub-process
135 to the calling program. */
136 static int pass_exit_codes;
138 /* Definition of string containing the arguments given to configure. */
139 #include "configargs.h"
141 /* Flag saying to print the directories gcc will search through looking for
142 programs, libraries, etc. */
144 static int print_search_dirs;
146 /* Flag saying to print the full filename of this file
147 as found through our usual search mechanism. */
149 static const char *print_file_name = NULL;
151 /* As print_file_name, but search for executable file. */
153 static const char *print_prog_name = NULL;
155 /* Flag saying to print the relative path we'd use to
156 find libgcc.a given the current compiler flags. */
158 static int print_multi_directory;
160 /* Flag saying to print the relative path we'd use to
161 find OS libraries given the current compiler flags. */
163 static int print_multi_os_directory;
165 /* Flag saying to print the list of subdirectories and
166 compiler flags used to select them in a standard form. */
168 static int print_multi_lib;
170 /* Flag saying to print the command line options understood by gcc and its
171 sub-processes. */
173 static int print_help_list;
175 /* Flag indicating whether we should print the command and arguments */
177 static int verbose_flag;
179 /* Flag indicating whether we should ONLY print the command and
180 arguments (like verbose_flag) without executing the command.
181 Displayed arguments are quoted so that the generated command
182 line is suitable for execution. This is intended for use in
183 shell scripts to capture the driver-generated command line. */
184 static int verbose_only_flag;
186 /* Flag indicating to print target specific command line options. */
188 static int target_help_flag;
190 /* Flag indicating whether we should report subprocess execution times
191 (if this is supported by the system - see pexecute.c). */
193 static int report_times;
195 /* Nonzero means place this string before uses of /, so that include
196 and library files can be found in an alternate location. */
198 #ifdef TARGET_SYSTEM_ROOT
199 static const char *target_system_root = TARGET_SYSTEM_ROOT;
200 #else
201 static const char *target_system_root = 0;
202 #endif
204 /* Nonzero means pass the updated target_system_root to the compiler. */
206 static int target_system_root_changed;
208 /* Nonzero means append this string to target_system_root. */
210 static const char *target_sysroot_suffix = 0;
212 /* Nonzero means append this string to target_system_root for headers. */
214 static const char *target_sysroot_hdrs_suffix = 0;
216 /* Nonzero means write "temp" files in source directory
217 and use the source file's name in them, and don't delete them. */
219 static int save_temps_flag;
221 /* Nonzero means pass multiple source files to the compiler at one time. */
223 static int combine_flag = 0;
225 /* Nonzero means use pipes to communicate between subprocesses.
226 Overridden by either of the above two flags. */
228 static int use_pipes;
230 /* The compiler version. */
232 static const char *compiler_version;
234 /* The target version specified with -V */
236 static const char *const spec_version = DEFAULT_TARGET_VERSION;
238 /* The target machine specified with -b. */
240 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
242 /* Nonzero if cross-compiling.
243 When -b is used, the value comes from the `specs' file. */
245 #ifdef CROSS_COMPILE
246 static const char *cross_compile = "1";
247 #else
248 static const char *cross_compile = "0";
249 #endif
251 #ifdef MODIFY_TARGET_NAME
253 /* Information on how to alter the target name based on a command-line
254 switch. The only case we support now is simply appending or deleting a
255 string to or from the end of the first part of the configuration name. */
257 static const struct modify_target
259 const char *const sw;
260 const enum add_del {ADD, DELETE} add_del;
261 const char *const str;
263 modify_target[] = MODIFY_TARGET_NAME;
264 #endif
266 /* The number of errors that have occurred; the link phase will not be
267 run if this is nonzero. */
268 static int error_count = 0;
270 /* Greatest exit code of sub-processes that has been encountered up to
271 now. */
272 static int greatest_status = 1;
274 /* This is the obstack which we use to allocate many strings. */
276 static struct obstack obstack;
278 /* This is the obstack to build an environment variable to pass to
279 collect2 that describes all of the relevant switches of what to
280 pass the compiler in building the list of pointers to constructors
281 and destructors. */
283 static struct obstack collect_obstack;
285 /* These structs are used to collect resource usage information for
286 subprocesses. */
287 #ifdef HAVE_GETRUSAGE
288 static struct rusage rus, prus;
289 #endif
291 /* Forward declaration for prototypes. */
292 struct path_prefix;
293 struct prefix_list;
295 static void init_spec (void);
296 static void store_arg (const char *, int, int);
297 static char *load_specs (const char *);
298 static void read_specs (const char *, int);
299 static void set_spec (const char *, const char *);
300 static struct compiler *lookup_compiler (const char *, size_t, const char *);
301 static char *build_search_list (struct path_prefix *, const char *, int);
302 static void putenv_from_prefixes (struct path_prefix *, const char *);
303 static int access_check (const char *, int);
304 static char *find_a_file (struct path_prefix *, const char *, int, int);
305 static void add_prefix (struct path_prefix *, const char *, const char *,
306 int, int, int *, int);
307 static void add_sysrooted_prefix (struct path_prefix *, const char *,
308 const char *, int, int, int *, int);
309 static void translate_options (int *, const char *const **);
310 static char *skip_whitespace (char *);
311 static void delete_if_ordinary (const char *);
312 static void delete_temp_files (void);
313 static void delete_failure_queue (void);
314 static void clear_failure_queue (void);
315 static int check_live_switch (int, int);
316 static const char *handle_braces (const char *);
317 static inline bool input_suffix_matches (const char *, const char *);
318 static inline bool switch_matches (const char *, const char *, int);
319 static inline void mark_matching_switches (const char *, const char *, int);
320 static inline void process_marked_switches (void);
321 static const char *process_brace_body (const char *, const char *, const char *, int, int);
322 static const struct spec_function *lookup_spec_function (const char *);
323 static const char *eval_spec_function (const char *, const char *);
324 static const char *handle_spec_function (const char *);
325 static char *save_string (const char *, int);
326 static void set_collect_gcc_options (void);
327 static void do_spec_path (struct prefix_list *, const char *, int, int, int, const char *, const char *);
328 static int do_spec_1 (const char *, int, const char *);
329 static int do_spec_2 (const char *);
330 static void do_option_spec (const char *, const char *);
331 static void do_self_spec (const char *);
332 static const char *find_file (const char *);
333 static int is_directory (const char *, const char *, int);
334 static const char *validate_switches (const char *);
335 static void validate_all_switches (void);
336 static inline void validate_switches_from_spec (const char *);
337 static void give_switch (int, int);
338 static int used_arg (const char *, int);
339 static int default_arg (const char *, int);
340 static void set_multilib_dir (void);
341 static void print_multilib_info (void);
342 static void perror_with_name (const char *);
343 static void pfatal_pexecute (const char *, const char *) ATTRIBUTE_NORETURN;
344 static void notice (const char *, ...) ATTRIBUTE_PRINTF_1;
345 static void display_help (void);
346 static void add_preprocessor_option (const char *, int);
347 static void add_assembler_option (const char *, int);
348 static void add_linker_option (const char *, int);
349 static void process_command (int, const char **);
350 static int execute (void);
351 static void alloc_args (void);
352 static void clear_args (void);
353 static void fatal_error (int);
354 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
355 static void init_gcc_specs (struct obstack *, const char *, const char *,
356 const char *);
357 #endif
358 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
359 static const char *convert_filename (const char *, int, int);
360 #endif
362 static const char *if_exists_spec_function (int, const char **);
363 static const char *if_exists_else_spec_function (int, const char **);
365 /* The Specs Language
367 Specs are strings containing lines, each of which (if not blank)
368 is made up of a program name, and arguments separated by spaces.
369 The program name must be exact and start from root, since no path
370 is searched and it is unreliable to depend on the current working directory.
371 Redirection of input or output is not supported; the subprograms must
372 accept filenames saying what files to read and write.
374 In addition, the specs can contain %-sequences to substitute variable text
375 or for conditional text. Here is a table of all defined %-sequences.
376 Note that spaces are not generated automatically around the results of
377 expanding these sequences; therefore, you can concatenate them together
378 or with constant text in a single argument.
380 %% substitute one % into the program name or argument.
381 %i substitute the name of the input file being processed.
382 %b substitute the basename of the input file being processed.
383 This is the substring up to (and not including) the last period
384 and not including the directory.
385 %B same as %b, but include the file suffix (text after the last period).
386 %gSUFFIX
387 substitute a file name that has suffix SUFFIX and is chosen
388 once per compilation, and mark the argument a la %d. To reduce
389 exposure to denial-of-service attacks, the file name is now
390 chosen in a way that is hard to predict even when previously
391 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
392 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
393 the regexp "[.A-Za-z]*%O"; "%O" is treated exactly as if it
394 had been pre-processed. Previously, %g was simply substituted
395 with a file name chosen once per compilation, without regard
396 to any appended suffix (which was therefore treated just like
397 ordinary text), making such attacks more likely to succeed.
398 %|SUFFIX
399 like %g, but if -pipe is in effect, expands simply to "-".
400 %mSUFFIX
401 like %g, but if -pipe is in effect, expands to nothing. (We have both
402 %| and %m to accommodate differences between system assemblers; see
403 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
404 %uSUFFIX
405 like %g, but generates a new temporary file name even if %uSUFFIX
406 was already seen.
407 %USUFFIX
408 substitutes the last file name generated with %uSUFFIX, generating a
409 new one if there is no such last file name. In the absence of any
410 %uSUFFIX, this is just like %gSUFFIX, except they don't share
411 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
412 would involve the generation of two distinct file names, one
413 for each `%g.s' and another for each `%U.s'. Previously, %U was
414 simply substituted with a file name chosen for the previous %u,
415 without regard to any appended suffix.
416 %jSUFFIX
417 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
418 writable, and if save-temps is off; otherwise, substitute the name
419 of a temporary file, just like %u. This temporary file is not
420 meant for communication between processes, but rather as a junk
421 disposal mechanism.
422 %.SUFFIX
423 substitutes .SUFFIX for the suffixes of a matched switch's args when
424 it is subsequently output with %*. SUFFIX is terminated by the next
425 space or %.
426 %d marks the argument containing or following the %d as a
427 temporary file name, so that that file will be deleted if CC exits
428 successfully. Unlike %g, this contributes no text to the argument.
429 %w marks the argument containing or following the %w as the
430 "output file" of this compilation. This puts the argument
431 into the sequence of arguments that %o will substitute later.
432 %V indicates that this compilation produces no "output file".
433 %W{...}
434 like %{...} but mark last argument supplied within
435 as a file to be deleted on failure.
436 %o substitutes the names of all the output files, with spaces
437 automatically placed around them. You should write spaces
438 around the %o as well or the results are undefined.
439 %o is for use in the specs for running the linker.
440 Input files whose names have no recognized suffix are not compiled
441 at all, but they are included among the output files, so they will
442 be linked.
443 %O substitutes the suffix for object files. Note that this is
444 handled specially when it immediately follows %g, %u, or %U
445 (with or without a suffix argument) because of the need for
446 those to form complete file names. The handling is such that
447 %O is treated exactly as if it had already been substituted,
448 except that %g, %u, and %U do not currently support additional
449 SUFFIX characters following %O as they would following, for
450 example, `.o'.
451 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
452 (made from TARGET_SYSTEM_ROOT), and -isystem (made from COMPILER_PATH
453 and -B options) as necessary.
454 %s current argument is the name of a library or startup file of some sort.
455 Search for that file in a standard list of directories
456 and substitute the full name found.
457 %eSTR Print STR as an error message. STR is terminated by a newline.
458 Use this when inconsistent options are detected.
459 %nSTR Print STR as a notice. STR is terminated by a newline.
460 %x{OPTION} Accumulate an option for %X.
461 %X Output the accumulated linker options specified by compilations.
462 %Y Output the accumulated assembler options specified by compilations.
463 %Z Output the accumulated preprocessor options specified by compilations.
464 %a process ASM_SPEC as a spec.
465 This allows config.h to specify part of the spec for running as.
466 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
467 used here. This can be used to run a post-processor after the
468 assembler has done its job.
469 %D Dump out a -L option for each directory in startfile_prefixes.
470 If multilib_dir is set, extra entries are generated with it affixed.
471 %l process LINK_SPEC as a spec.
472 %L process LIB_SPEC as a spec.
473 %G process LIBGCC_SPEC as a spec.
474 %M output multilib_dir with directory separators replaced with "_";
475 if multilib_dir is not set or is ".", output "".
476 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
477 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
478 %C process CPP_SPEC as a spec.
479 %1 process CC1_SPEC as a spec.
480 %2 process CC1PLUS_SPEC as a spec.
481 %* substitute the variable part of a matched option. (See below.)
482 Note that each comma in the substituted string is replaced by
483 a single space.
484 %<S remove all occurrences of -S from the command line.
485 Note - this command is position dependent. % commands in the
486 spec string before this one will see -S, % commands in the
487 spec string after this one will not.
488 %<S* remove all occurrences of all switches beginning with -S from the
489 command line.
490 %:function(args)
491 Call the named function FUNCTION, passing it ARGS. ARGS is
492 first processed as a nested spec string, then split into an
493 argument vector in the usual fashion. The function returns
494 a string which is processed as if it had appeared literally
495 as part of the current spec.
496 %{S} substitutes the -S switch, if that switch was given to CC.
497 If that switch was not specified, this substitutes nothing.
498 Here S is a metasyntactic variable.
499 %{S*} substitutes all the switches specified to CC whose names start
500 with -S. This is used for -o, -I, etc; switches that take
501 arguments. CC considers `-o foo' as being one switch whose
502 name starts with `o'. %{o*} would substitute this text,
503 including the space; thus, two arguments would be generated.
504 %{S*&T*} likewise, but preserve order of S and T options (the order
505 of S and T in the spec is not significant). Can be any number
506 of ampersand-separated variables; for each the wild card is
507 optional. Useful for CPP as %{D*&U*&A*}.
509 %{S:X} substitutes X, if the -S switch was given to CC.
510 %{!S:X} substitutes X, if the -S switch was NOT given to CC.
511 %{S*:X} substitutes X if one or more switches whose names start
512 with -S was given to CC. Normally X is substituted only
513 once, no matter how many such switches appeared. However,
514 if %* appears somewhere in X, then X will be substituted
515 once for each matching switch, with the %* replaced by the
516 part of that switch that matched the '*'.
517 %{.S:X} substitutes X, if processing a file with suffix S.
518 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
520 %{S|T:X} substitutes X if either -S or -T was given to CC. This may be
521 combined with !, ., and * as above binding stronger than the OR.
522 If %* appears in X, all of the alternatives must be starred, and
523 only the first matching alternative is substituted.
524 %{S:X; if S was given to CC, substitutes X;
525 T:Y; else if T was given to CC, substitutes Y;
526 :D} else substitutes D. There can be as many clauses as you need.
527 This may be combined with ., !, |, and * as above.
529 %(Spec) processes a specification defined in a specs file as *Spec:
530 %[Spec] as above, but put __ around -D arguments
532 The conditional text X in a %{S:X} or similar construct may contain
533 other nested % constructs or spaces, or even newlines. They are
534 processed as usual, as described above. Trailing white space in X is
535 ignored. White space may also appear anywhere on the left side of the
536 colon in these constructs, except between . or * and the corresponding
537 word.
539 The -O, -f, -m, and -W switches are handled specifically in these
540 constructs. If another value of -O or the negated form of a -f, -m, or
541 -W switch is found later in the command line, the earlier switch
542 value is ignored, except with {S*} where S is just one letter; this
543 passes all matching options.
545 The character | at the beginning of the predicate text is used to indicate
546 that a command should be piped to the following command, but only if -pipe
547 is specified.
549 Note that it is built into CC which switches take arguments and which
550 do not. You might think it would be useful to generalize this to
551 allow each compiler's spec to say which switches take arguments. But
552 this cannot be done in a consistent fashion. CC cannot even decide
553 which input files have been specified without knowing which switches
554 take arguments, and it must know which input files to compile in order
555 to tell which compilers to run.
557 CC also knows implicitly that arguments starting in `-l' are to be
558 treated as compiler output files, and passed to the linker in their
559 proper position among the other output files. */
561 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
563 /* config.h can define ASM_SPEC to provide extra args to the assembler
564 or extra switch-translations. */
565 #ifndef ASM_SPEC
566 #define ASM_SPEC ""
567 #endif
569 /* config.h can define ASM_FINAL_SPEC to run a post processor after
570 the assembler has run. */
571 #ifndef ASM_FINAL_SPEC
572 #define ASM_FINAL_SPEC ""
573 #endif
575 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
576 or extra switch-translations. */
577 #ifndef CPP_SPEC
578 #define CPP_SPEC ""
579 #endif
581 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
582 or extra switch-translations. */
583 #ifndef CC1_SPEC
584 #define CC1_SPEC ""
585 #endif
587 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
588 or extra switch-translations. */
589 #ifndef CC1PLUS_SPEC
590 #define CC1PLUS_SPEC ""
591 #endif
593 /* config.h can define LINK_SPEC to provide extra args to the linker
594 or extra switch-translations. */
595 #ifndef LINK_SPEC
596 #define LINK_SPEC ""
597 #endif
599 /* config.h can define LIB_SPEC to override the default libraries. */
600 #ifndef LIB_SPEC
601 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
602 #endif
604 /* mudflap specs */
605 #ifndef MFWRAP_SPEC
606 /* XXX: valid only for GNU ld */
607 /* XXX: should exactly match hooks provided by libmudflap.a */
608 #define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
609 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
610 --wrap=mmap --wrap=munmap --wrap=alloca\
611 } %{fmudflapth: --wrap=pthread_create --wrap=pthread_join --wrap=pthread_exit\
612 }} %{fmudflap|fmudflapth: --wrap=main}"
613 #endif
614 #ifndef MFLIB_SPEC
615 #define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
616 #endif
618 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
619 included. */
620 #ifndef LIBGCC_SPEC
621 #if defined(REAL_LIBGCC_SPEC)
622 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
623 #elif defined(LINK_LIBGCC_SPECIAL) || defined(LINK_LIBGCC_SPECIAL_1)
624 /* Have gcc do the search for libgcc.a. */
625 #define LIBGCC_SPEC "libgcc.a%s"
626 #else
627 #define LIBGCC_SPEC "-lgcc"
628 #endif
629 #endif
631 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
632 #ifndef STARTFILE_SPEC
633 #define STARTFILE_SPEC \
634 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
635 #endif
637 /* config.h can define SWITCHES_NEED_SPACES to control which options
638 require spaces between the option and the argument. */
639 #ifndef SWITCHES_NEED_SPACES
640 #define SWITCHES_NEED_SPACES ""
641 #endif
643 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
644 #ifndef ENDFILE_SPEC
645 #define ENDFILE_SPEC ""
646 #endif
648 #ifndef LINKER_NAME
649 #define LINKER_NAME "collect2"
650 #endif
652 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
653 to the assembler. */
654 #ifndef ASM_DEBUG_SPEC
655 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
656 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
657 # define ASM_DEBUG_SPEC \
658 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
659 ? "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}" \
660 : "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}")
661 # else
662 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
663 # define ASM_DEBUG_SPEC "%{g*:--gstabs}"
664 # endif
665 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
666 # define ASM_DEBUG_SPEC "%{g*:--gdwarf2}"
667 # endif
668 # endif
669 #endif
670 #ifndef ASM_DEBUG_SPEC
671 # define ASM_DEBUG_SPEC ""
672 #endif
674 /* Here is the spec for running the linker, after compiling all files. */
676 /* This is overridable by the target in case they need to specify the
677 -lgcc and -lc order specially, yet not require them to override all
678 of LINK_COMMAND_SPEC. */
679 #ifndef LINK_GCC_C_SEQUENCE_SPEC
680 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
681 #endif
683 #ifndef LINK_PIE_SPEC
684 #ifdef HAVE_LD_PIE
685 #define LINK_PIE_SPEC "%{pie:-pie} "
686 #else
687 #define LINK_PIE_SPEC "%{pie:} "
688 #endif
689 #endif
691 /* -u* was put back because both BSD and SysV seem to support it. */
692 /* %{static:} simply prevents an error message if the target machine
693 doesn't handle -static. */
694 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
695 scripts which exist in user specified directories, or in standard
696 directories. */
697 #ifndef LINK_COMMAND_SPEC
698 #define LINK_COMMAND_SPEC "\
699 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
700 %(linker) %l " LINK_PIE_SPEC "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
701 %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
702 %{static:} %{L*} %(mfwrap) %(link_libgcc) %o %(mflib)\
703 %{fprofile-arcs|fprofile-generate:-lgcov}\
704 %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}}\
705 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
706 #endif
708 #ifndef LINK_LIBGCC_SPEC
709 # ifdef LINK_LIBGCC_SPECIAL
710 /* Don't generate -L options for startfile prefix list. */
711 # define LINK_LIBGCC_SPEC ""
712 # else
713 /* Do generate them. */
714 # define LINK_LIBGCC_SPEC "%D"
715 # endif
716 #endif
718 #ifndef STARTFILE_PREFIX_SPEC
719 # define STARTFILE_PREFIX_SPEC ""
720 #endif
722 #ifndef SYSROOT_SUFFIX_SPEC
723 # define SYSROOT_SUFFIX_SPEC ""
724 #endif
726 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
727 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
728 #endif
730 static const char *asm_debug;
731 static const char *cpp_spec = CPP_SPEC;
732 static const char *cc1_spec = CC1_SPEC;
733 static const char *cc1plus_spec = CC1PLUS_SPEC;
734 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
735 static const char *asm_spec = ASM_SPEC;
736 static const char *asm_final_spec = ASM_FINAL_SPEC;
737 static const char *link_spec = LINK_SPEC;
738 static const char *lib_spec = LIB_SPEC;
739 static const char *mfwrap_spec = MFWRAP_SPEC;
740 static const char *mflib_spec = MFLIB_SPEC;
741 static const char *libgcc_spec = LIBGCC_SPEC;
742 static const char *endfile_spec = ENDFILE_SPEC;
743 static const char *startfile_spec = STARTFILE_SPEC;
744 static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
745 static const char *linker_name_spec = LINKER_NAME;
746 static const char *link_command_spec = LINK_COMMAND_SPEC;
747 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
748 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
749 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
750 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
752 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
753 There should be no need to override these in target dependent files,
754 but we need to copy them to the specs file so that newer versions
755 of the GCC driver can correctly drive older tool chains with the
756 appropriate -B options. */
758 /* When cpplib handles traditional preprocessing, get rid of this, and
759 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
760 that we default the front end language better. */
761 static const char *trad_capable_cpp =
762 "cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
764 /* We don't wrap .d files in %W{} since a missing .d file, and
765 therefore no dependency entry, confuses make into thinking a .o
766 file that happens to exist is up-to-date. */
767 static const char *cpp_unique_options =
768 "%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}}\
769 %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
770 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
771 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
772 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
773 %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}}\
774 %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i\
775 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
776 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
777 %{E|M|MM:%W{o*}}";
779 /* This contains cpp options which are common with cc1_options and are passed
780 only when preprocessing only to avoid duplication. We pass the cc1 spec
781 options to the preprocessor so that it the cc1 spec may manipulate
782 options used to set target flags. Those special target flags settings may
783 in turn cause preprocessor symbols to be defined specially. */
784 static const char *cpp_options =
785 "%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*}\
786 %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*} %{undef}\
787 %{save-temps:-fpch-preprocess}";
789 /* This contains cpp options which are not passed when the preprocessor
790 output will be used by another program. */
791 static const char *cpp_debug_options = "%{d*}";
793 /* NB: This is shared amongst all front-ends. */
794 static const char *cc1_options =
795 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
796 %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*}\
797 %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}}\
798 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi}\
799 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
800 %{Qn:-fno-ident} %{--help:--help}\
801 %{--target-help:--target-help}\
802 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
803 %{fsyntax-only:-o %j} %{-param*}\
804 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}";
806 static const char *asm_options =
807 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
809 static const char *invoke_as =
810 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
811 "%{!S:-o %|.s |\n as %(asm_options) %|.s %A }";
812 #else
813 "%{!S:-o %|.s |\n as %(asm_options) %m.s %A }";
814 #endif
816 /* Some compilers have limits on line lengths, and the multilib_select
817 and/or multilib_matches strings can be very long, so we build them at
818 run time. */
819 static struct obstack multilib_obstack;
820 static const char *multilib_select;
821 static const char *multilib_matches;
822 static const char *multilib_defaults;
823 static const char *multilib_exclusions;
825 /* Check whether a particular argument is a default argument. */
827 #ifndef MULTILIB_DEFAULTS
828 #define MULTILIB_DEFAULTS { "" }
829 #endif
831 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
833 #ifndef DRIVER_SELF_SPECS
834 #define DRIVER_SELF_SPECS ""
835 #endif
837 static const char *const driver_self_specs[] = { DRIVER_SELF_SPECS };
839 #ifndef OPTION_DEFAULT_SPECS
840 #define OPTION_DEFAULT_SPECS { "", "" }
841 #endif
843 struct default_spec
845 const char *name;
846 const char *spec;
849 static const struct default_spec
850 option_default_specs[] = { OPTION_DEFAULT_SPECS };
852 struct user_specs
854 struct user_specs *next;
855 const char *filename;
858 static struct user_specs *user_specs_head, *user_specs_tail;
860 #ifndef SWITCH_TAKES_ARG
861 #define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
862 #endif
864 #ifndef WORD_SWITCH_TAKES_ARG
865 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
866 #endif
868 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
869 /* This defines which switches stop a full compilation. */
870 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
871 ((CHAR) == 'c' || (CHAR) == 'S')
873 #ifndef SWITCH_CURTAILS_COMPILATION
874 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
875 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
876 #endif
877 #endif
879 /* Record the mapping from file suffixes for compilation specs. */
881 struct compiler
883 const char *suffix; /* Use this compiler for input files
884 whose names end in this suffix. */
886 const char *spec; /* To use this compiler, run this spec. */
888 const char *cpp_spec; /* If non-NULL, substitute this spec
889 for `%C', rather than the usual
890 cpp_spec. */
891 const int combinable; /* If nonzero, compiler can deal with
892 multiple source files at once (IMA). */
893 const int needs_preprocessing; /* If nonzero, source files need to
894 be run through a preprocessor. */
897 /* Pointer to a vector of `struct compiler' that gives the spec for
898 compiling a file, based on its suffix.
899 A file that does not end in any of these suffixes will be passed
900 unchanged to the loader and nothing else will be done to it.
902 An entry containing two 0s is used to terminate the vector.
904 If multiple entries match a file, the last matching one is used. */
906 static struct compiler *compilers;
908 /* Number of entries in `compilers', not counting the null terminator. */
910 static int n_compilers;
912 /* The default list of file name suffixes and their compilation specs. */
914 static const struct compiler default_compilers[] =
916 /* Add lists of suffixes of known languages here. If those languages
917 were not present when we built the driver, we will hit these copies
918 and be given a more meaningful error than "file not used since
919 linking is not done". */
920 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#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 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 {"--entry", "-e", 0},
1065 {"--extra-warnings", "-W", 0},
1066 {"--for-assembler", "-Wa", "a"},
1067 {"--for-linker", "-Xlinker", "a"},
1068 {"--force-link", "-u", "a"},
1069 {"--imacros", "-imacros", "a"},
1070 {"--include", "-include", "a"},
1071 {"--include-barrier", "-I-", 0},
1072 {"--include-directory", "-I", "aj"},
1073 {"--include-directory-after", "-idirafter", "a"},
1074 {"--include-prefix", "-iprefix", "a"},
1075 {"--include-with-prefix", "-iwithprefix", "a"},
1076 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
1077 {"--include-with-prefix-after", "-iwithprefix", "a"},
1078 {"--language", "-x", "a"},
1079 {"--library-directory", "-L", "a"},
1080 {"--machine", "-m", "aj"},
1081 {"--machine-", "-m", "*j"},
1082 {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1083 {"--no-line-commands", "-P", 0},
1084 {"--no-precompiled-includes", "-noprecomp", 0},
1085 {"--no-standard-includes", "-nostdinc", 0},
1086 {"--no-standard-libraries", "-nostdlib", 0},
1087 {"--no-warnings", "-w", 0},
1088 {"--optimize", "-O", "oj"},
1089 {"--output", "-o", "a"},
1090 {"--output-class-directory", "-foutput-class-dir=", "ja"},
1091 {"--param", "--param", "a"},
1092 {"--pedantic", "-pedantic", 0},
1093 {"--pedantic-errors", "-pedantic-errors", 0},
1094 {"--pie", "-pie", 0},
1095 {"--pipe", "-pipe", 0},
1096 {"--prefix", "-B", "a"},
1097 {"--preprocess", "-E", 0},
1098 {"--print-search-dirs", "-print-search-dirs", 0},
1099 {"--print-file-name", "-print-file-name=", "aj"},
1100 {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
1101 {"--print-missing-file-dependencies", "-MG", 0},
1102 {"--print-multi-lib", "-print-multi-lib", 0},
1103 {"--print-multi-directory", "-print-multi-directory", 0},
1104 {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1105 {"--print-prog-name", "-print-prog-name=", "aj"},
1106 {"--profile", "-p", 0},
1107 {"--profile-blocks", "-a", 0},
1108 {"--quiet", "-q", 0},
1109 {"--resource", "-fcompile-resource=", "aj"},
1110 {"--save-temps", "-save-temps", 0},
1111 {"--shared", "-shared", 0},
1112 {"--silent", "-q", 0},
1113 {"--specs", "-specs=", "aj"},
1114 {"--static", "-static", 0},
1115 {"--std", "-std=", "aj"},
1116 {"--symbolic", "-symbolic", 0},
1117 {"--time", "-time", 0},
1118 {"--trace-includes", "-H", 0},
1119 {"--traditional", "-traditional", 0},
1120 {"--traditional-cpp", "-traditional-cpp", 0},
1121 {"--trigraphs", "-trigraphs", 0},
1122 {"--undefine-macro", "-U", "aj"},
1123 {"--user-dependencies", "-MM", 0},
1124 {"--verbose", "-v", 0},
1125 {"--warn-", "-W", "*j"},
1126 {"--write-dependencies", "-MD", 0},
1127 {"--write-user-dependencies", "-MMD", 0},
1128 {"--", "-f", "*j"}
1132 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1133 static const struct {
1134 const char *const option_found;
1135 const char *const replacements;
1136 } target_option_translations[] =
1138 TARGET_OPTION_TRANSLATE_TABLE,
1139 { 0, 0 }
1141 #endif
1143 /* Translate the options described by *ARGCP and *ARGVP.
1144 Make a new vector and store it back in *ARGVP,
1145 and store its length in *ARGVC. */
1147 static void
1148 translate_options (int *argcp, const char *const **argvp)
1150 int i;
1151 int argc = *argcp;
1152 const char *const *argv = *argvp;
1153 int newvsize = (argc + 2) * 2 * sizeof (const char *);
1154 const char **newv = xmalloc (newvsize);
1155 int newindex = 0;
1157 i = 0;
1158 newv[newindex++] = argv[i++];
1160 while (i < argc)
1162 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1163 int tott_idx;
1165 for (tott_idx = 0;
1166 target_option_translations[tott_idx].option_found;
1167 tott_idx++)
1169 if (strcmp (target_option_translations[tott_idx].option_found,
1170 argv[i]) == 0)
1172 int spaces = 1;
1173 const char *sp;
1174 char *np;
1176 for (sp = target_option_translations[tott_idx].replacements;
1177 *sp; sp++)
1179 if (*sp == ' ')
1180 spaces ++;
1183 newvsize += spaces * sizeof (const char *);
1184 newv = xrealloc (newv, newvsize);
1186 sp = target_option_translations[tott_idx].replacements;
1187 np = xstrdup (sp);
1189 while (1)
1191 while (*np == ' ')
1192 np++;
1193 if (*np == 0)
1194 break;
1195 newv[newindex++] = np;
1196 while (*np != ' ' && *np)
1197 np++;
1198 if (*np == 0)
1199 break;
1200 *np++ = 0;
1203 i ++;
1204 break;
1207 if (target_option_translations[tott_idx].option_found)
1208 continue;
1209 #endif
1211 /* Translate -- options. */
1212 if (argv[i][0] == '-' && argv[i][1] == '-')
1214 size_t j;
1215 /* Find a mapping that applies to this option. */
1216 for (j = 0; j < ARRAY_SIZE (option_map); j++)
1218 size_t optlen = strlen (option_map[j].name);
1219 size_t arglen = strlen (argv[i]);
1220 size_t complen = arglen > optlen ? optlen : arglen;
1221 const char *arginfo = option_map[j].arg_info;
1223 if (arginfo == 0)
1224 arginfo = "";
1226 if (!strncmp (argv[i], option_map[j].name, complen))
1228 const char *arg = 0;
1230 if (arglen < optlen)
1232 size_t k;
1233 for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1234 if (strlen (option_map[k].name) >= arglen
1235 && !strncmp (argv[i], option_map[k].name, arglen))
1237 error ("ambiguous abbreviation %s", argv[i]);
1238 break;
1241 if (k != ARRAY_SIZE (option_map))
1242 break;
1245 if (arglen > optlen)
1247 /* If the option has an argument, accept that. */
1248 if (argv[i][optlen] == '=')
1249 arg = argv[i] + optlen + 1;
1251 /* If this mapping requires extra text at end of name,
1252 accept that as "argument". */
1253 else if (strchr (arginfo, '*') != 0)
1254 arg = argv[i] + optlen;
1256 /* Otherwise, extra text at end means mismatch.
1257 Try other mappings. */
1258 else
1259 continue;
1262 else if (strchr (arginfo, '*') != 0)
1264 error ("incomplete `%s' option", option_map[j].name);
1265 break;
1268 /* Handle arguments. */
1269 if (strchr (arginfo, 'a') != 0)
1271 if (arg == 0)
1273 if (i + 1 == argc)
1275 error ("missing argument to `%s' option",
1276 option_map[j].name);
1277 break;
1280 arg = argv[++i];
1283 else if (strchr (arginfo, '*') != 0)
1285 else if (strchr (arginfo, 'o') == 0)
1287 if (arg != 0)
1288 error ("extraneous argument to `%s' option",
1289 option_map[j].name);
1290 arg = 0;
1293 /* Store the translation as one argv elt or as two. */
1294 if (arg != 0 && strchr (arginfo, 'j') != 0)
1295 newv[newindex++] = concat (option_map[j].equivalent, arg,
1296 NULL);
1297 else if (arg != 0)
1299 newv[newindex++] = option_map[j].equivalent;
1300 newv[newindex++] = arg;
1302 else
1303 newv[newindex++] = option_map[j].equivalent;
1305 break;
1308 i++;
1311 /* Handle old-fashioned options--just copy them through,
1312 with their arguments. */
1313 else if (argv[i][0] == '-')
1315 const char *p = argv[i] + 1;
1316 int c = *p;
1317 int nskip = 1;
1319 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1320 nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1321 else if (WORD_SWITCH_TAKES_ARG (p))
1322 nskip += WORD_SWITCH_TAKES_ARG (p);
1323 else if ((c == 'B' || c == 'b' || c == 'x')
1324 && p[1] == 0)
1325 nskip += 1;
1326 else if (! strcmp (p, "Xlinker"))
1327 nskip += 1;
1328 else if (! strcmp (p, "Xpreprocessor"))
1329 nskip += 1;
1330 else if (! strcmp (p, "Xassembler"))
1331 nskip += 1;
1333 /* Watch out for an option at the end of the command line that
1334 is missing arguments, and avoid skipping past the end of the
1335 command line. */
1336 if (nskip + i > argc)
1337 nskip = argc - i;
1339 while (nskip > 0)
1341 newv[newindex++] = argv[i++];
1342 nskip--;
1345 else
1346 /* Ordinary operands, or +e options. */
1347 newv[newindex++] = argv[i++];
1350 newv[newindex] = 0;
1352 *argvp = newv;
1353 *argcp = newindex;
1356 static char *
1357 skip_whitespace (char *p)
1359 while (1)
1361 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1362 be considered whitespace. */
1363 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1364 return p + 1;
1365 else if (*p == '\n' || *p == ' ' || *p == '\t')
1366 p++;
1367 else if (*p == '#')
1369 while (*p != '\n')
1370 p++;
1371 p++;
1373 else
1374 break;
1377 return p;
1379 /* Structures to keep track of prefixes to try when looking for files. */
1381 struct prefix_list
1383 const char *prefix; /* String to prepend to the path. */
1384 struct prefix_list *next; /* Next in linked list. */
1385 int require_machine_suffix; /* Don't use without machine_suffix. */
1386 /* 2 means try both machine_suffix and just_machine_suffix. */
1387 int *used_flag_ptr; /* 1 if a file was found with this prefix. */
1388 int priority; /* Sort key - priority within list. */
1389 int os_multilib; /* 1 if OS multilib scheme should be used,
1390 0 for GCC multilib scheme. */
1393 struct path_prefix
1395 struct prefix_list *plist; /* List of prefixes to try */
1396 int max_len; /* Max length of a prefix in PLIST */
1397 const char *name; /* Name of this list (used in config stuff) */
1400 /* List of prefixes to try when looking for executables. */
1402 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1404 /* List of prefixes to try when looking for startup (crt0) files. */
1406 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1408 /* List of prefixes to try when looking for include files. */
1410 static struct path_prefix include_prefixes = { 0, 0, "include" };
1412 /* Suffix to attach to directories searched for commands.
1413 This looks like `MACHINE/VERSION/'. */
1415 static const char *machine_suffix = 0;
1417 /* Suffix to attach to directories searched for commands.
1418 This is just `MACHINE/'. */
1420 static const char *just_machine_suffix = 0;
1422 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1424 static const char *gcc_exec_prefix;
1426 /* Adjusted value of standard_libexec_prefix. */
1428 static const char *gcc_libexec_prefix;
1430 /* Default prefixes to attach to command names. */
1432 #ifndef STANDARD_STARTFILE_PREFIX_1
1433 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1434 #endif
1435 #ifndef STANDARD_STARTFILE_PREFIX_2
1436 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1437 #endif
1439 #ifdef CROSS_COMPILE /* Don't use these prefixes for a cross compiler. */
1440 #undef MD_EXEC_PREFIX
1441 #undef MD_STARTFILE_PREFIX
1442 #undef MD_STARTFILE_PREFIX_1
1443 #endif
1445 /* If no prefixes defined, use the null string, which will disable them. */
1446 #ifndef MD_EXEC_PREFIX
1447 #define MD_EXEC_PREFIX ""
1448 #endif
1449 #ifndef MD_STARTFILE_PREFIX
1450 #define MD_STARTFILE_PREFIX ""
1451 #endif
1452 #ifndef MD_STARTFILE_PREFIX_1
1453 #define MD_STARTFILE_PREFIX_1 ""
1454 #endif
1456 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1457 static const char *const standard_exec_prefix_1 = "/usr/libexec/gcc/";
1458 static const char *const standard_exec_prefix_2 = "/usr/lib/gcc/";
1459 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1461 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1462 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1463 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1464 static const char *const standard_startfile_prefix_1
1465 = STANDARD_STARTFILE_PREFIX_1;
1466 static const char *const standard_startfile_prefix_2
1467 = STANDARD_STARTFILE_PREFIX_2;
1469 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1470 static const char *tooldir_prefix;
1472 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1474 static const char *standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1476 /* Subdirectory to use for locating libraries. Set by
1477 set_multilib_dir based on the compilation options. */
1479 static const char *multilib_dir;
1481 /* Subdirectory to use for locating libraries in OS conventions. Set by
1482 set_multilib_dir based on the compilation options. */
1484 static const char *multilib_os_dir;
1486 /* Structure to keep track of the specs that have been defined so far.
1487 These are accessed using %(specname) or %[specname] in a compiler
1488 or link spec. */
1490 struct spec_list
1492 /* The following 2 fields must be first */
1493 /* to allow EXTRA_SPECS to be initialized */
1494 const char *name; /* name of the spec. */
1495 const char *ptr; /* available ptr if no static pointer */
1497 /* The following fields are not initialized */
1498 /* by EXTRA_SPECS */
1499 const char **ptr_spec; /* pointer to the spec itself. */
1500 struct spec_list *next; /* Next spec in linked list. */
1501 int name_len; /* length of the name */
1502 int alloc_p; /* whether string was allocated */
1505 #define INIT_STATIC_SPEC(NAME,PTR) \
1506 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1508 /* List of statically defined specs. */
1509 static struct spec_list static_specs[] =
1511 INIT_STATIC_SPEC ("asm", &asm_spec),
1512 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1513 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1514 INIT_STATIC_SPEC ("asm_options", &asm_options),
1515 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1516 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1517 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1518 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1519 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1520 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1521 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1522 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1523 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1524 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1525 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1526 INIT_STATIC_SPEC ("link", &link_spec),
1527 INIT_STATIC_SPEC ("lib", &lib_spec),
1528 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1529 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1530 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1531 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1532 INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
1533 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1534 INIT_STATIC_SPEC ("version", &compiler_version),
1535 INIT_STATIC_SPEC ("multilib", &multilib_select),
1536 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1537 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1538 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1539 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1540 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1541 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1542 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1543 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1544 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1545 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1546 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1547 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1548 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1551 #ifdef EXTRA_SPECS /* additional specs needed */
1552 /* Structure to keep track of just the first two args of a spec_list.
1553 That is all that the EXTRA_SPECS macro gives us. */
1554 struct spec_list_1
1556 const char *const name;
1557 const char *const ptr;
1560 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1561 static struct spec_list *extra_specs = (struct spec_list *) 0;
1562 #endif
1564 /* List of dynamically allocates specs that have been defined so far. */
1566 static struct spec_list *specs = (struct spec_list *) 0;
1568 /* List of static spec functions. */
1570 static const struct spec_function static_spec_functions[] =
1572 { "if-exists", if_exists_spec_function },
1573 { "if-exists-else", if_exists_else_spec_function },
1574 { 0, 0 }
1577 static int processing_spec_function;
1579 /* Add appropriate libgcc specs to OBSTACK, taking into account
1580 various permutations of -shared-libgcc, -shared, and such. */
1582 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1584 #ifndef USE_LD_AS_NEEDED
1585 #define USE_LD_AS_NEEDED 0
1586 #endif
1588 static void
1589 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1590 const char *static_name, const char *eh_name)
1592 char *buf;
1594 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name,
1595 "}%{!static:%{!static-libgcc:",
1596 #if USE_LD_AS_NEEDED
1597 "%{!shared-libgcc:", static_name,
1598 " --as-needed ", shared_name, " --no-as-needed}"
1599 "%{shared-libgcc:", shared_name, "%{!shared: ", static_name,
1600 "}",
1601 #else
1602 "%{!shared:%{!shared-libgcc:", static_name, " ",
1603 eh_name, "}%{shared-libgcc:", shared_name, " ",
1604 static_name, "}}%{shared:",
1605 #ifdef LINK_EH_SPEC
1606 "%{shared-libgcc:", shared_name,
1607 "}%{!shared-libgcc:", static_name, "}",
1608 #else
1609 shared_name,
1610 #endif
1611 #endif
1612 "}}}", NULL);
1614 obstack_grow (obstack, buf, strlen (buf));
1615 free (buf);
1617 #endif /* ENABLE_SHARED_LIBGCC */
1619 /* Initialize the specs lookup routines. */
1621 static void
1622 init_spec (void)
1624 struct spec_list *next = (struct spec_list *) 0;
1625 struct spec_list *sl = (struct spec_list *) 0;
1626 int i;
1628 if (specs)
1629 return; /* Already initialized. */
1631 if (verbose_flag)
1632 notice ("Using built-in specs.\n");
1634 #ifdef EXTRA_SPECS
1635 extra_specs = xcalloc (sizeof (struct spec_list),
1636 ARRAY_SIZE (extra_specs_1));
1638 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1640 sl = &extra_specs[i];
1641 sl->name = extra_specs_1[i].name;
1642 sl->ptr = extra_specs_1[i].ptr;
1643 sl->next = next;
1644 sl->name_len = strlen (sl->name);
1645 sl->ptr_spec = &sl->ptr;
1646 next = sl;
1648 #endif
1650 /* Initialize here, not in definition. The IRIX 6 O32 cc sometimes chokes
1651 on ?: in file-scope variable initializations. */
1652 asm_debug = ASM_DEBUG_SPEC;
1654 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1656 sl = &static_specs[i];
1657 sl->next = next;
1658 next = sl;
1661 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1662 /* ??? If neither -shared-libgcc nor --static-libgcc was
1663 seen, then we should be making an educated guess. Some proposed
1664 heuristics for ELF include:
1666 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1667 program will be doing dynamic loading, which will likely
1668 need the shared libgcc.
1670 (2) If "-ldl", then it's also a fair bet that we're doing
1671 dynamic loading.
1673 (3) For each ET_DYN we're linking against (either through -lfoo
1674 or /some/path/foo.so), check to see whether it or one of
1675 its dependencies depends on a shared libgcc.
1677 (4) If "-shared"
1679 If the runtime is fixed to look for program headers instead
1680 of calling __register_frame_info at all, for each object,
1681 use the shared libgcc if any EH symbol referenced.
1683 If crtstuff is fixed to not invoke __register_frame_info
1684 automatically, for each object, use the shared libgcc if
1685 any non-empty unwind section found.
1687 Doing any of this probably requires invoking an external program to
1688 do the actual object file scanning. */
1690 const char *p = libgcc_spec;
1691 int in_sep = 1;
1693 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1694 when given the proper command line arguments. */
1695 while (*p)
1697 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1699 init_gcc_specs (&obstack,
1700 #ifdef NO_SHARED_LIBGCC_MULTILIB
1701 "-lgcc_s"
1702 #else
1703 "-lgcc_s%M"
1704 #endif
1706 "-lgcc",
1707 "-lgcc_eh"
1708 #ifdef USE_LIBUNWIND_EXCEPTIONS
1709 " -lunwind"
1710 #endif
1713 p += 5;
1714 in_sep = 0;
1716 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1718 /* Ug. We don't know shared library extensions. Hope that
1719 systems that use this form don't do shared libraries. */
1720 init_gcc_specs (&obstack,
1721 #ifdef NO_SHARED_LIBGCC_MULTILIB
1722 "-lgcc_s"
1723 #else
1724 "-lgcc_s%M"
1725 #endif
1727 "libgcc.a%s",
1728 "libgcc_eh.a%s"
1729 #ifdef USE_LIBUNWIND_EXCEPTIONS
1730 " -lunwind"
1731 #endif
1733 p += 10;
1734 in_sep = 0;
1736 else
1738 obstack_1grow (&obstack, *p);
1739 in_sep = (*p == ' ');
1740 p += 1;
1744 obstack_1grow (&obstack, '\0');
1745 libgcc_spec = obstack_finish (&obstack);
1747 #endif
1748 #ifdef USE_AS_TRADITIONAL_FORMAT
1749 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1751 static const char tf[] = "--traditional-format ";
1752 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1753 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1754 asm_spec = obstack_finish (&obstack);
1756 #endif
1757 #ifdef LINK_EH_SPEC
1758 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1759 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1760 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1761 link_spec = obstack_finish (&obstack);
1762 #endif
1764 specs = sl;
1767 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1768 removed; If the spec starts with a + then SPEC is added to the end of the
1769 current spec. */
1771 static void
1772 set_spec (const char *name, const char *spec)
1774 struct spec_list *sl;
1775 const char *old_spec;
1776 int name_len = strlen (name);
1777 int i;
1779 /* If this is the first call, initialize the statically allocated specs. */
1780 if (!specs)
1782 struct spec_list *next = (struct spec_list *) 0;
1783 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1785 sl = &static_specs[i];
1786 sl->next = next;
1787 next = sl;
1789 specs = sl;
1792 /* See if the spec already exists. */
1793 for (sl = specs; sl; sl = sl->next)
1794 if (name_len == sl->name_len && !strcmp (sl->name, name))
1795 break;
1797 if (!sl)
1799 /* Not found - make it. */
1800 sl = xmalloc (sizeof (struct spec_list));
1801 sl->name = xstrdup (name);
1802 sl->name_len = name_len;
1803 sl->ptr_spec = &sl->ptr;
1804 sl->alloc_p = 0;
1805 *(sl->ptr_spec) = "";
1806 sl->next = specs;
1807 specs = sl;
1810 old_spec = *(sl->ptr_spec);
1811 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1812 ? concat (old_spec, spec + 1, NULL)
1813 : xstrdup (spec));
1815 #ifdef DEBUG_SPECS
1816 if (verbose_flag)
1817 notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1818 #endif
1820 /* Free the old spec. */
1821 if (old_spec && sl->alloc_p)
1822 free ((void *) old_spec);
1824 sl->alloc_p = 1;
1827 /* Accumulate a command (program name and args), and run it. */
1829 /* Vector of pointers to arguments in the current line of specifications. */
1831 static const char **argbuf;
1833 /* Number of elements allocated in argbuf. */
1835 static int argbuf_length;
1837 /* Number of elements in argbuf currently in use (containing args). */
1839 static int argbuf_index;
1841 /* Position in the argbuf array containing the name of the output file
1842 (the value associated with the "-o" flag). */
1844 static int have_o_argbuf_index = 0;
1846 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1847 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1848 it here. */
1850 static struct temp_name {
1851 const char *suffix; /* suffix associated with the code. */
1852 int length; /* strlen (suffix). */
1853 int unique; /* Indicates whether %g or %u/%U was used. */
1854 const char *filename; /* associated filename. */
1855 int filename_length; /* strlen (filename). */
1856 struct temp_name *next;
1857 } *temp_names;
1859 /* Number of commands executed so far. */
1861 static int execution_count;
1863 /* Number of commands that exited with a signal. */
1865 static int signal_count;
1867 /* Name with which this program was invoked. */
1869 static const char *programname;
1871 /* Allocate the argument vector. */
1873 static void
1874 alloc_args (void)
1876 argbuf_length = 10;
1877 argbuf = xmalloc (argbuf_length * sizeof (const char *));
1880 /* Clear out the vector of arguments (after a command is executed). */
1882 static void
1883 clear_args (void)
1885 argbuf_index = 0;
1888 /* Add one argument to the vector at the end.
1889 This is done when a space is seen or at the end of the line.
1890 If DELETE_ALWAYS is nonzero, the arg is a filename
1891 and the file should be deleted eventually.
1892 If DELETE_FAILURE is nonzero, the arg is a filename
1893 and the file should be deleted if this compilation fails. */
1895 static void
1896 store_arg (const char *arg, int delete_always, int delete_failure)
1898 if (argbuf_index + 1 == argbuf_length)
1899 argbuf = xrealloc (argbuf, (argbuf_length *= 2) * sizeof (const char *));
1901 argbuf[argbuf_index++] = arg;
1902 argbuf[argbuf_index] = 0;
1904 if (strcmp (arg, "-o") == 0)
1905 have_o_argbuf_index = argbuf_index;
1906 if (delete_always || delete_failure)
1907 record_temp_file (arg, delete_always, delete_failure);
1910 /* Load specs from a file name named FILENAME, replacing occurrences of
1911 various different types of line-endings, \r\n, \n\r and just \r, with
1912 a single \n. */
1914 static char *
1915 load_specs (const char *filename)
1917 int desc;
1918 int readlen;
1919 struct stat statbuf;
1920 char *buffer;
1921 char *buffer_p;
1922 char *specs;
1923 char *specs_p;
1925 if (verbose_flag)
1926 notice ("Reading specs from %s\n", filename);
1928 /* Open and stat the file. */
1929 desc = open (filename, O_RDONLY, 0);
1930 if (desc < 0)
1931 pfatal_with_name (filename);
1932 if (stat (filename, &statbuf) < 0)
1933 pfatal_with_name (filename);
1935 /* Read contents of file into BUFFER. */
1936 buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1937 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1938 if (readlen < 0)
1939 pfatal_with_name (filename);
1940 buffer[readlen] = 0;
1941 close (desc);
1943 specs = xmalloc (readlen + 1);
1944 specs_p = specs;
1945 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1947 int skip = 0;
1948 char c = *buffer_p;
1949 if (c == '\r')
1951 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
1952 skip = 1;
1953 else if (*(buffer_p + 1) == '\n') /* \r\n */
1954 skip = 1;
1955 else /* \r */
1956 c = '\n';
1958 if (! skip)
1959 *specs_p++ = c;
1961 *specs_p = '\0';
1963 free (buffer);
1964 return (specs);
1967 /* Read compilation specs from a file named FILENAME,
1968 replacing the default ones.
1970 A suffix which starts with `*' is a definition for
1971 one of the machine-specific sub-specs. The "suffix" should be
1972 *asm, *cc1, *cpp, *link, *startfile, etc.
1973 The corresponding spec is stored in asm_spec, etc.,
1974 rather than in the `compilers' vector.
1976 Anything invalid in the file is a fatal error. */
1978 static void
1979 read_specs (const char *filename, int main_p)
1981 char *buffer;
1982 char *p;
1984 buffer = load_specs (filename);
1986 /* Scan BUFFER for specs, putting them in the vector. */
1987 p = buffer;
1988 while (1)
1990 char *suffix;
1991 char *spec;
1992 char *in, *out, *p1, *p2, *p3;
1994 /* Advance P in BUFFER to the next nonblank nocomment line. */
1995 p = skip_whitespace (p);
1996 if (*p == 0)
1997 break;
1999 /* Is this a special command that starts with '%'? */
2000 /* Don't allow this for the main specs file, since it would
2001 encourage people to overwrite it. */
2002 if (*p == '%' && !main_p)
2004 p1 = p;
2005 while (*p && *p != '\n')
2006 p++;
2008 /* Skip '\n'. */
2009 p++;
2011 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2012 && (p1[sizeof "%include" - 1] == ' '
2013 || p1[sizeof "%include" - 1] == '\t'))
2015 char *new_filename;
2017 p1 += sizeof ("%include");
2018 while (*p1 == ' ' || *p1 == '\t')
2019 p1++;
2021 if (*p1++ != '<' || p[-2] != '>')
2022 fatal ("specs %%include syntax malformed after %ld characters",
2023 (long) (p1 - buffer + 1));
2025 p[-2] = '\0';
2026 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
2027 read_specs (new_filename ? new_filename : p1, FALSE);
2028 continue;
2030 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2031 && (p1[sizeof "%include_noerr" - 1] == ' '
2032 || p1[sizeof "%include_noerr" - 1] == '\t'))
2034 char *new_filename;
2036 p1 += sizeof "%include_noerr";
2037 while (*p1 == ' ' || *p1 == '\t')
2038 p1++;
2040 if (*p1++ != '<' || p[-2] != '>')
2041 fatal ("specs %%include syntax malformed after %ld characters",
2042 (long) (p1 - buffer + 1));
2044 p[-2] = '\0';
2045 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
2046 if (new_filename)
2047 read_specs (new_filename, FALSE);
2048 else if (verbose_flag)
2049 notice ("could not find specs file %s\n", p1);
2050 continue;
2052 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2053 && (p1[sizeof "%rename" - 1] == ' '
2054 || p1[sizeof "%rename" - 1] == '\t'))
2056 int name_len;
2057 struct spec_list *sl;
2058 struct spec_list *newsl;
2060 /* Get original name. */
2061 p1 += sizeof "%rename";
2062 while (*p1 == ' ' || *p1 == '\t')
2063 p1++;
2065 if (! ISALPHA ((unsigned char) *p1))
2066 fatal ("specs %%rename syntax malformed after %ld characters",
2067 (long) (p1 - buffer));
2069 p2 = p1;
2070 while (*p2 && !ISSPACE ((unsigned char) *p2))
2071 p2++;
2073 if (*p2 != ' ' && *p2 != '\t')
2074 fatal ("specs %%rename syntax malformed after %ld characters",
2075 (long) (p2 - buffer));
2077 name_len = p2 - p1;
2078 *p2++ = '\0';
2079 while (*p2 == ' ' || *p2 == '\t')
2080 p2++;
2082 if (! ISALPHA ((unsigned char) *p2))
2083 fatal ("specs %%rename syntax malformed after %ld characters",
2084 (long) (p2 - buffer));
2086 /* Get new spec name. */
2087 p3 = p2;
2088 while (*p3 && !ISSPACE ((unsigned char) *p3))
2089 p3++;
2091 if (p3 != p - 1)
2092 fatal ("specs %%rename syntax malformed after %ld characters",
2093 (long) (p3 - buffer));
2094 *p3 = '\0';
2096 for (sl = specs; sl; sl = sl->next)
2097 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2098 break;
2100 if (!sl)
2101 fatal ("specs %s spec was not found to be renamed", p1);
2103 if (strcmp (p1, p2) == 0)
2104 continue;
2106 for (newsl = specs; newsl; newsl = newsl->next)
2107 if (strcmp (newsl->name, p2) == 0)
2108 fatal ("%s: attempt to rename spec '%s' to already defined spec '%s'",
2109 filename, p1, p2);
2111 if (verbose_flag)
2113 notice ("rename spec %s to %s\n", p1, p2);
2114 #ifdef DEBUG_SPECS
2115 notice ("spec is '%s'\n\n", *(sl->ptr_spec));
2116 #endif
2119 set_spec (p2, *(sl->ptr_spec));
2120 if (sl->alloc_p)
2121 free ((void *) *(sl->ptr_spec));
2123 *(sl->ptr_spec) = "";
2124 sl->alloc_p = 0;
2125 continue;
2127 else
2128 fatal ("specs unknown %% command after %ld characters",
2129 (long) (p1 - buffer));
2132 /* Find the colon that should end the suffix. */
2133 p1 = p;
2134 while (*p1 && *p1 != ':' && *p1 != '\n')
2135 p1++;
2137 /* The colon shouldn't be missing. */
2138 if (*p1 != ':')
2139 fatal ("specs file malformed after %ld characters",
2140 (long) (p1 - buffer));
2142 /* Skip back over trailing whitespace. */
2143 p2 = p1;
2144 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2145 p2--;
2147 /* Copy the suffix to a string. */
2148 suffix = save_string (p, p2 - p);
2149 /* Find the next line. */
2150 p = skip_whitespace (p1 + 1);
2151 if (p[1] == 0)
2152 fatal ("specs file malformed after %ld characters",
2153 (long) (p - buffer));
2155 p1 = p;
2156 /* Find next blank line or end of string. */
2157 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2158 p1++;
2160 /* Specs end at the blank line and do not include the newline. */
2161 spec = save_string (p, p1 - p);
2162 p = p1;
2164 /* Delete backslash-newline sequences from the spec. */
2165 in = spec;
2166 out = spec;
2167 while (*in != 0)
2169 if (in[0] == '\\' && in[1] == '\n')
2170 in += 2;
2171 else if (in[0] == '#')
2172 while (*in && *in != '\n')
2173 in++;
2175 else
2176 *out++ = *in++;
2178 *out = 0;
2180 if (suffix[0] == '*')
2182 if (! strcmp (suffix, "*link_command"))
2183 link_command_spec = spec;
2184 else
2185 set_spec (suffix + 1, spec);
2187 else
2189 /* Add this pair to the vector. */
2190 compilers
2191 = xrealloc (compilers,
2192 (n_compilers + 2) * sizeof (struct compiler));
2194 compilers[n_compilers].suffix = suffix;
2195 compilers[n_compilers].spec = spec;
2196 n_compilers++;
2197 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2200 if (*suffix == 0)
2201 link_command_spec = spec;
2204 if (link_command_spec == 0)
2205 fatal ("spec file has no spec for linking");
2208 /* Record the names of temporary files we tell compilers to write,
2209 and delete them at the end of the run. */
2211 /* This is the common prefix we use to make temp file names.
2212 It is chosen once for each run of this program.
2213 It is substituted into a spec by %g or %j.
2214 Thus, all temp file names contain this prefix.
2215 In practice, all temp file names start with this prefix.
2217 This prefix comes from the envvar TMPDIR if it is defined;
2218 otherwise, from the P_tmpdir macro if that is defined;
2219 otherwise, in /usr/tmp or /tmp;
2220 or finally the current directory if all else fails. */
2222 static const char *temp_filename;
2224 /* Length of the prefix. */
2226 static int temp_filename_length;
2228 /* Define the list of temporary files to delete. */
2230 struct temp_file
2232 const char *name;
2233 struct temp_file *next;
2236 /* Queue of files to delete on success or failure of compilation. */
2237 static struct temp_file *always_delete_queue;
2238 /* Queue of files to delete on failure of compilation. */
2239 static struct temp_file *failure_delete_queue;
2241 /* Record FILENAME as a file to be deleted automatically.
2242 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2243 otherwise delete it in any case.
2244 FAIL_DELETE nonzero means delete it if a compilation step fails;
2245 otherwise delete it in any case. */
2247 void
2248 record_temp_file (const char *filename, int always_delete, int fail_delete)
2250 char *const name = xstrdup (filename);
2252 if (always_delete)
2254 struct temp_file *temp;
2255 for (temp = always_delete_queue; temp; temp = temp->next)
2256 if (! strcmp (name, temp->name))
2257 goto already1;
2259 temp = xmalloc (sizeof (struct temp_file));
2260 temp->next = always_delete_queue;
2261 temp->name = name;
2262 always_delete_queue = temp;
2264 already1:;
2267 if (fail_delete)
2269 struct temp_file *temp;
2270 for (temp = failure_delete_queue; temp; temp = temp->next)
2271 if (! strcmp (name, temp->name))
2272 goto already2;
2274 temp = xmalloc (sizeof (struct temp_file));
2275 temp->next = failure_delete_queue;
2276 temp->name = name;
2277 failure_delete_queue = temp;
2279 already2:;
2283 /* Delete all the temporary files whose names we previously recorded. */
2285 #ifndef DELETE_IF_ORDINARY
2286 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2287 do \
2289 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2290 if (unlink (NAME) < 0) \
2291 if (VERBOSE_FLAG) \
2292 perror_with_name (NAME); \
2293 } while (0)
2294 #endif
2296 static void
2297 delete_if_ordinary (const char *name)
2299 struct stat st;
2300 #ifdef DEBUG
2301 int i, c;
2303 printf ("Delete %s? (y or n) ", name);
2304 fflush (stdout);
2305 i = getchar ();
2306 if (i != '\n')
2307 while ((c = getchar ()) != '\n' && c != EOF)
2310 if (i == 'y' || i == 'Y')
2311 #endif /* DEBUG */
2312 DELETE_IF_ORDINARY (name, st, verbose_flag);
2315 static void
2316 delete_temp_files (void)
2318 struct temp_file *temp;
2320 for (temp = always_delete_queue; temp; temp = temp->next)
2321 delete_if_ordinary (temp->name);
2322 always_delete_queue = 0;
2325 /* Delete all the files to be deleted on error. */
2327 static void
2328 delete_failure_queue (void)
2330 struct temp_file *temp;
2332 for (temp = failure_delete_queue; temp; temp = temp->next)
2333 delete_if_ordinary (temp->name);
2336 static void
2337 clear_failure_queue (void)
2339 failure_delete_queue = 0;
2342 /* Build a list of search directories from PATHS.
2343 PREFIX is a string to prepend to the list.
2344 If CHECK_DIR_P is nonzero we ensure the directory exists.
2345 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2346 It is also used by the --print-search-dirs flag. */
2348 static char *
2349 build_search_list (struct path_prefix *paths, const char *prefix,
2350 int check_dir_p)
2352 int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
2353 int just_suffix_len
2354 = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
2355 int first_time = TRUE;
2356 struct prefix_list *pprefix;
2358 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2359 obstack_1grow (&collect_obstack, '=');
2361 for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
2363 int len = strlen (pprefix->prefix);
2365 if (machine_suffix
2366 && (! check_dir_p
2367 || is_directory (pprefix->prefix, machine_suffix, 0)))
2369 if (!first_time)
2370 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2372 first_time = FALSE;
2373 obstack_grow (&collect_obstack, pprefix->prefix, len);
2374 obstack_grow (&collect_obstack, machine_suffix, suffix_len);
2377 if (just_machine_suffix
2378 && pprefix->require_machine_suffix == 2
2379 && (! check_dir_p
2380 || is_directory (pprefix->prefix, just_machine_suffix, 0)))
2382 if (! first_time)
2383 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2385 first_time = FALSE;
2386 obstack_grow (&collect_obstack, pprefix->prefix, len);
2387 obstack_grow (&collect_obstack, just_machine_suffix,
2388 just_suffix_len);
2391 if (! pprefix->require_machine_suffix)
2393 if (! first_time)
2394 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
2396 first_time = FALSE;
2397 obstack_grow (&collect_obstack, pprefix->prefix, len);
2401 obstack_1grow (&collect_obstack, '\0');
2402 return obstack_finish (&collect_obstack);
2405 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2406 for collect. */
2408 static void
2409 putenv_from_prefixes (struct path_prefix *paths, const char *env_var)
2411 putenv (build_search_list (paths, env_var, 1));
2414 /* Check whether NAME can be accessed in MODE. This is like access,
2415 except that it never considers directories to be executable. */
2417 static int
2418 access_check (const char *name, int mode)
2420 if (mode == X_OK)
2422 struct stat st;
2424 if (stat (name, &st) < 0
2425 || S_ISDIR (st.st_mode))
2426 return -1;
2429 return access (name, mode);
2432 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2433 access to check permissions.
2434 Return 0 if not found, otherwise return its name, allocated with malloc. */
2436 static char *
2437 find_a_file (struct path_prefix *pprefix, const char *name, int mode,
2438 int multilib)
2440 char *temp;
2441 const char *const file_suffix =
2442 ((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "");
2443 struct prefix_list *pl;
2444 int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
2445 const char *multilib_name, *multilib_os_name;
2447 #ifdef DEFAULT_ASSEMBLER
2448 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2449 return xstrdup (DEFAULT_ASSEMBLER);
2450 #endif
2452 #ifdef DEFAULT_LINKER
2453 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2454 return xstrdup (DEFAULT_LINKER);
2455 #endif
2457 if (machine_suffix)
2458 len += strlen (machine_suffix);
2460 multilib_name = name;
2461 multilib_os_name = name;
2462 if (multilib && multilib_os_dir)
2464 int len1 = multilib_dir ? strlen (multilib_dir) + 1 : 0;
2465 int len2 = strlen (multilib_os_dir) + 1;
2467 len += len1 > len2 ? len1 : len2;
2468 if (multilib_dir)
2469 multilib_name = ACONCAT ((multilib_dir, dir_separator_str, name,
2470 NULL));
2471 if (strcmp (multilib_os_dir, ".") != 0)
2472 multilib_os_name = ACONCAT ((multilib_os_dir, dir_separator_str, name,
2473 NULL));
2476 temp = xmalloc (len);
2478 /* Determine the filename to execute (special case for absolute paths). */
2480 if (IS_ABSOLUTE_PATH (name))
2482 if (access (name, mode) == 0)
2484 strcpy (temp, name);
2485 return temp;
2488 else
2489 for (pl = pprefix->plist; pl; pl = pl->next)
2491 const char *this_name
2492 = pl->os_multilib ? multilib_os_name : multilib_name;
2494 if (machine_suffix)
2496 /* Some systems have a suffix for executable files.
2497 So try appending that first. */
2498 if (file_suffix[0] != 0)
2500 strcpy (temp, pl->prefix);
2501 strcat (temp, machine_suffix);
2502 strcat (temp, multilib_name);
2503 strcat (temp, file_suffix);
2504 if (access_check (temp, mode) == 0)
2506 if (pl->used_flag_ptr != 0)
2507 *pl->used_flag_ptr = 1;
2508 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)
2518 if (pl->used_flag_ptr != 0)
2519 *pl->used_flag_ptr = 1;
2520 return temp;
2524 /* Certain prefixes are tried with just the machine type,
2525 not the version. This is used for finding as, ld, etc. */
2526 if (just_machine_suffix && pl->require_machine_suffix == 2)
2528 /* Some systems have a suffix for executable files.
2529 So try appending that first. */
2530 if (file_suffix[0] != 0)
2532 strcpy (temp, pl->prefix);
2533 strcat (temp, just_machine_suffix);
2534 strcat (temp, multilib_name);
2535 strcat (temp, file_suffix);
2536 if (access_check (temp, mode) == 0)
2538 if (pl->used_flag_ptr != 0)
2539 *pl->used_flag_ptr = 1;
2540 return temp;
2544 strcpy (temp, pl->prefix);
2545 strcat (temp, just_machine_suffix);
2546 strcat (temp, multilib_name);
2547 if (access_check (temp, mode) == 0)
2549 if (pl->used_flag_ptr != 0)
2550 *pl->used_flag_ptr = 1;
2551 return temp;
2555 /* Certain prefixes can't be used without the machine suffix
2556 when the machine or version is explicitly specified. */
2557 if (! pl->require_machine_suffix)
2559 /* Some systems have a suffix for executable files.
2560 So try appending that first. */
2561 if (file_suffix[0] != 0)
2563 strcpy (temp, pl->prefix);
2564 strcat (temp, this_name);
2565 strcat (temp, file_suffix);
2566 if (access_check (temp, mode) == 0)
2568 if (pl->used_flag_ptr != 0)
2569 *pl->used_flag_ptr = 1;
2570 return temp;
2574 strcpy (temp, pl->prefix);
2575 strcat (temp, this_name);
2576 if (access_check (temp, mode) == 0)
2578 if (pl->used_flag_ptr != 0)
2579 *pl->used_flag_ptr = 1;
2580 return temp;
2585 free (temp);
2586 return 0;
2589 /* Ranking of prefixes in the sort list. -B prefixes are put before
2590 all others. */
2592 enum path_prefix_priority
2594 PREFIX_PRIORITY_B_OPT,
2595 PREFIX_PRIORITY_LAST
2598 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2599 order according to PRIORITY. Within each PRIORITY, new entries are
2600 appended.
2602 If WARN is nonzero, we will warn if no file is found
2603 through this prefix. WARN should point to an int
2604 which will be set to 1 if this entry is used.
2606 COMPONENT is the value to be passed to update_path.
2608 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2609 the complete value of machine_suffix.
2610 2 means try both machine_suffix and just_machine_suffix. */
2612 static void
2613 add_prefix (struct path_prefix *pprefix, const char *prefix,
2614 const char *component, /* enum prefix_priority */ int priority,
2615 int require_machine_suffix, int *warn, int os_multilib)
2617 struct prefix_list *pl, **prev;
2618 int len;
2620 for (prev = &pprefix->plist;
2621 (*prev) != NULL && (*prev)->priority <= priority;
2622 prev = &(*prev)->next)
2625 /* Keep track of the longest prefix. */
2627 prefix = update_path (prefix, component);
2628 len = strlen (prefix);
2629 if (len > pprefix->max_len)
2630 pprefix->max_len = len;
2632 pl = xmalloc (sizeof (struct prefix_list));
2633 pl->prefix = prefix;
2634 pl->require_machine_suffix = require_machine_suffix;
2635 pl->used_flag_ptr = warn;
2636 pl->priority = priority;
2637 pl->os_multilib = os_multilib;
2638 if (warn)
2639 *warn = 0;
2641 /* Insert after PREV. */
2642 pl->next = (*prev);
2643 (*prev) = pl;
2646 /* Same as add_prefix, but prepending target_system_root to prefix. */
2647 static void
2648 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2649 const char *component,
2650 /* enum prefix_priority */ int priority,
2651 int require_machine_suffix, int *warn, int os_multilib)
2653 if (!IS_ABSOLUTE_PATH (prefix))
2654 abort ();
2656 if (target_system_root)
2658 if (target_sysroot_suffix)
2659 prefix = concat (target_sysroot_suffix, prefix, NULL);
2660 prefix = concat (target_system_root, prefix, NULL);
2662 /* We have to override this because GCC's notion of sysroot
2663 moves along with GCC. */
2664 component = "GCC";
2667 add_prefix (pprefix, prefix, component, priority,
2668 require_machine_suffix, warn, os_multilib);
2671 /* Execute the command specified by the arguments on the current line of spec.
2672 When using pipes, this includes several piped-together commands
2673 with `|' between them.
2675 Return 0 if successful, -1 if failed. */
2677 static int
2678 execute (void)
2680 int i;
2681 int n_commands; /* # of command. */
2682 char *string;
2683 struct command
2685 const char *prog; /* program name. */
2686 const char **argv; /* vector of args. */
2687 int pid; /* pid of process for this command. */
2690 struct command *commands; /* each command buffer with above info. */
2692 if (processing_spec_function)
2693 abort ();
2695 /* Count # of piped commands. */
2696 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2697 if (strcmp (argbuf[i], "|") == 0)
2698 n_commands++;
2700 /* Get storage for each command. */
2701 commands = alloca (n_commands * sizeof (struct command));
2703 /* Split argbuf into its separate piped processes,
2704 and record info about each one.
2705 Also search for the programs that are to be run. */
2707 commands[0].prog = argbuf[0]; /* first command. */
2708 commands[0].argv = &argbuf[0];
2709 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, 0);
2711 if (string)
2712 commands[0].argv[0] = string;
2714 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2715 if (strcmp (argbuf[i], "|") == 0)
2716 { /* each command. */
2717 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2718 fatal ("-pipe not supported");
2719 #endif
2720 argbuf[i] = 0; /* termination of command args. */
2721 commands[n_commands].prog = argbuf[i + 1];
2722 commands[n_commands].argv = &argbuf[i + 1];
2723 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2724 X_OK, 0);
2725 if (string)
2726 commands[n_commands].argv[0] = string;
2727 n_commands++;
2730 argbuf[argbuf_index] = 0;
2732 /* If -v, print what we are about to do, and maybe query. */
2734 if (verbose_flag)
2736 /* For help listings, put a blank line between sub-processes. */
2737 if (print_help_list)
2738 fputc ('\n', stderr);
2740 /* Print each piped command as a separate line. */
2741 for (i = 0; i < n_commands; i++)
2743 const char *const *j;
2745 if (verbose_only_flag)
2747 for (j = commands[i].argv; *j; j++)
2749 const char *p;
2750 fprintf (stderr, " \"");
2751 for (p = *j; *p; ++p)
2753 if (*p == '"' || *p == '\\' || *p == '$')
2754 fputc ('\\', stderr);
2755 fputc (*p, stderr);
2757 fputc ('"', stderr);
2760 else
2761 for (j = commands[i].argv; *j; j++)
2762 fprintf (stderr, " %s", *j);
2764 /* Print a pipe symbol after all but the last command. */
2765 if (i + 1 != n_commands)
2766 fprintf (stderr, " |");
2767 fprintf (stderr, "\n");
2769 fflush (stderr);
2770 if (verbose_only_flag != 0)
2772 /* verbose_only_flag should act as if the spec was
2773 executed, so increment execution_count before
2774 returning. This prevents spurious warnings about
2775 unused linker input files, etc. */
2776 execution_count++;
2777 return 0;
2779 #ifdef DEBUG
2780 notice ("\nGo ahead? (y or n) ");
2781 fflush (stderr);
2782 i = getchar ();
2783 if (i != '\n')
2784 while (getchar () != '\n')
2787 if (i != 'y' && i != 'Y')
2788 return 0;
2789 #endif /* DEBUG */
2792 #ifdef ENABLE_VALGRIND_CHECKING
2793 /* Run the each command through valgrind. To simplify prepending the
2794 path to valgrind and the option "-q" (for quiet operation unless
2795 something triggers), we allocate a separate argv array. */
2797 for (i = 0; i < n_commands; i++)
2799 const char **argv;
2800 int argc;
2801 int j;
2803 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
2806 argv = alloca ((argc + 3) * sizeof (char *));
2808 argv[0] = VALGRIND_PATH;
2809 argv[1] = "-q";
2810 for (j = 2; j < argc + 2; j++)
2811 argv[j] = commands[i].argv[j - 2];
2812 argv[j] = NULL;
2814 commands[i].argv = argv;
2815 commands[i].prog = argv[0];
2817 #endif
2819 /* Run each piped subprocess. */
2821 for (i = 0; i < n_commands; i++)
2823 char *errmsg_fmt, *errmsg_arg;
2824 const char *string = commands[i].argv[0];
2826 /* For some bizarre reason, the second argument of execvp() is
2827 char *const *, not const char *const *. */
2828 commands[i].pid = pexecute (string, (char *const *) commands[i].argv,
2829 programname, temp_filename,
2830 &errmsg_fmt, &errmsg_arg,
2831 ((i == 0 ? PEXECUTE_FIRST : 0)
2832 | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2833 | (string == commands[i].prog
2834 ? PEXECUTE_SEARCH : 0)
2835 | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2837 if (commands[i].pid == -1)
2838 pfatal_pexecute (errmsg_fmt, errmsg_arg);
2840 if (string != commands[i].prog)
2841 free ((void *) string);
2844 execution_count++;
2846 /* Wait for all the subprocesses to finish.
2847 We don't care what order they finish in;
2848 we know that N_COMMANDS waits will get them all.
2849 Ignore subprocesses that we don't know about,
2850 since they can be spawned by the process that exec'ed us. */
2853 int ret_code = 0;
2854 #ifdef HAVE_GETRUSAGE
2855 struct timeval d;
2856 double ut = 0.0, st = 0.0;
2857 #endif
2859 for (i = 0; i < n_commands;)
2861 int j;
2862 int status;
2863 int pid;
2865 pid = pwait (commands[i].pid, &status, 0);
2866 if (pid < 0)
2867 abort ();
2869 #ifdef HAVE_GETRUSAGE
2870 if (report_times)
2872 /* getrusage returns the total resource usage of all children
2873 up to now. Copy the previous values into prus, get the
2874 current statistics, then take the difference. */
2876 prus = rus;
2877 getrusage (RUSAGE_CHILDREN, &rus);
2878 d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
2879 d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
2880 ut = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2882 d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
2883 d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
2884 st = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2886 #endif
2888 for (j = 0; j < n_commands; j++)
2889 if (commands[j].pid == pid)
2891 i++;
2892 if (WIFSIGNALED (status))
2894 #ifdef SIGPIPE
2895 /* SIGPIPE is a special case. It happens in -pipe mode
2896 when the compiler dies before the preprocessor is
2897 done, or the assembler dies before the compiler is
2898 done. There's generally been an error already, and
2899 this is just fallout. So don't generate another error
2900 unless we would otherwise have succeeded. */
2901 if (WTERMSIG (status) == SIGPIPE
2902 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2904 else
2905 #endif
2906 fatal ("\
2907 Internal error: %s (program %s)\n\
2908 Please submit a full bug report.\n\
2909 See %s for instructions.",
2910 strsignal (WTERMSIG (status)), commands[j].prog,
2911 bug_report_url);
2912 signal_count++;
2913 ret_code = -1;
2915 else if (WIFEXITED (status)
2916 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2918 if (WEXITSTATUS (status) > greatest_status)
2919 greatest_status = WEXITSTATUS (status);
2920 ret_code = -1;
2922 #ifdef HAVE_GETRUSAGE
2923 if (report_times && ut + st != 0)
2924 notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
2925 #endif
2926 break;
2929 return ret_code;
2933 /* Find all the switches given to us
2934 and make a vector describing them.
2935 The elements of the vector are strings, one per switch given.
2936 If a switch uses following arguments, then the `part1' field
2937 is the switch itself and the `args' field
2938 is a null-terminated vector containing the following arguments.
2939 The `live_cond' field is:
2940 0 when initialized
2941 1 if the switch is true in a conditional spec,
2942 -1 if false (overridden by a later switch)
2943 -2 if this switch should be ignored (used in %<S)
2944 The `validated' field is nonzero if any spec has looked at this switch;
2945 if it remains zero at the end of the run, it must be meaningless. */
2947 #define SWITCH_OK 0
2948 #define SWITCH_FALSE -1
2949 #define SWITCH_IGNORE -2
2950 #define SWITCH_LIVE 1
2952 struct switchstr
2954 const char *part1;
2955 const char **args;
2956 int live_cond;
2957 unsigned char validated;
2958 unsigned char ordering;
2961 static struct switchstr *switches;
2963 static int n_switches;
2965 struct infile
2967 const char *name;
2968 const char *language;
2969 struct compiler *incompiler;
2970 bool compiled;
2971 bool preprocessed;
2974 /* Also a vector of input files specified. */
2976 static struct infile *infiles;
2978 int n_infiles;
2980 /* True if multiple input files are being compiled to a single
2981 assembly file. */
2983 static bool combine_inputs;
2985 /* This counts the number of libraries added by lang_specific_driver, so that
2986 we can tell if there were any user supplied any files or libraries. */
2988 static int added_libraries;
2990 /* And a vector of corresponding output files is made up later. */
2992 const char **outfiles;
2994 /* Used to track if none of the -B paths are used. */
2995 static int warn_B;
2997 /* Gives value to pass as "warn" to add_prefix for standard prefixes. */
2998 static int *warn_std_ptr = 0;
3000 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3002 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3003 is true if we should look for an executable suffix. DO_OBJ
3004 is true if we should look for an object suffix. */
3006 static const char *
3007 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3008 int do_obj ATTRIBUTE_UNUSED)
3010 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3011 int i;
3012 #endif
3013 int len;
3015 if (name == NULL)
3016 return NULL;
3018 len = strlen (name);
3020 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3021 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3022 if (do_obj && len > 2
3023 && name[len - 2] == '.'
3024 && name[len - 1] == 'o')
3026 obstack_grow (&obstack, name, len - 2);
3027 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3028 name = obstack_finish (&obstack);
3030 #endif
3032 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3033 /* If there is no filetype, make it the executable suffix (which includes
3034 the "."). But don't get confused if we have just "-o". */
3035 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3036 return name;
3038 for (i = len - 1; i >= 0; i--)
3039 if (IS_DIR_SEPARATOR (name[i]))
3040 break;
3042 for (i++; i < len; i++)
3043 if (name[i] == '.')
3044 return name;
3046 obstack_grow (&obstack, name, len);
3047 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3048 strlen (TARGET_EXECUTABLE_SUFFIX));
3049 name = obstack_finish (&obstack);
3050 #endif
3052 return name;
3054 #endif
3056 /* Display the command line switches accepted by gcc. */
3057 static void
3058 display_help (void)
3060 printf (_("Usage: %s [options] file...\n"), programname);
3061 fputs (_("Options:\n"), stdout);
3063 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3064 fputs (_(" --help Display this information\n"), stdout);
3065 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3066 if (! verbose_flag)
3067 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3068 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3069 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3070 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3071 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3072 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3073 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3074 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3075 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3076 fputs (_("\
3077 -print-multi-lib Display the mapping between command line options and\n\
3078 multiple library search directories\n"), stdout);
3079 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3080 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3081 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3082 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3083 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3084 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3085 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3086 fputs (_(" -combine Pass multiple source files to compiler at once\n"), stdout);
3087 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3088 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3089 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3090 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3091 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3092 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3093 fputs (_(" -b <machine> Run gcc for target <machine>, if installed\n"), stdout);
3094 fputs (_(" -V <version> Run gcc version number <version>, if installed\n"), stdout);
3095 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3096 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3097 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3098 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3099 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3100 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3101 fputs (_("\
3102 -x <language> Specify the language of the following input files\n\
3103 Permissible languages include: c c++ assembler none\n\
3104 'none' means revert to the default behavior of\n\
3105 guessing the language based on the file's extension\n\
3106 "), stdout);
3108 printf (_("\
3109 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3110 passed on to the various sub-processes invoked by %s. In order to pass\n\
3111 other options on to these processes the -W<letter> options must be used.\n\
3112 "), programname);
3114 /* The rest of the options are displayed by invocations of the various
3115 sub-processes. */
3118 static void
3119 add_preprocessor_option (const char *option, int len)
3121 n_preprocessor_options++;
3123 if (! preprocessor_options)
3124 preprocessor_options = xmalloc (n_preprocessor_options * sizeof (char *));
3125 else
3126 preprocessor_options = xrealloc (preprocessor_options,
3127 n_preprocessor_options * sizeof (char *));
3129 preprocessor_options [n_preprocessor_options - 1] =
3130 save_string (option, len);
3133 static void
3134 add_assembler_option (const char *option, int len)
3136 n_assembler_options++;
3138 if (! assembler_options)
3139 assembler_options = xmalloc (n_assembler_options * sizeof (char *));
3140 else
3141 assembler_options = xrealloc (assembler_options,
3142 n_assembler_options * sizeof (char *));
3144 assembler_options [n_assembler_options - 1] = save_string (option, len);
3147 static void
3148 add_linker_option (const char *option, int len)
3150 n_linker_options++;
3152 if (! linker_options)
3153 linker_options = xmalloc (n_linker_options * sizeof (char *));
3154 else
3155 linker_options = xrealloc (linker_options,
3156 n_linker_options * sizeof (char *));
3158 linker_options [n_linker_options - 1] = save_string (option, len);
3161 /* Create the vector `switches' and its contents.
3162 Store its length in `n_switches'. */
3164 static void
3165 process_command (int argc, const char **argv)
3167 int i;
3168 const char *temp;
3169 char *temp1;
3170 const char *spec_lang = 0;
3171 int last_language_n_infiles;
3172 int have_c = 0;
3173 int lang_n_infiles = 0;
3174 #ifdef MODIFY_TARGET_NAME
3175 int is_modify_target_name;
3176 int j;
3177 #endif
3179 GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3181 n_switches = 0;
3182 n_infiles = 0;
3183 added_libraries = 0;
3185 /* Figure compiler version from version string. */
3187 compiler_version = temp1 = xstrdup (version_string);
3189 for (; *temp1; ++temp1)
3191 if (*temp1 == ' ')
3193 *temp1 = '\0';
3194 break;
3198 /* If there is a -V or -b option (or both), process it now, before
3199 trying to interpret the rest of the command line. */
3200 if (argc > 1 && argv[1][0] == '-'
3201 && (argv[1][1] == 'V' || argv[1][1] == 'b'))
3203 const char *new_version = DEFAULT_TARGET_VERSION;
3204 const char *new_machine = DEFAULT_TARGET_MACHINE;
3205 const char *progname = argv[0];
3206 char **new_argv;
3207 char *new_argv0;
3208 int baselen;
3210 while (argc > 1 && argv[1][0] == '-'
3211 && (argv[1][1] == 'V' || argv[1][1] == 'b'))
3213 char opt = argv[1][1];
3214 const char *arg;
3215 if (argv[1][2] != '\0')
3217 arg = argv[1] + 2;
3218 argc -= 1;
3219 argv += 1;
3221 else if (argc > 2)
3223 arg = argv[2];
3224 argc -= 2;
3225 argv += 2;
3227 else
3228 fatal ("`-%c' option must have argument", opt);
3229 if (opt == 'V')
3230 new_version = arg;
3231 else
3232 new_machine = arg;
3235 for (baselen = strlen (progname); baselen > 0; baselen--)
3236 if (IS_DIR_SEPARATOR (progname[baselen-1]))
3237 break;
3238 new_argv0 = xmemdup (progname, baselen,
3239 baselen + concat_length (new_version, new_machine,
3240 "-gcc-", NULL) + 1);
3241 strcpy (new_argv0 + baselen, new_machine);
3242 strcat (new_argv0, "-gcc-");
3243 strcat (new_argv0, new_version);
3245 new_argv = xmemdup (argv, (argc + 1) * sizeof (argv[0]),
3246 (argc + 1) * sizeof (argv[0]));
3247 new_argv[0] = new_argv0;
3249 execvp (new_argv0, new_argv);
3250 fatal ("couldn't run `%s': %s", new_argv0, xstrerror (errno));
3253 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3254 see if we can create it from the pathname specified in argv[0]. */
3256 gcc_libexec_prefix = standard_libexec_prefix;
3257 #ifndef VMS
3258 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3259 if (!gcc_exec_prefix)
3261 gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
3262 standard_exec_prefix);
3263 gcc_libexec_prefix = make_relative_prefix (argv[0],
3264 standard_bindir_prefix,
3265 standard_libexec_prefix);
3266 if (gcc_exec_prefix)
3267 putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3269 else
3270 gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix,
3271 standard_exec_prefix,
3272 standard_libexec_prefix);
3273 #else
3274 #endif
3276 if (gcc_exec_prefix)
3278 int len = strlen (gcc_exec_prefix);
3280 if (len > (int) sizeof ("/lib/gcc/") - 1
3281 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3283 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3284 if (IS_DIR_SEPARATOR (*temp)
3285 && strncmp (temp + 1, "lib", 3) == 0
3286 && IS_DIR_SEPARATOR (temp[4])
3287 && strncmp (temp + 5, "gcc", 3) == 0)
3288 len -= sizeof ("/lib/gcc/") - 1;
3291 set_std_prefix (gcc_exec_prefix, len);
3292 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3293 PREFIX_PRIORITY_LAST, 0, NULL, 0);
3294 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3295 PREFIX_PRIORITY_LAST, 0, NULL, 0);
3298 /* COMPILER_PATH and LIBRARY_PATH have values
3299 that are lists of directory names with colons. */
3301 GET_ENVIRONMENT (temp, "COMPILER_PATH");
3302 if (temp)
3304 const char *startp, *endp;
3305 char *nstore = alloca (strlen (temp) + 3);
3307 startp = endp = temp;
3308 while (1)
3310 if (*endp == PATH_SEPARATOR || *endp == 0)
3312 strncpy (nstore, startp, endp - startp);
3313 if (endp == startp)
3314 strcpy (nstore, concat (".", dir_separator_str, NULL));
3315 else if (!IS_DIR_SEPARATOR (endp[-1]))
3317 nstore[endp - startp] = DIR_SEPARATOR;
3318 nstore[endp - startp + 1] = 0;
3320 else
3321 nstore[endp - startp] = 0;
3322 add_prefix (&exec_prefixes, nstore, 0,
3323 PREFIX_PRIORITY_LAST, 0, NULL, 0);
3324 add_prefix (&include_prefixes, nstore, 0,
3325 PREFIX_PRIORITY_LAST, 0, NULL, 0);
3326 if (*endp == 0)
3327 break;
3328 endp = startp = endp + 1;
3330 else
3331 endp++;
3335 GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
3336 if (temp && *cross_compile == '0')
3338 const char *startp, *endp;
3339 char *nstore = alloca (strlen (temp) + 3);
3341 startp = endp = temp;
3342 while (1)
3344 if (*endp == PATH_SEPARATOR || *endp == 0)
3346 strncpy (nstore, startp, endp - startp);
3347 if (endp == startp)
3348 strcpy (nstore, concat (".", dir_separator_str, NULL));
3349 else if (!IS_DIR_SEPARATOR (endp[-1]))
3351 nstore[endp - startp] = DIR_SEPARATOR;
3352 nstore[endp - startp + 1] = 0;
3354 else
3355 nstore[endp - startp] = 0;
3356 add_prefix (&startfile_prefixes, nstore, NULL,
3357 PREFIX_PRIORITY_LAST, 0, NULL, 1);
3358 if (*endp == 0)
3359 break;
3360 endp = startp = endp + 1;
3362 else
3363 endp++;
3367 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3368 GET_ENVIRONMENT (temp, "LPATH");
3369 if (temp && *cross_compile == '0')
3371 const char *startp, *endp;
3372 char *nstore = alloca (strlen (temp) + 3);
3374 startp = endp = temp;
3375 while (1)
3377 if (*endp == PATH_SEPARATOR || *endp == 0)
3379 strncpy (nstore, startp, endp - startp);
3380 if (endp == startp)
3381 strcpy (nstore, concat (".", dir_separator_str, NULL));
3382 else if (!IS_DIR_SEPARATOR (endp[-1]))
3384 nstore[endp - startp] = DIR_SEPARATOR;
3385 nstore[endp - startp + 1] = 0;
3387 else
3388 nstore[endp - startp] = 0;
3389 add_prefix (&startfile_prefixes, nstore, NULL,
3390 PREFIX_PRIORITY_LAST, 0, NULL, 1);
3391 if (*endp == 0)
3392 break;
3393 endp = startp = endp + 1;
3395 else
3396 endp++;
3400 /* Convert new-style -- options to old-style. */
3401 translate_options (&argc, (const char *const **) &argv);
3403 /* Do language-specific adjustment/addition of flags. */
3404 lang_specific_driver (&argc, (const char *const **) &argv, &added_libraries);
3406 /* Scan argv twice. Here, the first time, just count how many switches
3407 there will be in their vector, and how many input files in theirs.
3408 Here we also parse the switches that cc itself uses (e.g. -v). */
3410 for (i = 1; i < argc; i++)
3412 if (! strcmp (argv[i], "-dumpspecs"))
3414 struct spec_list *sl;
3415 init_spec ();
3416 for (sl = specs; sl; sl = sl->next)
3417 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3418 if (link_command_spec)
3419 printf ("*link_command:\n%s\n\n", link_command_spec);
3420 exit (0);
3422 else if (! strcmp (argv[i], "-dumpversion"))
3424 printf ("%s\n", spec_version);
3425 exit (0);
3427 else if (! strcmp (argv[i], "-dumpmachine"))
3429 printf ("%s\n", spec_machine);
3430 exit (0);
3432 else if (strcmp (argv[i], "-fversion") == 0)
3434 /* translate_options () has turned --version into -fversion. */
3435 printf (_("%s (GCC) %s\n"), programname, version_string);
3436 printf ("Copyright %s 2004 Free Software Foundation, Inc.\n",
3437 _("(C)"));
3438 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
3439 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
3440 stdout);
3441 exit (0);
3443 else if (strcmp (argv[i], "-fhelp") == 0)
3445 /* translate_options () has turned --help into -fhelp. */
3446 print_help_list = 1;
3448 /* We will be passing a dummy file on to the sub-processes. */
3449 n_infiles++;
3450 n_switches++;
3452 /* CPP driver cannot obtain switch from cc1_options. */
3453 if (is_cpp_driver)
3454 add_preprocessor_option ("--help", 6);
3455 add_assembler_option ("--help", 6);
3456 add_linker_option ("--help", 6);
3458 else if (strcmp (argv[i], "-ftarget-help") == 0)
3460 /* translate_options() has turned --target-help into -ftarget-help. */
3461 target_help_flag = 1;
3463 /* We will be passing a dummy file on to the sub-processes. */
3464 n_infiles++;
3465 n_switches++;
3467 /* CPP driver cannot obtain switch from cc1_options. */
3468 if (is_cpp_driver)
3469 add_preprocessor_option ("--target-help", 13);
3470 add_assembler_option ("--target-help", 13);
3471 add_linker_option ("--target-help", 13);
3473 else if (! strcmp (argv[i], "-pass-exit-codes"))
3475 pass_exit_codes = 1;
3476 n_switches++;
3478 else if (! strcmp (argv[i], "-print-search-dirs"))
3479 print_search_dirs = 1;
3480 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3481 print_file_name = "libgcc.a";
3482 else if (! strncmp (argv[i], "-print-file-name=", 17))
3483 print_file_name = argv[i] + 17;
3484 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3485 print_prog_name = argv[i] + 17;
3486 else if (! strcmp (argv[i], "-print-multi-lib"))
3487 print_multi_lib = 1;
3488 else if (! strcmp (argv[i], "-print-multi-directory"))
3489 print_multi_directory = 1;
3490 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3491 print_multi_os_directory = 1;
3492 else if (! strncmp (argv[i], "-Wa,", 4))
3494 int prev, j;
3495 /* Pass the rest of this option to the assembler. */
3497 /* Split the argument at commas. */
3498 prev = 4;
3499 for (j = 4; argv[i][j]; j++)
3500 if (argv[i][j] == ',')
3502 add_assembler_option (argv[i] + prev, j - prev);
3503 prev = j + 1;
3506 /* Record the part after the last comma. */
3507 add_assembler_option (argv[i] + prev, j - prev);
3509 else if (! strncmp (argv[i], "-Wp,", 4))
3511 int prev, j;
3512 /* Pass the rest of this option to the preprocessor. */
3514 /* Split the argument at commas. */
3515 prev = 4;
3516 for (j = 4; argv[i][j]; j++)
3517 if (argv[i][j] == ',')
3519 add_preprocessor_option (argv[i] + prev, j - prev);
3520 prev = j + 1;
3523 /* Record the part after the last comma. */
3524 add_preprocessor_option (argv[i] + prev, j - prev);
3526 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3527 /* The +e options to the C++ front-end. */
3528 n_switches++;
3529 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3531 int j;
3532 /* Split the argument at commas. */
3533 for (j = 3; argv[i][j]; j++)
3534 n_infiles += (argv[i][j] == ',');
3536 else if (strcmp (argv[i], "-Xlinker") == 0)
3538 if (i + 1 == argc)
3539 fatal ("argument to `-Xlinker' is missing");
3541 n_infiles++;
3542 i++;
3544 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3546 if (i + 1 == argc)
3547 fatal ("argument to `-Xpreprocessor' is missing");
3549 add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
3551 else if (strcmp (argv[i], "-Xassembler") == 0)
3553 if (i + 1 == argc)
3554 fatal ("argument to `-Xassembler' is missing");
3556 add_assembler_option (argv[i+1], strlen (argv[i+1]));
3558 else if (strcmp (argv[i], "-l") == 0)
3560 if (i + 1 == argc)
3561 fatal ("argument to `-l' is missing");
3563 n_infiles++;
3564 i++;
3566 else if (strncmp (argv[i], "-l", 2) == 0)
3567 n_infiles++;
3568 else if (strcmp (argv[i], "-save-temps") == 0)
3570 save_temps_flag = 1;
3571 n_switches++;
3573 else if (strcmp (argv[i], "-combine") == 0)
3575 combine_flag = 1;
3576 n_switches++;
3578 else if (strcmp (argv[i], "-specs") == 0)
3580 struct user_specs *user = xmalloc (sizeof (struct user_specs));
3581 if (++i >= argc)
3582 fatal ("argument to `-specs' is missing");
3584 user->next = (struct user_specs *) 0;
3585 user->filename = argv[i];
3586 if (user_specs_tail)
3587 user_specs_tail->next = user;
3588 else
3589 user_specs_head = user;
3590 user_specs_tail = user;
3592 else if (strncmp (argv[i], "-specs=", 7) == 0)
3594 struct user_specs *user = xmalloc (sizeof (struct user_specs));
3595 if (strlen (argv[i]) == 7)
3596 fatal ("argument to `-specs=' is missing");
3598 user->next = (struct user_specs *) 0;
3599 user->filename = argv[i] + 7;
3600 if (user_specs_tail)
3601 user_specs_tail->next = user;
3602 else
3603 user_specs_head = user;
3604 user_specs_tail = user;
3606 else if (strcmp (argv[i], "-time") == 0)
3607 report_times = 1;
3608 else if (strcmp (argv[i], "-pipe") == 0)
3610 /* -pipe has to go into the switches array as well as
3611 setting a flag. */
3612 use_pipes = 1;
3613 n_switches++;
3615 else if (strcmp (argv[i], "-###") == 0)
3617 /* This is similar to -v except that there is no execution
3618 of the commands and the echoed arguments are quoted. It
3619 is intended for use in shell scripts to capture the
3620 driver-generated command line. */
3621 verbose_only_flag++;
3622 verbose_flag++;
3624 else if (argv[i][0] == '-' && argv[i][1] != 0)
3626 const char *p = &argv[i][1];
3627 int c = *p;
3629 switch (c)
3631 case 'b':
3632 case 'V':
3633 fatal ("`-%c' must come at the start of the command line", c);
3634 break;
3636 case 'B':
3638 const char *value;
3639 int len;
3641 if (p[1] == 0 && i + 1 == argc)
3642 fatal ("argument to `-B' is missing");
3643 if (p[1] == 0)
3644 value = argv[++i];
3645 else
3646 value = p + 1;
3648 len = strlen (value);
3650 /* Catch the case where the user has forgotten to append a
3651 directory separator to the path. Note, they may be using
3652 -B to add an executable name prefix, eg "i386-elf-", in
3653 order to distinguish between multiple installations of
3654 GCC in the same directory. Hence we must check to see
3655 if appending a directory separator actually makes a
3656 valid directory name. */
3657 if (! IS_DIR_SEPARATOR (value [len - 1])
3658 && is_directory (value, "", 0))
3660 char *tmp = xmalloc (len + 2);
3661 strcpy (tmp, value);
3662 tmp[len] = DIR_SEPARATOR;
3663 tmp[++ len] = 0;
3664 value = tmp;
3667 /* As a kludge, if the arg is "[foo/]stageN/", just
3668 add "[foo/]include" to the include prefix. */
3669 if ((len == 7
3670 || (len > 7
3671 && (IS_DIR_SEPARATOR (value[len - 8]))))
3672 && strncmp (value + len - 7, "stage", 5) == 0
3673 && ISDIGIT (value[len - 2])
3674 && (IS_DIR_SEPARATOR (value[len - 1])))
3676 if (len == 7)
3677 add_prefix (&include_prefixes, "./", NULL,
3678 PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
3679 else
3681 char *string = xmalloc (len - 6);
3682 memcpy (string, value, len - 7);
3683 string[len - 7] = 0;
3684 add_prefix (&include_prefixes, string, NULL,
3685 PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
3689 add_prefix (&exec_prefixes, value, NULL,
3690 PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
3691 add_prefix (&startfile_prefixes, value, NULL,
3692 PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
3693 add_prefix (&include_prefixes, value, NULL,
3694 PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
3695 n_switches++;
3697 break;
3699 case 'v': /* Print our subcommands and print versions. */
3700 n_switches++;
3701 /* If they do anything other than exactly `-v', don't set
3702 verbose_flag; rather, continue on to give the error. */
3703 if (p[1] != 0)
3704 break;
3705 verbose_flag++;
3706 break;
3708 case 'S':
3709 case 'c':
3710 if (p[1] == 0)
3712 have_c = 1;
3713 n_switches++;
3714 break;
3716 goto normal_switch;
3718 case 'o':
3719 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3720 if (! have_c)
3722 int skip;
3724 /* Forward scan, just in case -S or -c is specified
3725 after -o. */
3726 int j = i + 1;
3727 if (p[1] == 0)
3728 ++j;
3729 while (j < argc)
3731 if (argv[j][0] == '-')
3733 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3734 && argv[j][2] == 0)
3736 have_c = 1;
3737 break;
3739 else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
3740 j += skip - (argv[j][2] != 0);
3741 else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
3742 j += skip;
3744 j++;
3747 #endif
3748 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3749 if (p[1] == 0)
3750 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
3751 else
3752 argv[i] = convert_filename (argv[i], ! have_c, 0);
3753 #endif
3754 goto normal_switch;
3756 default:
3757 normal_switch:
3759 #ifdef MODIFY_TARGET_NAME
3760 is_modify_target_name = 0;
3762 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
3763 if (! strcmp (argv[i], modify_target[j].sw))
3765 char *new_name = xmalloc (strlen (modify_target[j].str)
3766 + strlen (spec_machine));
3767 const char *p, *r;
3768 char *q;
3769 int made_addition = 0;
3771 is_modify_target_name = 1;
3772 for (p = spec_machine, q = new_name; *p != 0; )
3774 if (modify_target[j].add_del == DELETE
3775 && (! strncmp (q, modify_target[j].str,
3776 strlen (modify_target[j].str))))
3777 p += strlen (modify_target[j].str);
3778 else if (modify_target[j].add_del == ADD
3779 && ! made_addition && *p == '-')
3781 for (r = modify_target[j].str; *r != 0; )
3782 *q++ = *r++;
3783 made_addition = 1;
3786 *q++ = *p++;
3789 spec_machine = new_name;
3792 if (is_modify_target_name)
3793 break;
3794 #endif
3796 n_switches++;
3798 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3799 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3800 else if (WORD_SWITCH_TAKES_ARG (p))
3801 i += WORD_SWITCH_TAKES_ARG (p);
3804 else
3806 n_infiles++;
3807 lang_n_infiles++;
3811 if ((save_temps_flag || report_times) && use_pipes)
3813 /* -save-temps overrides -pipe, so that temp files are produced */
3814 if (save_temps_flag)
3815 error ("warning: -pipe ignored because -save-temps specified");
3816 /* -time overrides -pipe because we can't get correct stats when
3817 multiple children are running at once. */
3818 else if (report_times)
3819 error ("warning: -pipe ignored because -time specified");
3821 use_pipes = 0;
3824 /* Set up the search paths before we go looking for config files. */
3826 /* These come before the md prefixes so that we will find gcc's subcommands
3827 (such as cpp) rather than those of the host system. */
3828 /* Use 2 as fourth arg meaning try just the machine as a suffix,
3829 as well as trying the machine and the version. */
3830 #ifndef OS2
3831 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
3832 PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
3833 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
3834 PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
3835 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3836 PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
3837 add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3838 PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
3839 add_prefix (&exec_prefixes, standard_exec_prefix_2, "BINUTILS",
3840 PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
3841 #endif
3843 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3844 PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
3845 add_prefix (&startfile_prefixes, standard_exec_prefix_2, "BINUTILS",
3846 PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
3848 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3849 dir_separator_str, NULL);
3851 /* If tooldir is relative, base it on exec_prefixes. A relative
3852 tooldir lets us move the installed tree as a unit.
3854 If GCC_EXEC_PREFIX is defined, then we want to add two relative
3855 directories, so that we can search both the user specified directory
3856 and the standard place. */
3858 if (!IS_ABSOLUTE_PATH (tooldir_prefix))
3860 if (gcc_exec_prefix)
3862 char *gcc_exec_tooldir_prefix
3863 = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3864 spec_version, dir_separator_str, tooldir_prefix, NULL);
3866 add_prefix (&exec_prefixes,
3867 concat (gcc_exec_tooldir_prefix, "bin",
3868 dir_separator_str, NULL),
3869 NULL, PREFIX_PRIORITY_LAST, 0, NULL, 0);
3870 add_prefix (&startfile_prefixes,
3871 concat (gcc_exec_tooldir_prefix, "lib",
3872 dir_separator_str, NULL),
3873 NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
3876 tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3877 dir_separator_str, spec_version,
3878 dir_separator_str, tooldir_prefix, NULL);
3881 add_prefix (&exec_prefixes,
3882 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
3883 "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 0);
3884 add_prefix (&startfile_prefixes,
3885 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
3886 "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1);
3888 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
3889 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
3890 then consider it to relocate with the rest of the GCC installation
3891 if GCC_EXEC_PREFIX is set.
3892 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
3893 if (target_system_root && gcc_exec_prefix)
3895 char *tmp_prefix = make_relative_prefix (argv[0],
3896 standard_bindir_prefix,
3897 target_system_root);
3898 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
3900 target_system_root = tmp_prefix;
3901 target_system_root_changed = 1;
3904 #endif
3906 /* More prefixes are enabled in main, after we read the specs file
3907 and determine whether this is cross-compilation or not. */
3909 /* Then create the space for the vectors and scan again. */
3911 switches = xmalloc ((n_switches + 1) * sizeof (struct switchstr));
3912 infiles = xmalloc ((n_infiles + 1) * sizeof (struct infile));
3913 n_switches = 0;
3914 n_infiles = 0;
3915 last_language_n_infiles = -1;
3917 /* This, time, copy the text of each switch and store a pointer
3918 to the copy in the vector of switches.
3919 Store all the infiles in their vector. */
3921 for (i = 1; i < argc; i++)
3923 /* Just skip the switches that were handled by the preceding loop. */
3924 #ifdef MODIFY_TARGET_NAME
3925 is_modify_target_name = 0;
3927 for (j = 0; j < ARRAY_SIZE (modify_target); j++)
3928 if (! strcmp (argv[i], modify_target[j].sw))
3929 is_modify_target_name = 1;
3931 if (is_modify_target_name)
3933 else
3934 #endif
3935 if (! strncmp (argv[i], "-Wa,", 4))
3937 else if (! strncmp (argv[i], "-Wp,", 4))
3939 else if (! strcmp (argv[i], "-pass-exit-codes"))
3941 else if (! strcmp (argv[i], "-print-search-dirs"))
3943 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3945 else if (! strncmp (argv[i], "-print-file-name=", 17))
3947 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3949 else if (! strcmp (argv[i], "-print-multi-lib"))
3951 else if (! strcmp (argv[i], "-print-multi-directory"))
3953 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3955 else if (! strcmp (argv[i], "-ftarget-help"))
3957 else if (! strcmp (argv[i], "-fhelp"))
3959 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3961 /* Compensate for the +e options to the C++ front-end;
3962 they're there simply for cfront call-compatibility. We do
3963 some magic in default_compilers to pass them down properly.
3964 Note we deliberately start at the `+' here, to avoid passing
3965 -e0 or -e1 down into the linker. */
3966 switches[n_switches].part1 = &argv[i][0];
3967 switches[n_switches].args = 0;
3968 switches[n_switches].live_cond = SWITCH_OK;
3969 switches[n_switches].validated = 0;
3970 n_switches++;
3972 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3974 int prev, j;
3975 /* Split the argument at commas. */
3976 prev = 4;
3977 for (j = 4; argv[i][j]; j++)
3978 if (argv[i][j] == ',')
3980 infiles[n_infiles].language = "*";
3981 infiles[n_infiles++].name
3982 = save_string (argv[i] + prev, j - prev);
3983 prev = j + 1;
3985 /* Record the part after the last comma. */
3986 infiles[n_infiles].language = "*";
3987 infiles[n_infiles++].name = argv[i] + prev;
3989 else if (strcmp (argv[i], "-Xlinker") == 0)
3991 infiles[n_infiles].language = "*";
3992 infiles[n_infiles++].name = argv[++i];
3994 else if (strcmp (argv[i], "-Xassembler") == 0)
3996 infiles[n_infiles].language = "*";
3997 infiles[n_infiles++].name = argv[++i];
3999 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
4001 infiles[n_infiles].language = "*";
4002 infiles[n_infiles++].name = argv[++i];
4004 else if (strcmp (argv[i], "-l") == 0)
4005 { /* POSIX allows separation of -l and the lib arg;
4006 canonicalize by concatenating -l with its arg */
4007 infiles[n_infiles].language = "*";
4008 infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
4010 else if (strncmp (argv[i], "-l", 2) == 0)
4012 infiles[n_infiles].language = "*";
4013 infiles[n_infiles++].name = argv[i];
4015 else if (strcmp (argv[i], "-specs") == 0)
4016 i++;
4017 else if (strncmp (argv[i], "-specs=", 7) == 0)
4019 else if (strcmp (argv[i], "-time") == 0)
4021 else if (strcmp (argv[i], "-###") == 0)
4023 else if (argv[i][0] == '-' && argv[i][1] != 0)
4025 const char *p = &argv[i][1];
4026 int c = *p;
4028 if (c == 'x')
4030 if (p[1] == 0 && i + 1 == argc)
4031 fatal ("argument to `-x' is missing");
4032 if (p[1] == 0)
4033 spec_lang = argv[++i];
4034 else
4035 spec_lang = p + 1;
4036 if (! strcmp (spec_lang, "none"))
4037 /* Suppress the warning if -xnone comes after the last input
4038 file, because alternate command interfaces like g++ might
4039 find it useful to place -xnone after each input file. */
4040 spec_lang = 0;
4041 else
4042 last_language_n_infiles = n_infiles;
4043 continue;
4045 switches[n_switches].part1 = p;
4046 /* Deal with option arguments in separate argv elements. */
4047 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4048 || WORD_SWITCH_TAKES_ARG (p))
4050 int j = 0;
4051 int n_args = WORD_SWITCH_TAKES_ARG (p);
4053 if (n_args == 0)
4055 /* Count only the option arguments in separate argv elements. */
4056 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4058 if (i + n_args >= argc)
4059 fatal ("argument to `-%s' is missing", p);
4060 switches[n_switches].args
4061 = xmalloc ((n_args + 1) * sizeof(const char *));
4062 while (j < n_args)
4063 switches[n_switches].args[j++] = argv[++i];
4064 /* Null-terminate the vector. */
4065 switches[n_switches].args[j] = 0;
4067 else if (strchr (switches_need_spaces, c))
4069 /* On some systems, ld cannot handle some options without
4070 a space. So split the option from its argument. */
4071 char *part1 = xmalloc (2);
4072 part1[0] = c;
4073 part1[1] = '\0';
4075 switches[n_switches].part1 = part1;
4076 switches[n_switches].args = xmalloc (2 * sizeof (const char *));
4077 switches[n_switches].args[0] = xstrdup (p+1);
4078 switches[n_switches].args[1] = 0;
4080 else
4081 switches[n_switches].args = 0;
4083 switches[n_switches].live_cond = SWITCH_OK;
4084 switches[n_switches].validated = 0;
4085 switches[n_switches].ordering = 0;
4086 /* These are always valid, since gcc.c itself understands them. */
4087 if (!strcmp (p, "save-temps")
4088 || !strcmp (p, "static-libgcc")
4089 || !strcmp (p, "shared-libgcc")
4090 || !strcmp (p, "pipe"))
4091 switches[n_switches].validated = 1;
4092 else
4094 char ch = switches[n_switches].part1[0];
4095 if (ch == 'B')
4096 switches[n_switches].validated = 1;
4098 n_switches++;
4100 else
4102 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4103 argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
4104 #endif
4106 if (strcmp (argv[i], "-") != 0 && access (argv[i], F_OK) < 0)
4108 perror_with_name (argv[i]);
4109 error_count++;
4111 else
4113 infiles[n_infiles].language = spec_lang;
4114 infiles[n_infiles++].name = argv[i];
4119 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4120 error ("warning: `-x %s' after last input file has no effect", spec_lang);
4122 /* Ensure we only invoke each subprocess once. */
4123 if (target_help_flag || print_help_list)
4125 n_infiles = 1;
4127 /* Create a dummy input file, so that we can pass --target-help on to
4128 the various sub-processes. */
4129 infiles[0].language = "c";
4130 infiles[0].name = "help-dummy";
4132 if (target_help_flag)
4134 switches[n_switches].part1 = "--target-help";
4135 switches[n_switches].args = 0;
4136 switches[n_switches].live_cond = SWITCH_OK;
4137 switches[n_switches].validated = 0;
4139 n_switches++;
4142 if (print_help_list)
4144 switches[n_switches].part1 = "--help";
4145 switches[n_switches].args = 0;
4146 switches[n_switches].live_cond = SWITCH_OK;
4147 switches[n_switches].validated = 0;
4149 n_switches++;
4153 switches[n_switches].part1 = 0;
4154 infiles[n_infiles].name = 0;
4157 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4158 and place that in the environment. */
4160 static void
4161 set_collect_gcc_options (void)
4163 int i;
4164 int first_time;
4166 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4167 the compiler. */
4168 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4169 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4171 first_time = TRUE;
4172 for (i = 0; (int) i < n_switches; i++)
4174 const char *const *args;
4175 const char *p, *q;
4176 if (!first_time)
4177 obstack_grow (&collect_obstack, " ", 1);
4179 first_time = FALSE;
4181 /* Ignore elided switches. */
4182 if (switches[i].live_cond == SWITCH_IGNORE)
4183 continue;
4185 obstack_grow (&collect_obstack, "'-", 2);
4186 q = switches[i].part1;
4187 while ((p = strchr (q, '\'')))
4189 obstack_grow (&collect_obstack, q, p - q);
4190 obstack_grow (&collect_obstack, "'\\''", 4);
4191 q = ++p;
4193 obstack_grow (&collect_obstack, q, strlen (q));
4194 obstack_grow (&collect_obstack, "'", 1);
4196 for (args = switches[i].args; args && *args; args++)
4198 obstack_grow (&collect_obstack, " '", 2);
4199 q = *args;
4200 while ((p = strchr (q, '\'')))
4202 obstack_grow (&collect_obstack, q, p - q);
4203 obstack_grow (&collect_obstack, "'\\''", 4);
4204 q = ++p;
4206 obstack_grow (&collect_obstack, q, strlen (q));
4207 obstack_grow (&collect_obstack, "'", 1);
4210 obstack_grow (&collect_obstack, "\0", 1);
4211 putenv (obstack_finish (&collect_obstack));
4214 /* Process a spec string, accumulating and running commands. */
4216 /* These variables describe the input file name.
4217 input_file_number is the index on outfiles of this file,
4218 so that the output file name can be stored for later use by %o.
4219 input_basename is the start of the part of the input file
4220 sans all directory names, and basename_length is the number
4221 of characters starting there excluding the suffix .c or whatever. */
4223 static const char *input_filename;
4224 static int input_file_number;
4225 size_t input_filename_length;
4226 static int basename_length;
4227 static int suffixed_basename_length;
4228 static const char *input_basename;
4229 static const char *input_suffix;
4230 static struct stat input_stat;
4231 static int input_stat_set;
4233 /* The compiler used to process the current input file. */
4234 static struct compiler *input_file_compiler;
4236 /* These are variables used within do_spec and do_spec_1. */
4238 /* Nonzero if an arg has been started and not yet terminated
4239 (with space, tab or newline). */
4240 static int arg_going;
4242 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4243 is a temporary file name. */
4244 static int delete_this_arg;
4246 /* Nonzero means %w has been seen; the next arg to be terminated
4247 is the output file name of this compilation. */
4248 static int this_is_output_file;
4250 /* Nonzero means %s has been seen; the next arg to be terminated
4251 is the name of a library file and we should try the standard
4252 search dirs for it. */
4253 static int this_is_library_file;
4255 /* Nonzero means that the input of this command is coming from a pipe. */
4256 static int input_from_pipe;
4258 /* Nonnull means substitute this for any suffix when outputting a switches
4259 arguments. */
4260 static const char *suffix_subst;
4262 /* Process the spec SPEC and run the commands specified therein.
4263 Returns 0 if the spec is successfully processed; -1 if failed. */
4266 do_spec (const char *spec)
4268 int value;
4270 value = do_spec_2 (spec);
4272 /* Force out any unfinished command.
4273 If -pipe, this forces out the last command if it ended in `|'. */
4274 if (value == 0)
4276 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4277 argbuf_index--;
4279 set_collect_gcc_options ();
4281 if (argbuf_index > 0)
4282 value = execute ();
4285 return value;
4288 static int
4289 do_spec_2 (const char *spec)
4291 const char *string;
4292 int result;
4294 clear_args ();
4295 arg_going = 0;
4296 delete_this_arg = 0;
4297 this_is_output_file = 0;
4298 this_is_library_file = 0;
4299 input_from_pipe = 0;
4300 suffix_subst = NULL;
4302 result = do_spec_1 (spec, 0, NULL);
4304 /* End any pending argument. */
4305 if (arg_going)
4307 obstack_1grow (&obstack, 0);
4308 string = obstack_finish (&obstack);
4309 if (this_is_library_file)
4310 string = find_file (string);
4311 store_arg (string, delete_this_arg, this_is_output_file);
4312 if (this_is_output_file)
4313 outfiles[input_file_number] = string;
4314 arg_going = 0;
4317 return result;
4321 /* Process the given spec string and add any new options to the end
4322 of the switches/n_switches array. */
4324 static void
4325 do_option_spec (const char *name, const char *spec)
4327 unsigned int i, value_count, value_len;
4328 const char *p, *q, *value;
4329 char *tmp_spec, *tmp_spec_p;
4331 if (configure_default_options[0].name == NULL)
4332 return;
4334 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4335 if (strcmp (configure_default_options[i].name, name) == 0)
4336 break;
4337 if (i == ARRAY_SIZE (configure_default_options))
4338 return;
4340 value = configure_default_options[i].value;
4341 value_len = strlen (value);
4343 /* Compute the size of the final spec. */
4344 value_count = 0;
4345 p = spec;
4346 while ((p = strstr (p, "%(VALUE)")) != NULL)
4348 p ++;
4349 value_count ++;
4352 /* Replace each %(VALUE) by the specified value. */
4353 tmp_spec = alloca (strlen (spec) + 1
4354 + value_count * (value_len - strlen ("%(VALUE)")));
4355 tmp_spec_p = tmp_spec;
4356 q = spec;
4357 while ((p = strstr (q, "%(VALUE)")) != NULL)
4359 memcpy (tmp_spec_p, q, p - q);
4360 tmp_spec_p = tmp_spec_p + (p - q);
4361 memcpy (tmp_spec_p, value, value_len);
4362 tmp_spec_p += value_len;
4363 q = p + strlen ("%(VALUE)");
4365 strcpy (tmp_spec_p, q);
4367 do_self_spec (tmp_spec);
4370 /* Process the given spec string and add any new options to the end
4371 of the switches/n_switches array. */
4373 static void
4374 do_self_spec (const char *spec)
4376 do_spec_2 (spec);
4377 do_spec_1 (" ", 0, NULL);
4379 if (argbuf_index > 0)
4381 int i, first;
4383 first = n_switches;
4384 n_switches += argbuf_index;
4385 switches = xrealloc (switches,
4386 sizeof (struct switchstr) * (n_switches + 1));
4388 switches[n_switches] = switches[first];
4389 for (i = 0; i < argbuf_index; i++)
4391 struct switchstr *sw;
4393 /* Each switch should start with '-'. */
4394 if (argbuf[i][0] != '-')
4395 abort ();
4397 sw = &switches[i + first];
4398 sw->part1 = &argbuf[i][1];
4399 sw->args = 0;
4400 sw->live_cond = SWITCH_OK;
4401 sw->validated = 0;
4402 sw->ordering = 0;
4407 void
4408 do_spec_path (struct prefix_list *pl, const char *option,
4409 int omit_if_relative, int separate_options,
4410 int only_subdir,
4411 const char *dir_for_machine_suffix,
4412 const char *dir_for_no_suffix)
4414 static size_t bufsize = 0;
4415 static char *buffer;
4416 int idx;
4418 /* Used on systems which record the specified -L dirs
4419 and use them to search for dynamic linking. */
4420 /* Relative directories always come from -B,
4421 and it is better not to use them for searching
4422 at run time. In particular, stage1 loses. */
4423 if (omit_if_relative
4424 && !IS_ABSOLUTE_PATH (pl->prefix))
4425 return;
4427 /* Try subdirectory if there is one. */
4428 if (machine_suffix && dir_for_machine_suffix)
4430 if (strlen (pl->prefix) + strlen (machine_suffix)
4431 >= bufsize)
4432 bufsize = (strlen (pl->prefix)
4433 + strlen (machine_suffix)) * 2 + 1;
4434 buffer = xrealloc (buffer, bufsize);
4435 strcpy (buffer, pl->prefix);
4436 strcat (buffer, machine_suffix);
4437 if (is_directory (buffer, dir_for_machine_suffix, 1))
4439 do_spec_1 (option, separate_options, NULL);
4440 if (separate_options)
4441 do_spec_1 (" ", 0, NULL);
4442 do_spec_1 (buffer, 1, NULL);
4443 do_spec_1 (dir_for_machine_suffix, 1, NULL);
4444 /* Make this a separate argument. */
4445 do_spec_1 (" ", 0, NULL);
4448 if (!pl->require_machine_suffix && dir_for_no_suffix)
4450 if (is_directory (pl->prefix, dir_for_no_suffix, 1))
4452 do_spec_1 (option, separate_options, NULL);
4453 if (separate_options)
4454 do_spec_1 (" ", 0, NULL);
4455 do_spec_1 (pl->prefix, 1, NULL);
4456 do_spec_1 (dir_for_no_suffix, 1, NULL);
4457 /* Make this a separate argument. */
4458 do_spec_1 (" ", 0, NULL);
4462 if (only_subdir)
4463 return;
4465 if (machine_suffix)
4467 if (is_directory (pl->prefix, machine_suffix, 1))
4469 do_spec_1 (option, separate_options, NULL);
4470 if (separate_options)
4471 do_spec_1 (" ", 0, NULL);
4472 do_spec_1 (pl->prefix, 1, NULL);
4473 /* Remove slash from machine_suffix. */
4474 if (strlen (machine_suffix) >= bufsize)
4475 bufsize = strlen (machine_suffix) * 2 + 1;
4476 buffer = xrealloc (buffer, bufsize);
4477 strcpy (buffer, machine_suffix);
4478 idx = strlen (buffer);
4479 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4480 buffer[idx - 1] = 0;
4481 do_spec_1 (buffer, 1, NULL);
4482 /* Make this a separate argument. */
4483 do_spec_1 (" ", 0, NULL);
4486 if (!pl->require_machine_suffix)
4488 if (is_directory (pl->prefix, "", 1))
4490 do_spec_1 (option, separate_options, NULL);
4491 if (separate_options)
4492 do_spec_1 (" ", 0, NULL);
4493 /* Remove slash from pl->prefix. */
4494 if (strlen (pl->prefix) >= bufsize)
4495 bufsize = strlen (pl->prefix) * 2 + 1;
4496 buffer = xrealloc (buffer, bufsize);
4497 strcpy (buffer, pl->prefix);
4498 idx = strlen (buffer);
4499 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4500 buffer[idx - 1] = 0;
4501 do_spec_1 (buffer, 1, NULL);
4502 /* Make this a separate argument. */
4503 do_spec_1 (" ", 0, NULL);
4508 /* Process the sub-spec SPEC as a portion of a larger spec.
4509 This is like processing a whole spec except that we do
4510 not initialize at the beginning and we do not supply a
4511 newline by default at the end.
4512 INSWITCH nonzero means don't process %-sequences in SPEC;
4513 in this case, % is treated as an ordinary character.
4514 This is used while substituting switches.
4515 INSWITCH nonzero also causes SPC not to terminate an argument.
4517 Value is zero unless a line was finished
4518 and the command on that line reported an error. */
4520 static int
4521 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4523 const char *p = spec;
4524 int c;
4525 int i;
4526 const char *string;
4527 int value;
4529 while ((c = *p++))
4530 /* If substituting a switch, treat all chars like letters.
4531 Otherwise, NL, SPC, TAB and % are special. */
4532 switch (inswitch ? 'a' : c)
4534 case '\n':
4535 /* End of line: finish any pending argument,
4536 then run the pending command if one has been started. */
4537 if (arg_going)
4539 obstack_1grow (&obstack, 0);
4540 string = obstack_finish (&obstack);
4541 if (this_is_library_file)
4542 string = find_file (string);
4543 store_arg (string, delete_this_arg, this_is_output_file);
4544 if (this_is_output_file)
4545 outfiles[input_file_number] = string;
4547 arg_going = 0;
4549 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4551 /* A `|' before the newline means use a pipe here,
4552 but only if -pipe was specified.
4553 Otherwise, execute now and don't pass the `|' as an arg. */
4554 if (use_pipes)
4556 input_from_pipe = 1;
4557 break;
4559 else
4560 argbuf_index--;
4563 set_collect_gcc_options ();
4565 if (argbuf_index > 0)
4567 value = execute ();
4568 if (value)
4569 return value;
4571 /* Reinitialize for a new command, and for a new argument. */
4572 clear_args ();
4573 arg_going = 0;
4574 delete_this_arg = 0;
4575 this_is_output_file = 0;
4576 this_is_library_file = 0;
4577 input_from_pipe = 0;
4578 break;
4580 case '|':
4581 /* End any pending argument. */
4582 if (arg_going)
4584 obstack_1grow (&obstack, 0);
4585 string = obstack_finish (&obstack);
4586 if (this_is_library_file)
4587 string = find_file (string);
4588 store_arg (string, delete_this_arg, this_is_output_file);
4589 if (this_is_output_file)
4590 outfiles[input_file_number] = string;
4593 /* Use pipe */
4594 obstack_1grow (&obstack, c);
4595 arg_going = 1;
4596 break;
4598 case '\t':
4599 case ' ':
4600 /* Space or tab ends an argument if one is pending. */
4601 if (arg_going)
4603 obstack_1grow (&obstack, 0);
4604 string = obstack_finish (&obstack);
4605 if (this_is_library_file)
4606 string = find_file (string);
4607 store_arg (string, delete_this_arg, this_is_output_file);
4608 if (this_is_output_file)
4609 outfiles[input_file_number] = string;
4611 /* Reinitialize for a new argument. */
4612 arg_going = 0;
4613 delete_this_arg = 0;
4614 this_is_output_file = 0;
4615 this_is_library_file = 0;
4616 break;
4618 case '%':
4619 switch (c = *p++)
4621 case 0:
4622 fatal ("invalid specification! Bug in cc");
4624 case 'b':
4625 obstack_grow (&obstack, input_basename, basename_length);
4626 arg_going = 1;
4627 break;
4629 case 'B':
4630 obstack_grow (&obstack, input_basename, suffixed_basename_length);
4631 arg_going = 1;
4632 break;
4634 case 'd':
4635 delete_this_arg = 2;
4636 break;
4638 /* Dump out the directories specified with LIBRARY_PATH,
4639 followed by the absolute directories
4640 that we search for startfiles. */
4641 case 'D':
4643 struct prefix_list *pl = startfile_prefixes.plist;
4645 for (; pl; pl = pl->next)
4647 const char *no_suffix_multilib_dir;
4649 no_suffix_multilib_dir = pl->os_multilib ? multilib_os_dir
4650 : multilib_dir;
4651 /* Do not separate options, include non-multilibbed variant. */
4652 do_spec_path (pl, "-L",
4653 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4655 #else
4657 #endif
4658 0, 0, multilib_dir, no_suffix_multilib_dir);
4661 break;
4663 case 'e':
4664 /* %efoo means report an error with `foo' as error message
4665 and don't execute any more commands for this file. */
4667 const char *q = p;
4668 char *buf;
4669 while (*p != 0 && *p != '\n')
4670 p++;
4671 buf = alloca (p - q + 1);
4672 strncpy (buf, q, p - q);
4673 buf[p - q] = 0;
4674 error ("%s", buf);
4675 return -1;
4677 break;
4678 case 'n':
4679 /* %nfoo means report a notice with `foo' on stderr. */
4681 const char *q = p;
4682 char *buf;
4683 while (*p != 0 && *p != '\n')
4684 p++;
4685 buf = alloca (p - q + 1);
4686 strncpy (buf, q, p - q);
4687 buf[p - q] = 0;
4688 notice ("%s\n", buf);
4689 if (*p)
4690 p++;
4692 break;
4694 case 'j':
4696 struct stat st;
4698 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
4699 defined, and it is not a directory, and it is
4700 writable, use it. Otherwise, treat this like any
4701 other temporary file. */
4703 if ((!save_temps_flag)
4704 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4705 && (access (HOST_BIT_BUCKET, W_OK) == 0))
4707 obstack_grow (&obstack, HOST_BIT_BUCKET,
4708 strlen (HOST_BIT_BUCKET));
4709 delete_this_arg = 0;
4710 arg_going = 1;
4711 break;
4714 goto create_temp_file;
4715 case '|':
4716 if (use_pipes)
4718 obstack_1grow (&obstack, '-');
4719 delete_this_arg = 0;
4720 arg_going = 1;
4722 /* consume suffix */
4723 while (*p == '.' || ISALPHA ((unsigned char) *p))
4724 p++;
4725 if (p[0] == '%' && p[1] == 'O')
4726 p += 2;
4728 break;
4730 goto create_temp_file;
4731 case 'm':
4732 if (use_pipes)
4734 /* consume suffix */
4735 while (*p == '.' || ISALPHA ((unsigned char) *p))
4736 p++;
4737 if (p[0] == '%' && p[1] == 'O')
4738 p += 2;
4740 break;
4742 goto create_temp_file;
4743 case 'g':
4744 case 'u':
4745 case 'U':
4746 create_temp_file:
4748 struct temp_name *t;
4749 int suffix_length;
4750 const char *suffix = p;
4751 char *saved_suffix = NULL;
4753 while (*p == '.' || ISALPHA ((unsigned char) *p))
4754 p++;
4755 suffix_length = p - suffix;
4756 if (p[0] == '%' && p[1] == 'O')
4758 p += 2;
4759 /* We don't support extra suffix characters after %O. */
4760 if (*p == '.' || ISALPHA ((unsigned char) *p))
4761 abort ();
4762 if (suffix_length == 0)
4763 suffix = TARGET_OBJECT_SUFFIX;
4764 else
4766 saved_suffix
4767 = xmalloc (suffix_length
4768 + strlen (TARGET_OBJECT_SUFFIX));
4769 strncpy (saved_suffix, suffix, suffix_length);
4770 strcpy (saved_suffix + suffix_length,
4771 TARGET_OBJECT_SUFFIX);
4773 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4776 /* If the input_filename has the same suffix specified
4777 for the %g, %u, or %U, and -save-temps is specified,
4778 we could end up using that file as an intermediate
4779 thus clobbering the user's source file (.e.g.,
4780 gcc -save-temps foo.s would clobber foo.s with the
4781 output of cpp0). So check for this condition and
4782 generate a temp file as the intermediate. */
4784 if (save_temps_flag)
4786 temp_filename_length = basename_length + suffix_length;
4787 temp_filename = alloca (temp_filename_length + 1);
4788 strncpy ((char *) temp_filename, input_basename, basename_length);
4789 strncpy ((char *) temp_filename + basename_length, suffix,
4790 suffix_length);
4791 *((char *) temp_filename + temp_filename_length) = '\0';
4792 if (strcmp (temp_filename, input_filename) != 0)
4794 struct stat st_temp;
4796 /* Note, set_input() resets input_stat_set to 0. */
4797 if (input_stat_set == 0)
4799 input_stat_set = stat (input_filename, &input_stat);
4800 if (input_stat_set >= 0)
4801 input_stat_set = 1;
4804 /* If we have the stat for the input_filename
4805 and we can do the stat for the temp_filename
4806 then the they could still refer to the same
4807 file if st_dev/st_ino's are the same. */
4809 if (input_stat_set != 1
4810 || stat (temp_filename, &st_temp) < 0
4811 || input_stat.st_dev != st_temp.st_dev
4812 || input_stat.st_ino != st_temp.st_ino)
4814 temp_filename = save_string (temp_filename,
4815 temp_filename_length + 1);
4816 obstack_grow (&obstack, temp_filename,
4817 temp_filename_length);
4818 arg_going = 1;
4819 delete_this_arg = 0;
4820 break;
4825 /* See if we already have an association of %g/%u/%U and
4826 suffix. */
4827 for (t = temp_names; t; t = t->next)
4828 if (t->length == suffix_length
4829 && strncmp (t->suffix, suffix, suffix_length) == 0
4830 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
4831 break;
4833 /* Make a new association if needed. %u and %j
4834 require one. */
4835 if (t == 0 || c == 'u' || c == 'j')
4837 if (t == 0)
4839 t = xmalloc (sizeof (struct temp_name));
4840 t->next = temp_names;
4841 temp_names = t;
4843 t->length = suffix_length;
4844 if (saved_suffix)
4846 t->suffix = saved_suffix;
4847 saved_suffix = NULL;
4849 else
4850 t->suffix = save_string (suffix, suffix_length);
4851 t->unique = (c == 'u' || c == 'U' || c == 'j');
4852 temp_filename = make_temp_file (t->suffix);
4853 temp_filename_length = strlen (temp_filename);
4854 t->filename = temp_filename;
4855 t->filename_length = temp_filename_length;
4858 if (saved_suffix)
4859 free (saved_suffix);
4861 obstack_grow (&obstack, t->filename, t->filename_length);
4862 delete_this_arg = 1;
4864 arg_going = 1;
4865 break;
4867 case 'i':
4868 if (combine_inputs)
4870 for (i = 0; (int) i < n_infiles; i++)
4871 if ((!infiles[i].language) || (infiles[i].language[0] != '*'))
4872 if (infiles[i].incompiler == input_file_compiler)
4874 store_arg (infiles[i].name, 0, 0);
4875 infiles[i].compiled = true;
4878 else
4880 obstack_grow (&obstack, input_filename, input_filename_length);
4881 arg_going = 1;
4883 break;
4885 case 'I':
4887 struct prefix_list *pl = include_prefixes.plist;
4889 if (gcc_exec_prefix)
4891 do_spec_1 ("-iprefix", 1, NULL);
4892 /* Make this a separate argument. */
4893 do_spec_1 (" ", 0, NULL);
4894 do_spec_1 (gcc_exec_prefix, 1, NULL);
4895 do_spec_1 (" ", 0, NULL);
4898 if (target_system_root_changed ||
4899 (target_system_root && target_sysroot_hdrs_suffix))
4901 do_spec_1 ("-isysroot", 1, NULL);
4902 /* Make this a separate argument. */
4903 do_spec_1 (" ", 0, NULL);
4904 do_spec_1 (target_system_root, 1, NULL);
4905 if (target_sysroot_hdrs_suffix)
4906 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
4907 do_spec_1 (" ", 0, NULL);
4910 for (; pl; pl = pl->next)
4911 /* Separate options, don't include non-suffixed variant. */
4912 do_spec_path (pl, "-isystem", 0, 1, 1, "include", "include");
4914 break;
4916 case 'o':
4918 int max = n_infiles;
4919 max += lang_specific_extra_outfiles;
4921 for (i = 0; i < max; i++)
4922 if (outfiles[i])
4923 store_arg (outfiles[i], 0, 0);
4924 break;
4927 case 'O':
4928 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4929 arg_going = 1;
4930 break;
4932 case 's':
4933 this_is_library_file = 1;
4934 break;
4936 case 'V':
4937 outfiles[input_file_number] = NULL;
4938 break;
4940 case 'w':
4941 this_is_output_file = 1;
4942 break;
4944 case 'W':
4946 int cur_index = argbuf_index;
4947 /* Handle the {...} following the %W. */
4948 if (*p != '{')
4949 abort ();
4950 p = handle_braces (p + 1);
4951 if (p == 0)
4952 return -1;
4953 /* End any pending argument. */
4954 if (arg_going)
4956 obstack_1grow (&obstack, 0);
4957 string = obstack_finish (&obstack);
4958 if (this_is_library_file)
4959 string = find_file (string);
4960 store_arg (string, delete_this_arg, this_is_output_file);
4961 if (this_is_output_file)
4962 outfiles[input_file_number] = string;
4963 arg_going = 0;
4965 /* If any args were output, mark the last one for deletion
4966 on failure. */
4967 if (argbuf_index != cur_index)
4968 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4969 break;
4972 /* %x{OPTION} records OPTION for %X to output. */
4973 case 'x':
4975 const char *p1 = p;
4976 char *string;
4978 /* Skip past the option value and make a copy. */
4979 if (*p != '{')
4980 abort ();
4981 while (*p++ != '}')
4983 string = save_string (p1 + 1, p - p1 - 2);
4985 /* See if we already recorded this option. */
4986 for (i = 0; i < n_linker_options; i++)
4987 if (! strcmp (string, linker_options[i]))
4989 free (string);
4990 return 0;
4993 /* This option is new; add it. */
4994 add_linker_option (string, strlen (string));
4996 break;
4998 /* Dump out the options accumulated previously using %x. */
4999 case 'X':
5000 for (i = 0; i < n_linker_options; i++)
5002 do_spec_1 (linker_options[i], 1, NULL);
5003 /* Make each accumulated option a separate argument. */
5004 do_spec_1 (" ", 0, NULL);
5006 break;
5008 /* Dump out the options accumulated previously using -Wa,. */
5009 case 'Y':
5010 for (i = 0; i < n_assembler_options; i++)
5012 do_spec_1 (assembler_options[i], 1, NULL);
5013 /* Make each accumulated option a separate argument. */
5014 do_spec_1 (" ", 0, NULL);
5016 break;
5018 /* Dump out the options accumulated previously using -Wp,. */
5019 case 'Z':
5020 for (i = 0; i < n_preprocessor_options; i++)
5022 do_spec_1 (preprocessor_options[i], 1, NULL);
5023 /* Make each accumulated option a separate argument. */
5024 do_spec_1 (" ", 0, NULL);
5026 break;
5028 /* Here are digits and numbers that just process
5029 a certain constant string as a spec. */
5031 case '1':
5032 value = do_spec_1 (cc1_spec, 0, NULL);
5033 if (value != 0)
5034 return value;
5035 break;
5037 case '2':
5038 value = do_spec_1 (cc1plus_spec, 0, NULL);
5039 if (value != 0)
5040 return value;
5041 break;
5043 case 'a':
5044 value = do_spec_1 (asm_spec, 0, NULL);
5045 if (value != 0)
5046 return value;
5047 break;
5049 case 'A':
5050 value = do_spec_1 (asm_final_spec, 0, NULL);
5051 if (value != 0)
5052 return value;
5053 break;
5055 case 'C':
5057 const char *const spec
5058 = (input_file_compiler->cpp_spec
5059 ? input_file_compiler->cpp_spec
5060 : cpp_spec);
5061 value = do_spec_1 (spec, 0, NULL);
5062 if (value != 0)
5063 return value;
5065 break;
5067 case 'E':
5068 value = do_spec_1 (endfile_spec, 0, NULL);
5069 if (value != 0)
5070 return value;
5071 break;
5073 case 'l':
5074 value = do_spec_1 (link_spec, 0, NULL);
5075 if (value != 0)
5076 return value;
5077 break;
5079 case 'L':
5080 value = do_spec_1 (lib_spec, 0, NULL);
5081 if (value != 0)
5082 return value;
5083 break;
5085 case 'G':
5086 value = do_spec_1 (libgcc_spec, 0, NULL);
5087 if (value != 0)
5088 return value;
5089 break;
5091 case 'M':
5092 if (multilib_dir && strcmp (multilib_dir, ".") != 0)
5094 char *p;
5095 const char *q;
5096 size_t len;
5098 len = strlen (multilib_dir);
5099 obstack_blank (&obstack, len + 1);
5100 p = obstack_next_free (&obstack) - (len + 1);
5102 *p++ = '_';
5103 for (q = multilib_dir; *q ; ++q, ++p)
5104 *p = (IS_DIR_SEPARATOR (*q) ? '_' : *q);
5106 break;
5108 case 'R':
5109 /* We assume there is a directory
5110 separator at the end of this string. */
5111 if (target_system_root)
5113 obstack_grow (&obstack, target_system_root,
5114 strlen (target_system_root));
5115 if (target_sysroot_suffix)
5116 obstack_grow (&obstack, target_sysroot_suffix,
5117 strlen (target_sysroot_suffix));
5119 break;
5121 case 'S':
5122 value = do_spec_1 (startfile_spec, 0, NULL);
5123 if (value != 0)
5124 return value;
5125 break;
5127 /* Here we define characters other than letters and digits. */
5129 case '{':
5130 p = handle_braces (p);
5131 if (p == 0)
5132 return -1;
5133 break;
5135 case ':':
5136 p = handle_spec_function (p);
5137 if (p == 0)
5138 return -1;
5139 break;
5141 case '%':
5142 obstack_1grow (&obstack, '%');
5143 break;
5145 case '.':
5147 unsigned len = 0;
5149 while (p[len] && p[len] != ' ' && p[len] != '%')
5150 len++;
5151 suffix_subst = save_string (p - 1, len + 1);
5152 p += len;
5154 break;
5156 /* Henceforth ignore the option(s) matching the pattern
5157 after the %<. */
5158 case '<':
5160 unsigned len = 0;
5161 int have_wildcard = 0;
5162 int i;
5164 while (p[len] && p[len] != ' ' && p[len] != '\t')
5165 len++;
5167 if (p[len-1] == '*')
5168 have_wildcard = 1;
5170 for (i = 0; i < n_switches; i++)
5171 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5172 && (have_wildcard || switches[i].part1[len] == '\0'))
5174 switches[i].live_cond = SWITCH_IGNORE;
5175 switches[i].validated = 1;
5178 p += len;
5180 break;
5182 case '*':
5183 if (soft_matched_part)
5185 do_spec_1 (soft_matched_part, 1, NULL);
5186 do_spec_1 (" ", 0, NULL);
5188 else
5189 /* Catch the case where a spec string contains something like
5190 '%{foo:%*}'. ie there is no * in the pattern on the left
5191 hand side of the :. */
5192 error ("spec failure: '%%*' has not been initialized by pattern match");
5193 break;
5195 /* Process a string found as the value of a spec given by name.
5196 This feature allows individual machine descriptions
5197 to add and use their own specs.
5198 %[...] modifies -D options the way %P does;
5199 %(...) uses the spec unmodified. */
5200 case '[':
5201 error ("warning: use of obsolete %%[ operator in specs");
5202 case '(':
5204 const char *name = p;
5205 struct spec_list *sl;
5206 int len;
5208 /* The string after the S/P is the name of a spec that is to be
5209 processed. */
5210 while (*p && *p != ')' && *p != ']')
5211 p++;
5213 /* See if it's in the list. */
5214 for (len = p - name, sl = specs; sl; sl = sl->next)
5215 if (sl->name_len == len && !strncmp (sl->name, name, len))
5217 name = *(sl->ptr_spec);
5218 #ifdef DEBUG_SPECS
5219 notice ("Processing spec %c%s%c, which is '%s'\n",
5220 c, sl->name, (c == '(') ? ')' : ']', name);
5221 #endif
5222 break;
5225 if (sl)
5227 if (c == '(')
5229 value = do_spec_1 (name, 0, NULL);
5230 if (value != 0)
5231 return value;
5233 else
5235 char *x = alloca (strlen (name) * 2 + 1);
5236 char *buf = x;
5237 const char *y = name;
5238 int flag = 0;
5240 /* Copy all of NAME into BUF, but put __ after
5241 every -D and at the end of each arg. */
5242 while (1)
5244 if (! strncmp (y, "-D", 2))
5246 *x++ = '-';
5247 *x++ = 'D';
5248 *x++ = '_';
5249 *x++ = '_';
5250 y += 2;
5251 flag = 1;
5252 continue;
5254 else if (flag
5255 && (*y == ' ' || *y == '\t' || *y == '='
5256 || *y == '}' || *y == 0))
5258 *x++ = '_';
5259 *x++ = '_';
5260 flag = 0;
5262 if (*y == 0)
5263 break;
5264 else
5265 *x++ = *y++;
5267 *x = 0;
5269 value = do_spec_1 (buf, 0, NULL);
5270 if (value != 0)
5271 return value;
5275 /* Discard the closing paren or bracket. */
5276 if (*p)
5277 p++;
5279 break;
5281 default:
5282 error ("spec failure: unrecognized spec option '%c'", c);
5283 break;
5285 break;
5287 case '\\':
5288 /* Backslash: treat next character as ordinary. */
5289 c = *p++;
5291 /* Fall through. */
5292 default:
5293 /* Ordinary character: put it into the current argument. */
5294 obstack_1grow (&obstack, c);
5295 arg_going = 1;
5298 /* End of string. If we are processing a spec function, we need to
5299 end any pending argument. */
5300 if (processing_spec_function && arg_going)
5302 obstack_1grow (&obstack, 0);
5303 string = obstack_finish (&obstack);
5304 if (this_is_library_file)
5305 string = find_file (string);
5306 store_arg (string, delete_this_arg, this_is_output_file);
5307 if (this_is_output_file)
5308 outfiles[input_file_number] = string;
5309 arg_going = 0;
5312 return 0;
5315 /* Look up a spec function. */
5317 static const struct spec_function *
5318 lookup_spec_function (const char *name)
5320 static const struct spec_function * const spec_function_tables[] =
5322 static_spec_functions,
5323 lang_specific_spec_functions,
5325 const struct spec_function *sf;
5326 unsigned int i;
5328 for (i = 0; i < ARRAY_SIZE (spec_function_tables); i++)
5330 for (sf = spec_function_tables[i]; sf->name != NULL; sf++)
5331 if (strcmp (sf->name, name) == 0)
5332 return sf;
5335 return NULL;
5338 /* Evaluate a spec function. */
5340 static const char *
5341 eval_spec_function (const char *func, const char *args)
5343 const struct spec_function *sf;
5344 const char *funcval;
5346 /* Saved spec processing context. */
5347 int save_argbuf_index;
5348 int save_argbuf_length;
5349 const char **save_argbuf;
5351 int save_arg_going;
5352 int save_delete_this_arg;
5353 int save_this_is_output_file;
5354 int save_this_is_library_file;
5355 int save_input_from_pipe;
5356 const char *save_suffix_subst;
5359 sf = lookup_spec_function (func);
5360 if (sf == NULL)
5361 fatal ("unknown spec function `%s'", func);
5363 /* Push the spec processing context. */
5364 save_argbuf_index = argbuf_index;
5365 save_argbuf_length = argbuf_length;
5366 save_argbuf = argbuf;
5368 save_arg_going = arg_going;
5369 save_delete_this_arg = delete_this_arg;
5370 save_this_is_output_file = this_is_output_file;
5371 save_this_is_library_file = this_is_library_file;
5372 save_input_from_pipe = input_from_pipe;
5373 save_suffix_subst = suffix_subst;
5375 /* Create a new spec processing context, and build the function
5376 arguments. */
5378 alloc_args ();
5379 if (do_spec_2 (args) < 0)
5380 fatal ("error in args to spec function `%s'", func);
5382 /* argbuf_index is an index for the next argument to be inserted, and
5383 so contains the count of the args already inserted. */
5385 funcval = (*sf->func) (argbuf_index, argbuf);
5387 /* Pop the spec processing context. */
5388 argbuf_index = save_argbuf_index;
5389 argbuf_length = save_argbuf_length;
5390 free (argbuf);
5391 argbuf = save_argbuf;
5393 arg_going = save_arg_going;
5394 delete_this_arg = save_delete_this_arg;
5395 this_is_output_file = save_this_is_output_file;
5396 this_is_library_file = save_this_is_library_file;
5397 input_from_pipe = save_input_from_pipe;
5398 suffix_subst = save_suffix_subst;
5400 return funcval;
5403 /* Handle a spec function call of the form:
5405 %:function(args)
5407 ARGS is processed as a spec in a separate context and split into an
5408 argument vector in the normal fashion. The function returns a string
5409 containing a spec which we then process in the caller's context, or
5410 NULL if no processing is required. */
5412 static const char *
5413 handle_spec_function (const char *p)
5415 char *func, *args;
5416 const char *endp, *funcval;
5417 int count;
5419 processing_spec_function++;
5421 /* Get the function name. */
5422 for (endp = p; *endp != '\0'; endp++)
5424 if (*endp == '(') /* ) */
5425 break;
5426 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5427 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5428 fatal ("malformed spec function name");
5430 if (*endp != '(') /* ) */
5431 fatal ("no arguments for spec function");
5432 func = save_string (p, endp - p);
5433 p = ++endp;
5435 /* Get the arguments. */
5436 for (count = 0; *endp != '\0'; endp++)
5438 /* ( */
5439 if (*endp == ')')
5441 if (count == 0)
5442 break;
5443 count--;
5445 else if (*endp == '(') /* ) */
5446 count++;
5448 /* ( */
5449 if (*endp != ')')
5450 fatal ("malformed spec function arguments");
5451 args = save_string (p, endp - p);
5452 p = ++endp;
5454 /* p now points to just past the end of the spec function expression. */
5456 funcval = eval_spec_function (func, args);
5457 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5458 p = NULL;
5460 free (func);
5461 free (args);
5463 processing_spec_function--;
5465 return p;
5468 /* Inline subroutine of handle_braces. Returns true if the current
5469 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5470 static inline bool
5471 input_suffix_matches (const char *atom, const char *end_atom)
5473 return (input_suffix
5474 && !strncmp (input_suffix, atom, end_atom - atom)
5475 && input_suffix[end_atom - atom] == '\0');
5478 /* Inline subroutine of handle_braces. Returns true if a switch
5479 matching the atom bracketed by ATOM and END_ATOM appeared on the
5480 command line. */
5481 static inline bool
5482 switch_matches (const char *atom, const char *end_atom, int starred)
5484 int i;
5485 int len = end_atom - atom;
5486 int plen = starred ? len : -1;
5488 for (i = 0; i < n_switches; i++)
5489 if (!strncmp (switches[i].part1, atom, len)
5490 && (starred || switches[i].part1[len] == '\0')
5491 && check_live_switch (i, plen))
5492 return true;
5494 return false;
5497 /* Inline subroutine of handle_braces. Mark all of the switches which
5498 match ATOM (extends to END_ATOM; STARRED indicates whether there
5499 was a star after the atom) for later processing. */
5500 static inline void
5501 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5503 int i;
5504 int len = end_atom - atom;
5505 int plen = starred ? len : -1;
5507 for (i = 0; i < n_switches; i++)
5508 if (!strncmp (switches[i].part1, atom, len)
5509 && (starred || switches[i].part1[len] == '\0')
5510 && check_live_switch (i, plen))
5511 switches[i].ordering = 1;
5514 /* Inline subroutine of handle_braces. Process all the currently
5515 marked switches through give_switch, and clear the marks. */
5516 static inline void
5517 process_marked_switches (void)
5519 int i;
5521 for (i = 0; i < n_switches; i++)
5522 if (switches[i].ordering == 1)
5524 switches[i].ordering = 0;
5525 give_switch (i, 0);
5529 /* Handle a %{ ... } construct. P points just inside the leading {.
5530 Returns a pointer one past the end of the brace block, or 0
5531 if we call do_spec_1 and that returns -1. */
5533 static const char *
5534 handle_braces (const char *p)
5536 const char *atom, *end_atom;
5537 const char *d_atom = NULL, *d_end_atom = NULL;
5539 bool a_is_suffix;
5540 bool a_is_starred;
5541 bool a_is_negated;
5542 bool a_matched;
5544 bool a_must_be_last = false;
5545 bool ordered_set = false;
5546 bool disjunct_set = false;
5547 bool disj_matched = false;
5548 bool disj_starred = true;
5549 bool n_way_choice = false;
5550 bool n_way_matched = false;
5552 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
5556 if (a_must_be_last)
5557 abort ();
5559 /* Scan one "atom" (S in the description above of %{}, possibly
5560 with !, ., or * modifiers). */
5561 a_matched = a_is_suffix = a_is_starred = a_is_negated = false;
5563 SKIP_WHITE();
5564 if (*p == '!')
5565 p++, a_is_negated = true;
5567 SKIP_WHITE();
5568 if (*p == '.')
5569 p++, a_is_suffix = true;
5571 atom = p;
5572 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
5573 || *p == ',' || *p == '.' || *p == '@')
5574 p++;
5575 end_atom = p;
5577 if (*p == '*')
5578 p++, a_is_starred = 1;
5580 SKIP_WHITE();
5581 if (*p == '&' || *p == '}')
5583 /* Substitute the switch(es) indicated by the current atom. */
5584 ordered_set = true;
5585 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
5586 || atom == end_atom)
5587 abort ();
5589 mark_matching_switches (atom, end_atom, a_is_starred);
5591 if (*p == '}')
5592 process_marked_switches ();
5594 else if (*p == '|' || *p == ':')
5596 /* Substitute some text if the current atom appears as a switch
5597 or suffix. */
5598 disjunct_set = true;
5599 if (ordered_set)
5600 abort ();
5602 if (atom == end_atom)
5604 if (!n_way_choice || disj_matched || *p == '|'
5605 || a_is_negated || a_is_suffix || a_is_starred)
5606 abort ();
5608 /* An empty term may appear as the last choice of an
5609 N-way choice set; it means "otherwise". */
5610 a_must_be_last = true;
5611 disj_matched = !n_way_matched;
5612 disj_starred = false;
5614 else
5616 if (a_is_suffix && a_is_starred)
5617 abort ();
5619 if (!a_is_starred)
5620 disj_starred = false;
5622 /* Don't bother testing this atom if we already have a
5623 match. */
5624 if (!disj_matched && !n_way_matched)
5626 if (a_is_suffix)
5627 a_matched = input_suffix_matches (atom, end_atom);
5628 else
5629 a_matched = switch_matches (atom, end_atom, a_is_starred);
5631 if (a_matched != a_is_negated)
5633 disj_matched = true;
5634 d_atom = atom;
5635 d_end_atom = end_atom;
5640 if (*p == ':')
5642 /* Found the body, that is, the text to substitute if the
5643 current disjunction matches. */
5644 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
5645 disj_matched && !n_way_matched);
5646 if (p == 0)
5647 return 0;
5649 /* If we have an N-way choice, reset state for the next
5650 disjunction. */
5651 if (*p == ';')
5653 n_way_choice = true;
5654 n_way_matched |= disj_matched;
5655 disj_matched = false;
5656 disj_starred = true;
5657 d_atom = d_end_atom = NULL;
5661 else
5662 abort ();
5664 while (*p++ != '}');
5666 return p;
5668 #undef SKIP_WHITE
5671 /* Subroutine of handle_braces. Scan and process a brace substitution body
5672 (X in the description of %{} syntax). P points one past the colon;
5673 ATOM and END_ATOM bracket the first atom which was found to be true
5674 (present) in the current disjunction; STARRED indicates whether all
5675 the atoms in the current disjunction were starred (for syntax validation);
5676 MATCHED indicates whether the disjunction matched or not, and therefore
5677 whether or not the body is to be processed through do_spec_1 or just
5678 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
5679 returns -1. */
5681 static const char *
5682 process_brace_body (const char *p, const char *atom, const char *end_atom,
5683 int starred, int matched)
5685 const char *body, *end_body;
5686 unsigned int nesting_level;
5687 bool have_subst = false;
5689 /* Locate the closing } or ;, honoring nested braces.
5690 Trim trailing whitespace. */
5691 body = p;
5692 nesting_level = 1;
5693 for (;;)
5695 if (*p == '{')
5696 nesting_level++;
5697 else if (*p == '}')
5699 if (!--nesting_level)
5700 break;
5702 else if (*p == ';' && nesting_level == 1)
5703 break;
5704 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
5705 have_subst = true;
5706 else if (*p == '\0')
5707 abort ();
5708 p++;
5711 end_body = p;
5712 while (end_body[-1] == ' ' || end_body[-1] == '\t')
5713 end_body--;
5715 if (have_subst && !starred)
5716 abort ();
5718 if (matched)
5720 /* Copy the substitution body to permanent storage and execute it.
5721 If have_subst is false, this is a simple matter of running the
5722 body through do_spec_1... */
5723 char *string = save_string (body, end_body - body);
5724 if (!have_subst)
5726 if (do_spec_1 (string, 0, NULL) < 0)
5727 return 0;
5729 else
5731 /* ... but if have_subst is true, we have to process the
5732 body once for each matching switch, with %* set to the
5733 variant part of the switch. */
5734 unsigned int hard_match_len = end_atom - atom;
5735 int i;
5737 for (i = 0; i < n_switches; i++)
5738 if (!strncmp (switches[i].part1, atom, hard_match_len)
5739 && check_live_switch (i, hard_match_len))
5741 if (do_spec_1 (string, 0,
5742 &switches[i].part1[hard_match_len]) < 0)
5743 return 0;
5744 /* Pass any arguments this switch has. */
5745 give_switch (i, 1);
5746 suffix_subst = NULL;
5751 return p;
5754 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5755 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
5756 spec, or -1 if either exact match or %* is used.
5758 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
5759 whose value does not begin with "no-" is obsoleted by the same value
5760 with the "no-", similarly for a switch with the "no-" prefix. */
5762 static int
5763 check_live_switch (int switchnum, int prefix_length)
5765 const char *name = switches[switchnum].part1;
5766 int i;
5768 /* In the common case of {<at-most-one-letter>*}, a negating
5769 switch would always match, so ignore that case. We will just
5770 send the conflicting switches to the compiler phase. */
5771 if (prefix_length >= 0 && prefix_length <= 1)
5772 return 1;
5774 /* If we already processed this switch and determined if it was
5775 live or not, return our past determination. */
5776 if (switches[switchnum].live_cond != 0)
5777 return switches[switchnum].live_cond > 0;
5779 /* Now search for duplicate in a manner that depends on the name. */
5780 switch (*name)
5782 case 'O':
5783 for (i = switchnum + 1; i < n_switches; i++)
5784 if (switches[i].part1[0] == 'O')
5786 switches[switchnum].validated = 1;
5787 switches[switchnum].live_cond = SWITCH_FALSE;
5788 return 0;
5790 break;
5792 case 'W': case 'f': case 'm':
5793 if (! strncmp (name + 1, "no-", 3))
5795 /* We have Xno-YYY, search for XYYY. */
5796 for (i = switchnum + 1; i < n_switches; i++)
5797 if (switches[i].part1[0] == name[0]
5798 && ! strcmp (&switches[i].part1[1], &name[4]))
5800 switches[switchnum].validated = 1;
5801 switches[switchnum].live_cond = SWITCH_FALSE;
5802 return 0;
5805 else
5807 /* We have XYYY, search for Xno-YYY. */
5808 for (i = switchnum + 1; i < n_switches; i++)
5809 if (switches[i].part1[0] == name[0]
5810 && switches[i].part1[1] == 'n'
5811 && switches[i].part1[2] == 'o'
5812 && switches[i].part1[3] == '-'
5813 && !strcmp (&switches[i].part1[4], &name[1]))
5815 switches[switchnum].validated = 1;
5816 switches[switchnum].live_cond = SWITCH_FALSE;
5817 return 0;
5820 break;
5823 /* Otherwise the switch is live. */
5824 switches[switchnum].live_cond = SWITCH_LIVE;
5825 return 1;
5828 /* Pass a switch to the current accumulating command
5829 in the same form that we received it.
5830 SWITCHNUM identifies the switch; it is an index into
5831 the vector of switches gcc received, which is `switches'.
5832 This cannot fail since it never finishes a command line.
5834 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
5836 static void
5837 give_switch (int switchnum, int omit_first_word)
5839 if (switches[switchnum].live_cond == SWITCH_IGNORE)
5840 return;
5842 if (!omit_first_word)
5844 do_spec_1 ("-", 0, NULL);
5845 do_spec_1 (switches[switchnum].part1, 1, NULL);
5848 if (switches[switchnum].args != 0)
5850 const char **p;
5851 for (p = switches[switchnum].args; *p; p++)
5853 const char *arg = *p;
5855 do_spec_1 (" ", 0, NULL);
5856 if (suffix_subst)
5858 unsigned length = strlen (arg);
5859 int dot = 0;
5861 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
5862 if (arg[length] == '.')
5864 ((char *)arg)[length] = 0;
5865 dot = 1;
5866 break;
5868 do_spec_1 (arg, 1, NULL);
5869 if (dot)
5870 ((char *)arg)[length] = '.';
5871 do_spec_1 (suffix_subst, 1, NULL);
5873 else
5874 do_spec_1 (arg, 1, NULL);
5878 do_spec_1 (" ", 0, NULL);
5879 switches[switchnum].validated = 1;
5882 /* Search for a file named NAME trying various prefixes including the
5883 user's -B prefix and some standard ones.
5884 Return the absolute file name found. If nothing is found, return NAME. */
5886 static const char *
5887 find_file (const char *name)
5889 char *newname;
5891 /* Try multilib_dir if it is defined. */
5892 if (multilib_os_dir != NULL)
5894 newname = find_a_file (&startfile_prefixes, name, R_OK, 1);
5896 /* If we don't find it in the multi library dir, then fall
5897 through and look for it in the normal places. */
5898 if (newname != NULL)
5899 return newname;
5902 newname = find_a_file (&startfile_prefixes, name, R_OK, 0);
5903 return newname ? newname : name;
5906 /* Determine whether a directory exists. If LINKER, return 0 for
5907 certain fixed names not needed by the linker. If not LINKER, it is
5908 only important to return 0 if the host machine has a small ARG_MAX
5909 limit. */
5911 static int
5912 is_directory (const char *path1, const char *path2, int linker)
5914 int len1 = strlen (path1);
5915 int len2 = strlen (path2);
5916 char *path = alloca (3 + len1 + len2);
5917 char *cp;
5918 struct stat st;
5920 #ifndef SMALL_ARG_MAX
5921 if (! linker)
5922 return 1;
5923 #endif
5925 /* Construct the path from the two parts. Ensure the string ends with "/.".
5926 The resulting path will be a directory even if the given path is a
5927 symbolic link. */
5928 memcpy (path, path1, len1);
5929 memcpy (path + len1, path2, len2);
5930 cp = path + len1 + len2;
5931 if (!IS_DIR_SEPARATOR (cp[-1]))
5932 *cp++ = DIR_SEPARATOR;
5933 *cp++ = '.';
5934 *cp = '\0';
5936 /* Exclude directories that the linker is known to search. */
5937 if (linker
5938 && ((cp - path == 6
5939 && strcmp (path, concat (dir_separator_str, "lib",
5940 dir_separator_str, ".", NULL)) == 0)
5941 || (cp - path == 10
5942 && strcmp (path, concat (dir_separator_str, "usr",
5943 dir_separator_str, "lib",
5944 dir_separator_str, ".", NULL)) == 0)))
5945 return 0;
5947 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5950 /* Set up the various global variables to indicate that we're processing
5951 the input file named FILENAME. */
5953 void
5954 set_input (const char *filename)
5956 const char *p;
5958 input_filename = filename;
5959 input_filename_length = strlen (input_filename);
5961 input_basename = input_filename;
5962 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5963 /* Skip drive name so 'x:foo' is handled properly. */
5964 if (input_basename[1] == ':')
5965 input_basename += 2;
5966 #endif
5967 for (p = input_basename; *p; p++)
5968 if (IS_DIR_SEPARATOR (*p))
5969 input_basename = p + 1;
5971 /* Find a suffix starting with the last period,
5972 and set basename_length to exclude that suffix. */
5973 basename_length = strlen (input_basename);
5974 suffixed_basename_length = basename_length;
5975 p = input_basename + basename_length;
5976 while (p != input_basename && *p != '.')
5977 --p;
5978 if (*p == '.' && p != input_basename)
5980 basename_length = p - input_basename;
5981 input_suffix = p + 1;
5983 else
5984 input_suffix = "";
5986 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
5987 we will need to do a stat on the input_filename. The
5988 INPUT_STAT_SET signals that the stat is needed. */
5989 input_stat_set = 0;
5992 /* On fatal signals, delete all the temporary files. */
5994 static void
5995 fatal_error (int signum)
5997 signal (signum, SIG_DFL);
5998 delete_failure_queue ();
5999 delete_temp_files ();
6000 /* Get the same signal again, this time not handled,
6001 so its normal effect occurs. */
6002 kill (getpid (), signum);
6005 extern int main (int, const char **);
6008 main (int argc, const char **argv)
6010 size_t i;
6011 int value;
6012 int linker_was_run = 0;
6013 int lang_n_infiles = 0;
6014 int num_linker_inputs = 0;
6015 char *explicit_link_files;
6016 char *specs_file;
6017 const char *p;
6018 struct user_specs *uptr;
6020 p = argv[0] + strlen (argv[0]);
6021 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6022 --p;
6023 programname = p;
6025 xmalloc_set_program_name (programname);
6027 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6028 /* Perform host dependent initialization when needed. */
6029 GCC_DRIVER_HOST_INITIALIZATION;
6030 #endif
6032 gcc_init_libintl ();
6034 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6035 signal (SIGINT, fatal_error);
6036 #ifdef SIGHUP
6037 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6038 signal (SIGHUP, fatal_error);
6039 #endif
6040 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6041 signal (SIGTERM, fatal_error);
6042 #ifdef SIGPIPE
6043 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6044 signal (SIGPIPE, fatal_error);
6045 #endif
6046 #ifdef SIGCHLD
6047 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6048 receive the signal. A different setting is inheritable */
6049 signal (SIGCHLD, SIG_DFL);
6050 #endif
6052 /* Allocate the argument vector. */
6053 alloc_args ();
6055 obstack_init (&obstack);
6057 /* Build multilib_select, et. al from the separate lines that make up each
6058 multilib selection. */
6060 const char *const *q = multilib_raw;
6061 int need_space;
6063 obstack_init (&multilib_obstack);
6064 while ((p = *q++) != (char *) 0)
6065 obstack_grow (&multilib_obstack, p, strlen (p));
6067 obstack_1grow (&multilib_obstack, 0);
6068 multilib_select = obstack_finish (&multilib_obstack);
6070 q = multilib_matches_raw;
6071 while ((p = *q++) != (char *) 0)
6072 obstack_grow (&multilib_obstack, p, strlen (p));
6074 obstack_1grow (&multilib_obstack, 0);
6075 multilib_matches = obstack_finish (&multilib_obstack);
6077 q = multilib_exclusions_raw;
6078 while ((p = *q++) != (char *) 0)
6079 obstack_grow (&multilib_obstack, p, strlen (p));
6081 obstack_1grow (&multilib_obstack, 0);
6082 multilib_exclusions = obstack_finish (&multilib_obstack);
6084 need_space = FALSE;
6085 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6087 if (need_space)
6088 obstack_1grow (&multilib_obstack, ' ');
6089 obstack_grow (&multilib_obstack,
6090 multilib_defaults_raw[i],
6091 strlen (multilib_defaults_raw[i]));
6092 need_space = TRUE;
6095 obstack_1grow (&multilib_obstack, 0);
6096 multilib_defaults = obstack_finish (&multilib_obstack);
6099 /* Set up to remember the pathname of gcc and any options
6100 needed for collect. We use argv[0] instead of programname because
6101 we need the complete pathname. */
6102 obstack_init (&collect_obstack);
6103 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6104 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6105 putenv (obstack_finish (&collect_obstack));
6107 #ifdef INIT_ENVIRONMENT
6108 /* Set up any other necessary machine specific environment variables. */
6109 putenv (INIT_ENVIRONMENT);
6110 #endif
6112 /* Make a table of what switches there are (switches, n_switches).
6113 Make a table of specified input files (infiles, n_infiles).
6114 Decode switches that are handled locally. */
6116 process_command (argc, argv);
6118 /* Initialize the vector of specs to just the default.
6119 This means one element containing 0s, as a terminator. */
6121 compilers = xmalloc (sizeof default_compilers);
6122 memcpy (compilers, default_compilers, sizeof default_compilers);
6123 n_compilers = n_default_compilers;
6125 /* Read specs from a file if there is one. */
6127 machine_suffix = concat (spec_machine, dir_separator_str,
6128 spec_version, dir_separator_str, NULL);
6129 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6131 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, 0);
6132 /* Read the specs file unless it is a default one. */
6133 if (specs_file != 0 && strcmp (specs_file, "specs"))
6134 read_specs (specs_file, TRUE);
6135 else
6136 init_spec ();
6138 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6139 for any override of as, ld and libraries. */
6140 specs_file = alloca (strlen (standard_exec_prefix)
6141 + strlen (just_machine_suffix) + sizeof ("specs"));
6143 strcpy (specs_file, standard_exec_prefix);
6144 strcat (specs_file, just_machine_suffix);
6145 strcat (specs_file, "specs");
6146 if (access (specs_file, R_OK) == 0)
6147 read_specs (specs_file, TRUE);
6149 /* Process any configure-time defaults specified for the command line
6150 options, via OPTION_DEFAULT_SPECS. */
6151 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6152 do_option_spec (option_default_specs[i].name,
6153 option_default_specs[i].spec);
6155 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6156 of the command line. */
6158 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6159 do_self_spec (driver_self_specs[i]);
6161 /* If not cross-compiling, look for executables in the standard
6162 places. */
6163 if (*cross_compile == '0')
6165 if (*md_exec_prefix)
6167 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6168 PREFIX_PRIORITY_LAST, 0, NULL, 0);
6172 /* Process sysroot_suffix_spec. */
6173 if (*sysroot_suffix_spec != 0
6174 && do_spec_2 (sysroot_suffix_spec) == 0)
6176 if (argbuf_index > 1)
6177 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC.");
6178 else if (argbuf_index == 1)
6179 target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6182 /* Process sysroot_hdrs_suffix_spec. */
6183 if (*sysroot_hdrs_suffix_spec != 0
6184 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6186 if (argbuf_index > 1)
6187 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC.");
6188 else if (argbuf_index == 1)
6189 target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6192 /* Look for startfiles in the standard places. */
6193 if (*startfile_prefix_spec != 0
6194 && do_spec_2 (startfile_prefix_spec) == 0
6195 && do_spec_1 (" ", 0, NULL) == 0)
6197 int ndx;
6198 for (ndx = 0; ndx < argbuf_index; ndx++)
6199 add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6200 PREFIX_PRIORITY_LAST, 0, NULL, 1);
6202 /* We should eventually get rid of all these and stick to
6203 startfile_prefix_spec exclusively. */
6204 else if (*cross_compile == '0' || target_system_root)
6206 if (*md_exec_prefix)
6207 add_sysrooted_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
6208 PREFIX_PRIORITY_LAST, 0, NULL, 1);
6210 if (*md_startfile_prefix)
6211 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6212 "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1);
6214 if (*md_startfile_prefix_1)
6215 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6216 "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1);
6218 /* If standard_startfile_prefix is relative, base it on
6219 standard_exec_prefix. This lets us move the installed tree
6220 as a unit. If GCC_EXEC_PREFIX is defined, base
6221 standard_startfile_prefix on that as well.
6223 If the prefix is relative, only search it for native compilers;
6224 otherwise we will search a directory containing host libraries. */
6225 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6226 add_sysrooted_prefix (&startfile_prefixes,
6227 standard_startfile_prefix, "BINUTILS",
6228 PREFIX_PRIORITY_LAST, 0, NULL, 1);
6229 else if (*cross_compile == '0')
6231 if (gcc_exec_prefix)
6232 add_prefix (&startfile_prefixes,
6233 concat (gcc_exec_prefix, machine_suffix,
6234 standard_startfile_prefix, NULL),
6235 NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
6236 add_prefix (&startfile_prefixes,
6237 concat (standard_exec_prefix,
6238 machine_suffix,
6239 standard_startfile_prefix, NULL),
6240 NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
6243 if (*standard_startfile_prefix_1)
6244 add_sysrooted_prefix (&startfile_prefixes,
6245 standard_startfile_prefix_1, "BINUTILS",
6246 PREFIX_PRIORITY_LAST, 0, NULL, 1);
6247 if (*standard_startfile_prefix_2)
6248 add_sysrooted_prefix (&startfile_prefixes,
6249 standard_startfile_prefix_2, "BINUTILS",
6250 PREFIX_PRIORITY_LAST, 0, NULL, 1);
6251 #if 0 /* Can cause surprises, and one can use -B./ instead. */
6252 add_prefix (&startfile_prefixes, "./", NULL,
6253 PREFIX_PRIORITY_LAST, 1, NULL, 0);
6254 #endif
6257 /* Process any user specified specs in the order given on the command
6258 line. */
6259 for (uptr = user_specs_head; uptr; uptr = uptr->next)
6261 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6262 R_OK, 0);
6263 read_specs (filename ? filename : uptr->filename, FALSE);
6266 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
6267 if (gcc_exec_prefix)
6268 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6269 spec_version, dir_separator_str, NULL);
6271 /* Now we have the specs.
6272 Set the `valid' bits for switches that match anything in any spec. */
6274 validate_all_switches ();
6276 /* Now that we have the switches and the specs, set
6277 the subdirectory based on the options. */
6278 set_multilib_dir ();
6280 /* Warn about any switches that no pass was interested in. */
6282 for (i = 0; (int) i < n_switches; i++)
6283 if (! switches[i].validated)
6284 error ("unrecognized option `-%s'", switches[i].part1);
6286 /* Obey some of the options. */
6288 if (print_search_dirs)
6290 printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
6291 printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
6292 printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
6293 return (0);
6296 if (print_file_name)
6298 printf ("%s\n", find_file (print_file_name));
6299 return (0);
6302 if (print_prog_name)
6304 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6305 printf ("%s\n", (newname ? newname : print_prog_name));
6306 return (0);
6309 if (print_multi_lib)
6311 print_multilib_info ();
6312 return (0);
6315 if (print_multi_directory)
6317 if (multilib_dir == NULL)
6318 printf (".\n");
6319 else
6320 printf ("%s\n", multilib_dir);
6321 return (0);
6324 if (print_multi_os_directory)
6326 if (multilib_os_dir == NULL)
6327 printf (".\n");
6328 else
6329 printf ("%s\n", multilib_os_dir);
6330 return (0);
6333 if (target_help_flag)
6335 /* Print if any target specific options. */
6337 /* We do not exit here. Instead we have created a fake input file
6338 called 'target-dummy' which needs to be compiled, and we pass this
6339 on to the various sub-processes, along with the --target-help
6340 switch. */
6343 if (print_help_list)
6345 display_help ();
6347 if (! verbose_flag)
6349 printf (_("\nFor bug reporting instructions, please see:\n"));
6350 printf ("%s.\n", bug_report_url);
6352 return (0);
6355 /* We do not exit here. Instead we have created a fake input file
6356 called 'help-dummy' which needs to be compiled, and we pass this
6357 on the various sub-processes, along with the --help switch. */
6360 if (verbose_flag)
6362 int n;
6363 const char *thrmod;
6365 notice ("Configured with: %s\n", configuration_arguments);
6367 #ifdef THREAD_MODEL_SPEC
6368 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
6369 but there's no point in doing all this processing just to get
6370 thread_model back. */
6371 obstack_init (&obstack);
6372 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
6373 obstack_1grow (&obstack, '\0');
6374 thrmod = obstack_finish (&obstack);
6375 #else
6376 thrmod = thread_model;
6377 #endif
6379 notice ("Thread model: %s\n", thrmod);
6381 /* compiler_version is truncated at the first space when initialized
6382 from version string, so truncate version_string at the first space
6383 before comparing. */
6384 for (n = 0; version_string[n]; n++)
6385 if (version_string[n] == ' ')
6386 break;
6388 if (! strncmp (version_string, compiler_version, n)
6389 && compiler_version[n] == 0)
6390 notice ("gcc version %s\n", version_string);
6391 else
6392 notice ("gcc driver version %s executing gcc version %s\n",
6393 version_string, compiler_version);
6395 if (n_infiles == 0)
6396 return (0);
6399 if (n_infiles == added_libraries)
6400 fatal ("no input files");
6402 /* Make a place to record the compiler output file names
6403 that correspond to the input files. */
6405 i = n_infiles;
6406 i += lang_specific_extra_outfiles;
6407 outfiles = xcalloc (i, sizeof (char *));
6409 /* Record which files were specified explicitly as link input. */
6411 explicit_link_files = xcalloc (1, n_infiles);
6413 if (combine_flag)
6414 combine_inputs = true;
6415 else
6416 combine_inputs = false;
6418 for (i = 0; (int) i < n_infiles; i++)
6420 const char *name = infiles[i].name;
6421 struct compiler *compiler = lookup_compiler (name,
6422 strlen (name),
6423 infiles[i].language);
6425 if (compiler && !(compiler->combinable))
6426 combine_inputs = false;
6428 if (lang_n_infiles > 0 && compiler != input_file_compiler
6429 && infiles[i].language && infiles[i].language[0] != '*')
6430 infiles[i].incompiler = compiler;
6431 else if (compiler)
6433 lang_n_infiles++;
6434 input_file_compiler = compiler;
6435 infiles[i].incompiler = compiler;
6437 else
6439 /* Since there is no compiler for this input file, assume it is a
6440 linker file. */
6441 explicit_link_files[i] = 1;
6442 infiles[i].incompiler = NULL;
6444 infiles[i].compiled = false;
6445 infiles[i].preprocessed = false;
6448 if (combine_flag && save_temps_flag)
6450 bool save_combine_inputs = combine_inputs;
6451 /* Must do a separate pre-processing pass for C & Objective-C files, to
6452 obtain individual .i files. */
6454 combine_inputs = false;
6455 for (i = 0; (int) i < n_infiles; i++)
6457 int this_file_error = 0;
6459 input_file_number = i;
6460 set_input (infiles[i].name);
6461 if (infiles[i].incompiler
6462 && (infiles[i].incompiler)->needs_preprocessing)
6463 input_file_compiler = infiles[i].incompiler;
6464 else
6465 continue;
6467 if (input_file_compiler)
6469 if (input_file_compiler->spec[0] == '#')
6471 error ("%s: %s compiler not installed on this system",
6472 input_filename, &input_file_compiler->spec[1]);
6473 this_file_error = 1;
6475 else
6477 value = do_spec (input_file_compiler->spec);
6478 infiles[i].preprocessed = true;
6479 if (have_o_argbuf_index)
6480 infiles[i].name = argbuf[have_o_argbuf_index];
6481 else
6482 abort ();
6483 infiles[i].incompiler = lookup_compiler (infiles[i].name,
6484 strlen (infiles[i].name),
6485 infiles[i].language);
6487 if (value < 0)
6488 this_file_error = 1;
6492 if (this_file_error)
6494 delete_failure_queue ();
6495 error_count++;
6496 break;
6498 clear_failure_queue ();
6500 combine_inputs = save_combine_inputs;
6503 for (i = 0; (int) i < n_infiles; i++)
6505 int this_file_error = 0;
6507 /* Tell do_spec what to substitute for %i. */
6509 input_file_number = i;
6510 set_input (infiles[i].name);
6512 if (infiles[i].compiled)
6513 continue;
6515 /* Use the same thing in %o, unless cp->spec says otherwise. */
6517 outfiles[i] = input_filename;
6519 /* Figure out which compiler from the file's suffix. */
6521 if (! combine_inputs)
6522 input_file_compiler
6523 = lookup_compiler (infiles[i].name, input_filename_length,
6524 infiles[i].language);
6525 else
6526 input_file_compiler = infiles[i].incompiler;
6528 if (input_file_compiler)
6530 /* Ok, we found an applicable compiler. Run its spec. */
6532 if (input_file_compiler->spec[0] == '#')
6534 error ("%s: %s compiler not installed on this system",
6535 input_filename, &input_file_compiler->spec[1]);
6536 this_file_error = 1;
6538 else
6540 value = do_spec (input_file_compiler->spec);
6541 infiles[i].compiled = true;
6542 if (value < 0)
6543 this_file_error = 1;
6547 /* If this file's name does not contain a recognized suffix,
6548 record it as explicit linker input. */
6550 else
6551 explicit_link_files[i] = 1;
6553 /* Clear the delete-on-failure queue, deleting the files in it
6554 if this compilation failed. */
6556 if (this_file_error)
6558 delete_failure_queue ();
6559 error_count++;
6560 break;
6562 /* If this compilation succeeded, don't delete those files later. */
6563 clear_failure_queue ();
6566 /* Reset the output file name to the first input file name, for use
6567 with %b in LINK_SPEC on a target that prefers not to emit a.out
6568 by default. */
6569 if (n_infiles > 0)
6570 set_input (infiles[0].name);
6572 if (error_count == 0)
6574 /* Make sure INPUT_FILE_NUMBER points to first available open
6575 slot. */
6576 input_file_number = n_infiles;
6577 if (lang_specific_pre_link ())
6578 error_count++;
6581 /* Determine if there are any linker input files. */
6582 num_linker_inputs = 0;
6583 for (i = 0; (int) i < n_infiles; i++)
6584 if (explicit_link_files[i] || outfiles[i] != NULL)
6585 num_linker_inputs++;
6587 /* Run ld to link all the compiler output files. */
6589 if (num_linker_inputs > 0 && error_count == 0)
6591 int tmp = execution_count;
6593 /* We'll use ld if we can't find collect2. */
6594 if (! strcmp (linker_name_spec, "collect2"))
6596 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, 0);
6597 if (s == NULL)
6598 linker_name_spec = "ld";
6600 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
6601 for collect. */
6602 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
6603 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
6605 value = do_spec (link_command_spec);
6606 if (value < 0)
6607 error_count = 1;
6608 linker_was_run = (tmp != execution_count);
6611 /* If options said don't run linker,
6612 complain about input files to be given to the linker. */
6614 if (! linker_was_run && error_count == 0)
6615 for (i = 0; (int) i < n_infiles; i++)
6616 if (explicit_link_files[i])
6617 error ("%s: linker input file unused because linking not done",
6618 outfiles[i]);
6620 /* Delete some or all of the temporary files we made. */
6622 if (error_count)
6623 delete_failure_queue ();
6624 delete_temp_files ();
6626 if (print_help_list)
6628 printf (("\nFor bug reporting instructions, please see:\n"));
6629 printf ("%s\n", bug_report_url);
6632 return (signal_count != 0 ? 2
6633 : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
6634 : 0);
6637 /* Find the proper compilation spec for the file name NAME,
6638 whose length is LENGTH. LANGUAGE is the specified language,
6639 or 0 if this file is to be passed to the linker. */
6641 static struct compiler *
6642 lookup_compiler (const char *name, size_t length, const char *language)
6644 struct compiler *cp;
6646 /* If this was specified by the user to be a linker input, indicate that. */
6647 if (language != 0 && language[0] == '*')
6648 return 0;
6650 /* Otherwise, look for the language, if one is spec'd. */
6651 if (language != 0)
6653 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6654 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
6655 return cp;
6657 error ("language %s not recognized", language);
6658 return 0;
6661 /* Look for a suffix. */
6662 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6664 if (/* The suffix `-' matches only the file name `-'. */
6665 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6666 || (strlen (cp->suffix) < length
6667 /* See if the suffix matches the end of NAME. */
6668 && !strcmp (cp->suffix,
6669 name + length - strlen (cp->suffix))
6671 break;
6674 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6675 /* Look again, but case-insensitively this time. */
6676 if (cp < compilers)
6677 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6679 if (/* The suffix `-' matches only the file name `-'. */
6680 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6681 || (strlen (cp->suffix) < length
6682 /* See if the suffix matches the end of NAME. */
6683 && ((!strcmp (cp->suffix,
6684 name + length - strlen (cp->suffix))
6685 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
6686 && !strcasecmp (cp->suffix,
6687 name + length - strlen (cp->suffix)))
6689 break;
6691 #endif
6693 if (cp >= compilers)
6695 if (cp->spec[0] != '@')
6696 /* A non-alias entry: return it. */
6697 return cp;
6699 /* An alias entry maps a suffix to a language.
6700 Search for the language; pass 0 for NAME and LENGTH
6701 to avoid infinite recursion if language not found. */
6702 return lookup_compiler (NULL, 0, cp->spec + 1);
6704 return 0;
6707 static char *
6708 save_string (const char *s, int len)
6710 char *result = xmalloc (len + 1);
6712 memcpy (result, s, len);
6713 result[len] = 0;
6714 return result;
6717 void
6718 pfatal_with_name (const char *name)
6720 perror_with_name (name);
6721 delete_temp_files ();
6722 exit (1);
6725 static void
6726 perror_with_name (const char *name)
6728 error ("%s: %s", name, xstrerror (errno));
6731 static void
6732 pfatal_pexecute (const char *errmsg_fmt, const char *errmsg_arg)
6734 if (errmsg_arg)
6736 int save_errno = errno;
6738 /* Space for trailing '\0' is in %s. */
6739 char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
6740 sprintf (msg, errmsg_fmt, errmsg_arg);
6741 errmsg_fmt = msg;
6743 errno = save_errno;
6746 pfatal_with_name (errmsg_fmt);
6749 /* Output an error message and exit. */
6751 void
6752 fancy_abort (void)
6754 fatal ("internal gcc abort");
6757 /* Output an error message and exit. */
6759 void
6760 fatal (const char *msgid, ...)
6762 va_list ap;
6764 va_start (ap, msgid);
6766 fprintf (stderr, "%s: ", programname);
6767 vfprintf (stderr, _(msgid), ap);
6768 va_end (ap);
6769 fprintf (stderr, "\n");
6770 delete_temp_files ();
6771 exit (1);
6774 void
6775 error (const char *msgid, ...)
6777 va_list ap;
6779 va_start (ap, msgid);
6780 fprintf (stderr, "%s: ", programname);
6781 vfprintf (stderr, _(msgid), ap);
6782 va_end (ap);
6784 fprintf (stderr, "\n");
6787 static void
6788 notice (const char *msgid, ...)
6790 va_list ap;
6792 va_start (ap, msgid);
6793 vfprintf (stderr, _(msgid), ap);
6794 va_end (ap);
6797 static inline void
6798 validate_switches_from_spec (const char *spec)
6800 const char *p = spec;
6801 char c;
6802 while ((c = *p++))
6803 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
6804 /* We have a switch spec. */
6805 p = validate_switches (p + 1);
6808 static void
6809 validate_all_switches (void)
6811 struct compiler *comp;
6812 struct spec_list *spec;
6814 for (comp = compilers; comp->spec; comp++)
6815 validate_switches_from_spec (comp->spec);
6817 /* Look through the linked list of specs read from the specs file. */
6818 for (spec = specs; spec; spec = spec->next)
6819 validate_switches_from_spec (*spec->ptr_spec);
6821 validate_switches_from_spec (link_command_spec);
6824 /* Look at the switch-name that comes after START
6825 and mark as valid all supplied switches that match it. */
6827 static const char *
6828 validate_switches (const char *start)
6830 const char *p = start;
6831 const char *atom;
6832 size_t len;
6833 int i;
6834 bool suffix = false;
6835 bool starred = false;
6837 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6839 next_member:
6840 SKIP_WHITE ();
6842 if (*p == '!')
6843 p++;
6845 SKIP_WHITE ();
6846 if (*p == '.')
6847 suffix = true, p++;
6849 atom = p;
6850 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
6851 || *p == ',' || *p == '.' || *p == '@')
6852 p++;
6853 len = p - atom;
6855 if (*p == '*')
6856 starred = true, p++;
6858 SKIP_WHITE ();
6860 if (!suffix)
6862 /* Mark all matching switches as valid. */
6863 for (i = 0; i < n_switches; i++)
6864 if (!strncmp (switches[i].part1, atom, len)
6865 && (starred || switches[i].part1[len] == 0))
6866 switches[i].validated = 1;
6869 if (*p) p++;
6870 if (*p && (p[-1] == '|' || p[-1] == '&'))
6871 goto next_member;
6873 if (*p && p[-1] == ':')
6875 while (*p && *p != ';' && *p != '}')
6877 if (*p == '%')
6879 p++;
6880 if (*p == '{' || *p == '<')
6881 p = validate_switches (p+1);
6882 else if (p[0] == 'W' && p[1] == '{')
6883 p = validate_switches (p+2);
6885 else
6886 p++;
6889 if (*p) p++;
6890 if (*p && p[-1] == ';')
6891 goto next_member;
6894 return p;
6895 #undef SKIP_WHITE
6898 struct mdswitchstr
6900 const char *str;
6901 int len;
6904 static struct mdswitchstr *mdswitches;
6905 static int n_mdswitches;
6907 /* Check whether a particular argument was used. The first time we
6908 canonicalize the switches to keep only the ones we care about. */
6910 static int
6911 used_arg (const char *p, int len)
6913 struct mswitchstr
6915 const char *str;
6916 const char *replace;
6917 int len;
6918 int rep_len;
6921 static struct mswitchstr *mswitches;
6922 static int n_mswitches;
6923 int i, j;
6925 if (!mswitches)
6927 struct mswitchstr *matches;
6928 const char *q;
6929 int cnt = 0;
6931 /* Break multilib_matches into the component strings of string
6932 and replacement string. */
6933 for (q = multilib_matches; *q != '\0'; q++)
6934 if (*q == ';')
6935 cnt++;
6937 matches = alloca ((sizeof (struct mswitchstr)) * cnt);
6938 i = 0;
6939 q = multilib_matches;
6940 while (*q != '\0')
6942 matches[i].str = q;
6943 while (*q != ' ')
6945 if (*q == '\0')
6946 abort ();
6947 q++;
6949 matches[i].len = q - matches[i].str;
6951 matches[i].replace = ++q;
6952 while (*q != ';' && *q != '\0')
6954 if (*q == ' ')
6955 abort ();
6956 q++;
6958 matches[i].rep_len = q - matches[i].replace;
6959 i++;
6960 if (*q == ';')
6961 q++;
6964 /* Now build a list of the replacement string for switches that we care
6965 about. Make sure we allocate at least one entry. This prevents
6966 xmalloc from calling fatal, and prevents us from re-executing this
6967 block of code. */
6968 mswitches
6969 = xmalloc (sizeof (struct mswitchstr)
6970 * (n_mdswitches + (n_switches ? n_switches : 1)));
6971 for (i = 0; i < n_switches; i++)
6972 if (switches[i].live_cond != SWITCH_IGNORE)
6974 int xlen = strlen (switches[i].part1);
6975 for (j = 0; j < cnt; j++)
6976 if (xlen == matches[j].len
6977 && ! strncmp (switches[i].part1, matches[j].str, xlen))
6979 mswitches[n_mswitches].str = matches[j].replace;
6980 mswitches[n_mswitches].len = matches[j].rep_len;
6981 mswitches[n_mswitches].replace = (char *) 0;
6982 mswitches[n_mswitches].rep_len = 0;
6983 n_mswitches++;
6984 break;
6988 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
6989 on the command line nor any options mutually incompatible with
6990 them. */
6991 for (i = 0; i < n_mdswitches; i++)
6993 const char *r;
6995 for (q = multilib_options; *q != '\0'; q++)
6997 while (*q == ' ')
6998 q++;
7000 r = q;
7001 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7002 || strchr (" /", q[mdswitches[i].len]) == NULL)
7004 while (*q != ' ' && *q != '/' && *q != '\0')
7005 q++;
7006 if (*q != '/')
7007 break;
7008 q++;
7011 if (*q != ' ' && *q != '\0')
7013 while (*r != ' ' && *r != '\0')
7015 q = r;
7016 while (*q != ' ' && *q != '/' && *q != '\0')
7017 q++;
7019 if (used_arg (r, q - r))
7020 break;
7022 if (*q != '/')
7024 mswitches[n_mswitches].str = mdswitches[i].str;
7025 mswitches[n_mswitches].len = mdswitches[i].len;
7026 mswitches[n_mswitches].replace = (char *) 0;
7027 mswitches[n_mswitches].rep_len = 0;
7028 n_mswitches++;
7029 break;
7032 r = q + 1;
7034 break;
7040 for (i = 0; i < n_mswitches; i++)
7041 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7042 return 1;
7044 return 0;
7047 static int
7048 default_arg (const char *p, int len)
7050 int i;
7052 for (i = 0; i < n_mdswitches; i++)
7053 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7054 return 1;
7056 return 0;
7059 /* Work out the subdirectory to use based on the options. The format of
7060 multilib_select is a list of elements. Each element is a subdirectory
7061 name followed by a list of options followed by a semicolon. The format
7062 of multilib_exclusions is the same, but without the preceding
7063 directory. First gcc will check the exclusions, if none of the options
7064 beginning with an exclamation point are present, and all of the other
7065 options are present, then we will ignore this completely. Passing
7066 that, gcc will consider each multilib_select in turn using the same
7067 rules for matching the options. If a match is found, that subdirectory
7068 will be used. */
7070 static void
7071 set_multilib_dir (void)
7073 const char *p;
7074 unsigned int this_path_len;
7075 const char *this_path, *this_arg;
7076 const char *start, *end;
7077 int not_arg;
7078 int ok, ndfltok, first;
7080 n_mdswitches = 0;
7081 start = multilib_defaults;
7082 while (*start == ' ' || *start == '\t')
7083 start++;
7084 while (*start != '\0')
7086 n_mdswitches++;
7087 while (*start != ' ' && *start != '\t' && *start != '\0')
7088 start++;
7089 while (*start == ' ' || *start == '\t')
7090 start++;
7093 if (n_mdswitches)
7095 int i = 0;
7097 mdswitches = xmalloc (sizeof (struct mdswitchstr) * n_mdswitches);
7098 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7100 while (*start == ' ' || *start == '\t')
7101 start++;
7103 if (*start == '\0')
7104 break;
7106 for (end = start + 1;
7107 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7110 obstack_grow (&multilib_obstack, start, end - start);
7111 obstack_1grow (&multilib_obstack, 0);
7112 mdswitches[i].str = obstack_finish (&multilib_obstack);
7113 mdswitches[i++].len = end - start;
7115 if (*end == '\0')
7116 break;
7120 p = multilib_exclusions;
7121 while (*p != '\0')
7123 /* Ignore newlines. */
7124 if (*p == '\n')
7126 ++p;
7127 continue;
7130 /* Check the arguments. */
7131 ok = 1;
7132 while (*p != ';')
7134 if (*p == '\0')
7135 abort ();
7137 if (! ok)
7139 ++p;
7140 continue;
7143 this_arg = p;
7144 while (*p != ' ' && *p != ';')
7146 if (*p == '\0')
7147 abort ();
7148 ++p;
7151 if (*this_arg != '!')
7152 not_arg = 0;
7153 else
7155 not_arg = 1;
7156 ++this_arg;
7159 ok = used_arg (this_arg, p - this_arg);
7160 if (not_arg)
7161 ok = ! ok;
7163 if (*p == ' ')
7164 ++p;
7167 if (ok)
7168 return;
7170 ++p;
7173 first = 1;
7174 p = multilib_select;
7175 while (*p != '\0')
7177 /* Ignore newlines. */
7178 if (*p == '\n')
7180 ++p;
7181 continue;
7184 /* Get the initial path. */
7185 this_path = p;
7186 while (*p != ' ')
7188 if (*p == '\0')
7189 abort ();
7190 ++p;
7192 this_path_len = p - this_path;
7194 /* Check the arguments. */
7195 ok = 1;
7196 ndfltok = 1;
7197 ++p;
7198 while (*p != ';')
7200 if (*p == '\0')
7201 abort ();
7203 if (! ok)
7205 ++p;
7206 continue;
7209 this_arg = p;
7210 while (*p != ' ' && *p != ';')
7212 if (*p == '\0')
7213 abort ();
7214 ++p;
7217 if (*this_arg != '!')
7218 not_arg = 0;
7219 else
7221 not_arg = 1;
7222 ++this_arg;
7225 /* If this is a default argument, we can just ignore it.
7226 This is true even if this_arg begins with '!'. Beginning
7227 with '!' does not mean that this argument is necessarily
7228 inappropriate for this library: it merely means that
7229 there is a more specific library which uses this
7230 argument. If this argument is a default, we need not
7231 consider that more specific library. */
7232 ok = used_arg (this_arg, p - this_arg);
7233 if (not_arg)
7234 ok = ! ok;
7236 if (! ok)
7237 ndfltok = 0;
7239 if (default_arg (this_arg, p - this_arg))
7240 ok = 1;
7242 if (*p == ' ')
7243 ++p;
7246 if (ok && first)
7248 if (this_path_len != 1
7249 || this_path[0] != '.')
7251 char *new_multilib_dir = xmalloc (this_path_len + 1);
7252 char *q;
7254 strncpy (new_multilib_dir, this_path, this_path_len);
7255 new_multilib_dir[this_path_len] = '\0';
7256 q = strchr (new_multilib_dir, ':');
7257 if (q != NULL)
7258 *q = '\0';
7259 multilib_dir = new_multilib_dir;
7261 first = 0;
7264 if (ndfltok)
7266 const char *q = this_path, *end = this_path + this_path_len;
7268 while (q < end && *q != ':')
7269 q++;
7270 if (q < end)
7272 char *new_multilib_os_dir = xmalloc (end - q);
7273 memcpy (new_multilib_os_dir, q + 1, end - q - 1);
7274 new_multilib_os_dir[end - q - 1] = '\0';
7275 multilib_os_dir = new_multilib_os_dir;
7276 break;
7280 ++p;
7283 if (multilib_dir == NULL && multilib_os_dir != NULL
7284 && strcmp (multilib_os_dir, ".") == 0)
7286 free ((char *) multilib_os_dir);
7287 multilib_os_dir = NULL;
7289 else if (multilib_dir != NULL && multilib_os_dir == NULL)
7290 multilib_os_dir = multilib_dir;
7293 /* Print out the multiple library subdirectory selection
7294 information. This prints out a series of lines. Each line looks
7295 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
7296 required. Only the desired options are printed out, the negative
7297 matches. The options are print without a leading dash. There are
7298 no spaces to make it easy to use the information in the shell.
7299 Each subdirectory is printed only once. This assumes the ordering
7300 generated by the genmultilib script. Also, we leave out ones that match
7301 the exclusions. */
7303 static void
7304 print_multilib_info (void)
7306 const char *p = multilib_select;
7307 const char *last_path = 0, *this_path;
7308 int skip;
7309 unsigned int last_path_len = 0;
7311 while (*p != '\0')
7313 skip = 0;
7314 /* Ignore newlines. */
7315 if (*p == '\n')
7317 ++p;
7318 continue;
7321 /* Get the initial path. */
7322 this_path = p;
7323 while (*p != ' ')
7325 if (*p == '\0')
7326 abort ();
7327 ++p;
7330 /* When --disable-multilib was used but target defines
7331 MULTILIB_OSDIRNAMES, entries starting with .: are there just
7332 to find multilib_os_dir, so skip them from output. */
7333 if (this_path[0] == '.' && this_path[1] == ':')
7334 skip = 1;
7336 /* Check for matches with the multilib_exclusions. We don't bother
7337 with the '!' in either list. If any of the exclusion rules match
7338 all of its options with the select rule, we skip it. */
7340 const char *e = multilib_exclusions;
7341 const char *this_arg;
7343 while (*e != '\0')
7345 int m = 1;
7346 /* Ignore newlines. */
7347 if (*e == '\n')
7349 ++e;
7350 continue;
7353 /* Check the arguments. */
7354 while (*e != ';')
7356 const char *q;
7357 int mp = 0;
7359 if (*e == '\0')
7360 abort ();
7362 if (! m)
7364 ++e;
7365 continue;
7368 this_arg = e;
7370 while (*e != ' ' && *e != ';')
7372 if (*e == '\0')
7373 abort ();
7374 ++e;
7377 q = p + 1;
7378 while (*q != ';')
7380 const char *arg;
7381 int len = e - this_arg;
7383 if (*q == '\0')
7384 abort ();
7386 arg = q;
7388 while (*q != ' ' && *q != ';')
7390 if (*q == '\0')
7391 abort ();
7392 ++q;
7395 if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
7396 default_arg (this_arg, e - this_arg))
7398 mp = 1;
7399 break;
7402 if (*q == ' ')
7403 ++q;
7406 if (! mp)
7407 m = 0;
7409 if (*e == ' ')
7410 ++e;
7413 if (m)
7415 skip = 1;
7416 break;
7419 if (*e != '\0')
7420 ++e;
7424 if (! skip)
7426 /* If this is a duplicate, skip it. */
7427 skip = (last_path != 0 && (unsigned int) (p - this_path) == last_path_len
7428 && ! strncmp (last_path, this_path, last_path_len));
7430 last_path = this_path;
7431 last_path_len = p - this_path;
7434 /* If this directory requires any default arguments, we can skip
7435 it. We will already have printed a directory identical to
7436 this one which does not require that default argument. */
7437 if (! skip)
7439 const char *q;
7441 q = p + 1;
7442 while (*q != ';')
7444 const char *arg;
7446 if (*q == '\0')
7447 abort ();
7449 if (*q == '!')
7450 arg = NULL;
7451 else
7452 arg = q;
7454 while (*q != ' ' && *q != ';')
7456 if (*q == '\0')
7457 abort ();
7458 ++q;
7461 if (arg != NULL
7462 && default_arg (arg, q - arg))
7464 skip = 1;
7465 break;
7468 if (*q == ' ')
7469 ++q;
7473 if (! skip)
7475 const char *p1;
7477 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
7478 putchar (*p1);
7479 putchar (';');
7482 ++p;
7483 while (*p != ';')
7485 int use_arg;
7487 if (*p == '\0')
7488 abort ();
7490 if (skip)
7492 ++p;
7493 continue;
7496 use_arg = *p != '!';
7498 if (use_arg)
7499 putchar ('@');
7501 while (*p != ' ' && *p != ';')
7503 if (*p == '\0')
7504 abort ();
7505 if (use_arg)
7506 putchar (*p);
7507 ++p;
7510 if (*p == ' ')
7511 ++p;
7514 if (! skip)
7516 /* If there are extra options, print them now. */
7517 if (multilib_extra && *multilib_extra)
7519 int print_at = TRUE;
7520 const char *q;
7522 for (q = multilib_extra; *q != '\0'; q++)
7524 if (*q == ' ')
7525 print_at = TRUE;
7526 else
7528 if (print_at)
7529 putchar ('@');
7530 putchar (*q);
7531 print_at = FALSE;
7536 putchar ('\n');
7539 ++p;
7543 /* if-exists built-in spec function.
7545 Checks to see if the file specified by the absolute pathname in
7546 ARGS exists. Returns that pathname if found.
7548 The usual use for this function is to check for a library file
7549 (whose name has been expanded with %s). */
7551 static const char *
7552 if_exists_spec_function (int argc, const char **argv)
7554 /* Must have only one argument. */
7555 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7556 return argv[0];
7558 return NULL;
7561 /* if-exists-else built-in spec function.
7563 This is like if-exists, but takes an additional argument which
7564 is returned if the first argument does not exist. */
7566 static const char *
7567 if_exists_else_spec_function (int argc, const char **argv)
7569 /* Must have exactly two arguments. */
7570 if (argc != 2)
7571 return NULL;
7573 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7574 return argv[0];
7576 return argv[1];